From d0f8650ab6d694048fc00b6e4bbadf3a6c5c0de1 Mon Sep 17 00:00:00 2001 From: SuRuoyan Date: Sun, 30 Mar 2025 12:12:56 +0800 Subject: [PATCH] fix aac encode input buffer size dynamic change Signed-off-by: SuRuoyan --- .../audio_encoder/aac/ffmpeg_aac_encoder_plugin.cpp | 8 ++++++-- .../plugins/ffmpeg_adapter/common/ffmpeg_convert.cpp | 7 +++++++ .../plugins/ffmpeg_adapter/common/ffmpeg_convert.h | 3 ++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/services/media_engine/plugins/ffmpeg_adapter/audio_encoder/aac/ffmpeg_aac_encoder_plugin.cpp b/services/media_engine/plugins/ffmpeg_adapter/audio_encoder/aac/ffmpeg_aac_encoder_plugin.cpp index bd49dc39f..a937d572b 100644 --- a/services/media_engine/plugins/ffmpeg_adapter/audio_encoder/aac/ffmpeg_aac_encoder_plugin.cpp +++ b/services/media_engine/plugins/ffmpeg_adapter/audio_encoder/aac/ffmpeg_aac_encoder_plugin.cpp @@ -774,6 +774,7 @@ Status FFmpegAACEncoderPlugin::PcmFillFrame(const std::shared_ptr &inp uint8_t *destBuffer = const_cast(srcBuffer); size_t srcBufferSize = static_cast(memory->GetSize()); size_t destBufferSize = srcBufferSize; + uint32_t destSamplesPerFrame; if (needResample_ && resample_ != nullptr) { if (resample_->Convert(srcBuffer, srcBufferSize, destBuffer, destBufferSize) != Status::OK) { MEDIA_LOG_E("Convert sample format failed"); @@ -786,8 +787,11 @@ Status FFmpegAACEncoderPlugin::PcmFillFrame(const std::shared_ptr &inp "frame_size: %{public}d", cachedFrame_->nb_samples, avCodecContext_->frame_size); } - int32_t destSamplesPerFrame = (avCodecContext_->frame_size > cachedFrame_->nb_samples) ? - avCodecContext_->frame_size : cachedFrame_->nb_samples; + if (needResample_ && resample_ != nullptr) { + destSamplesPerFrame = resample_->GetSampleOffset(); + } else { + destSamplesPerFrame = cachedFrame_->nb_samples; + } cachedFrame_->extended_data = cachedFrame_->data; cachedFrame_->extended_data[0] = destBuffer; cachedFrame_->linesize[0] = cachedFrame_->nb_samples * bytesPerSample; diff --git a/services/media_engine/plugins/ffmpeg_adapter/common/ffmpeg_convert.cpp b/services/media_engine/plugins/ffmpeg_adapter/common/ffmpeg_convert.cpp index f4ff6343b..21e64e878 100644 --- a/services/media_engine/plugins/ffmpeg_adapter/common/ffmpeg_convert.cpp +++ b/services/media_engine/plugins/ffmpeg_adapter/common/ffmpeg_convert.cpp @@ -35,6 +35,7 @@ Status Resample::Init(const ResamplePara &resamplePara) resampleCache_.reserve(destFrameSize); resampleChannelAddr_.reserve(resamplePara_.channels); auto tmp = resampleChannelAddr_.data(); + sampleOffset_ = resamplePara_.destSamplesPerFrame; av_samples_fill_arrays(tmp, nullptr, resampleCache_.data(), resamplePara_.channels, resamplePara_.destSamplesPerFrame, resamplePara_.destFmt, 0); auto swrContext = swr_alloc(); @@ -113,6 +114,7 @@ void Resample::ConvertCommon(const uint8_t *srcBuffer, const size_t srcLength, resampleCache_.reserve(cacheSize_); resampleCache_.assign(cacheSize_, 0); auto tmp = resampleChannelAddr_.data(); + sampleOffset_ = samples; av_samples_fill_arrays(tmp, nullptr, resampleCache_.data(), resamplePara_.channels, samples, resamplePara_.destFmt, 0); } @@ -205,6 +207,11 @@ Status Resample::ConvertFrame(AVFrame *outputFrame, const AVFrame *inputFrame) return Status::OK; } +uint32_t Resample::GetSampleOffset() +{ + return sampleOffset_; +} + #if defined(VIDEO_SUPPORT) Status Scale::Init(const ScalePara &scalePara, uint8_t **dstData, int32_t *dstLineSize) { diff --git a/services/media_engine/plugins/ffmpeg_adapter/common/ffmpeg_convert.h b/services/media_engine/plugins/ffmpeg_adapter/common/ffmpeg_convert.h index b2b294c73..79038c005 100644 --- a/services/media_engine/plugins/ffmpeg_adapter/common/ffmpeg_convert.h +++ b/services/media_engine/plugins/ffmpeg_adapter/common/ffmpeg_convert.h @@ -57,9 +57,10 @@ public: Status InitSwrContext(const ResamplePara &resamplePara); Status Convert(const uint8_t *srcBuffer, const size_t srcLength, uint8_t *&destBuffer, size_t &destLength); Status ConvertFrame(AVFrame *outputFrame, const AVFrame *inputFrame); - + uint32_t GetSampleOffset(); private: ResamplePara resamplePara_{}; + uint32_t sampleOffset_ = 0; #if defined(_WIN32) || !defined(OHOS_LITE) void ConvertCommon(const uint8_t *srcBuffer, const size_t srcLength, uint8_t *&destBuffer, size_t &destLength); size_t cacheSize_ = 0; -- Gitee