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