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