From 390b92a4eb237ad852fe5d433a89708e99c79742 Mon Sep 17 00:00:00 2001 From: zzz701 Date: Sun, 25 May 2025 14:21:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=9F=B3=E9=A2=91=E6=92=AD?= =?UTF-8?q?=E4=B8=8D=E5=AE=8C=E5=8F=8Acrash=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zzz701 --- .../src/main/cpp/capbilities/AudioDecoder.cpp | 16 ++++++++++- .../src/main/cpp/capbilities/Demuxer.cpp | 28 +++++++++++++------ .../entry/src/main/cpp/common/SampleInfo.h | 3 ++ .../entry/src/main/cpp/player/Player.cpp | 9 +++--- 4 files changed, 42 insertions(+), 14 deletions(-) diff --git a/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/capbilities/AudioDecoder.cpp b/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/capbilities/AudioDecoder.cpp index 4a87502ec5..a454c155c9 100644 --- a/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/capbilities/AudioDecoder.cpp +++ b/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/capbilities/AudioDecoder.cpp @@ -48,8 +48,22 @@ int32_t AudioDecoder::Configure(const SampleInfo &sampleInfo) OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_CHANNEL_COUNT, sampleInfo.audioChannelCount); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_SAMPLE_RATE, sampleInfo.audioSampleRate); OH_AVFormat_SetLongValue(format, OH_MD_KEY_CHANNEL_LAYOUT, sampleInfo.audioChannelLayout); + if (sampleInfo.codecConfigLen > 0) { + AVCODEC_SAMPLE_LOGI("====== AudioDecoder config ====== codecConfig:%{public}p, len:%{public}i, " + "adts:${public}i, 0:0x%{public}02x, 1:0x%{public}02x", + sampleInfo.codecConfig, sampleInfo.codecConfigLen, sampleInfo.aacAdts, + sampleInfo.codecConfig[0], sampleInfo.codecConfig[1]); + uint8_t tmpCodecConfig[2]; + tmpCodecConfig[0] = 0x13; // 0x11 + tmpCodecConfig[1] = 0x10; // 0x90 + tmpCodecConfig[0] = sampleInfo.codecConfig[0]; // 0x11 + tmpCodecConfig[1] = sampleInfo.codecConfig[1]; // 0x90 + AVCODEC_SAMPLE_LOGI("====== AudioDecoder config ====== 0:0x%{public}02x, 1:0x%{public}02x", tmpCodecConfig[0], + tmpCodecConfig[1]); + OH_AVFormat_SetBuffer(format, OH_MD_KEY_CODEC_CONFIG, sampleInfo.codecConfig, sampleInfo.codecConfigLen); + } + AVCODEC_SAMPLE_LOGI("====== AudioDecoder config ======"); - int ret = OH_AudioCodec_Configure(decoder, format); AVCODEC_SAMPLE_LOGI("====== AudioDecoder config ======"); CHECK_AND_RETURN_RET_LOG(ret == AV_ERR_OK, AVCODEC_SAMPLE_ERR_ERROR, "Config failed, ret: %{public}d", ret); diff --git a/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/capbilities/Demuxer.cpp b/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/capbilities/Demuxer.cpp index 10e4e0546d..0564a4b298 100644 --- a/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/capbilities/Demuxer.cpp +++ b/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/capbilities/Demuxer.cpp @@ -23,11 +23,12 @@ Demuxer::~Demuxer() { Release(); } int32_t Demuxer::Create(SampleInfo &info) { source = OH_AVSource_CreateWithFD(info.inputFd, info.inputFileOffset, info.inputFileSize); - + CHECK_AND_RETURN_RET_LOG(source != nullptr, AVCODEC_SAMPLE_ERR_ERROR, - "Create demuxer source failed, fd: %{public}d, offset: %{public}PRId64, " - "file size: %{public}PRId64", info.inputFd, info.inputFileOffset, info.inputFileSize); - + "Create demuxer source failed, fd: %{public}d, offset: %{public}PRId64, " + "file size: %{public}PRId64", + info.inputFd, info.inputFileOffset, info.inputFileSize); + demuxer = OH_AVDemuxer_CreateWithSource(source); CHECK_AND_RETURN_RET_LOG(demuxer != nullptr, AVCODEC_SAMPLE_ERR_ERROR, "Create demuxer failed"); @@ -99,15 +100,26 @@ int32_t Demuxer::GetTrackInfo(std::shared_ptr sourceFormat, SampleI char *audioCodecMime; OH_AVFormat_GetStringValue(trackFormat.get(), OH_MD_KEY_CODEC_MIME, const_cast(&audioCodecMime)); + uint8_t *codecConfig = nullptr; + OH_AVFormat_GetBuffer(trackFormat.get(), OH_MD_KEY_CODEC_CONFIG, &codecConfig, &info.codecConfigLen); + if (info.codecConfigLen > 0 && info.codecConfigLen < sizeof(info.codecConfig)) { + memcpy(info.codecConfig, codecConfig, info.codecConfigLen); + AVCODEC_SAMPLE_LOGI( + "codecConfig:%{public}p, len:%{public}i, 0:0x%{public}02x 1:0x:%{public}02x, bufLen:%{public}u", + info.codecConfig, (int)info.codecConfigLen, info.codecConfig[0], info.codecConfig[1], + sizeof(info.codecConfig)); + } + OH_AVFormat_GetIntValue(trackFormat.get(), OH_MD_KEY_AAC_IS_ADTS, &info.aacAdts); info.audioCodecMime = audioCodecMime; audioTrackId = index; AVCODEC_SAMPLE_LOGI("====== Demuxer Audio config ======"); AVCODEC_SAMPLE_LOGI("Mime: %{public}s", audioCodecMime); - AVCODEC_SAMPLE_LOGI("audioMime:%{public}s sampleForamt:%{public}d " - "sampleRate:%{public}d channelCount:%{public}d channelLayout:%{public}d", - info.audioCodecMime.c_str(), info.audioSampleForamt, info.audioSampleRate, - info.audioChannelCount, (int)info.audioChannelLayout); + AVCODEC_SAMPLE_LOGI( + "audioMime:%{public}s sampleForamt:%{public}d " + "sampleRate:%{public}d channelCount:%{public}d channelLayout:%{public}d adts:%{public}i", + info.audioCodecMime.c_str(), info.audioSampleForamt, info.audioSampleRate, info.audioChannelCount, + info.audioChannelLayout, info.aacAdts); AVCODEC_SAMPLE_LOGI("====== Demuxer Audio config ======"); } } diff --git a/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/common/SampleInfo.h b/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/common/SampleInfo.h index 234d4837c2..1f91fb5f36 100644 --- a/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/common/SampleInfo.h +++ b/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/common/SampleInfo.h @@ -64,6 +64,9 @@ struct SampleInfo { void (*playDoneCallback)(void *context) = nullptr; void *playDoneCallbackData = nullptr; + uint8_t codecConfig[1024]; + size_t codecConfigLen = 0; + int32_t aacAdts = -1; }; struct CodecBufferInfo { diff --git a/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/player/Player.cpp b/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/player/Player.cpp index 51ebec05a3..7e32753d6b 100644 --- a/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/player/Player.cpp +++ b/code/BasicFeature/Media/AudioToVideoSync/entry/src/main/cpp/player/Player.cpp @@ -208,11 +208,6 @@ void Player::Release() { std::lock_guard lock(mutex); isStarted = false; - - // Clear the queue - while (audioDecContext && !audioDecContext->renderQueue.empty()) { - audioDecContext->renderQueue.pop(); - } if (audioRenderer != nullptr) { OH_AudioRenderer_Release(audioRenderer); audioRenderer = nullptr; @@ -246,6 +241,10 @@ void Player::Release() doneCond.notify_all(); // Trigger the callback sampleInfo.playDoneCallback(sampleInfo.playDoneCallbackData); + // Clear the queue + while (audioDecContext && !audioDecContext->renderQueue.empty()) { + audioDecContext->renderQueue.pop(); + } AVCODEC_SAMPLE_LOGI("Succeed"); } -- Gitee