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_size = 0;
2847 return AVERROR(EINVAL);
2849 avctx->extradata = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
2850 if (avctx->extradata) {
2851 memset(avctx->extradata + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2852 avctx->extradata_size = size;
2855 avctx->extradata_size = 0;
2856 ret = AVERROR(ENOMEM);
2861 int ff_get_extradata(AVCodecContext *avctx, AVIOContext *pb, int size)
2863 int ret = ff_alloc_extradata(avctx, size);
2866 ret = avio_read(pb, avctx->extradata, size);
2868 av_freep(&avctx->extradata);
2869 avctx->extradata_size = 0;
2870 av_log(avctx, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
2871 return ret < 0 ? ret : AVERROR_INVALIDDATA;
2877 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
2880 int64_t last = st->info->last_dts;
2882 if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
2883 && ts - (uint64_t)last < INT64_MAX) {
2884 double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
2885 int64_t duration = ts - last;
2887 if (!st->info->duration_error)
2888 st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
2889 if (!st->info->duration_error)
2890 return AVERROR(ENOMEM);
2892 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2893 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
2894 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
2895 if (st->info->duration_error[0][1][i] < 1e10) {
2896 int framerate = get_std_framerate(i);
2897 double sdts = dts*framerate/(1001*12);
2898 for (j= 0; j<2; j++) {
2899 int64_t ticks = llrint(sdts+j*0.5);
2900 double error= sdts - ticks + j*0.5;
2901 st->info->duration_error[j][0][i] += error;
2902 st->info->duration_error[j][1][i] += error*error;
2906 st->info->duration_count++;
2907 st->info->rfps_duration_sum += duration;
2909 if (st->info->duration_count % 10 == 0) {
2910 int n = st->info->duration_count;
2911 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
2912 if (st->info->duration_error[0][1][i] < 1e10) {
2913 double a0 = st->info->duration_error[0][0][i] / n;
2914 double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
2915 double a1 = st->info->duration_error[1][0][i] / n;
2916 double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
2917 if (error0 > 0.04 && error1 > 0.04) {
2918 st->info->duration_error[0][1][i] = 2e10;
2919 st->info->duration_error[1][1][i] = 2e10;
2925 // ignore the first 4 values, they might have some random jitter
2926 if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
2927 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2929 if (ts != AV_NOPTS_VALUE)
2930 st->info->last_dts = ts;
2935 void ff_rfps_calculate(AVFormatContext *ic)
2939 for (i = 0; i < ic->nb_streams; i++) {
2940 AVStream *st = ic->streams[i];
2942 if (st->codec->codec_type != AVMEDIA_TYPE_VIDEO)
2944 // the check for tb_unreliable() is not completely correct, since this is not about handling
2945 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2946 // ipmovie.c produces.
2947 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)
2948 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);
2949 if (st->info->duration_count>1 && !st->r_frame_rate.num
2950 && tb_unreliable(st->codec)) {
2952 double best_error= 0.01;
2953 AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
2955 for (j= 0; j<MAX_STD_TIMEBASES; j++) {
2958 if (st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2960 if (!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
2963 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
2966 for (k= 0; k<2; k++) {
2967 int n = st->info->duration_count;
2968 double a= st->info->duration_error[k][0][j] / n;
2969 double error= st->info->duration_error[k][1][j]/n - a*a;
2971 if (error < best_error && best_error> 0.000000001) {
2973 num = get_std_framerate(j);
2976 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2979 // do not increase frame rate by more than 1 % in order to match a standard rate.
2980 if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
2981 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2983 if ( !st->avg_frame_rate.num
2984 && st->r_frame_rate.num && st->info->rfps_duration_sum
2985 && st->info->codec_info_duration <= 0
2986 && st->info->duration_count > 2
2987 && 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
2989 av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
2990 st->avg_frame_rate = st->r_frame_rate;
2993 av_freep(&st->info->duration_error);
2994 st->info->last_dts = AV_NOPTS_VALUE;
2995 st->info->duration_count = 0;
2996 st->info->rfps_duration_sum = 0;
3000 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3002 int i, count, ret = 0, j;
3005 AVPacket pkt1, *pkt;
3006 int64_t old_offset = avio_tell(ic->pb);
3007 // new streams might appear, no options for those
3008 int orig_nb_streams = ic->nb_streams;
3010 int64_t max_analyze_duration = ic->max_analyze_duration2;
3011 int64_t max_stream_analyze_duration;
3012 int64_t probesize = ic->probesize2;
3014 if (!max_analyze_duration)
3015 max_analyze_duration = ic->max_analyze_duration;
3017 probesize = ic->probesize;
3018 flush_codecs = probesize > 0;
3020 av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3022 max_stream_analyze_duration = max_analyze_duration;
3023 if (!max_analyze_duration) {
3024 max_stream_analyze_duration =
3025 max_analyze_duration = 5*AV_TIME_BASE;
3026 if (!strcmp(ic->iformat->name, "flv"))
3027 max_stream_analyze_duration = 30*AV_TIME_BASE;
3031 av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d\n",
3032 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count);
3034 for (i = 0; i < ic->nb_streams; i++) {
3035 const AVCodec *codec;
3036 AVDictionary *thread_opt = NULL;
3037 st = ic->streams[i];
3039 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3040 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3041 /* if (!st->time_base.num)
3043 if (!st->codec->time_base.num)
3044 st->codec->time_base = st->time_base;
3046 // only for the split stuff
3047 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
3048 st->parser = av_parser_init(st->codec->codec_id);
3050 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3051 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3052 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3053 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3055 } else if (st->need_parsing) {
3056 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3057 "%s, packets or times may be invalid.\n",
3058 avcodec_get_name(st->codec->codec_id));
3061 codec = find_decoder(ic, st, st->codec->codec_id);
3063 /* Force thread count to 1 since the H.264 decoder will not extract
3064 * SPS and PPS to extradata during multi-threaded decoding. */
3065 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3067 if (ic->codec_whitelist)
3068 av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3070 /* Ensure that subtitle_header is properly set. */
3071 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
3072 && codec && !st->codec->codec) {
3073 if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
3074 av_log(ic, AV_LOG_WARNING,
3075 "Failed to open codec in av_find_stream_info\n");
3078 // Try to just open decoders, in case this is enough to get parameters.
3079 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3080 if (codec && !st->codec->codec)
3081 if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
3082 av_log(ic, AV_LOG_WARNING,
3083 "Failed to open codec in av_find_stream_info\n");
3086 av_dict_free(&thread_opt);
3089 for (i = 0; i < ic->nb_streams; i++) {
3090 #if FF_API_R_FRAME_RATE
3091 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3093 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3094 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
3100 int analyzed_all_streams;
3101 if (ff_check_interrupt(&ic->interrupt_callback)) {
3103 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3107 /* check if one codec still needs to be handled */
3108 for (i = 0; i < ic->nb_streams; i++) {
3109 int fps_analyze_framecount = 20;
3111 st = ic->streams[i];
3112 if (!has_codec_parameters(st, NULL))
3114 /* If the timebase is coarse (like the usual millisecond precision
3115 * of mkv), we need to analyze more frames to reliably arrive at
3116 * the correct fps. */
3117 if (av_q2d(st->time_base) > 0.0005)
3118 fps_analyze_framecount *= 2;
3119 if (!tb_unreliable(st->codec))
3120 fps_analyze_framecount = 0;
3121 if (ic->fps_probe_size >= 0)
3122 fps_analyze_framecount = ic->fps_probe_size;
3123 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3124 fps_analyze_framecount = 0;
3125 /* variable fps and no guess at the real fps */
3126 if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3127 st->info->duration_count < fps_analyze_framecount &&
3128 st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3130 if (st->parser && st->parser->parser->split &&
3131 !st->codec->extradata)
3133 if (st->first_dts == AV_NOPTS_VALUE &&
3134 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3135 st->codec_info_nb_frames < ic->max_ts_probe &&
3136 (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3137 st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
3140 analyzed_all_streams = 0;
3141 if (i == ic->nb_streams) {
3142 analyzed_all_streams = 1;
3143 /* NOTE: If the format has no header, then we need to read some
3144 * packets to get most of the streams, so we cannot stop here. */
3145 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3146 /* If we found the info for all the codecs, we can stop. */
3148 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3153 /* We did not get all the codec info, but we read too much data. */
3154 if (read_size >= probesize) {
3156 av_log(ic, AV_LOG_DEBUG,
3157 "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3158 for (i = 0; i < ic->nb_streams; i++)
3159 if (!ic->streams[i]->r_frame_rate.num &&
3160 ic->streams[i]->info->duration_count <= 1 &&
3161 ic->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3162 strcmp(ic->iformat->name, "image2"))
3163 av_log(ic, AV_LOG_WARNING,
3164 "Stream #%d: not enough frames to estimate rate; "
3165 "consider increasing probesize\n", i);
3169 /* NOTE: A new stream can be added there if no header in file
3170 * (AVFMTCTX_NOHEADER). */
3171 ret = read_frame_internal(ic, &pkt1);
3172 if (ret == AVERROR(EAGAIN))
3180 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3181 free_packet_buffer(&ic->packet_buffer, &ic->packet_buffer_end);
3183 pkt = add_to_pktbuf(&ic->packet_buffer, &pkt1,
3184 &ic->packet_buffer_end);
3186 ret = AVERROR(ENOMEM);
3187 goto find_stream_info_err;
3189 if ((ret = av_dup_packet(pkt)) < 0)
3190 goto find_stream_info_err;
3193 st = ic->streams[pkt->stream_index];
3194 if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3195 read_size += pkt->size;
3197 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3198 /* check for non-increasing dts */
3199 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3200 st->info->fps_last_dts >= pkt->dts) {
3201 av_log(ic, AV_LOG_DEBUG,
3202 "Non-increasing DTS in stream %d: packet %d with DTS "
3203 "%"PRId64", packet %d with DTS %"PRId64"\n",
3204 st->index, st->info->fps_last_dts_idx,
3205 st->info->fps_last_dts, st->codec_info_nb_frames,
3207 st->info->fps_first_dts =
3208 st->info->fps_last_dts = AV_NOPTS_VALUE;
3210 /* Check for a discontinuity in dts. If the difference in dts
3211 * is more than 1000 times the average packet duration in the
3212 * sequence, we treat it as a discontinuity. */
3213 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3214 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3215 (pkt->dts - st->info->fps_last_dts) / 1000 >
3216 (st->info->fps_last_dts - st->info->fps_first_dts) /
3217 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3218 av_log(ic, AV_LOG_WARNING,
3219 "DTS discontinuity in stream %d: packet %d with DTS "
3220 "%"PRId64", packet %d with DTS %"PRId64"\n",
3221 st->index, st->info->fps_last_dts_idx,
3222 st->info->fps_last_dts, st->codec_info_nb_frames,
3224 st->info->fps_first_dts =
3225 st->info->fps_last_dts = AV_NOPTS_VALUE;
3228 /* update stored dts values */
3229 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3230 st->info->fps_first_dts = pkt->dts;
3231 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3233 st->info->fps_last_dts = pkt->dts;
3234 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3236 if (st->codec_info_nb_frames>1) {
3239 if (st->time_base.den > 0)
3240 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3241 if (st->avg_frame_rate.num > 0)
3242 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3245 && st->codec_info_nb_frames>30
3246 && st->info->fps_first_dts != AV_NOPTS_VALUE
3247 && st->info->fps_last_dts != AV_NOPTS_VALUE)
3248 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3250 if (t >= (analyzed_all_streams ? max_analyze_duration : max_stream_analyze_duration)) {
3251 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds\n",
3252 max_analyze_duration,
3254 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3255 av_packet_unref(pkt);
3258 if (pkt->duration) {
3259 st->info->codec_info_duration += pkt->duration;
3260 st->info->codec_info_duration_fields += st->parser && st->need_parsing && st->codec->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3263 #if FF_API_R_FRAME_RATE
3264 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3265 ff_rfps_add_frame(ic, st, pkt->dts);
3267 if (st->parser && st->parser->parser->split && !st->codec->extradata) {
3268 int i = st->parser->parser->split(st->codec, pkt->data, pkt->size);
3269 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
3270 if (ff_alloc_extradata(st->codec, i))
3271 return AVERROR(ENOMEM);
3272 memcpy(st->codec->extradata, pkt->data,
3273 st->codec->extradata_size);
3277 /* If still no information, we try to open the codec and to
3278 * decompress the frame. We try to avoid that in most cases as
3279 * it takes longer and uses more memory. For MPEG-4, we need to
3280 * decompress for QuickTime.
3282 * If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3283 * least one frame of codec data, this makes sure the codec initializes
3284 * the channel configuration and does not only trust the values from
3286 try_decode_frame(ic, st, pkt,
3287 (options && i < orig_nb_streams) ? &options[i] : NULL);
3289 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3290 av_packet_unref(pkt);
3292 st->codec_info_nb_frames++;
3297 AVPacket empty_pkt = { 0 };
3299 av_init_packet(&empty_pkt);
3301 for (i = 0; i < ic->nb_streams; i++) {
3303 st = ic->streams[i];
3305 /* flush the decoders */
3306 if (st->info->found_decoder == 1) {
3308 err = try_decode_frame(ic, st, &empty_pkt,
3309 (options && i < orig_nb_streams)
3310 ? &options[i] : NULL);
3311 } while (err > 0 && !has_codec_parameters(st, NULL));
3314 av_log(ic, AV_LOG_INFO,
3315 "decoding for stream %d failed\n", st->index);
3321 // close codecs which were opened in try_decode_frame()
3322 for (i = 0; i < ic->nb_streams; i++) {
3323 st = ic->streams[i];
3324 avcodec_close(st->codec);
3327 ff_rfps_calculate(ic);
3329 for (i = 0; i < ic->nb_streams; i++) {
3330 st = ic->streams[i];
3331 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3332 if (st->codec->codec_id == AV_CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample) {
3333 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
3334 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == st->codec->pix_fmt)
3335 st->codec->codec_tag= tag;
3338 /* estimate average framerate if not set by demuxer */
3339 if (st->info->codec_info_duration_fields &&
3340 !st->avg_frame_rate.num &&
3341 st->info->codec_info_duration) {
3343 double best_error = 0.01;
3345 if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
3346 st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
3347 st->info->codec_info_duration < 0)
3349 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3350 st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
3351 st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
3353 /* Round guessed framerate to a "standard" framerate if it's
3354 * within 1% of the original estimate. */
3355 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
3356 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
3357 double error = fabs(av_q2d(st->avg_frame_rate) /
3358 av_q2d(std_fps) - 1);
3360 if (error < best_error) {
3362 best_fps = std_fps.num;
3366 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3367 best_fps, 12 * 1001, INT_MAX);
3370 if (!st->r_frame_rate.num) {
3371 if ( st->codec->time_base.den * (int64_t) st->time_base.num
3372 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t) st->time_base.den) {
3373 st->r_frame_rate.num = st->codec->time_base.den;
3374 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
3376 st->r_frame_rate.num = st->time_base.den;
3377 st->r_frame_rate.den = st->time_base.num;
3380 if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
3381 AVRational hw_ratio = { st->codec->height, st->codec->width };
3382 st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
3385 } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
3386 if (!st->codec->bits_per_coded_sample)
3387 st->codec->bits_per_coded_sample =
3388 av_get_bits_per_sample(st->codec->codec_id);
3389 // set stream disposition based on audio service type
3390 switch (st->codec->audio_service_type) {
3391 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
3392 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
3394 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
3395 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
3397 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
3398 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
3400 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
3401 st->disposition = AV_DISPOSITION_COMMENT;
3403 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
3404 st->disposition = AV_DISPOSITION_KARAOKE;
3411 estimate_timings(ic, old_offset);
3413 av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
3415 if (ret >= 0 && ic->nb_streams)
3416 /* We could not have all the codec parameters before EOF. */
3418 for (i = 0; i < ic->nb_streams; i++) {
3420 st = ic->streams[i];
3421 if (!has_codec_parameters(st, &errmsg)) {
3423 avcodec_string(buf, sizeof(buf), st->codec, 0);
3424 av_log(ic, AV_LOG_WARNING,
3425 "Could not find codec parameters for stream %d (%s): %s\n"
3426 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
3433 compute_chapters_end(ic);
3435 find_stream_info_err:
3436 for (i = 0; i < ic->nb_streams; i++) {
3437 st = ic->streams[i];
3438 if (ic->streams[i]->codec->codec_type != AVMEDIA_TYPE_AUDIO)
3439 ic->streams[i]->codec->thread_count = 0;
3441 av_freep(&st->info->duration_error);
3442 av_freep(&ic->streams[i]->info);
3445 av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
3446 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
3450 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
3454 for (i = 0; i < ic->nb_programs; i++) {
3455 if (ic->programs[i] == last) {
3459 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
3460 if (ic->programs[i]->stream_index[j] == s)
3461 return ic->programs[i];
3467 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
3468 int wanted_stream_nb, int related_stream,
3469 AVCodec **decoder_ret, int flags)
3471 int i, nb_streams = ic->nb_streams;
3472 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe;
3473 unsigned *program = NULL;
3474 const AVCodec *decoder = NULL, *best_decoder = NULL;
3476 if (related_stream >= 0 && wanted_stream_nb < 0) {
3477 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
3479 program = p->stream_index;
3480 nb_streams = p->nb_stream_indexes;
3483 for (i = 0; i < nb_streams; i++) {
3484 int real_stream_index = program ? program[i] : i;
3485 AVStream *st = ic->streams[real_stream_index];
3486 AVCodecContext *avctx = st->codec;
3487 if (avctx->codec_type != type)
3489 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
3491 if (wanted_stream_nb != real_stream_index &&
3492 st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED |
3493 AV_DISPOSITION_VISUAL_IMPAIRED))
3495 if (type == AVMEDIA_TYPE_AUDIO && !avctx->channels)
3498 decoder = find_decoder(ic, st, st->codec->codec_id);
3501 ret = AVERROR_DECODER_NOT_FOUND;
3505 count = st->codec_info_nb_frames;
3506 bitrate = avctx->bit_rate;
3508 bitrate = avctx->rc_max_rate;
3509 multiframe = FFMIN(5, count);
3510 if ((best_multiframe > multiframe) ||
3511 (best_multiframe == multiframe && best_bitrate > bitrate) ||
3512 (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
3515 best_bitrate = bitrate;
3516 best_multiframe = multiframe;
3517 ret = real_stream_index;
3518 best_decoder = decoder;
3519 if (program && i == nb_streams - 1 && ret < 0) {
3521 nb_streams = ic->nb_streams;
3522 /* no related stream found, try again with everything */
3527 *decoder_ret = (AVCodec*)best_decoder;
3531 /*******************************************************/
3533 int av_read_play(AVFormatContext *s)
3535 if (s->iformat->read_play)
3536 return s->iformat->read_play(s);
3538 return avio_pause(s->pb, 0);
3539 return AVERROR(ENOSYS);
3542 int av_read_pause(AVFormatContext *s)
3544 if (s->iformat->read_pause)
3545 return s->iformat->read_pause(s);
3547 return avio_pause(s->pb, 1);
3548 return AVERROR(ENOSYS);
3551 void ff_free_stream(AVFormatContext *s, AVStream *st) {
3553 av_assert0(s->nb_streams>0);
3554 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
3556 for (j = 0; j < st->nb_side_data; j++)
3557 av_freep(&st->side_data[j].data);
3558 av_freep(&st->side_data);
3559 st->nb_side_data = 0;
3562 av_parser_close(st->parser);
3564 if (st->attached_pic.data)
3565 av_free_packet(&st->attached_pic);
3566 av_dict_free(&st->metadata);
3567 av_freep(&st->probe_data.buf);
3568 av_freep(&st->index_entries);
3569 av_freep(&st->codec->extradata);
3570 av_freep(&st->codec->subtitle_header);
3571 av_freep(&st->codec);
3572 av_freep(&st->priv_data);
3574 av_freep(&st->info->duration_error);
3575 av_freep(&st->info);
3576 av_freep(&st->recommended_encoder_configuration);
3577 av_freep(&s->streams[ --s->nb_streams ]);
3580 void avformat_free_context(AVFormatContext *s)
3588 if (s->iformat && s->iformat->priv_class && s->priv_data)
3589 av_opt_free(s->priv_data);
3590 if (s->oformat && s->oformat->priv_class && s->priv_data)
3591 av_opt_free(s->priv_data);
3593 for (i = s->nb_streams - 1; i >= 0; i--) {
3594 ff_free_stream(s, s->streams[i]);
3596 for (i = s->nb_programs - 1; i >= 0; i--) {
3597 av_dict_free(&s->programs[i]->metadata);
3598 av_freep(&s->programs[i]->stream_index);
3599 av_freep(&s->programs[i]);
3601 av_freep(&s->programs);
3602 av_freep(&s->priv_data);
3603 while (s->nb_chapters--) {
3604 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
3605 av_freep(&s->chapters[s->nb_chapters]);
3607 av_freep(&s->chapters);
3608 av_dict_free(&s->metadata);
3609 av_freep(&s->streams);
3610 av_freep(&s->internal);
3611 flush_packet_queue(s);
3615 void avformat_close_input(AVFormatContext **ps)
3626 if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
3627 (s->flags & AVFMT_FLAG_CUSTOM_IO))
3630 flush_packet_queue(s);
3633 if (s->iformat->read_close)
3634 s->iformat->read_close(s);
3636 avformat_free_context(s);
3643 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
3649 if (s->nb_streams >= INT_MAX/sizeof(*streams))
3651 streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
3654 s->streams = streams;
3656 st = av_mallocz(sizeof(AVStream));
3659 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
3663 st->info->last_dts = AV_NOPTS_VALUE;
3665 st->codec = avcodec_alloc_context3(c);
3672 /* no default bitrate if decoding */
3673 st->codec->bit_rate = 0;
3675 /* default pts setting is MPEG-like */
3676 avpriv_set_pts_info(st, 33, 1, 90000);
3679 st->index = s->nb_streams;
3680 st->start_time = AV_NOPTS_VALUE;
3681 st->duration = AV_NOPTS_VALUE;
3682 /* we set the current DTS to 0 so that formats without any timestamps
3683 * but durations get some timestamps, formats with some unknown
3684 * timestamps have their first few packets buffered and the
3685 * timestamps corrected before they are returned to the user */
3686 st->cur_dts = s->iformat ? RELATIVE_TS_BASE : 0;
3687 st->first_dts = AV_NOPTS_VALUE;
3688 st->probe_packets = MAX_PROBE_PACKETS;
3689 st->pts_wrap_reference = AV_NOPTS_VALUE;
3690 st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
3692 st->last_IP_pts = AV_NOPTS_VALUE;
3693 st->last_dts_for_order_check = AV_NOPTS_VALUE;
3694 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
3695 st->pts_buffer[i] = AV_NOPTS_VALUE;
3697 st->sample_aspect_ratio = (AVRational) { 0, 1 };
3699 #if FF_API_R_FRAME_RATE
3700 st->info->last_dts = AV_NOPTS_VALUE;
3702 st->info->fps_first_dts = AV_NOPTS_VALUE;
3703 st->info->fps_last_dts = AV_NOPTS_VALUE;
3705 st->inject_global_side_data = s->internal->inject_global_side_data;
3707 s->streams[s->nb_streams++] = st;
3711 AVProgram *av_new_program(AVFormatContext *ac, int id)
3713 AVProgram *program = NULL;
3716 av_dlog(ac, "new_program: id=0x%04x\n", id);
3718 for (i = 0; i < ac->nb_programs; i++)
3719 if (ac->programs[i]->id == id)
3720 program = ac->programs[i];
3723 program = av_mallocz(sizeof(AVProgram));
3726 dynarray_add(&ac->programs, &ac->nb_programs, program);
3727 program->discard = AVDISCARD_NONE;
3730 program->pts_wrap_reference = AV_NOPTS_VALUE;
3731 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
3733 program->start_time =
3734 program->end_time = AV_NOPTS_VALUE;
3739 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
3740 int64_t start, int64_t end, const char *title)
3742 AVChapter *chapter = NULL;
3745 if (end != AV_NOPTS_VALUE && start > end) {
3746 av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
3750 for (i = 0; i < s->nb_chapters; i++)
3751 if (s->chapters[i]->id == id)
3752 chapter = s->chapters[i];
3755 chapter = av_mallocz(sizeof(AVChapter));
3758 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
3760 av_dict_set(&chapter->metadata, "title", title, 0);
3762 chapter->time_base = time_base;
3763 chapter->start = start;
3769 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
3772 AVProgram *program = NULL;
3775 if (idx >= ac->nb_streams) {
3776 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3780 for (i = 0; i < ac->nb_programs; i++) {
3781 if (ac->programs[i]->id != progid)
3783 program = ac->programs[i];
3784 for (j = 0; j < program->nb_stream_indexes; j++)
3785 if (program->stream_index[j] == idx)
3788 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
3791 program->stream_index = tmp;
3792 program->stream_index[program->nb_stream_indexes++] = idx;
3797 uint64_t ff_ntp_time(void)
3799 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3802 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
3805 char *q, buf1[20], c;
3806 int nd, len, percentd_found;
3818 while (av_isdigit(*p))
3819 nd = nd * 10 + *p++ - '0';
3821 } while (av_isdigit(c));
3830 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3832 if ((q - buf + len) > buf_size - 1)
3834 memcpy(q, buf1, len);
3842 if ((q - buf) < buf_size - 1)
3846 if (!percentd_found)
3855 void av_url_split(char *proto, int proto_size,
3856 char *authorization, int authorization_size,
3857 char *hostname, int hostname_size,
3858 int *port_ptr, char *path, int path_size, const char *url)
3860 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
3866 if (authorization_size > 0)
3867 authorization[0] = 0;
3868 if (hostname_size > 0)
3873 /* parse protocol */
3874 if ((p = strchr(url, ':'))) {
3875 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3882 /* no protocol means plain filename */
3883 av_strlcpy(path, url, path_size);
3887 /* separate path from hostname */
3888 ls = strchr(p, '/');
3889 ls2 = strchr(p, '?');
3893 ls = FFMIN(ls, ls2);
3895 av_strlcpy(path, ls, path_size);
3897 ls = &p[strlen(p)]; // XXX
3899 /* the rest is hostname, use that to parse auth/port */
3901 /* authorization (user[:pass]@hostname) */
3903 while ((at = strchr(p, '@')) && at < ls) {
3904 av_strlcpy(authorization, at2,
3905 FFMIN(authorization_size, at + 1 - at2));
3906 p = at + 1; /* skip '@' */
3909 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3911 av_strlcpy(hostname, p + 1,
3912 FFMIN(hostname_size, brk - p));
3913 if (brk[1] == ':' && port_ptr)
3914 *port_ptr = atoi(brk + 2);
3915 } else if ((col = strchr(p, ':')) && col < ls) {
3916 av_strlcpy(hostname, p,
3917 FFMIN(col + 1 - p, hostname_size));
3919 *port_ptr = atoi(col + 1);
3921 av_strlcpy(hostname, p,
3922 FFMIN(ls + 1 - p, hostname_size));
3926 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3929 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3932 'C', 'D', 'E', 'F' };
3933 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3936 'c', 'd', 'e', 'f' };
3937 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3939 for (i = 0; i < s; i++) {
3940 buff[i * 2] = hex_table[src[i] >> 4];
3941 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3947 int ff_hex_to_data(uint8_t *data, const char *p)
3954 p += strspn(p, SPACE_CHARS);
3957 c = av_toupper((unsigned char) *p++);
3958 if (c >= '0' && c <= '9')
3960 else if (c >= 'A' && c <= 'F')
3975 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
3976 unsigned int pts_num, unsigned int pts_den)
3979 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
3980 if (new_tb.num != pts_num)
3981 av_log(NULL, AV_LOG_DEBUG,
3982 "st:%d removing common factor %d from timebase\n",
3983 s->index, pts_num / new_tb.num);
3985 av_log(NULL, AV_LOG_WARNING,
3986 "st:%d has too large timebase, reducing\n", s->index);
3988 if (new_tb.num <= 0 || new_tb.den <= 0) {
3989 av_log(NULL, AV_LOG_ERROR,
3990 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
3991 new_tb.num, new_tb.den,
3995 s->time_base = new_tb;
3996 av_codec_set_pkt_timebase(s->codec, new_tb);
3997 s->pts_wrap_bits = pts_wrap_bits;
4000 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4003 const char *ptr = str;
4005 /* Parse key=value pairs. */
4008 char *dest = NULL, *dest_end;
4009 int key_len, dest_len = 0;
4011 /* Skip whitespace and potential commas. */
4012 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4019 if (!(ptr = strchr(key, '=')))
4022 key_len = ptr - key;
4024 callback_get_buf(context, key, key_len, &dest, &dest_len);
4025 dest_end = dest + dest_len - 1;
4029 while (*ptr && *ptr != '\"') {
4033 if (dest && dest < dest_end)
4037 if (dest && dest < dest_end)
4045 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
4046 if (dest && dest < dest_end)
4054 int ff_find_stream_index(AVFormatContext *s, int id)
4057 for (i = 0; i < s->nb_streams; i++)
4058 if (s->streams[i]->id == id)
4063 int64_t ff_iso8601_to_unix_time(const char *datestr)
4065 struct tm time1 = { 0 }, time2 = { 0 };
4067 ret1 = av_small_strptime(datestr, "%Y - %m - %d %H:%M:%S", &time1);
4068 ret2 = av_small_strptime(datestr, "%Y - %m - %dT%H:%M:%S", &time2);
4070 return av_timegm(&time2);
4072 return av_timegm(&time1);
4075 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
4079 if (ofmt->query_codec)
4080 return ofmt->query_codec(codec_id, std_compliance);
4081 else if (ofmt->codec_tag)
4082 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4083 else if (codec_id == ofmt->video_codec ||
4084 codec_id == ofmt->audio_codec ||
4085 codec_id == ofmt->subtitle_codec)
4088 return AVERROR_PATCHWELCOME;
4091 int avformat_network_init(void)
4095 ff_network_inited_globally = 1;
4096 if ((ret = ff_network_init()) < 0)
4103 int avformat_network_deinit(void)
4112 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4113 uint64_t channel_layout, int32_t sample_rate,
4114 int32_t width, int32_t height)
4120 return AVERROR(EINVAL);
4123 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4125 if (channel_layout) {
4127 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4131 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4133 if (width || height) {
4135 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4137 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4139 return AVERROR(ENOMEM);
4140 bytestream_put_le32(&data, flags);
4142 bytestream_put_le32(&data, channels);
4144 bytestream_put_le64(&data, channel_layout);
4146 bytestream_put_le32(&data, sample_rate);
4147 if (width || height) {
4148 bytestream_put_le32(&data, width);
4149 bytestream_put_le32(&data, height);
4154 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
4156 AVRational undef = {0, 1};
4157 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
4158 AVRational codec_sample_aspect_ratio = stream && stream->codec ? stream->codec->sample_aspect_ratio : undef;
4159 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
4161 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
4162 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
4163 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
4164 stream_sample_aspect_ratio = undef;
4166 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
4167 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
4168 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
4169 frame_sample_aspect_ratio = undef;
4171 if (stream_sample_aspect_ratio.num)
4172 return stream_sample_aspect_ratio;
4174 return frame_sample_aspect_ratio;
4177 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
4179 AVRational fr = st->r_frame_rate;
4180 AVRational codec_fr = st->codec->framerate;
4181 AVRational avg_fr = st->avg_frame_rate;
4183 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
4184 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
4189 if (st->codec->ticks_per_frame > 1) {
4190 if ( codec_fr.num > 0 && codec_fr.den > 0 && av_q2d(codec_fr) < av_q2d(fr)*0.7
4191 && fabs(1.0 - av_q2d(av_div_q(avg_fr, fr))) > 0.1)
4198 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
4201 if (*spec <= '9' && *spec >= '0') /* opt:index */
4202 return strtol(spec, NULL, 0) == st->index;
4203 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
4204 *spec == 't') { /* opt:[vasdt] */
4205 enum AVMediaType type;
4208 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
4209 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
4210 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
4211 case 'd': type = AVMEDIA_TYPE_DATA; break;
4212 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
4213 default: av_assert0(0);
4215 if (type != st->codec->codec_type)
4217 if (*spec++ == ':') { /* possibly followed by :index */
4218 int i, index = strtol(spec, NULL, 0);
4219 for (i = 0; i < s->nb_streams; i++)
4220 if (s->streams[i]->codec->codec_type == type && index-- == 0)
4221 return i == st->index;
4225 } else if (*spec == 'p' && *(spec + 1) == ':') {
4229 prog_id = strtol(spec, &endptr, 0);
4230 for (i = 0; i < s->nb_programs; i++) {
4231 if (s->programs[i]->id != prog_id)
4234 if (*endptr++ == ':') {
4235 int stream_idx = strtol(endptr, NULL, 0);
4236 return stream_idx >= 0 &&
4237 stream_idx < s->programs[i]->nb_stream_indexes &&
4238 st->index == s->programs[i]->stream_index[stream_idx];
4241 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
4242 if (st->index == s->programs[i]->stream_index[j])
4246 } else if (*spec == '#' ||
4247 (*spec == 'i' && *(spec + 1) == ':')) {
4250 spec += 1 + (*spec == 'i');
4251 stream_id = strtol(spec, &endptr, 0);
4253 return stream_id == st->id;
4254 } else if (*spec == 'm' && *(spec + 1) == ':') {
4255 AVDictionaryEntry *tag;
4260 val = strchr(spec, ':');
4262 key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
4264 return AVERROR(ENOMEM);
4266 tag = av_dict_get(st->metadata, key, NULL, 0);
4268 if (!val || !strcmp(tag->value, val + 1))
4277 } else if (!*spec) /* empty specifier, matches everything */
4280 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
4281 return AVERROR(EINVAL);
4284 int ff_generate_avci_extradata(AVStream *st)
4286 static const uint8_t avci100_1080p_extradata[] = {
4288 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4289 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4290 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4291 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
4292 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
4293 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
4294 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
4295 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
4296 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4298 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4301 static const uint8_t avci100_1080i_extradata[] = {
4303 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4304 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4305 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4306 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
4307 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
4308 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
4309 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
4310 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
4311 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
4312 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
4313 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x00,
4315 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4318 static const uint8_t avci50_1080p_extradata[] = {
4320 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4321 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4322 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4323 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
4324 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
4325 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
4326 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
4327 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
4328 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
4330 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4333 static const uint8_t avci50_1080i_extradata[] = {
4335 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4336 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4337 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4338 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
4339 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
4340 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
4341 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
4342 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
4343 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
4344 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
4345 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
4347 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4350 static const uint8_t avci100_720p_extradata[] = {
4352 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4353 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
4354 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
4355 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
4356 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
4357 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
4358 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
4359 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
4360 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
4361 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
4363 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
4366 static const uint8_t avci50_720p_extradata[] = {
4368 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
4369 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4370 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4371 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
4372 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
4373 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
4374 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
4375 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
4376 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
4378 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4382 const uint8_t *data = NULL;
4385 if (st->codec->width == 1920) {
4386 if (st->codec->field_order == AV_FIELD_PROGRESSIVE) {
4387 data = avci100_1080p_extradata;
4388 size = sizeof(avci100_1080p_extradata);
4390 data = avci100_1080i_extradata;
4391 size = sizeof(avci100_1080i_extradata);
4393 } else if (st->codec->width == 1440) {
4394 if (st->codec->field_order == AV_FIELD_PROGRESSIVE) {
4395 data = avci50_1080p_extradata;
4396 size = sizeof(avci50_1080p_extradata);
4398 data = avci50_1080i_extradata;
4399 size = sizeof(avci50_1080i_extradata);
4401 } else if (st->codec->width == 1280) {
4402 data = avci100_720p_extradata;
4403 size = sizeof(avci100_720p_extradata);
4404 } else if (st->codec->width == 960) {
4405 data = avci50_720p_extradata;
4406 size = sizeof(avci50_720p_extradata);
4412 av_freep(&st->codec->extradata);
4413 if (ff_alloc_extradata(st->codec, size))
4414 return AVERROR(ENOMEM);
4415 memcpy(st->codec->extradata, data, size);
4420 uint8_t *av_stream_get_side_data(AVStream *st, enum AVPacketSideDataType type,
4425 for (i = 0; i < st->nb_side_data; i++) {
4426 if (st->side_data[i].type == type) {
4428 *size = st->side_data[i].size;
4429 return st->side_data[i].data;