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