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