1da853ecaSopenharmony_ci/*
2da853ecaSopenharmony_ci * Copyright (C) 2024 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 "avdemuxer.h"
19da853ecaSopenharmony_ci#include "avsource.h"
20da853ecaSopenharmony_ci#include "meta/format.h"
21da853ecaSopenharmony_ci#include "avcodec_errors.h"
22da853ecaSopenharmony_ci#include "avcodec_common.h"
23da853ecaSopenharmony_ci#include "buffer/avsharedmemory.h"
24da853ecaSopenharmony_ci#include "buffer/avsharedmemorybase.h"
25da853ecaSopenharmony_ci#include "securec.h"
26da853ecaSopenharmony_ci#include "inner_demuxer_sample.h"
27da853ecaSopenharmony_ci
28da853ecaSopenharmony_ci#include <iostream>
29da853ecaSopenharmony_ci#include <cstdio>
30da853ecaSopenharmony_ci#include <string>
31da853ecaSopenharmony_ci#include <fcntl.h>
32da853ecaSopenharmony_ci
33da853ecaSopenharmony_ci#include "native_avcodec_base.h"
34da853ecaSopenharmony_ci#include "native_avdemuxer.h"
35da853ecaSopenharmony_ci#include "native_avformat.h"
36da853ecaSopenharmony_ci#include "native_avsource.h"
37da853ecaSopenharmony_ci#include <thread>
38da853ecaSopenharmony_ci#include "native_avmemory.h"
39da853ecaSopenharmony_ci
40da853ecaSopenharmony_ciusing namespace std;
41da853ecaSopenharmony_ciusing namespace OHOS;
42da853ecaSopenharmony_ciusing namespace OHOS::MediaAVCodec;
43da853ecaSopenharmony_ciusing namespace OHOS::Media;
44da853ecaSopenharmony_ciusing namespace testing::ext;
45da853ecaSopenharmony_ci
46da853ecaSopenharmony_cinamespace {
47da853ecaSopenharmony_ciclass DemuxerNetNdkTest : public testing::Test {
48da853ecaSopenharmony_cipublic:
49da853ecaSopenharmony_ci    // SetUpTestCase: Called before all test cases
50da853ecaSopenharmony_ci    static void SetUpTestCase(void);
51da853ecaSopenharmony_ci    // TearDownTestCase: Called after all test case
52da853ecaSopenharmony_ci    static void TearDownTestCase(void);
53da853ecaSopenharmony_ci    // SetUp: Called before each test cases
54da853ecaSopenharmony_ci    void SetUp(void);
55da853ecaSopenharmony_ci    // TearDown: Called after each test cases
56da853ecaSopenharmony_ci    void TearDown(void);
57da853ecaSopenharmony_ci
58da853ecaSopenharmony_cipublic:
59da853ecaSopenharmony_ci    int32_t fd_ = -1;
60da853ecaSopenharmony_ci    int64_t size;
61da853ecaSopenharmony_ci};
62da853ecaSopenharmony_cistatic OH_AVMemory *memory = nullptr;
63da853ecaSopenharmony_cistatic OH_AVFormat *sourceFormat = nullptr;
64da853ecaSopenharmony_cistatic OH_AVFormat *trackFormat = nullptr;
65da853ecaSopenharmony_cistatic OH_AVSource *source = nullptr;
66da853ecaSopenharmony_cistatic OH_AVDemuxer *demuxer = nullptr;
67da853ecaSopenharmony_cistatic int32_t g_trackCount = 0;
68da853ecaSopenharmony_cistatic OH_AVBuffer *avBuffer = nullptr;
69da853ecaSopenharmony_ci
70da853ecaSopenharmony_cistatic OH_AVSource *sourceV = nullptr;
71da853ecaSopenharmony_cistatic OH_AVDemuxer *demuxerV = nullptr;
72da853ecaSopenharmony_cistatic OH_AVFormat *sourceFormatV = nullptr;
73da853ecaSopenharmony_cistatic OH_AVFormat *trackFormatV = nullptr;
74da853ecaSopenharmony_cistatic OH_AVMemory *memoryV = nullptr;
75da853ecaSopenharmony_cistd::map<int64_t, int32_t> myMap;
76da853ecaSopenharmony_cistatic int32_t g_maxThread = 16;
77da853ecaSopenharmony_ciOH_AVSource *source_list[16] = {};
78da853ecaSopenharmony_ciOH_AVMemory *memory_list[16] = {};
79da853ecaSopenharmony_ciOH_AVDemuxer *demuxer_list[16] = {};
80da853ecaSopenharmony_ciint g_fdList[16] = {};
81da853ecaSopenharmony_ciOH_AVBuffer *avBuffer_list[16] = {};
82da853ecaSopenharmony_cistatic int32_t g_width = 3840;
83da853ecaSopenharmony_cistatic int32_t g_height = 2160;
84da853ecaSopenharmony_ciconstexpr int32_t LAYOUTMONO = 4;
85da853ecaSopenharmony_ciconstexpr int32_t LAYOUTDUAL = 3;
86da853ecaSopenharmony_ciconstexpr int32_t SAMPLERATEMONO = 8000;
87da853ecaSopenharmony_ciconstexpr int32_t SAMPLERATEDUAL = 44100;
88da853ecaSopenharmony_ciconstexpr int32_t COUNTMONO = 1;
89da853ecaSopenharmony_ciconstexpr int32_t COUNTDUAL = 2;
90da853ecaSopenharmony_ciconstexpr int32_t BITRATEMONO = 64000;
91da853ecaSopenharmony_ciconstexpr int32_t BITRATEDUAL = 705600;
92da853ecaSopenharmony_ciconstexpr int32_t VTTSEEKFORWARD = 5100;
93da853ecaSopenharmony_ciconstexpr int32_t VTTSEEKBACK = 2100;
94da853ecaSopenharmony_ciconstexpr int64_t BITRATEDUALMP4 = 8594194000;
95da853ecaSopenharmony_ciconstexpr int32_t BITRATEMONOMP4 = 135105000;
96da853ecaSopenharmony_ciconstexpr int64_t BITRATEDUAL14 = 8222430000;
97da853ecaSopenharmony_ciconstexpr int32_t BITRATEMONO14 = 156150000;
98da853ecaSopenharmony_ciconstexpr int32_t ATTRPTS = 1000;
99da853ecaSopenharmony_civoid DemuxerNetNdkTest::SetUpTestCase() {}
100da853ecaSopenharmony_civoid DemuxerNetNdkTest::TearDownTestCase() {}
101da853ecaSopenharmony_civoid DemuxerNetNdkTest::SetUp()
102da853ecaSopenharmony_ci{
103da853ecaSopenharmony_ci    memory = OH_AVMemory_Create(g_width * g_height);
104da853ecaSopenharmony_ci    memoryV = OH_AVMemory_Create(g_width * g_height);
105da853ecaSopenharmony_ci    g_trackCount = 0;
106da853ecaSopenharmony_ci}
107da853ecaSopenharmony_civoid DemuxMoreTearDown()
108da853ecaSopenharmony_ci{
109da853ecaSopenharmony_ci    for (int i = 0; i < g_maxThread; i++) {
110da853ecaSopenharmony_ci        if (demuxer_list[i] != nullptr) {
111da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_Destroy(demuxer_list[i]));
112da853ecaSopenharmony_ci            demuxer_list[i] = nullptr;
113da853ecaSopenharmony_ci        }
114da853ecaSopenharmony_ci        if (source_list[i] != nullptr) {
115da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVSource_Destroy(source_list[i]));
116da853ecaSopenharmony_ci            source_list[i] = nullptr;
117da853ecaSopenharmony_ci        }
118da853ecaSopenharmony_ci        if (memory_list[i] != nullptr) {
119da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVMemory_Destroy(memory_list[i]));
120da853ecaSopenharmony_ci            memory_list[i] = nullptr;
121da853ecaSopenharmony_ci        }
122da853ecaSopenharmony_ci        if (avBuffer_list[i] != nullptr) {
123da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVBuffer_Destroy(avBuffer_list[i]));
124da853ecaSopenharmony_ci            avBuffer_list[i] = nullptr;
125da853ecaSopenharmony_ci        }
126da853ecaSopenharmony_ci        std::cout << i << "            finish Destroy!!!!" << std::endl;
127da853ecaSopenharmony_ci        close(g_fdList[i]);
128da853ecaSopenharmony_ci    }
129da853ecaSopenharmony_ci    if (trackFormatV != nullptr) {
130da853ecaSopenharmony_ci        OH_AVFormat_Destroy(trackFormatV);
131da853ecaSopenharmony_ci        trackFormatV = nullptr;
132da853ecaSopenharmony_ci    }
133da853ecaSopenharmony_ci    if (sourceFormatV != nullptr) {
134da853ecaSopenharmony_ci        OH_AVFormat_Destroy(sourceFormatV);
135da853ecaSopenharmony_ci        sourceFormatV = nullptr;
136da853ecaSopenharmony_ci    }
137da853ecaSopenharmony_ci    if (memoryV != nullptr) {
138da853ecaSopenharmony_ci        OH_AVMemory_Destroy(memoryV);
139da853ecaSopenharmony_ci        memoryV = nullptr;
140da853ecaSopenharmony_ci    }
141da853ecaSopenharmony_ci    if (sourceV != nullptr) {
142da853ecaSopenharmony_ci        OH_AVSource_Destroy(sourceV);
143da853ecaSopenharmony_ci        sourceV = nullptr;
144da853ecaSopenharmony_ci    }
145da853ecaSopenharmony_ci    if (demuxerV != nullptr) {
146da853ecaSopenharmony_ci        OH_AVDemuxer_Destroy(demuxerV);
147da853ecaSopenharmony_ci        demuxerV = nullptr;
148da853ecaSopenharmony_ci    }
149da853ecaSopenharmony_ci    if (!myMap.empty()) {
150da853ecaSopenharmony_ci        myMap.clear();
151da853ecaSopenharmony_ci    }
152da853ecaSopenharmony_ci}
153da853ecaSopenharmony_civoid DemuxerNetNdkTest::TearDown()
154da853ecaSopenharmony_ci{
155da853ecaSopenharmony_ci    if (fd_ > 0) {
156da853ecaSopenharmony_ci        close(fd_);
157da853ecaSopenharmony_ci        fd_ = -1;
158da853ecaSopenharmony_ci    }
159da853ecaSopenharmony_ci    if (demuxer != nullptr) {
160da853ecaSopenharmony_ci        OH_AVDemuxer_Destroy(demuxer);
161da853ecaSopenharmony_ci        demuxer = nullptr;
162da853ecaSopenharmony_ci    }
163da853ecaSopenharmony_ci    if (memory != nullptr) {
164da853ecaSopenharmony_ci        OH_AVMemory_Destroy(memory);
165da853ecaSopenharmony_ci        memory = nullptr;
166da853ecaSopenharmony_ci    }
167da853ecaSopenharmony_ci    if (source != nullptr) {
168da853ecaSopenharmony_ci        OH_AVSource_Destroy(source);
169da853ecaSopenharmony_ci        source = nullptr;
170da853ecaSopenharmony_ci    }
171da853ecaSopenharmony_ci    if (avBuffer != nullptr) {
172da853ecaSopenharmony_ci        OH_AVBuffer_Destroy(avBuffer);
173da853ecaSopenharmony_ci        avBuffer = nullptr;
174da853ecaSopenharmony_ci    }
175da853ecaSopenharmony_ci    if (trackFormat != nullptr) {
176da853ecaSopenharmony_ci        OH_AVFormat_Destroy(trackFormat);
177da853ecaSopenharmony_ci        trackFormat = nullptr;
178da853ecaSopenharmony_ci    }
179da853ecaSopenharmony_ci    if (sourceFormat != nullptr) {
180da853ecaSopenharmony_ci        OH_AVFormat_Destroy(sourceFormat);
181da853ecaSopenharmony_ci        sourceFormat = nullptr;
182da853ecaSopenharmony_ci    }
183da853ecaSopenharmony_ci    DemuxMoreTearDown();
184da853ecaSopenharmony_ci}
185da853ecaSopenharmony_ci} // namespace
186da853ecaSopenharmony_ci
187da853ecaSopenharmony_cinamespace {
188da853ecaSopenharmony_ci    static int64_t GetFileSize(const char *fileName)
189da853ecaSopenharmony_ci    {
190da853ecaSopenharmony_ci        int64_t fileSize = 0;
191da853ecaSopenharmony_ci        if (fileName != nullptr) {
192da853ecaSopenharmony_ci            struct stat fileStatus {};
193da853ecaSopenharmony_ci            if (stat(fileName, &fileStatus) == 0) {
194da853ecaSopenharmony_ci                fileSize = static_cast<int64_t>(fileStatus.st_size);
195da853ecaSopenharmony_ci            }
196da853ecaSopenharmony_ci        }
197da853ecaSopenharmony_ci        return fileSize;
198da853ecaSopenharmony_ci    }
199da853ecaSopenharmony_ci    void DemuxFuncWav(int i, int loop)
200da853ecaSopenharmony_ci    {
201da853ecaSopenharmony_ci        bool audioIsEnd = false;
202da853ecaSopenharmony_ci        OH_AVCodecBufferAttr bufferAttr;
203da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer_list[i], 0));
204da853ecaSopenharmony_ci        int index = 0;
205da853ecaSopenharmony_ci        while (!audioIsEnd) {
206da853ecaSopenharmony_ci            if (audioIsEnd && (index == OH_MediaType::MEDIA_TYPE_AUD)) {
207da853ecaSopenharmony_ci                continue;
208da853ecaSopenharmony_ci            }
209da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSampleBuffer(demuxer_list[i], index, avBuffer_list[i]));
210da853ecaSopenharmony_ci            ASSERT_NE(avBuffer_list[i], nullptr);
211da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVBuffer_GetBufferAttr(avBuffer_list[i], &bufferAttr));
212da853ecaSopenharmony_ci            if ((index == OH_MediaType::MEDIA_TYPE_AUD) &&
213da853ecaSopenharmony_ci             (bufferAttr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS)) {
214da853ecaSopenharmony_ci                audioIsEnd = true;
215da853ecaSopenharmony_ci            }
216da853ecaSopenharmony_ci        }
217da853ecaSopenharmony_ci    }
218da853ecaSopenharmony_ci    void DemuxFuncVtt(int i, int loop)
219da853ecaSopenharmony_ci    {
220da853ecaSopenharmony_ci        bool audioIsEnd = false;
221da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
222da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer_list[i], 0));
223da853ecaSopenharmony_ci        int index = 2;
224da853ecaSopenharmony_ci        while (!audioIsEnd) {
225da853ecaSopenharmony_ci            if (audioIsEnd && (index == OH_MediaType::MEDIA_TYPE_SUBTITLE)) {
226da853ecaSopenharmony_ci                continue;
227da853ecaSopenharmony_ci            }
228da853ecaSopenharmony_ci            ASSERT_NE(demuxer_list[i], nullptr);
229da853ecaSopenharmony_ci            ASSERT_NE(memory_list[i], nullptr);
230da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer_list[i], 0, memory_list[i], &attr));
231da853ecaSopenharmony_ci            ASSERT_NE(memory_list[i], nullptr);
232da853ecaSopenharmony_ci            if ((index == OH_MediaType::MEDIA_TYPE_SUBTITLE) &&
233da853ecaSopenharmony_ci             (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS)) {
234da853ecaSopenharmony_ci                audioIsEnd = true;
235da853ecaSopenharmony_ci            }
236da853ecaSopenharmony_ci        }
237da853ecaSopenharmony_ci    }
238da853ecaSopenharmony_ci    static void CheckAudioParam(OH_AVSource *audioSource, int &audioFrameAll)
239da853ecaSopenharmony_ci    {
240da853ecaSopenharmony_ci        int akeyCount = 0;
241da853ecaSopenharmony_ci        int tarckType = 0;
242da853ecaSopenharmony_ci        OH_AVCodecBufferAttr bufferAttr;
243da853ecaSopenharmony_ci        bool audioIsEnd = false;
244da853ecaSopenharmony_ci        int32_t count = 0;
245da853ecaSopenharmony_ci        int32_t rate = 0;
246da853ecaSopenharmony_ci        int64_t bitrate = 0;
247da853ecaSopenharmony_ci        int64_t layout = 0;
248da853ecaSopenharmony_ci        int32_t index = 0;
249da853ecaSopenharmony_ci        const char* mimeType = nullptr;
250da853ecaSopenharmony_ci        while (!audioIsEnd) {
251da853ecaSopenharmony_ci            trackFormat = OH_AVSource_GetTrackFormat(audioSource, index);
252da853ecaSopenharmony_ci            ASSERT_NE(trackFormat, nullptr);
253da853ecaSopenharmony_ci            ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
254da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSampleBuffer(demuxer, index, avBuffer));
255da853ecaSopenharmony_ci            ASSERT_NE(avBuffer, nullptr);
256da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVBuffer_GetBufferAttr(avBuffer, &bufferAttr));
257da853ecaSopenharmony_ci            if (tarckType == OH_MediaType::MEDIA_TYPE_AUD) {
258da853ecaSopenharmony_ci                ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
259da853ecaSopenharmony_ci                ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, &rate));
260da853ecaSopenharmony_ci                ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, &count));
261da853ecaSopenharmony_ci                ASSERT_TRUE(OH_AVFormat_GetLongValue(trackFormat, OH_MD_KEY_CHANNEL_LAYOUT, &layout));
262da853ecaSopenharmony_ci                ASSERT_TRUE(OH_AVFormat_GetLongValue(trackFormat, OH_MD_KEY_BITRATE, &bitrate));
263da853ecaSopenharmony_ci                if (bufferAttr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
264da853ecaSopenharmony_ci                    audioIsEnd = true;
265da853ecaSopenharmony_ci                    cout << audioFrameAll << "    audio is end !!!!!!!!!!!!!!!" << endl;
266da853ecaSopenharmony_ci                    continue;
267da853ecaSopenharmony_ci                }
268da853ecaSopenharmony_ci                audioFrameAll++;
269da853ecaSopenharmony_ci                if (bufferAttr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_SYNC_FRAME) {
270da853ecaSopenharmony_ci                    akeyCount++;
271da853ecaSopenharmony_ci                }
272da853ecaSopenharmony_ci            }
273da853ecaSopenharmony_ci        }
274da853ecaSopenharmony_ci        if (count == 1) {
275da853ecaSopenharmony_ci            ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_AUDIO_G711MU));
276da853ecaSopenharmony_ci            ASSERT_EQ(layout, LAYOUTMONO);
277da853ecaSopenharmony_ci            ASSERT_EQ(rate, SAMPLERATEMONO);
278da853ecaSopenharmony_ci            ASSERT_EQ(count, COUNTMONO);
279da853ecaSopenharmony_ci            ASSERT_EQ(bitrate, BITRATEMONO);
280da853ecaSopenharmony_ci        } else {
281da853ecaSopenharmony_ci            ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_AUDIO_G711MU));
282da853ecaSopenharmony_ci            ASSERT_EQ(layout, LAYOUTDUAL);
283da853ecaSopenharmony_ci            ASSERT_EQ(rate, SAMPLERATEDUAL);
284da853ecaSopenharmony_ci            ASSERT_EQ(count, COUNTDUAL);
285da853ecaSopenharmony_ci            ASSERT_EQ(bitrate, BITRATEDUAL);
286da853ecaSopenharmony_ci        }
287da853ecaSopenharmony_ci        cout << akeyCount << "---akeyCount---" << endl;
288da853ecaSopenharmony_ci    }
289da853ecaSopenharmony_ci
290da853ecaSopenharmony_ci    static void MyMapVtt(const int64_t attrPts, const char *fileV)
291da853ecaSopenharmony_ci    {
292da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attrV;
293da853ecaSopenharmony_ci        sourceV = OH_AVSource_CreateWithURI(const_cast<char *>(fileV));
294da853ecaSopenharmony_ci        ASSERT_NE(sourceV, nullptr);
295da853ecaSopenharmony_ci        demuxerV = OH_AVDemuxer_CreateWithSource(sourceV);
296da853ecaSopenharmony_ci        ASSERT_NE(demuxerV, nullptr);
297da853ecaSopenharmony_ci        const char* mimeTypeV = nullptr;
298da853ecaSopenharmony_ci        sourceFormatV = OH_AVSource_GetSourceFormat(sourceV);
299da853ecaSopenharmony_ci        trackFormatV = OH_AVSource_GetTrackFormat(sourceV, 0);
300da853ecaSopenharmony_ci        ASSERT_NE(trackFormatV, nullptr);
301da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormatV, OH_MD_KEY_CODEC_MIME, &mimeTypeV));
302da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeTypeV, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
303da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormatV, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
304da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
305da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxerV, 0));
306da853ecaSopenharmony_ci        int tarckTypeV = 0;
307da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormatV, OH_MD_KEY_TRACK_TYPE, &tarckTypeV));
308da853ecaSopenharmony_ci        ASSERT_EQ(tarckTypeV, OH_MediaType::MEDIA_TYPE_SUBTITLE);
309da853ecaSopenharmony_ci        if (attrPts > 0) {
310da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxerV, attrPts / ATTRPTS,
311da853ecaSopenharmony_ci                OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
312da853ecaSopenharmony_ci        }
313da853ecaSopenharmony_ci        bool islast = true;
314da853ecaSopenharmony_ci        while (islast) {
315da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxerV, 0, memoryV, &attrV));
316da853ecaSopenharmony_ci            if (attrV.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
317da853ecaSopenharmony_ci                islast = false;
318da853ecaSopenharmony_ci            }
319da853ecaSopenharmony_ci            myMap.insert(pair<int64_t, int32_t>(attrV.pts, attrV.size));
320da853ecaSopenharmony_ci        }
321da853ecaSopenharmony_ci    }
322da853ecaSopenharmony_ci    /**
323da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_TIMED_META_INNER_FUNC_0110
324da853ecaSopenharmony_ci     * @tc.name      : demuxer timed metadata with 1 meta track and video track uri-meta track at 0
325da853ecaSopenharmony_ci     * @tc.desc      : func test
326da853ecaSopenharmony_ci     */
327da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_TIMED_META_INNER_FUNC_0110, TestSize.Level1)
328da853ecaSopenharmony_ci    {
329da853ecaSopenharmony_ci        auto demuxerSample = make_unique<InnerDemuxerSample>();
330da853ecaSopenharmony_ci        const char *uri = "http://192.168.3.11:8080/share/Timedmetadata1Track0.mp4";
331da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->InitWithFile(uri, false), AVCS_ERR_OK);
332da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->CheckHasTimedMeta(), 1);
333da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->CheckTimedMetaFormat(0, 1), 0);
334da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->CheckTimedMeta(0), 0);
335da853ecaSopenharmony_ci    }
336da853ecaSopenharmony_ci
337da853ecaSopenharmony_ci    /**
338da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_TIMED_META_INNER_FUNC_0120
339da853ecaSopenharmony_ci     * @tc.name      : demuxer timed metadata with 1 meta track and video track uri-meta track at 1
340da853ecaSopenharmony_ci     * @tc.desc      : func test
341da853ecaSopenharmony_ci     */
342da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_TIMED_META_INNER_FUNC_0120, TestSize.Level1)
343da853ecaSopenharmony_ci    {
344da853ecaSopenharmony_ci        auto demuxerSample = make_unique<InnerDemuxerSample>();
345da853ecaSopenharmony_ci        const char *uri = "http://192.168.3.11:8080/share/Timedmetadata1Track1.mp4";
346da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->InitWithFile(uri, false), AVCS_ERR_OK);
347da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->CheckHasTimedMeta(), 1);
348da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->CheckTimedMetaFormat(1, 0), 0);
349da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->CheckTimedMeta(1), 0);
350da853ecaSopenharmony_ci    }
351da853ecaSopenharmony_ci
352da853ecaSopenharmony_ci    /**
353da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_TIMED_META_INNER_FUNC_0130
354da853ecaSopenharmony_ci     * @tc.name      : demuxer timed metadata with 1 meta track and video track uri-meta track at 2
355da853ecaSopenharmony_ci     * @tc.desc      : func test
356da853ecaSopenharmony_ci     */
357da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_TIMED_META_INNER_FUNC_0130, TestSize.Level1)
358da853ecaSopenharmony_ci    {
359da853ecaSopenharmony_ci        auto demuxerSample = make_unique<InnerDemuxerSample>();
360da853ecaSopenharmony_ci        const char *uri = "http://192.168.3.11:8080/share/Timedmetadata1Track2.mp4";
361da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->InitWithFile(uri, false), AVCS_ERR_OK);
362da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->CheckHasTimedMeta(), 1);
363da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->CheckTimedMetaFormat(2, 0), 0);
364da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->CheckTimedMeta(2), 0);
365da853ecaSopenharmony_ci    }
366da853ecaSopenharmony_ci
367da853ecaSopenharmony_ci    /**
368da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_TIMED_META_INNER_FUNC_0140
369da853ecaSopenharmony_ci     * @tc.name      : demuxer timed metadata with 2 meta track and video track uri
370da853ecaSopenharmony_ci     * @tc.desc      : func test
371da853ecaSopenharmony_ci     */
372da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_TIMED_META_INNER_FUNC_0140, TestSize.Level1)
373da853ecaSopenharmony_ci    {
374da853ecaSopenharmony_ci        auto demuxerSample = make_unique<InnerDemuxerSample>();
375da853ecaSopenharmony_ci        const char *uri = "http://192.168.3.11:8080/share/Timedmetadata2Track2.mp4";
376da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->InitWithFile(uri, false), AVCS_ERR_OK);
377da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->CheckHasTimedMeta(), 1);
378da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->CheckTimedMetaFormat(2, 0), 0);
379da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->CheckTimedMetaFormat(3, 0), 0);
380da853ecaSopenharmony_ci        ASSERT_EQ(demuxerSample->CheckTimedMeta(3), 0);
381da853ecaSopenharmony_ci    }
382da853ecaSopenharmony_ci    /**
383da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_NET_001
384da853ecaSopenharmony_ci     * @tc.name      : create 16 instances repeat create-destory with wav file
385da853ecaSopenharmony_ci     * @tc.desc      : function test
386da853ecaSopenharmony_ci     */
387da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_NET_001, TestSize.Level2)
388da853ecaSopenharmony_ci    {
389da853ecaSopenharmony_ci        int num = 0;
390da853ecaSopenharmony_ci        int len = 256;
391da853ecaSopenharmony_ci        while (num < 10) {
392da853ecaSopenharmony_ci            num++;
393da853ecaSopenharmony_ci            vector<std::thread> vecThread;
394da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
395da853ecaSopenharmony_ci                char file[256] = {};
396da853ecaSopenharmony_ci                sprintf_s(file, len, "/data/test/media/16/%d_wav_audio_test_202406290859.wav", i);
397da853ecaSopenharmony_ci                g_fdList[i] = open(file, O_RDONLY);
398da853ecaSopenharmony_ci                int64_t size = GetFileSize(file);
399da853ecaSopenharmony_ci                cout << file << "----------------------" << g_fdList[i] << "---------" << size << endl;
400da853ecaSopenharmony_ci                avBuffer_list[i] = OH_AVBuffer_Create(size);
401da853ecaSopenharmony_ci                ASSERT_NE(avBuffer_list[i], nullptr);
402da853ecaSopenharmony_ci                source_list[i] = OH_AVSource_CreateWithFD(g_fdList[i], 0, size);
403da853ecaSopenharmony_ci                ASSERT_NE(source_list[i], nullptr);
404da853ecaSopenharmony_ci                demuxer_list[i] = OH_AVDemuxer_CreateWithSource(source_list[i]);
405da853ecaSopenharmony_ci                ASSERT_NE(demuxer_list[i], nullptr);
406da853ecaSopenharmony_ci                vecThread.emplace_back(DemuxFuncWav, i, num);
407da853ecaSopenharmony_ci            }
408da853ecaSopenharmony_ci            for (auto &val : vecThread) {
409da853ecaSopenharmony_ci                val.join();
410da853ecaSopenharmony_ci            }
411da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
412da853ecaSopenharmony_ci                if (demuxer_list[i] != nullptr) {
413da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_Destroy(demuxer_list[i]));
414da853ecaSopenharmony_ci                    demuxer_list[i] = nullptr;
415da853ecaSopenharmony_ci                }
416da853ecaSopenharmony_ci                if (source_list[i] != nullptr) {
417da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVSource_Destroy(source_list[i]));
418da853ecaSopenharmony_ci                    source_list[i] = nullptr;
419da853ecaSopenharmony_ci                }
420da853ecaSopenharmony_ci                if (avBuffer_list[i] != nullptr) {
421da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVBuffer_Destroy(avBuffer_list[i]));
422da853ecaSopenharmony_ci                    avBuffer_list[i] = nullptr;
423da853ecaSopenharmony_ci                }
424da853ecaSopenharmony_ci                std::cout << i << "            finish Destroy!!!!" << std::endl;
425da853ecaSopenharmony_ci                close(g_fdList[i]);
426da853ecaSopenharmony_ci            }
427da853ecaSopenharmony_ci            cout << "num: " << num << endl;
428da853ecaSopenharmony_ci        }
429da853ecaSopenharmony_ci    }
430da853ecaSopenharmony_ci
431da853ecaSopenharmony_ci    /**
432da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_NET_002
433da853ecaSopenharmony_ci     * @tc.name      : create 16 instances repeat create-destory with wav network file
434da853ecaSopenharmony_ci     * @tc.desc      : function test
435da853ecaSopenharmony_ci     */
436da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_NET_002, TestSize.Level3)
437da853ecaSopenharmony_ci    {
438da853ecaSopenharmony_ci        int num = 0;
439da853ecaSopenharmony_ci        int sizeinfo = 421888;
440da853ecaSopenharmony_ci        while (num < 10) {
441da853ecaSopenharmony_ci            num++;
442da853ecaSopenharmony_ci            vector<std::thread> vecThread;
443da853ecaSopenharmony_ci            const char *uri = "http://192.168.3.11:8080/share/audio/audio/wav_audio_test_202406290859.wav";
444da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
445da853ecaSopenharmony_ci                avBuffer_list[i] = OH_AVBuffer_Create(sizeinfo);
446da853ecaSopenharmony_ci                ASSERT_NE(avBuffer_list[i], nullptr);
447da853ecaSopenharmony_ci                cout << i << "  uri:  " << uri << endl;
448da853ecaSopenharmony_ci                source_list[i] = OH_AVSource_CreateWithURI(const_cast<char *>(uri));
449da853ecaSopenharmony_ci                ASSERT_NE(source_list[i], nullptr);
450da853ecaSopenharmony_ci                demuxer_list[i] = OH_AVDemuxer_CreateWithSource(source_list[i]);
451da853ecaSopenharmony_ci                ASSERT_NE(demuxer_list[i], nullptr);
452da853ecaSopenharmony_ci                vecThread.emplace_back(DemuxFuncWav, i, num);
453da853ecaSopenharmony_ci            }
454da853ecaSopenharmony_ci            for (auto &val : vecThread) {
455da853ecaSopenharmony_ci                val.join();
456da853ecaSopenharmony_ci            }
457da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
458da853ecaSopenharmony_ci                if (demuxer_list[i] != nullptr) {
459da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_Destroy(demuxer_list[i]));
460da853ecaSopenharmony_ci                    demuxer_list[i] = nullptr;
461da853ecaSopenharmony_ci                }
462da853ecaSopenharmony_ci                if (source_list[i] != nullptr) {
463da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVSource_Destroy(source_list[i]));
464da853ecaSopenharmony_ci                    source_list[i] = nullptr;
465da853ecaSopenharmony_ci                }
466da853ecaSopenharmony_ci                if (avBuffer_list[i] != nullptr) {
467da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVBuffer_Destroy(avBuffer_list[i]));
468da853ecaSopenharmony_ci                    avBuffer_list[i] = nullptr;
469da853ecaSopenharmony_ci                }
470da853ecaSopenharmony_ci                std::cout << i << "            finish Destroy!!!!" << std::endl;
471da853ecaSopenharmony_ci            }
472da853ecaSopenharmony_ci            cout << "num: " << num << endl;
473da853ecaSopenharmony_ci        }
474da853ecaSopenharmony_ci    }
475da853ecaSopenharmony_ci    /**
476da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_NET_003
477da853ecaSopenharmony_ci     * @tc.name      : create pcm-mulaw wav demuxer with network file
478da853ecaSopenharmony_ci     * @tc.desc      : function test
479da853ecaSopenharmony_ci     */
480da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_NET_003, TestSize.Level2)
481da853ecaSopenharmony_ci    {
482da853ecaSopenharmony_ci        int audioFrame = 0;
483da853ecaSopenharmony_ci        int sizeinfo = 421888;
484da853ecaSopenharmony_ci        const char *uri = "http://192.168.3.11:8080/share/audio/audio/wav_audio_test_202406290859.wav";
485da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithURI(const_cast<char *>(uri));
486da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
487da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
488da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
489da853ecaSopenharmony_ci        avBuffer = OH_AVBuffer_Create(sizeinfo);
490da853ecaSopenharmony_ci        ASSERT_NE(avBuffer, nullptr);
491da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
492da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
493da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
494da853ecaSopenharmony_ci        for (int32_t index = 0; index < g_trackCount; index++) {
495da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, index));
496da853ecaSopenharmony_ci        }
497da853ecaSopenharmony_ci        CheckAudioParam(source, audioFrame);
498da853ecaSopenharmony_ci        ASSERT_EQ(103, audioFrame);
499da853ecaSopenharmony_ci    }
500da853ecaSopenharmony_ci    /**
501da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_NET_004
502da853ecaSopenharmony_ci     * @tc.name      : create pcm-mulaw wav demuxer with Mono channel uri file
503da853ecaSopenharmony_ci     * @tc.desc      : function test
504da853ecaSopenharmony_ci     */
505da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_NET_004, TestSize.Level2)
506da853ecaSopenharmony_ci    {
507da853ecaSopenharmony_ci        int sizeinfo = 28672;
508da853ecaSopenharmony_ci        int audioFrame = 0;
509da853ecaSopenharmony_ci        const char *uri = "http://192.168.3.11:8080/share/audio/audio/7FBD5E21-503C-41A8-83B4-34548FC01562.wav";
510da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithURI(const_cast<char *>(uri));
511da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
512da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
513da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
514da853ecaSopenharmony_ci        avBuffer = OH_AVBuffer_Create(sizeinfo);
515da853ecaSopenharmony_ci        ASSERT_NE(avBuffer, nullptr);
516da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
517da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
518da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
519da853ecaSopenharmony_ci        for (int32_t index = 0; index < g_trackCount; index++) {
520da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, index));
521da853ecaSopenharmony_ci        }
522da853ecaSopenharmony_ci        CheckAudioParam(source, audioFrame);
523da853ecaSopenharmony_ci        ASSERT_EQ(7, audioFrame);
524da853ecaSopenharmony_ci    }
525da853ecaSopenharmony_ci    /**
526da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_001
527da853ecaSopenharmony_ci     * @tc.name      : create 16 instances repeat create-destory with vtt file
528da853ecaSopenharmony_ci     * @tc.desc      : function test
529da853ecaSopenharmony_ci     */
530da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_001, TestSize.Level3)
531da853ecaSopenharmony_ci    {
532da853ecaSopenharmony_ci        int num = 0;
533da853ecaSopenharmony_ci        int len = 256;
534da853ecaSopenharmony_ci        while (num < 10) {
535da853ecaSopenharmony_ci            num++;
536da853ecaSopenharmony_ci            vector<std::thread> vecThread;
537da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
538da853ecaSopenharmony_ci                memory_list[i] = OH_AVMemory_Create(g_width * g_height);
539da853ecaSopenharmony_ci                char file[256] = {};
540da853ecaSopenharmony_ci                sprintf_s(file, len, "/data/test/media/16/%d_webvtt_test.vtt", i);
541da853ecaSopenharmony_ci                g_fdList[i] = open(file, O_RDONLY);
542da853ecaSopenharmony_ci                int64_t size = GetFileSize(file);
543da853ecaSopenharmony_ci                cout << file << "----------------------" << g_fdList[i] << "---------" << size << endl;
544da853ecaSopenharmony_ci
545da853ecaSopenharmony_ci                source_list[i] = OH_AVSource_CreateWithFD(g_fdList[i], 0, size);
546da853ecaSopenharmony_ci                ASSERT_NE(source_list[i], nullptr);
547da853ecaSopenharmony_ci
548da853ecaSopenharmony_ci                demuxer_list[i] = OH_AVDemuxer_CreateWithSource(source_list[i]);
549da853ecaSopenharmony_ci                ASSERT_NE(demuxer_list[i], nullptr);
550da853ecaSopenharmony_ci                vecThread.emplace_back(DemuxFuncVtt, i, num);
551da853ecaSopenharmony_ci            }
552da853ecaSopenharmony_ci            for (auto &val : vecThread) {
553da853ecaSopenharmony_ci                val.join();
554da853ecaSopenharmony_ci            }
555da853ecaSopenharmony_ci
556da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
557da853ecaSopenharmony_ci                if (demuxer_list[i] != nullptr) {
558da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_Destroy(demuxer_list[i]));
559da853ecaSopenharmony_ci                    demuxer_list[i] = nullptr;
560da853ecaSopenharmony_ci                }
561da853ecaSopenharmony_ci
562da853ecaSopenharmony_ci                if (source_list[i] != nullptr) {
563da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVSource_Destroy(source_list[i]));
564da853ecaSopenharmony_ci                    source_list[i] = nullptr;
565da853ecaSopenharmony_ci                }
566da853ecaSopenharmony_ci                if (memory_list[i] != nullptr) {
567da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVMemory_Destroy(memory_list[i]));
568da853ecaSopenharmony_ci                    memory_list[i] = nullptr;
569da853ecaSopenharmony_ci                }
570da853ecaSopenharmony_ci                std::cout << i << "            finish Destroy!!!!" << std::endl;
571da853ecaSopenharmony_ci
572da853ecaSopenharmony_ci                close(g_fdList[i]);
573da853ecaSopenharmony_ci            }
574da853ecaSopenharmony_ci            cout << "num: " << num << endl;
575da853ecaSopenharmony_ci        }
576da853ecaSopenharmony_ci    }
577da853ecaSopenharmony_ci
578da853ecaSopenharmony_ci    /**
579da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_002
580da853ecaSopenharmony_ci     * @tc.name      : create 16 instances repeat create-destory with vtt uri
581da853ecaSopenharmony_ci     * @tc.desc      : function test
582da853ecaSopenharmony_ci     */
583da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_002, TestSize.Level3)
584da853ecaSopenharmony_ci    {
585da853ecaSopenharmony_ci        int num = 0;
586da853ecaSopenharmony_ci        while (num < 10) {
587da853ecaSopenharmony_ci            num++;
588da853ecaSopenharmony_ci            vector<std::thread> vecThread;
589da853ecaSopenharmony_ci            const char *uri = "http://192.168.3.11:8080/share/audio/webvtt_test.vtt";
590da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
591da853ecaSopenharmony_ci                memory_list[i] = OH_AVMemory_Create(g_width * g_height);
592da853ecaSopenharmony_ci                cout << i << "  uri:  " << uri << endl;
593da853ecaSopenharmony_ci                source_list[i] = OH_AVSource_CreateWithURI(const_cast<char *>(uri));
594da853ecaSopenharmony_ci                ASSERT_NE(source_list[i], nullptr);
595da853ecaSopenharmony_ci                demuxer_list[i] = OH_AVDemuxer_CreateWithSource(source_list[i]);
596da853ecaSopenharmony_ci                ASSERT_NE(demuxer_list[i], nullptr);
597da853ecaSopenharmony_ci                vecThread.emplace_back(DemuxFuncVtt, i, num);
598da853ecaSopenharmony_ci            }
599da853ecaSopenharmony_ci            for (auto &val : vecThread) {
600da853ecaSopenharmony_ci                val.join();
601da853ecaSopenharmony_ci            }
602da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
603da853ecaSopenharmony_ci                if (demuxer_list[i] != nullptr) {
604da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_Destroy(demuxer_list[i]));
605da853ecaSopenharmony_ci                    demuxer_list[i] = nullptr;
606da853ecaSopenharmony_ci                }
607da853ecaSopenharmony_ci
608da853ecaSopenharmony_ci                if (source_list[i] != nullptr) {
609da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVSource_Destroy(source_list[i]));
610da853ecaSopenharmony_ci                    source_list[i] = nullptr;
611da853ecaSopenharmony_ci                }
612da853ecaSopenharmony_ci                if (memory_list[i] != nullptr) {
613da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVMemory_Destroy(memory_list[i]));
614da853ecaSopenharmony_ci                    memory_list[i] = nullptr;
615da853ecaSopenharmony_ci                }
616da853ecaSopenharmony_ci                std::cout << i << "            finish Destroy!!!!" << std::endl;
617da853ecaSopenharmony_ci            }
618da853ecaSopenharmony_ci            cout << "num: " << num << endl;
619da853ecaSopenharmony_ci        }
620da853ecaSopenharmony_ci    }
621da853ecaSopenharmony_ci    /**
622da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_003
623da853ecaSopenharmony_ci     * @tc.name      : create 16 instances repeat create-destory with vtt MP4 file
624da853ecaSopenharmony_ci     * @tc.desc      : function test
625da853ecaSopenharmony_ci     */
626da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_003, TestSize.Level3)
627da853ecaSopenharmony_ci    {
628da853ecaSopenharmony_ci        int num = 0;
629da853ecaSopenharmony_ci        int len = 256;
630da853ecaSopenharmony_ci        while (num < 10) {
631da853ecaSopenharmony_ci            num++;
632da853ecaSopenharmony_ci            vector<std::thread> vecThread;
633da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
634da853ecaSopenharmony_ci                memory_list[i] = OH_AVMemory_Create(g_width * g_height);
635da853ecaSopenharmony_ci                char file[256] = {};
636da853ecaSopenharmony_ci                sprintf_s(file, len, "/data/test/media/16/%d_subtitle_webvtt_en_GB_15.mp4", i);
637da853ecaSopenharmony_ci                g_fdList[i] = open(file, O_RDONLY);
638da853ecaSopenharmony_ci                int64_t size = GetFileSize(file);
639da853ecaSopenharmony_ci                cout << file << "----------------------" << g_fdList[i] << "---------" << size << endl;
640da853ecaSopenharmony_ci
641da853ecaSopenharmony_ci                source_list[i] = OH_AVSource_CreateWithFD(g_fdList[i], 0, size);
642da853ecaSopenharmony_ci                ASSERT_NE(source_list[i], nullptr);
643da853ecaSopenharmony_ci
644da853ecaSopenharmony_ci                demuxer_list[i] = OH_AVDemuxer_CreateWithSource(source_list[i]);
645da853ecaSopenharmony_ci                ASSERT_NE(demuxer_list[i], nullptr);
646da853ecaSopenharmony_ci                vecThread.emplace_back(DemuxFuncVtt, i, num);
647da853ecaSopenharmony_ci            }
648da853ecaSopenharmony_ci            for (auto &val : vecThread) {
649da853ecaSopenharmony_ci                val.join();
650da853ecaSopenharmony_ci            }
651da853ecaSopenharmony_ci
652da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
653da853ecaSopenharmony_ci                if (demuxer_list[i] != nullptr) {
654da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_Destroy(demuxer_list[i]));
655da853ecaSopenharmony_ci                    demuxer_list[i] = nullptr;
656da853ecaSopenharmony_ci                }
657da853ecaSopenharmony_ci
658da853ecaSopenharmony_ci                if (source_list[i] != nullptr) {
659da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVSource_Destroy(source_list[i]));
660da853ecaSopenharmony_ci                    source_list[i] = nullptr;
661da853ecaSopenharmony_ci                }
662da853ecaSopenharmony_ci                if (memory_list[i] != nullptr) {
663da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVMemory_Destroy(memory_list[i]));
664da853ecaSopenharmony_ci                    memory_list[i] = nullptr;
665da853ecaSopenharmony_ci                }
666da853ecaSopenharmony_ci                std::cout << i << "            finish Destroy!!!!" << std::endl;
667da853ecaSopenharmony_ci
668da853ecaSopenharmony_ci                close(g_fdList[i]);
669da853ecaSopenharmony_ci            }
670da853ecaSopenharmony_ci            cout << "num: " << num << endl;
671da853ecaSopenharmony_ci        }
672da853ecaSopenharmony_ci    }
673da853ecaSopenharmony_ci
674da853ecaSopenharmony_ci    /**
675da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_004
676da853ecaSopenharmony_ci     * @tc.name      : create 16 instances repeat create-destory with vtt MP4 uri
677da853ecaSopenharmony_ci     * @tc.desc      : function test
678da853ecaSopenharmony_ci     */
679da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_004, TestSize.Level3)
680da853ecaSopenharmony_ci    {
681da853ecaSopenharmony_ci        int num = 0;
682da853ecaSopenharmony_ci        while (num < 10) {
683da853ecaSopenharmony_ci            num++;
684da853ecaSopenharmony_ci            vector<std::thread> vecThread;
685da853ecaSopenharmony_ci            const char *uri = "http://192.168.3.11:8080/share/audio/subtitle_webvtt_en_GB_15.mp4";
686da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
687da853ecaSopenharmony_ci                memory_list[i] = OH_AVMemory_Create(g_width * g_height);
688da853ecaSopenharmony_ci                cout << i << "  uri:  " << uri << endl;
689da853ecaSopenharmony_ci                source_list[i] = OH_AVSource_CreateWithURI(const_cast<char *>(uri));
690da853ecaSopenharmony_ci                ASSERT_NE(source_list[i], nullptr);
691da853ecaSopenharmony_ci                demuxer_list[i] = OH_AVDemuxer_CreateWithSource(source_list[i]);
692da853ecaSopenharmony_ci                ASSERT_NE(demuxer_list[i], nullptr);
693da853ecaSopenharmony_ci                vecThread.emplace_back(DemuxFuncVtt, i, num);
694da853ecaSopenharmony_ci            }
695da853ecaSopenharmony_ci            for (auto &val : vecThread) {
696da853ecaSopenharmony_ci                val.join();
697da853ecaSopenharmony_ci            }
698da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
699da853ecaSopenharmony_ci                if (demuxer_list[i] != nullptr) {
700da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_Destroy(demuxer_list[i]));
701da853ecaSopenharmony_ci                    demuxer_list[i] = nullptr;
702da853ecaSopenharmony_ci                }
703da853ecaSopenharmony_ci
704da853ecaSopenharmony_ci                if (source_list[i] != nullptr) {
705da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVSource_Destroy(source_list[i]));
706da853ecaSopenharmony_ci                    source_list[i] = nullptr;
707da853ecaSopenharmony_ci                }
708da853ecaSopenharmony_ci                if (memory_list[i] != nullptr) {
709da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVMemory_Destroy(memory_list[i]));
710da853ecaSopenharmony_ci                    memory_list[i] = nullptr;
711da853ecaSopenharmony_ci                }
712da853ecaSopenharmony_ci                std::cout << i << "            finish Destroy!!!!" << std::endl;
713da853ecaSopenharmony_ci            }
714da853ecaSopenharmony_ci            cout << "num: " << num << endl;
715da853ecaSopenharmony_ci        }
716da853ecaSopenharmony_ci    }
717da853ecaSopenharmony_ci    /**
718da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_005
719da853ecaSopenharmony_ci     * @tc.name      : create vtt Mp4 demuxer with uri file and read
720da853ecaSopenharmony_ci     * @tc.desc      : function test
721da853ecaSopenharmony_ci     */
722da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_005, TestSize.Level0)
723da853ecaSopenharmony_ci    {
724da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
725da853ecaSopenharmony_ci        const char* mimeType = nullptr;
726da853ecaSopenharmony_ci        const char *uri = "http://192.168.3.11:8080/share/audio/subtitle_webvtt_en_GB_15.mp4";
727da853ecaSopenharmony_ci        const char *fileV = "http://192.168.3.11:8080/share/audio/subtitle_webvtt_en_GB_15.vtt";
728da853ecaSopenharmony_ci        cout << uri << "------" << endl;
729da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithURI(const_cast<char *>(uri));
730da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
731da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
732da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
733da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
734da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
735da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
736da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
737da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
738da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
739da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
740da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
741da853ecaSopenharmony_ci        int tarckType = 0;
742da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
743da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
744da853ecaSopenharmony_ci        MyMapVtt(0, fileV);
745da853ecaSopenharmony_ci        std::map<int64_t, int32_t>::iterator pair;
746da853ecaSopenharmony_ci        for (pair = myMap.begin(); pair != myMap.end(); ++pair) {
747da853ecaSopenharmony_ci            std::cout << pair->first << " => " << pair->second << '\n';
748da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, pair->first / ATTRPTS,
749da853ecaSopenharmony_ci                OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
750da853ecaSopenharmony_ci            ASSERT_NE(memory, nullptr);
751da853ecaSopenharmony_ci            ASSERT_NE(demuxer, nullptr);
752da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
753da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
754da853ecaSopenharmony_ci                break;
755da853ecaSopenharmony_ci            }
756da853ecaSopenharmony_ci            ASSERT_EQ(pair->second, attr.size);
757da853ecaSopenharmony_ci        }
758da853ecaSopenharmony_ci    }
759da853ecaSopenharmony_ci    /**
760da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_006
761da853ecaSopenharmony_ci     * @tc.name      : create vtt Mp4 demuxer with uri file and forward back seek+read
762da853ecaSopenharmony_ci     * @tc.desc      : function test
763da853ecaSopenharmony_ci     */
764da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_006, TestSize.Level0)
765da853ecaSopenharmony_ci    {
766da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
767da853ecaSopenharmony_ci        const char* mimeType = nullptr;
768da853ecaSopenharmony_ci        const char *uri = "http://192.168.3.11:8080/share/audio/subtitle_webvtt_en_GB_15.mp4";
769da853ecaSopenharmony_ci        const char *fileV = "http://192.168.3.11:8080/share/audio/subtitle_webvtt_en_GB_15.vtt";
770da853ecaSopenharmony_ci        cout << uri << "------" << endl;
771da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithURI(const_cast<char *>(uri));
772da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
773da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
774da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
775da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
776da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
777da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
778da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
779da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
780da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
781da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
782da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
783da853ecaSopenharmony_ci        int tarckType = 0;
784da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
785da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
786da853ecaSopenharmony_ci        for (int index = 0; index < 10; index++) {
787da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
788da853ecaSopenharmony_ci        }
789da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, BITRATEMONOMP4 / ATTRPTS,
790da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
791da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
792da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, BITRATEDUALMP4 / ATTRPTS,
793da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
794da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
795da853ecaSopenharmony_ci        MyMapVtt(BITRATEDUALMP4, fileV);
796da853ecaSopenharmony_ci        std::map<int64_t, int32_t>::iterator pair;
797da853ecaSopenharmony_ci        for (pair = myMap.begin(); pair != myMap.end(); ++pair) {
798da853ecaSopenharmony_ci            std::cout << pair->first << " => " << pair->second << '\n';
799da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, pair->first / ATTRPTS,
800da853ecaSopenharmony_ci                OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
801da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
802da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
803da853ecaSopenharmony_ci                break;
804da853ecaSopenharmony_ci            }
805da853ecaSopenharmony_ci            ASSERT_EQ(pair->second, attr.size);
806da853ecaSopenharmony_ci        }
807da853ecaSopenharmony_ci    }
808da853ecaSopenharmony_ci
809da853ecaSopenharmony_ci        /**
810da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_007
811da853ecaSopenharmony_ci     * @tc.name      : create 16 instances repeat create-destory with vtt MP4 file
812da853ecaSopenharmony_ci     * @tc.desc      : function test
813da853ecaSopenharmony_ci     */
814da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_007, TestSize.Level3)
815da853ecaSopenharmony_ci    {
816da853ecaSopenharmony_ci        int num = 0;
817da853ecaSopenharmony_ci        int len = 256;
818da853ecaSopenharmony_ci        while (num < 10) {
819da853ecaSopenharmony_ci            num++;
820da853ecaSopenharmony_ci            vector<std::thread> vecThread;
821da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
822da853ecaSopenharmony_ci                memory_list[i] = OH_AVMemory_Create(g_width * g_height);
823da853ecaSopenharmony_ci                char file[256] = {};
824da853ecaSopenharmony_ci                sprintf_s(file, len, "/data/test/media/16/%d_subtitle_webvtt_zh_CN_14.mp4", i);
825da853ecaSopenharmony_ci                g_fdList[i] = open(file, O_RDONLY);
826da853ecaSopenharmony_ci                int64_t size = GetFileSize(file);
827da853ecaSopenharmony_ci                cout << file << "----------------------" << g_fdList[i] << "---------" << size << endl;
828da853ecaSopenharmony_ci
829da853ecaSopenharmony_ci                source_list[i] = OH_AVSource_CreateWithFD(g_fdList[i], 0, size);
830da853ecaSopenharmony_ci                ASSERT_NE(source_list[i], nullptr);
831da853ecaSopenharmony_ci
832da853ecaSopenharmony_ci                demuxer_list[i] = OH_AVDemuxer_CreateWithSource(source_list[i]);
833da853ecaSopenharmony_ci                ASSERT_NE(demuxer_list[i], nullptr);
834da853ecaSopenharmony_ci                vecThread.emplace_back(DemuxFuncVtt, i, num);
835da853ecaSopenharmony_ci            }
836da853ecaSopenharmony_ci            for (auto &val : vecThread) {
837da853ecaSopenharmony_ci                val.join();
838da853ecaSopenharmony_ci            }
839da853ecaSopenharmony_ci
840da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
841da853ecaSopenharmony_ci                if (demuxer_list[i] != nullptr) {
842da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_Destroy(demuxer_list[i]));
843da853ecaSopenharmony_ci                    demuxer_list[i] = nullptr;
844da853ecaSopenharmony_ci                }
845da853ecaSopenharmony_ci
846da853ecaSopenharmony_ci                if (source_list[i] != nullptr) {
847da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVSource_Destroy(source_list[i]));
848da853ecaSopenharmony_ci                    source_list[i] = nullptr;
849da853ecaSopenharmony_ci                }
850da853ecaSopenharmony_ci                if (memory_list[i] != nullptr) {
851da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVMemory_Destroy(memory_list[i]));
852da853ecaSopenharmony_ci                    memory_list[i] = nullptr;
853da853ecaSopenharmony_ci                }
854da853ecaSopenharmony_ci                std::cout << i << "            finish Destroy!!!!" << std::endl;
855da853ecaSopenharmony_ci
856da853ecaSopenharmony_ci                close(g_fdList[i]);
857da853ecaSopenharmony_ci            }
858da853ecaSopenharmony_ci            cout << "num: " << num << endl;
859da853ecaSopenharmony_ci        }
860da853ecaSopenharmony_ci    }
861da853ecaSopenharmony_ci
862da853ecaSopenharmony_ci    /**
863da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_008
864da853ecaSopenharmony_ci     * @tc.name      : create 16 instances repeat create-destory with vtt MP4 uri
865da853ecaSopenharmony_ci     * @tc.desc      : function test
866da853ecaSopenharmony_ci     */
867da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_008, TestSize.Level3)
868da853ecaSopenharmony_ci    {
869da853ecaSopenharmony_ci        int num = 0;
870da853ecaSopenharmony_ci        while (num < 10) {
871da853ecaSopenharmony_ci            num++;
872da853ecaSopenharmony_ci            vector<std::thread> vecThread;
873da853ecaSopenharmony_ci            const char *uri = "http://192.168.3.11:8080/share/audio/subtitle_webvtt_zh_CN_14.mp4";
874da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
875da853ecaSopenharmony_ci                memory_list[i] = OH_AVMemory_Create(g_width * g_height);
876da853ecaSopenharmony_ci                cout << i << "  uri:  " << uri << endl;
877da853ecaSopenharmony_ci                source_list[i] = OH_AVSource_CreateWithURI(const_cast<char *>(uri));
878da853ecaSopenharmony_ci                ASSERT_NE(source_list[i], nullptr);
879da853ecaSopenharmony_ci                demuxer_list[i] = OH_AVDemuxer_CreateWithSource(source_list[i]);
880da853ecaSopenharmony_ci                ASSERT_NE(demuxer_list[i], nullptr);
881da853ecaSopenharmony_ci                vecThread.emplace_back(DemuxFuncVtt, i, num);
882da853ecaSopenharmony_ci            }
883da853ecaSopenharmony_ci            for (auto &val : vecThread) {
884da853ecaSopenharmony_ci                val.join();
885da853ecaSopenharmony_ci            }
886da853ecaSopenharmony_ci            for (int i = 0; i < g_maxThread; i++) {
887da853ecaSopenharmony_ci                if (demuxer_list[i] != nullptr) {
888da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_Destroy(demuxer_list[i]));
889da853ecaSopenharmony_ci                    demuxer_list[i] = nullptr;
890da853ecaSopenharmony_ci                }
891da853ecaSopenharmony_ci
892da853ecaSopenharmony_ci                if (source_list[i] != nullptr) {
893da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVSource_Destroy(source_list[i]));
894da853ecaSopenharmony_ci                    source_list[i] = nullptr;
895da853ecaSopenharmony_ci                }
896da853ecaSopenharmony_ci                if (memory_list[i] != nullptr) {
897da853ecaSopenharmony_ci                    ASSERT_EQ(AV_ERR_OK, OH_AVMemory_Destroy(memory_list[i]));
898da853ecaSopenharmony_ci                    memory_list[i] = nullptr;
899da853ecaSopenharmony_ci                }
900da853ecaSopenharmony_ci                std::cout << i << "            finish Destroy!!!!" << std::endl;
901da853ecaSopenharmony_ci            }
902da853ecaSopenharmony_ci            cout << "num: " << num << endl;
903da853ecaSopenharmony_ci        }
904da853ecaSopenharmony_ci    }
905da853ecaSopenharmony_ci    /**
906da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_009
907da853ecaSopenharmony_ci     * @tc.name      : create vtt Mp4 demuxer with uri file and read
908da853ecaSopenharmony_ci     * @tc.desc      : function test
909da853ecaSopenharmony_ci     */
910da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_009, TestSize.Level0)
911da853ecaSopenharmony_ci    {
912da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
913da853ecaSopenharmony_ci        const char* mimeType = nullptr;
914da853ecaSopenharmony_ci        const char *uri = "http://192.168.3.11:8080/share/audio/subtitle_webvtt_zh_CN_14.mp4";
915da853ecaSopenharmony_ci        const char *fileV = "http://192.168.3.11:8080/share/audio/subtitle_webvtt_zh_CN_14.vtt";
916da853ecaSopenharmony_ci        cout << uri << "------" << endl;
917da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithURI(const_cast<char *>(uri));
918da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
919da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
920da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
921da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
922da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
923da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
924da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
925da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
926da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
927da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
928da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
929da853ecaSopenharmony_ci        int tarckType = 0;
930da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
931da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
932da853ecaSopenharmony_ci        MyMapVtt(0, fileV);
933da853ecaSopenharmony_ci        std::map<int64_t, int32_t>::iterator pair;
934da853ecaSopenharmony_ci        for (pair = myMap.begin(); pair != myMap.end(); ++pair) {
935da853ecaSopenharmony_ci            std::cout << pair->first << " => " << pair->second << '\n';
936da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, pair->first / ATTRPTS,
937da853ecaSopenharmony_ci                OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
938da853ecaSopenharmony_ci            ASSERT_NE(memory, nullptr);
939da853ecaSopenharmony_ci            ASSERT_NE(demuxer, nullptr);
940da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
941da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
942da853ecaSopenharmony_ci                break;
943da853ecaSopenharmony_ci            }
944da853ecaSopenharmony_ci            ASSERT_EQ(pair->second, attr.size);
945da853ecaSopenharmony_ci        }
946da853ecaSopenharmony_ci    }
947da853ecaSopenharmony_ci    /**
948da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_0010
949da853ecaSopenharmony_ci     * @tc.name      : create vtt Mp4 demuxer with uri file and forward back seek+read
950da853ecaSopenharmony_ci     * @tc.desc      : function test
951da853ecaSopenharmony_ci     */
952da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_0010, TestSize.Level0)
953da853ecaSopenharmony_ci    {
954da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
955da853ecaSopenharmony_ci        const char* mimeType = nullptr;
956da853ecaSopenharmony_ci        const char *uri = "http://192.168.3.11:8080/share/audio/subtitle_webvtt_zh_CN_14.mp4";
957da853ecaSopenharmony_ci        const char *fileV = "http://192.168.3.11:8080/share/audio/subtitle_webvtt_zh_CN_14.vtt";
958da853ecaSopenharmony_ci        cout << uri << "------" << endl;
959da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithURI(const_cast<char *>(uri));
960da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
961da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
962da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
963da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
964da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
965da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
966da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
967da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
968da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
969da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
970da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
971da853ecaSopenharmony_ci        int tarckType = 0;
972da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
973da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
974da853ecaSopenharmony_ci        for (int index = 0; index < 10; index++) {
975da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
976da853ecaSopenharmony_ci        }
977da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, BITRATEMONO14 / ATTRPTS,
978da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
979da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
980da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, BITRATEDUAL14 / ATTRPTS,
981da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
982da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
983da853ecaSopenharmony_ci        MyMapVtt(BITRATEDUAL14, fileV);
984da853ecaSopenharmony_ci        std::map<int64_t, int32_t>::iterator pair;
985da853ecaSopenharmony_ci        for (pair = myMap.begin(); pair != myMap.end(); ++pair) {
986da853ecaSopenharmony_ci            std::cout << pair->first << " => " << pair->second << '\n';
987da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, pair->first / ATTRPTS,
988da853ecaSopenharmony_ci                OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
989da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
990da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
991da853ecaSopenharmony_ci                break;
992da853ecaSopenharmony_ci            }
993da853ecaSopenharmony_ci            ASSERT_EQ(pair->second, attr.size);
994da853ecaSopenharmony_ci        }
995da853ecaSopenharmony_ci    }
996da853ecaSopenharmony_ci    /**
997da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_0011
998da853ecaSopenharmony_ci     * @tc.name      : create vtt demuxer with uri file and read
999da853ecaSopenharmony_ci     * @tc.desc      : function test
1000da853ecaSopenharmony_ci     */
1001da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_0011, TestSize.Level0)
1002da853ecaSopenharmony_ci    {
1003da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
1004da853ecaSopenharmony_ci        const char* mimeType = nullptr;
1005da853ecaSopenharmony_ci        int vttIndex = 1;
1006da853ecaSopenharmony_ci        int vttSubtitle = 0;
1007da853ecaSopenharmony_ci        const char *uri = "http://192.168.3.11:8080/share/audio/webvtt_test.vtt";
1008da853ecaSopenharmony_ci        cout << uri << "------" << endl;
1009da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithURI(const_cast<char *>(uri));
1010da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
1011da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
1012da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
1013da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
1014da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
1015da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
1016da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
1017da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
1018da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
1019da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
1020da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
1021da853ecaSopenharmony_ci        int tarckType = 0;
1022da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
1023da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
1024da853ecaSopenharmony_ci        while (true) {
1025da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1026da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
1027da853ecaSopenharmony_ci                cout << "   vtt is end !!!!!!!!!!!!!!!" << endl;
1028da853ecaSopenharmony_ci                break;
1029da853ecaSopenharmony_ci            }
1030da853ecaSopenharmony_ci            uint8_t *data = OH_AVMemory_GetAddr(memory);
1031da853ecaSopenharmony_ci            vttSubtitle = atoi(reinterpret_cast<const char*>(data));
1032da853ecaSopenharmony_ci            ASSERT_EQ(vttSubtitle, vttIndex);
1033da853ecaSopenharmony_ci            vttIndex++;
1034da853ecaSopenharmony_ci        }
1035da853ecaSopenharmony_ci    }
1036da853ecaSopenharmony_ci    /**
1037da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_0012
1038da853ecaSopenharmony_ci     * @tc.name      : create vtt demuxer with uri file and forward back seek+read
1039da853ecaSopenharmony_ci     * @tc.desc      : function test
1040da853ecaSopenharmony_ci     */
1041da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_0012, TestSize.Level0)
1042da853ecaSopenharmony_ci    {
1043da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
1044da853ecaSopenharmony_ci        const char* mimeType = nullptr;
1045da853ecaSopenharmony_ci        int vttIndex = 1;
1046da853ecaSopenharmony_ci        int vttSubtitle = 0;
1047da853ecaSopenharmony_ci        uint8_t *data = nullptr;
1048da853ecaSopenharmony_ci        const char *uri = "http://192.168.3.11:8080/share/audio/webvtt_test.vtt";
1049da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithURI(const_cast<char *>(uri));
1050da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
1051da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
1052da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
1053da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
1054da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
1055da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
1056da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
1057da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
1058da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
1059da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
1060da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
1061da853ecaSopenharmony_ci        int tarckType = 0;
1062da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
1063da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
1064da853ecaSopenharmony_ci        for (int index = 0; index < 8; index++) {
1065da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1066da853ecaSopenharmony_ci        }
1067da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, VTTSEEKBACK,
1068da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1069da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1070da853ecaSopenharmony_ci        data = OH_AVMemory_GetAddr(memory);
1071da853ecaSopenharmony_ci        vttSubtitle = atoi(reinterpret_cast<const char*>(data));
1072da853ecaSopenharmony_ci        vttIndex = 4;
1073da853ecaSopenharmony_ci        ASSERT_EQ(vttSubtitle, vttIndex);
1074da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, VTTSEEKFORWARD,
1075da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1076da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1077da853ecaSopenharmony_ci        data = OH_AVMemory_GetAddr(memory);
1078da853ecaSopenharmony_ci        vttSubtitle = atoi(reinterpret_cast<const char*>(data));
1079da853ecaSopenharmony_ci        vttIndex = 7;
1080da853ecaSopenharmony_ci        ASSERT_EQ(vttSubtitle, vttIndex);
1081da853ecaSopenharmony_ci        while (true) {
1082da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1083da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
1084da853ecaSopenharmony_ci                break;
1085da853ecaSopenharmony_ci            }
1086da853ecaSopenharmony_ci            data = OH_AVMemory_GetAddr(memory);
1087da853ecaSopenharmony_ci            vttSubtitle = atoi(reinterpret_cast<const char*>(data));
1088da853ecaSopenharmony_ci            vttIndex++;
1089da853ecaSopenharmony_ci            ASSERT_EQ(vttSubtitle, vttIndex);
1090da853ecaSopenharmony_ci        }
1091da853ecaSopenharmony_ci    }
1092da853ecaSopenharmony_ci    /**
1093da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_0013
1094da853ecaSopenharmony_ci     * @tc.name      : create vtt demuxer with Mp4 file and read
1095da853ecaSopenharmony_ci     * @tc.desc      : function test
1096da853ecaSopenharmony_ci     */
1097da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_0013, TestSize.Level0)
1098da853ecaSopenharmony_ci    {
1099da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
1100da853ecaSopenharmony_ci        const char *file = "/data/test/media/subtitle_webvtt_en_GB_15.mp4";
1101da853ecaSopenharmony_ci        const char *fileV = "/data/test/media/subtitle_webvtt_en_GB_15.vtt";
1102da853ecaSopenharmony_ci        int fd = open(file, O_RDONLY);
1103da853ecaSopenharmony_ci        int64_t size = GetFileSize(file);
1104da853ecaSopenharmony_ci        cout << file << "----------------------" << fd << "---------" << size << endl;
1105da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithFD(fd, 0, size);
1106da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
1107da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
1108da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
1109da853ecaSopenharmony_ci        const char* mimeType = nullptr;
1110da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
1111da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
1112da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
1113da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
1114da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
1115da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
1116da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
1117da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
1118da853ecaSopenharmony_ci        int tarckType = 0;
1119da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
1120da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
1121da853ecaSopenharmony_ci        MyMapVtt(0, fileV);
1122da853ecaSopenharmony_ci        std::map<int64_t, int32_t>::iterator pair;
1123da853ecaSopenharmony_ci        for (pair = myMap.begin(); pair != myMap.end(); ++pair) {
1124da853ecaSopenharmony_ci            std::cout << pair->first << " => " << pair->second << '\n';
1125da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, pair->first / ATTRPTS,
1126da853ecaSopenharmony_ci                OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1127da853ecaSopenharmony_ci            ASSERT_NE(memory, nullptr);
1128da853ecaSopenharmony_ci            ASSERT_NE(demuxer, nullptr);
1129da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1130da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
1131da853ecaSopenharmony_ci                break;
1132da853ecaSopenharmony_ci            }
1133da853ecaSopenharmony_ci            ASSERT_EQ(pair->second, attr.size);
1134da853ecaSopenharmony_ci        }
1135da853ecaSopenharmony_ci        close(fd);
1136da853ecaSopenharmony_ci    }
1137da853ecaSopenharmony_ci
1138da853ecaSopenharmony_ci    /**
1139da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_0014
1140da853ecaSopenharmony_ci     * @tc.name      : create vtt demuxer with Mp4 file and read
1141da853ecaSopenharmony_ci     * @tc.desc      : function test
1142da853ecaSopenharmony_ci     */
1143da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_0014, TestSize.Level0)
1144da853ecaSopenharmony_ci    {
1145da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
1146da853ecaSopenharmony_ci        const char *file = "/data/test/media/subtitle_webvtt_zh_CN_14.mp4";
1147da853ecaSopenharmony_ci        const char *fileV = "/data/test/media/subtitle_webvtt_zh_CN_14.vtt";
1148da853ecaSopenharmony_ci        int fd = open(file, O_RDONLY);
1149da853ecaSopenharmony_ci        int64_t size = GetFileSize(file);
1150da853ecaSopenharmony_ci        cout << file << "----------------------" << fd << "---------" << size << endl;
1151da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithFD(fd, 0, size);
1152da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
1153da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
1154da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
1155da853ecaSopenharmony_ci        const char* mimeType = nullptr;
1156da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
1157da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
1158da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
1159da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
1160da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
1161da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
1162da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
1163da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
1164da853ecaSopenharmony_ci        int tarckType = 0;
1165da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
1166da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
1167da853ecaSopenharmony_ci        MyMapVtt(0, fileV);
1168da853ecaSopenharmony_ci        std::map<int64_t, int32_t>::iterator pair;
1169da853ecaSopenharmony_ci        for (pair = myMap.begin(); pair != myMap.end(); ++pair) {
1170da853ecaSopenharmony_ci            std::cout << pair->first << " => " << pair->second << '\n';
1171da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, pair->first / ATTRPTS,
1172da853ecaSopenharmony_ci                OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1173da853ecaSopenharmony_ci            ASSERT_NE(memory, nullptr);
1174da853ecaSopenharmony_ci            ASSERT_NE(demuxer, nullptr);
1175da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1176da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
1177da853ecaSopenharmony_ci                break;
1178da853ecaSopenharmony_ci            }
1179da853ecaSopenharmony_ci            ASSERT_EQ(pair->second, attr.size);
1180da853ecaSopenharmony_ci        }
1181da853ecaSopenharmony_ci        close(fd);
1182da853ecaSopenharmony_ci    }
1183da853ecaSopenharmony_ci    /**
1184da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_0015
1185da853ecaSopenharmony_ci     * @tc.name      : create vtt Mp4 demuxer with file and forward back seek+read
1186da853ecaSopenharmony_ci     * @tc.desc      : function test
1187da853ecaSopenharmony_ci     */
1188da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_0015, TestSize.Level0)
1189da853ecaSopenharmony_ci    {
1190da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
1191da853ecaSopenharmony_ci        const char *file = "/data/test/media/subtitle_webvtt_en_GB_15.mp4";
1192da853ecaSopenharmony_ci        const char *fileV = "/data/test/media/subtitle_webvtt_en_GB_15.vtt";
1193da853ecaSopenharmony_ci        int fd = open(file, O_RDONLY);
1194da853ecaSopenharmony_ci        int64_t size = GetFileSize(file);
1195da853ecaSopenharmony_ci        cout << file << "----------------------" << fd << "---------" << size << endl;
1196da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithFD(fd, 0, size);
1197da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
1198da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
1199da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
1200da853ecaSopenharmony_ci        const char* mimeType = nullptr;
1201da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
1202da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
1203da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
1204da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
1205da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
1206da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
1207da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
1208da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
1209da853ecaSopenharmony_ci        int tarckType = 0;
1210da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
1211da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
1212da853ecaSopenharmony_ci        for (int index = 0; index < 10; index++) {
1213da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1214da853ecaSopenharmony_ci        }
1215da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, BITRATEMONOMP4 / ATTRPTS,
1216da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1217da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1218da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, BITRATEDUALMP4 / ATTRPTS,
1219da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1220da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1221da853ecaSopenharmony_ci        MyMapVtt(BITRATEDUALMP4, fileV);
1222da853ecaSopenharmony_ci        std::map<int64_t, int32_t>::iterator pair;
1223da853ecaSopenharmony_ci        for (pair = myMap.begin(); pair != myMap.end(); ++pair) {
1224da853ecaSopenharmony_ci            std::cout << pair->first << " => " << pair->second << '\n';
1225da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, pair->first / ATTRPTS,
1226da853ecaSopenharmony_ci                OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1227da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1228da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
1229da853ecaSopenharmony_ci                break;
1230da853ecaSopenharmony_ci            }
1231da853ecaSopenharmony_ci            ASSERT_EQ(pair->second, attr.size);
1232da853ecaSopenharmony_ci        }
1233da853ecaSopenharmony_ci        close(fd);
1234da853ecaSopenharmony_ci    }
1235da853ecaSopenharmony_ci
1236da853ecaSopenharmony_ci    /**
1237da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_0016
1238da853ecaSopenharmony_ci     * @tc.name      : create vtt Mp4 demuxer with file and forward back seek+read
1239da853ecaSopenharmony_ci     * @tc.desc      : function test
1240da853ecaSopenharmony_ci     */
1241da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_0016, TestSize.Level0)
1242da853ecaSopenharmony_ci    {
1243da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
1244da853ecaSopenharmony_ci        const char *file = "/data/test/media/subtitle_webvtt_zh_CN_14.mp4";
1245da853ecaSopenharmony_ci        const char *fileV = "/data/test/media/subtitle_webvtt_zh_CN_14.vtt";
1246da853ecaSopenharmony_ci        int fd = open(file, O_RDONLY);
1247da853ecaSopenharmony_ci        int64_t size = GetFileSize(file);
1248da853ecaSopenharmony_ci        cout << file << "----------------------" << fd << "---------" << size << endl;
1249da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithFD(fd, 0, size);
1250da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
1251da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
1252da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
1253da853ecaSopenharmony_ci        const char* mimeType = nullptr;
1254da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
1255da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
1256da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
1257da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
1258da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
1259da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
1260da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
1261da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
1262da853ecaSopenharmony_ci        int tarckType = 0;
1263da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
1264da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
1265da853ecaSopenharmony_ci        for (int index = 0; index < 10; index++) {
1266da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1267da853ecaSopenharmony_ci        }
1268da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, BITRATEMONO14 / ATTRPTS,
1269da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1270da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1271da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, BITRATEDUAL14 / ATTRPTS,
1272da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1273da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1274da853ecaSopenharmony_ci        MyMapVtt(BITRATEDUAL14, fileV);
1275da853ecaSopenharmony_ci        std::map<int64_t, int32_t>::iterator pair;
1276da853ecaSopenharmony_ci        for (pair = myMap.begin(); pair != myMap.end(); ++pair) {
1277da853ecaSopenharmony_ci            std::cout << pair->first << " => " << pair->second << '\n';
1278da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, pair->first / ATTRPTS,
1279da853ecaSopenharmony_ci                OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1280da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1281da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
1282da853ecaSopenharmony_ci                break;
1283da853ecaSopenharmony_ci            }
1284da853ecaSopenharmony_ci            ASSERT_EQ(pair->second, attr.size);
1285da853ecaSopenharmony_ci        }
1286da853ecaSopenharmony_ci        close(fd);
1287da853ecaSopenharmony_ci    }
1288da853ecaSopenharmony_ci
1289da853ecaSopenharmony_ci    /**
1290da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_0017
1291da853ecaSopenharmony_ci     * @tc.name      : create vtt Mp4 demuxer with file and back seek+read
1292da853ecaSopenharmony_ci     * @tc.desc      : function test
1293da853ecaSopenharmony_ci     */
1294da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_0017, TestSize.Level0)
1295da853ecaSopenharmony_ci    {
1296da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
1297da853ecaSopenharmony_ci        const char *file = "/data/test/media/subtitle_webvtt_en_GB_15.mp4";
1298da853ecaSopenharmony_ci        const char *fileV = "/data/test/media/subtitle_webvtt_en_GB_15.vtt";
1299da853ecaSopenharmony_ci        int fd = open(file, O_RDONLY);
1300da853ecaSopenharmony_ci        int64_t size = GetFileSize(file);
1301da853ecaSopenharmony_ci        cout << file << "----------------------" << fd << "---------" << size << endl;
1302da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithFD(fd, 0, size);
1303da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
1304da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
1305da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
1306da853ecaSopenharmony_ci        const char* mimeType = nullptr;
1307da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
1308da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
1309da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
1310da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
1311da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
1312da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
1313da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
1314da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
1315da853ecaSopenharmony_ci        int tarckType = 0;
1316da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
1317da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
1318da853ecaSopenharmony_ci        for (int index = 0; index < 10; index++) {
1319da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1320da853ecaSopenharmony_ci        }
1321da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, BITRATEMONOMP4 / ATTRPTS,
1322da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1323da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1324da853ecaSopenharmony_ci        MyMapVtt(BITRATEMONOMP4, fileV);
1325da853ecaSopenharmony_ci        std::map<int64_t, int32_t>::iterator pair;
1326da853ecaSopenharmony_ci        for (pair = myMap.begin(); pair != myMap.end(); ++pair) {
1327da853ecaSopenharmony_ci            std::cout << pair->first << " => " << pair->second << '\n';
1328da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, pair->first / ATTRPTS,
1329da853ecaSopenharmony_ci                OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1330da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1331da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
1332da853ecaSopenharmony_ci                break;
1333da853ecaSopenharmony_ci            }
1334da853ecaSopenharmony_ci            ASSERT_EQ(pair->second, attr.size);
1335da853ecaSopenharmony_ci        }
1336da853ecaSopenharmony_ci        close(fd);
1337da853ecaSopenharmony_ci    }
1338da853ecaSopenharmony_ci    /**
1339da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_0018
1340da853ecaSopenharmony_ci     * @tc.name      : create vtt Mp4 demuxer with file and back seek+read
1341da853ecaSopenharmony_ci     * @tc.desc      : function test
1342da853ecaSopenharmony_ci     */
1343da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_0018, TestSize.Level0)
1344da853ecaSopenharmony_ci    {
1345da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
1346da853ecaSopenharmony_ci        const char *file = "/data/test/media/subtitle_webvtt_zh_CN_14.mp4";
1347da853ecaSopenharmony_ci        const char *fileV = "/data/test/media/subtitle_webvtt_zh_CN_14.vtt";
1348da853ecaSopenharmony_ci        int fd = open(file, O_RDONLY);
1349da853ecaSopenharmony_ci        int64_t size = GetFileSize(file);
1350da853ecaSopenharmony_ci        cout << file << "----------------------" << fd << "---------" << size << endl;
1351da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithFD(fd, 0, size);
1352da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
1353da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
1354da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
1355da853ecaSopenharmony_ci        const char* mimeType = nullptr;
1356da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
1357da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
1358da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
1359da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
1360da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
1361da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
1362da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
1363da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
1364da853ecaSopenharmony_ci        int tarckType = 0;
1365da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
1366da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
1367da853ecaSopenharmony_ci        for (int index = 0; index < 10; index++) {
1368da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1369da853ecaSopenharmony_ci        }
1370da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, BITRATEMONO14 / ATTRPTS,
1371da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1372da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1373da853ecaSopenharmony_ci        MyMapVtt(BITRATEMONO14, fileV);
1374da853ecaSopenharmony_ci        std::map<int64_t, int32_t>::iterator pair;
1375da853ecaSopenharmony_ci        for (pair = myMap.begin(); pair != myMap.end(); ++pair) {
1376da853ecaSopenharmony_ci            std::cout << pair->first << " => " << pair->second << '\n';
1377da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, pair->first / ATTRPTS,
1378da853ecaSopenharmony_ci                OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1379da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1380da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
1381da853ecaSopenharmony_ci                break;
1382da853ecaSopenharmony_ci            }
1383da853ecaSopenharmony_ci            ASSERT_EQ(pair->second, attr.size);
1384da853ecaSopenharmony_ci        }
1385da853ecaSopenharmony_ci        close(fd);
1386da853ecaSopenharmony_ci    }
1387da853ecaSopenharmony_ci    /**
1388da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_0019
1389da853ecaSopenharmony_ci     * @tc.name      : create vtt Mp4 demuxer with file and forward seek+read
1390da853ecaSopenharmony_ci     * @tc.desc      : function test
1391da853ecaSopenharmony_ci     */
1392da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_0019, TestSize.Level0)
1393da853ecaSopenharmony_ci    {
1394da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
1395da853ecaSopenharmony_ci        const char *file = "/data/test/media/subtitle_webvtt_en_GB_15.mp4";
1396da853ecaSopenharmony_ci        const char *fileV = "/data/test/media/subtitle_webvtt_en_GB_15.vtt";
1397da853ecaSopenharmony_ci        int fd = open(file, O_RDONLY);
1398da853ecaSopenharmony_ci        int64_t size = GetFileSize(file);
1399da853ecaSopenharmony_ci        cout << file << "----------------------" << fd << "---------" << size << endl;
1400da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithFD(fd, 0, size);
1401da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
1402da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
1403da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
1404da853ecaSopenharmony_ci        const char* mimeType = nullptr;
1405da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
1406da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
1407da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
1408da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
1409da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
1410da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
1411da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
1412da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
1413da853ecaSopenharmony_ci        int tarckType = 0;
1414da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
1415da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
1416da853ecaSopenharmony_ci        for (int index = 0; index < 10; index++) {
1417da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1418da853ecaSopenharmony_ci        }
1419da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, BITRATEDUALMP4 / ATTRPTS,
1420da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1421da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1422da853ecaSopenharmony_ci        MyMapVtt(BITRATEDUALMP4, fileV);
1423da853ecaSopenharmony_ci        std::map<int64_t, int32_t>::iterator pair;
1424da853ecaSopenharmony_ci        for (pair = myMap.begin(); pair != myMap.end(); ++pair) {
1425da853ecaSopenharmony_ci            std::cout << pair->first << " => " << pair->second << '\n';
1426da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, pair->first / ATTRPTS,
1427da853ecaSopenharmony_ci                OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1428da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1429da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
1430da853ecaSopenharmony_ci                break;
1431da853ecaSopenharmony_ci            }
1432da853ecaSopenharmony_ci            ASSERT_EQ(pair->second, attr.size);
1433da853ecaSopenharmony_ci        }
1434da853ecaSopenharmony_ci        close(fd);
1435da853ecaSopenharmony_ci    }
1436da853ecaSopenharmony_ci
1437da853ecaSopenharmony_ci    /**
1438da853ecaSopenharmony_ci     * @tc.number    : DEMUXER_FUNC_VTT_0020
1439da853ecaSopenharmony_ci     * @tc.name      : create vtt Mp4 demuxer with file and forward seek+read
1440da853ecaSopenharmony_ci     * @tc.desc      : function test
1441da853ecaSopenharmony_ci     */
1442da853ecaSopenharmony_ci    HWTEST_F(DemuxerNetNdkTest, DEMUXER_FUNC_VTT_0020, TestSize.Level0)
1443da853ecaSopenharmony_ci    {
1444da853ecaSopenharmony_ci        OH_AVCodecBufferAttr attr;
1445da853ecaSopenharmony_ci        const char *file = "/data/test/media/subtitle_webvtt_zh_CN_14.mp4";
1446da853ecaSopenharmony_ci        const char *fileV = "/data/test/media/subtitle_webvtt_zh_CN_14.vtt";
1447da853ecaSopenharmony_ci        int fd = open(file, O_RDONLY);
1448da853ecaSopenharmony_ci        int64_t size = GetFileSize(file);
1449da853ecaSopenharmony_ci        cout << file << "----------------------" << fd << "---------" << size << endl;
1450da853ecaSopenharmony_ci        source = OH_AVSource_CreateWithFD(fd, 0, size);
1451da853ecaSopenharmony_ci        ASSERT_NE(source, nullptr);
1452da853ecaSopenharmony_ci        demuxer = OH_AVDemuxer_CreateWithSource(source);
1453da853ecaSopenharmony_ci        ASSERT_NE(demuxer, nullptr);
1454da853ecaSopenharmony_ci        const char* mimeType = nullptr;
1455da853ecaSopenharmony_ci        sourceFormat = OH_AVSource_GetSourceFormat(source);
1456da853ecaSopenharmony_ci        trackFormat = OH_AVSource_GetTrackFormat(source, 0);
1457da853ecaSopenharmony_ci        ASSERT_NE(trackFormat, nullptr);
1458da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, &mimeType));
1459da853ecaSopenharmony_ci        ASSERT_EQ(0, strcmp(mimeType, OH_AVCODEC_MIMETYPE_SUBTITLE_WEBVTT));
1460da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &g_trackCount));
1461da853ecaSopenharmony_ci        ASSERT_EQ(1, g_trackCount);
1462da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SelectTrackByID(demuxer, 0));
1463da853ecaSopenharmony_ci        int tarckType = 0;
1464da853ecaSopenharmony_ci        ASSERT_TRUE(OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType));
1465da853ecaSopenharmony_ci        ASSERT_EQ(tarckType, OH_MediaType::MEDIA_TYPE_SUBTITLE);
1466da853ecaSopenharmony_ci        for (int index = 0; index < 10; index++) {
1467da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1468da853ecaSopenharmony_ci        }
1469da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, BITRATEDUAL14 / ATTRPTS,
1470da853ecaSopenharmony_ci            OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1471da853ecaSopenharmony_ci        ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1472da853ecaSopenharmony_ci        MyMapVtt(BITRATEDUAL14, fileV);
1473da853ecaSopenharmony_ci        std::map<int64_t, int32_t>::iterator pair;
1474da853ecaSopenharmony_ci        for (pair = myMap.begin(); pair != myMap.end(); ++pair) {
1475da853ecaSopenharmony_ci            std::cout << pair->first << " => " << pair->second << '\n';
1476da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_SeekToTime(demuxer, pair->first / ATTRPTS,
1477da853ecaSopenharmony_ci                OH_AVSeekMode::SEEK_MODE_CLOSEST_SYNC));
1478da853ecaSopenharmony_ci            ASSERT_EQ(AV_ERR_OK, OH_AVDemuxer_ReadSample(demuxer, 0, memory, &attr));
1479da853ecaSopenharmony_ci            if (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS) {
1480da853ecaSopenharmony_ci                break;
1481da853ecaSopenharmony_ci            }
1482da853ecaSopenharmony_ci            ASSERT_EQ(pair->second, attr.size);
1483da853ecaSopenharmony_ci        }
1484da853ecaSopenharmony_ci        close(fd);
1485da853ecaSopenharmony_ci    }
1486da853ecaSopenharmony_ci} // namespace