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 "gtest/gtest.h"
17da853ecaSopenharmony_ci
18da853ecaSopenharmony_ci#include "native_avcodec_base.h"
19da853ecaSopenharmony_ci#include "native_avdemuxer.h"
20da853ecaSopenharmony_ci#include "native_avformat.h"
21da853ecaSopenharmony_ci#include "native_avsource.h"
22da853ecaSopenharmony_ci
23da853ecaSopenharmony_ci#include <iostream>
24da853ecaSopenharmony_ci#include <cstdio>
25da853ecaSopenharmony_ci#include <string>
26da853ecaSopenharmony_ci#include <fcntl.h>
27da853ecaSopenharmony_cinamespace OHOS {
28da853ecaSopenharmony_cinamespace Media {
29da853ecaSopenharmony_ciclass DemuxerPerfNdkTest : public testing::Test {
30da853ecaSopenharmony_cipublic:
31da853ecaSopenharmony_ci    // SetUpTestCase: Called before all test cases
32da853ecaSopenharmony_ci    static void SetUpTestCase(void);
33da853ecaSopenharmony_ci    // TearDownTestCase: Called after all test case
34da853ecaSopenharmony_ci    static void TearDownTestCase(void);
35da853ecaSopenharmony_ci    // SetUp: Called before each test cases
36da853ecaSopenharmony_ci    void SetUp(void);
37da853ecaSopenharmony_ci    // TearDown: Called after each test cases
38da853ecaSopenharmony_ci    void TearDown(void);
39da853ecaSopenharmony_ci};
40da853ecaSopenharmony_ci
41da853ecaSopenharmony_cistatic OH_AVMemory *memory = nullptr;
42da853ecaSopenharmony_cistatic int32_t g_width = 3840;
43da853ecaSopenharmony_cistatic int32_t g_height = 2160;
44da853ecaSopenharmony_ci
45da853ecaSopenharmony_civoid DemuxerPerfNdkTest::SetUpTestCase()
46da853ecaSopenharmony_ci{
47da853ecaSopenharmony_ci    OH_AVMemory_Create(g_width * g_height);
48da853ecaSopenharmony_ci}
49da853ecaSopenharmony_civoid DemuxerPerfNdkTest::TearDownTestCase()
50da853ecaSopenharmony_ci{
51da853ecaSopenharmony_ci    if (memory != nullptr) {
52da853ecaSopenharmony_ci        OH_AVMemory_Destroy(memory);
53da853ecaSopenharmony_ci    }
54da853ecaSopenharmony_ci}
55da853ecaSopenharmony_civoid DemuxerPerfNdkTest::SetUp() {}
56da853ecaSopenharmony_civoid DemuxerPerfNdkTest::TearDown() {}
57da853ecaSopenharmony_ci} // namespace Media
58da853ecaSopenharmony_ci} // namespace OHOS
59da853ecaSopenharmony_ci
60da853ecaSopenharmony_ciusing namespace std;
61da853ecaSopenharmony_ciusing namespace OHOS;
62da853ecaSopenharmony_ciusing namespace OHOS::Media;
63da853ecaSopenharmony_ciusing namespace testing::ext;
64da853ecaSopenharmony_ci
65da853ecaSopenharmony_cinamespace {
66da853ecaSopenharmony_ci/**
67da853ecaSopenharmony_ci * @tc.number    : DEMUXER_MEMORY_0100
68da853ecaSopenharmony_ci * @tc.name      : demux memory 1280x720 30fps 10M
69da853ecaSopenharmony_ci * @tc.desc      : performance test
70da853ecaSopenharmony_ci */
71da853ecaSopenharmony_ciHWTEST_F(DemuxerPerfNdkTest, DEMUXER_MEMORY_0100, TestSize.Level3)
72da853ecaSopenharmony_ci{
73da853ecaSopenharmony_ci    const char *file = "/data/test/media/1280x720_30.mp4";
74da853ecaSopenharmony_ci    OH_AVErrCode ret = AV_ERR_OK;
75da853ecaSopenharmony_ci    uint32_t trackIndex = 0;
76da853ecaSopenharmony_ci    OH_AVCodecBufferAttr attr;
77da853ecaSopenharmony_ci    int fd = open(file, O_RDONLY);
78da853ecaSopenharmony_ci    OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, 0);
79da853ecaSopenharmony_ci    ASSERT_NE(source, nullptr);
80da853ecaSopenharmony_ci    OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source);
81da853ecaSopenharmony_ci    ASSERT_NE(demuxer, nullptr);
82da853ecaSopenharmony_ci    ret = OH_AVDemuxer_SelectTrackByID(demuxer, 0);
83da853ecaSopenharmony_ci    ASSERT_EQ(ret, AV_ERR_OK);
84da853ecaSopenharmony_ci    while ((attr.flags & AVCODEC_BUFFER_FLAGS_EOS) != 0) {
85da853ecaSopenharmony_ci        ret = OH_AVDemuxer_ReadSample(demuxer, trackIndex, memory, &attr);
86da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
87da853ecaSopenharmony_ci    }
88da853ecaSopenharmony_ci    OH_AVSource_Destroy(source);
89da853ecaSopenharmony_ci    close(fd);
90da853ecaSopenharmony_ci}
91da853ecaSopenharmony_ci
92da853ecaSopenharmony_ci/**
93da853ecaSopenharmony_ci * @tc.number    : DEMUXER_MEMORY_0200
94da853ecaSopenharmony_ci * @tc.name      : demux memory 1920x1080 30fps 20M
95da853ecaSopenharmony_ci * @tc.desc      : performance test
96da853ecaSopenharmony_ci */
97da853ecaSopenharmony_ciHWTEST_F(DemuxerPerfNdkTest, DEMUXER_MEMORY_0200, TestSize.Level3)
98da853ecaSopenharmony_ci{
99da853ecaSopenharmony_ci    const char *file = "/data/test/media/1920x1080_30.mp4";
100da853ecaSopenharmony_ci    OH_AVErrCode ret = AV_ERR_OK;
101da853ecaSopenharmony_ci    OH_AVCodecBufferAttr attr;
102da853ecaSopenharmony_ci    int fd = open(file, O_RDONLY);
103da853ecaSopenharmony_ci    uint32_t trackIndex = 0;
104da853ecaSopenharmony_ci    OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, 0);
105da853ecaSopenharmony_ci    ASSERT_NE(source, nullptr);
106da853ecaSopenharmony_ci    OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source);
107da853ecaSopenharmony_ci    ASSERT_NE(demuxer, nullptr);
108da853ecaSopenharmony_ci    ret = OH_AVDemuxer_SelectTrackByID(demuxer, 0);
109da853ecaSopenharmony_ci    ASSERT_EQ(ret, AV_ERR_OK);
110da853ecaSopenharmony_ci    while ((attr.flags & AVCODEC_BUFFER_FLAGS_EOS) != 0) {
111da853ecaSopenharmony_ci        ret = OH_AVDemuxer_ReadSample(demuxer, trackIndex, memory, &attr);
112da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
113da853ecaSopenharmony_ci    }
114da853ecaSopenharmony_ci    OH_AVSource_Destroy(source);
115da853ecaSopenharmony_ci    close(fd);
116da853ecaSopenharmony_ci}
117da853ecaSopenharmony_ci
118da853ecaSopenharmony_ci/**
119da853ecaSopenharmony_ci * @tc.number    : DEMUXER_MEMORY_0300
120da853ecaSopenharmony_ci * @tc.name      : demux memory 1280x720 30fps 50M
121da853ecaSopenharmony_ci * @tc.desc      : performance test
122da853ecaSopenharmony_ci */
123da853ecaSopenharmony_ciHWTEST_F(DemuxerPerfNdkTest, DEMUXER_MEMORY_0300, TestSize.Level3)
124da853ecaSopenharmony_ci{
125da853ecaSopenharmony_ci    const char *file = "/data/test/media/3840x2160_30.mp4";
126da853ecaSopenharmony_ci    OH_AVErrCode ret = AV_ERR_OK;
127da853ecaSopenharmony_ci    OH_AVCodecBufferAttr attr;
128da853ecaSopenharmony_ci    uint32_t trackIndex = 0;
129da853ecaSopenharmony_ci    int fd = open(file, O_RDONLY);
130da853ecaSopenharmony_ci    OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, 0);
131da853ecaSopenharmony_ci    ASSERT_NE(source, nullptr);
132da853ecaSopenharmony_ci    OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source);
133da853ecaSopenharmony_ci    ASSERT_NE(demuxer, nullptr);
134da853ecaSopenharmony_ci    ret = OH_AVDemuxer_SelectTrackByID(demuxer, 0);
135da853ecaSopenharmony_ci    ASSERT_EQ(ret, AV_ERR_OK);
136da853ecaSopenharmony_ci    while ((attr.flags & AVCODEC_BUFFER_FLAGS_EOS) != 0) {
137da853ecaSopenharmony_ci        ret = OH_AVDemuxer_ReadSample(demuxer, trackIndex, memory, &attr);
138da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
139da853ecaSopenharmony_ci    }
140da853ecaSopenharmony_ci    OH_AVSource_Destroy(source);
141da853ecaSopenharmony_ci    close(fd);
142da853ecaSopenharmony_ci}
143da853ecaSopenharmony_ci
144da853ecaSopenharmony_ci/**
145da853ecaSopenharmony_ci * @tc.number    : DEMUXER_PERFORMANCE_0100
146da853ecaSopenharmony_ci * @tc.name      : demux memory 1280x720 30fps 10M
147da853ecaSopenharmony_ci * @tc.desc      : performance test
148da853ecaSopenharmony_ci */
149da853ecaSopenharmony_ciHWTEST_F(DemuxerPerfNdkTest, DEMUXER_PERFORMANCE_0100, TestSize.Level3)
150da853ecaSopenharmony_ci{
151da853ecaSopenharmony_ci    const char *file = "/data/test/media/1280x720_30.mp4";
152da853ecaSopenharmony_ci    OH_AVErrCode ret = AV_ERR_OK;
153da853ecaSopenharmony_ci    OH_AVCodecBufferAttr attr;
154da853ecaSopenharmony_ci    uint32_t trackIndex = 0;
155da853ecaSopenharmony_ci    int fd = open(file, O_RDONLY);
156da853ecaSopenharmony_ci    OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, 0);
157da853ecaSopenharmony_ci    ASSERT_NE(source, nullptr);
158da853ecaSopenharmony_ci    OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source);
159da853ecaSopenharmony_ci    ASSERT_NE(demuxer, nullptr);
160da853ecaSopenharmony_ci    ret = OH_AVDemuxer_SelectTrackByID(demuxer, 0);
161da853ecaSopenharmony_ci    ASSERT_EQ(ret, AV_ERR_OK);
162da853ecaSopenharmony_ci    srand(time(nullptr));
163da853ecaSopenharmony_ci    for (int i = 0; i < 20; i++) {
164da853ecaSopenharmony_ci        int pos_to = rand() % (30 * 3600);
165da853ecaSopenharmony_ci        int64_t toMs = pos_to * 33333;
166da853ecaSopenharmony_ci        ret = OH_AVDemuxer_SeekToTime(demuxer, toMs, SEEK_NEXT_SYNC);
167da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
168da853ecaSopenharmony_ci        ret = OH_AVDemuxer_ReadSample(demuxer, trackIndex, memory, &attr);
169da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
170da853ecaSopenharmony_ci    }
171da853ecaSopenharmony_ci    OH_AVSource_Destroy(source);
172da853ecaSopenharmony_ci    close(fd);
173da853ecaSopenharmony_ci}
174da853ecaSopenharmony_ci
175da853ecaSopenharmony_ci/**
176da853ecaSopenharmony_ci * @tc.number    : DEMUXER_PERFORMANCE_0200
177da853ecaSopenharmony_ci * @tc.name      : demux memory 1280x720 60fps 10M
178da853ecaSopenharmony_ci * @tc.desc      : performance test
179da853ecaSopenharmony_ci */
180da853ecaSopenharmony_ciHWTEST_F(DemuxerPerfNdkTest, DEMUXER_PERFORMANCE_0200, TestSize.Level3)
181da853ecaSopenharmony_ci{
182da853ecaSopenharmony_ci    const char *file = "/data/test/media/1280x720_60.mp4";
183da853ecaSopenharmony_ci    OH_AVErrCode ret = AV_ERR_OK;
184da853ecaSopenharmony_ci    OH_AVCodecBufferAttr attr;
185da853ecaSopenharmony_ci    int fd = open(file, O_RDONLY);
186da853ecaSopenharmony_ci    uint32_t trackIndex = 0;
187da853ecaSopenharmony_ci    OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, 0);
188da853ecaSopenharmony_ci    ASSERT_NE(source, nullptr);
189da853ecaSopenharmony_ci    OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source);
190da853ecaSopenharmony_ci    ASSERT_NE(demuxer, nullptr);
191da853ecaSopenharmony_ci    ret = OH_AVDemuxer_SelectTrackByID(demuxer, 0);
192da853ecaSopenharmony_ci    ASSERT_EQ(ret, AV_ERR_OK);
193da853ecaSopenharmony_ci    srand(time(nullptr));
194da853ecaSopenharmony_ci    for (int i = 0; i < 20; i++) {
195da853ecaSopenharmony_ci        int pos_to = rand() % (60 * 3600);
196da853ecaSopenharmony_ci        int64_t toMs = pos_to * 16666;
197da853ecaSopenharmony_ci        ret = OH_AVDemuxer_SeekToTime(demuxer, toMs, SEEK_NEXT_SYNC);
198da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
199da853ecaSopenharmony_ci        ret = OH_AVDemuxer_ReadSample(demuxer, trackIndex, memory, &attr);
200da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
201da853ecaSopenharmony_ci    }
202da853ecaSopenharmony_ci    OH_AVSource_Destroy(source);
203da853ecaSopenharmony_ci    close(fd);
204da853ecaSopenharmony_ci}
205da853ecaSopenharmony_ci
206da853ecaSopenharmony_ci/**
207da853ecaSopenharmony_ci * @tc.number    : DEMUXER_PERFORMANCE_0300
208da853ecaSopenharmony_ci * @tc.name      : demux memory 1920x1080 30fps 20M
209da853ecaSopenharmony_ci * @tc.desc      : performance test
210da853ecaSopenharmony_ci */
211da853ecaSopenharmony_ciHWTEST_F(DemuxerPerfNdkTest, DEMUXER_PERFORMANCE_0300, TestSize.Level3)
212da853ecaSopenharmony_ci{
213da853ecaSopenharmony_ci    const char *file = "/data/test/media/1920x1080_30.mp4";
214da853ecaSopenharmony_ci    OH_AVErrCode ret = AV_ERR_OK;
215da853ecaSopenharmony_ci    OH_AVCodecBufferAttr attr;
216da853ecaSopenharmony_ci    uint32_t trackIndex = 0;
217da853ecaSopenharmony_ci    int fd = open(file, O_RDONLY);
218da853ecaSopenharmony_ci    OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, 0);
219da853ecaSopenharmony_ci    ASSERT_NE(source, nullptr);
220da853ecaSopenharmony_ci    OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source);
221da853ecaSopenharmony_ci    ASSERT_NE(demuxer, nullptr);
222da853ecaSopenharmony_ci    ret = OH_AVDemuxer_SelectTrackByID(demuxer, 0);
223da853ecaSopenharmony_ci    ASSERT_EQ(ret, AV_ERR_OK);
224da853ecaSopenharmony_ci    srand(time(nullptr));
225da853ecaSopenharmony_ci    for (int i = 0; i < 20; i++) {
226da853ecaSopenharmony_ci        int pos_to = rand() % (30 * 3600);
227da853ecaSopenharmony_ci        int64_t toMs = pos_to * 33333;
228da853ecaSopenharmony_ci        ret = OH_AVDemuxer_SeekToTime(demuxer, toMs, SEEK_NEXT_SYNC);
229da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
230da853ecaSopenharmony_ci        ret = OH_AVDemuxer_ReadSample(demuxer, trackIndex, memory, &attr);
231da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
232da853ecaSopenharmony_ci    }
233da853ecaSopenharmony_ci    OH_AVSource_Destroy(source);
234da853ecaSopenharmony_ci    close(fd);
235da853ecaSopenharmony_ci}
236da853ecaSopenharmony_ci
237da853ecaSopenharmony_ci/**
238da853ecaSopenharmony_ci * @tc.number    : DEMUXER_PERFORMANCE_0400
239da853ecaSopenharmony_ci * @tc.name      : demux memory 1920x1080 60fps 20M
240da853ecaSopenharmony_ci * @tc.desc      : performance test
241da853ecaSopenharmony_ci */
242da853ecaSopenharmony_ciHWTEST_F(DemuxerPerfNdkTest, DEMUXER_PERFORMANCE_0400, TestSize.Level3)
243da853ecaSopenharmony_ci{
244da853ecaSopenharmony_ci    const char *file = "/data/test/media/1920x1080_60.mp4";
245da853ecaSopenharmony_ci    OH_AVErrCode ret = AV_ERR_OK;
246da853ecaSopenharmony_ci    OH_AVCodecBufferAttr attr;
247da853ecaSopenharmony_ci    uint32_t trackIndex = 0;
248da853ecaSopenharmony_ci    int fd = open(file, O_RDONLY);
249da853ecaSopenharmony_ci    OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, 0);
250da853ecaSopenharmony_ci    ASSERT_NE(source, nullptr);
251da853ecaSopenharmony_ci    OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source);
252da853ecaSopenharmony_ci    ASSERT_NE(demuxer, nullptr);
253da853ecaSopenharmony_ci    ret = OH_AVDemuxer_SelectTrackByID(demuxer, 0);
254da853ecaSopenharmony_ci    ASSERT_EQ(ret, AV_ERR_OK);
255da853ecaSopenharmony_ci    srand(time(nullptr));
256da853ecaSopenharmony_ci    for (int i = 0; i < 20; i++) {
257da853ecaSopenharmony_ci        int pos_to = rand() % (60 * 3600);
258da853ecaSopenharmony_ci        int64_t toMs = pos_to * 16666;
259da853ecaSopenharmony_ci        ret = OH_AVDemuxer_SeekToTime(demuxer, toMs, SEEK_NEXT_SYNC);
260da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
261da853ecaSopenharmony_ci        ret = OH_AVDemuxer_ReadSample(demuxer, trackIndex, memory, &attr);
262da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
263da853ecaSopenharmony_ci    }
264da853ecaSopenharmony_ci    OH_AVSource_Destroy(source);
265da853ecaSopenharmony_ci    close(fd);
266da853ecaSopenharmony_ci}
267da853ecaSopenharmony_ci
268da853ecaSopenharmony_ci/**
269da853ecaSopenharmony_ci * @tc.number    : DEMUXER_PERFORMANCE_0500
270da853ecaSopenharmony_ci * @tc.name      : demux memory 3840x2160 30fps 50M
271da853ecaSopenharmony_ci * @tc.desc      : performance test
272da853ecaSopenharmony_ci */
273da853ecaSopenharmony_ciHWTEST_F(DemuxerPerfNdkTest, DEMUXER_PERFORMANCE_0500, TestSize.Level3)
274da853ecaSopenharmony_ci{
275da853ecaSopenharmony_ci    const char *file = "/data/test/media/3840x2160_30.mp4";
276da853ecaSopenharmony_ci    OH_AVErrCode ret = AV_ERR_OK;
277da853ecaSopenharmony_ci    OH_AVCodecBufferAttr attr;
278da853ecaSopenharmony_ci    uint32_t trackIndex = 0;
279da853ecaSopenharmony_ci    int fd = open(file, O_RDONLY);
280da853ecaSopenharmony_ci    OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, 0);
281da853ecaSopenharmony_ci    ASSERT_NE(source, nullptr);
282da853ecaSopenharmony_ci    OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source);
283da853ecaSopenharmony_ci    ASSERT_NE(demuxer, nullptr);
284da853ecaSopenharmony_ci    ret = OH_AVDemuxer_SelectTrackByID(demuxer, 0);
285da853ecaSopenharmony_ci    ASSERT_EQ(ret, AV_ERR_OK);
286da853ecaSopenharmony_ci    srand(time(nullptr));
287da853ecaSopenharmony_ci    for (int i = 0; i < 20; i++) {
288da853ecaSopenharmony_ci        int pos_to = rand() % (30 * 3600);
289da853ecaSopenharmony_ci        int64_t toMs = pos_to * 33333;
290da853ecaSopenharmony_ci        ret = OH_AVDemuxer_SeekToTime(demuxer, toMs, SEEK_NEXT_SYNC);
291da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
292da853ecaSopenharmony_ci        ret = OH_AVDemuxer_ReadSample(demuxer, trackIndex, memory, &attr);
293da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
294da853ecaSopenharmony_ci    }
295da853ecaSopenharmony_ci    OH_AVSource_Destroy(source);
296da853ecaSopenharmony_ci    close(fd);
297da853ecaSopenharmony_ci}
298da853ecaSopenharmony_ci
299da853ecaSopenharmony_ci/**
300da853ecaSopenharmony_ci * @tc.number    : DEMUXER_PERFORMANCE_0600
301da853ecaSopenharmony_ci * @tc.name      : demux memory 3840x2160 60fps 50M
302da853ecaSopenharmony_ci * @tc.desc      : performance test
303da853ecaSopenharmony_ci */
304da853ecaSopenharmony_ciHWTEST_F(DemuxerPerfNdkTest, DEMUXER_PERFORMANCE_0600, TestSize.Level3)
305da853ecaSopenharmony_ci{
306da853ecaSopenharmony_ci    const char *file = "/data/test/media/3840x2160_60.mp4";
307da853ecaSopenharmony_ci    OH_AVErrCode ret = AV_ERR_OK;
308da853ecaSopenharmony_ci    OH_AVCodecBufferAttr attr;
309da853ecaSopenharmony_ci    uint32_t trackIndex = 0;
310da853ecaSopenharmony_ci    int fd = open(file, O_RDONLY);
311da853ecaSopenharmony_ci    OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, 0);
312da853ecaSopenharmony_ci    ASSERT_NE(source, nullptr);
313da853ecaSopenharmony_ci    OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source);
314da853ecaSopenharmony_ci    ASSERT_NE(demuxer, nullptr);
315da853ecaSopenharmony_ci    ret = OH_AVDemuxer_SelectTrackByID(demuxer, 0);
316da853ecaSopenharmony_ci    ASSERT_EQ(ret, AV_ERR_OK);
317da853ecaSopenharmony_ci    srand(time(nullptr));
318da853ecaSopenharmony_ci    for (int i = 0; i < 20; i++) {
319da853ecaSopenharmony_ci        int pos_to = rand() % (60 * 3600);
320da853ecaSopenharmony_ci        int64_t toMs = pos_to * 16666;
321da853ecaSopenharmony_ci        ret = OH_AVDemuxer_SeekToTime(demuxer, toMs, SEEK_NEXT_SYNC);
322da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
323da853ecaSopenharmony_ci        ret = OH_AVDemuxer_ReadSample(demuxer, trackIndex, memory, &attr);
324da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
325da853ecaSopenharmony_ci    }
326da853ecaSopenharmony_ci    OH_AVSource_Destroy(source);
327da853ecaSopenharmony_ci    close(fd);
328da853ecaSopenharmony_ci}
329da853ecaSopenharmony_ci
330da853ecaSopenharmony_ci/**
331da853ecaSopenharmony_ci * @tc.number    : DEMUXER_PERFORMANCE_0700
332da853ecaSopenharmony_ci * @tc.name      : test CopyNextSample time 1280x720 30fps 10M
333da853ecaSopenharmony_ci * @tc.desc      : performance test
334da853ecaSopenharmony_ci */
335da853ecaSopenharmony_ciHWTEST_F(DemuxerPerfNdkTest, DEMUXER_PERFORMANCE_0700, TestSize.Level3)
336da853ecaSopenharmony_ci{
337da853ecaSopenharmony_ci    const char *file = "/data/test/media/1280x720_30_10M.mp4";
338da853ecaSopenharmony_ci    OH_AVErrCode ret = AV_ERR_OK;
339da853ecaSopenharmony_ci    OH_AVCodecBufferAttr attr;
340da853ecaSopenharmony_ci    uint32_t trackIndex = 0;
341da853ecaSopenharmony_ci    int fd = open(file, O_RDONLY);
342da853ecaSopenharmony_ci    OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, 0);
343da853ecaSopenharmony_ci    ASSERT_NE(source, nullptr);
344da853ecaSopenharmony_ci    OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source);
345da853ecaSopenharmony_ci    ASSERT_NE(demuxer, nullptr);
346da853ecaSopenharmony_ci    ret = OH_AVDemuxer_SelectTrackByID(demuxer, 0);
347da853ecaSopenharmony_ci    ASSERT_EQ(ret, AV_ERR_OK);
348da853ecaSopenharmony_ci    while ((attr.flags & AVCODEC_BUFFER_FLAGS_EOS) != 0) {
349da853ecaSopenharmony_ci        ret = OH_AVDemuxer_ReadSample(demuxer, trackIndex, memory, &attr);
350da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
351da853ecaSopenharmony_ci    }
352da853ecaSopenharmony_ci    OH_AVSource_Destroy(source);
353da853ecaSopenharmony_ci    close(fd);
354da853ecaSopenharmony_ci}
355da853ecaSopenharmony_ci
356da853ecaSopenharmony_ci/**
357da853ecaSopenharmony_ci * @tc.number    : DEMUXER_PERFORMANCE_0800
358da853ecaSopenharmony_ci * @tc.name      : test CopyNextSample time 1920x1080 30fps 20M
359da853ecaSopenharmony_ci * @tc.desc      : performance test
360da853ecaSopenharmony_ci */
361da853ecaSopenharmony_ciHWTEST_F(DemuxerPerfNdkTest, DEMUXER_PERFORMANCE_0800, TestSize.Level3)
362da853ecaSopenharmony_ci{
363da853ecaSopenharmony_ci    const char *file = "/data/test/media/1920x1080_30.mp4";
364da853ecaSopenharmony_ci    OH_AVErrCode ret = AV_ERR_OK;
365da853ecaSopenharmony_ci    OH_AVCodecBufferAttr attr;
366da853ecaSopenharmony_ci    uint32_t trackIndex = 0;
367da853ecaSopenharmony_ci    int fd = open(file, O_RDONLY);
368da853ecaSopenharmony_ci    OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, 0);
369da853ecaSopenharmony_ci    ASSERT_NE(source, nullptr);
370da853ecaSopenharmony_ci    OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source);
371da853ecaSopenharmony_ci    ASSERT_NE(demuxer, nullptr);
372da853ecaSopenharmony_ci    ret = OH_AVDemuxer_SelectTrackByID(demuxer, 0);
373da853ecaSopenharmony_ci    ASSERT_EQ(ret, AV_ERR_OK);
374da853ecaSopenharmony_ci    while ((attr.flags & AVCODEC_BUFFER_FLAGS_EOS) != 0) {
375da853ecaSopenharmony_ci        ret = OH_AVDemuxer_ReadSample(demuxer, trackIndex, memory, &attr);
376da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
377da853ecaSopenharmony_ci    }
378da853ecaSopenharmony_ci    OH_AVSource_Destroy(source);
379da853ecaSopenharmony_ci    close(fd);
380da853ecaSopenharmony_ci}
381da853ecaSopenharmony_ci
382da853ecaSopenharmony_ci/**
383da853ecaSopenharmony_ci * @tc.number    : DEMUXER_PERFORMANCE_0900
384da853ecaSopenharmony_ci * @tc.name      : test CopyNextSample time 3840x2160 30fps 50M
385da853ecaSopenharmony_ci * @tc.desc      : performance test
386da853ecaSopenharmony_ci */
387da853ecaSopenharmony_ciHWTEST_F(DemuxerPerfNdkTest, DEMUXER_PERFORMANCE_0900, TestSize.Level3)
388da853ecaSopenharmony_ci{
389da853ecaSopenharmony_ci    const char *file = "/data/test/media/3840x2160_30.mp4";
390da853ecaSopenharmony_ci    OH_AVErrCode ret = AV_ERR_OK;
391da853ecaSopenharmony_ci    OH_AVCodecBufferAttr attr;
392da853ecaSopenharmony_ci    uint32_t trackIndex = 0;
393da853ecaSopenharmony_ci    int fd = open(file, O_RDONLY);
394da853ecaSopenharmony_ci    OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, 0);
395da853ecaSopenharmony_ci    ASSERT_NE(source, nullptr);
396da853ecaSopenharmony_ci    OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source);
397da853ecaSopenharmony_ci    ASSERT_NE(demuxer, nullptr);
398da853ecaSopenharmony_ci    ret = OH_AVDemuxer_SelectTrackByID(demuxer, 0);
399da853ecaSopenharmony_ci    ASSERT_EQ(ret, AV_ERR_OK);
400da853ecaSopenharmony_ci    while ((attr.flags & AVCODEC_BUFFER_FLAGS_EOS) != 0) {
401da853ecaSopenharmony_ci        ret = OH_AVDemuxer_ReadSample(demuxer, trackIndex, memory, &attr);
402da853ecaSopenharmony_ci        ASSERT_EQ(ret, AV_ERR_OK);
403da853ecaSopenharmony_ci    }
404da853ecaSopenharmony_ci    OH_AVSource_Destroy(source);
405da853ecaSopenharmony_ci    close(fd);
406da853ecaSopenharmony_ci}
407da853ecaSopenharmony_ci}