1fa7767c5Sopenharmony_ci// /* 2fa7767c5Sopenharmony_ci// * Copyright (c) 2023-2023 Huawei Device Co., Ltd. 3fa7767c5Sopenharmony_ci// * Licensed under the Apache License, Version 2.0 (the "License"); 4fa7767c5Sopenharmony_ci// * you may not use this file except in compliance with the License. 5fa7767c5Sopenharmony_ci// * You may obtain a copy of the License at 6fa7767c5Sopenharmony_ci// * 7fa7767c5Sopenharmony_ci// * http://www.apache.org/licenses/LICENSE-2.0 8fa7767c5Sopenharmony_ci// * 9fa7767c5Sopenharmony_ci// * Unless required by applicable law or agreed to in writing, software 10fa7767c5Sopenharmony_ci// * distributed under the License is distributed on an "AS IS" BASIS, 11fa7767c5Sopenharmony_ci// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fa7767c5Sopenharmony_ci// * See the License for the specific language governing permissions and 13fa7767c5Sopenharmony_ci// * limitations under the License. 14fa7767c5Sopenharmony_ci// * 15fa7767c5Sopenharmony_ci 16fa7767c5Sopenharmony_ci#include <memory> 17fa7767c5Sopenharmony_ci 18fa7767c5Sopenharmony_ci#include "foundation/utils/constants.h" 19fa7767c5Sopenharmony_ci#include "gtest/gtest.h" 20fa7767c5Sopenharmony_ci#include "plugin/plugins/ffmpeg_adapter/demuxer/ffmpeg_track_meta.h" 21fa7767c5Sopenharmony_ci 22fa7767c5Sopenharmony_ciusing namespace testing::ext; 23fa7767c5Sopenharmony_ci 24fa7767c5Sopenharmony_cinamespace OHOS { 25fa7767c5Sopenharmony_cinamespace Media { 26fa7767c5Sopenharmony_cinamespace Test { 27fa7767c5Sopenharmony_ciusing namespace Plugin; 28fa7767c5Sopenharmony_ciusing namespace Plugin::Ffmpeg; 29fa7767c5Sopenharmony_ciusing namespace std; 30fa7767c5Sopenharmony_ci 31fa7767c5Sopenharmony_civoid propagateAVSampleFormats(const AVStream& avStream, 32fa7767c5Sopenharmony_ci const shared_ptr<AVFormatContext>& avFormatContextPtr, 33fa7767c5Sopenharmony_ci const shared_ptr<AVCodecContext>& avCodecContextPtr, 34fa7767c5Sopenharmony_ci Meta& meta) 35fa7767c5Sopenharmony_ci{ 36fa7767c5Sopenharmony_ci AVSampleFormat avSampleFormats[] = {AV_SAMPLE_FMT_NONE, AV_SAMPLE_FMT_U8}; 37fa7767c5Sopenharmony_ci for (auto avSampleFormat : avSampleFormats) { 38fa7767c5Sopenharmony_ci avCodecContextPtr->sample_fmt = avSampleFormat; 39fa7767c5Sopenharmony_ci ConvertAVStreamToMetaInfo(avStream, avFormatContextPtr, avCodecContextPtr, meta); 40fa7767c5Sopenharmony_ci } 41fa7767c5Sopenharmony_ci} 42fa7767c5Sopenharmony_ci 43fa7767c5Sopenharmony_civoid propagateFrameSize(const AVStream& avStream, 44fa7767c5Sopenharmony_ci const shared_ptr<AVFormatContext>& avFormatContextPtr, 45fa7767c5Sopenharmony_ci const shared_ptr<AVCodecContext>& avCodecContextPtr, 46fa7767c5Sopenharmony_ci Meta& meta) 47fa7767c5Sopenharmony_ci{ 48fa7767c5Sopenharmony_ci int fameSizes[] = {0, 2073600}; 49fa7767c5Sopenharmony_ci for (auto frameSize : fameSizes) { 50fa7767c5Sopenharmony_ci avCodecContextPtr->frame_size = frameSize; 51fa7767c5Sopenharmony_ci avStream.codecpar->frame_size = frameSize; 52fa7767c5Sopenharmony_ci propagateAVSampleFormats(avStream, avFormatContextPtr, avCodecContextPtr, meta); 53fa7767c5Sopenharmony_ci } 54fa7767c5Sopenharmony_ci} 55fa7767c5Sopenharmony_ci 56fa7767c5Sopenharmony_civoid propagateChannelLayouts(const AVStream& avStream, 57fa7767c5Sopenharmony_ci const shared_ptr<AVFormatContext>& avFormatContextPtr, 58fa7767c5Sopenharmony_ci const shared_ptr<AVCodecContext>& avCodecContextPtr, 59fa7767c5Sopenharmony_ci Meta& meta) 60fa7767c5Sopenharmony_ci{ 61fa7767c5Sopenharmony_ci int channelLayoutsNum = 12; 62fa7767c5Sopenharmony_ci for (int shift = 0, channelLayout = 0; shift <= channelLayoutsNum; shift++) { 63fa7767c5Sopenharmony_ci channelLayout = channelLayout << shift; 64fa7767c5Sopenharmony_ci avCodecContextPtr->channel_layout = channelLayout; 65fa7767c5Sopenharmony_ci propagateFrameSize(avStream, avFormatContextPtr, avCodecContextPtr, meta); 66fa7767c5Sopenharmony_ci } 67fa7767c5Sopenharmony_ci} 68fa7767c5Sopenharmony_ci 69fa7767c5Sopenharmony_civoid propagateChannels(const AVStream& avStream, 70fa7767c5Sopenharmony_ci const shared_ptr<AVFormatContext>& avFormatContextPtr, 71fa7767c5Sopenharmony_ci const shared_ptr<AVCodecContext>& avCodecContextPtr, 72fa7767c5Sopenharmony_ci Meta& meta) 73fa7767c5Sopenharmony_ci{ 74fa7767c5Sopenharmony_ci int channels[] = {0, 1, 2, 3, 4, 6, 8, 10, 12, 14, 16, 24}; 75fa7767c5Sopenharmony_ci for (auto channel : channels) { 76fa7767c5Sopenharmony_ci avCodecContextPtr->channels = channel; 77fa7767c5Sopenharmony_ci propagateChannelLayouts(avStream, avFormatContextPtr, avCodecContextPtr, meta); 78fa7767c5Sopenharmony_ci } 79fa7767c5Sopenharmony_ci} 80fa7767c5Sopenharmony_ci 81fa7767c5Sopenharmony_civoid propagateBitRate(const AVStream& avStream, 82fa7767c5Sopenharmony_ci const shared_ptr<AVFormatContext>& avFormatContextPtr, 83fa7767c5Sopenharmony_ci const shared_ptr<AVCodecContext>& avCodecContextPtr, 84fa7767c5Sopenharmony_ci Meta& meta) 85fa7767c5Sopenharmony_ci{ 86fa7767c5Sopenharmony_ci int bitRates[] = {0, 14400}; 87fa7767c5Sopenharmony_ci for (auto bitRate : bitRates) { 88fa7767c5Sopenharmony_ci avCodecContextPtr->bit_rate = bitRate; 89fa7767c5Sopenharmony_ci propagateChannels(avStream, avFormatContextPtr, avCodecContextPtr, meta); 90fa7767c5Sopenharmony_ci } 91fa7767c5Sopenharmony_ci} 92fa7767c5Sopenharmony_ci 93fa7767c5Sopenharmony_civoid propagateExtraData(const AVStream& avStream, 94fa7767c5Sopenharmony_ci const shared_ptr<AVFormatContext>& avFormatContextPtr, 95fa7767c5Sopenharmony_ci const shared_ptr<AVCodecContext>& avCodecContextPtr, 96fa7767c5Sopenharmony_ci Meta& meta) 97fa7767c5Sopenharmony_ci{ 98fa7767c5Sopenharmony_ci int extraDataSize = avCodecContextPtr->extradata_size; 99fa7767c5Sopenharmony_ci avCodecContextPtr->extradata = new uint8_t[extraDataSize]; 100fa7767c5Sopenharmony_ci 101fa7767c5Sopenharmony_ci uint8_t extraDatasInValid[] = {0x2A, 0xE6}; 102fa7767c5Sopenharmony_ci for (int index = 0; index < extraDataSize; index++) { 103fa7767c5Sopenharmony_ci avCodecContextPtr->extradata[index] = extraDatasInValid[index]; 104fa7767c5Sopenharmony_ci } 105fa7767c5Sopenharmony_ci propagateBitRate(avStream, avFormatContextPtr, avCodecContextPtr, meta); 106fa7767c5Sopenharmony_ci 107fa7767c5Sopenharmony_ci uint8_t extraDatasValid[] = {0x8A, 0xE6}; 108fa7767c5Sopenharmony_ci for (int index = 0; index < extraDataSize; index++) { 109fa7767c5Sopenharmony_ci avCodecContextPtr->extradata[index] = extraDatasValid[index]; 110fa7767c5Sopenharmony_ci } 111fa7767c5Sopenharmony_ci propagateBitRate(avStream, avFormatContextPtr, avCodecContextPtr, meta); 112fa7767c5Sopenharmony_ci 113fa7767c5Sopenharmony_ci delete[] avCodecContextPtr->extradata; 114fa7767c5Sopenharmony_ci} 115fa7767c5Sopenharmony_ci 116fa7767c5Sopenharmony_ciHWTEST(FFmpegDemuxerTrackMetaTest, test_ffmpetrack_meta, TestSize.Level1) 117fa7767c5Sopenharmony_ci{ 118fa7767c5Sopenharmony_ci AVStream avStream; 119fa7767c5Sopenharmony_ci 120fa7767c5Sopenharmony_ci avStream.codecpar = new AVCodecParameters(); 121fa7767c5Sopenharmony_ci avStream.codecpar->codec_id = AV_CODEC_ID_PCM_S16LE; 122fa7767c5Sopenharmony_ci 123fa7767c5Sopenharmony_ci const shared_ptr<AVFormatContext> avFormatContextPtr = make_shared<AVFormatContext>(); 124fa7767c5Sopenharmony_ci const shared_ptr<AVCodecContext> avCodecContextPtr = make_shared<AVCodecContext>(); 125fa7767c5Sopenharmony_ci Meta meta; 126fa7767c5Sopenharmony_ci 127fa7767c5Sopenharmony_ci AVCodecID codecIds[] = {AV_CODEC_ID_PCM_S16LE, AV_CODEC_ID_PCM_S16BE, AV_CODEC_ID_PCM_U16LE, AV_CODEC_ID_PCM_U16BE, 128fa7767c5Sopenharmony_ci AV_CODEC_ID_PCM_S24LE, AV_CODEC_ID_PCM_F32LE, AV_CODEC_ID_PCM_S8, AV_CODEC_ID_PCM_U8, AV_CODEC_ID_MP1, 129fa7767c5Sopenharmony_ci 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, 130fa7767c5Sopenharmony_ci AV_CODEC_ID_APE}; 131fa7767c5Sopenharmony_ci 132fa7767c5Sopenharmony_ci int extraDataSizes[] = {0, 2}; 133fa7767c5Sopenharmony_ci 134fa7767c5Sopenharmony_ci for (auto codecId : codecIds) { 135fa7767c5Sopenharmony_ci avStream.codecpar->codec_id = codecId; 136fa7767c5Sopenharmony_ci for (auto extraDataSize : extraDataSizes) { 137fa7767c5Sopenharmony_ci avCodecContextPtr->extradata_size = extraDataSize; 138fa7767c5Sopenharmony_ci propagateExtraData(avStream, avFormatContextPtr, avCodecContextPtr, meta); 139fa7767c5Sopenharmony_ci } 140fa7767c5Sopenharmony_ci } 141fa7767c5Sopenharmony_ci 142fa7767c5Sopenharmony_ci std::string mimeType; 143fa7767c5Sopenharmony_ci meta.Get<Tag::MIME>(mimeType); 144fa7767c5Sopenharmony_ci 145fa7767c5Sopenharmony_ci EXPECT_EQ(mimeType, MEDIA_MIME_AUDIO_APE); 146fa7767c5Sopenharmony_ci 147fa7767c5Sopenharmony_ci delete avStream.codecpar; 148fa7767c5Sopenharmony_ci} 149fa7767c5Sopenharmony_ci} 150fa7767c5Sopenharmony_ci} 151fa7767c5Sopenharmony_ci} 152