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