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 <ctime>
19da853ecaSopenharmony_ci#include "gtest/gtest.h"
20da853ecaSopenharmony_ci#include "AVMuxerDemo.h"
21da853ecaSopenharmony_ci
22da853ecaSopenharmony_ciusing namespace std;
23da853ecaSopenharmony_ciusing namespace testing::ext;
24da853ecaSopenharmony_ciusing namespace OHOS;
25da853ecaSopenharmony_ciusing namespace OHOS::MediaAVCodec;
26da853ecaSopenharmony_ci
27da853ecaSopenharmony_ci
28da853ecaSopenharmony_cinamespace {
29da853ecaSopenharmony_ci    class NativeAVMuxerFuzzTest : public testing::Test {
30da853ecaSopenharmony_ci    public:
31da853ecaSopenharmony_ci        static void SetUpTestCase();
32da853ecaSopenharmony_ci        static void TearDownTestCase();
33da853ecaSopenharmony_ci        void SetUp() override;
34da853ecaSopenharmony_ci        void TearDown() override;
35da853ecaSopenharmony_ci    };
36da853ecaSopenharmony_ci
37da853ecaSopenharmony_ci    void NativeAVMuxerFuzzTest::SetUpTestCase() {}
38da853ecaSopenharmony_ci    void NativeAVMuxerFuzzTest::TearDownTestCase() {}
39da853ecaSopenharmony_ci    void NativeAVMuxerFuzzTest::SetUp() {}
40da853ecaSopenharmony_ci    void NativeAVMuxerFuzzTest::TearDown() {}
41da853ecaSopenharmony_ci
42da853ecaSopenharmony_ci    constexpr int FUZZ_TEST_NUM = 1000000;
43da853ecaSopenharmony_ci    constexpr int AUDIO_PTS_ADD = 21;
44da853ecaSopenharmony_ci
45da853ecaSopenharmony_ci    int32_t getIntRand()
46da853ecaSopenharmony_ci    {
47da853ecaSopenharmony_ci        int32_t data = -10000 + rand() % 20001;
48da853ecaSopenharmony_ci        return data;
49da853ecaSopenharmony_ci    }
50da853ecaSopenharmony_ci}
51da853ecaSopenharmony_ci
52da853ecaSopenharmony_ci/**
53da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_001
54da853ecaSopenharmony_ci * @tc.name      : OH_AVMuxer_Create
55da853ecaSopenharmony_ci * @tc.desc      : Fuzz test
56da853ecaSopenharmony_ci */
57da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFuzzTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_001, TestSize.Level2)
58da853ecaSopenharmony_ci{
59da853ecaSopenharmony_ci    srand(time(nullptr) * 10);
60da853ecaSopenharmony_ci    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
61da853ecaSopenharmony_ci
62da853ecaSopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
63da853ecaSopenharmony_ci    int32_t fd = -1;
64da853ecaSopenharmony_ci
65da853ecaSopenharmony_ci    OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format);
66da853ecaSopenharmony_ci
67da853ecaSopenharmony_ci    for (int i = 0; i < FUZZ_TEST_NUM; i++) {
68da853ecaSopenharmony_ci        cout << "current run time is: " << i << endl;
69da853ecaSopenharmony_ci        fd = rand();
70da853ecaSopenharmony_ci        format = OH_AVOutputFormat(rand() % 3);
71da853ecaSopenharmony_ci        handle = muxerDemo->NativeCreate(fd, format);
72da853ecaSopenharmony_ci        if (handle != nullptr) {
73da853ecaSopenharmony_ci            muxerDemo->NativeDestroy(handle);
74da853ecaSopenharmony_ci        }
75da853ecaSopenharmony_ci    }
76da853ecaSopenharmony_ci
77da853ecaSopenharmony_ci    delete muxerDemo;
78da853ecaSopenharmony_ci}
79da853ecaSopenharmony_ci
80da853ecaSopenharmony_ci
81da853ecaSopenharmony_ci/**
82da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_002
83da853ecaSopenharmony_ci * @tc.name      : OH_AVMuxer_SetRotation
84da853ecaSopenharmony_ci * @tc.desc      : Fuzz test
85da853ecaSopenharmony_ci */
86da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFuzzTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_002, TestSize.Level2)
87da853ecaSopenharmony_ci{
88da853ecaSopenharmony_ci    srand(time(nullptr) * 10);
89da853ecaSopenharmony_ci    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
90da853ecaSopenharmony_ci
91da853ecaSopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
92da853ecaSopenharmony_ci    int32_t fd = -1;
93da853ecaSopenharmony_ci    fd = muxerDemo->GetFdByMode(format);
94da853ecaSopenharmony_ci    OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format);
95da853ecaSopenharmony_ci    ASSERT_NE(nullptr, handle);
96da853ecaSopenharmony_ci
97da853ecaSopenharmony_ci    int32_t rotation;
98da853ecaSopenharmony_ci    OH_AVErrCode ret;
99da853ecaSopenharmony_ci
100da853ecaSopenharmony_ci    for (int i = 0; i < FUZZ_TEST_NUM; i++) {
101da853ecaSopenharmony_ci        cout << "current run time is: " << i << endl;
102da853ecaSopenharmony_ci        rotation = getIntRand();
103da853ecaSopenharmony_ci        cout << "rotation is: " << rotation << endl;
104da853ecaSopenharmony_ci        ret = muxerDemo->NativeSetRotation(handle, rotation);
105da853ecaSopenharmony_ci        cout << "ret code is: " << ret << endl;
106da853ecaSopenharmony_ci    }
107da853ecaSopenharmony_ci
108da853ecaSopenharmony_ci    delete muxerDemo;
109da853ecaSopenharmony_ci}
110da853ecaSopenharmony_ci
111da853ecaSopenharmony_ci
112da853ecaSopenharmony_ci/**
113da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_003
114da853ecaSopenharmony_ci * @tc.name      : OH_AVMuxer_AddTrack
115da853ecaSopenharmony_ci * @tc.desc      : Fuzz test
116da853ecaSopenharmony_ci */
117da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFuzzTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_003, TestSize.Level2)
118da853ecaSopenharmony_ci{
119da853ecaSopenharmony_ci    srand(time(nullptr) * 10);
120da853ecaSopenharmony_ci    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
121da853ecaSopenharmony_ci
122da853ecaSopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
123da853ecaSopenharmony_ci    int32_t fd = -1;
124da853ecaSopenharmony_ci    fd = muxerDemo->GetFdByMode(format);
125da853ecaSopenharmony_ci    OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format);
126da853ecaSopenharmony_ci    ASSERT_NE(nullptr, handle);
127da853ecaSopenharmony_ci
128da853ecaSopenharmony_ci    string mimeType[] = {"audio/mp4a-latm", "audio/mpeg", "video/avc", "video/mp4v-es"};
129da853ecaSopenharmony_ci    OH_AVFormat* trackFormat = OH_AVFormat_Create();
130da853ecaSopenharmony_ci    int32_t trackId;
131da853ecaSopenharmony_ci    OH_AVErrCode ret;
132da853ecaSopenharmony_ci
133da853ecaSopenharmony_ci    for (int i = 0; i < FUZZ_TEST_NUM; i++) {
134da853ecaSopenharmony_ci        cout << "current run time is: " << i << endl;
135da853ecaSopenharmony_ci        int typeIndex = rand() % 4;
136da853ecaSopenharmony_ci        int audioChannels = getIntRand();
137da853ecaSopenharmony_ci        int audioSampleRate = getIntRand();
138da853ecaSopenharmony_ci
139da853ecaSopenharmony_ci        int videoWidth = getIntRand();
140da853ecaSopenharmony_ci        int videoHeight = getIntRand();
141da853ecaSopenharmony_ci
142da853ecaSopenharmony_ci        // audio config
143da853ecaSopenharmony_ci        OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, mimeType[typeIndex].c_str());
144da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, audioChannels);
145da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, audioSampleRate);
146da853ecaSopenharmony_ci
147da853ecaSopenharmony_ci        // video config
148da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_WIDTH, videoWidth);
149da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_HEIGHT, videoHeight);
150da853ecaSopenharmony_ci
151da853ecaSopenharmony_ci        ret = muxerDemo->NativeAddTrack(handle, &trackId, trackFormat);
152da853ecaSopenharmony_ci        cout << "trackId is: " << trackId << ", ret is: " << ret << endl;
153da853ecaSopenharmony_ci    }
154da853ecaSopenharmony_ci
155da853ecaSopenharmony_ci    OH_AVFormat_Destroy(trackFormat);
156da853ecaSopenharmony_ci    muxerDemo->NativeDestroy(handle);
157da853ecaSopenharmony_ci    delete muxerDemo;
158da853ecaSopenharmony_ci}
159da853ecaSopenharmony_ci
160da853ecaSopenharmony_ci
161da853ecaSopenharmony_ci/**
162da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_004
163da853ecaSopenharmony_ci * @tc.name      : WriteSampleBuffer
164da853ecaSopenharmony_ci * @tc.desc      : Fuzz test
165da853ecaSopenharmony_ci */
166da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFuzzTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_004, TestSize.Level2)
167da853ecaSopenharmony_ci{
168da853ecaSopenharmony_ci    srand(time(nullptr) * 10);
169da853ecaSopenharmony_ci    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
170da853ecaSopenharmony_ci
171da853ecaSopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_M4A;
172da853ecaSopenharmony_ci    int32_t fd = -1;
173da853ecaSopenharmony_ci    fd = muxerDemo->GetFdByMode(format);
174da853ecaSopenharmony_ci    OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format);
175da853ecaSopenharmony_ci    ASSERT_NE(nullptr, handle);
176da853ecaSopenharmony_ci
177da853ecaSopenharmony_ci    uint8_t a[100];
178da853ecaSopenharmony_ci    OH_AVFormat* trackFormat = OH_AVFormat_Create();
179da853ecaSopenharmony_ci    OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC);
180da853ecaSopenharmony_ci    OH_AVFormat_SetLongValue(trackFormat, OH_MD_KEY_BITRATE, 320000);
181da853ecaSopenharmony_ci    OH_AVFormat_SetBuffer(trackFormat, OH_MD_KEY_CODEC_CONFIG, a, 100);
182da853ecaSopenharmony_ci    OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, 1);
183da853ecaSopenharmony_ci    OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, 48000);
184da853ecaSopenharmony_ci    OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_PROFILE, 0);
185da853ecaSopenharmony_ci
186da853ecaSopenharmony_ci    int32_t trackId;
187da853ecaSopenharmony_ci    OH_AVErrCode ret;
188da853ecaSopenharmony_ci
189da853ecaSopenharmony_ci    ret = muxerDemo->NativeAddTrack(handle, &trackId, trackFormat);
190da853ecaSopenharmony_ci    ASSERT_EQ(0, trackId);
191da853ecaSopenharmony_ci
192da853ecaSopenharmony_ci    ret = muxerDemo->NativeStart(handle);
193da853ecaSopenharmony_ci    ASSERT_EQ(AV_ERR_OK, ret);
194da853ecaSopenharmony_ci
195da853ecaSopenharmony_ci    OH_AVCodecBufferAttr info;
196da853ecaSopenharmony_ci    info.pts = 0;
197da853ecaSopenharmony_ci
198da853ecaSopenharmony_ci    for (int i = 0; i < FUZZ_TEST_NUM; i++) {
199da853ecaSopenharmony_ci        cout << "current run time is: " << i << endl;
200da853ecaSopenharmony_ci        int dataLen = rand() % 65536;
201da853ecaSopenharmony_ci        OH_AVMemory* avMemBuffer = OH_AVMemory_Create(dataLen);
202da853ecaSopenharmony_ci
203da853ecaSopenharmony_ci        cout << "data len is:" << dataLen << endl;
204da853ecaSopenharmony_ci
205da853ecaSopenharmony_ci        info.pts += AUDIO_PTS_ADD;
206da853ecaSopenharmony_ci        info.size = dataLen;
207da853ecaSopenharmony_ci        info.offset = getIntRand();
208da853ecaSopenharmony_ci        info.flags = getIntRand();
209da853ecaSopenharmony_ci
210da853ecaSopenharmony_ci        cout << "info.pts is:" << info.pts << endl;
211da853ecaSopenharmony_ci        cout << "info.size is:" << info.size << endl;
212da853ecaSopenharmony_ci        cout << "info.offset is:" << info.offset << endl;
213da853ecaSopenharmony_ci        cout << "info.flags is:" << info.flags << endl;
214da853ecaSopenharmony_ci
215da853ecaSopenharmony_ci        ret = muxerDemo->NativeWriteSampleBuffer(handle, trackId, avMemBuffer, info);
216da853ecaSopenharmony_ci        cout << "ret code is: " << ret << endl;
217da853ecaSopenharmony_ci        OH_AVMemory_Destroy(avMemBuffer);
218da853ecaSopenharmony_ci    }
219da853ecaSopenharmony_ci
220da853ecaSopenharmony_ci    muxerDemo->NativeDestroy(handle);
221da853ecaSopenharmony_ci    delete muxerDemo;
222da853ecaSopenharmony_ci}
223da853ecaSopenharmony_ci
224da853ecaSopenharmony_ci
225da853ecaSopenharmony_ci/**
226da853ecaSopenharmony_ci * @tc.number    : SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_005
227da853ecaSopenharmony_ci * @tc.name      : WriteSampleBuffer
228da853ecaSopenharmony_ci * @tc.desc      : Fuzz test
229da853ecaSopenharmony_ci */
230da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFuzzTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_005, TestSize.Level2)
231da853ecaSopenharmony_ci{
232da853ecaSopenharmony_ci    srand(time(nullptr) * 10);
233da853ecaSopenharmony_ci    AVMuxerDemo* muxerDemo = new AVMuxerDemo();
234da853ecaSopenharmony_ci
235da853ecaSopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
236da853ecaSopenharmony_ci    int32_t fd = -1;
237da853ecaSopenharmony_ci    OH_AVMuxer* handle;
238da853ecaSopenharmony_ci
239da853ecaSopenharmony_ci    string test_key = "";
240da853ecaSopenharmony_ci    string test_value = "";
241da853ecaSopenharmony_ci
242da853ecaSopenharmony_ci    OH_AVFormat* trackFormat = OH_AVFormat_Create();
243da853ecaSopenharmony_ci    string mimeType[] = {
244da853ecaSopenharmony_ci        "audio/mp4a-latm", "audio/mpeg", "video/avc", "video/mp4v-es","image/jpeg", "image/png", "image/bmp"
245da853ecaSopenharmony_ci    };
246da853ecaSopenharmony_ci
247da853ecaSopenharmony_ci    int32_t trackId;
248da853ecaSopenharmony_ci    OH_AVErrCode ret;
249da853ecaSopenharmony_ci
250da853ecaSopenharmony_ci    OH_AVCodecBufferAttr info;
251da853ecaSopenharmony_ci    info.pts = 0;
252da853ecaSopenharmony_ci
253da853ecaSopenharmony_ci    for (int i = 0; i < FUZZ_TEST_NUM; i++) {
254da853ecaSopenharmony_ci        cout << "current run time is: " << i << endl;
255da853ecaSopenharmony_ci        // Create
256da853ecaSopenharmony_ci        fd = rand();
257da853ecaSopenharmony_ci        format = OH_AVOutputFormat(rand() % 3);
258da853ecaSopenharmony_ci        handle = muxerDemo->NativeCreate(fd, format);
259da853ecaSopenharmony_ci
260da853ecaSopenharmony_ci        // SetRotation
261da853ecaSopenharmony_ci        float rotation = getIntRand();
262da853ecaSopenharmony_ci        ret = muxerDemo->NativeSetRotation(handle, rotation);
263da853ecaSopenharmony_ci
264da853ecaSopenharmony_ci        // AddTrack
265da853ecaSopenharmony_ci        int typeIndex = rand() % 4;
266da853ecaSopenharmony_ci        int audioChannels = getIntRand();
267da853ecaSopenharmony_ci        int audioSampleRate = getIntRand();
268da853ecaSopenharmony_ci
269da853ecaSopenharmony_ci        int videoWidth = getIntRand();
270da853ecaSopenharmony_ci        int videoHeight = getIntRand();
271da853ecaSopenharmony_ci
272da853ecaSopenharmony_ci        // audio config
273da853ecaSopenharmony_ci        OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, mimeType[typeIndex].c_str());
274da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, audioChannels);
275da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, audioSampleRate);
276da853ecaSopenharmony_ci
277da853ecaSopenharmony_ci        // video config
278da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_WIDTH, videoWidth);
279da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_HEIGHT, videoHeight);
280da853ecaSopenharmony_ci
281da853ecaSopenharmony_ci        ret = muxerDemo->NativeAddTrack(handle, &trackId, trackFormat);
282da853ecaSopenharmony_ci        ret = muxerDemo->NativeStart(handle);
283da853ecaSopenharmony_ci
284da853ecaSopenharmony_ci        int dataLen = rand() % 65536;
285da853ecaSopenharmony_ci        OH_AVMemory* avMemBuffer = OH_AVMemory_Create(dataLen);
286da853ecaSopenharmony_ci
287da853ecaSopenharmony_ci        info.pts += AUDIO_PTS_ADD;
288da853ecaSopenharmony_ci        info.size = dataLen;
289da853ecaSopenharmony_ci        info.offset = getIntRand();
290da853ecaSopenharmony_ci        info.flags = getIntRand();
291da853ecaSopenharmony_ci
292da853ecaSopenharmony_ci        ret = muxerDemo->NativeWriteSampleBuffer(handle, trackId, avMemBuffer, info);
293da853ecaSopenharmony_ci
294da853ecaSopenharmony_ci        ret = muxerDemo->NativeStop(handle);
295da853ecaSopenharmony_ci
296da853ecaSopenharmony_ci        ret = muxerDemo->NativeDestroy(handle);
297da853ecaSopenharmony_ci        cout << "Destroy ret is:" << ret << endl;
298da853ecaSopenharmony_ci        OH_AVMemory_Destroy(avMemBuffer);
299da853ecaSopenharmony_ci    }
300da853ecaSopenharmony_ci
301da853ecaSopenharmony_ci    delete muxerDemo;
302da853ecaSopenharmony_ci}