1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Various utility demuxing functions
3cabdff1aSopenharmony_ci * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci#include "libavutil/version.h"
23cabdff1aSopenharmony_ci
24cabdff1aSopenharmony_ci#include "libavutil/avassert.h"
25cabdff1aSopenharmony_ci#include "libavcodec/bytestream.h"
26cabdff1aSopenharmony_ci#include "libavcodec/packet_internal.h"
27cabdff1aSopenharmony_ci#include "avformat.h"
28cabdff1aSopenharmony_ci#include "avio_internal.h"
29cabdff1aSopenharmony_ci#include "demux.h"
30cabdff1aSopenharmony_ci#include "internal.h"
31cabdff1aSopenharmony_ci
32cabdff1aSopenharmony_cistruct AVCodecParserContext *av_stream_get_parser(const AVStream *st)
33cabdff1aSopenharmony_ci{
34cabdff1aSopenharmony_ci    return cffstream(st)->parser;
35cabdff1aSopenharmony_ci}
36cabdff1aSopenharmony_ci
37cabdff1aSopenharmony_civoid avpriv_stream_set_need_parsing(AVStream *st, enum AVStreamParseType type)
38cabdff1aSopenharmony_ci{
39cabdff1aSopenharmony_ci    ffstream(st)->need_parsing = type;
40cabdff1aSopenharmony_ci}
41cabdff1aSopenharmony_ci
42cabdff1aSopenharmony_ciAVChapter *avpriv_new_chapter(AVFormatContext *s, int64_t id, AVRational time_base,
43cabdff1aSopenharmony_ci                              int64_t start, int64_t end, const char *title)
44cabdff1aSopenharmony_ci{
45cabdff1aSopenharmony_ci    FFFormatContext *const si = ffformatcontext(s);
46cabdff1aSopenharmony_ci    AVChapter *chapter = NULL;
47cabdff1aSopenharmony_ci    int ret;
48cabdff1aSopenharmony_ci
49cabdff1aSopenharmony_ci    if (end != AV_NOPTS_VALUE && start > end) {
50cabdff1aSopenharmony_ci        av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
51cabdff1aSopenharmony_ci        return NULL;
52cabdff1aSopenharmony_ci    }
53cabdff1aSopenharmony_ci
54cabdff1aSopenharmony_ci    if (!s->nb_chapters) {
55cabdff1aSopenharmony_ci        si->chapter_ids_monotonic = 1;
56cabdff1aSopenharmony_ci    } else if (!si->chapter_ids_monotonic || s->chapters[s->nb_chapters-1]->id >= id) {
57cabdff1aSopenharmony_ci        for (unsigned i = 0; i < s->nb_chapters; i++)
58cabdff1aSopenharmony_ci            if (s->chapters[i]->id == id)
59cabdff1aSopenharmony_ci                chapter = s->chapters[i];
60cabdff1aSopenharmony_ci        if (!chapter)
61cabdff1aSopenharmony_ci            si->chapter_ids_monotonic = 0;
62cabdff1aSopenharmony_ci    }
63cabdff1aSopenharmony_ci
64cabdff1aSopenharmony_ci    if (!chapter) {
65cabdff1aSopenharmony_ci        chapter = av_mallocz(sizeof(*chapter));
66cabdff1aSopenharmony_ci        if (!chapter)
67cabdff1aSopenharmony_ci            return NULL;
68cabdff1aSopenharmony_ci        ret = av_dynarray_add_nofree(&s->chapters, &s->nb_chapters, chapter);
69cabdff1aSopenharmony_ci        if (ret < 0) {
70cabdff1aSopenharmony_ci            av_free(chapter);
71cabdff1aSopenharmony_ci            return NULL;
72cabdff1aSopenharmony_ci        }
73cabdff1aSopenharmony_ci    }
74cabdff1aSopenharmony_ci    av_dict_set(&chapter->metadata, "title", title, 0);
75cabdff1aSopenharmony_ci    chapter->id        = id;
76cabdff1aSopenharmony_ci    chapter->time_base = time_base;
77cabdff1aSopenharmony_ci    chapter->start     = start;
78cabdff1aSopenharmony_ci    chapter->end       = end;
79cabdff1aSopenharmony_ci
80cabdff1aSopenharmony_ci    return chapter;
81cabdff1aSopenharmony_ci}
82cabdff1aSopenharmony_ci
83cabdff1aSopenharmony_civoid av_format_inject_global_side_data(AVFormatContext *s)
84cabdff1aSopenharmony_ci{
85cabdff1aSopenharmony_ci    FFFormatContext *const si = ffformatcontext(s);
86cabdff1aSopenharmony_ci    si->inject_global_side_data = 1;
87cabdff1aSopenharmony_ci    for (unsigned i = 0; i < s->nb_streams; i++) {
88cabdff1aSopenharmony_ci        AVStream *st = s->streams[i];
89cabdff1aSopenharmony_ci        ffstream(st)->inject_global_side_data = 1;
90cabdff1aSopenharmony_ci    }
91cabdff1aSopenharmony_ci}
92cabdff1aSopenharmony_ci
93cabdff1aSopenharmony_ciint avformat_queue_attached_pictures(AVFormatContext *s)
94cabdff1aSopenharmony_ci{
95cabdff1aSopenharmony_ci    FFFormatContext *const si = ffformatcontext(s);
96cabdff1aSopenharmony_ci    int ret;
97cabdff1aSopenharmony_ci    for (unsigned i = 0; i < s->nb_streams; i++)
98cabdff1aSopenharmony_ci        if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
99cabdff1aSopenharmony_ci            s->streams[i]->discard < AVDISCARD_ALL) {
100cabdff1aSopenharmony_ci            if (s->streams[i]->attached_pic.size <= 0) {
101cabdff1aSopenharmony_ci                av_log(s, AV_LOG_WARNING,
102cabdff1aSopenharmony_ci                       "Attached picture on stream %d has invalid size, "
103cabdff1aSopenharmony_ci                       "ignoring\n", i);
104cabdff1aSopenharmony_ci                continue;
105cabdff1aSopenharmony_ci            }
106cabdff1aSopenharmony_ci
107cabdff1aSopenharmony_ci            ret = avpriv_packet_list_put(&si->raw_packet_buffer,
108cabdff1aSopenharmony_ci                                         &s->streams[i]->attached_pic,
109cabdff1aSopenharmony_ci                                         av_packet_ref, 0);
110cabdff1aSopenharmony_ci            if (ret < 0)
111cabdff1aSopenharmony_ci                return ret;
112cabdff1aSopenharmony_ci        }
113cabdff1aSopenharmony_ci    return 0;
114cabdff1aSopenharmony_ci}
115cabdff1aSopenharmony_ci
116cabdff1aSopenharmony_ciint ff_add_attached_pic(AVFormatContext *s, AVStream *st0, AVIOContext *pb,
117cabdff1aSopenharmony_ci                        AVBufferRef **buf, int size)
118cabdff1aSopenharmony_ci{
119cabdff1aSopenharmony_ci    AVStream *st = st0;
120cabdff1aSopenharmony_ci    AVPacket *pkt;
121cabdff1aSopenharmony_ci    int ret;
122cabdff1aSopenharmony_ci
123cabdff1aSopenharmony_ci    if (!st && !(st = avformat_new_stream(s, NULL)))
124cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
125cabdff1aSopenharmony_ci    pkt = &st->attached_pic;
126cabdff1aSopenharmony_ci    if (buf) {
127cabdff1aSopenharmony_ci        av_assert1(*buf);
128cabdff1aSopenharmony_ci        av_packet_unref(pkt);
129cabdff1aSopenharmony_ci        pkt->buf  = *buf;
130cabdff1aSopenharmony_ci        pkt->data = (*buf)->data;
131cabdff1aSopenharmony_ci        pkt->size = (*buf)->size - AV_INPUT_BUFFER_PADDING_SIZE;
132cabdff1aSopenharmony_ci        *buf = NULL;
133cabdff1aSopenharmony_ci    } else {
134cabdff1aSopenharmony_ci        ret = av_get_packet(pb, pkt, size);
135cabdff1aSopenharmony_ci        if (ret < 0)
136cabdff1aSopenharmony_ci            goto fail;
137cabdff1aSopenharmony_ci    }
138cabdff1aSopenharmony_ci    st->disposition         |= AV_DISPOSITION_ATTACHED_PIC;
139cabdff1aSopenharmony_ci    st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
140cabdff1aSopenharmony_ci
141cabdff1aSopenharmony_ci    pkt->stream_index = st->index;
142cabdff1aSopenharmony_ci    pkt->flags       |= AV_PKT_FLAG_KEY;
143cabdff1aSopenharmony_ci
144cabdff1aSopenharmony_ci    return 0;
145cabdff1aSopenharmony_cifail:
146cabdff1aSopenharmony_ci    if (!st0)
147cabdff1aSopenharmony_ci        ff_remove_stream(s, st);
148cabdff1aSopenharmony_ci    return ret;
149cabdff1aSopenharmony_ci}
150cabdff1aSopenharmony_ci
151cabdff1aSopenharmony_ciint ff_add_param_change(AVPacket *pkt, int32_t channels,
152cabdff1aSopenharmony_ci                        uint64_t channel_layout, int32_t sample_rate,
153cabdff1aSopenharmony_ci                        int32_t width, int32_t height)
154cabdff1aSopenharmony_ci{
155cabdff1aSopenharmony_ci    uint32_t flags = 0;
156cabdff1aSopenharmony_ci    int size = 4;
157cabdff1aSopenharmony_ci    uint8_t *data;
158cabdff1aSopenharmony_ci    if (!pkt)
159cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
160cabdff1aSopenharmony_ci
161cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT
162cabdff1aSopenharmony_ciFF_DISABLE_DEPRECATION_WARNINGS
163cabdff1aSopenharmony_ci    if (channels) {
164cabdff1aSopenharmony_ci        size  += 4;
165cabdff1aSopenharmony_ci        flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
166cabdff1aSopenharmony_ci    }
167cabdff1aSopenharmony_ci    if (channel_layout) {
168cabdff1aSopenharmony_ci        size  += 8;
169cabdff1aSopenharmony_ci        flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
170cabdff1aSopenharmony_ci    }
171cabdff1aSopenharmony_ciFF_ENABLE_DEPRECATION_WARNINGS
172cabdff1aSopenharmony_ci#endif
173cabdff1aSopenharmony_ci    if (sample_rate) {
174cabdff1aSopenharmony_ci        size  += 4;
175cabdff1aSopenharmony_ci        flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
176cabdff1aSopenharmony_ci    }
177cabdff1aSopenharmony_ci    if (width || height) {
178cabdff1aSopenharmony_ci        size  += 8;
179cabdff1aSopenharmony_ci        flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
180cabdff1aSopenharmony_ci    }
181cabdff1aSopenharmony_ci    data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
182cabdff1aSopenharmony_ci    if (!data)
183cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
184cabdff1aSopenharmony_ci    bytestream_put_le32(&data, flags);
185cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT
186cabdff1aSopenharmony_ciFF_DISABLE_DEPRECATION_WARNINGS
187cabdff1aSopenharmony_ci    if (channels)
188cabdff1aSopenharmony_ci        bytestream_put_le32(&data, channels);
189cabdff1aSopenharmony_ci    if (channel_layout)
190cabdff1aSopenharmony_ci        bytestream_put_le64(&data, channel_layout);
191cabdff1aSopenharmony_ciFF_ENABLE_DEPRECATION_WARNINGS
192cabdff1aSopenharmony_ci#endif
193cabdff1aSopenharmony_ci    if (sample_rate)
194cabdff1aSopenharmony_ci        bytestream_put_le32(&data, sample_rate);
195cabdff1aSopenharmony_ci    if (width || height) {
196cabdff1aSopenharmony_ci        bytestream_put_le32(&data, width);
197cabdff1aSopenharmony_ci        bytestream_put_le32(&data, height);
198cabdff1aSopenharmony_ci    }
199cabdff1aSopenharmony_ci    return 0;
200cabdff1aSopenharmony_ci}
201cabdff1aSopenharmony_ci
202cabdff1aSopenharmony_ciint av_read_play(AVFormatContext *s)
203cabdff1aSopenharmony_ci{
204cabdff1aSopenharmony_ci    if (s->iformat->read_play)
205cabdff1aSopenharmony_ci        return s->iformat->read_play(s);
206cabdff1aSopenharmony_ci    if (s->pb)
207cabdff1aSopenharmony_ci        return avio_pause(s->pb, 0);
208cabdff1aSopenharmony_ci    return AVERROR(ENOSYS);
209cabdff1aSopenharmony_ci}
210cabdff1aSopenharmony_ci
211cabdff1aSopenharmony_ciint av_read_pause(AVFormatContext *s)
212cabdff1aSopenharmony_ci{
213cabdff1aSopenharmony_ci    if (s->iformat->read_pause)
214cabdff1aSopenharmony_ci        return s->iformat->read_pause(s);
215cabdff1aSopenharmony_ci    if (s->pb)
216cabdff1aSopenharmony_ci        return avio_pause(s->pb, 1);
217cabdff1aSopenharmony_ci    return AVERROR(ENOSYS);
218cabdff1aSopenharmony_ci}
219cabdff1aSopenharmony_ci
220cabdff1aSopenharmony_ciint ff_generate_avci_extradata(AVStream *st)
221cabdff1aSopenharmony_ci{
222cabdff1aSopenharmony_ci    static const uint8_t avci100_1080p_extradata[] = {
223cabdff1aSopenharmony_ci        // SPS
224cabdff1aSopenharmony_ci        0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
225cabdff1aSopenharmony_ci        0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
226cabdff1aSopenharmony_ci        0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
227cabdff1aSopenharmony_ci        0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
228cabdff1aSopenharmony_ci        0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
229cabdff1aSopenharmony_ci        0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
230cabdff1aSopenharmony_ci        0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
231cabdff1aSopenharmony_ci        0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
232cabdff1aSopenharmony_ci        0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233cabdff1aSopenharmony_ci        // PPS
234cabdff1aSopenharmony_ci        0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
235cabdff1aSopenharmony_ci        0xd0
236cabdff1aSopenharmony_ci    };
237cabdff1aSopenharmony_ci    static const uint8_t avci100_1080i_extradata[] = {
238cabdff1aSopenharmony_ci        // SPS
239cabdff1aSopenharmony_ci        0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
240cabdff1aSopenharmony_ci        0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
241cabdff1aSopenharmony_ci        0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
242cabdff1aSopenharmony_ci        0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
243cabdff1aSopenharmony_ci        0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
244cabdff1aSopenharmony_ci        0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
245cabdff1aSopenharmony_ci        0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
246cabdff1aSopenharmony_ci        0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
247cabdff1aSopenharmony_ci        0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
248cabdff1aSopenharmony_ci        0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
249cabdff1aSopenharmony_ci        0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
250cabdff1aSopenharmony_ci        // PPS
251cabdff1aSopenharmony_ci        0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
252cabdff1aSopenharmony_ci        0xd0
253cabdff1aSopenharmony_ci    };
254cabdff1aSopenharmony_ci    static const uint8_t avci50_1080p_extradata[] = {
255cabdff1aSopenharmony_ci        // SPS
256cabdff1aSopenharmony_ci        0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
257cabdff1aSopenharmony_ci        0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
258cabdff1aSopenharmony_ci        0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
259cabdff1aSopenharmony_ci        0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
260cabdff1aSopenharmony_ci        0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
261cabdff1aSopenharmony_ci        0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
262cabdff1aSopenharmony_ci        0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
263cabdff1aSopenharmony_ci        0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
264cabdff1aSopenharmony_ci        0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
265cabdff1aSopenharmony_ci        // PPS
266cabdff1aSopenharmony_ci        0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
267cabdff1aSopenharmony_ci        0x11
268cabdff1aSopenharmony_ci    };
269cabdff1aSopenharmony_ci    static const uint8_t avci50_1080i_extradata[] = {
270cabdff1aSopenharmony_ci        // SPS
271cabdff1aSopenharmony_ci        0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
272cabdff1aSopenharmony_ci        0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
273cabdff1aSopenharmony_ci        0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
274cabdff1aSopenharmony_ci        0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
275cabdff1aSopenharmony_ci        0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
276cabdff1aSopenharmony_ci        0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
277cabdff1aSopenharmony_ci        0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
278cabdff1aSopenharmony_ci        0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
279cabdff1aSopenharmony_ci        0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
280cabdff1aSopenharmony_ci        0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
281cabdff1aSopenharmony_ci        0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
282cabdff1aSopenharmony_ci        // PPS
283cabdff1aSopenharmony_ci        0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
284cabdff1aSopenharmony_ci        0x11
285cabdff1aSopenharmony_ci    };
286cabdff1aSopenharmony_ci    static const uint8_t avci100_720p_extradata[] = {
287cabdff1aSopenharmony_ci        // SPS
288cabdff1aSopenharmony_ci        0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
289cabdff1aSopenharmony_ci        0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
290cabdff1aSopenharmony_ci        0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
291cabdff1aSopenharmony_ci        0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
292cabdff1aSopenharmony_ci        0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
293cabdff1aSopenharmony_ci        0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
294cabdff1aSopenharmony_ci        0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
295cabdff1aSopenharmony_ci        0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
296cabdff1aSopenharmony_ci        0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
297cabdff1aSopenharmony_ci        0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
298cabdff1aSopenharmony_ci        // PPS
299cabdff1aSopenharmony_ci        0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
300cabdff1aSopenharmony_ci        0x11
301cabdff1aSopenharmony_ci    };
302cabdff1aSopenharmony_ci    static const uint8_t avci50_720p_extradata[] = {
303cabdff1aSopenharmony_ci        // SPS
304cabdff1aSopenharmony_ci        0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
305cabdff1aSopenharmony_ci        0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
306cabdff1aSopenharmony_ci        0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
307cabdff1aSopenharmony_ci        0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
308cabdff1aSopenharmony_ci        0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
309cabdff1aSopenharmony_ci        0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
310cabdff1aSopenharmony_ci        0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
311cabdff1aSopenharmony_ci        0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
312cabdff1aSopenharmony_ci        0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
313cabdff1aSopenharmony_ci        // PPS
314cabdff1aSopenharmony_ci        0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
315cabdff1aSopenharmony_ci        0x11
316cabdff1aSopenharmony_ci    };
317cabdff1aSopenharmony_ci
318cabdff1aSopenharmony_ci    const uint8_t *data = NULL;
319cabdff1aSopenharmony_ci    int ret, size       = 0;
320cabdff1aSopenharmony_ci
321cabdff1aSopenharmony_ci    if (st->codecpar->width == 1920) {
322cabdff1aSopenharmony_ci        if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
323cabdff1aSopenharmony_ci            data = avci100_1080p_extradata;
324cabdff1aSopenharmony_ci            size = sizeof(avci100_1080p_extradata);
325cabdff1aSopenharmony_ci        } else {
326cabdff1aSopenharmony_ci            data = avci100_1080i_extradata;
327cabdff1aSopenharmony_ci            size = sizeof(avci100_1080i_extradata);
328cabdff1aSopenharmony_ci        }
329cabdff1aSopenharmony_ci    } else if (st->codecpar->width == 1440) {
330cabdff1aSopenharmony_ci        if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
331cabdff1aSopenharmony_ci            data = avci50_1080p_extradata;
332cabdff1aSopenharmony_ci            size = sizeof(avci50_1080p_extradata);
333cabdff1aSopenharmony_ci        } else {
334cabdff1aSopenharmony_ci            data = avci50_1080i_extradata;
335cabdff1aSopenharmony_ci            size = sizeof(avci50_1080i_extradata);
336cabdff1aSopenharmony_ci        }
337cabdff1aSopenharmony_ci    } else if (st->codecpar->width == 1280) {
338cabdff1aSopenharmony_ci        data = avci100_720p_extradata;
339cabdff1aSopenharmony_ci        size = sizeof(avci100_720p_extradata);
340cabdff1aSopenharmony_ci    } else if (st->codecpar->width == 960) {
341cabdff1aSopenharmony_ci        data = avci50_720p_extradata;
342cabdff1aSopenharmony_ci        size = sizeof(avci50_720p_extradata);
343cabdff1aSopenharmony_ci    }
344cabdff1aSopenharmony_ci
345cabdff1aSopenharmony_ci    if (!size)
346cabdff1aSopenharmony_ci        return 0;
347cabdff1aSopenharmony_ci
348cabdff1aSopenharmony_ci    if ((ret = ff_alloc_extradata(st->codecpar, size)) < 0)
349cabdff1aSopenharmony_ci        return ret;
350cabdff1aSopenharmony_ci    memcpy(st->codecpar->extradata, data, size);
351cabdff1aSopenharmony_ci
352cabdff1aSopenharmony_ci    return 0;
353cabdff1aSopenharmony_ci}
354cabdff1aSopenharmony_ci
355cabdff1aSopenharmony_ciint ff_get_extradata(void *logctx, AVCodecParameters *par, AVIOContext *pb, int size)
356cabdff1aSopenharmony_ci{
357cabdff1aSopenharmony_ci    int ret = ff_alloc_extradata(par, size);
358cabdff1aSopenharmony_ci    if (ret < 0)
359cabdff1aSopenharmony_ci        return ret;
360cabdff1aSopenharmony_ci    ret = ffio_read_size(pb, par->extradata, size);
361cabdff1aSopenharmony_ci    if (ret < 0) {
362cabdff1aSopenharmony_ci        av_freep(&par->extradata);
363cabdff1aSopenharmony_ci        par->extradata_size = 0;
364cabdff1aSopenharmony_ci        av_log(logctx, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
365cabdff1aSopenharmony_ci        return ret;
366cabdff1aSopenharmony_ci    }
367cabdff1aSopenharmony_ci
368cabdff1aSopenharmony_ci    return ret;
369cabdff1aSopenharmony_ci}
370cabdff1aSopenharmony_ci
371cabdff1aSopenharmony_ciint ff_find_stream_index(const AVFormatContext *s, int id)
372cabdff1aSopenharmony_ci{
373cabdff1aSopenharmony_ci    for (unsigned i = 0; i < s->nb_streams; i++)
374cabdff1aSopenharmony_ci        if (s->streams[i]->id == id)
375cabdff1aSopenharmony_ci            return i;
376cabdff1aSopenharmony_ci    return -1;
377cabdff1aSopenharmony_ci}
378