From 05689d0984bc6071683d0ad502a3706465f132f4 Mon Sep 17 00:00:00 2001 From: "dmytro.bogovych" Date: Wed, 27 Mar 2019 11:15:55 +0200 Subject: [PATCH] - use time intervals PVQA API --- src/engine/media/MT_AudioReceiver.cpp | 23 ++++++++++++++++------- src/engine/media/MT_SevanaMos.cpp | 6 +++++- src/engine/media/MT_SevanaMos.h | 3 +++ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/engine/media/MT_AudioReceiver.cpp b/src/engine/media/MT_AudioReceiver.cpp index a0247370..c801ad4b 100644 --- a/src/engine/media/MT_AudioReceiver.cpp +++ b/src/engine/media/MT_AudioReceiver.cpp @@ -649,7 +649,11 @@ void AudioReceiver::initPvqa() if (!mPVQA) { mPVQA = std::make_shared(); +#if defined(USE_PVQA_STREAM) mPVQA->open(PVQA_INTERVAL, MT::SevanaPVQA::Model::Stream); +#else + mPVQA->open(PVQA_INTERVAL, MT::SevanaPVQA::Model::Interval); +#endif } } @@ -672,8 +676,12 @@ void AudioReceiver::updatePvqa(const void *data, int size) int time4pvqa = (int)(frames * PVQA_INTERVAL * 1000); int size4pvqa = (int)fmt.sizeFromTime(time4pvqa); ICELogInfo(<< "Updating PVQA with " << time4pvqa << " milliseconds of audio."); +#if defined(USE_PVQA_STREAM) mPVQA->update(fmt.mRate, fmt.mChannels, mPvqaBuffer->data(), size4pvqa); mPvqaBuffer->erase(size4pvqa); +#else + // Just wait for getResults() to make analysis +#endif } } } @@ -682,13 +690,14 @@ float AudioReceiver::calculatePvqaMos(int rate, std::string& report) { if (mPVQA && mPvqaBuffer) { - // Flush remaining audio to analyzer - /*if (mPvqaBuffer->filled()) - { - mPVQA->update(rate, AUDIO_CHANNELS, mPvqaBuffer->data(), mPvqaBuffer->filled()); - mPvqaBuffer->clear(); - }*/ - return mPVQA->getResults(report, nullptr, rate, MT::SevanaPVQA::Codec::None); + if (mPVQA->getModel() == MT::SevanaPVQA::Model::Interval) + { + Audio::Format fmt; + return mPVQA->process(fmt.mRate, fmt.mChannels, mPvqaBuffer->data(), mPvqaBuffer->filled(), + report, MT::SevanaPVQA::Codec::None); + } + else + return mPVQA->getResults(report, nullptr, rate, MT::SevanaPVQA::Codec::None); } return 0.0f; } diff --git a/src/engine/media/MT_SevanaMos.cpp b/src/engine/media/MT_SevanaMos.cpp index 41ee76ad..75bbbc06 100644 --- a/src/engine/media/MT_SevanaMos.cpp +++ b/src/engine/media/MT_SevanaMos.cpp @@ -333,6 +333,8 @@ void SevanaPVQA::update(int samplerate, int channels, const void *pcmBuffer, int ICELogError(<< "No PVQA context."); return; } + + // Model is assert here as it can be any if context is not created. assert (mModel == Model::Stream); @@ -346,6 +348,8 @@ void SevanaPVQA::update(int samplerate, int channels, const void *pcmBuffer, int { ICELogError(<< "Failed to stream data to PVQA instance. Result code: " << rescode); } + + int milliseconds = pcmLength / 2 / channels / (samplerate / 1000); mProcessedMilliseconds += milliseconds; mAllProcessedMilliseconds += milliseconds; @@ -466,7 +470,7 @@ float SevanaPVQA::getResults(std::string& report, EchoData** echo, int samplerat // Limit maximal value of MOS depending on codec float result = (float)results.dMOSLike; - float mv = 5.0; + float mv = 5.0f; switch (codec) { case Codec::G711: mv = 4.1f; break; diff --git a/src/engine/media/MT_SevanaMos.h b/src/engine/media/MT_SevanaMos.h index 64a42957..81986c61 100644 --- a/src/engine/media/MT_SevanaMos.h +++ b/src/engine/media/MT_SevanaMos.h @@ -19,6 +19,8 @@ #if defined(USE_AQUA_LIBRARY) # include "aqua.h" # include +#include + #endif @@ -68,6 +70,7 @@ protected: std::string mDumpWavPath; bool mOpenFailed = false; + ByteBuffer mAudioDump; public: static std::string getVersion();