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 "gtest/gtest.h"
22da853ecaSopenharmony_ci#include "AVMuxerDemo.h"
23da853ecaSopenharmony_ci#include "fcntl.h"
24da853ecaSopenharmony_ci#include "avcodec_errors.h"
25da853ecaSopenharmony_ci#include "securec.h"
26da853ecaSopenharmony_ci
27da853ecaSopenharmony_ciusing namespace std;
28da853ecaSopenharmony_ciusing namespace testing::ext;
29da853ecaSopenharmony_ciusing namespace OHOS;
30da853ecaSopenharmony_ciusing namespace OHOS::MediaAVCodec;
31da853ecaSopenharmony_ciusing namespace OHOS::Media;
32da853ecaSopenharmony_ciconstexpr int32_t SAMPLE_RATE_44100 = 44100;
33da853ecaSopenharmony_ciconstexpr int32_t CHANNEL_COUNT = 2;
34da853ecaSopenharmony_ciconstexpr int32_t BUFFER_SIZE = 100;
35da853ecaSopenharmony_ciconstexpr int32_t SAMPLE_RATE_352 = 352;
36da853ecaSopenharmony_ciconstexpr int32_t SAMPLE_RATE_288 = 288;
37da853ecaSopenharmony_ciconstexpr int32_t BUFFER_SIZE_NUM = 1024 * 1024;
38da853ecaSopenharmony_ci
39da853ecaSopenharmony_cinamespace {
40da853ecaSopenharmony_ciclass InnerAVMuxerStablityTest : public testing::Test {
41da853ecaSopenharmony_cipublic:
42da853ecaSopenharmony_ci    static void SetUpTestCase();
43da853ecaSopenharmony_ci    static void TearDownTestCase();
44da853ecaSopenharmony_ci    void SetUp() override;
45da853ecaSopenharmony_ci    void TearDown() override;
46da853ecaSopenharmony_ci};
47da853ecaSopenharmony_ci
48da853ecaSopenharmony_civoid InnerAVMuxerStablityTest::SetUpTestCase() {}
49da853ecaSopenharmony_civoid InnerAVMuxerStablityTest::TearDownTestCase() {}
50da853ecaSopenharmony_civoid InnerAVMuxerStablityTest::SetUp() {}
51da853ecaSopenharmony_civoid InnerAVMuxerStablityTest::TearDown() {}
52da853ecaSopenharmony_ci
53da853ecaSopenharmony_cistatic int g_inputFile = -1;
54da853ecaSopenharmony_cistatic const int DATA_AUDIO_ID = 0;
55da853ecaSopenharmony_cistatic const int DATA_VIDEO_ID = 1;
56da853ecaSopenharmony_ci
57da853ecaSopenharmony_ciconstexpr int RUN_TIMES = 1000;
58da853ecaSopenharmony_ciconstexpr int RUN_TIME = 8 * 3600;
59da853ecaSopenharmony_ci
60da853ecaSopenharmony_ciint32_t g_testResult[10] = { -1 };
61da853ecaSopenharmony_ci
62da853ecaSopenharmony_ciint32_t SetRotation(AVMuxerDemo *muxerDemo)
63da853ecaSopenharmony_ci{
64da853ecaSopenharmony_ci    int32_t rotation = 0;
65da853ecaSopenharmony_ci    int32_t ret = muxerDemo->InnerSetRotation(rotation);
66da853ecaSopenharmony_ci    return ret;
67da853ecaSopenharmony_ci}
68da853ecaSopenharmony_ci
69da853ecaSopenharmony_ciint32_t AddTrack(AVMuxerDemo *muxerDemo, int32_t &trackIndex)
70da853ecaSopenharmony_ci{
71da853ecaSopenharmony_ci    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
72da853ecaSopenharmony_ci    int extraSize = 0;
73da853ecaSopenharmony_ci    read(g_inputFile, static_cast<void *>(&extraSize), sizeof(extraSize));
74da853ecaSopenharmony_ci    if (extraSize <= BUFFER_SIZE && extraSize > 0) {
75da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
76da853ecaSopenharmony_ci        read(g_inputFile, buffer.data(), extraSize);
77da853ecaSopenharmony_ci        audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
78da853ecaSopenharmony_ci    }
79da853ecaSopenharmony_ci    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_AAC);
80da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(CHANNEL_COUNT);
81da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(SAMPLE_RATE_44100);
82da853ecaSopenharmony_ci
83da853ecaSopenharmony_ci    int32_t trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
84da853ecaSopenharmony_ci    return trackId;
85da853ecaSopenharmony_ci}
86da853ecaSopenharmony_ci
87da853ecaSopenharmony_ciint32_t WriteSample(AVMuxerDemo *muxerDemo)
88da853ecaSopenharmony_ci{
89da853ecaSopenharmony_ci    uint32_t trackIndex = 0;
90da853ecaSopenharmony_ci    uint8_t data[100];
91da853ecaSopenharmony_ci    std::shared_ptr<AVBuffer> avMemBuffer = AVBuffer::CreateAVBuffer(data, sizeof(data), sizeof(data));
92da853ecaSopenharmony_ci    avMemBuffer->flag_ = static_cast<uint32_t>(Plugins::AVBufferFlag::NONE);
93da853ecaSopenharmony_ci
94da853ecaSopenharmony_ci    int32_t ret = muxerDemo->InnerWriteSample(trackIndex, avMemBuffer);
95da853ecaSopenharmony_ci
96da853ecaSopenharmony_ci    return ret;
97da853ecaSopenharmony_ci}
98da853ecaSopenharmony_ci
99da853ecaSopenharmony_ciint32_t AddAudioTrack(AVMuxerDemo *muxerDemo, int32_t &trackIndex)
100da853ecaSopenharmony_ci{
101da853ecaSopenharmony_ci    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
102da853ecaSopenharmony_ci    int extraSize = 0;
103da853ecaSopenharmony_ci    read(g_inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
104da853ecaSopenharmony_ci    if (extraSize <= BUFFER_SIZE && extraSize > 0) {
105da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
106da853ecaSopenharmony_ci        read(g_inputFile, buffer.data(), extraSize);
107da853ecaSopenharmony_ci        audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
108da853ecaSopenharmony_ci    }
109da853ecaSopenharmony_ci    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_MPEG);
110da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(CHANNEL_COUNT);
111da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(SAMPLE_RATE_44100);
112da853ecaSopenharmony_ci
113da853ecaSopenharmony_ci    int32_t trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
114da853ecaSopenharmony_ci    return trackId;
115da853ecaSopenharmony_ci}
116da853ecaSopenharmony_ci
117da853ecaSopenharmony_ciint32_t AddAudioTrackAAC(AVMuxerDemo *muxerDemo, int32_t &trackIndex)
118da853ecaSopenharmony_ci{
119da853ecaSopenharmony_ci    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
120da853ecaSopenharmony_ci    int extraSize = 0;
121da853ecaSopenharmony_ci    read(g_inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
122da853ecaSopenharmony_ci    if (extraSize <= BUFFER_SIZE && extraSize > 0) {
123da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
124da853ecaSopenharmony_ci        read(g_inputFile, buffer.data(), extraSize);
125da853ecaSopenharmony_ci        audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
126da853ecaSopenharmony_ci    }
127da853ecaSopenharmony_ci    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_AAC);
128da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(CHANNEL_COUNT);
129da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(SAMPLE_RATE_44100);
130da853ecaSopenharmony_ci    audioParams->Set<Tag::MEDIA_PROFILE>(AAC_PROFILE_LC);
131da853ecaSopenharmony_ci
132da853ecaSopenharmony_ci    int32_t trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
133da853ecaSopenharmony_ci    return trackId;
134da853ecaSopenharmony_ci}
135da853ecaSopenharmony_ci
136da853ecaSopenharmony_ciint32_t AddVideoTrack(AVMuxerDemo *muxerDemo, int32_t &trackIndex)
137da853ecaSopenharmony_ci{
138da853ecaSopenharmony_ci    std::shared_ptr<Meta> videoParams = std::make_shared<Meta>();
139da853ecaSopenharmony_ci    int extraSize = 0;
140da853ecaSopenharmony_ci    read(g_inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
141da853ecaSopenharmony_ci    if (extraSize <= BUFFER_SIZE && extraSize > 0) {
142da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
143da853ecaSopenharmony_ci        read(g_inputFile, buffer.data(), extraSize);
144da853ecaSopenharmony_ci        videoParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
145da853ecaSopenharmony_ci    }
146da853ecaSopenharmony_ci    videoParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::VIDEO_MPEG4);
147da853ecaSopenharmony_ci    videoParams->Set<Tag::VIDEO_WIDTH>(SAMPLE_RATE_352);
148da853ecaSopenharmony_ci    videoParams->Set<Tag::VIDEO_HEIGHT>(SAMPLE_RATE_288);
149da853ecaSopenharmony_ci
150da853ecaSopenharmony_ci    int32_t trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
151da853ecaSopenharmony_ci    return trackId;
152da853ecaSopenharmony_ci}
153da853ecaSopenharmony_ci
154da853ecaSopenharmony_civoid RemoveHeader()
155da853ecaSopenharmony_ci{
156da853ecaSopenharmony_ci    int extraSize = 0;
157da853ecaSopenharmony_ci    unsigned char buffer[100] = {0};
158da853ecaSopenharmony_ci    read(g_inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
159da853ecaSopenharmony_ci    if (extraSize <= BUFFER_SIZE && extraSize > 0) {
160da853ecaSopenharmony_ci        read(g_inputFile, buffer, extraSize);
161da853ecaSopenharmony_ci    }
162da853ecaSopenharmony_ci}
163da853ecaSopenharmony_ci
164da853ecaSopenharmony_civoid WriteTrackSample(AVMuxerDemo *muxerDemo, int audioTrackIndex, int videoTrackIndex)
165da853ecaSopenharmony_ci{
166da853ecaSopenharmony_ci    int dataTrackId = 0;
167da853ecaSopenharmony_ci    int dataSize = 0;
168da853ecaSopenharmony_ci    int ret = 0;
169da853ecaSopenharmony_ci    int trackId = 0;
170da853ecaSopenharmony_ci    uint32_t trackIndex;
171da853ecaSopenharmony_ci
172da853ecaSopenharmony_ci    auto alloc = AVAllocatorFactory::CreateSharedAllocator(MemoryFlag::MEMORY_READ_WRITE);
173da853ecaSopenharmony_ci    std::shared_ptr<AVBuffer> avMemBuffer = AVBuffer::CreateAVBuffer(alloc, BUFFER_SIZE_NUM);
174da853ecaSopenharmony_ci    do {
175da853ecaSopenharmony_ci        ret = read(g_inputFile, static_cast<void*>(&dataTrackId), sizeof(dataTrackId));
176da853ecaSopenharmony_ci        if (ret <= 0) {
177da853ecaSopenharmony_ci            return;
178da853ecaSopenharmony_ci        }
179da853ecaSopenharmony_ci        ret = read(g_inputFile, static_cast<void*>(&avMemBuffer->pts_), sizeof(avMemBuffer->pts_));
180da853ecaSopenharmony_ci        if (ret <= 0) {
181da853ecaSopenharmony_ci            return;
182da853ecaSopenharmony_ci        }
183da853ecaSopenharmony_ci        ret = read(g_inputFile, static_cast<void*>(&dataSize), sizeof(dataSize));
184da853ecaSopenharmony_ci        if (ret <= 0) {
185da853ecaSopenharmony_ci            return;
186da853ecaSopenharmony_ci        }
187da853ecaSopenharmony_ci        ret = read(g_inputFile, static_cast<void*>(avMemBuffer->memory_->GetAddr()), dataSize);
188da853ecaSopenharmony_ci        if (ret <= 0) {
189da853ecaSopenharmony_ci            return;
190da853ecaSopenharmony_ci        }
191da853ecaSopenharmony_ci
192da853ecaSopenharmony_ci        avMemBuffer->memory_->SetSize(dataSize);
193da853ecaSopenharmony_ci        if (dataTrackId == DATA_AUDIO_ID) {
194da853ecaSopenharmony_ci            trackId = audioTrackIndex;
195da853ecaSopenharmony_ci        } else if (dataTrackId == DATA_VIDEO_ID) {
196da853ecaSopenharmony_ci            trackId = videoTrackIndex;
197da853ecaSopenharmony_ci        } else {
198da853ecaSopenharmony_ci            cout << "error dataTrackId : " << trackId << endl;
199da853ecaSopenharmony_ci        }
200da853ecaSopenharmony_ci        if (trackId >= 0) {
201da853ecaSopenharmony_ci            trackIndex = trackId;
202da853ecaSopenharmony_ci            int32_t result = muxerDemo->InnerWriteSample(trackIndex, avMemBuffer);
203da853ecaSopenharmony_ci            if (result != AVCS_ERR_OK) {
204da853ecaSopenharmony_ci                return;
205da853ecaSopenharmony_ci            }
206da853ecaSopenharmony_ci        }
207da853ecaSopenharmony_ci    } while (ret > 0)
208da853ecaSopenharmony_ci}
209da853ecaSopenharmony_ci
210da853ecaSopenharmony_ciint32_t AddAudioTrackByFd(AVMuxerDemo *muxerDemo, int32_t inputFile, int32_t &trackIndex)
211da853ecaSopenharmony_ci{
212da853ecaSopenharmony_ci    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
213da853ecaSopenharmony_ci    int extraSize = 0;
214da853ecaSopenharmony_ci    read(inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
215da853ecaSopenharmony_ci    if (extraSize <= BUFFER_SIZE && extraSize > 0) {
216da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
217da853ecaSopenharmony_ci        read(inputFile, buffer.data(), extraSize);
218da853ecaSopenharmony_ci        audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
219da853ecaSopenharmony_ci    }
220da853ecaSopenharmony_ci    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_MPEG);
221da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(CHANNEL_COUNT);
222da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(SAMPLE_RATE_44100);
223da853ecaSopenharmony_ci
224da853ecaSopenharmony_ci    int32_t trackId = muxerDemo->InnerAddTrack(trackIndex, audioParams);
225da853ecaSopenharmony_ci    return trackId;
226da853ecaSopenharmony_ci}
227da853ecaSopenharmony_ci
228da853ecaSopenharmony_ciint32_t AddAudioTrackAACByFd(AVMuxerDemo *muxerDemo, int32_t inputFile, int32_t &trackIndex)
229da853ecaSopenharmony_ci{
230da853ecaSopenharmony_ci    std::shared_ptr<Meta> audioParams = std::make_shared<Meta>();
231da853ecaSopenharmony_ci    int extraSize = 0;
232da853ecaSopenharmony_ci    read(inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
233da853ecaSopenharmony_ci    if (extraSize <= BUFFER_SIZE && extraSize > 0) {
234da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
235da853ecaSopenharmony_ci        read(inputFile, buffer.data(), extraSize);
236da853ecaSopenharmony_ci        audioParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
237da853ecaSopenharmony_ci    }
238da853ecaSopenharmony_ci    audioParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::AUDIO_AAC);
239da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_CHANNEL_COUNT>(CHANNEL_COUNT);
240da853ecaSopenharmony_ci    audioParams->Set<Tag::AUDIO_SAMPLE_RATE>(SAMPLE_RATE_44100);
241da853ecaSopenharmony_ci
242da853ecaSopenharmony_ci    int32_t ret = muxerDemo->InnerAddTrack(trackIndex, audioParams);
243da853ecaSopenharmony_ci    return ret;
244da853ecaSopenharmony_ci}
245da853ecaSopenharmony_ci
246da853ecaSopenharmony_ciint32_t AddVideoTrackByFd(AVMuxerDemo *muxerDemo, int32_t inputFile, int32_t &trackIndex)
247da853ecaSopenharmony_ci{
248da853ecaSopenharmony_ci    std::shared_ptr<Meta> videoParams = std::make_shared<Meta>();
249da853ecaSopenharmony_ci    int extraSize = 0;
250da853ecaSopenharmony_ci    read(inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
251da853ecaSopenharmony_ci    if (extraSize <= BUFFER_SIZE && extraSize > 0) {
252da853ecaSopenharmony_ci        std::vector<uint8_t> buffer(extraSize);
253da853ecaSopenharmony_ci        read(inputFile, buffer.data(), extraSize);
254da853ecaSopenharmony_ci        videoParams->Set<Tag::MEDIA_CODEC_CONFIG>(buffer);
255da853ecaSopenharmony_ci    }
256da853ecaSopenharmony_ci    videoParams->Set<Tag::MIME_TYPE>(Plugins::MimeType::VIDEO_MPEG4);
257da853ecaSopenharmony_ci    videoParams->Set<Tag::VIDEO_WIDTH>(SAMPLE_RATE_352);
258da853ecaSopenharmony_ci    videoParams->Set<Tag::VIDEO_HEIGHT>(SAMPLE_RATE_288);
259da853ecaSopenharmony_ci
260da853ecaSopenharmony_ci    int32_t trackId = muxerDemo->InnerAddTrack(trackIndex, videoParams);
261da853ecaSopenharmony_ci    return trackId;
262da853ecaSopenharmony_ci}
263da853ecaSopenharmony_ci
264da853ecaSopenharmony_ciint WriteTrackSampleByFdRead(int *inputFile, int64_t *pts, int *dataSize, int *dataTrackId)
265da853ecaSopenharmony_ci{
266da853ecaSopenharmony_ci    int ret = read(*inputFile, static_cast<void*>(dataTrackId), sizeof(*dataTrackId));
267da853ecaSopenharmony_ci    if (ret <= 0) {
268da853ecaSopenharmony_ci        cout << "read dataTrackId error, ret is: " << ret << endl;
269da853ecaSopenharmony_ci        return -1;
270da853ecaSopenharmony_ci    }
271da853ecaSopenharmony_ci    ret = read(*inputFile, static_cast<void*>(pts), sizeof(*pts));
272da853ecaSopenharmony_ci    if (ret <= 0) {
273da853ecaSopenharmony_ci        cout << "read info.presentationTimeUs error, ret is: " << ret << endl;
274da853ecaSopenharmony_ci        return -1;
275da853ecaSopenharmony_ci    }
276da853ecaSopenharmony_ci    ret = read(*inputFile, static_cast<void*>(dataSize), sizeof(*dataSize));
277da853ecaSopenharmony_ci    if (ret <= 0) {
278da853ecaSopenharmony_ci        cout << "read dataSize error, ret is: " << ret << endl;
279da853ecaSopenharmony_ci        return -1;
280da853ecaSopenharmony_ci    }
281da853ecaSopenharmony_ci    return 0;
282da853ecaSopenharmony_ci}
283da853ecaSopenharmony_ci
284da853ecaSopenharmony_ciint WriteTrackSampleByFdMem(int dataSize, std::shared_ptr<AVBuffer> &avMuxerDemoBuffer)
285da853ecaSopenharmony_ci{
286da853ecaSopenharmony_ci    if (avMuxerDemoBuffer != nullptr && dataSize > avMuxerDemoBuffer->memory_->GetCapacity()) {
287da853ecaSopenharmony_ci        avMuxerDemoBuffer = nullptr;
288da853ecaSopenharmony_ci    }
289da853ecaSopenharmony_ci    if (avMuxerDemoBuffer == nullptr) {
290da853ecaSopenharmony_ci        auto alloc = AVAllocatorFactory::CreateSharedAllocator(MemoryFlag::MEMORY_READ_ONLY);
291da853ecaSopenharmony_ci        avMuxerDemoBuffer = AVBuffer::CreateAVBuffer(alloc, dataSize);
292da853ecaSopenharmony_ci        if (avMuxerDemoBuffer == nullptr) {
293da853ecaSopenharmony_ci            printf("error malloc memory!\n");
294da853ecaSopenharmony_ci            return -1;
295da853ecaSopenharmony_ci        }
296da853ecaSopenharmony_ci    }
297da853ecaSopenharmony_ci    return 0;
298da853ecaSopenharmony_ci}
299da853ecaSopenharmony_ci
300da853ecaSopenharmony_ciint WriteTrackSampleByFdGetIndex(const int *dataTrackId, const int *audioTrackIndex,
301da853ecaSopenharmony_ci                                 int *videoTrackIndex)
302da853ecaSopenharmony_ci{
303da853ecaSopenharmony_ci    int trackId = 0;
304da853ecaSopenharmony_ci    if (*dataTrackId == DATA_AUDIO_ID) {
305da853ecaSopenharmony_ci        trackId = *audioTrackIndex;
306da853ecaSopenharmony_ci    } else if (*dataTrackId == DATA_VIDEO_ID) {
307da853ecaSopenharmony_ci        trackId = *videoTrackIndex;
308da853ecaSopenharmony_ci    } else {
309da853ecaSopenharmony_ci        cout << "error dataTrackId : " << *dataTrackId << endl;
310da853ecaSopenharmony_ci    }
311da853ecaSopenharmony_ci
312da853ecaSopenharmony_ci    return trackId;
313da853ecaSopenharmony_ci}
314da853ecaSopenharmony_ci
315da853ecaSopenharmony_civoid WriteTrackSampleByFd(AVMuxerDemo *muxerDemo, int audioTrackIndex, int videoTrackIndex, int32_t inputFile)
316da853ecaSopenharmony_ci{
317da853ecaSopenharmony_ci    int dataTrackId = 0;
318da853ecaSopenharmony_ci    int dataSize = 0;
319da853ecaSopenharmony_ci    int trackId = 0;
320da853ecaSopenharmony_ci    int64_t pts = 0;
321da853ecaSopenharmony_ci    uint32_t trackIndex;
322da853ecaSopenharmony_ci    std::shared_ptr<AVBuffer> avMuxerDemoBuffer = nullptr;
323da853ecaSopenharmony_ci    string resultStr = "";
324da853ecaSopenharmony_ci    do {
325da853ecaSopenharmony_ci        int ret = WriteTrackSampleByFdRead(&inputFile, &pts, &dataSize, &dataTrackId);
326da853ecaSopenharmony_ci        if (ret != 0) {
327da853ecaSopenharmony_ci            return;
328da853ecaSopenharmony_ci        }
329da853ecaSopenharmony_ci
330da853ecaSopenharmony_ci        ret = WriteTrackSampleByFdMem(dataSize, avMuxerDemoBuffer);
331da853ecaSopenharmony_ci        if (ret != 0) {
332da853ecaSopenharmony_ci            break;
333da853ecaSopenharmony_ci        }
334da853ecaSopenharmony_ci
335da853ecaSopenharmony_ci        resultStr =
336da853ecaSopenharmony_ci            "inputFile is: " + to_string(inputFile) + ", avMuxerDemoBufferSize is " + to_string(dataSize);
337da853ecaSopenharmony_ci        cout << resultStr << endl;
338da853ecaSopenharmony_ci
339da853ecaSopenharmony_ci        ret = read(inputFile, static_cast<void*>(avMuxerDemoBuffer->memory_->GetAddr()), dataSize);
340da853ecaSopenharmony_ci        if (ret <= 0) {
341da853ecaSopenharmony_ci            cout << "read data error, ret is: " << ret << endl;
342da853ecaSopenharmony_ci            continue;
343da853ecaSopenharmony_ci        }
344da853ecaSopenharmony_ci        avMuxerDemoBuffer->pts_ = pts;
345da853ecaSopenharmony_ci        avMuxerDemoBuffer->memory_->SetSize(dataSize);
346da853ecaSopenharmony_ci        trackId = WriteTrackSampleByFdGetIndex(&dataTrackId, &audioTrackIndex, &videoTrackIndex);
347da853ecaSopenharmony_ci        if (trackId >= 0) {
348da853ecaSopenharmony_ci            trackIndex = trackId;
349da853ecaSopenharmony_ci            int32_t result = muxerDemo->InnerWriteSample(trackIndex, avMuxerDemoBuffer);
350da853ecaSopenharmony_ci            if (result != AVCS_ERR_OK) {
351da853ecaSopenharmony_ci                cout << "InnerWriteSample error! ret is: " << result << endl;
352da853ecaSopenharmony_ci                break;
353da853ecaSopenharmony_ci            }
354da853ecaSopenharmony_ci        }
355da853ecaSopenharmony_ci    } while (ret >0)
356da853ecaSopenharmony_ci}
357da853ecaSopenharmony_ci
358da853ecaSopenharmony_civoid RunMuxer(string testcaseName, int threadId, Plugins::OutputFormat format)
359da853ecaSopenharmony_ci{
360da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
361da853ecaSopenharmony_ci    time_t startTime = time(nullptr);
362da853ecaSopenharmony_ci    ASSERT_NE(startTime, -1);
363da853ecaSopenharmony_ci    time_t curTime = startTime;
364da853ecaSopenharmony_ci
365da853ecaSopenharmony_ci    while (difftime(curTime, startTime) < RUN_TIME) {
366da853ecaSopenharmony_ci        cout << "thread id is: " << threadId << ", run time : " << difftime(curTime, startTime) << " seconds" << endl;
367da853ecaSopenharmony_ci        string fileName = testcaseName + "_" + to_string(threadId);
368da853ecaSopenharmony_ci
369da853ecaSopenharmony_ci        cout << "thread id is: " << threadId << ", cur file name is: " << fileName << endl;
370da853ecaSopenharmony_ci        int32_t fd = muxerDemo->InnerGetFdByName(format, fileName);
371da853ecaSopenharmony_ci
372da853ecaSopenharmony_ci        int32_t inputFile;
373da853ecaSopenharmony_ci        int32_t audioTrackId;
374da853ecaSopenharmony_ci        int32_t videoTrackId;
375da853ecaSopenharmony_ci
376da853ecaSopenharmony_ci        cout << "thread id is: " << threadId << ", fd is: " << fd << endl;
377da853ecaSopenharmony_ci        muxerDemo->InnerCreate(fd, format);
378da853ecaSopenharmony_ci
379da853ecaSopenharmony_ci        int32_t ret;
380da853ecaSopenharmony_ci
381da853ecaSopenharmony_ci        if (format == Plugins::OutputFormat::MPEG_4) {
382da853ecaSopenharmony_ci            cout << "thread id is: " << threadId << ", format is: " << static_cast<int32_t>(format) << endl;
383da853ecaSopenharmony_ci            inputFile = open("avDataMpegMpeg4.bin", O_RDONLY);
384da853ecaSopenharmony_ci            AddAudioTrackByFd(muxerDemo, inputFile, audioTrackId);
385da853ecaSopenharmony_ci            AddVideoTrackByFd(muxerDemo, inputFile, videoTrackId);
386da853ecaSopenharmony_ci        } else {
387da853ecaSopenharmony_ci            cout << "thread id is: " << threadId << ", format is: " << static_cast<int32_t>(format) << endl;
388da853ecaSopenharmony_ci            inputFile = open("avData_mpeg4_aac_2.bin", O_RDONLY);
389da853ecaSopenharmony_ci            AddAudioTrackAACByFd(muxerDemo, inputFile, audioTrackId);
390da853ecaSopenharmony_ci            videoTrackId = -1;
391da853ecaSopenharmony_ci            int extraSize = 0;
392da853ecaSopenharmony_ci            unsigned char buffer[100] = {0};
393da853ecaSopenharmony_ci            read(inputFile, static_cast<void*>(&extraSize), sizeof(extraSize));
394da853ecaSopenharmony_ci            if (extraSize <= BUFFER_SIZE && extraSize > 0) {
395da853ecaSopenharmony_ci                read(inputFile, buffer, extraSize);
396da853ecaSopenharmony_ci            }
397da853ecaSopenharmony_ci        }
398da853ecaSopenharmony_ci
399da853ecaSopenharmony_ci        cout << "thread id is: " << threadId << ", audio track id is: " << audioTrackId
400da853ecaSopenharmony_ci             << ", video track id is: " << videoTrackId << endl;
401da853ecaSopenharmony_ci
402da853ecaSopenharmony_ci        ret = muxerDemo->InnerStart();
403da853ecaSopenharmony_ci        cout << "thread id is: " << threadId << ", Start ret is:" << ret << endl;
404da853ecaSopenharmony_ci
405da853ecaSopenharmony_ci        WriteTrackSampleByFd(muxerDemo, audioTrackId, videoTrackId, inputFile);
406da853ecaSopenharmony_ci
407da853ecaSopenharmony_ci        ret = muxerDemo->InnerStop();
408da853ecaSopenharmony_ci        cout << "thread id is: " << threadId << ", Stop ret is:" << ret << endl;
409da853ecaSopenharmony_ci
410da853ecaSopenharmony_ci        ret = muxerDemo->InnerDestroy();
411da853ecaSopenharmony_ci        cout << "thread id is: " << threadId << ", Destroy ret is:" << ret << endl;
412da853ecaSopenharmony_ci
413da853ecaSopenharmony_ci        close(inputFile);
414da853ecaSopenharmony_ci        close(fd);
415da853ecaSopenharmony_ci        curTime = time(nullptr);
416da853ecaSopenharmony_ci        ASSERT_NE(curTime, -1);
417da853ecaSopenharmony_ci    }
418da853ecaSopenharmony_ci    g_testResult[threadId] = AVCS_ERR_OK;
419da853ecaSopenharmony_ci    delete muxerDemo;
420da853ecaSopenharmony_ci}
421da853ecaSopenharmony_ci} // namespace
422da853ecaSopenharmony_ci
423da853ecaSopenharmony_ci/**
424da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_001
425da853ecaSopenharmony_ci * @tc.name      : Create(1000 times)
426da853ecaSopenharmony_ci * @tc.desc      : Stability test
427da853ecaSopenharmony_ci */
428da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerStablityTest, SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_001, TestSize.Level2)
429da853ecaSopenharmony_ci{
430da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
431da853ecaSopenharmony_ci
432da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::M4A;
433da853ecaSopenharmony_ci    int32_t fd = muxerDemo->InnerGetFdByName(format, "SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_001");
434da853ecaSopenharmony_ci
435da853ecaSopenharmony_ci    g_inputFile = open("avData_mpeg4_aac_2.bin", O_RDONLY);
436da853ecaSopenharmony_ci    struct timeval start, end;
437da853ecaSopenharmony_ci    double totalTime = 0;
438da853ecaSopenharmony_ci    for (int i = 0; i < RUN_TIMES; i++) {
439da853ecaSopenharmony_ci        gettimeofday(&start, nullptr);
440da853ecaSopenharmony_ci        muxerDemo->InnerCreate(fd, format);
441da853ecaSopenharmony_ci        gettimeofday(&end, nullptr);
442da853ecaSopenharmony_ci        totalTime += (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) / 1000000.0;
443da853ecaSopenharmony_ci        cout << "run time is: " << i << endl;
444da853ecaSopenharmony_ci        int32_t ret = muxerDemo->InnerDestroy();
445da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
446da853ecaSopenharmony_ci    }
447da853ecaSopenharmony_ci    cout << "1000 times finish, run time is " << totalTime << endl;
448da853ecaSopenharmony_ci    close(fd);
449da853ecaSopenharmony_ci    delete muxerDemo;
450da853ecaSopenharmony_ci}
451da853ecaSopenharmony_ci
452da853ecaSopenharmony_ci/**
453da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_002
454da853ecaSopenharmony_ci * @tc.name      : SetRotation(1000 times)
455da853ecaSopenharmony_ci * @tc.desc      : Stability test
456da853ecaSopenharmony_ci */
457da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerStablityTest, SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_002, TestSize.Level2)
458da853ecaSopenharmony_ci{
459da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
460da853ecaSopenharmony_ci
461da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::M4A;
462da853ecaSopenharmony_ci    int32_t fd = muxerDemo->InnerGetFdByName(format, "SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_002");
463da853ecaSopenharmony_ci
464da853ecaSopenharmony_ci    muxerDemo->InnerCreate(fd, format);
465da853ecaSopenharmony_ci    double totalTime = 0;
466da853ecaSopenharmony_ci    struct timeval start, end;
467da853ecaSopenharmony_ci
468da853ecaSopenharmony_ci    for (int i = 0; i < RUN_TIMES; i++) {
469da853ecaSopenharmony_ci        gettimeofday(&start, nullptr);
470da853ecaSopenharmony_ci        int32_t ret = SetRotation(muxerDemo);
471da853ecaSopenharmony_ci        gettimeofday(&end, nullptr);
472da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
473da853ecaSopenharmony_ci        totalTime += (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) / 1000000.0;
474da853ecaSopenharmony_ci        cout << "run time is: " << i << ", ret is:" << ret << endl;
475da853ecaSopenharmony_ci    }
476da853ecaSopenharmony_ci    cout << "1000 times finish, run time is " << totalTime << endl;
477da853ecaSopenharmony_ci    muxerDemo->InnerDestroy();
478da853ecaSopenharmony_ci
479da853ecaSopenharmony_ci    close(fd);
480da853ecaSopenharmony_ci    delete muxerDemo;
481da853ecaSopenharmony_ci}
482da853ecaSopenharmony_ci
483da853ecaSopenharmony_ci/**
484da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_003
485da853ecaSopenharmony_ci * @tc.name      : AddTrack(1000 times)
486da853ecaSopenharmony_ci * @tc.desc      : Stability test
487da853ecaSopenharmony_ci */
488da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerStablityTest, SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_003, TestSize.Level2)
489da853ecaSopenharmony_ci{
490da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
491da853ecaSopenharmony_ci
492da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::M4A;
493da853ecaSopenharmony_ci    int32_t fd = muxerDemo->InnerGetFdByName(format, "SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_003");
494da853ecaSopenharmony_ci
495da853ecaSopenharmony_ci    muxerDemo->InnerCreate(fd, format);
496da853ecaSopenharmony_ci
497da853ecaSopenharmony_ci    double totalTime = 0;
498da853ecaSopenharmony_ci    struct timeval start, end;
499da853ecaSopenharmony_ci    for (int i = 0; i < RUN_TIMES; i++) {
500da853ecaSopenharmony_ci        int32_t trackId = -1;
501da853ecaSopenharmony_ci        gettimeofday(&start, nullptr);
502da853ecaSopenharmony_ci        AddTrack(muxerDemo, trackId);
503da853ecaSopenharmony_ci        gettimeofday(&end, nullptr);
504da853ecaSopenharmony_ci        ASSERT_EQ(-1, trackId);
505da853ecaSopenharmony_ci        cout << "run time is: " << i << ", track id is:" << trackId << endl;
506da853ecaSopenharmony_ci    }
507da853ecaSopenharmony_ci    cout << "1000 times finish, run time is " << totalTime << endl;
508da853ecaSopenharmony_ci    muxerDemo->InnerDestroy();
509da853ecaSopenharmony_ci
510da853ecaSopenharmony_ci    close(fd);
511da853ecaSopenharmony_ci    delete muxerDemo;
512da853ecaSopenharmony_ci}
513da853ecaSopenharmony_ci
514da853ecaSopenharmony_ci/**
515da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_004
516da853ecaSopenharmony_ci * @tc.name      : Start(1000 times)
517da853ecaSopenharmony_ci * @tc.desc      : Stability test
518da853ecaSopenharmony_ci */
519da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerStablityTest, SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_004, TestSize.Level2)
520da853ecaSopenharmony_ci{
521da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
522da853ecaSopenharmony_ci
523da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::M4A;
524da853ecaSopenharmony_ci    int32_t fd = muxerDemo->InnerGetFdByName(format, "SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_004");
525da853ecaSopenharmony_ci
526da853ecaSopenharmony_ci    muxerDemo->InnerCreate(fd, format);
527da853ecaSopenharmony_ci    int32_t audioTrackId;
528da853ecaSopenharmony_ci    int32_t trackId = AddTrack(muxerDemo, audioTrackId);
529da853ecaSopenharmony_ci    ASSERT_EQ(0, trackId);
530da853ecaSopenharmony_ci
531da853ecaSopenharmony_ci    double totalTime = 0;
532da853ecaSopenharmony_ci    struct timeval start, end;
533da853ecaSopenharmony_ci    for (int i = 0; i < RUN_TIMES; i++) {
534da853ecaSopenharmony_ci        gettimeofday(&start, nullptr);
535da853ecaSopenharmony_ci        int32_t ret = muxerDemo->InnerStart();
536da853ecaSopenharmony_ci        gettimeofday(&end, nullptr);
537da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
538da853ecaSopenharmony_ci        cout << "run time is: " << i << ", ret is:" << ret << endl;
539da853ecaSopenharmony_ci    }
540da853ecaSopenharmony_ci    cout << "1000 times finish, run time is " << totalTime << endl;
541da853ecaSopenharmony_ci    muxerDemo->InnerDestroy();
542da853ecaSopenharmony_ci
543da853ecaSopenharmony_ci    close(fd);
544da853ecaSopenharmony_ci    delete muxerDemo;
545da853ecaSopenharmony_ci}
546da853ecaSopenharmony_ci
547da853ecaSopenharmony_ci/**
548da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_005
549da853ecaSopenharmony_ci * @tc.name      : WriteSample(1000 times)
550da853ecaSopenharmony_ci * @tc.desc      : Stability test
551da853ecaSopenharmony_ci */
552da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerStablityTest, SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_005, TestSize.Level2)
553da853ecaSopenharmony_ci{
554da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
555da853ecaSopenharmony_ci
556da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::M4A;
557da853ecaSopenharmony_ci    int32_t fd = muxerDemo->InnerGetFdByName(format, "SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_005");
558da853ecaSopenharmony_ci
559da853ecaSopenharmony_ci    muxerDemo->InnerCreate(fd, format);
560da853ecaSopenharmony_ci
561da853ecaSopenharmony_ci    int32_t audioTrackId;
562da853ecaSopenharmony_ci    int32_t trackId = AddTrack(muxerDemo, audioTrackId);
563da853ecaSopenharmony_ci    ASSERT_EQ(0, trackId);
564da853ecaSopenharmony_ci
565da853ecaSopenharmony_ci    int32_t ret = muxerDemo->InnerStart();
566da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
567da853ecaSopenharmony_ci
568da853ecaSopenharmony_ci    double totalTime = 0;
569da853ecaSopenharmony_ci    struct timeval start, end;
570da853ecaSopenharmony_ci    for (int i = 0; i < RUN_TIMES; i++) {
571da853ecaSopenharmony_ci        gettimeofday(&start, nullptr);
572da853ecaSopenharmony_ci        ret = WriteSample(muxerDemo);
573da853ecaSopenharmony_ci        gettimeofday(&end, nullptr);
574da853ecaSopenharmony_ci        cout << "run time is: " << i << ", ret is:" << ret << endl;
575da853ecaSopenharmony_ci    }
576da853ecaSopenharmony_ci    cout << "1000 times finish, run time is " << totalTime << endl;
577da853ecaSopenharmony_ci    muxerDemo->InnerDestroy();
578da853ecaSopenharmony_ci
579da853ecaSopenharmony_ci    close(fd);
580da853ecaSopenharmony_ci    delete muxerDemo;
581da853ecaSopenharmony_ci}
582da853ecaSopenharmony_ci
583da853ecaSopenharmony_ci/**
584da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_006
585da853ecaSopenharmony_ci * @tc.name      : Stop(1000 times)
586da853ecaSopenharmony_ci * @tc.desc      : Stability test
587da853ecaSopenharmony_ci */
588da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerStablityTest, SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_006, TestSize.Level2)
589da853ecaSopenharmony_ci{
590da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
591da853ecaSopenharmony_ci
592da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::M4A;
593da853ecaSopenharmony_ci    int32_t fd = muxerDemo->InnerGetFdByName(format, "SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_006");
594da853ecaSopenharmony_ci
595da853ecaSopenharmony_ci    muxerDemo->InnerCreate(fd, format);
596da853ecaSopenharmony_ci
597da853ecaSopenharmony_ci    int32_t audioTrackId;
598da853ecaSopenharmony_ci    int32_t trackId = AddTrack(muxerDemo, audioTrackId);
599da853ecaSopenharmony_ci    ASSERT_EQ(0, trackId);
600da853ecaSopenharmony_ci
601da853ecaSopenharmony_ci    int32_t ret = muxerDemo->InnerStart();
602da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
603da853ecaSopenharmony_ci
604da853ecaSopenharmony_ci    ret = WriteSample(muxerDemo);
605da853ecaSopenharmony_ci    ASSERT_EQ(AVCS_ERR_OK, ret);
606da853ecaSopenharmony_ci
607da853ecaSopenharmony_ci    double totalTime = 0;
608da853ecaSopenharmony_ci    struct timeval start, end;
609da853ecaSopenharmony_ci    for (int i = 0; i < RUN_TIMES; i++) {
610da853ecaSopenharmony_ci        gettimeofday(&start, nullptr);
611da853ecaSopenharmony_ci        ret = muxerDemo->InnerStop();
612da853ecaSopenharmony_ci        gettimeofday(&end, nullptr);
613da853ecaSopenharmony_ci        cout << "run time is: " << i << ", ret is:" << ret << endl;
614da853ecaSopenharmony_ci    }
615da853ecaSopenharmony_ci    cout << "1000 times finish, run time is " << totalTime << endl;
616da853ecaSopenharmony_ci    muxerDemo->InnerDestroy();
617da853ecaSopenharmony_ci
618da853ecaSopenharmony_ci    close(fd);
619da853ecaSopenharmony_ci    delete muxerDemo;
620da853ecaSopenharmony_ci}
621da853ecaSopenharmony_ci
622da853ecaSopenharmony_ci/**
623da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_007
624da853ecaSopenharmony_ci * @tc.name      : Destroy(1000 times)
625da853ecaSopenharmony_ci * @tc.desc      : Stability test
626da853ecaSopenharmony_ci */
627da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerStablityTest, SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_007, TestSize.Level2)
628da853ecaSopenharmony_ci{
629da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
630da853ecaSopenharmony_ci
631da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::M4A;
632da853ecaSopenharmony_ci    int32_t fd = muxerDemo->InnerGetFdByName(format, "SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_007");
633da853ecaSopenharmony_ci
634da853ecaSopenharmony_ci    double totalTime = 0;
635da853ecaSopenharmony_ci    struct timeval start, end;
636da853ecaSopenharmony_ci    for (int i = 0; i < RUN_TIMES; i++) {
637da853ecaSopenharmony_ci        muxerDemo->InnerCreate(fd, format);
638da853ecaSopenharmony_ci
639da853ecaSopenharmony_ci        gettimeofday(&start, nullptr);
640da853ecaSopenharmony_ci        int32_t ret = muxerDemo->InnerDestroy();
641da853ecaSopenharmony_ci        gettimeofday(&end, nullptr);
642da853ecaSopenharmony_ci        ASSERT_EQ(AVCS_ERR_OK, ret);
643da853ecaSopenharmony_ci        cout << "run time is: " << i << ", ret is:" << ret << endl;
644da853ecaSopenharmony_ci    }
645da853ecaSopenharmony_ci    cout << "1000 times finish, run time is " << totalTime << endl;
646da853ecaSopenharmony_ci    close(fd);
647da853ecaSopenharmony_ci    delete muxerDemo;
648da853ecaSopenharmony_ci}
649da853ecaSopenharmony_ci
650da853ecaSopenharmony_ci/**
651da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_008
652da853ecaSopenharmony_ci * @tc.name      : m4a(long time)
653da853ecaSopenharmony_ci * @tc.desc      : Function test
654da853ecaSopenharmony_ci */
655da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerStablityTest, SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_008, TestSize.Level2)
656da853ecaSopenharmony_ci{
657da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
658da853ecaSopenharmony_ci    time_t startTime = time(nullptr);
659da853ecaSopenharmony_ci    ASSERT_NE(startTime, -1);
660da853ecaSopenharmony_ci    time_t curTime = startTime;
661da853ecaSopenharmony_ci
662da853ecaSopenharmony_ci    while (difftime(curTime, startTime) < RUN_TIME) {
663da853ecaSopenharmony_ci        cout << "run time: " << difftime(curTime, startTime) << " seconds" << endl;
664da853ecaSopenharmony_ci        Plugins::OutputFormat format = Plugins::OutputFormat::M4A;
665da853ecaSopenharmony_ci        int32_t fd = muxerDemo->InnerGetFdByName(format, "SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_008");
666da853ecaSopenharmony_ci
667da853ecaSopenharmony_ci        g_inputFile = open("avData_mpeg4_aac_2.bin", O_RDONLY);
668da853ecaSopenharmony_ci
669da853ecaSopenharmony_ci        muxerDemo->InnerCreate(fd, format);
670da853ecaSopenharmony_ci
671da853ecaSopenharmony_ci        int32_t audioTrackId;
672da853ecaSopenharmony_ci        AddAudioTrackAAC(muxerDemo, audioTrackId);
673da853ecaSopenharmony_ci        int32_t videoTrackId = -1;
674da853ecaSopenharmony_ci        RemoveHeader();
675da853ecaSopenharmony_ci
676da853ecaSopenharmony_ci        cout << "audio track id is: " << audioTrackId << ", video track id is: " << videoTrackId << endl;
677da853ecaSopenharmony_ci
678da853ecaSopenharmony_ci        int32_t ret;
679da853ecaSopenharmony_ci
680da853ecaSopenharmony_ci        ret = muxerDemo->InnerStart();
681da853ecaSopenharmony_ci        cout << "Start ret is:" << ret << endl;
682da853ecaSopenharmony_ci
683da853ecaSopenharmony_ci        WriteTrackSample(muxerDemo, audioTrackId, videoTrackId);
684da853ecaSopenharmony_ci
685da853ecaSopenharmony_ci        ret = muxerDemo->InnerStop();
686da853ecaSopenharmony_ci        cout << "Stop ret is:" << ret << endl;
687da853ecaSopenharmony_ci
688da853ecaSopenharmony_ci        ret = muxerDemo->InnerDestroy();
689da853ecaSopenharmony_ci        cout << "Destroy ret is:" << ret << endl;
690da853ecaSopenharmony_ci
691da853ecaSopenharmony_ci        close(g_inputFile);
692da853ecaSopenharmony_ci        close(fd);
693da853ecaSopenharmony_ci        curTime = time(nullptr);
694da853ecaSopenharmony_ci        ASSERT_NE(curTime, -1);
695da853ecaSopenharmony_ci    }
696da853ecaSopenharmony_ci    delete muxerDemo;
697da853ecaSopenharmony_ci}
698da853ecaSopenharmony_ci
699da853ecaSopenharmony_ci/**
700da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_009
701da853ecaSopenharmony_ci * @tc.name      : mp4(long time)
702da853ecaSopenharmony_ci * @tc.desc      : Function test
703da853ecaSopenharmony_ci */
704da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerStablityTest, SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_009, TestSize.Level2)
705da853ecaSopenharmony_ci{
706da853ecaSopenharmony_ci    AVMuxerDemo *muxerDemo = new AVMuxerDemo();
707da853ecaSopenharmony_ci    time_t startTime = time(nullptr);
708da853ecaSopenharmony_ci    ASSERT_NE(startTime, -1);
709da853ecaSopenharmony_ci    time_t curTime = startTime;
710da853ecaSopenharmony_ci
711da853ecaSopenharmony_ci    while (difftime(curTime, startTime) < RUN_TIME) {
712da853ecaSopenharmony_ci        cout << "run time: " << difftime(curTime, startTime) << " seconds" << endl;
713da853ecaSopenharmony_ci
714da853ecaSopenharmony_ci        Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
715da853ecaSopenharmony_ci        int32_t fd = muxerDemo->InnerGetFdByName(format, "SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_009");
716da853ecaSopenharmony_ci
717da853ecaSopenharmony_ci        g_inputFile = open("avDataMpegMpeg4.bin", O_RDONLY);
718da853ecaSopenharmony_ci
719da853ecaSopenharmony_ci        muxerDemo->InnerCreate(fd, format);
720da853ecaSopenharmony_ci
721da853ecaSopenharmony_ci        int32_t audioTrackId;
722da853ecaSopenharmony_ci        AddAudioTrack(muxerDemo, audioTrackId);
723da853ecaSopenharmony_ci        int32_t videoTrackId;
724da853ecaSopenharmony_ci        AddVideoTrack(muxerDemo, videoTrackId);
725da853ecaSopenharmony_ci
726da853ecaSopenharmony_ci        cout << "audio track id is: " << audioTrackId << ", video track id is: " << videoTrackId << endl;
727da853ecaSopenharmony_ci
728da853ecaSopenharmony_ci        int32_t ret;
729da853ecaSopenharmony_ci
730da853ecaSopenharmony_ci        ret = muxerDemo->InnerStart();
731da853ecaSopenharmony_ci        cout << "Start ret is:" << ret << endl;
732da853ecaSopenharmony_ci
733da853ecaSopenharmony_ci        WriteTrackSample(muxerDemo, audioTrackId, videoTrackId);
734da853ecaSopenharmony_ci
735da853ecaSopenharmony_ci        ret = muxerDemo->InnerStop();
736da853ecaSopenharmony_ci        cout << "Stop ret is:" << ret << endl;
737da853ecaSopenharmony_ci
738da853ecaSopenharmony_ci        ret = muxerDemo->InnerDestroy();
739da853ecaSopenharmony_ci        cout << "Destroy ret is:" << ret << endl;
740da853ecaSopenharmony_ci
741da853ecaSopenharmony_ci        close(g_inputFile);
742da853ecaSopenharmony_ci        close(fd);
743da853ecaSopenharmony_ci        curTime = time(nullptr);
744da853ecaSopenharmony_ci        ASSERT_NE(curTime, -1);
745da853ecaSopenharmony_ci    }
746da853ecaSopenharmony_ci    delete muxerDemo;
747da853ecaSopenharmony_ci}
748da853ecaSopenharmony_ci
749da853ecaSopenharmony_ci/**
750da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_010
751da853ecaSopenharmony_ci * @tc.name      : m4a(thread long time)
752da853ecaSopenharmony_ci * @tc.desc      : Function test
753da853ecaSopenharmony_ci */
754da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerStablityTest, SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_010, TestSize.Level2)
755da853ecaSopenharmony_ci{
756da853ecaSopenharmony_ci    vector<thread> threadVec;
757da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::M4A;
758da853ecaSopenharmony_ci    for (int i = 0; i < 10; i++) {
759da853ecaSopenharmony_ci        threadVec.push_back(thread(RunMuxer, "SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_010", i, format));
760da853ecaSopenharmony_ci    }
761da853ecaSopenharmony_ci    for (uint32_t i = 0; i < threadVec.size(); i++) {
762da853ecaSopenharmony_ci        threadVec[i].join();
763da853ecaSopenharmony_ci    }
764da853ecaSopenharmony_ci    for (int32_t i = 0; i < 10; i++)
765da853ecaSopenharmony_ci    {
766da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, g_testResult[i]);
767da853ecaSopenharmony_ci    }
768da853ecaSopenharmony_ci}
769da853ecaSopenharmony_ci
770da853ecaSopenharmony_ci/**
771da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_011
772da853ecaSopenharmony_ci * @tc.name      : mp4(thread long time)
773da853ecaSopenharmony_ci * @tc.desc      : Function test
774da853ecaSopenharmony_ci */
775da853ecaSopenharmony_ciHWTEST_F(InnerAVMuxerStablityTest, SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_011, TestSize.Level2)
776da853ecaSopenharmony_ci{
777da853ecaSopenharmony_ci    vector<thread> threadVec;
778da853ecaSopenharmony_ci    Plugins::OutputFormat format = Plugins::OutputFormat::MPEG_4;
779da853ecaSopenharmony_ci    for (int i = 0; i < 10; i++) {
780da853ecaSopenharmony_ci        threadVec.push_back(thread(RunMuxer, "SUB_MULTIMEDIA_MEDIA_MUXER_STABILITY_011", i, format));
781da853ecaSopenharmony_ci    }
782da853ecaSopenharmony_ci    for (uint32_t i = 0; i < threadVec.size(); i++) {
783da853ecaSopenharmony_ci        threadVec[i].join();
784da853ecaSopenharmony_ci    }
785da853ecaSopenharmony_ci    for (int32_t i = 0; i < 10; i++)
786da853ecaSopenharmony_ci    {
787da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, g_testResult[i]);
788da853ecaSopenharmony_ci    }
789da853ecaSopenharmony_ci}