diff --git a/services/media_engine/plugins/ffmpeg_adapter/audio_decoder/ffmpeg_base_decoder.cpp b/services/media_engine/plugins/ffmpeg_adapter/audio_decoder/ffmpeg_base_decoder.cpp index c6f7da43de6b5b011b03fc3d75b72241a9e1a5c4..ae2d15f8fec2677dfb9c80fccc813f02cbbba291 100644 --- a/services/media_engine/plugins/ffmpeg_adapter/audio_decoder/ffmpeg_base_decoder.cpp +++ b/services/media_engine/plugins/ffmpeg_adapter/audio_decoder/ffmpeg_base_decoder.cpp @@ -21,6 +21,7 @@ namespace { constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_AUDIO, "AvCodec-FfmpegBaseDecoder"}; constexpr uint8_t LOGD_FREQUENCY = 5; +constexpr float TIME_BASE_FFMPEG = 1000000.f; constexpr AVSampleFormat DEFAULT_FFMPEG_SAMPLE_FORMAT = AV_SAMPLE_FMT_S16; static std::vector supportedSampleFormats = { OHOS::MediaAVCodec::AudioSampleFormat::SAMPLE_U8, @@ -38,10 +39,8 @@ FfmpegBaseDecoder::FfmpegBaseDecoder() : isFirst(true), hasExtra_(false), maxInputSize_(-1), - bufferNum_(1), - bufferIndex_(1), - preBufferGroupPts_(0), - curBufferGroupPts_(0), + nextPts_(0), + durationTime_(0.f), avCodec_(nullptr), avCodecContext_(nullptr), cachedFrame_(nullptr), @@ -159,22 +158,10 @@ Status FfmpegBaseDecoder::ReceiveBuffer(std::shared_ptr &outBuffer) Status status; if (ret >= 0) { AVCODEC_LOGD_LIMIT(LOGD_FREQUENCY, "receive one frame"); - if (cachedFrame_->pts != AV_NOPTS_VALUE) { - preBufferGroupPts_ = curBufferGroupPts_; - curBufferGroupPts_ = cachedFrame_->pts; - if (bufferIndex_ >= bufferNum_) { - bufferNum_ = bufferIndex_; - } - bufferIndex_ = 1; - } else { - bufferIndex_++; - if (preBufferGroupPts_ == 0) { - cachedFrame_->pts = curBufferGroupPts_; - } else { - cachedFrame_->pts = - curBufferGroupPts_ + abs(curBufferGroupPts_ - preBufferGroupPts_) * (bufferIndex_ - 1) / bufferNum_; - } + if (cachedFrame_->pts == AV_NOPTS_VALUE) { + cachedFrame_->pts = nextPts_; } + status = ReceiveFrameSucc(outBuffer); dataCallback_->OnOutputBufferDone(outBuffer); } else if (ret == AVERROR_EOF) { @@ -231,7 +218,10 @@ Status FfmpegBaseDecoder::ReceiveFrameSucc(std::shared_ptr &outBuffer) if (InitResample() != Status::OK) { return Status::ERROR_UNKNOWN; } + uint32_t sampleRate = avCodecContext_->sample_rate; + durationTime_ = TIME_BASE_FFMPEG / sampleRate; } + nextPts_ = cachedFrame_->pts + static_cast(cachedFrame_->nb_samples * durationTime_); auto outFrame = cachedFrame_; if (needResample_) { if (ConvertPlanarFrame(outBuffer) != Status::OK) { @@ -262,7 +252,7 @@ Status FfmpegBaseDecoder::Reset() avCodecContext_.reset(); avCodecContext_ = nullptr; } - preBufferGroupPts_ = 0; + nextPts_ = 0; return Status::OK; } @@ -283,7 +273,7 @@ Status FfmpegBaseDecoder::Flush() if (avCodecContext_ != nullptr) { avcodec_flush_buffers(avCodecContext_.get()); } - preBufferGroupPts_ = 0; + nextPts_ = 0; return Status::OK; } diff --git a/services/media_engine/plugins/ffmpeg_adapter/audio_decoder/ffmpeg_base_decoder.h b/services/media_engine/plugins/ffmpeg_adapter/audio_decoder/ffmpeg_base_decoder.h index 29729affb0dcc50f3753de66d382bc55efce324b..9d7bd264b4d88f212403fc3ce911f9d45159f2fb 100644 --- a/services/media_engine/plugins/ffmpeg_adapter/audio_decoder/ffmpeg_base_decoder.h +++ b/services/media_engine/plugins/ffmpeg_adapter/audio_decoder/ffmpeg_base_decoder.h @@ -80,10 +80,8 @@ private: bool isFirst; bool hasExtra_; int32_t maxInputSize_; - int32_t bufferNum_; - int32_t bufferIndex_; - int64_t preBufferGroupPts_; - int64_t curBufferGroupPts_; + int64_t nextPts_; + float durationTime_; std::string name_; std::shared_ptr avCodec_;