2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 #include "libavutil/avassert.h"
30 #include "libavutil/avstring.h"
31 #include "libavutil/dict.h"
32 #include "libavutil/internal.h"
33 #include "libavutil/mathematics.h"
34 #include "libavutil/opt.h"
35 #include "libavutil/parseutils.h"
36 #include "libavutil/pixdesc.h"
37 #include "libavutil/time.h"
38 #include "libavutil/timestamp.h"
40 #include "libavcodec/bytestream.h"
41 #include "libavcodec/internal.h"
42 #include "libavcodec/raw.h"
44 #include "audiointerleave.h"
46 #include "avio_internal.h"
56 #include "libavutil/ffversion.h"
57 const char av_format_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
61 * various utility functions for use within FFmpeg
64 unsigned avformat_version(void)
66 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
67 return LIBAVFORMAT_VERSION_INT;
70 const char *avformat_configuration(void)
72 return FFMPEG_CONFIGURATION;
75 const char *avformat_license(void)
77 #define LICENSE_PREFIX "libavformat license: "
78 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
81 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
83 static int is_relative(int64_t ts) {
84 return ts > (RELATIVE_TS_BASE - (1LL<<48));
88 * Wrap a given time stamp, if there is an indication for an overflow
91 * @param timestamp the time stamp to wrap
92 * @return resulting time stamp
94 static int64_t wrap_timestamp(AVStream *st, int64_t timestamp)
96 if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&
97 st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
98 if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
99 timestamp < st->pts_wrap_reference)
100 return timestamp + (1ULL << st->pts_wrap_bits);
101 else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
102 timestamp >= st->pts_wrap_reference)
103 return timestamp - (1ULL << st->pts_wrap_bits);
108 MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
109 MAKE_ACCESSORS(AVStream, stream, char *, recommended_encoder_configuration)
110 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, video_codec)
111 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, audio_codec)
112 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
113 MAKE_ACCESSORS(AVFormatContext, format, int, metadata_header_padding)
114 MAKE_ACCESSORS(AVFormatContext, format, void *, opaque)
115 MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb)
117 int64_t av_stream_get_end_pts(const AVStream *st)
122 struct AVCodecParserContext *av_stream_get_parser(const AVStream *st)
127 void av_format_inject_global_side_data(AVFormatContext *s)
130 s->internal->inject_global_side_data = 1;
131 for (i = 0; i < s->nb_streams; i++) {
132 AVStream *st = s->streams[i];
133 st->inject_global_side_data = 1;
137 int ff_copy_whitelists(AVFormatContext *dst, AVFormatContext *src)
139 av_assert0(!dst->codec_whitelist && !dst->format_whitelist);
140 dst-> codec_whitelist = av_strdup(src->codec_whitelist);
141 dst->format_whitelist = av_strdup(src->format_whitelist);
142 if ( (src-> codec_whitelist && !dst-> codec_whitelist)
143 || (src->format_whitelist && !dst->format_whitelist)) {
144 av_log(dst, AV_LOG_ERROR, "Failed to duplicate whitelist\n");
145 return AVERROR(ENOMEM);
150 static const AVCodec *find_decoder(AVFormatContext *s, AVStream *st, enum AVCodecID codec_id)
152 if (st->codec->codec)
153 return st->codec->codec;
155 switch (st->codec->codec_type) {
156 case AVMEDIA_TYPE_VIDEO:
157 if (s->video_codec) return s->video_codec;
159 case AVMEDIA_TYPE_AUDIO:
160 if (s->audio_codec) return s->audio_codec;
162 case AVMEDIA_TYPE_SUBTITLE:
163 if (s->subtitle_codec) return s->subtitle_codec;
167 return avcodec_find_decoder(codec_id);
170 int av_format_get_probe_score(const AVFormatContext *s)
172 return s->probe_score;
175 /* an arbitrarily chosen "sane" max packet size -- 50M */
176 #define SANE_CHUNK_SIZE (50000000)
178 int ffio_limit(AVIOContext *s, int size)
180 if (s->maxsize>= 0) {
181 int64_t remaining= s->maxsize - avio_tell(s);
182 if (remaining < size) {
183 int64_t newsize = avio_size(s);
184 if (!s->maxsize || s->maxsize<newsize)
185 s->maxsize = newsize - !newsize;
186 remaining= s->maxsize - avio_tell(s);
187 remaining= FFMAX(remaining, 0);
190 if (s->maxsize>= 0 && remaining+1 < size) {
191 av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
198 /* Read the data in sane-sized chunks and append to pkt.
199 * Return the number of bytes read or an error. */
200 static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
202 int64_t orig_pos = pkt->pos; // av_grow_packet might reset pos
203 int orig_size = pkt->size;
207 int prev_size = pkt->size;
210 /* When the caller requests a lot of data, limit it to the amount
211 * left in file or SANE_CHUNK_SIZE when it is not known. */
213 if (read_size > SANE_CHUNK_SIZE/10) {
214 read_size = ffio_limit(s, read_size);
215 // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
217 read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
220 ret = av_grow_packet(pkt, read_size);
224 ret = avio_read(s, pkt->data + prev_size, read_size);
225 if (ret != read_size) {
226 av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
233 pkt->flags |= AV_PKT_FLAG_CORRUPT;
238 return pkt->size > orig_size ? pkt->size - orig_size : ret;
241 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
246 pkt->pos = avio_tell(s);
248 return append_packet_chunked(s, pkt, size);
251 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
254 return av_get_packet(s, pkt, size);
255 return append_packet_chunked(s, pkt, size);
258 int av_filename_number_test(const char *filename)
262 (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0);
265 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
268 static const struct {
271 enum AVMediaType type;
273 { "aac", AV_CODEC_ID_AAC, AVMEDIA_TYPE_AUDIO },
274 { "ac3", AV_CODEC_ID_AC3, AVMEDIA_TYPE_AUDIO },
275 { "dts", AV_CODEC_ID_DTS, AVMEDIA_TYPE_AUDIO },
276 { "dvbsub", AV_CODEC_ID_DVB_SUBTITLE,AVMEDIA_TYPE_SUBTITLE },
277 { "eac3", AV_CODEC_ID_EAC3, AVMEDIA_TYPE_AUDIO },
278 { "h264", AV_CODEC_ID_H264, AVMEDIA_TYPE_VIDEO },
279 { "hevc", AV_CODEC_ID_HEVC, AVMEDIA_TYPE_VIDEO },
280 { "loas", AV_CODEC_ID_AAC_LATM, AVMEDIA_TYPE_AUDIO },
281 { "m4v", AV_CODEC_ID_MPEG4, AVMEDIA_TYPE_VIDEO },
282 { "mp3", AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO },
283 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
287 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
289 if (fmt && st->request_probe <= score) {
291 av_log(s, AV_LOG_DEBUG,
292 "Probe with size=%d, packets=%d detected %s with score=%d\n",
293 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets,
295 for (i = 0; fmt_id_type[i].name; i++) {
296 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
297 st->codec->codec_id = fmt_id_type[i].id;
298 st->codec->codec_type = fmt_id_type[i].type;
306 /************************************************************/
307 /* input media file */
309 int av_demuxer_open(AVFormatContext *ic) {
312 if (ic->format_whitelist && av_match_list(ic->iformat->name, ic->format_whitelist, ',') <= 0) {
313 av_log(ic, AV_LOG_ERROR, "Format not on whitelist\n");
314 return AVERROR(EINVAL);
317 if (ic->iformat->read_header) {
318 err = ic->iformat->read_header(ic);
323 if (ic->pb && !ic->data_offset)
324 ic->data_offset = avio_tell(ic->pb);
329 /* Open input file and probe the format if necessary. */
330 static int init_input(AVFormatContext *s, const char *filename,
331 AVDictionary **options)
334 AVProbeData pd = { filename, NULL, 0 };
335 int score = AVPROBE_SCORE_RETRY;
338 s->flags |= AVFMT_FLAG_CUSTOM_IO;
340 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
341 s, 0, s->format_probesize);
342 else if (s->iformat->flags & AVFMT_NOFILE)
343 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
344 "will be ignored with AVFMT_NOFILE format.\n");
348 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
349 (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
352 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ | s->avio_flags,
353 &s->interrupt_callback, options)) < 0)
357 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
358 s, 0, s->format_probesize);
361 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
362 AVPacketList **plast_pktl)
364 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
369 (*plast_pktl)->next = pktl;
371 *packet_buffer = pktl;
373 /* Add the packet in the buffered packet list. */
379 int avformat_queue_attached_pictures(AVFormatContext *s)
382 for (i = 0; i < s->nb_streams; i++)
383 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
384 s->streams[i]->discard < AVDISCARD_ALL) {
385 AVPacket copy = s->streams[i]->attached_pic;
386 if (copy.size <= 0) {
387 av_log(s, AV_LOG_WARNING,
388 "Attached picture on stream %d has invalid size, "
392 copy.buf = av_buffer_ref(copy.buf);
394 return AVERROR(ENOMEM);
396 add_to_pktbuf(&s->raw_packet_buffer, ©,
397 &s->raw_packet_buffer_end);
402 int avformat_open_input(AVFormatContext **ps, const char *filename,
403 AVInputFormat *fmt, AVDictionary **options)
405 AVFormatContext *s = *ps;
407 AVDictionary *tmp = NULL;
408 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
410 if (!s && !(s = avformat_alloc_context()))
411 return AVERROR(ENOMEM);
413 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
414 return AVERROR(EINVAL);
420 av_dict_copy(&tmp, *options, 0);
422 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
425 if ((ret = init_input(s, filename, &tmp)) < 0)
427 s->probe_score = ret;
429 if (s->format_whitelist && av_match_list(s->iformat->name, s->format_whitelist, ',') <= 0) {
430 av_log(s, AV_LOG_ERROR, "Format not on whitelist\n");
431 ret = AVERROR(EINVAL);
435 avio_skip(s->pb, s->skip_initial_bytes);
437 /* Check filename in case an image number is expected. */
438 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
439 if (!av_filename_number_test(filename)) {
440 ret = AVERROR(EINVAL);
445 s->duration = s->start_time = AV_NOPTS_VALUE;
446 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
448 /* Allocate private data. */
449 if (s->iformat->priv_data_size > 0) {
450 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
451 ret = AVERROR(ENOMEM);
454 if (s->iformat->priv_class) {
455 *(const AVClass **) s->priv_data = s->iformat->priv_class;
456 av_opt_set_defaults(s->priv_data);
457 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
462 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
464 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, 0);
466 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
467 if ((ret = s->iformat->read_header(s)) < 0)
470 if (id3v2_extra_meta) {
471 if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
472 !strcmp(s->iformat->name, "tta")) {
473 if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
476 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
478 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
480 if ((ret = avformat_queue_attached_pictures(s)) < 0)
483 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
484 s->data_offset = avio_tell(s->pb);
486 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
489 av_dict_free(options);
496 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
498 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
500 avformat_free_context(s);
505 /*******************************************************/
507 static void force_codec_ids(AVFormatContext *s, AVStream *st)
509 switch (st->codec->codec_type) {
510 case AVMEDIA_TYPE_VIDEO:
511 if (s->video_codec_id)
512 st->codec->codec_id = s->video_codec_id;
514 case AVMEDIA_TYPE_AUDIO:
515 if (s->audio_codec_id)
516 st->codec->codec_id = s->audio_codec_id;
518 case AVMEDIA_TYPE_SUBTITLE:
519 if (s->subtitle_codec_id)
520 st->codec->codec_id = s->subtitle_codec_id;
525 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
527 if (st->request_probe>0) {
528 AVProbeData *pd = &st->probe_data;
530 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
534 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
536 av_log(s, AV_LOG_WARNING,
537 "Failed to reallocate probe buffer for stream %d\n",
542 memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
543 pd->buf_size += pkt->size;
544 memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
547 st->probe_packets = 0;
549 av_log(s, AV_LOG_WARNING,
550 "nothing to probe for stream %d\n", st->index);
554 end= s->raw_packet_buffer_remaining_size <= 0
555 || st->probe_packets<= 0;
557 if (end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
558 int score = set_codec_from_probe_data(s, st, pd);
559 if ( (st->codec->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
563 st->request_probe = -1;
564 if (st->codec->codec_id != AV_CODEC_ID_NONE) {
565 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
567 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
569 force_codec_ids(s, st);
575 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
577 int64_t ref = pkt->dts;
578 int i, pts_wrap_behavior;
579 int64_t pts_wrap_reference;
580 AVProgram *first_program;
582 if (ref == AV_NOPTS_VALUE)
584 if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
586 ref &= (1LL << st->pts_wrap_bits)-1;
588 // reference time stamp should be 60 s before first time stamp
589 pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
590 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
591 pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
592 (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
593 AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
595 first_program = av_find_program_from_stream(s, NULL, stream_index);
597 if (!first_program) {
598 int default_stream_index = av_find_default_stream_index(s);
599 if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
600 for (i = 0; i < s->nb_streams; i++) {
601 if (av_find_program_from_stream(s, NULL, i))
603 s->streams[i]->pts_wrap_reference = pts_wrap_reference;
604 s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
608 st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
609 st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
613 AVProgram *program = first_program;
615 if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
616 pts_wrap_reference = program->pts_wrap_reference;
617 pts_wrap_behavior = program->pts_wrap_behavior;
620 program = av_find_program_from_stream(s, program, stream_index);
623 // update every program with differing pts_wrap_reference
624 program = first_program;
626 if (program->pts_wrap_reference != pts_wrap_reference) {
627 for (i = 0; i<program->nb_stream_indexes; i++) {
628 s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
629 s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
632 program->pts_wrap_reference = pts_wrap_reference;
633 program->pts_wrap_behavior = pts_wrap_behavior;
635 program = av_find_program_from_stream(s, program, stream_index);
641 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
647 AVPacketList *pktl = s->raw_packet_buffer;
651 st = s->streams[pkt->stream_index];
652 if (s->raw_packet_buffer_remaining_size <= 0)
653 if ((err = probe_codec(s, st, NULL)) < 0)
655 if (st->request_probe <= 0) {
656 s->raw_packet_buffer = pktl->next;
657 s->raw_packet_buffer_remaining_size += pkt->size;
666 ret = s->iformat->read_packet(s, pkt);
668 if (!pktl || ret == AVERROR(EAGAIN))
670 for (i = 0; i < s->nb_streams; i++) {
672 if (st->probe_packets)
673 if ((err = probe_codec(s, st, NULL)) < 0)
675 av_assert0(st->request_probe <= 0);
680 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
681 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
682 av_log(s, AV_LOG_WARNING,
683 "Dropped corrupted packet (stream = %d)\n",
689 if (pkt->stream_index >= (unsigned)s->nb_streams) {
690 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
694 st = s->streams[pkt->stream_index];
696 if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
697 // correct first time stamps to negative values
698 if (!is_relative(st->first_dts))
699 st->first_dts = wrap_timestamp(st, st->first_dts);
700 if (!is_relative(st->start_time))
701 st->start_time = wrap_timestamp(st, st->start_time);
702 if (!is_relative(st->cur_dts))
703 st->cur_dts = wrap_timestamp(st, st->cur_dts);
706 pkt->dts = wrap_timestamp(st, pkt->dts);
707 pkt->pts = wrap_timestamp(st, pkt->pts);
709 force_codec_ids(s, st);
711 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
712 if (s->use_wallclock_as_timestamps)
713 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
715 if (!pktl && st->request_probe <= 0)
718 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
719 s->raw_packet_buffer_remaining_size -= pkt->size;
721 if ((err = probe_codec(s, st, pkt)) < 0)
727 /**********************************************************/
729 static int determinable_frame_size(AVCodecContext *avctx)
731 if (/*avctx->codec_id == AV_CODEC_ID_AAC ||*/
732 avctx->codec_id == AV_CODEC_ID_MP1 ||
733 avctx->codec_id == AV_CODEC_ID_MP2 ||
734 avctx->codec_id == AV_CODEC_ID_MP3/* ||
735 avctx->codec_id == AV_CODEC_ID_CELT*/)
741 * Return the frame duration in seconds. Return 0 if not available.
743 void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
744 AVCodecParserContext *pc, AVPacket *pkt)
746 AVRational codec_framerate = s->iformat ? st->codec->framerate :
747 av_mul_q(av_inv_q(st->codec->time_base), (AVRational){1, st->codec->ticks_per_frame});
752 switch (st->codec->codec_type) {
753 case AVMEDIA_TYPE_VIDEO:
754 if (st->r_frame_rate.num && !pc && s->iformat) {
755 *pnum = st->r_frame_rate.den;
756 *pden = st->r_frame_rate.num;
757 } else if (st->time_base.num * 1000LL > st->time_base.den) {
758 *pnum = st->time_base.num;
759 *pden = st->time_base.den;
760 } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
761 av_assert0(st->codec->ticks_per_frame);
762 av_reduce(pnum, pden,
764 codec_framerate.num * (int64_t)st->codec->ticks_per_frame,
767 if (pc && pc->repeat_pict) {
768 av_assert0(s->iformat); // this may be wrong for interlaced encoding but its not used for that case
769 av_reduce(pnum, pden,
770 (*pnum) * (1LL + pc->repeat_pict),
774 /* If this codec can be interlaced or progressive then we need
775 * a parser to compute duration of a packet. Thus if we have
776 * no parser in such case leave duration undefined. */
777 if (st->codec->ticks_per_frame > 1 && !pc)
781 case AVMEDIA_TYPE_AUDIO:
782 frame_size = av_get_audio_frame_duration(st->codec, pkt->size);
783 if (frame_size <= 0 || st->codec->sample_rate <= 0)
786 *pden = st->codec->sample_rate;
793 static int is_intra_only(AVCodecContext *enc) {
794 const AVCodecDescriptor *desc;
796 if (enc->codec_type != AVMEDIA_TYPE_VIDEO)
799 desc = av_codec_get_codec_descriptor(enc);
801 desc = avcodec_descriptor_get(enc->codec_id);
802 av_codec_set_codec_descriptor(enc, desc);
805 return !!(desc->props & AV_CODEC_PROP_INTRA_ONLY);
809 static int has_decode_delay_been_guessed(AVStream *st)
811 if (st->codec->codec_id != AV_CODEC_ID_H264) return 1;
812 if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
814 #if CONFIG_H264_DECODER
815 if (st->codec->has_b_frames &&
816 avpriv_h264_has_num_reorder_frames(st->codec) == st->codec->has_b_frames)
819 if (st->codec->has_b_frames<3)
820 return st->nb_decoded_frames >= 7;
821 else if (st->codec->has_b_frames<4)
822 return st->nb_decoded_frames >= 18;
824 return st->nb_decoded_frames >= 20;
827 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
831 if (pktl == s->packet_buffer_end)
832 return s->parse_queue;
836 static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
837 int onein_oneout = st->codec->codec_id != AV_CODEC_ID_H264 &&
838 st->codec->codec_id != AV_CODEC_ID_HEVC;
841 int delay = st->codec->has_b_frames;
844 if (dts == AV_NOPTS_VALUE) {
845 int64_t best_score = INT64_MAX;
846 for (i = 0; i<delay; i++) {
847 if (st->pts_reorder_error_count[i]) {
848 int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
849 if (score < best_score) {
856 for (i = 0; i<delay; i++) {
857 if (pts_buffer[i] != AV_NOPTS_VALUE) {
858 int64_t diff = FFABS(pts_buffer[i] - dts)
859 + (uint64_t)st->pts_reorder_error[i];
860 diff = FFMAX(diff, st->pts_reorder_error[i]);
861 st->pts_reorder_error[i] = diff;
862 st->pts_reorder_error_count[i]++;
863 if (st->pts_reorder_error_count[i] > 250) {
864 st->pts_reorder_error[i] >>= 1;
865 st->pts_reorder_error_count[i] >>= 1;
872 if (dts == AV_NOPTS_VALUE)
878 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
879 int64_t dts, int64_t pts, AVPacket *pkt)
881 AVStream *st = s->streams[stream_index];
882 AVPacketList *pktl = s->packet_buffer ? s->packet_buffer : s->parse_queue;
883 int64_t pts_buffer[MAX_REORDER_DELAY+1];
887 if (st->first_dts != AV_NOPTS_VALUE ||
888 dts == AV_NOPTS_VALUE ||
889 st->cur_dts == AV_NOPTS_VALUE ||
893 delay = st->codec->has_b_frames;
894 st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
896 shift = st->first_dts - RELATIVE_TS_BASE;
898 for (i = 0; i<MAX_REORDER_DELAY+1; i++)
899 pts_buffer[i] = AV_NOPTS_VALUE;
901 if (is_relative(pts))
904 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
905 if (pktl->pkt.stream_index != stream_index)
907 if (is_relative(pktl->pkt.pts))
908 pktl->pkt.pts += shift;
910 if (is_relative(pktl->pkt.dts))
911 pktl->pkt.dts += shift;
913 if (st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
914 st->start_time = pktl->pkt.pts;
916 if (pktl->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)) {
917 pts_buffer[0] = pktl->pkt.pts;
918 for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
919 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
921 pktl->pkt.dts = select_from_pts_buffer(st, pts_buffer, pktl->pkt.dts);
925 if (st->start_time == AV_NOPTS_VALUE)
926 st->start_time = pts;
929 static void update_initial_durations(AVFormatContext *s, AVStream *st,
930 int stream_index, int duration)
932 AVPacketList *pktl = s->packet_buffer ? s->packet_buffer : s->parse_queue;
933 int64_t cur_dts = RELATIVE_TS_BASE;
935 if (st->first_dts != AV_NOPTS_VALUE) {
936 if (st->update_initial_durations_done)
938 st->update_initial_durations_done = 1;
939 cur_dts = st->first_dts;
940 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
941 if (pktl->pkt.stream_index == stream_index) {
942 if (pktl->pkt.pts != pktl->pkt.dts ||
943 pktl->pkt.dts != AV_NOPTS_VALUE ||
949 if (pktl && pktl->pkt.dts != st->first_dts) {
950 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %d) in the queue\n",
951 av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
955 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
958 pktl = s->packet_buffer ? s->packet_buffer : s->parse_queue;
959 st->first_dts = cur_dts;
960 } else if (st->cur_dts != RELATIVE_TS_BASE)
963 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
964 if (pktl->pkt.stream_index != stream_index)
966 if (pktl->pkt.pts == pktl->pkt.dts &&
967 (pktl->pkt.dts == AV_NOPTS_VALUE || pktl->pkt.dts == st->first_dts) &&
968 !pktl->pkt.duration) {
969 pktl->pkt.dts = cur_dts;
970 if (!st->codec->has_b_frames)
971 pktl->pkt.pts = cur_dts;
972 // if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
973 pktl->pkt.duration = duration;
976 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
979 st->cur_dts = cur_dts;
982 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
983 AVCodecParserContext *pc, AVPacket *pkt,
984 int64_t next_dts, int64_t next_pts)
986 int num, den, presentation_delayed, delay, i;
989 int onein_oneout = st->codec->codec_id != AV_CODEC_ID_H264 &&
990 st->codec->codec_id != AV_CODEC_ID_HEVC;
992 if (s->flags & AVFMT_FLAG_NOFILLIN)
995 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
996 if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
997 if (st->last_dts_for_order_check <= pkt->dts) {
1000 av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
1001 "DTS %"PRIi64" < %"PRIi64" out of order\n",
1003 st->last_dts_for_order_check);
1004 st->dts_misordered++;
1006 if (st->dts_ordered + st->dts_misordered > 250) {
1007 st->dts_ordered >>= 1;
1008 st->dts_misordered >>= 1;
1012 st->last_dts_for_order_check = pkt->dts;
1013 if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
1014 pkt->dts = AV_NOPTS_VALUE;
1017 if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1018 pkt->dts = AV_NOPTS_VALUE;
1020 if (pc && pc->pict_type == AV_PICTURE_TYPE_B
1021 && !st->codec->has_b_frames)
1022 //FIXME Set low_delay = 0 when has_b_frames = 1
1023 st->codec->has_b_frames = 1;
1025 /* do we have a video B-frame ? */
1026 delay = st->codec->has_b_frames;
1027 presentation_delayed = 0;
1029 /* XXX: need has_b_frame, but cannot get it if the codec is
1030 * not initialized */
1032 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1033 presentation_delayed = 1;
1035 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
1036 st->pts_wrap_bits < 63 &&
1037 pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
1038 if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
1039 pkt->dts -= 1LL << st->pts_wrap_bits;
1041 pkt->pts += 1LL << st->pts_wrap_bits;
1044 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1045 * We take the conservative approach and discard both.
1046 * Note: If this is misbehaving for an H.264 file, then possibly
1047 * presentation_delayed is not set correctly. */
1048 if (delay == 1 && pkt->dts == pkt->pts &&
1049 pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
1050 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1051 if ( strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
1052 && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1053 pkt->dts = AV_NOPTS_VALUE;
1056 duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
1057 if (pkt->duration == 0) {
1058 ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
1060 duration = (AVRational) {num, den};
1061 pkt->duration = av_rescale_rnd(1,
1062 num * (int64_t) st->time_base.den,
1063 den * (int64_t) st->time_base.num,
1068 if (pkt->duration != 0 && (s->packet_buffer || s->parse_queue))
1069 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1071 /* Correct timestamps with byte offset if demuxers only have timestamps
1072 * on packet boundaries */
1073 if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
1074 /* this will estimate bitrate based on this frame's duration and size */
1075 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1076 if (pkt->pts != AV_NOPTS_VALUE)
1078 if (pkt->dts != AV_NOPTS_VALUE)
1082 /* This may be redundant, but it should not hurt. */
1083 if (pkt->dts != AV_NOPTS_VALUE &&
1084 pkt->pts != AV_NOPTS_VALUE &&
1085 pkt->pts > pkt->dts)
1086 presentation_delayed = 1;
1089 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%d delay:%d onein_oneout:%d\n",
1090 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
1091 pkt->stream_index, pc, pkt->duration, delay, onein_oneout);
1092 /* Interpolate PTS and DTS if they are not present. We skip H264
1093 * currently because delay and has_b_frames are not reliably set. */
1094 if ((delay == 0 || (delay == 1 && pc)) &&
1096 if (presentation_delayed) {
1097 /* DTS = decompression timestamp */
1098 /* PTS = presentation timestamp */
1099 if (pkt->dts == AV_NOPTS_VALUE)
1100 pkt->dts = st->last_IP_pts;
1101 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1102 if (pkt->dts == AV_NOPTS_VALUE)
1103 pkt->dts = st->cur_dts;
1105 /* This is tricky: the dts must be incremented by the duration
1106 * of the frame we are displaying, i.e. the last I- or P-frame. */
1107 if (st->last_IP_duration == 0)
1108 st->last_IP_duration = pkt->duration;
1109 if (pkt->dts != AV_NOPTS_VALUE)
1110 st->cur_dts = pkt->dts + st->last_IP_duration;
1111 if (pkt->dts != AV_NOPTS_VALUE &&
1112 pkt->pts == AV_NOPTS_VALUE &&
1113 st->last_IP_duration > 0 &&
1114 ((uint64_t)st->cur_dts - (uint64_t)next_dts + 1) <= 2 &&
1115 next_dts != next_pts &&
1116 next_pts != AV_NOPTS_VALUE)
1117 pkt->pts = next_dts;
1119 st->last_IP_duration = pkt->duration;
1120 st->last_IP_pts = pkt->pts;
1121 /* Cannot compute PTS if not present (we can compute it only
1122 * by knowing the future. */
1123 } else if (pkt->pts != AV_NOPTS_VALUE ||
1124 pkt->dts != AV_NOPTS_VALUE ||
1127 /* presentation is not delayed : PTS and DTS are the same */
1128 if (pkt->pts == AV_NOPTS_VALUE)
1129 pkt->pts = pkt->dts;
1130 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1132 if (pkt->pts == AV_NOPTS_VALUE)
1133 pkt->pts = st->cur_dts;
1134 pkt->dts = pkt->pts;
1135 if (pkt->pts != AV_NOPTS_VALUE)
1136 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
1140 if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)) {
1141 st->pts_buffer[0] = pkt->pts;
1142 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
1143 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
1145 pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
1147 // We skipped it above so we try here.
1149 // This should happen on the first packet
1150 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1151 if (pkt->dts > st->cur_dts)
1152 st->cur_dts = pkt->dts;
1154 av_dlog(NULL, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1155 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
1158 if (is_intra_only(st->codec))
1159 pkt->flags |= AV_PKT_FLAG_KEY;
1161 pkt->convergence_duration = pc->convergence_duration;
1164 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1167 AVPacketList *pktl = *pkt_buf;
1168 *pkt_buf = pktl->next;
1169 av_free_packet(&pktl->pkt);
1172 *pkt_buf_end = NULL;
1176 * Parse a packet, add all split parts to parse_queue.
1178 * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
1180 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1182 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1183 AVStream *st = s->streams[stream_index];
1184 uint8_t *data = pkt ? pkt->data : NULL;
1185 int size = pkt ? pkt->size : 0;
1186 int ret = 0, got_output = 0;
1189 av_init_packet(&flush_pkt);
1192 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1193 // preserve 0-size sync packets
1194 compute_pkt_fields(s, st, st->parser, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1197 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1199 int64_t next_pts = pkt->pts;
1200 int64_t next_dts = pkt->dts;
1202 av_init_packet(&out_pkt);
1203 len = av_parser_parse2(st->parser, st->codec,
1204 &out_pkt.data, &out_pkt.size, data, size,
1205 pkt->pts, pkt->dts, pkt->pos);
1207 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1209 /* increment read pointer */
1213 got_output = !!out_pkt.size;
1218 if (pkt->side_data) {
1219 out_pkt.side_data = pkt->side_data;
1220 out_pkt.side_data_elems = pkt->side_data_elems;
1221 pkt->side_data = NULL;
1222 pkt->side_data_elems = 0;
1225 /* set the duration */
1226 out_pkt.duration = 0;
1227 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1228 if (st->codec->sample_rate > 0) {
1230 av_rescale_q_rnd(st->parser->duration,
1231 (AVRational) { 1, st->codec->sample_rate },
1237 out_pkt.stream_index = st->index;
1238 out_pkt.pts = st->parser->pts;
1239 out_pkt.dts = st->parser->dts;
1240 out_pkt.pos = st->parser->pos;
1242 if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1243 out_pkt.pos = st->parser->frame_offset;
1245 if (st->parser->key_frame == 1 ||
1246 (st->parser->key_frame == -1 &&
1247 st->parser->pict_type == AV_PICTURE_TYPE_I))
1248 out_pkt.flags |= AV_PKT_FLAG_KEY;
1250 if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1251 out_pkt.flags |= AV_PKT_FLAG_KEY;
1253 compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts);
1255 if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
1256 out_pkt.buf = pkt->buf;
1258 #if FF_API_DESTRUCT_PACKET
1259 FF_DISABLE_DEPRECATION_WARNINGS
1260 out_pkt.destruct = pkt->destruct;
1261 pkt->destruct = NULL;
1262 FF_ENABLE_DEPRECATION_WARNINGS
1265 if ((ret = av_dup_packet(&out_pkt)) < 0)
1268 if (!add_to_pktbuf(&s->parse_queue, &out_pkt, &s->parse_queue_end)) {
1269 av_free_packet(&out_pkt);
1270 ret = AVERROR(ENOMEM);
1275 /* end of the stream => close and free the parser */
1276 if (pkt == &flush_pkt) {
1277 av_parser_close(st->parser);
1282 av_free_packet(pkt);
1286 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1287 AVPacketList **pkt_buffer_end,
1291 av_assert0(*pkt_buffer);
1294 *pkt_buffer = pktl->next;
1296 *pkt_buffer_end = NULL;
1301 static int64_t ts_to_samples(AVStream *st, int64_t ts)
1303 return av_rescale(ts, st->time_base.num * st->codec->sample_rate, st->time_base.den);
1306 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1308 int ret = 0, i, got_packet = 0;
1309 AVDictionary *metadata = NULL;
1311 av_init_packet(pkt);
1313 while (!got_packet && !s->parse_queue) {
1317 /* read next packet */
1318 ret = ff_read_packet(s, &cur_pkt);
1320 if (ret == AVERROR(EAGAIN))
1322 /* flush the parsers */
1323 for (i = 0; i < s->nb_streams; i++) {
1325 if (st->parser && st->need_parsing)
1326 parse_packet(s, NULL, st->index);
1328 /* all remaining packets are now in parse_queue =>
1329 * really terminate parsing */
1333 st = s->streams[cur_pkt.stream_index];
1335 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1336 cur_pkt.dts != AV_NOPTS_VALUE &&
1337 cur_pkt.pts < cur_pkt.dts) {
1338 av_log(s, AV_LOG_WARNING,
1339 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1340 cur_pkt.stream_index,
1341 av_ts2str(cur_pkt.pts),
1342 av_ts2str(cur_pkt.dts),
1345 if (s->debug & FF_FDEBUG_TS)
1346 av_log(s, AV_LOG_DEBUG,
1347 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
1348 cur_pkt.stream_index,
1349 av_ts2str(cur_pkt.pts),
1350 av_ts2str(cur_pkt.dts),
1351 cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
1353 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1354 st->parser = av_parser_init(st->codec->codec_id);
1356 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1357 "%s, packets or times may be invalid.\n",
1358 avcodec_get_name(st->codec->codec_id));
1359 /* no parser available: just output the raw packets */
1360 st->need_parsing = AVSTREAM_PARSE_NONE;
1361 } else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1362 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1363 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1364 st->parser->flags |= PARSER_FLAG_ONCE;
1365 else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1366 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1369 if (!st->need_parsing || !st->parser) {
1370 /* no parsing needed: we just output the packet as is */
1372 compute_pkt_fields(s, st, NULL, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1373 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1374 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1375 ff_reduce_index(s, st->index);
1376 av_add_index_entry(st, pkt->pos, pkt->dts,
1377 0, 0, AVINDEX_KEYFRAME);
1380 } else if (st->discard < AVDISCARD_ALL) {
1381 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1385 av_free_packet(&cur_pkt);
1387 if (pkt->flags & AV_PKT_FLAG_KEY)
1388 st->skip_to_keyframe = 0;
1389 if (st->skip_to_keyframe) {
1390 av_free_packet(&cur_pkt);
1398 if (!got_packet && s->parse_queue)
1399 ret = read_from_packet_buffer(&s->parse_queue, &s->parse_queue_end, pkt);
1402 AVStream *st = s->streams[pkt->stream_index];
1403 int discard_padding = 0;
1404 if (st->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
1405 int64_t pts = pkt->pts - (is_relative(pkt->pts) ? RELATIVE_TS_BASE : 0);
1406 int64_t sample = ts_to_samples(st, pts);
1407 int duration = ts_to_samples(st, pkt->duration);
1408 int64_t end_sample = sample + duration;
1409 if (duration > 0 && end_sample >= st->first_discard_sample &&
1410 sample < st->last_discard_sample)
1411 discard_padding = FFMIN(end_sample - st->first_discard_sample, duration);
1413 if (st->skip_samples || discard_padding) {
1414 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1416 AV_WL32(p, st->skip_samples);
1417 AV_WL32(p + 4, discard_padding);
1418 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d\n", st->skip_samples);
1420 st->skip_samples = 0;
1423 if (st->inject_global_side_data) {
1424 for (i = 0; i < st->nb_side_data; i++) {
1425 AVPacketSideData *src_sd = &st->side_data[i];
1428 if (av_packet_get_side_data(pkt, src_sd->type, NULL))
1431 dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
1433 av_log(s, AV_LOG_WARNING, "Could not inject global side data\n");
1437 memcpy(dst_data, src_sd->data, src_sd->size);
1439 st->inject_global_side_data = 0;
1442 if (!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
1443 av_packet_merge_side_data(pkt);
1446 av_opt_get_dict_val(s, "metadata", AV_OPT_SEARCH_CHILDREN, &metadata);
1448 s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
1449 av_dict_copy(&s->metadata, metadata, 0);
1450 av_dict_free(&metadata);
1451 av_opt_set_dict_val(s, "metadata", NULL, AV_OPT_SEARCH_CHILDREN);
1454 if (s->debug & FF_FDEBUG_TS)
1455 av_log(s, AV_LOG_DEBUG,
1456 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1457 "size=%d, duration=%d, flags=%d\n",
1459 av_ts2str(pkt->pts),
1460 av_ts2str(pkt->dts),
1461 pkt->size, pkt->duration, pkt->flags);
1466 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1468 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1474 ret = s->packet_buffer
1475 ? read_from_packet_buffer(&s->packet_buffer,
1476 &s->packet_buffer_end, pkt)
1477 : read_frame_internal(s, pkt);
1484 AVPacketList *pktl = s->packet_buffer;
1487 AVPacket *next_pkt = &pktl->pkt;
1489 if (next_pkt->dts != AV_NOPTS_VALUE) {
1490 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1491 // last dts seen for this stream. if any of packets following
1492 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1493 int64_t last_dts = next_pkt->dts;
1494 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1495 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1496 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0)) {
1497 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) {
1499 next_pkt->pts = pktl->pkt.dts;
1501 if (last_dts != AV_NOPTS_VALUE) {
1502 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1503 last_dts = pktl->pkt.dts;
1508 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1509 // Fixing the last reference frame had none pts issue (For MXF etc).
1510 // We only do this when
1512 // 2. we are not able to resolve a pts value for current packet.
1513 // 3. the packets for this stream at the end of the files had valid dts.
1514 next_pkt->pts = last_dts + next_pkt->duration;
1516 pktl = s->packet_buffer;
1519 /* read packet from packet buffer, if there is data */
1520 st = s->streams[next_pkt->stream_index];
1521 if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
1522 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1523 ret = read_from_packet_buffer(&s->packet_buffer,
1524 &s->packet_buffer_end, pkt);
1529 ret = read_frame_internal(s, pkt);
1531 if (pktl && ret != AVERROR(EAGAIN)) {
1538 if (av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1539 &s->packet_buffer_end)) < 0)
1540 return AVERROR(ENOMEM);
1545 st = s->streams[pkt->stream_index];
1546 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1547 ff_reduce_index(s, st->index);
1548 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1551 if (is_relative(pkt->dts))
1552 pkt->dts -= RELATIVE_TS_BASE;
1553 if (is_relative(pkt->pts))
1554 pkt->pts -= RELATIVE_TS_BASE;
1559 /* XXX: suppress the packet queue */
1560 static void flush_packet_queue(AVFormatContext *s)
1562 free_packet_buffer(&s->parse_queue, &s->parse_queue_end);
1563 free_packet_buffer(&s->packet_buffer, &s->packet_buffer_end);
1564 free_packet_buffer(&s->raw_packet_buffer, &s->raw_packet_buffer_end);
1566 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1569 /*******************************************************/
1572 int av_find_default_stream_index(AVFormatContext *s)
1576 int best_stream = 0;
1577 int best_score = -1;
1579 if (s->nb_streams <= 0)
1581 for (i = 0; i < s->nb_streams; i++) {
1584 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1585 !(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
1586 if (!st->codec->width && !st->codec->height && !st->codec_info_nb_frames)
1591 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1592 if (!st->codec->sample_rate && !st->codec_info_nb_frames)
1598 if (score > best_score) {
1606 /** Flush the frame reader. */
1607 void ff_read_frame_flush(AVFormatContext *s)
1612 flush_packet_queue(s);
1614 /* Reset read state for each stream. */
1615 for (i = 0; i < s->nb_streams; i++) {
1619 av_parser_close(st->parser);
1622 st->last_IP_pts = AV_NOPTS_VALUE;
1623 st->last_dts_for_order_check = AV_NOPTS_VALUE;
1624 if (st->first_dts == AV_NOPTS_VALUE)
1625 st->cur_dts = RELATIVE_TS_BASE;
1627 /* We set the current DTS to an unspecified origin. */
1628 st->cur_dts = AV_NOPTS_VALUE;
1630 st->probe_packets = MAX_PROBE_PACKETS;
1632 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1633 st->pts_buffer[j] = AV_NOPTS_VALUE;
1635 if (s->internal->inject_global_side_data)
1636 st->inject_global_side_data = 1;
1640 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1644 for (i = 0; i < s->nb_streams; i++) {
1645 AVStream *st = s->streams[i];
1648 av_rescale(timestamp,
1649 st->time_base.den * (int64_t) ref_st->time_base.num,
1650 st->time_base.num * (int64_t) ref_st->time_base.den);
1654 void ff_reduce_index(AVFormatContext *s, int stream_index)
1656 AVStream *st = s->streams[stream_index];
1657 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1659 if ((unsigned) st->nb_index_entries >= max_entries) {
1661 for (i = 0; 2 * i < st->nb_index_entries; i++)
1662 st->index_entries[i] = st->index_entries[2 * i];
1663 st->nb_index_entries = i;
1667 int ff_add_index_entry(AVIndexEntry **index_entries,
1668 int *nb_index_entries,
1669 unsigned int *index_entries_allocated_size,
1670 int64_t pos, int64_t timestamp,
1671 int size, int distance, int flags)
1673 AVIndexEntry *entries, *ie;
1676 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1679 if (timestamp == AV_NOPTS_VALUE)
1680 return AVERROR(EINVAL);
1682 if (size < 0 || size > 0x3FFFFFFF)
1683 return AVERROR(EINVAL);
1685 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1686 timestamp -= RELATIVE_TS_BASE;
1688 entries = av_fast_realloc(*index_entries,
1689 index_entries_allocated_size,
1690 (*nb_index_entries + 1) *
1691 sizeof(AVIndexEntry));
1695 *index_entries = entries;
1697 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
1698 timestamp, AVSEEK_FLAG_ANY);
1701 index = (*nb_index_entries)++;
1702 ie = &entries[index];
1703 av_assert0(index == 0 || ie[-1].timestamp < timestamp);
1705 ie = &entries[index];
1706 if (ie->timestamp != timestamp) {
1707 if (ie->timestamp <= timestamp)
1709 memmove(entries + index + 1, entries + index,
1710 sizeof(AVIndexEntry) * (*nb_index_entries - index));
1711 (*nb_index_entries)++;
1712 } else if (ie->pos == pos && distance < ie->min_distance)
1713 // do not reduce the distance
1714 distance = ie->min_distance;
1718 ie->timestamp = timestamp;
1719 ie->min_distance = distance;
1726 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
1727 int size, int distance, int flags)
1729 timestamp = wrap_timestamp(st, timestamp);
1730 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1731 &st->index_entries_allocated_size, pos,
1732 timestamp, size, distance, flags);
1735 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1736 int64_t wanted_timestamp, int flags)
1744 // Optimize appending index entries at the end.
1745 if (b && entries[b - 1].timestamp < wanted_timestamp)
1750 timestamp = entries[m].timestamp;
1751 if (timestamp >= wanted_timestamp)
1753 if (timestamp <= wanted_timestamp)
1756 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1758 if (!(flags & AVSEEK_FLAG_ANY))
1759 while (m >= 0 && m < nb_entries &&
1760 !(entries[m].flags & AVINDEX_KEYFRAME))
1761 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1763 if (m == nb_entries)
1768 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
1770 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1771 wanted_timestamp, flags);
1774 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
1775 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1777 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
1778 if (stream_index >= 0)
1779 ts = wrap_timestamp(s->streams[stream_index], ts);
1783 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
1784 int64_t target_ts, int flags)
1786 AVInputFormat *avif = s->iformat;
1787 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1788 int64_t ts_min, ts_max, ts;
1793 if (stream_index < 0)
1796 av_dlog(s, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1799 ts_min = AV_NOPTS_VALUE;
1800 pos_limit = -1; // GCC falsely says it may be uninitialized.
1802 st = s->streams[stream_index];
1803 if (st->index_entries) {
1806 /* FIXME: Whole function must be checked for non-keyframe entries in
1807 * index case, especially read_timestamp(). */
1808 index = av_index_search_timestamp(st, target_ts,
1809 flags | AVSEEK_FLAG_BACKWARD);
1810 index = FFMAX(index, 0);
1811 e = &st->index_entries[index];
1813 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
1815 ts_min = e->timestamp;
1816 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
1817 pos_min, av_ts2str(ts_min));
1819 av_assert1(index == 0);
1822 index = av_index_search_timestamp(st, target_ts,
1823 flags & ~AVSEEK_FLAG_BACKWARD);
1824 av_assert0(index < st->nb_index_entries);
1826 e = &st->index_entries[index];
1827 av_assert1(e->timestamp >= target_ts);
1829 ts_max = e->timestamp;
1830 pos_limit = pos_max - e->min_distance;
1831 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
1832 " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
1836 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
1837 ts_min, ts_max, flags, &ts, avif->read_timestamp);
1842 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1845 ff_read_frame_flush(s);
1846 ff_update_cur_dts(s, st, ts);
1851 int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
1852 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1854 int64_t step = 1024;
1855 int64_t limit, ts_max;
1856 int64_t filesize = avio_size(s->pb);
1857 int64_t pos_max = filesize - 1;
1860 pos_max = FFMAX(0, (pos_max) - step);
1861 ts_max = ff_read_timestamp(s, stream_index,
1862 &pos_max, limit, read_timestamp);
1864 } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
1865 if (ts_max == AV_NOPTS_VALUE)
1869 int64_t tmp_pos = pos_max + 1;
1870 int64_t tmp_ts = ff_read_timestamp(s, stream_index,
1871 &tmp_pos, INT64_MAX, read_timestamp);
1872 if (tmp_ts == AV_NOPTS_VALUE)
1874 av_assert0(tmp_pos > pos_max);
1877 if (tmp_pos >= filesize)
1889 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1890 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1891 int64_t ts_min, int64_t ts_max,
1892 int flags, int64_t *ts_ret,
1893 int64_t (*read_timestamp)(struct AVFormatContext *, int,
1894 int64_t *, int64_t))
1901 av_dlog(s, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1903 if (ts_min == AV_NOPTS_VALUE) {
1904 pos_min = s->data_offset;
1905 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
1906 if (ts_min == AV_NOPTS_VALUE)
1910 if (ts_min >= target_ts) {
1915 if (ts_max == AV_NOPTS_VALUE) {
1916 if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
1918 pos_limit = pos_max;
1921 if (ts_max <= target_ts) {
1926 av_assert0(ts_min < ts_max);
1929 while (pos_min < pos_limit) {
1931 "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
1932 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
1933 av_assert0(pos_limit <= pos_max);
1935 if (no_change == 0) {
1936 int64_t approximate_keyframe_distance = pos_max - pos_limit;
1937 // interpolate position (better than dichotomy)
1938 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
1940 pos_min - approximate_keyframe_distance;
1941 } else if (no_change == 1) {
1942 // bisection if interpolation did not change min / max pos last time
1943 pos = (pos_min + pos_limit) >> 1;
1945 /* linear search if bisection failed, can only happen if there
1946 * are very few or no keyframes between min/max */
1951 else if (pos > pos_limit)
1955 // May pass pos_limit instead of -1.
1956 ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
1961 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
1962 " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
1963 pos_min, pos, pos_max,
1964 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
1965 pos_limit, start_pos, no_change);
1966 if (ts == AV_NOPTS_VALUE) {
1967 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1970 if (target_ts <= ts) {
1971 pos_limit = start_pos - 1;
1975 if (target_ts >= ts) {
1981 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1982 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1985 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
1987 ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
1988 av_dlog(s, "pos=0x%"PRIx64" %s<=%s<=%s\n",
1989 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
1995 static int seek_frame_byte(AVFormatContext *s, int stream_index,
1996 int64_t pos, int flags)
1998 int64_t pos_min, pos_max;
2000 pos_min = s->data_offset;
2001 pos_max = avio_size(s->pb) - 1;
2005 else if (pos > pos_max)
2008 avio_seek(s->pb, pos, SEEK_SET);
2010 s->io_repositioned = 1;
2015 static int seek_frame_generic(AVFormatContext *s, int stream_index,
2016 int64_t timestamp, int flags)
2023 st = s->streams[stream_index];
2025 index = av_index_search_timestamp(st, timestamp, flags);
2027 if (index < 0 && st->nb_index_entries &&
2028 timestamp < st->index_entries[0].timestamp)
2031 if (index < 0 || index == st->nb_index_entries - 1) {
2035 if (st->nb_index_entries) {
2036 av_assert0(st->index_entries);
2037 ie = &st->index_entries[st->nb_index_entries - 1];
2038 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2040 ff_update_cur_dts(s, st, ie->timestamp);
2042 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
2048 read_status = av_read_frame(s, &pkt);
2049 } while (read_status == AVERROR(EAGAIN));
2050 if (read_status < 0)
2052 av_free_packet(&pkt);
2053 if (stream_index == pkt.stream_index && pkt.dts > timestamp) {
2054 if (pkt.flags & AV_PKT_FLAG_KEY)
2056 if (nonkey++ > 1000 && st->codec->codec_id != AV_CODEC_ID_CDGRAPHICS) {
2057 av_log(s, AV_LOG_ERROR,"seek_frame_generic failed as this stream seems to contain no keyframes after the target timestamp, %d non keyframes found\n", nonkey);
2062 index = av_index_search_timestamp(st, timestamp, flags);
2067 ff_read_frame_flush(s);
2068 if (s->iformat->read_seek)
2069 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2071 ie = &st->index_entries[index];
2072 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2074 ff_update_cur_dts(s, st, ie->timestamp);
2079 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2080 int64_t timestamp, int flags)
2085 if (flags & AVSEEK_FLAG_BYTE) {
2086 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2088 ff_read_frame_flush(s);
2089 return seek_frame_byte(s, stream_index, timestamp, flags);
2092 if (stream_index < 0) {
2093 stream_index = av_find_default_stream_index(s);
2094 if (stream_index < 0)
2097 st = s->streams[stream_index];
2098 /* timestamp for default must be expressed in AV_TIME_BASE units */
2099 timestamp = av_rescale(timestamp, st->time_base.den,
2100 AV_TIME_BASE * (int64_t) st->time_base.num);
2103 /* first, we try the format specific seek */
2104 if (s->iformat->read_seek) {
2105 ff_read_frame_flush(s);
2106 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2112 if (s->iformat->read_timestamp &&
2113 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2114 ff_read_frame_flush(s);
2115 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2116 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2117 ff_read_frame_flush(s);
2118 return seek_frame_generic(s, stream_index, timestamp, flags);
2123 int av_seek_frame(AVFormatContext *s, int stream_index,
2124 int64_t timestamp, int flags)
2128 if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2129 int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2130 if ((flags & AVSEEK_FLAG_BACKWARD))
2134 return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2135 flags & ~AVSEEK_FLAG_BACKWARD);
2138 ret = seek_frame_internal(s, stream_index, timestamp, flags);
2141 ret = avformat_queue_attached_pictures(s);
2146 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
2147 int64_t ts, int64_t max_ts, int flags)
2149 if (min_ts > ts || max_ts < ts)
2151 if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2152 return AVERROR(EINVAL);
2155 flags |= AVSEEK_FLAG_ANY;
2156 flags &= ~AVSEEK_FLAG_BACKWARD;
2158 if (s->iformat->read_seek2) {
2160 ff_read_frame_flush(s);
2162 if (stream_index == -1 && s->nb_streams == 1) {
2163 AVRational time_base = s->streams[0]->time_base;
2164 ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2165 min_ts = av_rescale_rnd(min_ts, time_base.den,
2166 time_base.num * (int64_t)AV_TIME_BASE,
2167 AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
2168 max_ts = av_rescale_rnd(max_ts, time_base.den,
2169 time_base.num * (int64_t)AV_TIME_BASE,
2170 AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
2173 ret = s->iformat->read_seek2(s, stream_index, min_ts,
2177 ret = avformat_queue_attached_pictures(s);
2181 if (s->iformat->read_timestamp) {
2182 // try to seek via read_timestamp()
2185 // Fall back on old API if new is not implemented but old is.
2186 // Note the old API has somewhat different semantics.
2187 if (s->iformat->read_seek || 1) {
2188 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2189 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2190 if (ret<0 && ts != min_ts && max_ts != ts) {
2191 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2193 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2198 // try some generic seek like seek_frame_generic() but with new ts semantics
2199 return -1; //unreachable
2202 /*******************************************************/
2205 * Return TRUE if the stream has accurate duration in any stream.
2207 * @return TRUE if the stream has accurate duration for at least one component.
2209 static int has_duration(AVFormatContext *ic)
2214 for (i = 0; i < ic->nb_streams; i++) {
2215 st = ic->streams[i];
2216 if (st->duration != AV_NOPTS_VALUE)
2219 if (ic->duration != AV_NOPTS_VALUE)
2225 * Estimate the stream timings from the one of each components.
2227 * Also computes the global bitrate if possible.
2229 static void update_stream_timings(AVFormatContext *ic)
2231 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
2232 int64_t duration, duration1, filesize;
2237 start_time = INT64_MAX;
2238 start_time_text = INT64_MAX;
2239 end_time = INT64_MIN;
2240 duration = INT64_MIN;
2241 for (i = 0; i < ic->nb_streams; i++) {
2242 st = ic->streams[i];
2243 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2244 start_time1 = av_rescale_q(st->start_time, st->time_base,
2246 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codec->codec_type == AVMEDIA_TYPE_DATA) {
2247 if (start_time1 < start_time_text)
2248 start_time_text = start_time1;
2250 start_time = FFMIN(start_time, start_time1);
2251 end_time1 = AV_NOPTS_VALUE;
2252 if (st->duration != AV_NOPTS_VALUE) {
2253 end_time1 = start_time1 +
2254 av_rescale_q(st->duration, st->time_base,
2256 end_time = FFMAX(end_time, end_time1);
2258 for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
2259 if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2260 p->start_time = start_time1;
2261 if (p->end_time < end_time1)
2262 p->end_time = end_time1;
2265 if (st->duration != AV_NOPTS_VALUE) {
2266 duration1 = av_rescale_q(st->duration, st->time_base,
2268 duration = FFMAX(duration, duration1);
2271 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2272 start_time = start_time_text;
2273 else if (start_time > start_time_text)
2274 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2276 if (start_time != INT64_MAX) {
2277 ic->start_time = start_time;
2278 if (end_time != INT64_MIN) {
2279 if (ic->nb_programs) {
2280 for (i = 0; i < ic->nb_programs; i++) {
2281 p = ic->programs[i];
2282 if (p->start_time != AV_NOPTS_VALUE && p->end_time > p->start_time)
2283 duration = FFMAX(duration, p->end_time - p->start_time);
2286 duration = FFMAX(duration, end_time - start_time);
2289 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2290 ic->duration = duration;
2292 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
2293 /* compute the bitrate */
2294 double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2295 (double) ic->duration;
2296 if (bitrate >= 0 && bitrate <= INT_MAX)
2297 ic->bit_rate = bitrate;
2301 static void fill_all_stream_timings(AVFormatContext *ic)
2306 update_stream_timings(ic);
2307 for (i = 0; i < ic->nb_streams; i++) {
2308 st = ic->streams[i];
2309 if (st->start_time == AV_NOPTS_VALUE) {
2310 if (ic->start_time != AV_NOPTS_VALUE)
2311 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
2313 if (ic->duration != AV_NOPTS_VALUE)
2314 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
2320 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2322 int64_t filesize, duration;
2323 int i, show_warning = 0;
2326 /* if bit_rate is already set, we believe it */
2327 if (ic->bit_rate <= 0) {
2329 for (i = 0; i < ic->nb_streams; i++) {
2330 st = ic->streams[i];
2331 if (st->codec->bit_rate > 0) {
2332 if (INT_MAX - st->codec->bit_rate < bit_rate) {
2336 bit_rate += st->codec->bit_rate;
2337 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && st->codec_info_nb_frames > 1) {
2338 // If we have a videostream with packets but without a bitrate
2339 // then consider the sum not known
2344 ic->bit_rate = bit_rate;
2347 /* if duration is already set, we believe it */
2348 if (ic->duration == AV_NOPTS_VALUE &&
2349 ic->bit_rate != 0) {
2350 filesize = ic->pb ? avio_size(ic->pb) : 0;
2351 if (filesize > ic->data_offset) {
2352 filesize -= ic->data_offset;
2353 for (i = 0; i < ic->nb_streams; i++) {
2354 st = ic->streams[i];
2355 if ( st->time_base.num <= INT64_MAX / ic->bit_rate
2356 && st->duration == AV_NOPTS_VALUE) {
2357 duration = av_rescale(8 * filesize, st->time_base.den,
2359 (int64_t) st->time_base.num);
2360 st->duration = duration;
2367 av_log(ic, AV_LOG_WARNING,
2368 "Estimating duration from bitrate, this may be inaccurate\n");
2371 #define DURATION_MAX_READ_SIZE 250000LL
2372 #define DURATION_MAX_RETRY 4
2374 /* only usable for MPEG-PS streams */
2375 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2377 AVPacket pkt1, *pkt = &pkt1;
2379 int num, den, read_size, i, ret;
2380 int found_duration = 0;
2382 int64_t filesize, offset, duration;
2385 /* flush packet queue */
2386 flush_packet_queue(ic);
2388 for (i = 0; i < ic->nb_streams; i++) {
2389 st = ic->streams[i];
2390 if (st->start_time == AV_NOPTS_VALUE &&
2391 st->first_dts == AV_NOPTS_VALUE &&
2392 st->codec->codec_type != AVMEDIA_TYPE_UNKNOWN)
2393 av_log(st->codec, AV_LOG_WARNING,
2394 "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2397 av_parser_close(st->parser);
2402 av_opt_set(ic, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN);
2403 /* estimate the end time (duration) */
2404 /* XXX: may need to support wrapping */
2405 filesize = ic->pb ? avio_size(ic->pb) : 0;
2407 is_end = found_duration;
2408 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
2412 avio_seek(ic->pb, offset, SEEK_SET);
2415 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
2419 ret = ff_read_packet(ic, pkt);
2420 } while (ret == AVERROR(EAGAIN));
2423 read_size += pkt->size;
2424 st = ic->streams[pkt->stream_index];
2425 if (pkt->pts != AV_NOPTS_VALUE &&
2426 (st->start_time != AV_NOPTS_VALUE ||
2427 st->first_dts != AV_NOPTS_VALUE)) {
2428 if (pkt->duration == 0) {
2429 ff_compute_frame_duration(ic, &num, &den, st, st->parser, pkt);
2431 pkt->duration = av_rescale_rnd(1,
2432 num * (int64_t) st->time_base.den,
2433 den * (int64_t) st->time_base.num,
2437 duration = pkt->pts + pkt->duration;
2439 if (st->start_time != AV_NOPTS_VALUE)
2440 duration -= st->start_time;
2442 duration -= st->first_dts;
2444 if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
2445 (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2446 st->duration = duration;
2447 st->info->last_duration = duration;
2450 av_free_packet(pkt);
2453 /* check if all audio/video streams have valid duration */
2456 for (i = 0; i < ic->nb_streams; i++) {
2457 st = ic->streams[i];
2458 switch (st->codec->codec_type) {
2459 case AVMEDIA_TYPE_VIDEO:
2460 case AVMEDIA_TYPE_AUDIO:
2461 if (st->duration == AV_NOPTS_VALUE)
2468 ++retry <= DURATION_MAX_RETRY);
2470 av_opt_set(ic, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN);
2472 /* warn about audio/video streams which duration could not be estimated */
2473 for (i = 0; i < ic->nb_streams; i++) {
2474 st = ic->streams[i];
2475 if (st->duration == AV_NOPTS_VALUE) {
2476 switch (st->codec->codec_type) {
2477 case AVMEDIA_TYPE_VIDEO:
2478 case AVMEDIA_TYPE_AUDIO:
2479 if (st->start_time != AV_NOPTS_VALUE || st->first_dts != AV_NOPTS_VALUE) {
2480 av_log(ic, AV_LOG_DEBUG, "stream %d : no PTS found at end of file, duration not set\n", i);
2482 av_log(ic, AV_LOG_DEBUG, "stream %d : no TS found at start of file, duration not set\n", i);
2486 fill_all_stream_timings(ic);
2488 avio_seek(ic->pb, old_offset, SEEK_SET);
2489 for (i = 0; i < ic->nb_streams; i++) {
2492 st = ic->streams[i];
2493 st->cur_dts = st->first_dts;
2494 st->last_IP_pts = AV_NOPTS_VALUE;
2495 st->last_dts_for_order_check = AV_NOPTS_VALUE;
2496 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
2497 st->pts_buffer[j] = AV_NOPTS_VALUE;
2501 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2505 /* get the file size, if possible */
2506 if (ic->iformat->flags & AVFMT_NOFILE) {
2509 file_size = avio_size(ic->pb);
2510 file_size = FFMAX(0, file_size);
2513 if ((!strcmp(ic->iformat->name, "mpeg") ||
2514 !strcmp(ic->iformat->name, "mpegts")) &&
2515 file_size && ic->pb->seekable) {
2516 /* get accurate estimate from the PTSes */
2517 estimate_timings_from_pts(ic, old_offset);
2518 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2519 } else if (has_duration(ic)) {
2520 /* at least one component has timings - we use them for all
2522 fill_all_stream_timings(ic);
2523 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2525 /* less precise: use bitrate info */
2526 estimate_timings_from_bit_rate(ic);
2527 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2529 update_stream_timings(ic);
2533 AVStream av_unused *st;
2534 for (i = 0; i < ic->nb_streams; i++) {
2535 st = ic->streams[i];
2536 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2537 (double) st->start_time / AV_TIME_BASE,
2538 (double) st->duration / AV_TIME_BASE);
2541 "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2542 (double) ic->start_time / AV_TIME_BASE,
2543 (double) ic->duration / AV_TIME_BASE,
2544 ic->bit_rate / 1000);
2548 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2550 AVCodecContext *avctx = st->codec;
2552 #define FAIL(errmsg) do { \
2554 *errmsg_ptr = errmsg; \
2558 if ( avctx->codec_id == AV_CODEC_ID_NONE
2559 && avctx->codec_type != AVMEDIA_TYPE_DATA)
2560 FAIL("unknown codec");
2561 switch (avctx->codec_type) {
2562 case AVMEDIA_TYPE_AUDIO:
2563 if (!avctx->frame_size && determinable_frame_size(avctx))
2564 FAIL("unspecified frame size");
2565 if (st->info->found_decoder >= 0 &&
2566 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2567 FAIL("unspecified sample format");
2568 if (!avctx->sample_rate)
2569 FAIL("unspecified sample rate");
2570 if (!avctx->channels)
2571 FAIL("unspecified number of channels");
2572 if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
2573 FAIL("no decodable DTS frames");
2575 case AVMEDIA_TYPE_VIDEO:
2577 FAIL("unspecified size");
2578 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
2579 FAIL("unspecified pixel format");
2580 if (st->codec->codec_id == AV_CODEC_ID_RV30 || st->codec->codec_id == AV_CODEC_ID_RV40)
2581 if (!st->sample_aspect_ratio.num && !st->codec->sample_aspect_ratio.num && !st->codec_info_nb_frames)
2582 FAIL("no frame in rv30/40 and no sar");
2584 case AVMEDIA_TYPE_SUBTITLE:
2585 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
2586 FAIL("unspecified size");
2588 case AVMEDIA_TYPE_DATA:
2589 if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
2595 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2596 static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
2597 AVDictionary **options)
2599 const AVCodec *codec;
2600 int got_picture = 1, ret = 0;
2601 AVFrame *frame = av_frame_alloc();
2602 AVSubtitle subtitle;
2603 AVPacket pkt = *avpkt;
2606 return AVERROR(ENOMEM);
2608 if (!avcodec_is_open(st->codec) &&
2609 st->info->found_decoder <= 0 &&
2610 (st->codec->codec_id != -st->info->found_decoder || !st->codec->codec_id)) {
2611 AVDictionary *thread_opt = NULL;
2613 codec = find_decoder(s, st, st->codec->codec_id);
2616 st->info->found_decoder = -st->codec->codec_id;
2621 /* Force thread count to 1 since the H.264 decoder will not extract
2622 * SPS and PPS to extradata during multi-threaded decoding. */
2623 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2624 if (s->codec_whitelist)
2625 av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
2626 ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
2628 av_dict_free(&thread_opt);
2630 st->info->found_decoder = -st->codec->codec_id;
2633 st->info->found_decoder = 1;
2634 } else if (!st->info->found_decoder)
2635 st->info->found_decoder = 1;
2637 if (st->info->found_decoder < 0) {
2642 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2644 (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
2645 (!st->codec_info_nb_frames &&
2646 st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2648 switch (st->codec->codec_type) {
2649 case AVMEDIA_TYPE_VIDEO:
2650 ret = avcodec_decode_video2(st->codec, frame,
2651 &got_picture, &pkt);
2653 case AVMEDIA_TYPE_AUDIO:
2654 ret = avcodec_decode_audio4(st->codec, frame, &got_picture, &pkt);
2656 case AVMEDIA_TYPE_SUBTITLE:
2657 ret = avcodec_decode_subtitle2(st->codec, &subtitle,
2658 &got_picture, &pkt);
2666 st->nb_decoded_frames++;
2673 if (!pkt.data && !got_picture)
2677 av_frame_free(&frame);
2681 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
2683 while (tags->id != AV_CODEC_ID_NONE) {
2691 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2694 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
2695 if (tag == tags[i].tag)
2697 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
2698 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2700 return AV_CODEC_ID_NONE;
2703 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
2708 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
2710 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
2712 return AV_CODEC_ID_NONE;
2717 if (sflags & (1 << (bps - 1))) {
2720 return AV_CODEC_ID_PCM_S8;
2722 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
2724 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
2726 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
2728 return AV_CODEC_ID_NONE;
2733 return AV_CODEC_ID_PCM_U8;
2735 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
2737 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
2739 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
2741 return AV_CODEC_ID_NONE;
2747 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
2750 if (!av_codec_get_tag2(tags, id, &tag))
2755 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
2759 for (i = 0; tags && tags[i]; i++) {
2760 const AVCodecTag *codec_tags = tags[i];
2761 while (codec_tags->id != AV_CODEC_ID_NONE) {
2762 if (codec_tags->id == id) {
2763 *tag = codec_tags->tag;
2772 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
2775 for (i = 0; tags && tags[i]; i++) {
2776 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
2777 if (id != AV_CODEC_ID_NONE)
2780 return AV_CODEC_ID_NONE;
2783 static void compute_chapters_end(AVFormatContext *s)
2786 int64_t max_time = s->duration +
2787 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2789 for (i = 0; i < s->nb_chapters; i++)
2790 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2791 AVChapter *ch = s->chapters[i];
2792 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
2796 for (j = 0; j < s->nb_chapters; j++) {
2797 AVChapter *ch1 = s->chapters[j];
2798 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
2800 if (j != i && next_start > ch->start && next_start < end)
2803 ch->end = (end == INT64_MAX) ? ch->start : end;
2807 static int get_std_framerate(int i)
2810 return (i + 1) * 1001;
2814 return ((const int[]) { 40, 48, 50, 60, 80, 120, 240})[i] * 1001 * 12;
2818 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
2821 /* Is the time base unreliable?
2822 * This is a heuristic to balance between quick acceptance of the values in
2823 * the headers vs. some extra checks.
2824 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2825 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2826 * And there are "variable" fps files this needs to detect as well. */
2827 static int tb_unreliable(AVCodecContext *c)
2829 if (c->time_base.den >= 101L * c->time_base.num ||
2830 c->time_base.den < 5L * c->time_base.num ||
2831 // c->codec_tag == AV_RL32("DIVX") ||
2832 // c->codec_tag == AV_RL32("XVID") ||
2833 c->codec_tag == AV_RL32("mp4v") ||
2834 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
2835 c->codec_id == AV_CODEC_ID_GIF ||
2836 c->codec_id == AV_CODEC_ID_H264)
2841 int ff_alloc_extradata(AVCodecContext *avctx, int size)
2845 if (size < 0 || size >= INT32_MAX - FF_INPUT_BUFFER_PADDING_SIZE) {
2846 avctx->extradata = NULL;
2847 avctx->extradata_size = 0;
2848 return AVERROR(EINVAL);
2850 avctx->extradata = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
2851 if (avctx->extradata) {
2852 memset(avctx->extradata + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2853 avctx->extradata_size = size;
2856 avctx->extradata_size = 0;
2857 ret = AVERROR(ENOMEM);
2862 int ff_get_extradata(AVCodecContext *avctx, AVIOContext *pb, int size)
2864 int ret = ff_alloc_extradata(avctx, size);
2867 ret = avio_read(pb, avctx->extradata, size);
2869 av_freep(&avctx->extradata);
2870 avctx->extradata_size = 0;
2871 av_log(avctx, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
2872 return ret < 0 ? ret : AVERROR_INVALIDDATA;
2878 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
2881 int64_t last = st->info->last_dts;
2883 if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
2884 && ts - (uint64_t)last < INT64_MAX) {
2885 double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
2886 int64_t duration = ts - last;
2888 if (!st->info->duration_error)
2889 st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
2890 if (!st->info->duration_error)
2891 return AVERROR(ENOMEM);
2893 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2894 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
2895 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
2896 if (st->info->duration_error[0][1][i] < 1e10) {
2897 int framerate = get_std_framerate(i);
2898 double sdts = dts*framerate/(1001*12);
2899 for (j= 0; j<2; j++) {
2900 int64_t ticks = llrint(sdts+j*0.5);
2901 double error= sdts - ticks + j*0.5;
2902 st->info->duration_error[j][0][i] += error;
2903 st->info->duration_error[j][1][i] += error*error;
2907 st->info->duration_count++;
2908 st->info->rfps_duration_sum += duration;
2910 if (st->info->duration_count % 10 == 0) {
2911 int n = st->info->duration_count;
2912 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
2913 if (st->info->duration_error[0][1][i] < 1e10) {
2914 double a0 = st->info->duration_error[0][0][i] / n;
2915 double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
2916 double a1 = st->info->duration_error[1][0][i] / n;
2917 double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
2918 if (error0 > 0.04 && error1 > 0.04) {
2919 st->info->duration_error[0][1][i] = 2e10;
2920 st->info->duration_error[1][1][i] = 2e10;
2926 // ignore the first 4 values, they might have some random jitter
2927 if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
2928 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2930 if (ts != AV_NOPTS_VALUE)
2931 st->info->last_dts = ts;
2936 void ff_rfps_calculate(AVFormatContext *ic)
2940 for (i = 0; i < ic->nb_streams; i++) {
2941 AVStream *st = ic->streams[i];
2943 if (st->codec->codec_type != AVMEDIA_TYPE_VIDEO)
2945 // the check for tb_unreliable() is not completely correct, since this is not about handling
2946 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2947 // ipmovie.c produces.
2948 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
2949 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->info->duration_gcd, INT_MAX);
2950 if (st->info->duration_count>1 && !st->r_frame_rate.num
2951 && tb_unreliable(st->codec)) {
2953 double best_error= 0.01;
2954 AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
2956 for (j= 0; j<MAX_STD_TIMEBASES; j++) {
2959 if (st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2961 if (!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
2964 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
2967 for (k= 0; k<2; k++) {
2968 int n = st->info->duration_count;
2969 double a= st->info->duration_error[k][0][j] / n;
2970 double error= st->info->duration_error[k][1][j]/n - a*a;
2972 if (error < best_error && best_error> 0.000000001) {
2974 num = get_std_framerate(j);
2977 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2980 // do not increase frame rate by more than 1 % in order to match a standard rate.
2981 if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
2982 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2984 if ( !st->avg_frame_rate.num
2985 && st->r_frame_rate.num && st->info->rfps_duration_sum
2986 && st->info->codec_info_duration <= 0
2987 && st->info->duration_count > 2
2988 && fabs(1.0 / (av_q2d(st->r_frame_rate) * av_q2d(st->time_base)) - st->info->rfps_duration_sum / (double)st->info->duration_count) <= 1.0
2990 av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
2991 st->avg_frame_rate = st->r_frame_rate;
2994 av_freep(&st->info->duration_error);
2995 st->info->last_dts = AV_NOPTS_VALUE;
2996 st->info->duration_count = 0;
2997 st->info->rfps_duration_sum = 0;
3001 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3003 int i, count, ret = 0, j;
3006 AVPacket pkt1, *pkt;
3007 int64_t old_offset = avio_tell(ic->pb);
3008 // new streams might appear, no options for those
3009 int orig_nb_streams = ic->nb_streams;
3011 int64_t max_analyze_duration = ic->max_analyze_duration2;
3012 int64_t max_stream_analyze_duration;
3013 int64_t probesize = ic->probesize2;
3015 if (!max_analyze_duration)
3016 max_analyze_duration = ic->max_analyze_duration;
3018 probesize = ic->probesize;
3019 flush_codecs = probesize > 0;
3021 av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3023 max_stream_analyze_duration = max_analyze_duration;
3024 if (!max_analyze_duration) {
3025 max_stream_analyze_duration =
3026 max_analyze_duration = 5*AV_TIME_BASE;
3027 if (!strcmp(ic->iformat->name, "flv"))
3028 max_stream_analyze_duration = 30*AV_TIME_BASE;
3032 av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d\n",
3033 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count);
3035 for (i = 0; i < ic->nb_streams; i++) {
3036 const AVCodec *codec;
3037 AVDictionary *thread_opt = NULL;
3038 st = ic->streams[i];
3040 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3041 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3042 /* if (!st->time_base.num)
3044 if (!st->codec->time_base.num)
3045 st->codec->time_base = st->time_base;
3047 // only for the split stuff
3048 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
3049 st->parser = av_parser_init(st->codec->codec_id);
3051 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3052 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3053 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3054 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3056 } else if (st->need_parsing) {
3057 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3058 "%s, packets or times may be invalid.\n",
3059 avcodec_get_name(st->codec->codec_id));
3062 codec = find_decoder(ic, st, st->codec->codec_id);
3064 /* Force thread count to 1 since the H.264 decoder will not extract
3065 * SPS and PPS to extradata during multi-threaded decoding. */
3066 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3068 if (ic->codec_whitelist)
3069 av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3071 /* Ensure that subtitle_header is properly set. */
3072 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
3073 && codec && !st->codec->codec) {
3074 if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
3075 av_log(ic, AV_LOG_WARNING,
3076 "Failed to open codec in av_find_stream_info\n");
3079 // Try to just open decoders, in case this is enough to get parameters.
3080 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3081 if (codec && !st->codec->codec)
3082 if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
3083 av_log(ic, AV_LOG_WARNING,
3084 "Failed to open codec in av_find_stream_info\n");
3087 av_dict_free(&thread_opt);
3090 for (i = 0; i < ic->nb_streams; i++) {
3091 #if FF_API_R_FRAME_RATE
3092 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3094 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3095 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
3101 int analyzed_all_streams;
3102 if (ff_check_interrupt(&ic->interrupt_callback)) {
3104 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3108 /* check if one codec still needs to be handled */
3109 for (i = 0; i < ic->nb_streams; i++) {
3110 int fps_analyze_framecount = 20;
3112 st = ic->streams[i];
3113 if (!has_codec_parameters(st, NULL))
3115 /* If the timebase is coarse (like the usual millisecond precision
3116 * of mkv), we need to analyze more frames to reliably arrive at
3117 * the correct fps. */
3118 if (av_q2d(st->time_base) > 0.0005)
3119 fps_analyze_framecount *= 2;
3120 if (!tb_unreliable(st->codec))
3121 fps_analyze_framecount = 0;
3122 if (ic->fps_probe_size >= 0)
3123 fps_analyze_framecount = ic->fps_probe_size;
3124 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3125 fps_analyze_framecount = 0;
3126 /* variable fps and no guess at the real fps */
3127 if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3128 st->info->duration_count < fps_analyze_framecount &&
3129 st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3131 if (st->parser && st->parser->parser->split &&
3132 !st->codec->extradata)
3134 if (st->first_dts == AV_NOPTS_VALUE &&
3135 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3136 st->codec_info_nb_frames < ic->max_ts_probe &&
3137 (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3138 st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
3141 analyzed_all_streams = 0;
3142 if (i == ic->nb_streams) {
3143 analyzed_all_streams = 1;
3144 /* NOTE: If the format has no header, then we need to read some
3145 * packets to get most of the streams, so we cannot stop here. */
3146 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3147 /* If we found the info for all the codecs, we can stop. */
3149 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3154 /* We did not get all the codec info, but we read too much data. */
3155 if (read_size >= probesize) {
3157 av_log(ic, AV_LOG_DEBUG,
3158 "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3159 for (i = 0; i < ic->nb_streams; i++)
3160 if (!ic->streams[i]->r_frame_rate.num &&
3161 ic->streams[i]->info->duration_count <= 1 &&
3162 ic->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3163 strcmp(ic->iformat->name, "image2"))
3164 av_log(ic, AV_LOG_WARNING,
3165 "Stream #%d: not enough frames to estimate rate; "
3166 "consider increasing probesize\n", i);
3170 /* NOTE: A new stream can be added there if no header in file
3171 * (AVFMTCTX_NOHEADER). */
3172 ret = read_frame_internal(ic, &pkt1);
3173 if (ret == AVERROR(EAGAIN))
3181 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3182 free_packet_buffer(&ic->packet_buffer, &ic->packet_buffer_end);
3184 pkt = add_to_pktbuf(&ic->packet_buffer, &pkt1,
3185 &ic->packet_buffer_end);
3187 ret = AVERROR(ENOMEM);
3188 goto find_stream_info_err;
3190 if ((ret = av_dup_packet(pkt)) < 0)
3191 goto find_stream_info_err;
3194 st = ic->streams[pkt->stream_index];
3195 if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3196 read_size += pkt->size;
3198 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3199 /* check for non-increasing dts */
3200 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3201 st->info->fps_last_dts >= pkt->dts) {
3202 av_log(ic, AV_LOG_DEBUG,
3203 "Non-increasing DTS in stream %d: packet %d with DTS "
3204 "%"PRId64", packet %d with DTS %"PRId64"\n",
3205 st->index, st->info->fps_last_dts_idx,
3206 st->info->fps_last_dts, st->codec_info_nb_frames,
3208 st->info->fps_first_dts =
3209 st->info->fps_last_dts = AV_NOPTS_VALUE;
3211 /* Check for a discontinuity in dts. If the difference in dts
3212 * is more than 1000 times the average packet duration in the
3213 * sequence, we treat it as a discontinuity. */
3214 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3215 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3216 (pkt->dts - st->info->fps_last_dts) / 1000 >
3217 (st->info->fps_last_dts - st->info->fps_first_dts) /
3218 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3219 av_log(ic, AV_LOG_WARNING,
3220 "DTS discontinuity in stream %d: packet %d with DTS "
3221 "%"PRId64", packet %d with DTS %"PRId64"\n",
3222 st->index, st->info->fps_last_dts_idx,
3223 st->info->fps_last_dts, st->codec_info_nb_frames,
3225 st->info->fps_first_dts =
3226 st->info->fps_last_dts = AV_NOPTS_VALUE;
3229 /* update stored dts values */
3230 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3231 st->info->fps_first_dts = pkt->dts;
3232 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3234 st->info->fps_last_dts = pkt->dts;
3235 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3237 if (st->codec_info_nb_frames>1) {
3240 if (st->time_base.den > 0)
3241 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3242 if (st->avg_frame_rate.num > 0)
3243 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3246 && st->codec_info_nb_frames>30
3247 && st->info->fps_first_dts != AV_NOPTS_VALUE
3248 && st->info->fps_last_dts != AV_NOPTS_VALUE)
3249 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3251 if (t >= (analyzed_all_streams ? max_analyze_duration : max_stream_analyze_duration)) {
3252 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds\n",
3253 max_analyze_duration,
3255 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3256 av_packet_unref(pkt);
3259 if (pkt->duration) {
3260 st->info->codec_info_duration += pkt->duration;
3261 st->info->codec_info_duration_fields += st->parser && st->need_parsing && st->codec->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3264 #if FF_API_R_FRAME_RATE
3265 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3266 ff_rfps_add_frame(ic, st, pkt->dts);
3268 if (st->parser && st->parser->parser->split && !st->codec->extradata) {
3269 int i = st->parser->parser->split(st->codec, pkt->data, pkt->size);
3270 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
3271 if (ff_alloc_extradata(st->codec, i))
3272 return AVERROR(ENOMEM);
3273 memcpy(st->codec->extradata, pkt->data,
3274 st->codec->extradata_size);
3278 /* If still no information, we try to open the codec and to
3279 * decompress the frame. We try to avoid that in most cases as
3280 * it takes longer and uses more memory. For MPEG-4, we need to
3281 * decompress for QuickTime.
3283 * If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3284 * least one frame of codec data, this makes sure the codec initializes
3285 * the channel configuration and does not only trust the values from
3287 try_decode_frame(ic, st, pkt,
3288 (options && i < orig_nb_streams) ? &options[i] : NULL);
3290 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3291 av_packet_unref(pkt);
3293 st->codec_info_nb_frames++;
3298 AVPacket empty_pkt = { 0 };
3300 av_init_packet(&empty_pkt);
3302 for (i = 0; i < ic->nb_streams; i++) {
3304 st = ic->streams[i];
3306 /* flush the decoders */
3307 if (st->info->found_decoder == 1) {
3309 err = try_decode_frame(ic, st, &empty_pkt,
3310 (options && i < orig_nb_streams)
3311 ? &options[i] : NULL);
3312 } while (err > 0 && !has_codec_parameters(st, NULL));
3315 av_log(ic, AV_LOG_INFO,
3316 "decoding for stream %d failed\n", st->index);
3322 // close codecs which were opened in try_decode_frame()
3323 for (i = 0; i < ic->nb_streams; i++) {
3324 st = ic->streams[i];
3325 avcodec_close(st->codec);
3328 ff_rfps_calculate(ic);
3330 for (i = 0; i < ic->nb_streams; i++) {
3331 st = ic->streams[i];
3332 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3333 if (st->codec->codec_id == AV_CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample) {
3334 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
3335 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == st->codec->pix_fmt)
3336 st->codec->codec_tag= tag;
3339 /* estimate average framerate if not set by demuxer */
3340 if (st->info->codec_info_duration_fields &&
3341 !st->avg_frame_rate.num &&
3342 st->info->codec_info_duration) {
3344 double best_error = 0.01;
3346 if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
3347 st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
3348 st->info->codec_info_duration < 0)
3350 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3351 st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
3352 st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
3354 /* Round guessed framerate to a "standard" framerate if it's
3355 * within 1% of the original estimate. */
3356 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
3357 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
3358 double error = fabs(av_q2d(st->avg_frame_rate) /
3359 av_q2d(std_fps) - 1);
3361 if (error < best_error) {
3363 best_fps = std_fps.num;
3367 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3368 best_fps, 12 * 1001, INT_MAX);
3371 if (!st->r_frame_rate.num) {
3372 if ( st->codec->time_base.den * (int64_t) st->time_base.num
3373 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t) st->time_base.den) {
3374 st->r_frame_rate.num = st->codec->time_base.den;
3375 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
3377 st->r_frame_rate.num = st->time_base.den;
3378 st->r_frame_rate.den = st->time_base.num;
3381 if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
3382 AVRational hw_ratio = { st->codec->height, st->codec->width };
3383 st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
3386 } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
3387 if (!st->codec->bits_per_coded_sample)
3388 st->codec->bits_per_coded_sample =
3389 av_get_bits_per_sample(st->codec->codec_id);
3390 // set stream disposition based on audio service type
3391 switch (st->codec->audio_service_type) {
3392 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
3393 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
3395 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
3396 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
3398 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
3399 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
3401 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
3402 st->disposition = AV_DISPOSITION_COMMENT;
3404 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
3405 st->disposition = AV_DISPOSITION_KARAOKE;
3412 estimate_timings(ic, old_offset);
3414 av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
3416 if (ret >= 0 && ic->nb_streams)
3417 /* We could not have all the codec parameters before EOF. */
3419 for (i = 0; i < ic->nb_streams; i++) {
3421 st = ic->streams[i];
3422 if (!has_codec_parameters(st, &errmsg)) {
3424 avcodec_string(buf, sizeof(buf), st->codec, 0);
3425 av_log(ic, AV_LOG_WARNING,
3426 "Could not find codec parameters for stream %d (%s): %s\n"
3427 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
3434 compute_chapters_end(ic);
3436 find_stream_info_err:
3437 for (i = 0; i < ic->nb_streams; i++) {
3438 st = ic->streams[i];
3439 if (ic->streams[i]->codec->codec_type != AVMEDIA_TYPE_AUDIO)
3440 ic->streams[i]->codec->thread_count = 0;
3442 av_freep(&st->info->duration_error);
3443 av_freep(&ic->streams[i]->info);
3446 av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
3447 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
3451 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
3455 for (i = 0; i < ic->nb_programs; i++) {
3456 if (ic->programs[i] == last) {
3460 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
3461 if (ic->programs[i]->stream_index[j] == s)
3462 return ic->programs[i];
3468 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
3469 int wanted_stream_nb, int related_stream,
3470 AVCodec **decoder_ret, int flags)
3472 int i, nb_streams = ic->nb_streams;
3473 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe;
3474 unsigned *program = NULL;
3475 const AVCodec *decoder = NULL, *best_decoder = NULL;
3477 if (related_stream >= 0 && wanted_stream_nb < 0) {
3478 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
3480 program = p->stream_index;
3481 nb_streams = p->nb_stream_indexes;
3484 for (i = 0; i < nb_streams; i++) {
3485 int real_stream_index = program ? program[i] : i;
3486 AVStream *st = ic->streams[real_stream_index];
3487 AVCodecContext *avctx = st->codec;
3488 if (avctx->codec_type != type)
3490 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
3492 if (wanted_stream_nb != real_stream_index &&
3493 st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED |
3494 AV_DISPOSITION_VISUAL_IMPAIRED))
3496 if (type == AVMEDIA_TYPE_AUDIO && !avctx->channels)
3499 decoder = find_decoder(ic, st, st->codec->codec_id);
3502 ret = AVERROR_DECODER_NOT_FOUND;
3506 count = st->codec_info_nb_frames;
3507 bitrate = avctx->bit_rate;
3509 bitrate = avctx->rc_max_rate;
3510 multiframe = FFMIN(5, count);
3511 if ((best_multiframe > multiframe) ||
3512 (best_multiframe == multiframe && best_bitrate > bitrate) ||
3513 (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
3516 best_bitrate = bitrate;
3517 best_multiframe = multiframe;
3518 ret = real_stream_index;
3519 best_decoder = decoder;
3520 if (program && i == nb_streams - 1 && ret < 0) {
3522 nb_streams = ic->nb_streams;
3523 /* no related stream found, try again with everything */
3528 *decoder_ret = (AVCodec*)best_decoder;
3532 /*******************************************************/
3534 int av_read_play(AVFormatContext *s)
3536 if (s->iformat->read_play)
3537 return s->iformat->read_play(s);
3539 return avio_pause(s->pb, 0);
3540 return AVERROR(ENOSYS);
3543 int av_read_pause(AVFormatContext *s)
3545 if (s->iformat->read_pause)
3546 return s->iformat->read_pause(s);
3548 return avio_pause(s->pb, 1);
3549 return AVERROR(ENOSYS);
3552 void ff_free_stream(AVFormatContext *s, AVStream *st) {
3554 av_assert0(s->nb_streams>0);
3555 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
3557 for (j = 0; j < st->nb_side_data; j++)
3558 av_freep(&st->side_data[j].data);
3559 av_freep(&st->side_data);
3560 st->nb_side_data = 0;
3563 av_parser_close(st->parser);
3565 if (st->attached_pic.data)
3566 av_free_packet(&st->attached_pic);
3567 av_dict_free(&st->metadata);
3568 av_freep(&st->probe_data.buf);
3569 av_freep(&st->index_entries);
3570 av_freep(&st->codec->extradata);
3571 av_freep(&st->codec->subtitle_header);
3572 av_freep(&st->codec);
3573 av_freep(&st->priv_data);
3575 av_freep(&st->info->duration_error);
3576 av_freep(&st->info);
3577 av_freep(&st->recommended_encoder_configuration);
3578 av_freep(&s->streams[ --s->nb_streams ]);
3581 void avformat_free_context(AVFormatContext *s)
3589 if (s->iformat && s->iformat->priv_class && s->priv_data)
3590 av_opt_free(s->priv_data);
3591 if (s->oformat && s->oformat->priv_class && s->priv_data)
3592 av_opt_free(s->priv_data);
3594 for (i = s->nb_streams - 1; i >= 0; i--) {
3595 ff_free_stream(s, s->streams[i]);
3597 for (i = s->nb_programs - 1; i >= 0; i--) {
3598 av_dict_free(&s->programs[i]->metadata);
3599 av_freep(&s->programs[i]->stream_index);
3600 av_freep(&s->programs[i]);
3602 av_freep(&s->programs);
3603 av_freep(&s->priv_data);
3604 while (s->nb_chapters--) {
3605 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
3606 av_freep(&s->chapters[s->nb_chapters]);
3608 av_freep(&s->chapters);
3609 av_dict_free(&s->metadata);
3610 av_freep(&s->streams);
3611 av_freep(&s->internal);
3612 flush_packet_queue(s);
3616 void avformat_close_input(AVFormatContext **ps)
3627 if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
3628 (s->flags & AVFMT_FLAG_CUSTOM_IO))
3631 flush_packet_queue(s);
3634 if (s->iformat->read_close)
3635 s->iformat->read_close(s);
3637 avformat_free_context(s);
3644 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
3650 if (s->nb_streams >= INT_MAX/sizeof(*streams))
3652 streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
3655 s->streams = streams;
3657 st = av_mallocz(sizeof(AVStream));
3660 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
3664 st->info->last_dts = AV_NOPTS_VALUE;
3666 st->codec = avcodec_alloc_context3(c);
3673 /* no default bitrate if decoding */
3674 st->codec->bit_rate = 0;
3676 /* default pts setting is MPEG-like */
3677 avpriv_set_pts_info(st, 33, 1, 90000);
3680 st->index = s->nb_streams;
3681 st->start_time = AV_NOPTS_VALUE;
3682 st->duration = AV_NOPTS_VALUE;
3683 /* we set the current DTS to 0 so that formats without any timestamps
3684 * but durations get some timestamps, formats with some unknown
3685 * timestamps have their first few packets buffered and the
3686 * timestamps corrected before they are returned to the user */
3687 st->cur_dts = s->iformat ? RELATIVE_TS_BASE : 0;
3688 st->first_dts = AV_NOPTS_VALUE;
3689 st->probe_packets = MAX_PROBE_PACKETS;
3690 st->pts_wrap_reference = AV_NOPTS_VALUE;
3691 st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
3693 st->last_IP_pts = AV_NOPTS_VALUE;
3694 st->last_dts_for_order_check = AV_NOPTS_VALUE;
3695 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
3696 st->pts_buffer[i] = AV_NOPTS_VALUE;
3698 st->sample_aspect_ratio = (AVRational) { 0, 1 };
3700 #if FF_API_R_FRAME_RATE
3701 st->info->last_dts = AV_NOPTS_VALUE;
3703 st->info->fps_first_dts = AV_NOPTS_VALUE;
3704 st->info->fps_last_dts = AV_NOPTS_VALUE;
3706 st->inject_global_side_data = s->internal->inject_global_side_data;
3708 s->streams[s->nb_streams++] = st;
3712 AVProgram *av_new_program(AVFormatContext *ac, int id)
3714 AVProgram *program = NULL;
3717 av_dlog(ac, "new_program: id=0x%04x\n", id);
3719 for (i = 0; i < ac->nb_programs; i++)
3720 if (ac->programs[i]->id == id)
3721 program = ac->programs[i];
3724 program = av_mallocz(sizeof(AVProgram));
3727 dynarray_add(&ac->programs, &ac->nb_programs, program);
3728 program->discard = AVDISCARD_NONE;
3731 program->pts_wrap_reference = AV_NOPTS_VALUE;
3732 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
3734 program->start_time =
3735 program->end_time = AV_NOPTS_VALUE;
3740 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
3741 int64_t start, int64_t end, const char *title)
3743 AVChapter *chapter = NULL;
3746 if (end != AV_NOPTS_VALUE && start > end) {
3747 av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
3751 for (i = 0; i < s->nb_chapters; i++)
3752 if (s->chapters[i]->id == id)
3753 chapter = s->chapters[i];
3756 chapter = av_mallocz(sizeof(AVChapter));
3759 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
3761 av_dict_set(&chapter->metadata, "title", title, 0);
3763 chapter->time_base = time_base;
3764 chapter->start = start;
3770 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
3773 AVProgram *program = NULL;
3776 if (idx >= ac->nb_streams) {
3777 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3781 for (i = 0; i < ac->nb_programs; i++) {
3782 if (ac->programs[i]->id != progid)
3784 program = ac->programs[i];
3785 for (j = 0; j < program->nb_stream_indexes; j++)
3786 if (program->stream_index[j] == idx)
3789 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
3792 program->stream_index = tmp;
3793 program->stream_index[program->nb_stream_indexes++] = idx;
3798 uint64_t ff_ntp_time(void)
3800 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3803 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
3806 char *q, buf1[20], c;
3807 int nd, len, percentd_found;
3819 while (av_isdigit(*p))
3820 nd = nd * 10 + *p++ - '0';
3822 } while (av_isdigit(c));
3831 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3833 if ((q - buf + len) > buf_size - 1)
3835 memcpy(q, buf1, len);
3843 if ((q - buf) < buf_size - 1)
3847 if (!percentd_found)
3856 void av_url_split(char *proto, int proto_size,
3857 char *authorization, int authorization_size,
3858 char *hostname, int hostname_size,
3859 int *port_ptr, char *path, int path_size, const char *url)
3861 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
3867 if (authorization_size > 0)
3868 authorization[0] = 0;
3869 if (hostname_size > 0)
3874 /* parse protocol */
3875 if ((p = strchr(url, ':'))) {
3876 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3883 /* no protocol means plain filename */
3884 av_strlcpy(path, url, path_size);
3888 /* separate path from hostname */
3889 ls = strchr(p, '/');
3890 ls2 = strchr(p, '?');
3894 ls = FFMIN(ls, ls2);
3896 av_strlcpy(path, ls, path_size);
3898 ls = &p[strlen(p)]; // XXX
3900 /* the rest is hostname, use that to parse auth/port */
3902 /* authorization (user[:pass]@hostname) */
3904 while ((at = strchr(p, '@')) && at < ls) {
3905 av_strlcpy(authorization, at2,
3906 FFMIN(authorization_size, at + 1 - at2));
3907 p = at + 1; /* skip '@' */
3910 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3912 av_strlcpy(hostname, p + 1,
3913 FFMIN(hostname_size, brk - p));
3914 if (brk[1] == ':' && port_ptr)
3915 *port_ptr = atoi(brk + 2);
3916 } else if ((col = strchr(p, ':')) && col < ls) {
3917 av_strlcpy(hostname, p,
3918 FFMIN(col + 1 - p, hostname_size));
3920 *port_ptr = atoi(col + 1);
3922 av_strlcpy(hostname, p,
3923 FFMIN(ls + 1 - p, hostname_size));
3927 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3930 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3933 'C', 'D', 'E', 'F' };
3934 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3937 'c', 'd', 'e', 'f' };
3938 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3940 for (i = 0; i < s; i++) {
3941 buff[i * 2] = hex_table[src[i] >> 4];
3942 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3948 int ff_hex_to_data(uint8_t *data, const char *p)
3955 p += strspn(p, SPACE_CHARS);
3958 c = av_toupper((unsigned char) *p++);
3959 if (c >= '0' && c <= '9')
3961 else if (c >= 'A' && c <= 'F')
3976 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
3977 unsigned int pts_num, unsigned int pts_den)
3980 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
3981 if (new_tb.num != pts_num)
3982 av_log(NULL, AV_LOG_DEBUG,
3983 "st:%d removing common factor %d from timebase\n",
3984 s->index, pts_num / new_tb.num);
3986 av_log(NULL, AV_LOG_WARNING,
3987 "st:%d has too large timebase, reducing\n", s->index);
3989 if (new_tb.num <= 0 || new_tb.den <= 0) {
3990 av_log(NULL, AV_LOG_ERROR,
3991 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
3992 new_tb.num, new_tb.den,
3996 s->time_base = new_tb;
3997 av_codec_set_pkt_timebase(s->codec, new_tb);
3998 s->pts_wrap_bits = pts_wrap_bits;
4001 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4004 const char *ptr = str;
4006 /* Parse key=value pairs. */
4009 char *dest = NULL, *dest_end;
4010 int key_len, dest_len = 0;
4012 /* Skip whitespace and potential commas. */
4013 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4020 if (!(ptr = strchr(key, '=')))
4023 key_len = ptr - key;
4025 callback_get_buf(context, key, key_len, &dest, &dest_len);
4026 dest_end = dest + dest_len - 1;
4030 while (*ptr && *ptr != '\"') {
4034 if (dest && dest < dest_end)
4038 if (dest && dest < dest_end)
4046 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
4047 if (dest && dest < dest_end)
4055 int ff_find_stream_index(AVFormatContext *s, int id)
4058 for (i = 0; i < s->nb_streams; i++)
4059 if (s->streams[i]->id == id)
4064 int64_t ff_iso8601_to_unix_time(const char *datestr)
4066 struct tm time1 = { 0 }, time2 = { 0 };
4068 ret1 = av_small_strptime(datestr, "%Y - %m - %d %H:%M:%S", &time1);
4069 ret2 = av_small_strptime(datestr, "%Y - %m - %dT%H:%M:%S", &time2);
4071 return av_timegm(&time2);
4073 return av_timegm(&time1);
4076 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
4080 if (ofmt->query_codec)
4081 return ofmt->query_codec(codec_id, std_compliance);
4082 else if (ofmt->codec_tag)
4083 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4084 else if (codec_id == ofmt->video_codec ||
4085 codec_id == ofmt->audio_codec ||
4086 codec_id == ofmt->subtitle_codec)
4089 return AVERROR_PATCHWELCOME;
4092 int avformat_network_init(void)
4096 ff_network_inited_globally = 1;
4097 if ((ret = ff_network_init()) < 0)
4104 int avformat_network_deinit(void)
4113 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4114 uint64_t channel_layout, int32_t sample_rate,
4115 int32_t width, int32_t height)
4121 return AVERROR(EINVAL);
4124 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4126 if (channel_layout) {
4128 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4132 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4134 if (width || height) {
4136 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4138 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4140 return AVERROR(ENOMEM);
4141 bytestream_put_le32(&data, flags);
4143 bytestream_put_le32(&data, channels);
4145 bytestream_put_le64(&data, channel_layout);
4147 bytestream_put_le32(&data, sample_rate);
4148 if (width || height) {
4149 bytestream_put_le32(&data, width);
4150 bytestream_put_le32(&data, height);
4155 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
4157 AVRational undef = {0, 1};
4158 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
4159 AVRational codec_sample_aspect_ratio = stream && stream->codec ? stream->codec->sample_aspect_ratio : undef;
4160 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
4162 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
4163 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
4164 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
4165 stream_sample_aspect_ratio = undef;
4167 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
4168 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
4169 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
4170 frame_sample_aspect_ratio = undef;
4172 if (stream_sample_aspect_ratio.num)
4173 return stream_sample_aspect_ratio;
4175 return frame_sample_aspect_ratio;
4178 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
4180 AVRational fr = st->r_frame_rate;
4181 AVRational codec_fr = st->codec->framerate;
4182 AVRational avg_fr = st->avg_frame_rate;
4184 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
4185 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
4190 if (st->codec->ticks_per_frame > 1) {
4191 if ( codec_fr.num > 0 && codec_fr.den > 0 && av_q2d(codec_fr) < av_q2d(fr)*0.7
4192 && fabs(1.0 - av_q2d(av_div_q(avg_fr, fr))) > 0.1)
4199 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
4202 if (*spec <= '9' && *spec >= '0') /* opt:index */
4203 return strtol(spec, NULL, 0) == st->index;
4204 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
4205 *spec == 't') { /* opt:[vasdt] */
4206 enum AVMediaType type;
4209 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
4210 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
4211 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
4212 case 'd': type = AVMEDIA_TYPE_DATA; break;
4213 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
4214 default: av_assert0(0);
4216 if (type != st->codec->codec_type)
4218 if (*spec++ == ':') { /* possibly followed by :index */
4219 int i, index = strtol(spec, NULL, 0);
4220 for (i = 0; i < s->nb_streams; i++)
4221 if (s->streams[i]->codec->codec_type == type && index-- == 0)
4222 return i == st->index;
4226 } else if (*spec == 'p' && *(spec + 1) == ':') {
4230 prog_id = strtol(spec, &endptr, 0);
4231 for (i = 0; i < s->nb_programs; i++) {
4232 if (s->programs[i]->id != prog_id)
4235 if (*endptr++ == ':') {
4236 int stream_idx = strtol(endptr, NULL, 0);
4237 return stream_idx >= 0 &&
4238 stream_idx < s->programs[i]->nb_stream_indexes &&
4239 st->index == s->programs[i]->stream_index[stream_idx];
4242 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
4243 if (st->index == s->programs[i]->stream_index[j])
4247 } else if (*spec == '#' ||
4248 (*spec == 'i' && *(spec + 1) == ':')) {
4251 spec += 1 + (*spec == 'i');
4252 stream_id = strtol(spec, &endptr, 0);
4254 return stream_id == st->id;
4255 } else if (*spec == 'm' && *(spec + 1) == ':') {
4256 AVDictionaryEntry *tag;
4261 val = strchr(spec, ':');
4263 key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
4265 return AVERROR(ENOMEM);
4267 tag = av_dict_get(st->metadata, key, NULL, 0);
4269 if (!val || !strcmp(tag->value, val + 1))
4278 } else if (!*spec) /* empty specifier, matches everything */
4281 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
4282 return AVERROR(EINVAL);
4285 int ff_generate_avci_extradata(AVStream *st)
4287 static const uint8_t avci100_1080p_extradata[] = {
4289 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4290 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4291 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4292 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
4293 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
4294 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
4295 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
4296 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
4297 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4299 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4302 static const uint8_t avci100_1080i_extradata[] = {
4304 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4305 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4306 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4307 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
4308 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
4309 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
4310 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
4311 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
4312 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
4313 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
4314 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x00,
4316 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4319 static const uint8_t avci50_1080p_extradata[] = {
4321 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4322 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4323 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4324 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
4325 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
4326 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
4327 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
4328 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
4329 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
4331 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4334 static const uint8_t avci50_1080i_extradata[] = {
4336 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4337 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4338 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4339 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
4340 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
4341 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
4342 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
4343 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
4344 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
4345 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
4346 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
4348 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4351 static const uint8_t avci100_720p_extradata[] = {
4353 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4354 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
4355 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
4356 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
4357 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
4358 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
4359 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
4360 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
4361 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
4362 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
4364 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
4367 static const uint8_t avci50_720p_extradata[] = {
4369 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
4370 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4371 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4372 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
4373 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
4374 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
4375 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
4376 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
4377 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
4379 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4383 const uint8_t *data = NULL;
4386 if (st->codec->width == 1920) {
4387 if (st->codec->field_order == AV_FIELD_PROGRESSIVE) {
4388 data = avci100_1080p_extradata;
4389 size = sizeof(avci100_1080p_extradata);
4391 data = avci100_1080i_extradata;
4392 size = sizeof(avci100_1080i_extradata);
4394 } else if (st->codec->width == 1440) {
4395 if (st->codec->field_order == AV_FIELD_PROGRESSIVE) {
4396 data = avci50_1080p_extradata;
4397 size = sizeof(avci50_1080p_extradata);
4399 data = avci50_1080i_extradata;
4400 size = sizeof(avci50_1080i_extradata);
4402 } else if (st->codec->width == 1280) {
4403 data = avci100_720p_extradata;
4404 size = sizeof(avci100_720p_extradata);
4405 } else if (st->codec->width == 960) {
4406 data = avci50_720p_extradata;
4407 size = sizeof(avci50_720p_extradata);
4413 av_freep(&st->codec->extradata);
4414 if (ff_alloc_extradata(st->codec, size))
4415 return AVERROR(ENOMEM);
4416 memcpy(st->codec->extradata, data, size);
4421 uint8_t *av_stream_get_side_data(AVStream *st, enum AVPacketSideDataType type,
4426 for (i = 0; i < st->nb_side_data; i++) {
4427 if (st->side_data[i].type == type) {
4429 *size = st->side_data[i].size;
4430 return st->side_data[i].data;