- allow avoid decoding in audio receiver (but produce network statistics)

This commit is contained in:
Dmytro Bogovych 2019-03-12 14:27:01 +02:00
parent 2aff120468
commit eb4d3237c0
4 changed files with 56 additions and 25 deletions

View File

@ -452,8 +452,12 @@ bool AudioReceiver::getAudio(Audio::DataWindow& output, DecodeOptions options, i
if (mCodec && mFrameCount && !mCodecSettings.mSkipDecode) if (mCodec && mFrameCount && !mCodecSettings.mSkipDecode)
{ {
// Do PLC to mDecodedFrame/mDecodedLength // Do PLC to mDecodedFrame/mDecodedLength
if ((int)options & (int)DecodeOptions::SkipDecode)
mDecodedLength = 0;
else
mDecodedLength = mCodec->plc(mFrameCount, mDecodedFrame, sizeof mDecodedFrame); mDecodedLength = mCodec->plc(mFrameCount, mDecodedFrame, sizeof mDecodedFrame);
} }
if (mDecodedLength) if (mDecodedLength)
{ {
processDecoded(output, options); processDecoded(output, options);
@ -487,7 +491,11 @@ bool AudioReceiver::getAudio(Audio::DataWindow& output, DecodeOptions options, i
int frames100ms = milliseconds / 100; int frames100ms = milliseconds / 100;
for (int frameIndex = 0; frameIndex < frames100ms; frameIndex++) for (int frameIndex = 0; frameIndex < frames100ms; frameIndex++)
{ {
if ((int)options & (int)DecodeOptions::SkipDecode)
mDecodedLength = 0;
else
mDecodedLength = mCngDecoder.produce(mCodec->samplerate(), 100, (short*)mDecodedFrame, false); mDecodedLength = mCngDecoder.produce(mCodec->samplerate(), 100, (short*)mDecodedFrame, false);
if (mDecodedLength) if (mDecodedLength)
processDecoded(output, options); processDecoded(output, options);
} }
@ -495,7 +503,11 @@ bool AudioReceiver::getAudio(Audio::DataWindow& output, DecodeOptions options, i
int tail = milliseconds % 100; int tail = milliseconds % 100;
if (tail) if (tail)
{ {
if ((int)options & (int)DecodeOptions::SkipDecode)
mDecodedLength = 0;
else
mDecodedLength = mCngDecoder.produce(mCodec->samplerate(), tail, (short*)mDecodedFrame, false); mDecodedLength = mCngDecoder.produce(mCodec->samplerate(), tail, (short*)mDecodedFrame, false);
if (mDecodedLength) if (mDecodedLength)
processDecoded(output, options); processDecoded(output, options);
} }
@ -512,6 +524,10 @@ bool AudioReceiver::getAudio(Audio::DataWindow& output, DecodeOptions options, i
// Check if it is CNG packet // Check if it is CNG packet
if ((p->GetPayloadType() == 0 || p->GetPayloadType() == 8) && p->GetPayloadLength() >= 1 && p->GetPayloadLength() <= 6) if ((p->GetPayloadType() == 0 || p->GetPayloadType() == 8) && p->GetPayloadLength() >= 1 && p->GetPayloadLength() <= 6)
{
if ((int)options & (int)DecodeOptions::SkipDecode)
mDecodedLength = 0;
else
{ {
mCngPacket = p; mCngPacket = p;
mCngDecoder.decode3389(p->GetPayloadData(), p->GetPayloadLength()); mCngDecoder.decode3389(p->GetPayloadData(), p->GetPayloadLength());
@ -519,6 +535,7 @@ bool AudioReceiver::getAudio(Audio::DataWindow& output, DecodeOptions options, i
mDecodedLength = mCngDecoder.produce(mCodec->samplerate(), mLastPacketTimeLength, (short*)mDecodedFrame, true); mDecodedLength = mCngDecoder.produce(mCodec->samplerate(), mLastPacketTimeLength, (short*)mDecodedFrame, true);
if (mDecodedLength) if (mDecodedLength)
processDecoded(output, options); processDecoded(output, options);
}
result = true; result = true;
} }
else else
@ -541,6 +558,10 @@ bool AudioReceiver::getAudio(Audio::DataWindow& output, DecodeOptions options, i
// Decode // Decode
for (int i=0; i<mFrameCount && !mCodecSettings.mSkipDecode; i++) for (int i=0; i<mFrameCount && !mCodecSettings.mSkipDecode; i++)
{
if ((int)options & (int)DecodeOptions::SkipDecode)
mDecodedLength = 0;
else
{ {
// Decode frame by frame // Decode frame by frame
mDecodedLength = mCodec->decode(p->GetPayloadData() + i*mCodec->rtpLength(), mDecodedLength = mCodec->decode(p->GetPayloadData() + i*mCodec->rtpLength(),
@ -548,6 +569,7 @@ bool AudioReceiver::getAudio(Audio::DataWindow& output, DecodeOptions options, i
if (mDecodedLength) if (mDecodedLength)
processDecoded(output, options); processDecoded(output, options);
} }
}
result = mFrameCount > 0; result = mFrameCount > 0;
// Check for bitrate counter // Check for bitrate counter

View File

@ -117,7 +117,8 @@ namespace MT
{ {
ResampleToMainRate = 0, ResampleToMainRate = 0,
DontResample = 1, DontResample = 1,
FillCngGap = 2 FillCngGap = 2,
SkipDecode = 4
}; };
bool getAudio(Audio::DataWindow& output, DecodeOptions options = DecodeOptions::ResampleToMainRate, int* rate = nullptr); bool getAudio(Audio::DataWindow& output, DecodeOptions options = DecodeOptions::ResampleToMainRate, int* rate = nullptr);

View File

@ -172,6 +172,8 @@ bool SevanaPVQA::initializeLibrary(const std::string& pathToLicenseFile, const s
return false; return false;
} }
if (pathToConfigFile.size())
{
mLibraryConfiguration = PVQA_LoadCFGFile(const_cast<char*>(pathToConfigFile.c_str()), &mLibraryErrorCode); mLibraryConfiguration = PVQA_LoadCFGFile(const_cast<char*>(pathToConfigFile.c_str()), &mLibraryErrorCode);
if (!mLibraryConfiguration) if (!mLibraryConfiguration)
{ {
@ -179,6 +181,7 @@ bool SevanaPVQA::initializeLibrary(const std::string& pathToLicenseFile, const s
ICELogError(<< "Problem with PVQA configuration file."); ICELogError(<< "Problem with PVQA configuration file.");
return false; return false;
} }
}
mPvqaLoaded = true; mPvqaLoaded = true;
} }
return true; return true;
@ -202,6 +205,8 @@ bool SevanaPVQA::initializeLibraryWithData(const void* license_buffer, size_t li
return false; return false;
} }
if (config_buffer && config_len)
{
mLibraryConfiguration = PVQA_LoadCFGData(config_buffer, config_len, &mLibraryErrorCode); mLibraryConfiguration = PVQA_LoadCFGData(config_buffer, config_len, &mLibraryErrorCode);
if (!mLibraryConfiguration) if (!mLibraryConfiguration)
{ {
@ -209,6 +214,7 @@ bool SevanaPVQA::initializeLibraryWithData(const void* license_buffer, size_t li
ICELogError(<< "Problem with PVQA configuration file."); ICELogError(<< "Problem with PVQA configuration file.");
return false; return false;
} }
}
mPvqaLoaded = true; mPvqaLoaded = true;
} }
return true; return true;

View File

@ -76,6 +76,8 @@ public:
#if defined(TARGET_ANDROID) #if defined(TARGET_ANDROID)
static void setupAndroidEnvironment(void* environment, void* appcontext); static void setupAndroidEnvironment(void* environment, void* appcontext);
#endif #endif
// Path to config file can be empty
// In this case library will be considered initialized (but will produce zero MOS)
static bool initializeLibrary(const std::string& pathToLicenseFile, const std::string& pathToConfigFile); static bool initializeLibrary(const std::string& pathToLicenseFile, const std::string& pathToConfigFile);
static bool initializeLibraryWithData(const void* license_buffer, size_t license_len, static bool initializeLibraryWithData(const void* license_buffer, size_t license_len,
const void* config_buffer, size_t config_len); const void* config_buffer, size_t config_len);