1da853ecaSopenharmony_ci/*
2da853ecaSopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3da853ecaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4da853ecaSopenharmony_ci * you may not use this file except in compliance with the License.
5da853ecaSopenharmony_ci * You may obtain a copy of the License at
6da853ecaSopenharmony_ci *
7da853ecaSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8da853ecaSopenharmony_ci *
9da853ecaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10da853ecaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11da853ecaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12da853ecaSopenharmony_ci * See the License for the specific language governing permissions and
13da853ecaSopenharmony_ci * limitations under the License.
14da853ecaSopenharmony_ci */
15da853ecaSopenharmony_ci
16da853ecaSopenharmony_ci#include <string>
17da853ecaSopenharmony_ci#include <iostream>
18da853ecaSopenharmony_ci#include <thread>
19da853ecaSopenharmony_ci#include <vector>
20da853ecaSopenharmony_ci#include "gtest/gtest.h"
21da853ecaSopenharmony_ci#include "AVMuxerDemo.h"
22da853ecaSopenharmony_ci#include "fcntl.h"
23da853ecaSopenharmony_ci#include "avcodec_errors.h"
24da853ecaSopenharmony_ci
25da853ecaSopenharmony_ciusing namespace std;
26da853ecaSopenharmony_ciusing namespace testing::ext;
27da853ecaSopenharmony_ciusing namespace OHOS;
28da853ecaSopenharmony_ciusing namespace OHOS::MediaAVCodec;
29da853ecaSopenharmony_ciusing namespace OHOS::Media;
30da853ecaSopenharmony_ciconstexpr uint32_t SAMPLE_RATE_352 = 352;
31da853ecaSopenharmony_ciconstexpr uint32_t SAMPLE_RATE_288 = 288;
32da853ecaSopenharmony_ciconstexpr uint32_t CHANNEL_COUNT = 2;
33da853ecaSopenharmony_ciconstexpr uint32_t SAMPLE_RATE_44100 = 44100;
34da853ecaSopenharmony_ciconstexpr uint32_t EXTRA_SIZE_NUM = 100;
35da853ecaSopenharmony_ciconstexpr int32_t BUFFER_SIZE_NUM = 1024 * 1024;
36da853ecaSopenharmony_ci
37da853ecaSopenharmony_cinamespace {
38da853ecaSopenharmony_ciclass InnerAVMuxerFunctionTest : public testing::Test {
39da853ecaSopenharmony_cipublic:
40da853ecaSopenharmony_ci    static void SetUpTestCase();
41da853ecaSopenharmony_ci    static void TearDownTestCase();
42da853ecaSopenharmony_ci    void SetUp() override;
43da853ecaSopenharmony_ci    void TearDown() override;
44da853ecaSopenharmony_ci};
45da853ecaSopenharmony_ci
46da853ecaSopenharmony_civoid InnerAVMuxerFunctionTest::SetUpTestCase() {}
47da853ecaSopenharmony_civoid InnerAVMuxerFunctionTest::TearDownTestCase() {}
48da853ecaSopenharmony_civoid InnerAVMuxerFunctionTest::SetUp() {}
49da853ecaSopenharmony_civoid InnerAVMuxerFunctionTest::TearDown() {}
50da853ecaSopenharmony_ci
51da853ecaSopenharmony_cistatic int g_inputFile = -1;
52da853ecaSopenharmony_cistatic const int DATA_AUDIO_ID = 0;
53da853ecaSopenharmony_cistatic const int DATA_VIDEO_ID = 1;
54da853ecaSopenharmony_ciint32_t g_testResult[10] = { -1 };
55da853ecaSopenharmony_ci
56da853ecaSopenharmony_ciint32_t AddAudioTrack(AVMuxerDemo *muxerDemo, int32_t &trackIndex)
57da853ecaSopenharmony_ci{
58da853ecaSopenharmony_ci    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
59da853ecaSopenharmony_ci
60da853ecaSopenharmony_ci    int extraSize = 0;
61da853ecaSopenharmony_ci    read(g_inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
62da853ecaSopenharmony_ci    if (extraSize <= EXTRA_SIZE_NUM && extraSize > 0) {
63da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
64da853ecaSopenharmony_ci        read(g_inputFile, buffer.data(), extraSize);
65da853ecaSopenharmony_ci        audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
66da853ecaSopenharmony_ci    }
67da853ecaSopenharmony_ci    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_MPEG);
68da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(CHANNEL_COUNT);
69da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(SAMPLE_RATE_44100);
70da853ecaSopenharmony_ci
71da853ecaSopenharmony_ci    int32_t ret = muxerDemo->InnerAddTrack(trackIndex, audioParams);
72da853ecaSopenharmony_ci
73da853ecaSopenharmony_ci    return ret;
74da853ecaSopenharmony_ci}
75da853ecaSopenharmony_ci
76da853ecaSopenharmony_ciint32_t AddAudioTrackAAC(AVMuxerDemo *muxerDemo, int32_t &trackIndex)
77da853ecaSopenharmony_ci{
78da853ecaSopenharmony_ci    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
79da853ecaSopenharmony_ci
80da853ecaSopenharmony_ci    int extraSize = 0;
81da853ecaSopenharmony_ci    read(g_inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
82da853ecaSopenharmony_ci    if (extraSize <= EXTRA_SIZE_NUM && extraSize > 0) {
83da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
84da853ecaSopenharmony_ci        read(g_inputFile, buffer.data(), extraSize);
85da853ecaSopenharmony_ci        audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
86da853ecaSopenharmony_ci    }
87da853ecaSopenharmony_ci    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_AAC);
88da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(CHANNEL_COUNT);
89da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(SAMPLE_RATE_44100);
90da853ecaSopenharmony_ci
91da853ecaSopenharmony_ci    int32_t ret = muxerDemo->InnerAddTrack(trackIndex, audioParams);
92da853ecaSopenharmony_ci
93da853ecaSopenharmony_ci    return ret;
94da853ecaSopenharmony_ci}
95da853ecaSopenharmony_ci
96da853ecaSopenharmony_ciint32_t AddVideoTrack(AVMuxerDemo *muxerDemo, int32_t &trackIndex)
97da853ecaSopenharmony_ci{
98da853ecaSopenharmony_ci    std::shared_ptr<Meta> videoParams = std::make_shared<Meta>();
99da853ecaSopenharmony_ci
100da853ecaSopenharmony_ci    int extraSize = 0;
101da853ecaSopenharmony_ci    read(g_inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
102da853ecaSopenharmony_ci    if (extraSize <= EXTRA_SIZE_NUM && extraSize > 0) {
103da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
104da853ecaSopenharmony_ci        read(g_inputFile, buffer.data(), extraSize);
105da853ecaSopenharmony_ci        videoParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
106da853ecaSopenharmony_ci    }
107da853ecaSopenharmony_ci    videoParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::VIDEO_MPEG4);
108da853ecaSopenharmony_ci    videoParams->Set<Tag::VIDEO_WIDTH>(SAMPLE_RATE_352);
109da853ecaSopenharmony_ci    videoParams->Set<Tag::VIDEO_HEIGHT>(SAMPLE_RATE_288);
110da853ecaSopenharmony_ci
111da853ecaSopenharmony_ci    int32_t ret = muxerDemo->InnerAddTrack(trackIndex, videoParams);
112da853ecaSopenharmony_ci
113da853ecaSopenharmony_ci    return ret;
114da853ecaSopenharmony_ci}
115da853ecaSopenharmony_ci
116da853ecaSopenharmony_ciint32_t AddCoverTrack(AVMuxerDemo *muxerDemo, string coverType, int32_t trackIndex)
117da853ecaSopenharmony_ci{
118da853ecaSopenharmony_ci    std::shared_ptr<Meta> coverFormat = std::make_shared<Meta>();
119da853ecaSopenharmony_ci
120da853ecaSopenharmony_ci    if (coverType == "jpg") {
121da853ecaSopenharmony_ci        coverFormat->Set<Tag::MIME_TYPE>(Plugins::MimeType::IMAGE_JPG);
122da853ecaSopenharmony_ci    } else if (coverType == "png") {
123da853ecaSopenharmony_ci        coverFormat->Set<Tag::MIME_TYPE>(Plugins::MimeType::IMAGE_PNG);
124da853ecaSopenharmony_ci    } else {
125da853ecaSopenharmony_ci        coverFormat->Set<Tag::MIME_TYPE>(Plugins::MimeType::IMAGE_BMP);
126da853ecaSopenharmony_ci    }
127da853ecaSopenharmony_ci    coverFormat->Set<Tag::VIDEO_WIDTH>(SAMPLE_RATE_352);
128da853ecaSopenharmony_ci    coverFormat->Set<Tag::VIDEO_HEIGHT>(SAMPLE_RATE_288);
129da853ecaSopenharmony_ci
130da853ecaSopenharmony_ci    int32_t ret = muxerDemo->InnerAddTrack(trackIndex, coverFormat);
131da853ecaSopenharmony_ci
132da853ecaSopenharmony_ci    return ret;
133da853ecaSopenharmony_ci}
134da853ecaSopenharmony_ci
135da853ecaSopenharmony_civoid RemoveHeader()
136da853ecaSopenharmony_ci{
137da853ecaSopenharmony_ci    int extraSize = 0;
138da853ecaSopenharmony_ci    unsigned char buffer[100] = {0};
139da853ecaSopenharmony_ci    read(g_inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
140da853ecaSopenharmony_ci    if (extraSize <= EXTRA_SIZE_NUM && extraSize > 0) {
141da853ecaSopenharmony_ci        read(g_inputFile, buffer, extraSize);
142da853ecaSopenharmony_ci    }
143da853ecaSopenharmony_ci}
144da853ecaSopenharmony_ci
145da853ecaSopenharmony_civoid WriteTrackSample(AVMuxerDemo *muxerDemo, int audioTrackIndex, int videoTrackIndex)
146da853ecaSopenharmony_ci{
147da853ecaSopenharmony_ci    int dataTrackId = 0;
148da853ecaSopenharmony_ci    int dataSize = 0;
149da853ecaSopenharmony_ci    int trackId = 0;
150da853ecaSopenharmony_ci    uint32_t trackIndex;
151da853ecaSopenharmony_ci    auto alloc = AVAllocatorFactory::CreateSharedAllocator(MemoryFlag::MEMORY_READ_WRITE);
152da853ecaSopenharmony_ci    std::shared_ptr<AVBuffer> data = AVBuffer::CreateAVBuffer(alloc, BUFFER_SIZE_NUM);
153da853ecaSopenharmony_ci    int ret = 0;
154da853ecaSopenharmony_ci    do {
155da853ecaSopenharmony_ci        ret = read(g_inputFile, static_cast<void*>(&dataTrackId), sizeof(dataTrackId));
156da853ecaSopenharmony_ci        if (ret <= 0) {
157da853ecaSopenharmony_ci            return;
158da853ecaSopenharmony_ci        }
159da853ecaSopenharmony_ci        ret = read(g_inputFile, static_cast<void*>(&data->pts_), sizeof(data->pts_));
160da853ecaSopenharmony_ci        if (ret <= 0) {
161da853ecaSopenharmony_ci            return;
162da853ecaSopenharmony_ci        }
163da853ecaSopenharmony_ci        ret = read(g_inputFile, static_cast<void*>(&dataSize), sizeof(dataSize));
164da853ecaSopenharmony_ci        if (ret <= 0) {
165da853ecaSopenharmony_ci            return;
166da853ecaSopenharmony_ci        }
167da853ecaSopenharmony_ci        ret = read(g_inputFile, static_cast<void*>(data->memory_->GetAddr()), dataSize);
168da853ecaSopenharmony_ci        if (ret <= 0) {
169da853ecaSopenharmony_ci            return;
170da853ecaSopenharmony_ci        }
171da853ecaSopenharmony_ci
172da853ecaSopenharmony_ci        data->memory_->SetSize(dataSize);
173da853ecaSopenharmony_ci        if (dataTrackId == DATA_AUDIO_ID) {
174da853ecaSopenharmony_ci            trackId = audioTrackIndex;
175da853ecaSopenharmony_ci        } else if (dataTrackId == DATA_VIDEO_ID) {
176da853ecaSopenharmony_ci            trackId = videoTrackIndex;
177da853ecaSopenharmony_ci        } else {
178da853ecaSopenharmony_ci            cout << "error dataTrackId : " << trackId << endl;
179da853ecaSopenharmony_ci        }
180da853ecaSopenharmony_ci        if (trackId >= 0) {
181da853ecaSopenharmony_ci            trackIndex = trackId;
182da853ecaSopenharmony_ci            int32_t result = muxerDemo->InnerWriteSample(trackIndex, data);
183da853ecaSopenharmony_ci            if (result != AVCS_ERR_OK) {
184da853ecaSopenharmony_ci                return;
185da853ecaSopenharmony_ci            }
186da853ecaSopenharmony_ci        }
187da853ecaSopenharmony_ci    } while (ret > 0)
188da853ecaSopenharmony_ci}
189da853ecaSopenharmony_ci
190da853ecaSopenharmony_civoid WriteTrackSampleShort(AVMuxerDemo *muxerDemo, int audioTrackIndex, int videoTrackIndex, int audioWriteTime)
191da853ecaSopenharmony_ci{
192da853ecaSopenharmony_ci    int dataTrackId = 0;
193da853ecaSopenharmony_ci    int dataSize = 0;
194da853ecaSopenharmony_ci    int trackId = 0;
195da853ecaSopenharmony_ci    int curTime = 0;
196da853ecaSopenharmony_ci    uint32_t trackIndex;
197da853ecaSopenharmony_ci    auto alloc = AVAllocatorFactory::CreateSharedAllocator(MemoryFlag::MEMORY_READ_WRITE);
198da853ecaSopenharmony_ci    std::shared_ptr<AVBuffer> data = AVBuffer::CreateAVBuffer(alloc, BUFFER_SIZE_NUM);
199da853ecaSopenharmony_ci    int ret = 0;
200da853ecaSopenharmony_ci    do {
201da853ecaSopenharmony_ci        ret = read(g_inputFile, static_cast<void*>(&dataTrackId), sizeof(dataTrackId));
202da853ecaSopenharmony_ci        if (ret <= 0) {
203da853ecaSopenharmony_ci            return;
204da853ecaSopenharmony_ci        }
205da853ecaSopenharmony_ci        ret = read(g_inputFile, static_cast<void*>(&data->pts_), sizeof(data->pts_));
206da853ecaSopenharmony_ci        if (ret <= 0) {
207da853ecaSopenharmony_ci            return;
208da853ecaSopenharmony_ci        }
209da853ecaSopenharmony_ci        ret = read(g_inputFile, static_cast<void*>(&dataSize), sizeof(dataSize));
210da853ecaSopenharmony_ci        if (ret <= 0) {
211da853ecaSopenharmony_ci            return;
212da853ecaSopenharmony_ci        }
213da853ecaSopenharmony_ci        ret = read(g_inputFile, static_cast<void*>(data->memory_->GetAddr()), dataSize);
214da853ecaSopenharmony_ci        if (ret <= 0) {
215da853ecaSopenharmony_ci            return;
216da853ecaSopenharmony_ci        }
217da853ecaSopenharmony_ci
218da853ecaSopenharmony_ci        data->memory_->SetSize(dataSize);
219da853ecaSopenharmony_ci        if (dataTrackId == DATA_AUDIO_ID) {
220da853ecaSopenharmony_ci            trackId = audioTrackIndex;
221da853ecaSopenharmony_ci        } else if (dataTrackId == DATA_VIDEO_ID) {
222da853ecaSopenharmony_ci            trackId = videoTrackIndex;
223da853ecaSopenharmony_ci        } else {
224da853ecaSopenharmony_ci            printf("error dataTrackId : %d", trackId);
225da853ecaSopenharmony_ci        }
226da853ecaSopenharmony_ci        if (trackId >= 0) {
227da853ecaSopenharmony_ci            if (trackId == audioTrackIndex && curTime > audioWriteTime) {
228da853ecaSopenharmony_ci                continue;
229da853ecaSopenharmony_ci            } else if (trackId == audioTrackIndex) {
230da853ecaSopenharmony_ci                curTime++;
231da853ecaSopenharmony_ci            }
232da853ecaSopenharmony_ci            trackIndex = trackId;
233da853ecaSopenharmony_ci            int32_t result = muxerDemo->InnerWriteSample(trackIndex, data);
234da853ecaSopenharmony_ci            if (result != AVCS_ERR_OK) {
235da853ecaSopenharmony_ci                return;
236da853ecaSopenharmony_ci            }
237da853ecaSopenharmony_ci        }
238da853ecaSopenharmony_ci    } while (ret > 0)
239da853ecaSopenharmony_ci}
240da853ecaSopenharmony_ci
241da853ecaSopenharmony_ciint32_t AddAudioTrackByFd(AVMuxerDemo *muxerDemo, int32_t inputFile, int32_t &trackIndex)
242da853ecaSopenharmony_ci{
243da853ecaSopenharmony_ci    std::shared_ptr<Meta> audioParams = std::shared_ptr<Meta>();
244da853ecaSopenharmony_ci
245da853ecaSopenharmony_ci    int extraSize = 0;
246da853ecaSopenharmony_ci    read(inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
247da853ecaSopenharmony_ci    if (extraSize <= EXTRA_SIZE_NUM && extraSize > 0) {
248da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
249da853ecaSopenharmony_ci        read(inputFile, buffer.data(), extraSize);
250da853ecaSopenharmony_ci        audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
251da853ecaSopenharmony_ci    }
252da853ecaSopenharmony_ci    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_MPEG);
253da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(CHANNEL_COUNT);
254da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(SAMPLE_RATE_44100);
255da853ecaSopenharmony_ci
256da853ecaSopenharmony_ci    int32_t ret = muxerDemo->InnerAddTrack(trackIndex, audioParams);
257da853ecaSopenharmony_ci
258da853ecaSopenharmony_ci    return ret;
259da853ecaSopenharmony_ci}
260da853ecaSopenharmony_ci
261da853ecaSopenharmony_ciint32_t AddAudioTrackAACByFd(AVMuxerDemo *muxerDemo, int32_t inputFile, int32_t &trackIndex)
262da853ecaSopenharmony_ci{
263da853ecaSopenharmony_ci    std::shared_ptr<Meta> audioParams = std::shared_ptr<Meta>();
264da853ecaSopenharmony_ci
265da853ecaSopenharmony_ci    int extraSize = 0;
266da853ecaSopenharmony_ci    read(inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
267da853ecaSopenharmony_ci    if (extraSize <= EXTRA_SIZE_NUM && extraSize > 0) {
268da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
269da853ecaSopenharmony_ci        read(inputFile, buffer.data(), extraSize);
270da853ecaSopenharmony_ci        audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
271da853ecaSopenharmony_ci    }
272da853ecaSopenharmony_ci    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_AAC);
273da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(CHANNEL_COUNT);
274da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(SAMPLE_RATE_44100);
275da853ecaSopenharmony_ci
276da853ecaSopenharmony_ci    int32_t ret = muxerDemo->InnerAddTrack(trackIndex, audioParams);
277da853ecaSopenharmony_ci
278da853ecaSopenharmony_ci    return ret;
279da853ecaSopenharmony_ci}
280da853ecaSopenharmony_ci
281da853ecaSopenharmony_ciint32_t AddVideoTrackByFd(AVMuxerDemo *muxerDemo, int32_t inputFile, int32_t &trackIndex)
282da853ecaSopenharmony_ci{
283da853ecaSopenharmony_ci    std::shared_ptr<Meta> videoParams = std::shared_ptr<Meta>();
284da853ecaSopenharmony_ci
285da853ecaSopenharmony_ci    int extraSize = 0;
286da853ecaSopenharmony_ci    read(inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
287da853ecaSopenharmony_ci    if (extraSize <= EXTRA_SIZE_NUM && extraSize > 0) {
288da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
289da853ecaSopenharmony_ci        read(inputFile, buffer.data(), extraSize);
290da853ecaSopenharmony_ci        videoParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
291da853ecaSopenharmony_ci    }
292da853ecaSopenharmony_ci    videoParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::VIDEO_MPEG4);
293da853ecaSopenharmony_ci    videoParams->Set<Tag::VIDEO_WIDTH>(SAMPLE_RATE_352);
294da853ecaSopenharmony_ci    videoParams->Set<Tag::VIDEO_HEIGHT>(SAMPLE_RATE_288);
295da853ecaSopenharmony_ci
296da853ecaSopenharmony_ci    int32_t ret = muxerDemo->InnerAddTrack(trackIndex, videoParams);
297da853ecaSopenharmony_ci
298da853ecaSopenharmony_ci    return ret;
299da853ecaSopenharmony_ci}
300da853ecaSopenharmony_ci
301da853ecaSopenharmony_ciint32_t AddVideoTrackH264ByFd(AVMuxerDemo *muxerDemo, int32_t inputFile, int32_t &trackIndex)
302da853ecaSopenharmony_ci{
303da853ecaSopenharmony_ci    std::shared_ptr<Meta> videoParams = std::shared_ptr<Meta>();
304da853ecaSopenharmony_ci
305da853ecaSopenharmony_ci    int extraSize = 0;
306da853ecaSopenharmony_ci    read(inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
307da853ecaSopenharmony_ci    if (extraSize <= EXTRA_SIZE_NUM && extraSize > 0) {
308da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
309da853ecaSopenharmony_ci        read(inputFile, buffer.data(), extraSize);
310da853ecaSopenharmony_ci        videoParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
311da853ecaSopenharmony_ci    }
312da853ecaSopenharmony_ci    videoParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::VIDEO_AVC);
313da853ecaSopenharmony_ci    videoParams->Set<Tag::VIDEO_WIDTH>(SAMPLE_RATE_352);
314da853ecaSopenharmony_ci    videoParams->Set<Tag::VIDEO_HEIGHT>(SAMPLE_RATE_288);
315da853ecaSopenharmony_ci
316da853ecaSopenharmony_ci    int32_t ret = muxerDemo->InnerAddTrack(trackIndex, videoParams);
317da853ecaSopenharmony_ci
318da853ecaSopenharmony_ci    return ret;
319da853ecaSopenharmony_ci}
320da853ecaSopenharmony_ci
321da853ecaSopenharmony_ciint WriteTrackSampleByFdRead(int *inputFile, int64_t *pts, int *dataSize, int *dataTrackId)
322da853ecaSopenharmony_ci{
323da853ecaSopenharmony_ci    int ret = read(*inputFile, static_cast<void*>(dataTrackId), sizeof(*dataTrackId));
324da853ecaSopenharmony_ci    if (ret <= 0) {
325da853ecaSopenharmony_ci        cout << "read dataTrackId error, ret is: " << ret << endl;
326da853ecaSopenharmony_ci        return -1;
327da853ecaSopenharmony_ci    }
328da853ecaSopenharmony_ci    ret = read(*inputFile, static_cast<void*>(pts), sizeof(*pts));
329da853ecaSopenharmony_ci    if (ret <= 0) {
330da853ecaSopenharmony_ci        cout << "read info.presentationTimeUs error, ret is: " << ret << endl;
331da853ecaSopenharmony_ci        return -1;
332da853ecaSopenharmony_ci    }
333da853ecaSopenharmony_ci    ret = read(*inputFile, static_cast<void*>(dataSize), sizeof(*dataSize));
334da853ecaSopenharmony_ci    if (ret <= 0) {
335da853ecaSopenharmony_ci        cout << "read dataSize error, ret is: " << ret << endl;
336da853ecaSopenharmony_ci        return -1;
337da853ecaSopenharmony_ci    }
338da853ecaSopenharmony_ci    return 0;
339da853ecaSopenharmony_ci}
340da853ecaSopenharmony_ci
341da853ecaSopenharmony_ciint WriteTrackSampleByFdMem(int dataSize, std::shared_ptr<AVBuffer> &avMuxerDemoBuffer)
342da853ecaSopenharmony_ci{
343da853ecaSopenharmony_ci    if (avMuxerDemoBuffer != nullptr && dataSize > avMuxerDemoBuffer->memory_->GetCapacity()) {
344da853ecaSopenharmony_ci        avMuxerDemoBuffer = nullptr;
345da853ecaSopenharmony_ci    }
346da853ecaSopenharmony_ci    if (avMuxerDemoBuffer == nullptr) {
347da853ecaSopenharmony_ci        auto alloc = AVAllocatorFactory::CreateSharedAllocator(MemoryFlag::MEMORY_READ_WRITE);
348da853ecaSopenharmony_ci        avMuxerDemoBuffer = AVBuffer::CreateAVBuffer(alloc, dataSize);
349da853ecaSopenharmony_ci        if (avMuxerDemoBuffer == nullptr) {
350da853ecaSopenharmony_ci            printf("error malloc memory!\n");
351da853ecaSopenharmony_ci            return -1;
352da853ecaSopenharmony_ci        }
353da853ecaSopenharmony_ci    }
354da853ecaSopenharmony_ci    return 0;
355da853ecaSopenharmony_ci}
356da853ecaSopenharmony_ci
357da853ecaSopenharmony_ciint WriteTrackSampleByFdGetIndex(const int *dataTrackId, const int *audioTrackIndex, int *videoTrackIndex)
358da853ecaSopenharmony_ci{
359da853ecaSopenharmony_ci    int trackId = 0;
360da853ecaSopenharmony_ci    if (*dataTrackId == DATA_AUDIO_ID) {
361da853ecaSopenharmony_ci        trackId = *audioTrackIndex;
362da853ecaSopenharmony_ci    } else if (*dataTrackId == DATA_VIDEO_ID) {
363da853ecaSopenharmony_ci        trackId = *videoTrackIndex;
364da853ecaSopenharmony_ci    } else {
365da853ecaSopenharmony_ci        cout << "error dataTrackId : " << *dataTrackId << endl;
366da853ecaSopenharmony_ci    }
367da853ecaSopenharmony_ci
368da853ecaSopenharmony_ci    return trackId;
369da853ecaSopenharmony_ci}
370da853ecaSopenharmony_ci
371da853ecaSopenharmony_civoid WriteTrackSampleByFd(AVMuxerDemo *muxerDemo, int audioTrackIndex, int videoTrackIndex, int32_t inputFile)
372da853ecaSopenharmony_ci{
373da853ecaSopenharmony_ci    int dataTrackId = 0;
374da853ecaSopenharmony_ci    int dataSize = 0;
375da853ecaSopenharmony_ci    int trackId = 0;
376da853ecaSopenharmony_ci    int64_t pts = 0;
377da853ecaSopenharmony_ci    uint32_t trackIndex;
378da853ecaSopenharmony_ci    std::shared_ptr<AVBuffer> avMuxerDemoBuffer = nullptr;
379da853ecaSopenharmony_ci    string resultStr = "";
380da853ecaSopenharmony_ci    int ret = 0;
381da853ecaSopenharmony_ci    do {
382da853ecaSopenharmony_ci        ret = WriteTrackSampleByFdRead(&inputFile, &pts, &dataSize, &dataTrackId);
383da853ecaSopenharmony_ci        if (ret != 0) {
384da853ecaSopenharmony_ci            return;
385da853ecaSopenharmony_ci        }
386da853ecaSopenharmony_ci
387da853ecaSopenharmony_ci        ret = WriteTrackSampleByFdMem(dataSize, avMuxerDemoBuffer);
388da853ecaSopenharmony_ci        if (ret != 0) {
389da853ecaSopenharmony_ci            break;
390da853ecaSopenharmony_ci        }
391da853ecaSopenharmony_ci
392da853ecaSopenharmony_ci        resultStr =
393da853ecaSopenharmony_ci            "inputFile is: " + to_string(inputFile) + ", avMuxerDemoBufferSize is " + to_string(dataSize);
394da853ecaSopenharmony_ci        cout << resultStr << endl;
395da853ecaSopenharmony_ci
396da853ecaSopenharmony_ci        ret = read(inputFile, static_cast<void*>(avMuxerDemoBuffer->memory_->GetAddr()), dataSize);
397da853ecaSopenharmony_ci        if (ret <= 0) {
398da853ecaSopenharmony_ci            cout << "read data error, ret is: " << ret << endl;
399da853ecaSopenharmony_ci            continue;
400da853ecaSopenharmony_ci        }
401da853ecaSopenharmony_ci        avMuxerDemoBuffer->pts_ = pts;
402da853ecaSopenharmony_ci        avMuxerDemoBuffer->memory_->SetSize(dataSize);
403da853ecaSopenharmony_ci        trackId = WriteTrackSampleByFdGetIndex(&dataTrackId, &audioTrackIndex, &videoTrackIndex);
404da853ecaSopenharmony_ci        if (trackId >= 0) {
405da853ecaSopenharmony_ci            trackIndex = trackId;
406da853ecaSopenharmony_ci            int32_t result = muxerDemo->InnerWriteSample(trackIndex, avMuxerDemoBuffer);
407da853ecaSopenharmony_ci            if (result != 0) {
408da853ecaSopenharmony_ci                cout << "    WriteSampleBuffer error! ret is: " << result << endl;
409da853ecaSopenharmony_ci                break;
410da853ecaSopenharmony_ci            }
411da853ecaSopenharmony_ci        }
412da853ecaSopenharmony_ci    }while (ret > 0)
413da853ecaSopenharmony_ci}
414da853ecaSopenharmony_ci
415da853ecaSopenharmony_civoid RunMuxer(string testcaseName, int threadId, Plugins::OutputFormat format)
416da853ecaSopenharmony_ci{
417da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
418da853ecaSopenharmony_ci    string fileName = testcaseName + "_" + to_string(threadId);
419da853ecaSopenharmony_ci
420da853ecaSopenharmony_ci    cout << "thread id is: " << threadId << ", cur file name is: " << fileName << endl;
421da853ecaSopenharmony_ci    int32_t fd = muxerDemo->InnerGetFdByName(format, fileName);
422da853ecaSopenharmony_ci
423da853ecaSopenharmony_ci    int32_t inputFile;
424da853ecaSopenharmony_ci    int32_t audioTrackId;
425da853ecaSopenharmony_ci    int32_t videoTrackId;
426da853ecaSopenharmony_ci
427da853ecaSopenharmony_ci    cout << "thread id is: " << threadId << ", fd is: " << fd << endl;
428da853ecaSopenharmony_ci    muxerDemo->InnerCreate(fd, format);
429da853ecaSopenharmony_ci    int32_t ret;
430da853ecaSopenharmony_ci
431da853ecaSopenharmony_ci    if (format == Plugins::OutputFormat::MPEG_4) {
432da853ecaSopenharmony_ci        cout << "thread id is: " << threadId << ", format is: " << static_cast<int32_t>(format) << endl;
433da853ecaSopenharmony_ci        inputFile = open("avDataMpegMpeg4.bin", O_RDONLY);
434da853ecaSopenharmony_ci        AddAudioTrackByFd(muxerDemo, inputFile, audioTrackId);
435da853ecaSopenharmony_ci        AddVideoTrackByFd(muxerDemo, inputFile, videoTrackId);
436da853ecaSopenharmony_ci    } else {
437da853ecaSopenharmony_ci        cout << "thread id is: " << threadId << ", format is: " << static_cast<int32_t>(format) << endl;
438da853ecaSopenharmony_ci        inputFile = open("avData_mpeg4_aac_2.bin", O_RDONLY);
439da853ecaSopenharmony_ci        AddAudioTrackAACByFd(muxerDemo, inputFile, audioTrackId);
440da853ecaSopenharmony_ci        videoTrackId = -1;
441da853ecaSopenharmony_ci        int extraSize = 0;
442da853ecaSopenharmony_ci        unsigned char buffer[100] = {0};
443da853ecaSopenharmony_ci        read(inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
444da853ecaSopenharmony_ci        if (extraSize <= EXTRA_SIZE_NUM && extraSize > 0) {
445da853ecaSopenharmony_ci            read(inputFile, buffer, extraSize);
446da853ecaSopenharmony_ci        }
447da853ecaSopenharmony_ci    }
448da853ecaSopenharmony_ci
449da853ecaSopenharmony_ci    cout << "thread id is: " << threadId << ", audio track id is: " << audioTrackId
450da853ecaSopenharmony_ci         << ", video track id is: " << videoTrackId << endl;
451da853ecaSopenharmony_ci
452da853ecaSopenharmony_ci    ret = muxerDemo->InnerStart();
453da853ecaSopenharmony_ci    cout << "thread id is: " << threadId << ", Start ret is:" << ret << endl;
454da853ecaSopenharmony_ci
455da853ecaSopenharmony_ci    WriteTrackSampleByFd(muxerDemo, audioTrackId, videoTrackId, inputFile);
456da853ecaSopenharmony_ci
457da853ecaSopenharmony_ci    ret = muxerDemo->InnerStop();
458da853ecaSopenharmony_ci    cout << "thread id is: " << threadId << ", Stop ret is:" << ret << endl;
459da853ecaSopenharmony_ci
460da853ecaSopenharmony_ci    ret = muxerDemo->InnerDestroy();
461da853ecaSopenharmony_ci    cout << "thread id is: " << threadId << ", Destroy ret is:" << ret << endl;
462da853ecaSopenharmony_ci
463da853ecaSopenharmony_ci    g_testResult[threadId] = AVCS_ERR_OK;
464da853ecaSopenharmony_ci    close(inputFile);
465da853ecaSopenharmony_ci    close(fd);
466da853ecaSopenharmony_ci    delete muxerDemo;
467da853ecaSopenharmony_ci}
468da853ecaSopenharmony_ci
469da853ecaSopenharmony_ciint WriteSingleTrackSampleRead(int *fp, int64_t *pts, int *dataSize, int *flags)
470da853ecaSopenharmony_ci{
471da853ecaSopenharmony_ci    int ret = read(*fp, static_cast<void*>(pts), sizeof(*pts));
472da853ecaSopenharmony_ci    if (ret <= 0) {
473da853ecaSopenharmony_ci        return -1;
474da853ecaSopenharmony_ci    }
475da853ecaSopenharmony_ci
476da853ecaSopenharmony_ci    ret = read(*fp, static_cast<void*>(flags), sizeof(*flags));
477da853ecaSopenharmony_ci    if (ret <= 0) {
478da853ecaSopenharmony_ci        return -1;
479da853ecaSopenharmony_ci    }
480da853ecaSopenharmony_ci
481da853ecaSopenharmony_ci    ret = read(*fp, static_cast<void*>(dataSize), sizeof(*dataSize));
482da853ecaSopenharmony_ci    if (ret <= 0 || *dataSize < 0) {
483da853ecaSopenharmony_ci        return -1;
484da853ecaSopenharmony_ci    }
485da853ecaSopenharmony_ci    return 0;
486da853ecaSopenharmony_ci}
487da853ecaSopenharmony_ci
488da853ecaSopenharmony_ciint WriteSingleTrackSampleMem(int dataSize, std::shared_ptr<AVBuffer>& avMuxerDemoBuffer)
489da853ecaSopenharmony_ci{
490da853ecaSopenharmony_ci    if (avMuxerDemoBuffer != nullptr && dataSize > avMuxerDemoBuffer->memory_->GetCapacity()) {
491da853ecaSopenharmony_ci        avMuxerDemoBuffer = nullptr;
492da853ecaSopenharmony_ci    }
493da853ecaSopenharmony_ci    if (avMuxerDemoBuffer == nullptr) {
494da853ecaSopenharmony_ci        auto alloc = AVAllocatorFactory::CreateSharedAllocator(MemoryFlag::MEMORY_READ_WRITE);
495da853ecaSopenharmony_ci        avMuxerDemoBuffer = AVBuffer::CreateAVBuffer(alloc, dataSize);
496da853ecaSopenharmony_ci        if (avMuxerDemoBuffer == nullptr) {
497da853ecaSopenharmony_ci            printf("error malloc memory! %d\n", dataSize);
498da853ecaSopenharmony_ci            return -1;
499da853ecaSopenharmony_ci        }
500da853ecaSopenharmony_ci    }
501da853ecaSopenharmony_ci    return 0;
502da853ecaSopenharmony_ci}
503da853ecaSopenharmony_ci
504da853ecaSopenharmony_civoid WriteSingleTrackSample(AVMuxerDemo *muxerDemo, int trackId, int fd)
505da853ecaSopenharmony_ci{
506da853ecaSopenharmony_ci    int ret = 0;
507da853ecaSopenharmony_ci    int dataSize = 0;
508da853ecaSopenharmony_ci    int flags = 0;
509da853ecaSopenharmony_ci    int64_t pts = 0;
510da853ecaSopenharmony_ci    std::shared_ptr<AVBuffer> avMuxerDemoBuffer = nullptr;
511da853ecaSopenharmony_ci    uint32_t trackIndex;
512da853ecaSopenharmony_ci    do {
513da853ecaSopenharmony_ci        ret = WriteSingleTrackSampleRead(&fd, &pts, &dataSize, &flags);
514da853ecaSopenharmony_ci        if (ret != 0) {
515da853ecaSopenharmony_ci            break;
516da853ecaSopenharmony_ci        }
517da853ecaSopenharmony_ci        ret = WriteSingleTrackSampleMem(dataSize, avMuxerDemoBuffer);
518da853ecaSopenharmony_ci        if (ret != 0) {
519da853ecaSopenharmony_ci            break;
520da853ecaSopenharmony_ci        }
521da853ecaSopenharmony_ci        ret = read(fd, static_cast<void*>(avMuxerDemoBuffer->memory_->GetAddr()), dataSize);
522da853ecaSopenharmony_ci        if (ret <= 0) {
523da853ecaSopenharmony_ci            break;
524da853ecaSopenharmony_ci        }
525da853ecaSopenharmony_ci        avMuxerDemoBuffer->pts_ = pts;
526da853ecaSopenharmony_ci        avMuxerDemoBuffer->memory_->SetSize(dataSize);
527da853ecaSopenharmony_ci
528da853ecaSopenharmony_ci        if (flags != 0) {
529da853ecaSopenharmony_ci            avMuxerDemoBuffer->flag_ = static_cast<uint32_t>(Plugins::AVBufferFlag::SYNC_FRAME);
530da853ecaSopenharmony_ci        }
531da853ecaSopenharmony_ci        trackIndex = trackId;
532da853ecaSopenharmony_ci        int32_t result = muxerDemo->InnerWriteSample(trackIndex, avMuxerDemoBuffer);
533da853ecaSopenharmony_ci        if (result != 0) {
534da853ecaSopenharmony_ci            cout << "WriteSingleTrackSample error! ret is: " << result << endl;
535da853ecaSopenharmony_ci            break;
536da853ecaSopenharmony_ci        }
537da853ecaSopenharmony_ci    } while (ret > 0)
538da853ecaSopenharmony_ci}
539da853ecaSopenharmony_ci
540da853ecaSopenharmony_civoid WriteTrackCover(AVMuxerDemo *muxerDemo, int coverTrackIndex, int fdInput)
541da853ecaSopenharmony_ci{
542da853ecaSopenharmony_ci    printf("WriteTrackCover\n");
543da853ecaSopenharmony_ci    uint32_t trackIndex;
544da853ecaSopenharmony_ci    struct stat fileStat;
545da853ecaSopenharmony_ci    fstat(fdInput, &fileStat);
546da853ecaSopenharmony_ci    int32_t size = fileStat.st_size;
547da853ecaSopenharmony_ci
548da853ecaSopenharmony_ci    auto alloc = AVAllocatorFactory::CreateSharedAllocator(MemoryFlag::MEMORY_READ_WRITE);
549da853ecaSopenharmony_ci    std::shared_ptr<AVBuffer> avMuxerDemoBuffer = AVBuffer::CreateAVBuffer(alloc, size);
550da853ecaSopenharmony_ci    if (avMuxerDemoBuffer == nullptr) {
551da853ecaSopenharmony_ci        printf("malloc memory error! size: %d \n", size);
552da853ecaSopenharmony_ci        return;
553da853ecaSopenharmony_ci    }
554da853ecaSopenharmony_ci
555da853ecaSopenharmony_ci    int ret = read(fdInput, avMuxerDemoBuffer->memory_->GetAddr(), size);
556da853ecaSopenharmony_ci    if (ret <= 0) {
557da853ecaSopenharmony_ci        return;
558da853ecaSopenharmony_ci    }
559da853ecaSopenharmony_ci    avMuxerDemoBuffer->memory_->SetSize(size);
560da853ecaSopenharmony_ci    trackIndex = coverTrackIndex;
561da853ecaSopenharmony_ci    int32_t result = muxerDemo->InnerWriteSample(trackIndex, avMuxerDemoBuffer);
562da853ecaSopenharmony_ci    if (result != 0) {
563da853ecaSopenharmony_ci        cout << "WriteTrackCover error! ret is: " << result << endl;
564da853ecaSopenharmony_ci        return;
565da853ecaSopenharmony_ci    }
566da853ecaSopenharmony_ci}
567da853ecaSopenharmony_ci} // namespace
568da853ecaSopenharmony_ci
569da853ecaSopenharmony_ci/**
570da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_001
571da853ecaSopenharmony_ci * @tc.name      : audio
572da853ecaSopenharmony_ci * @tc.desc      : Function test
573da853ecaSopenharmony_ci */
574da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_001, TestSize.Level2)
575da853ecaSopenharmony_ci{
576da853ecaSopenharmony_ci    const Plugins::OutputFormat formatList[] = {Plugins::OutputFormat::M4A, Plugins::OutputFormat::MPEG_4};
577da853ecaSopenharmony_ci    for (int i = 0; i < 2; i++) {
578da853ecaSopenharmony_ci        AVMuxerDemo *muxerDemo = new AVMuxerDemo();
579da853ecaSopenharmony_ci
580da853ecaSopenharmony_ci        Plugins::OutputFormat format = formatList[i];
581da853ecaSopenharmony_ci        int32_t fd = muxerDemo->InnerGetFdByName(format, "FUNCTION_001_INNER_" + to_string(i));
582da853ecaSopenharmony_ci
583da853ecaSopenharmony_ci        int32_t audioFileFd = open("aac_44100_2.bin", O_RDONLY);
584da853ecaSopenharmony_ci
585da853ecaSopenharmony_ci        muxerDemo->InnerCreate(fd, format);
586da853ecaSopenharmony_ci
587da853ecaSopenharmony_ci        int32_t audioTrackId;
588da853ecaSopenharmony_ci        AddAudioTrackAAC(muxerDemo, audioTrackId);
589da853ecaSopenharmony_ci
590da853ecaSopenharmony_ci        int32_t videoTrackId = -1;
591da853ecaSopenharmony_ci        RemoveHeader();
592da853ecaSopenharmony_ci
593da853ecaSopenharmony_ci        cout << "audio track id is: " << audioTrackId << ", video track id is: " << videoTrackId << endl;
594da853ecaSopenharmony_ci
595da853ecaSopenharmony_ci        int32_t ret;
596da853ecaSopenharmony_ci
597da853ecaSopenharmony_ci        ret = muxerDemo->InnerStart();
598da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
599da853ecaSopenharmony_ci        audioTrackId = 0;
600da853ecaSopenharmony_ci
601da853ecaSopenharmony_ci        if (audioTrackId >= 0) {
602da853ecaSopenharmony_ci            WriteSingleTrackSample(muxerDemo, audioTrackId, audioFileFd);
603da853ecaSopenharmony_ci        }
604da853ecaSopenharmony_ci
605da853ecaSopenharmony_ci        ret = muxerDemo->InnerStop();
606da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
607da853ecaSopenharmony_ci
608da853ecaSopenharmony_ci        ret = muxerDemo->InnerDestroy();
609da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
610da853ecaSopenharmony_ci
611da853ecaSopenharmony_ci        close(audioFileFd);
612da853ecaSopenharmony_ci        close(fd);
613da853ecaSopenharmony_ci        delete muxerDemo;
614da853ecaSopenharmony_ci    }
615da853ecaSopenharmony_ci}
616da853ecaSopenharmony_ci
617da853ecaSopenharmony_ci/**
618da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_002
619da853ecaSopenharmony_ci * @tc.name      : video
620da853ecaSopenharmony_ci * @tc.desc      : Function test
621da853ecaSopenharmony_ci */
622da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_002, TestSize.Level2)
623da853ecaSopenharmony_ci{
624da853ecaSopenharmony_ci    const Plugins::OutputFormat formatList[] = {Plugins::OutputFormat::M4A, Plugins::OutputFormat::MPEG_4};
625da853ecaSopenharmony_ci    for (int i = 0; i < 2; i++) {
626da853ecaSopenharmony_ci        AVMuxerDemo *muxerDemo = new AVMuxerDemo();
627da853ecaSopenharmony_ci
628da853ecaSopenharmony_ci        Plugins::OutputFormat format = formatList[i];
629da853ecaSopenharmony_ci        int32_t fd = muxerDemo->InnerGetFdByName(format, "FUNCTION_002_INNER_" + to_string(i));
630da853ecaSopenharmony_ci
631da853ecaSopenharmony_ci        int32_t videoFileFd = open("h264_640_360.bin", O_RDONLY);
632da853ecaSopenharmony_ci
633da853ecaSopenharmony_ci        muxerDemo->InnerCreate(fd, format);
634da853ecaSopenharmony_ci
635da853ecaSopenharmony_ci        int32_t audioTrackId = -1;
636da853ecaSopenharmony_ci        RemoveHeader();
637da853ecaSopenharmony_ci        int32_t videoTrackId;
638da853ecaSopenharmony_ci        AddVideoTrack(muxerDemo, videoTrackId);
639da853ecaSopenharmony_ci
640da853ecaSopenharmony_ci        cout << "audio track id is: " << audioTrackId << ", video track id is: " << videoTrackId << endl;
641da853ecaSopenharmony_ci
642da853ecaSopenharmony_ci        int32_t ret;
643da853ecaSopenharmony_ci
644da853ecaSopenharmony_ci        ret = muxerDemo->InnerStart();
645da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
646da853ecaSopenharmony_ci
647da853ecaSopenharmony_ci        if (videoTrackId >= 0) {
648da853ecaSopenharmony_ci            WriteSingleTrackSample(muxerDemo, videoTrackId, videoFileFd);
649da853ecaSopenharmony_ci        }
650da853ecaSopenharmony_ci
651da853ecaSopenharmony_ci        ret = muxerDemo->InnerStop();
652da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
653da853ecaSopenharmony_ci
654da853ecaSopenharmony_ci        ret = muxerDemo->InnerDestroy();
655da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
656da853ecaSopenharmony_ci
657da853ecaSopenharmony_ci        close(videoFileFd);
658da853ecaSopenharmony_ci        close(fd);
659da853ecaSopenharmony_ci        delete muxerDemo;
660da853ecaSopenharmony_ci    }
661da853ecaSopenharmony_ci}
662da853ecaSopenharmony_ci
663da853ecaSopenharmony_ci/**
664da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_003
665da853ecaSopenharmony_ci * @tc.name      : audio and video
666da853ecaSopenharmony_ci * @tc.desc      : Function test
667da853ecaSopenharmony_ci */
668da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_003, TestSize.Level2)
669da853ecaSopenharmony_ci{
670da853ecaSopenharmony_ci    const Plugins::OutputFormat formatList[] = {Plugins::OutputFormat::M4A, Plugins::OutputFormat::MPEG_4};
671da853ecaSopenharmony_ci    for (int i = 0; i < 2; i++) {
672da853ecaSopenharmony_ci        AVMuxerDemo *muxerDemo = new AVMuxerDemo();
673da853ecaSopenharmony_ci
674da853ecaSopenharmony_ci        Plugins::OutputFormat format = formatList[i];
675da853ecaSopenharmony_ci        int32_t fd = muxerDemo->InnerGetFdByName(format, "FUNCTION_003_INNER_" + to_string(i));
676da853ecaSopenharmony_ci
677da853ecaSopenharmony_ci        int32_t audioFileFd = open("aac_44100_2.bin", O_RDONLY);
678da853ecaSopenharmony_ci        int32_t videoFileFd = open("mpeg4_720_480.bin", O_RDONLY);
679da853ecaSopenharmony_ci
680da853ecaSopenharmony_ci        muxerDemo->InnerCreate(fd, format);
681da853ecaSopenharmony_ci
682da853ecaSopenharmony_ci        int32_t audioTrackId;
683da853ecaSopenharmony_ci        AddAudioTrackAACByFd(muxerDemo, audioFileFd, audioTrackId);
684da853ecaSopenharmony_ci        int32_t videoTrackId;
685da853ecaSopenharmony_ci        AddVideoTrackByFd(muxerDemo, videoFileFd, videoTrackId);
686da853ecaSopenharmony_ci
687da853ecaSopenharmony_ci        cout << "audio track id is: " << audioTrackId << ", video track id is: " << videoTrackId << endl;
688da853ecaSopenharmony_ci
689da853ecaSopenharmony_ci        int32_t ret;
690da853ecaSopenharmony_ci
691da853ecaSopenharmony_ci        ret = muxerDemo->InnerStart();
692da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
693da853ecaSopenharmony_ci
694da853ecaSopenharmony_ci        if (audioTrackId >= 0) {
695da853ecaSopenharmony_ci            WriteSingleTrackSample(muxerDemo, audioTrackId, audioFileFd);
696da853ecaSopenharmony_ci        }
697da853ecaSopenharmony_ci        if (videoTrackId >= 0) {
698da853ecaSopenharmony_ci            WriteSingleTrackSample(muxerDemo, videoTrackId, videoFileFd);
699da853ecaSopenharmony_ci        }
700da853ecaSopenharmony_ci
701da853ecaSopenharmony_ci        ret = muxerDemo->InnerStop();
702da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
703da853ecaSopenharmony_ci
704da853ecaSopenharmony_ci        ret = muxerDemo->InnerDestroy();
705da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
706da853ecaSopenharmony_ci        close(audioFileFd);
707da853ecaSopenharmony_ci        close(videoFileFd);
708da853ecaSopenharmony_ci        close(fd);
709da853ecaSopenharmony_ci        delete muxerDemo;
710da853ecaSopenharmony_ci    }
711da853ecaSopenharmony_ci}
712da853ecaSopenharmony_ci
713da853ecaSopenharmony_ci/**
714da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_004
715da853ecaSopenharmony_ci * @tc.name      : mp4(SetRotation)
716da853ecaSopenharmony_ci * @tc.desc      : Function test
717da853ecaSopenharmony_ci */
718da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_004, TestSize.Level2)
719da853ecaSopenharmony_ci{
720da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
721da853ecaSopenharmony_ci
722da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
723da853ecaSopenharmony_ci    int32_t fd = muxerDemo->InnerGetFdByName(format, "FUNCTION_004_INNER");
724da853ecaSopenharmony_ci
725da853ecaSopenharmony_ci    g_inputFile = open("avDataMpegMpeg4.bin", O_RDONLY);
726da853ecaSopenharmony_ci
727da853ecaSopenharmony_ci    muxerDemo->InnerCreate(fd, format);
728da853ecaSopenharmony_ci
729da853ecaSopenharmony_ci    int32_t audioTrackId;
730da853ecaSopenharmony_ci    AddAudioTrack(muxerDemo, audioTrackId);
731da853ecaSopenharmony_ci    int32_t videoTrackId;
732da853ecaSopenharmony_ci    AddVideoTrack(muxerDemo, videoTrackId);
733da853ecaSopenharmony_ci
734da853ecaSopenharmony_ci    cout << "audio track id is: " << audioTrackId << ", video track id is: " << videoTrackId << endl;
735da853ecaSopenharmony_ci
736da853ecaSopenharmony_ci    int32_t ret;
737da853ecaSopenharmony_ci    ret = muxerDemo->InnerSetRotation(90);
738da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
739da853ecaSopenharmony_ci
740da853ecaSopenharmony_ci    ret = muxerDemo->InnerStart();
741da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
742da853ecaSopenharmony_ci
743da853ecaSopenharmony_ci    WriteTrackSample(muxerDemo, audioTrackId, videoTrackId);
744da853ecaSopenharmony_ci
745da853ecaSopenharmony_ci    ret = muxerDemo->InnerStop();
746da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
747da853ecaSopenharmony_ci
748da853ecaSopenharmony_ci    ret = muxerDemo->InnerDestroy();
749da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
750da853ecaSopenharmony_ci
751da853ecaSopenharmony_ci    close(g_inputFile);
752da853ecaSopenharmony_ci    close(fd);
753da853ecaSopenharmony_ci    delete muxerDemo;
754da853ecaSopenharmony_ci}
755da853ecaSopenharmony_ci
756da853ecaSopenharmony_ci/**
757da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_005
758da853ecaSopenharmony_ci * @tc.name      : mp4(video audio length not equal)
759da853ecaSopenharmony_ci * @tc.desc      : Function test
760da853ecaSopenharmony_ci */
761da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_005, TestSize.Level2)
762da853ecaSopenharmony_ci{
763da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
764da853ecaSopenharmony_ci
765da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
766da853ecaSopenharmony_ci    int32_t fd = muxerDemo->InnerGetFdByName(format, "FUNCTION_005_INNER");
767da853ecaSopenharmony_ci
768da853ecaSopenharmony_ci    g_inputFile = open("avDataMpegMpeg4.bin", O_RDONLY);
769da853ecaSopenharmony_ci
770da853ecaSopenharmony_ci    muxerDemo->InnerCreate(fd, format);
771da853ecaSopenharmony_ci    int32_t ret;
772da853ecaSopenharmony_ci
773da853ecaSopenharmony_ci    int32_t audioTrackId;
774da853ecaSopenharmony_ci    AddAudioTrack(muxerDemo, audioTrackId);
775da853ecaSopenharmony_ci    int32_t videoTrackId;
776da853ecaSopenharmony_ci    AddVideoTrack(muxerDemo, videoTrackId);
777da853ecaSopenharmony_ci
778da853ecaSopenharmony_ci    cout << "audio track id is: " << audioTrackId << ", video track id is: " << videoTrackId << endl;
779da853ecaSopenharmony_ci
780da853ecaSopenharmony_ci    ret = muxerDemo->InnerStart();
781da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
782da853ecaSopenharmony_ci
783da853ecaSopenharmony_ci    WriteTrackSampleShort(muxerDemo, audioTrackId, videoTrackId, 100);
784da853ecaSopenharmony_ci
785da853ecaSopenharmony_ci    ret = muxerDemo->InnerStop();
786da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
787da853ecaSopenharmony_ci
788da853ecaSopenharmony_ci    ret = muxerDemo->InnerDestroy();
789da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
790da853ecaSopenharmony_ci
791da853ecaSopenharmony_ci    close(g_inputFile);
792da853ecaSopenharmony_ci    close(fd);
793da853ecaSopenharmony_ci    delete muxerDemo;
794da853ecaSopenharmony_ci}
795da853ecaSopenharmony_ci
796da853ecaSopenharmony_ci/**
797da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_006
798da853ecaSopenharmony_ci * @tc.name      : m4a(thread)
799da853ecaSopenharmony_ci * @tc.desc      : Function test
800da853ecaSopenharmony_ci */
801da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_006, TestSize.Level2)
802da853ecaSopenharmony_ci{
803da853ecaSopenharmony_ci    vector<thread> threadVec;
804da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::M4A;
805da853ecaSopenharmony_ci    for (int i = 0; i < 16; i++) {
806da853ecaSopenharmony_ci        threadVec.push_back(thread(RunMuxer, "FUNCTION_006_INNER", i, format));
807da853ecaSopenharmony_ci    }
808da853ecaSopenharmony_ci    for (uint32_t i = 0; i < threadVec.size(); i++) {
809da853ecaSopenharmony_ci        threadVec[i].join();
810da853ecaSopenharmony_ci    }
811da853ecaSopenharmony_ci    for (int32_t i = 0; i < 10; i++)
812da853ecaSopenharmony_ci    {
813da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, g_testResult[i]);
814da853ecaSopenharmony_ci    }
815da853ecaSopenharmony_ci}
816da853ecaSopenharmony_ci
817da853ecaSopenharmony_ci/**
818da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_007
819da853ecaSopenharmony_ci * @tc.name      : mp4(thread)
820da853ecaSopenharmony_ci * @tc.desc      : Function test
821da853ecaSopenharmony_ci */
822da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_007, TestSize.Level2)
823da853ecaSopenharmony_ci{
824da853ecaSopenharmony_ci    vector<thread> threadVec;
825da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
826da853ecaSopenharmony_ci    for (int i = 0; i < 16; i++) {
827da853ecaSopenharmony_ci        threadVec.push_back(thread(RunMuxer, "FUNCTION_007_INNER", i, format));
828da853ecaSopenharmony_ci    }
829da853ecaSopenharmony_ci    for (uint32_t i = 0; i < threadVec.size(); i++) {
830da853ecaSopenharmony_ci        threadVec[i].join();
831da853ecaSopenharmony_ci    }
832da853ecaSopenharmony_ci    for (int32_t i = 0; i < 10; i++)
833da853ecaSopenharmony_ci    {
834da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, g_testResult[i]);
835da853ecaSopenharmony_ci    }
836da853ecaSopenharmony_ci}
837da853ecaSopenharmony_ci
838da853ecaSopenharmony_ci/**
839da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_008
840da853ecaSopenharmony_ci * @tc.name      : m4a(multi audio track)
841da853ecaSopenharmony_ci * @tc.desc      : Function test
842da853ecaSopenharmony_ci */
843da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_008, TestSize.Level2)
844da853ecaSopenharmony_ci{
845da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
846da853ecaSopenharmony_ci
847da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::M4A;
848da853ecaSopenharmony_ci    int32_t fd = muxerDemo->InnerGetFdByName(format, "FUNCTION_008_INNER");
849da853ecaSopenharmony_ci
850da853ecaSopenharmony_ci    int32_t audioFileFd1 = open("aac_44100_2.bin", O_RDONLY);
851da853ecaSopenharmony_ci    int32_t audioFileFd2 = open("aac_44100_2.bin", O_RDONLY);
852da853ecaSopenharmony_ci
853da853ecaSopenharmony_ci    muxerDemo->InnerCreate(fd, format);
854da853ecaSopenharmony_ci
855da853ecaSopenharmony_ci    int32_t audioTrackId1;
856da853ecaSopenharmony_ci    int32_t audioTrackId2;
857da853ecaSopenharmony_ci    AddAudioTrackAACByFd(muxerDemo, audioFileFd1, audioTrackId1);
858da853ecaSopenharmony_ci    AddAudioTrackAACByFd(muxerDemo, audioFileFd2, audioTrackId2);
859da853ecaSopenharmony_ci    RemoveHeader();
860da853ecaSopenharmony_ci
861da853ecaSopenharmony_ci    cout << "audiotrack id1 is: " << audioTrackId1 << ", audioTrackId2 is: " << audioTrackId2 << endl;
862da853ecaSopenharmony_ci
863da853ecaSopenharmony_ci    int32_t ret;
864da853ecaSopenharmony_ci
865da853ecaSopenharmony_ci    ret = muxerDemo->InnerStart();
866da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
867da853ecaSopenharmony_ci
868da853ecaSopenharmony_ci    if (audioTrackId1 >= 0) {
869da853ecaSopenharmony_ci        WriteSingleTrackSample(muxerDemo, audioTrackId1, audioFileFd1);
870da853ecaSopenharmony_ci    }
871da853ecaSopenharmony_ci    if (audioTrackId2 >= 0) {
872da853ecaSopenharmony_ci        WriteSingleTrackSample(muxerDemo, audioTrackId2, audioFileFd2);
873da853ecaSopenharmony_ci    }
874da853ecaSopenharmony_ci
875da853ecaSopenharmony_ci    ret = muxerDemo->InnerStop();
876da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
877da853ecaSopenharmony_ci
878da853ecaSopenharmony_ci    ret = muxerDemo->InnerDestroy();
879da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
880da853ecaSopenharmony_ci
881da853ecaSopenharmony_ci    close(audioFileFd1);
882da853ecaSopenharmony_ci    close(audioFileFd2);
883da853ecaSopenharmony_ci    close(fd);
884da853ecaSopenharmony_ci    delete muxerDemo;
885da853ecaSopenharmony_ci}
886da853ecaSopenharmony_ci
887da853ecaSopenharmony_ci/**
888da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_009
889da853ecaSopenharmony_ci * @tc.name      : mp4(multi video track)
890da853ecaSopenharmony_ci * @tc.desc      : Function test
891da853ecaSopenharmony_ci */
892da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_009, TestSize.Level2)
893da853ecaSopenharmony_ci{
894da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
895da853ecaSopenharmony_ci
896da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
897da853ecaSopenharmony_ci    int32_t fd = muxerDemo->InnerGetFdByName(format, "FUNCTION_009_INNER");
898da853ecaSopenharmony_ci
899da853ecaSopenharmony_ci    int32_t videoFileFd1 = open("h264_640_360.bin", O_RDONLY);
900da853ecaSopenharmony_ci    int32_t videoFileFd2 = open("h264_640_360.bin", O_RDONLY);
901da853ecaSopenharmony_ci
902da853ecaSopenharmony_ci    muxerDemo->InnerCreate(fd, format);
903da853ecaSopenharmony_ci
904da853ecaSopenharmony_ci    int32_t videoTrackId1;
905da853ecaSopenharmony_ci    int32_t videoTrackId2;
906da853ecaSopenharmony_ci    AddVideoTrackH264ByFd(muxerDemo, videoFileFd1, videoTrackId1);
907da853ecaSopenharmony_ci    AddVideoTrackH264ByFd(muxerDemo, videoFileFd2, videoTrackId2);
908da853ecaSopenharmony_ci
909da853ecaSopenharmony_ci    int32_t ret;
910da853ecaSopenharmony_ci
911da853ecaSopenharmony_ci    ret = muxerDemo->InnerStart();
912da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
913da853ecaSopenharmony_ci
914da853ecaSopenharmony_ci    if (videoTrackId1 >= 0) {
915da853ecaSopenharmony_ci        WriteSingleTrackSample(muxerDemo, videoTrackId1, videoFileFd1);
916da853ecaSopenharmony_ci    }
917da853ecaSopenharmony_ci    if (videoTrackId2 >= 0) {
918da853ecaSopenharmony_ci        WriteSingleTrackSample(muxerDemo, videoTrackId2, videoFileFd2);
919da853ecaSopenharmony_ci    }
920da853ecaSopenharmony_ci
921da853ecaSopenharmony_ci    ret = muxerDemo->InnerStop();
922da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
923da853ecaSopenharmony_ci
924da853ecaSopenharmony_ci    ret = muxerDemo->InnerDestroy();
925da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
926da853ecaSopenharmony_ci
927da853ecaSopenharmony_ci    close(videoFileFd1);
928da853ecaSopenharmony_ci    close(videoFileFd2);
929da853ecaSopenharmony_ci    close(fd);
930da853ecaSopenharmony_ci    delete muxerDemo;
931da853ecaSopenharmony_ci}
932da853ecaSopenharmony_ci
933da853ecaSopenharmony_ci/**
934da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_010
935da853ecaSopenharmony_ci * @tc.name      : m4a(auido video with cover)
936da853ecaSopenharmony_ci * @tc.desc      : Function test
937da853ecaSopenharmony_ci */
938da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_010, TestSize.Level2)
939da853ecaSopenharmony_ci{
940da853ecaSopenharmony_ci    string coverTypeList[] = {"bmp", "jpg", "png"};
941da853ecaSopenharmony_ci    for (int i = 0; i < 3; i++) {
942da853ecaSopenharmony_ci        AVMuxerDemo *muxerDemo = new AVMuxerDemo();
943da853ecaSopenharmony_ci        string outputFile = "SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_010_INNER_" + coverTypeList[i];
944da853ecaSopenharmony_ci        string coverFile = "greatwall." + coverTypeList[i];
945da853ecaSopenharmony_ci
946da853ecaSopenharmony_ci        Plugins::OutputFormat format = Plugins::OutputFormat::M4A;
947da853ecaSopenharmony_ci        int32_t fd = muxerDemo->InnerGetFdByName(format, outputFile);
948da853ecaSopenharmony_ci
949da853ecaSopenharmony_ci        int32_t audioFileFd = open("aac_44100_2.bin", O_RDONLY);
950da853ecaSopenharmony_ci        int32_t videoFileFd = open("h264_640_360.bin", O_RDONLY);
951da853ecaSopenharmony_ci        int32_t coverFileFd = open(coverFile.c_str(), O_RDONLY);
952da853ecaSopenharmony_ci
953da853ecaSopenharmony_ci        muxerDemo->InnerCreate(fd, format);
954da853ecaSopenharmony_ci
955da853ecaSopenharmony_ci        int32_t audioTrackId;
956da853ecaSopenharmony_ci        int32_t videoTrackId;
957da853ecaSopenharmony_ci        int32_t coverTrackId = 1;
958da853ecaSopenharmony_ci
959da853ecaSopenharmony_ci        AddAudioTrackAACByFd(muxerDemo, audioFileFd, audioTrackId);
960da853ecaSopenharmony_ci        AddVideoTrackH264ByFd(muxerDemo, videoFileFd, videoTrackId);
961da853ecaSopenharmony_ci        AddCoverTrack(muxerDemo, coverTypeList[i], coverTrackId);
962da853ecaSopenharmony_ci
963da853ecaSopenharmony_ci        cout << "audio track id is: " << audioTrackId << ", video track id is: " << videoTrackId
964da853ecaSopenharmony_ci             << ", cover track id is: " << coverTrackId << endl;
965da853ecaSopenharmony_ci
966da853ecaSopenharmony_ci        int32_t ret;
967da853ecaSopenharmony_ci
968da853ecaSopenharmony_ci        ret = muxerDemo->InnerStart();
969da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
970da853ecaSopenharmony_ci
971da853ecaSopenharmony_ci        WriteTrackCover(muxerDemo, coverTrackId, coverFileFd);
972da853ecaSopenharmony_ci        WriteSingleTrackSample(muxerDemo, audioTrackId, audioFileFd);
973da853ecaSopenharmony_ci        WriteSingleTrackSample(muxerDemo, videoTrackId, videoFileFd);
974da853ecaSopenharmony_ci
975da853ecaSopenharmony_ci        ret = muxerDemo->InnerStop();
976da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
977da853ecaSopenharmony_ci
978da853ecaSopenharmony_ci        ret = muxerDemo->InnerDestroy();
979da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
980da853ecaSopenharmony_ci
981da853ecaSopenharmony_ci        close(audioFileFd);
982da853ecaSopenharmony_ci        close(videoFileFd);
983da853ecaSopenharmony_ci        close(coverFileFd);
984da853ecaSopenharmony_ci        close(fd);
985da853ecaSopenharmony_ci        delete muxerDemo;
986da853ecaSopenharmony_ci    }
987da853ecaSopenharmony_ci}
988da853ecaSopenharmony_ci
989da853ecaSopenharmony_ci/**
990da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_011
991da853ecaSopenharmony_ci * @tc.name      : mp4(auido video with cover)
992da853ecaSopenharmony_ci * @tc.desc      : Function test
993da853ecaSopenharmony_ci */
994da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_011, TestSize.Level2)
995da853ecaSopenharmony_ci{
996da853ecaSopenharmony_ci    string coverTypeList[] = {"bmp", "jpg", "png"};
997da853ecaSopenharmony_ci    for (int i = 0; i < 3; i++) {
998da853ecaSopenharmony_ci        AVMuxerDemo *muxerDemo = new AVMuxerDemo();
999da853ecaSopenharmony_ci        string outputFile = "FUNCTION_011_INNER_" + coverTypeList[i];
1000da853ecaSopenharmony_ci        string coverFile = "greatwall." + coverTypeList[i];
1001da853ecaSopenharmony_ci
1002da853ecaSopenharmony_ci        Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
1003da853ecaSopenharmony_ci        int32_t fd = muxerDemo->InnerGetFdByName(format, outputFile);
1004da853ecaSopenharmony_ci
1005da853ecaSopenharmony_ci        int32_t audioFileFd = open("aac_44100_2.bin", O_RDONLY);
1006da853ecaSopenharmony_ci        int32_t videoFileFd = open("mpeg4_720_480.bin", O_RDONLY);
1007da853ecaSopenharmony_ci        int32_t coverFileFd = open(coverFile.c_str(), O_RDONLY);
1008da853ecaSopenharmony_ci
1009da853ecaSopenharmony_ci        muxerDemo->InnerCreate(fd, format);
1010da853ecaSopenharmony_ci
1011da853ecaSopenharmony_ci        int32_t audioTrackId;
1012da853ecaSopenharmony_ci        int32_t videoTrackId;
1013da853ecaSopenharmony_ci        int32_t coverTrackId = 1;
1014da853ecaSopenharmony_ci
1015da853ecaSopenharmony_ci        AddAudioTrackAACByFd(muxerDemo, audioFileFd, audioTrackId);
1016da853ecaSopenharmony_ci        AddVideoTrackByFd(muxerDemo, videoFileFd, videoTrackId);
1017da853ecaSopenharmony_ci        AddCoverTrack(muxerDemo, coverTypeList[i], coverTrackId);
1018da853ecaSopenharmony_ci
1019da853ecaSopenharmony_ci        cout << "audio track id is: " << audioTrackId << ", video track id is: " << videoTrackId
1020da853ecaSopenharmony_ci             << ", cover track id is: " << coverTrackId << endl;
1021da853ecaSopenharmony_ci
1022da853ecaSopenharmony_ci        int32_t ret;
1023da853ecaSopenharmony_ci
1024da853ecaSopenharmony_ci        ret = muxerDemo->InnerStart();
1025da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
1026da853ecaSopenharmony_ci
1027da853ecaSopenharmony_ci        WriteTrackCover(muxerDemo, coverTrackId, coverFileFd);
1028da853ecaSopenharmony_ci        WriteSingleTrackSample(muxerDemo, audioTrackId, audioFileFd);
1029da853ecaSopenharmony_ci        WriteSingleTrackSample(muxerDemo, videoTrackId, videoFileFd);
1030da853ecaSopenharmony_ci
1031da853ecaSopenharmony_ci        ret = muxerDemo->InnerStop();
1032da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
1033da853ecaSopenharmony_ci
1034da853ecaSopenharmony_ci        ret = muxerDemo->InnerDestroy();
1035da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
1036da853ecaSopenharmony_ci
1037da853ecaSopenharmony_ci        close(audioFileFd);
1038da853ecaSopenharmony_ci        close(videoFileFd);
1039da853ecaSopenharmony_ci        close(coverFileFd);
1040da853ecaSopenharmony_ci        close(fd);
1041da853ecaSopenharmony_ci        delete muxerDemo;
1042da853ecaSopenharmony_ci    }
1043da853ecaSopenharmony_ci}
1044