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