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