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