From b23c4c7032b789a09ab585d7fe6d9aece0e054f1 Mon Sep 17 00:00:00 2001 From: liujie129 Date: Tue, 11 Jul 2023 21:50:41 +0800 Subject: [PATCH 1/2] =?UTF-8?q?ffmpeg=5Fconverter.cpp=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=97=A0=E7=AC=A6=E5=8F=B7=E6=95=B0=E5=92=8C=E6=9C=89=E7=AC=A6?= =?UTF-8?q?=E5=8F=B7=E6=95=B0=E6=B7=B7=E5=90=88=E8=BF=90=E7=AE=97=E7=9A=84?= =?UTF-8?q?=E5=91=8A=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liujie129 --- engine/plugin/convert/ffmpeg_convert.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engine/plugin/convert/ffmpeg_convert.cpp b/engine/plugin/convert/ffmpeg_convert.cpp index 8208d6d0..0c05a35a 100644 --- a/engine/plugin/convert/ffmpeg_convert.cpp +++ b/engine/plugin/convert/ffmpeg_convert.cpp @@ -87,7 +87,7 @@ Status Resample::Convert(const uint8_t* srcBuffer, const size_t srcLength, uint8 tmpInput[i] = tmpInput[i-1] + lineSize; } } - auto samples = lineSize / av_get_bytes_per_sample(resamplePara_.srcFfFmt); + auto samples = lineSize / static_cast(av_get_bytes_per_sample(resamplePara_.srcFfFmt)); auto res = swr_convert(swrCtx_.get(), resampleChannelAddr_.data(), resamplePara_.destSamplesPerFrame, tmpInput.data(), samples); if (res < 0) { @@ -95,7 +95,8 @@ Status Resample::Convert(const uint8_t* srcBuffer, const size_t srcLength, uint8 destLength = 0; } else { destBuffer = resampleCache_.data(); - destLength = res * av_get_bytes_per_sample(resamplePara_.destFmt) * resamplePara_.channels; + size_t bytesPerSample = static_cast(av_get_bytes_per_sample(resamplePara_.destFmt)); + destLength = static_cast(res) * bytesPerSample * resamplePara_.channels; } } #endif -- Gitee From 60ed79f2c49f3fdca45f05ee5136e48ca1cd486f Mon Sep 17 00:00:00 2001 From: liujie129 Date: Tue, 15 Aug 2023 21:00:03 +0800 Subject: [PATCH 2/2] =?UTF-8?q?UT=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E8=A1=A5=E5=85=85ffmpeg=20track=20meta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liujie129 --- test/unittest/BUILD.gn | 1 + test/unittest/TestFFmpegDemuxer.cpp | 153 ++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 test/unittest/TestFFmpegDemuxer.cpp diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index 6f7374d9..8520be9c 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -79,6 +79,7 @@ ohos_unittest("histreamer_unit_test") { "./TestFFmpegAudioDecoder.cpp", "./TestFFmpegAudioEncoder.cpp", "./TestFFmpegAvcConfigDataParser.cpp", + "./TestFFmpegDemuxer.cpp", "./TestFFmpegUtils.cpp", "./TestFFmpegVidEncConfig.cpp", "./TestFFmpegVideoDecoder.cpp", diff --git a/test/unittest/TestFFmpegDemuxer.cpp b/test/unittest/TestFFmpegDemuxer.cpp new file mode 100644 index 00000000..b34b74dc --- /dev/null +++ b/test/unittest/TestFFmpegDemuxer.cpp @@ -0,0 +1,153 @@ +// /* +// * Copyright (c) 2023-2023 Huawei Device Co., Ltd. +// * Licensed under the Apache License, Version 2.0 (the "License"); +// * you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, +// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// * See the License for the specific language governing permissions and +// * limitations under the License. +// * + +#include + +#include "foundation/utils/constants.h" +#include "gtest/gtest.h" +#include "plugin/plugins/ffmpeg_adapter/demuxer/ffmpeg_track_meta.h" + +using namespace testing::ext; + +namespace OHOS { +namespace Media { +namespace Test { +using namespace Plugin; +using namespace Plugin::Ffmpeg; +using namespace std; + +void propagateAVSampleFormats(const AVStream& avStream, + const shared_ptr& avFormatContextPtr, + const shared_ptr& avCodecContextPtr, + Meta& meta) +{ + AVSampleFormat avSampleFormats[] = {AV_SAMPLE_FMT_NONE, AV_SAMPLE_FMT_U8}; + for (auto avSampleFormat : avSampleFormats) { + avCodecContextPtr->sample_fmt = avSampleFormat; + ConvertAVStreamToMetaInfo(avStream, avFormatContextPtr, avCodecContextPtr, meta); + } +} + +void propagateFrameSize(const AVStream& avStream, + const shared_ptr& avFormatContextPtr, + const shared_ptr& avCodecContextPtr, + Meta& meta) +{ + int fameSizes[] = {0, 2073600}; + for (auto frameSize : fameSizes) { + avCodecContextPtr->frame_size = frameSize; + avStream.codecpar->frame_size = frameSize; + propagateAVSampleFormats(avStream, avFormatContextPtr, avCodecContextPtr, meta); + } +} + +void propagateChannelLayouts(const AVStream& avStream, + const shared_ptr& avFormatContextPtr, + const shared_ptr& avCodecContextPtr, + Meta& meta) +{ + int channelLayoutsNum = 12; + for (int shift = 0, channelLayout = 0; shift <= channelLayoutsNum; shift++) { + channelLayout = channelLayout << shift; + avCodecContextPtr->channel_layout = channelLayout; + propagateFrameSize(avStream, avFormatContextPtr, avCodecContextPtr, meta); + } +} + +void propagateChannels(const AVStream& avStream, + const shared_ptr& avFormatContextPtr, + const shared_ptr& avCodecContextPtr, + Meta& meta) +{ + int channels[] = {0, 1, 2, 3, 4, 6, 8, 10, 12, 14, 16, 24}; + for (auto channel : channels) { + avCodecContextPtr->channels = channel; + propagateChannelLayouts(avStream, avFormatContextPtr, avCodecContextPtr, meta); + } +} + +void propagateBitRate(const AVStream& avStream, + const shared_ptr& avFormatContextPtr, + const shared_ptr& avCodecContextPtr, + Meta& meta) +{ + int bitRates[] = {0, 14400}; + for (auto bitRate : bitRates) { + avCodecContextPtr->bit_rate = bitRate; + propagateChannels(avStream, avFormatContextPtr, avCodecContextPtr, meta); + } +} + +void propagateExtraData(const AVStream& avStream, + const shared_ptr& avFormatContextPtr, + const shared_ptr& avCodecContextPtr, + Meta& meta) +{ + int extraDataSize = avCodecContextPtr->extradata_size; + avCodecContextPtr->extradata = new uint8_t[extraDataSize]; + + uint8_t extraDatasInValid[] = {0x2A, 0xE6}; + for (int index = 0; index < extraDataSize; index++) { + avCodecContextPtr->extradata[index] = extraDatasInValid[index]; + } + propagateBitRate(avStream, avFormatContextPtr, avCodecContextPtr, meta); + + uint8_t extraDatasValid[] = {0x8A, 0xE6}; + for (int index = 0; index < extraDataSize; index++) { + avCodecContextPtr->extradata[index] = extraDatasValid[index]; + } + propagateBitRate(avStream, avFormatContextPtr, avCodecContextPtr, meta); + + delete[] avCodecContextPtr->extradata; +} + +HWTEST(FFmpegDemuxerTrackMetaTest, test_ffmpetrack_meta, TestSize.Level1) +{ + AVStream avStream; + + avStream.codecpar = new AVCodecParameters(); + avStream.codecpar->codec_id = AV_CODEC_ID_PCM_S16LE; + avStream.index_entries = new AVIndexEntry(); + + const shared_ptr avFormatContextPtr = make_shared(); + const shared_ptr avCodecContextPtr = make_shared(); + Meta meta; + + AVCodecID codecIds[] = {AV_CODEC_ID_PCM_S16LE, AV_CODEC_ID_PCM_S16BE, AV_CODEC_ID_PCM_U16LE, AV_CODEC_ID_PCM_U16BE, + AV_CODEC_ID_PCM_S24LE, AV_CODEC_ID_PCM_F32LE, AV_CODEC_ID_PCM_S8, AV_CODEC_ID_PCM_U8, AV_CODEC_ID_MP1, + AV_CODEC_ID_MP2, AV_CODEC_ID_MP3, AV_CODEC_ID_AAC, AV_CODEC_ID_AAC_LATM, AV_CODEC_ID_VORBIS, AV_CODEC_ID_FLAC, + AV_CODEC_ID_APE}; + + int extraDataSizes[] = {0, 2}; + + for (auto codecId : codecIds) { + avStream.codecpar->codec_id = codecId; + for (auto extraDataSize : extraDataSizes) { + avCodecContextPtr->extradata_size = extraDataSize; + propagateExtraData(avStream, avFormatContextPtr, avCodecContextPtr, meta); + } + } + + std::string mimeType; + meta.Get(mimeType); + + EXPECT_EQ(mimeType, MEDIA_MIME_AUDIO_APE); + + delete avStream.codecpar; + delete avStream.index_entries; +} +} +} +} -- Gitee