diff --git a/services/engine/codec/audio/audio_codec_worker.cpp b/services/engine/codec/audio/audio_codec_worker.cpp index c55c5e3105337558c69b08f46269172abe47a97e..355d6504340b53f13259bc5c4120efb70107a84d 100644 --- a/services/engine/codec/audio/audio_codec_worker.cpp +++ b/services/engine/codec/audio/audio_codec_worker.cpp @@ -336,6 +336,18 @@ void AudioCodecWorker::ReleaseOutputBuffer(const uint32_t &index, const int32_t callback_->OnError(AVCodecErrorType::AVCODEC_ERROR_INTERNAL, ret); } +void AudioCodecWorker::SetFirstAndEosStatus(std::shared_ptr &outBuffer, bool isEos, uint32_t index) +{ + if (isEos) { + AVCODEC_LOGI("set buffer EOS. index:%{public}u", index); + outBuffer->SetEos(isEos); + } + if (isFirFrame_) { + outBuffer->SetFirstFrame(); + isFirFrame_ = false; + } +} + void AudioCodecWorker::ConsumerOutputBuffer() { AVCODEC_SYNC_TRACE; @@ -344,7 +356,6 @@ void AudioCodecWorker::ConsumerOutputBuffer() usleep(DEFAULT_TRY_DECODE_TIME); return; } - std::unique_lock lock(outputMutex_); while (!inBufIndexQue_.empty() && isRunning) { int32_t ret; @@ -360,14 +371,7 @@ void AudioCodecWorker::ConsumerOutputBuffer() uint32_t index; if (outputBuffer_->RequestAvailableIndex(index)) { auto outBuffer = GetOutputBufferInfo(index); - if (isEos) { - AVCODEC_LOGI("set buffer EOS. index:%{public}u", index); - outBuffer->SetEos(isEos); - } - if (isFirFrame_) { - outBuffer->SetFirstFrame(); - isFirFrame_ = false; - } + SetFirstAndEosStatus(outBuffer, isEos, index); ret = codec_->ProcessRecieveData(outBuffer); if (ret == AVCodecServiceErrCode::AVCS_ERR_NOT_ENOUGH_DATA) { AVCODEC_LOGW("current ouput buffer is not enough,skip this frame. index:%{public}u", index); diff --git a/services/engine/codec/include/audio/audio_codec_worker.h b/services/engine/codec/include/audio/audio_codec_worker.h index eb897f7b115859c10c69dc1f1cf1e760b1f67ed6..486e01955fa20f3369c349594189c155451f38bc 100644 --- a/services/engine/codec/include/audio/audio_codec_worker.h +++ b/services/engine/codec/include/audio/audio_codec_worker.h @@ -64,6 +64,7 @@ private: bool Begin(); bool HandInputBuffer(int32_t &ret); void ReleaseOutputBuffer(const uint32_t &index, const int32_t &ret); + void SetFirstAndEosStatus(std::shared_ptr &outBuffer, bool isEos, uint32_t index); private: bool isFirFrame_; diff --git a/test/unittest/audio_test/audio_encoder_capi_unit_test.cpp b/test/unittest/audio_test/audio_encoder_capi_unit_test.cpp index b6ec1d0c5e16988b1501f8d5ea9bbe3d42cacb77..04c895c7368e75280f1ecc291dca15e6da8b6071 100644 --- a/test/unittest/audio_test/audio_encoder_capi_unit_test.cpp +++ b/test/unittest/audio_test/audio_encoder_capi_unit_test.cpp @@ -175,6 +175,8 @@ void AudioCodeCapiEncoderUnitTest::TearDown(void) void AudioCodeCapiEncoderUnitTest::InputFunc() { + OH_AVCodecBufferAttr info = {}; + bool isEos = false; inputFile_ = std::make_unique(inputFilePath_, std::ios::binary); if (!inputFile_->is_open()) { std::cout << "open file failed, path: " << inputFilePath_ << std::endl; @@ -191,40 +193,31 @@ void AudioCodeCapiEncoderUnitTest::InputFunc() } uint32_t index = signal_->inQueue_.front(); auto buffer = signal_->inBufferQueue_.front(); - if (!inputFile_->eof()) { + isEos = !inputFile_->eof(); + if (!isEos) { inputFile_->read((char *)OH_AVMemory_GetAddr(buffer), frameBytes_); - } else { - OH_AVCodecBufferAttr info; - info.size = 0; - info.offset = 0; - info.pts = 0; - info.flags = AVCODEC_BUFFER_FLAGS_EOS; - OH_AudioEncoder_PushInputData(audioEnc_, index, info); - signal_->inQueue_.pop(); - signal_->inBufferQueue_.pop(); - break; } - OH_AVCodecBufferAttr info; info.size = frameBytes_; - info.offset = 0; - - int32_t ret = AVCS_ERR_OK; - if (isFirstFrame_) { + info.flags = AVCODEC_BUFFER_FLAGS_NONE; + if (isEos) { + info.size = 0; + info.flags = AVCODEC_BUFFER_FLAGS_EOS; + } else if (isFirstFrame_) { info.flags = AVCODEC_BUFFER_FLAGS_CODEC_DATA; - ret = OH_AudioEncoder_PushInputData(audioEnc_, index, info); isFirstFrame_ = false; - } else { - info.flags = AVCODEC_BUFFER_FLAGS_NONE; - ret = OH_AudioEncoder_PushInputData(audioEnc_, index, info); } - - timeStamp_ += FRAME_DURATION_US; + info.offset = 0; + int32_t ret = OH_AudioEncoder_PushInputData(audioEnc_, index, info); signal_->inQueue_.pop(); signal_->inBufferQueue_.pop(); if (ret != AVCS_ERR_OK) { isRunning_ = false; break; } + if (isEos) { + break; + } + timeStamp_ += FRAME_DURATION_US; } inputFile_->close(); }