📄 transcoders.cxx
字号:
}
return FALSE;
}
OpalMediaFormatList OpalTranscoder::GetDestinationFormats(const OpalMediaFormat & srcFormat)
{
OpalMediaFormatList list;
OpalTranscoderList availableTranscoders = OpalTranscoderFactory::GetKeyList();
for (OpalTranscoderIterator find = availableTranscoders.begin(); find != availableTranscoders.end(); ++find) {
if (find->GetInputFormat() == srcFormat)
list += find->GetOutputFormat();
}
return list;
}
OpalMediaFormatList OpalTranscoder::GetSourceFormats(const OpalMediaFormat & dstFormat)
{
OpalMediaFormatList list;
OpalTranscoderList availableTranscoders = OpalTranscoderFactory::GetKeyList();
for (OpalTranscoderIterator find = availableTranscoders.begin(); find != availableTranscoders.end(); ++find) {
if (find->GetOutputFormat() == dstFormat)
list += find->GetInputFormat();
}
return list;
}
OpalMediaFormatList OpalTranscoder::GetPossibleFormats(const OpalMediaFormatList & formats)
{
OpalMediaFormatList possibleFormats;
// Run through the formats connection can do directly and calculate all of
// the possible formats, including ones via a transcoder
for (PINDEX f = 0; f < formats.GetSize(); f++) {
OpalMediaFormat format = formats[f];
possibleFormats += format;
OpalMediaFormatList srcFormats = GetSourceFormats(format);
for (PINDEX i = 0; i < srcFormats.GetSize(); i++) {
if (GetDestinationFormats(srcFormats[i]).GetSize() > 0)
possibleFormats += srcFormats[i];
}
}
return possibleFormats;
}
/////////////////////////////////////////////////////////////////////////////
OpalFramedTranscoder::OpalFramedTranscoder(const OpalMediaFormat & inputMediaFormat,
const OpalMediaFormat & outputMediaFormat,
PINDEX inputBytes, PINDEX outputBytes)
: OpalTranscoder(inputMediaFormat, outputMediaFormat)
{
inputBytesPerFrame = inputBytes;
outputBytesPerFrame = outputBytes;
//partialFrame = inputBytes;
//partialBytes = 0;
}
PINDEX OpalFramedTranscoder::GetOptimalDataFrameSize(BOOL input) const
{
return input ? inputBytesPerFrame : outputBytesPerFrame;
}
BOOL OpalFramedTranscoder::Convert(const RTP_DataFrame & input, RTP_DataFrame & output)
{
const BYTE * inputPtr = input.GetPayloadPtr();
PINDEX inputLength = input.GetPayloadSize();
BYTE * outputPtr = output.GetPayloadPtr();
if (inputLength == 0) {
output.SetPayloadSize(outputBytesPerFrame);
return ConvertSilentFrame (outputPtr);
}
output.SetPayloadSize(inputLength/inputBytesPerFrame*outputBytesPerFrame);
while (inputLength > 0) {
PINDEX consumed = inputBytesPerFrame;
PINDEX created = outputBytesPerFrame;
if (!ConvertFrame(inputPtr, consumed, outputPtr, created))
return FALSE;
outputPtr += created;
inputPtr += consumed;
inputLength -= consumed;
}
return TRUE;
}
BOOL OpalFramedTranscoder::ConvertFrame(const BYTE * inputPtr, PINDEX & /*consumed*/, BYTE * outputPtr, PINDEX & /*created*/)
{
return ConvertFrame(inputPtr, outputPtr);
}
BOOL OpalFramedTranscoder::ConvertFrame(const BYTE * /*inputPtr*/, BYTE * /*outputPtr*/)
{
return FALSE;
}
BOOL OpalFramedTranscoder::ConvertSilentFrame(BYTE *dst)
{
memset(dst, 0, outputBytesPerFrame);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
OpalStreamedTranscoder::OpalStreamedTranscoder(const OpalMediaFormat & inputMediaFormat,
const OpalMediaFormat & outputMediaFormat,
unsigned inputBits,
unsigned outputBits,
PINDEX optimal)
: OpalTranscoder(inputMediaFormat, outputMediaFormat)
{
inputBitsPerSample = inputBits;
outputBitsPerSample = outputBits;
optimalSamples = optimal;
}
PINDEX OpalStreamedTranscoder::GetOptimalDataFrameSize(BOOL input) const
{
return ((input ? inputBitsPerSample : outputBitsPerSample)+7)/8 * optimalSamples;
}
BOOL OpalStreamedTranscoder::Convert(const RTP_DataFrame & input,
RTP_DataFrame & output)
{
PINDEX i;
const BYTE * inputBytes = input.GetPayloadPtr();
const short * inputWords = (const short *)inputBytes;
BYTE * outputBytes = output.GetPayloadPtr();
short * outputWords = (short *)outputBytes;
PINDEX samples = input.GetPayloadSize()*8/inputBitsPerSample;
PINDEX outputSize = samples*outputBitsPerSample/8;
output.SetPayloadSize(outputSize);
switch (inputBitsPerSample) {
case 16 :
switch (outputBitsPerSample) {
case 16 :
for (i = 0; i < samples; i++)
*outputWords++ = (short)ConvertOne(*inputWords++);
break;
case 8 :
for (i = 0; i < samples; i++)
*outputBytes++ = (BYTE)ConvertOne(*inputWords++);
break;
case 4 :
for (i = 0; i < samples; i++) {
if ((i&1) == 0)
*outputBytes = (BYTE)ConvertOne(*inputWords++);
else
*outputBytes++ |= (BYTE)(ConvertOne(*inputWords++) << 4);
}
break;
default :
PAssertAlways("Unsupported bit size");
return FALSE;
}
break;
case 8 :
switch (outputBitsPerSample) {
case 16 :
for (i = 0; i < samples; i++)
*outputWords++ = (short)ConvertOne(*inputBytes++);
break;
case 8 :
for (i = 0; i < samples; i++)
*outputBytes++ = (BYTE)ConvertOne(*inputBytes++);
break;
case 4 :
for (i = 0; i < samples; i++) {
if ((i&1) == 0)
*outputBytes = (BYTE)ConvertOne(*inputBytes++);
else
*outputBytes++ |= (BYTE)(ConvertOne(*inputBytes++) << 4);
}
break;
default :
PAssertAlways("Unsupported bit size");
return FALSE;
}
break;
case 4 :
switch (outputBitsPerSample) {
case 16 :
for (i = 0; i < samples; i++)
if ((i&1) == 0)
*outputWords++ = (short)ConvertOne(*inputBytes & 15);
else
*outputWords++ = (short)ConvertOne(*inputBytes++ >> 4);
break;
case 8 :
for (i = 0; i < samples; i++)
if ((i&1) == 0)
*outputBytes++ = (BYTE)ConvertOne(*inputBytes & 15);
else
*outputBytes++ = (BYTE)ConvertOne(*inputBytes++ >> 4);
break;
case 4 :
for (i = 0; i < samples; i++) {
if ((i&1) == 0)
*outputBytes = (BYTE)ConvertOne(*inputBytes & 15);
else
*outputBytes++ |= (BYTE)(ConvertOne(*inputBytes++ >> 4) << 4);
}
break;
default :
PAssertAlways("Unsupported bit size");
return FALSE;
}
break;
default :
PAssertAlways("Unsupported bit size");
return FALSE;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
Opal_Linear16Mono_PCM::Opal_Linear16Mono_PCM()
: OpalStreamedTranscoder(OpalL16_MONO_8KHZ, OpalPCM16, 16, 16, 320)
{
}
int Opal_Linear16Mono_PCM::ConvertOne(int sample) const
{
#if PBYTE_ORDER==PLITTLE_ENDIAN
return (sample>>8)|(sample<<8);
#else
return sample;
#endif
}
/////////////////////////////////////////////////////////////////////////////
Opal_PCM_Linear16Mono::Opal_PCM_Linear16Mono()
: OpalStreamedTranscoder(OpalPCM16, OpalL16_MONO_8KHZ, 16, 16, 320)
{
}
int Opal_PCM_Linear16Mono::ConvertOne(int sample) const
{
#if PBYTE_ORDER==PLITTLE_ENDIAN
return (sample>>8)|(sample<<8);
#else
return sample;
#endif
}
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -