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
27 #include "libavutil/avassert.h"
28 #include "libavutil/avstring.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/internal.h"
31 #include "libavutil/mathematics.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/parseutils.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/time.h"
36 #include "libavutil/time_internal.h"
37 #include "libavutil/timestamp.h"
39 #include "libavcodec/bytestream.h"
40 #include "libavcodec/internal.h"
41 #include "libavcodec/raw.h"
43 #include "audiointerleave.h"
45 #include "avio_internal.h"
55 #include "libavutil/ffversion.h"
56 const char av_format_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
60 * various utility functions for use within FFmpeg
63 unsigned avformat_version(void)
65 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
66 return LIBAVFORMAT_VERSION_INT;
69 const char *avformat_configuration(void)
71 return FFMPEG_CONFIGURATION;
74 const char *avformat_license(void)
76 #define LICENSE_PREFIX "libavformat license: "
77 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
80 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
82 static int is_relative(int64_t ts) {
83 return ts > (RELATIVE_TS_BASE - (1LL<<48));
87 * Wrap a given time stamp, if there is an indication for an overflow
90 * @param timestamp the time stamp to wrap
91 * @return resulting time stamp
93 static int64_t wrap_timestamp(const AVStream *st, int64_t timestamp)
95 if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&
96 st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
97 if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
98 timestamp < st->pts_wrap_reference)
99 return timestamp + (1ULL << st->pts_wrap_bits);
100 else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
101 timestamp >= st->pts_wrap_reference)
102 return timestamp - (1ULL << st->pts_wrap_bits);
107 #if FF_API_FORMAT_GET_SET
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, AVCodec *, data_codec)
114 MAKE_ACCESSORS(AVFormatContext, format, int, metadata_header_padding)
115 MAKE_ACCESSORS(AVFormatContext, format, void *, opaque)
116 MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb)
117 #if FF_API_OLD_OPEN_CALLBACKS
118 FF_DISABLE_DEPRECATION_WARNINGS
119 MAKE_ACCESSORS(AVFormatContext, format, AVOpenCallback, open_cb)
120 FF_ENABLE_DEPRECATION_WARNINGS
124 int64_t av_stream_get_end_pts(const AVStream *st)
126 if (st->internal->priv_pts) {
127 return st->internal->priv_pts->val;
129 return AV_NOPTS_VALUE;
132 struct AVCodecParserContext *av_stream_get_parser(const AVStream *st)
137 void av_format_inject_global_side_data(AVFormatContext *s)
140 s->internal->inject_global_side_data = 1;
141 for (i = 0; i < s->nb_streams; i++) {
142 AVStream *st = s->streams[i];
143 st->inject_global_side_data = 1;
147 int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
149 av_assert0(!dst->codec_whitelist &&
150 !dst->format_whitelist &&
151 !dst->protocol_whitelist &&
152 !dst->protocol_blacklist);
153 dst-> codec_whitelist = av_strdup(src->codec_whitelist);
154 dst->format_whitelist = av_strdup(src->format_whitelist);
155 dst->protocol_whitelist = av_strdup(src->protocol_whitelist);
156 dst->protocol_blacklist = av_strdup(src->protocol_blacklist);
157 if ( (src-> codec_whitelist && !dst-> codec_whitelist)
158 || (src-> format_whitelist && !dst-> format_whitelist)
159 || (src->protocol_whitelist && !dst->protocol_whitelist)
160 || (src->protocol_blacklist && !dst->protocol_blacklist)) {
161 av_log(dst, AV_LOG_ERROR, "Failed to duplicate black/whitelist\n");
162 return AVERROR(ENOMEM);
167 static const AVCodec *find_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
169 #if FF_API_LAVF_AVCTX
170 FF_DISABLE_DEPRECATION_WARNINGS
171 if (st->codec->codec)
172 return st->codec->codec;
173 FF_ENABLE_DEPRECATION_WARNINGS
176 switch (st->codecpar->codec_type) {
177 case AVMEDIA_TYPE_VIDEO:
178 if (s->video_codec) return s->video_codec;
180 case AVMEDIA_TYPE_AUDIO:
181 if (s->audio_codec) return s->audio_codec;
183 case AVMEDIA_TYPE_SUBTITLE:
184 if (s->subtitle_codec) return s->subtitle_codec;
188 return avcodec_find_decoder(codec_id);
191 static const AVCodec *find_probe_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
193 const AVCodec *codec;
195 #if CONFIG_H264_DECODER
196 /* Other parts of the code assume this decoder to be used for h264,
197 * so force it if possible. */
198 if (codec_id == AV_CODEC_ID_H264)
199 return avcodec_find_decoder_by_name("h264");
202 codec = find_decoder(s, st, codec_id);
206 if (codec->capabilities & AV_CODEC_CAP_AVOID_PROBING) {
207 const AVCodec *probe_codec = NULL;
208 while (probe_codec = av_codec_next(probe_codec)) {
209 if (probe_codec->id == codec_id &&
210 av_codec_is_decoder(probe_codec) &&
211 !(probe_codec->capabilities & (AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_EXPERIMENTAL))) {
220 #if FF_API_FORMAT_GET_SET
221 int av_format_get_probe_score(const AVFormatContext *s)
223 return s->probe_score;
227 /* an arbitrarily chosen "sane" max packet size -- 50M */
228 #define SANE_CHUNK_SIZE (50000000)
230 int ffio_limit(AVIOContext *s, int size)
232 if (s->maxsize>= 0) {
233 int64_t remaining= s->maxsize - avio_tell(s);
234 if (remaining < size) {
235 int64_t newsize = avio_size(s);
236 if (!s->maxsize || s->maxsize<newsize)
237 s->maxsize = newsize - !newsize;
238 remaining= s->maxsize - avio_tell(s);
239 remaining= FFMAX(remaining, 0);
242 if (s->maxsize>= 0 && remaining+1 < size) {
243 av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
250 /* Read the data in sane-sized chunks and append to pkt.
251 * Return the number of bytes read or an error. */
252 static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
254 int64_t orig_pos = pkt->pos; // av_grow_packet might reset pos
255 int orig_size = pkt->size;
259 int prev_size = pkt->size;
262 /* When the caller requests a lot of data, limit it to the amount
263 * left in file or SANE_CHUNK_SIZE when it is not known. */
265 if (read_size > SANE_CHUNK_SIZE/10) {
266 read_size = ffio_limit(s, read_size);
267 // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
269 read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
272 ret = av_grow_packet(pkt, read_size);
276 ret = avio_read(s, pkt->data + prev_size, read_size);
277 if (ret != read_size) {
278 av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
285 pkt->flags |= AV_PKT_FLAG_CORRUPT;
289 av_packet_unref(pkt);
290 return pkt->size > orig_size ? pkt->size - orig_size : ret;
293 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
298 pkt->pos = avio_tell(s);
300 return append_packet_chunked(s, pkt, size);
303 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
306 return av_get_packet(s, pkt, size);
307 return append_packet_chunked(s, pkt, size);
310 int av_filename_number_test(const char *filename)
314 (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0);
317 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
320 static const struct {
323 enum AVMediaType type;
325 { "aac", AV_CODEC_ID_AAC, AVMEDIA_TYPE_AUDIO },
326 { "ac3", AV_CODEC_ID_AC3, AVMEDIA_TYPE_AUDIO },
327 { "aptx", AV_CODEC_ID_APTX, AVMEDIA_TYPE_AUDIO },
328 { "dts", AV_CODEC_ID_DTS, AVMEDIA_TYPE_AUDIO },
329 { "dvbsub", AV_CODEC_ID_DVB_SUBTITLE,AVMEDIA_TYPE_SUBTITLE },
330 { "dvbtxt", AV_CODEC_ID_DVB_TELETEXT,AVMEDIA_TYPE_SUBTITLE },
331 { "eac3", AV_CODEC_ID_EAC3, AVMEDIA_TYPE_AUDIO },
332 { "h264", AV_CODEC_ID_H264, AVMEDIA_TYPE_VIDEO },
333 { "hevc", AV_CODEC_ID_HEVC, AVMEDIA_TYPE_VIDEO },
334 { "loas", AV_CODEC_ID_AAC_LATM, AVMEDIA_TYPE_AUDIO },
335 { "m4v", AV_CODEC_ID_MPEG4, AVMEDIA_TYPE_VIDEO },
336 { "mjpeg_2000",AV_CODEC_ID_JPEG2000, AVMEDIA_TYPE_VIDEO },
337 { "mp3", AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO },
338 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
339 { "truehd", AV_CODEC_ID_TRUEHD, AVMEDIA_TYPE_AUDIO },
343 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
347 av_log(s, AV_LOG_DEBUG,
348 "Probe with size=%d, packets=%d detected %s with score=%d\n",
349 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets,
351 for (i = 0; fmt_id_type[i].name; i++) {
352 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
353 if (fmt_id_type[i].type != AVMEDIA_TYPE_AUDIO &&
354 st->codecpar->sample_rate)
356 if (st->request_probe > score &&
357 st->codecpar->codec_id != fmt_id_type[i].id)
359 st->codecpar->codec_id = fmt_id_type[i].id;
360 st->codecpar->codec_type = fmt_id_type[i].type;
361 st->internal->need_context_update = 1;
362 #if FF_API_LAVF_AVCTX
363 FF_DISABLE_DEPRECATION_WARNINGS
364 st->codec->codec_type = st->codecpar->codec_type;
365 st->codec->codec_id = st->codecpar->codec_id;
366 FF_ENABLE_DEPRECATION_WARNINGS
375 /************************************************************/
376 /* input media file */
378 int av_demuxer_open(AVFormatContext *ic) {
381 if (ic->format_whitelist && av_match_list(ic->iformat->name, ic->format_whitelist, ',') <= 0) {
382 av_log(ic, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", ic->format_whitelist);
383 return AVERROR(EINVAL);
386 if (ic->iformat->read_header) {
387 err = ic->iformat->read_header(ic);
392 if (ic->pb && !ic->internal->data_offset)
393 ic->internal->data_offset = avio_tell(ic->pb);
398 /* Open input file and probe the format if necessary. */
399 static int init_input(AVFormatContext *s, const char *filename,
400 AVDictionary **options)
403 AVProbeData pd = { filename, NULL, 0 };
404 int score = AVPROBE_SCORE_RETRY;
407 s->flags |= AVFMT_FLAG_CUSTOM_IO;
409 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
410 s, 0, s->format_probesize);
411 else if (s->iformat->flags & AVFMT_NOFILE)
412 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
413 "will be ignored with AVFMT_NOFILE format.\n");
417 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
418 (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
421 if ((ret = s->io_open(s, &s->pb, filename, AVIO_FLAG_READ | s->avio_flags, options)) < 0)
426 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
427 s, 0, s->format_probesize);
430 static int add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
431 AVPacketList **plast_pktl, int ref)
433 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
437 return AVERROR(ENOMEM);
440 if ((ret = av_packet_ref(&pktl->pkt, pkt)) < 0) {
449 (*plast_pktl)->next = pktl;
451 *packet_buffer = pktl;
453 /* Add the packet in the buffered packet list. */
458 int avformat_queue_attached_pictures(AVFormatContext *s)
461 for (i = 0; i < s->nb_streams; i++)
462 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
463 s->streams[i]->discard < AVDISCARD_ALL) {
464 if (s->streams[i]->attached_pic.size <= 0) {
465 av_log(s, AV_LOG_WARNING,
466 "Attached picture on stream %d has invalid size, "
471 ret = add_to_pktbuf(&s->internal->raw_packet_buffer,
472 &s->streams[i]->attached_pic,
473 &s->internal->raw_packet_buffer_end, 1);
480 static int update_stream_avctx(AVFormatContext *s)
483 for (i = 0; i < s->nb_streams; i++) {
484 AVStream *st = s->streams[i];
486 if (!st->internal->need_context_update)
489 /* close parser, because it depends on the codec */
490 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
491 av_parser_close(st->parser);
495 /* update internal codec context, for the parser */
496 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
500 #if FF_API_LAVF_AVCTX
501 FF_DISABLE_DEPRECATION_WARNINGS
502 /* update deprecated public codec context */
503 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
506 FF_ENABLE_DEPRECATION_WARNINGS
509 st->internal->need_context_update = 0;
515 int avformat_open_input(AVFormatContext **ps, const char *filename,
516 AVInputFormat *fmt, AVDictionary **options)
518 AVFormatContext *s = *ps;
520 AVDictionary *tmp = NULL;
521 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
523 if (!s && !(s = avformat_alloc_context()))
524 return AVERROR(ENOMEM);
526 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
527 return AVERROR(EINVAL);
533 av_dict_copy(&tmp, *options, 0);
535 if (s->pb) // must be before any goto fail
536 s->flags |= AVFMT_FLAG_CUSTOM_IO;
538 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
541 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
542 if ((ret = init_input(s, filename, &tmp)) < 0)
544 s->probe_score = ret;
546 if (!s->protocol_whitelist && s->pb && s->pb->protocol_whitelist) {
547 s->protocol_whitelist = av_strdup(s->pb->protocol_whitelist);
548 if (!s->protocol_whitelist) {
549 ret = AVERROR(ENOMEM);
554 if (!s->protocol_blacklist && s->pb && s->pb->protocol_blacklist) {
555 s->protocol_blacklist = av_strdup(s->pb->protocol_blacklist);
556 if (!s->protocol_blacklist) {
557 ret = AVERROR(ENOMEM);
562 if (s->format_whitelist && av_match_list(s->iformat->name, s->format_whitelist, ',') <= 0) {
563 av_log(s, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", s->format_whitelist);
564 ret = AVERROR(EINVAL);
568 avio_skip(s->pb, s->skip_initial_bytes);
570 /* Check filename in case an image number is expected. */
571 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
572 if (!av_filename_number_test(filename)) {
573 ret = AVERROR(EINVAL);
578 s->duration = s->start_time = AV_NOPTS_VALUE;
580 /* Allocate private data. */
581 if (s->iformat->priv_data_size > 0) {
582 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
583 ret = AVERROR(ENOMEM);
586 if (s->iformat->priv_class) {
587 *(const AVClass **) s->priv_data = s->iformat->priv_class;
588 av_opt_set_defaults(s->priv_data);
589 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
594 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
596 ff_id3v2_read_dict(s->pb, &s->internal->id3v2_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
599 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
600 if ((ret = s->iformat->read_header(s)) < 0)
604 s->metadata = s->internal->id3v2_meta;
605 s->internal->id3v2_meta = NULL;
606 } else if (s->internal->id3v2_meta) {
607 int level = AV_LOG_WARNING;
608 if (s->error_recognition & AV_EF_COMPLIANT)
609 level = AV_LOG_ERROR;
610 av_log(s, level, "Discarding ID3 tags because more suitable tags were found.\n");
611 av_dict_free(&s->internal->id3v2_meta);
612 if (s->error_recognition & AV_EF_EXPLODE)
613 return AVERROR_INVALIDDATA;
616 if (id3v2_extra_meta) {
617 if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
618 !strcmp(s->iformat->name, "tta")) {
619 if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
621 if ((ret = ff_id3v2_parse_chapters(s, &id3v2_extra_meta)) < 0)
624 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
626 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
628 if ((ret = avformat_queue_attached_pictures(s)) < 0)
631 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
632 s->internal->data_offset = avio_tell(s->pb);
634 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
636 update_stream_avctx(s);
638 for (i = 0; i < s->nb_streams; i++)
639 s->streams[i]->internal->orig_codec_id = s->streams[i]->codecpar->codec_id;
642 av_dict_free(options);
649 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
651 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
653 avformat_free_context(s);
658 /*******************************************************/
660 static void force_codec_ids(AVFormatContext *s, AVStream *st)
662 switch (st->codecpar->codec_type) {
663 case AVMEDIA_TYPE_VIDEO:
664 if (s->video_codec_id)
665 st->codecpar->codec_id = s->video_codec_id;
667 case AVMEDIA_TYPE_AUDIO:
668 if (s->audio_codec_id)
669 st->codecpar->codec_id = s->audio_codec_id;
671 case AVMEDIA_TYPE_SUBTITLE:
672 if (s->subtitle_codec_id)
673 st->codecpar->codec_id = s->subtitle_codec_id;
675 case AVMEDIA_TYPE_DATA:
676 if (s->data_codec_id)
677 st->codecpar->codec_id = s->data_codec_id;
682 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
684 if (st->request_probe>0) {
685 AVProbeData *pd = &st->probe_data;
687 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
691 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
693 av_log(s, AV_LOG_WARNING,
694 "Failed to reallocate probe buffer for stream %d\n",
699 memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
700 pd->buf_size += pkt->size;
701 memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
704 st->probe_packets = 0;
706 av_log(s, AV_LOG_WARNING,
707 "nothing to probe for stream %d\n", st->index);
711 end= s->internal->raw_packet_buffer_remaining_size <= 0
712 || st->probe_packets<= 0;
714 if (end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
715 int score = set_codec_from_probe_data(s, st, pd);
716 if ( (st->codecpar->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
720 st->request_probe = -1;
721 if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
722 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
724 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
726 force_codec_ids(s, st);
732 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
734 int64_t ref = pkt->dts;
735 int i, pts_wrap_behavior;
736 int64_t pts_wrap_reference;
737 AVProgram *first_program;
739 if (ref == AV_NOPTS_VALUE)
741 if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
743 ref &= (1LL << st->pts_wrap_bits)-1;
745 // reference time stamp should be 60 s before first time stamp
746 pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
747 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
748 pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
749 (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
750 AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
752 first_program = av_find_program_from_stream(s, NULL, stream_index);
754 if (!first_program) {
755 int default_stream_index = av_find_default_stream_index(s);
756 if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
757 for (i = 0; i < s->nb_streams; i++) {
758 if (av_find_program_from_stream(s, NULL, i))
760 s->streams[i]->pts_wrap_reference = pts_wrap_reference;
761 s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
765 st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
766 st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
770 AVProgram *program = first_program;
772 if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
773 pts_wrap_reference = program->pts_wrap_reference;
774 pts_wrap_behavior = program->pts_wrap_behavior;
777 program = av_find_program_from_stream(s, program, stream_index);
780 // update every program with differing pts_wrap_reference
781 program = first_program;
783 if (program->pts_wrap_reference != pts_wrap_reference) {
784 for (i = 0; i<program->nb_stream_indexes; i++) {
785 s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
786 s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
789 program->pts_wrap_reference = pts_wrap_reference;
790 program->pts_wrap_behavior = pts_wrap_behavior;
792 program = av_find_program_from_stream(s, program, stream_index);
798 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
804 AVPacketList *pktl = s->internal->raw_packet_buffer;
808 st = s->streams[pkt->stream_index];
809 if (s->internal->raw_packet_buffer_remaining_size <= 0)
810 if ((err = probe_codec(s, st, NULL)) < 0)
812 if (st->request_probe <= 0) {
813 s->internal->raw_packet_buffer = pktl->next;
814 s->internal->raw_packet_buffer_remaining_size += pkt->size;
823 ret = s->iformat->read_packet(s, pkt);
825 /* Some demuxers return FFERROR_REDO when they consume
826 data and discard it (ignored streams, junk, extradata).
827 We must re-call the demuxer to get the real packet. */
828 if (ret == FFERROR_REDO)
830 if (!pktl || ret == AVERROR(EAGAIN))
832 for (i = 0; i < s->nb_streams; i++) {
834 if (st->probe_packets || st->request_probe > 0)
835 if ((err = probe_codec(s, st, NULL)) < 0)
837 av_assert0(st->request_probe <= 0);
843 AVPacket tmp = { 0 };
844 ret = av_packet_ref(&tmp, pkt);
850 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
851 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
852 av_log(s, AV_LOG_WARNING,
853 "Dropped corrupted packet (stream = %d)\n",
855 av_packet_unref(pkt);
859 if (pkt->stream_index >= (unsigned)s->nb_streams) {
860 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
864 st = s->streams[pkt->stream_index];
866 if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
867 // correct first time stamps to negative values
868 if (!is_relative(st->first_dts))
869 st->first_dts = wrap_timestamp(st, st->first_dts);
870 if (!is_relative(st->start_time))
871 st->start_time = wrap_timestamp(st, st->start_time);
872 if (!is_relative(st->cur_dts))
873 st->cur_dts = wrap_timestamp(st, st->cur_dts);
876 pkt->dts = wrap_timestamp(st, pkt->dts);
877 pkt->pts = wrap_timestamp(st, pkt->pts);
879 force_codec_ids(s, st);
881 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
882 if (s->use_wallclock_as_timestamps)
883 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
885 if (!pktl && st->request_probe <= 0)
888 err = add_to_pktbuf(&s->internal->raw_packet_buffer, pkt,
889 &s->internal->raw_packet_buffer_end, 0);
892 s->internal->raw_packet_buffer_remaining_size -= pkt->size;
894 if ((err = probe_codec(s, st, pkt)) < 0)
900 /**********************************************************/
902 static int determinable_frame_size(AVCodecContext *avctx)
904 switch(avctx->codec_id) {
905 case AV_CODEC_ID_MP1:
906 case AV_CODEC_ID_MP2:
907 case AV_CODEC_ID_MP3:
915 * Return the frame duration in seconds. Return 0 if not available.
917 void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
918 AVCodecParserContext *pc, AVPacket *pkt)
920 AVRational codec_framerate = s->iformat ? st->internal->avctx->framerate :
921 av_mul_q(av_inv_q(st->internal->avctx->time_base), (AVRational){1, st->internal->avctx->ticks_per_frame});
922 int frame_size, sample_rate;
924 #if FF_API_LAVF_AVCTX
925 FF_DISABLE_DEPRECATION_WARNINGS
926 if ((!codec_framerate.den || !codec_framerate.num) && st->codec->time_base.den && st->codec->time_base.num)
927 codec_framerate = av_mul_q(av_inv_q(st->codec->time_base), (AVRational){1, st->codec->ticks_per_frame});
928 FF_ENABLE_DEPRECATION_WARNINGS
933 switch (st->codecpar->codec_type) {
934 case AVMEDIA_TYPE_VIDEO:
935 if (st->r_frame_rate.num && !pc && s->iformat) {
936 *pnum = st->r_frame_rate.den;
937 *pden = st->r_frame_rate.num;
938 } else if (st->time_base.num * 1000LL > st->time_base.den) {
939 *pnum = st->time_base.num;
940 *pden = st->time_base.den;
941 } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
942 av_assert0(st->internal->avctx->ticks_per_frame);
943 av_reduce(pnum, pden,
945 codec_framerate.num * (int64_t)st->internal->avctx->ticks_per_frame,
948 if (pc && pc->repeat_pict) {
949 av_assert0(s->iformat); // this may be wrong for interlaced encoding but its not used for that case
950 av_reduce(pnum, pden,
951 (*pnum) * (1LL + pc->repeat_pict),
955 /* If this codec can be interlaced or progressive then we need
956 * a parser to compute duration of a packet. Thus if we have
957 * no parser in such case leave duration undefined. */
958 if (st->internal->avctx->ticks_per_frame > 1 && !pc)
962 case AVMEDIA_TYPE_AUDIO:
963 if (st->internal->avctx_inited) {
964 frame_size = av_get_audio_frame_duration(st->internal->avctx, pkt->size);
965 sample_rate = st->internal->avctx->sample_rate;
967 frame_size = av_get_audio_frame_duration2(st->codecpar, pkt->size);
968 sample_rate = st->codecpar->sample_rate;
970 if (frame_size <= 0 || sample_rate <= 0)
980 static int is_intra_only(enum AVCodecID id)
982 const AVCodecDescriptor *d = avcodec_descriptor_get(id);
985 if (d->type == AVMEDIA_TYPE_VIDEO && !(d->props & AV_CODEC_PROP_INTRA_ONLY))
990 static int has_decode_delay_been_guessed(AVStream *st)
992 if (st->codecpar->codec_id != AV_CODEC_ID_H264) return 1;
993 if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
995 #if CONFIG_H264_DECODER
996 if (st->internal->avctx->has_b_frames &&
997 avpriv_h264_has_num_reorder_frames(st->internal->avctx) == st->internal->avctx->has_b_frames)
1000 if (st->internal->avctx->has_b_frames<3)
1001 return st->nb_decoded_frames >= 7;
1002 else if (st->internal->avctx->has_b_frames<4)
1003 return st->nb_decoded_frames >= 18;
1005 return st->nb_decoded_frames >= 20;
1008 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
1012 if (pktl == s->internal->packet_buffer_end)
1013 return s->internal->parse_queue;
1017 static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
1018 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1019 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1022 int delay = st->internal->avctx->has_b_frames;
1025 if (dts == AV_NOPTS_VALUE) {
1026 int64_t best_score = INT64_MAX;
1027 for (i = 0; i<delay; i++) {
1028 if (st->pts_reorder_error_count[i]) {
1029 int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
1030 if (score < best_score) {
1032 dts = pts_buffer[i];
1037 for (i = 0; i<delay; i++) {
1038 if (pts_buffer[i] != AV_NOPTS_VALUE) {
1039 int64_t diff = FFABS(pts_buffer[i] - dts)
1040 + (uint64_t)st->pts_reorder_error[i];
1041 diff = FFMAX(diff, st->pts_reorder_error[i]);
1042 st->pts_reorder_error[i] = diff;
1043 st->pts_reorder_error_count[i]++;
1044 if (st->pts_reorder_error_count[i] > 250) {
1045 st->pts_reorder_error[i] >>= 1;
1046 st->pts_reorder_error_count[i] >>= 1;
1053 if (dts == AV_NOPTS_VALUE)
1054 dts = pts_buffer[0];
1060 * Updates the dts of packets of a stream in pkt_buffer, by re-ordering the pts
1061 * of the packets in a window.
1063 static void update_dts_from_pts(AVFormatContext *s, int stream_index,
1064 AVPacketList *pkt_buffer)
1066 AVStream *st = s->streams[stream_index];
1067 int delay = st->internal->avctx->has_b_frames;
1070 int64_t pts_buffer[MAX_REORDER_DELAY+1];
1072 for (i = 0; i<MAX_REORDER_DELAY+1; i++)
1073 pts_buffer[i] = AV_NOPTS_VALUE;
1075 for (; pkt_buffer; pkt_buffer = get_next_pkt(s, st, pkt_buffer)) {
1076 if (pkt_buffer->pkt.stream_index != stream_index)
1079 if (pkt_buffer->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1080 pts_buffer[0] = pkt_buffer->pkt.pts;
1081 for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
1082 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
1084 pkt_buffer->pkt.dts = select_from_pts_buffer(st, pts_buffer, pkt_buffer->pkt.dts);
1089 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
1090 int64_t dts, int64_t pts, AVPacket *pkt)
1092 AVStream *st = s->streams[stream_index];
1093 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1094 AVPacketList *pktl_it;
1098 if (st->first_dts != AV_NOPTS_VALUE ||
1099 dts == AV_NOPTS_VALUE ||
1100 st->cur_dts == AV_NOPTS_VALUE ||
1104 st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
1106 shift = (uint64_t)st->first_dts - RELATIVE_TS_BASE;
1108 if (is_relative(pts))
1111 for (pktl_it = pktl; pktl_it; pktl_it = get_next_pkt(s, st, pktl_it)) {
1112 if (pktl_it->pkt.stream_index != stream_index)
1114 if (is_relative(pktl_it->pkt.pts))
1115 pktl_it->pkt.pts += shift;
1117 if (is_relative(pktl_it->pkt.dts))
1118 pktl_it->pkt.dts += shift;
1120 if (st->start_time == AV_NOPTS_VALUE && pktl_it->pkt.pts != AV_NOPTS_VALUE) {
1121 st->start_time = pktl_it->pkt.pts;
1122 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1123 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1127 if (has_decode_delay_been_guessed(st)) {
1128 update_dts_from_pts(s, stream_index, pktl);
1131 if (st->start_time == AV_NOPTS_VALUE) {
1132 st->start_time = pts;
1133 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1134 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1138 static void update_initial_durations(AVFormatContext *s, AVStream *st,
1139 int stream_index, int duration)
1141 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1142 int64_t cur_dts = RELATIVE_TS_BASE;
1144 if (st->first_dts != AV_NOPTS_VALUE) {
1145 if (st->update_initial_durations_done)
1147 st->update_initial_durations_done = 1;
1148 cur_dts = st->first_dts;
1149 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1150 if (pktl->pkt.stream_index == stream_index) {
1151 if (pktl->pkt.pts != pktl->pkt.dts ||
1152 pktl->pkt.dts != AV_NOPTS_VALUE ||
1155 cur_dts -= duration;
1158 if (pktl && pktl->pkt.dts != st->first_dts) {
1159 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %"PRId64") in the queue\n",
1160 av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
1164 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
1167 pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1168 st->first_dts = cur_dts;
1169 } else if (st->cur_dts != RELATIVE_TS_BASE)
1172 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1173 if (pktl->pkt.stream_index != stream_index)
1175 if ((pktl->pkt.pts == pktl->pkt.dts ||
1176 pktl->pkt.pts == AV_NOPTS_VALUE) &&
1177 (pktl->pkt.dts == AV_NOPTS_VALUE ||
1178 pktl->pkt.dts == st->first_dts ||
1179 pktl->pkt.dts == RELATIVE_TS_BASE) &&
1180 !pktl->pkt.duration) {
1181 pktl->pkt.dts = cur_dts;
1182 if (!st->internal->avctx->has_b_frames)
1183 pktl->pkt.pts = cur_dts;
1184 // if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
1185 pktl->pkt.duration = duration;
1188 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
1191 st->cur_dts = cur_dts;
1194 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1195 AVCodecParserContext *pc, AVPacket *pkt,
1196 int64_t next_dts, int64_t next_pts)
1198 int num, den, presentation_delayed, delay, i;
1200 AVRational duration;
1201 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1202 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1204 if (s->flags & AVFMT_FLAG_NOFILLIN)
1207 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
1208 if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
1209 if (st->last_dts_for_order_check <= pkt->dts) {
1212 av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
1213 "DTS %"PRIi64" < %"PRIi64" out of order\n",
1215 st->last_dts_for_order_check);
1216 st->dts_misordered++;
1218 if (st->dts_ordered + st->dts_misordered > 250) {
1219 st->dts_ordered >>= 1;
1220 st->dts_misordered >>= 1;
1224 st->last_dts_for_order_check = pkt->dts;
1225 if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
1226 pkt->dts = AV_NOPTS_VALUE;
1229 if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1230 pkt->dts = AV_NOPTS_VALUE;
1232 if (pc && pc->pict_type == AV_PICTURE_TYPE_B
1233 && !st->internal->avctx->has_b_frames)
1234 //FIXME Set low_delay = 0 when has_b_frames = 1
1235 st->internal->avctx->has_b_frames = 1;
1237 /* do we have a video B-frame ? */
1238 delay = st->internal->avctx->has_b_frames;
1239 presentation_delayed = 0;
1241 /* XXX: need has_b_frame, but cannot get it if the codec is
1242 * not initialized */
1244 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1245 presentation_delayed = 1;
1247 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
1248 st->pts_wrap_bits < 63 &&
1249 pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
1250 if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
1251 pkt->dts -= 1LL << st->pts_wrap_bits;
1253 pkt->pts += 1LL << st->pts_wrap_bits;
1256 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1257 * We take the conservative approach and discard both.
1258 * Note: If this is misbehaving for an H.264 file, then possibly
1259 * presentation_delayed is not set correctly. */
1260 if (delay == 1 && pkt->dts == pkt->pts &&
1261 pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
1262 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1263 if ( strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
1264 && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1265 pkt->dts = AV_NOPTS_VALUE;
1268 duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
1269 if (pkt->duration == 0) {
1270 ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
1272 duration = (AVRational) {num, den};
1273 pkt->duration = av_rescale_rnd(1,
1274 num * (int64_t) st->time_base.den,
1275 den * (int64_t) st->time_base.num,
1280 if (pkt->duration != 0 && (s->internal->packet_buffer || s->internal->parse_queue))
1281 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1283 /* Correct timestamps with byte offset if demuxers only have timestamps
1284 * on packet boundaries */
1285 if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
1286 /* this will estimate bitrate based on this frame's duration and size */
1287 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1288 if (pkt->pts != AV_NOPTS_VALUE)
1290 if (pkt->dts != AV_NOPTS_VALUE)
1294 /* This may be redundant, but it should not hurt. */
1295 if (pkt->dts != AV_NOPTS_VALUE &&
1296 pkt->pts != AV_NOPTS_VALUE &&
1297 pkt->pts > pkt->dts)
1298 presentation_delayed = 1;
1300 if (s->debug & FF_FDEBUG_TS)
1301 av_log(s, AV_LOG_TRACE,
1302 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%"PRId64" delay:%d onein_oneout:%d\n",
1303 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
1304 pkt->stream_index, pc, pkt->duration, delay, onein_oneout);
1306 /* Interpolate PTS and DTS if they are not present. We skip H264
1307 * currently because delay and has_b_frames are not reliably set. */
1308 if ((delay == 0 || (delay == 1 && pc)) &&
1310 if (presentation_delayed) {
1311 /* DTS = decompression timestamp */
1312 /* PTS = presentation timestamp */
1313 if (pkt->dts == AV_NOPTS_VALUE)
1314 pkt->dts = st->last_IP_pts;
1315 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1316 if (pkt->dts == AV_NOPTS_VALUE)
1317 pkt->dts = st->cur_dts;
1319 /* This is tricky: the dts must be incremented by the duration
1320 * of the frame we are displaying, i.e. the last I- or P-frame. */
1321 if (st->last_IP_duration == 0)
1322 st->last_IP_duration = pkt->duration;
1323 if (pkt->dts != AV_NOPTS_VALUE)
1324 st->cur_dts = pkt->dts + st->last_IP_duration;
1325 if (pkt->dts != AV_NOPTS_VALUE &&
1326 pkt->pts == AV_NOPTS_VALUE &&
1327 st->last_IP_duration > 0 &&
1328 ((uint64_t)st->cur_dts - (uint64_t)next_dts + 1) <= 2 &&
1329 next_dts != next_pts &&
1330 next_pts != AV_NOPTS_VALUE)
1331 pkt->pts = next_dts;
1333 st->last_IP_duration = pkt->duration;
1334 st->last_IP_pts = pkt->pts;
1335 /* Cannot compute PTS if not present (we can compute it only
1336 * by knowing the future. */
1337 } else if (pkt->pts != AV_NOPTS_VALUE ||
1338 pkt->dts != AV_NOPTS_VALUE ||
1341 /* presentation is not delayed : PTS and DTS are the same */
1342 if (pkt->pts == AV_NOPTS_VALUE)
1343 pkt->pts = pkt->dts;
1344 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1346 if (pkt->pts == AV_NOPTS_VALUE)
1347 pkt->pts = st->cur_dts;
1348 pkt->dts = pkt->pts;
1349 if (pkt->pts != AV_NOPTS_VALUE)
1350 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
1354 if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1355 st->pts_buffer[0] = pkt->pts;
1356 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
1357 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
1359 if(has_decode_delay_been_guessed(st))
1360 pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
1362 // We skipped it above so we try here.
1364 // This should happen on the first packet
1365 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1366 if (pkt->dts > st->cur_dts)
1367 st->cur_dts = pkt->dts;
1369 if (s->debug & FF_FDEBUG_TS)
1370 av_log(s, AV_LOG_TRACE, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1371 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
1374 if (is_intra_only(st->codecpar->codec_id))
1375 pkt->flags |= AV_PKT_FLAG_KEY;
1376 #if FF_API_CONVERGENCE_DURATION
1377 FF_DISABLE_DEPRECATION_WARNINGS
1379 pkt->convergence_duration = pc->convergence_duration;
1380 FF_ENABLE_DEPRECATION_WARNINGS
1384 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1387 AVPacketList *pktl = *pkt_buf;
1388 *pkt_buf = pktl->next;
1389 av_packet_unref(&pktl->pkt);
1392 *pkt_buf_end = NULL;
1396 * Parse a packet, add all split parts to parse_queue.
1398 * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
1400 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1402 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1403 AVStream *st = s->streams[stream_index];
1404 uint8_t *data = pkt ? pkt->data : NULL;
1405 int size = pkt ? pkt->size : 0;
1406 int ret = 0, got_output = 0;
1409 av_init_packet(&flush_pkt);
1412 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1413 // preserve 0-size sync packets
1414 compute_pkt_fields(s, st, st->parser, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1417 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1419 int64_t next_pts = pkt->pts;
1420 int64_t next_dts = pkt->dts;
1422 av_init_packet(&out_pkt);
1423 len = av_parser_parse2(st->parser, st->internal->avctx,
1424 &out_pkt.data, &out_pkt.size, data, size,
1425 pkt->pts, pkt->dts, pkt->pos);
1427 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1429 /* increment read pointer */
1433 got_output = !!out_pkt.size;
1438 if (pkt->side_data) {
1439 out_pkt.side_data = pkt->side_data;
1440 out_pkt.side_data_elems = pkt->side_data_elems;
1441 pkt->side_data = NULL;
1442 pkt->side_data_elems = 0;
1445 /* set the duration */
1446 out_pkt.duration = (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->duration : 0;
1447 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1448 if (st->internal->avctx->sample_rate > 0) {
1450 av_rescale_q_rnd(st->parser->duration,
1451 (AVRational) { 1, st->internal->avctx->sample_rate },
1457 out_pkt.stream_index = st->index;
1458 out_pkt.pts = st->parser->pts;
1459 out_pkt.dts = st->parser->dts;
1460 out_pkt.pos = st->parser->pos;
1461 out_pkt.flags |= pkt->flags & AV_PKT_FLAG_DISCARD;
1463 if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1464 out_pkt.pos = st->parser->frame_offset;
1466 if (st->parser->key_frame == 1 ||
1467 (st->parser->key_frame == -1 &&
1468 st->parser->pict_type == AV_PICTURE_TYPE_I))
1469 out_pkt.flags |= AV_PKT_FLAG_KEY;
1471 if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1472 out_pkt.flags |= AV_PKT_FLAG_KEY;
1474 compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts);
1476 ret = add_to_pktbuf(&s->internal->parse_queue, &out_pkt,
1477 &s->internal->parse_queue_end, 1);
1478 av_packet_unref(&out_pkt);
1483 /* end of the stream => close and free the parser */
1484 if (pkt == &flush_pkt) {
1485 av_parser_close(st->parser);
1490 av_packet_unref(pkt);
1494 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1495 AVPacketList **pkt_buffer_end,
1499 av_assert0(*pkt_buffer);
1502 *pkt_buffer = pktl->next;
1504 *pkt_buffer_end = NULL;
1509 static int64_t ts_to_samples(AVStream *st, int64_t ts)
1511 return av_rescale(ts, st->time_base.num * st->codecpar->sample_rate, st->time_base.den);
1514 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1516 int ret = 0, i, got_packet = 0;
1517 AVDictionary *metadata = NULL;
1519 av_init_packet(pkt);
1521 while (!got_packet && !s->internal->parse_queue) {
1525 /* read next packet */
1526 ret = ff_read_packet(s, &cur_pkt);
1528 if (ret == AVERROR(EAGAIN))
1530 /* flush the parsers */
1531 for (i = 0; i < s->nb_streams; i++) {
1533 if (st->parser && st->need_parsing)
1534 parse_packet(s, NULL, st->index);
1536 /* all remaining packets are now in parse_queue =>
1537 * really terminate parsing */
1541 st = s->streams[cur_pkt.stream_index];
1543 /* update context if required */
1544 if (st->internal->need_context_update) {
1545 if (avcodec_is_open(st->internal->avctx)) {
1546 av_log(s, AV_LOG_DEBUG, "Demuxer context update while decoder is open, closing and trying to re-open\n");
1547 avcodec_close(st->internal->avctx);
1548 st->info->found_decoder = 0;
1551 /* close parser, because it depends on the codec */
1552 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
1553 av_parser_close(st->parser);
1557 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
1561 #if FF_API_LAVF_AVCTX
1562 FF_DISABLE_DEPRECATION_WARNINGS
1563 /* update deprecated public codec context */
1564 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
1567 FF_ENABLE_DEPRECATION_WARNINGS
1570 st->internal->need_context_update = 0;
1573 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1574 cur_pkt.dts != AV_NOPTS_VALUE &&
1575 cur_pkt.pts < cur_pkt.dts) {
1576 av_log(s, AV_LOG_WARNING,
1577 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1578 cur_pkt.stream_index,
1579 av_ts2str(cur_pkt.pts),
1580 av_ts2str(cur_pkt.dts),
1583 if (s->debug & FF_FDEBUG_TS)
1584 av_log(s, AV_LOG_DEBUG,
1585 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"PRId64", flags=%d\n",
1586 cur_pkt.stream_index,
1587 av_ts2str(cur_pkt.pts),
1588 av_ts2str(cur_pkt.dts),
1589 cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
1591 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1592 st->parser = av_parser_init(st->codecpar->codec_id);
1594 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1595 "%s, packets or times may be invalid.\n",
1596 avcodec_get_name(st->codecpar->codec_id));
1597 /* no parser available: just output the raw packets */
1598 st->need_parsing = AVSTREAM_PARSE_NONE;
1599 } else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1600 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1601 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1602 st->parser->flags |= PARSER_FLAG_ONCE;
1603 else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1604 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1607 if (!st->need_parsing || !st->parser) {
1608 /* no parsing needed: we just output the packet as is */
1610 compute_pkt_fields(s, st, NULL, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1611 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1612 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1613 ff_reduce_index(s, st->index);
1614 av_add_index_entry(st, pkt->pos, pkt->dts,
1615 0, 0, AVINDEX_KEYFRAME);
1618 } else if (st->discard < AVDISCARD_ALL) {
1619 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1621 st->codecpar->sample_rate = st->internal->avctx->sample_rate;
1622 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
1623 st->codecpar->channels = st->internal->avctx->channels;
1624 st->codecpar->channel_layout = st->internal->avctx->channel_layout;
1625 st->codecpar->codec_id = st->internal->avctx->codec_id;
1628 av_packet_unref(&cur_pkt);
1630 if (pkt->flags & AV_PKT_FLAG_KEY)
1631 st->skip_to_keyframe = 0;
1632 if (st->skip_to_keyframe) {
1633 av_packet_unref(&cur_pkt);
1641 if (!got_packet && s->internal->parse_queue)
1642 ret = read_from_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt);
1645 AVStream *st = s->streams[pkt->stream_index];
1646 int discard_padding = 0;
1647 if (st->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
1648 int64_t pts = pkt->pts - (is_relative(pkt->pts) ? RELATIVE_TS_BASE : 0);
1649 int64_t sample = ts_to_samples(st, pts);
1650 int duration = ts_to_samples(st, pkt->duration);
1651 int64_t end_sample = sample + duration;
1652 if (duration > 0 && end_sample >= st->first_discard_sample &&
1653 sample < st->last_discard_sample)
1654 discard_padding = FFMIN(end_sample - st->first_discard_sample, duration);
1656 if (st->start_skip_samples && (pkt->pts == 0 || pkt->pts == RELATIVE_TS_BASE))
1657 st->skip_samples = st->start_skip_samples;
1658 if (st->skip_samples || discard_padding) {
1659 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1661 AV_WL32(p, st->skip_samples);
1662 AV_WL32(p + 4, discard_padding);
1663 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d / discard %d\n", st->skip_samples, discard_padding);
1665 st->skip_samples = 0;
1668 if (st->inject_global_side_data) {
1669 for (i = 0; i < st->nb_side_data; i++) {
1670 AVPacketSideData *src_sd = &st->side_data[i];
1673 if (av_packet_get_side_data(pkt, src_sd->type, NULL))
1676 dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
1678 av_log(s, AV_LOG_WARNING, "Could not inject global side data\n");
1682 memcpy(dst_data, src_sd->data, src_sd->size);
1684 st->inject_global_side_data = 0;
1688 av_opt_get_dict_val(s, "metadata", AV_OPT_SEARCH_CHILDREN, &metadata);
1690 s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
1691 av_dict_copy(&s->metadata, metadata, 0);
1692 av_dict_free(&metadata);
1693 av_opt_set_dict_val(s, "metadata", NULL, AV_OPT_SEARCH_CHILDREN);
1696 #if FF_API_LAVF_AVCTX
1697 update_stream_avctx(s);
1700 if (s->debug & FF_FDEBUG_TS)
1701 av_log(s, AV_LOG_DEBUG,
1702 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1703 "size=%d, duration=%"PRId64", flags=%d\n",
1705 av_ts2str(pkt->pts),
1706 av_ts2str(pkt->dts),
1707 pkt->size, pkt->duration, pkt->flags);
1712 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1714 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1720 ret = s->internal->packet_buffer
1721 ? read_from_packet_buffer(&s->internal->packet_buffer,
1722 &s->internal->packet_buffer_end, pkt)
1723 : read_frame_internal(s, pkt);
1730 AVPacketList *pktl = s->internal->packet_buffer;
1733 AVPacket *next_pkt = &pktl->pkt;
1735 if (next_pkt->dts != AV_NOPTS_VALUE) {
1736 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1737 // last dts seen for this stream. if any of packets following
1738 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1739 int64_t last_dts = next_pkt->dts;
1740 av_assert2(wrap_bits <= 64);
1741 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1742 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1743 av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2ULL << (wrap_bits - 1)) < 0) {
1744 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2ULL << (wrap_bits - 1))) {
1746 next_pkt->pts = pktl->pkt.dts;
1748 if (last_dts != AV_NOPTS_VALUE) {
1749 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1750 last_dts = pktl->pkt.dts;
1755 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1756 // Fixing the last reference frame had none pts issue (For MXF etc).
1757 // We only do this when
1759 // 2. we are not able to resolve a pts value for current packet.
1760 // 3. the packets for this stream at the end of the files had valid dts.
1761 next_pkt->pts = last_dts + next_pkt->duration;
1763 pktl = s->internal->packet_buffer;
1766 /* read packet from packet buffer, if there is data */
1767 st = s->streams[next_pkt->stream_index];
1768 if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
1769 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1770 ret = read_from_packet_buffer(&s->internal->packet_buffer,
1771 &s->internal->packet_buffer_end, pkt);
1776 ret = read_frame_internal(s, pkt);
1778 if (pktl && ret != AVERROR(EAGAIN)) {
1785 ret = add_to_pktbuf(&s->internal->packet_buffer, pkt,
1786 &s->internal->packet_buffer_end, 1);
1787 av_packet_unref(pkt);
1794 st = s->streams[pkt->stream_index];
1795 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1796 ff_reduce_index(s, st->index);
1797 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1800 if (is_relative(pkt->dts))
1801 pkt->dts -= RELATIVE_TS_BASE;
1802 if (is_relative(pkt->pts))
1803 pkt->pts -= RELATIVE_TS_BASE;
1808 /* XXX: suppress the packet queue */
1809 static void flush_packet_queue(AVFormatContext *s)
1813 free_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end);
1814 free_packet_buffer(&s->internal->packet_buffer, &s->internal->packet_buffer_end);
1815 free_packet_buffer(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
1817 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1820 /*******************************************************/
1823 int av_find_default_stream_index(AVFormatContext *s)
1827 int best_stream = 0;
1828 int best_score = INT_MIN;
1830 if (s->nb_streams <= 0)
1832 for (i = 0; i < s->nb_streams; i++) {
1835 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1836 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
1838 if (st->codecpar->width && st->codecpar->height)
1842 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1843 if (st->codecpar->sample_rate)
1846 if (st->codec_info_nb_frames)
1849 if (st->discard != AVDISCARD_ALL)
1852 if (score > best_score) {
1860 /** Flush the frame reader. */
1861 void ff_read_frame_flush(AVFormatContext *s)
1866 flush_packet_queue(s);
1868 /* Reset read state for each stream. */
1869 for (i = 0; i < s->nb_streams; i++) {
1873 av_parser_close(st->parser);
1876 st->last_IP_pts = AV_NOPTS_VALUE;
1877 st->last_dts_for_order_check = AV_NOPTS_VALUE;
1878 if (st->first_dts == AV_NOPTS_VALUE)
1879 st->cur_dts = RELATIVE_TS_BASE;
1881 /* We set the current DTS to an unspecified origin. */
1882 st->cur_dts = AV_NOPTS_VALUE;
1884 st->probe_packets = MAX_PROBE_PACKETS;
1886 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1887 st->pts_buffer[j] = AV_NOPTS_VALUE;
1889 if (s->internal->inject_global_side_data)
1890 st->inject_global_side_data = 1;
1892 st->skip_samples = 0;
1896 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1900 for (i = 0; i < s->nb_streams; i++) {
1901 AVStream *st = s->streams[i];
1904 av_rescale(timestamp,
1905 st->time_base.den * (int64_t) ref_st->time_base.num,
1906 st->time_base.num * (int64_t) ref_st->time_base.den);
1910 void ff_reduce_index(AVFormatContext *s, int stream_index)
1912 AVStream *st = s->streams[stream_index];
1913 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1915 if ((unsigned) st->nb_index_entries >= max_entries) {
1917 for (i = 0; 2 * i < st->nb_index_entries; i++)
1918 st->index_entries[i] = st->index_entries[2 * i];
1919 st->nb_index_entries = i;
1923 int ff_add_index_entry(AVIndexEntry **index_entries,
1924 int *nb_index_entries,
1925 unsigned int *index_entries_allocated_size,
1926 int64_t pos, int64_t timestamp,
1927 int size, int distance, int flags)
1929 AVIndexEntry *entries, *ie;
1932 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1935 if (timestamp == AV_NOPTS_VALUE)
1936 return AVERROR(EINVAL);
1938 if (size < 0 || size > 0x3FFFFFFF)
1939 return AVERROR(EINVAL);
1941 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1942 timestamp -= RELATIVE_TS_BASE;
1944 entries = av_fast_realloc(*index_entries,
1945 index_entries_allocated_size,
1946 (*nb_index_entries + 1) *
1947 sizeof(AVIndexEntry));
1951 *index_entries = entries;
1953 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
1954 timestamp, AVSEEK_FLAG_ANY);
1957 index = (*nb_index_entries)++;
1958 ie = &entries[index];
1959 av_assert0(index == 0 || ie[-1].timestamp < timestamp);
1961 ie = &entries[index];
1962 if (ie->timestamp != timestamp) {
1963 if (ie->timestamp <= timestamp)
1965 memmove(entries + index + 1, entries + index,
1966 sizeof(AVIndexEntry) * (*nb_index_entries - index));
1967 (*nb_index_entries)++;
1968 } else if (ie->pos == pos && distance < ie->min_distance)
1969 // do not reduce the distance
1970 distance = ie->min_distance;
1974 ie->timestamp = timestamp;
1975 ie->min_distance = distance;
1982 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
1983 int size, int distance, int flags)
1985 timestamp = wrap_timestamp(st, timestamp);
1986 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1987 &st->index_entries_allocated_size, pos,
1988 timestamp, size, distance, flags);
1991 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1992 int64_t wanted_timestamp, int flags)
2000 // Optimize appending index entries at the end.
2001 if (b && entries[b - 1].timestamp < wanted_timestamp)
2007 // Search for the next non-discarded packet.
2008 while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b && m < nb_entries - 1) {
2010 if (m == b && entries[m].timestamp >= wanted_timestamp) {
2016 timestamp = entries[m].timestamp;
2017 if (timestamp >= wanted_timestamp)
2019 if (timestamp <= wanted_timestamp)
2022 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
2024 if (!(flags & AVSEEK_FLAG_ANY))
2025 while (m >= 0 && m < nb_entries &&
2026 !(entries[m].flags & AVINDEX_KEYFRAME))
2027 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
2029 if (m == nb_entries)
2034 void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
2037 int64_t pos_delta = 0;
2039 //We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
2040 const char *proto = avio_find_protocol_name(s->filename);
2043 av_log(s, AV_LOG_INFO,
2044 "Protocol name not provided, cannot determine if input is local or "
2045 "a network protocol, buffers and access patterns cannot be configured "
2046 "optimally without knowing the protocol\n");
2049 if (proto && !(strcmp(proto, "file") && strcmp(proto, "pipe") && strcmp(proto, "cache")))
2052 for (ist1 = 0; ist1 < s->nb_streams; ist1++) {
2053 AVStream *st1 = s->streams[ist1];
2054 for (ist2 = 0; ist2 < s->nb_streams; ist2++) {
2055 AVStream *st2 = s->streams[ist2];
2061 for (i1 = i2 = 0; i1 < st1->nb_index_entries; i1++) {
2062 AVIndexEntry *e1 = &st1->index_entries[i1];
2063 int64_t e1_pts = av_rescale_q(e1->timestamp, st1->time_base, AV_TIME_BASE_Q);
2065 skip = FFMAX(skip, e1->size);
2066 for (; i2 < st2->nb_index_entries; i2++) {
2067 AVIndexEntry *e2 = &st2->index_entries[i2];
2068 int64_t e2_pts = av_rescale_q(e2->timestamp, st2->time_base, AV_TIME_BASE_Q);
2069 if (e2_pts - e1_pts < time_tolerance)
2071 pos_delta = FFMAX(pos_delta, e1->pos - e2->pos);
2079 /* XXX This could be adjusted depending on protocol*/
2080 if (s->pb->buffer_size < pos_delta && pos_delta < (1<<24)) {
2081 av_log(s, AV_LOG_VERBOSE, "Reconfiguring buffers to size %"PRId64"\n", pos_delta);
2082 ffio_set_buf_size(s->pb, pos_delta);
2083 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, pos_delta/2);
2086 if (skip < (1<<23)) {
2087 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, skip);
2091 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
2093 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
2094 wanted_timestamp, flags);
2097 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
2098 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2100 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
2101 if (stream_index >= 0)
2102 ts = wrap_timestamp(s->streams[stream_index], ts);
2106 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
2107 int64_t target_ts, int flags)
2109 AVInputFormat *avif = s->iformat;
2110 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
2111 int64_t ts_min, ts_max, ts;
2116 if (stream_index < 0)
2119 av_log(s, AV_LOG_TRACE, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2122 ts_min = AV_NOPTS_VALUE;
2123 pos_limit = -1; // GCC falsely says it may be uninitialized.
2125 st = s->streams[stream_index];
2126 if (st->index_entries) {
2129 /* FIXME: Whole function must be checked for non-keyframe entries in
2130 * index case, especially read_timestamp(). */
2131 index = av_index_search_timestamp(st, target_ts,
2132 flags | AVSEEK_FLAG_BACKWARD);
2133 index = FFMAX(index, 0);
2134 e = &st->index_entries[index];
2136 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
2138 ts_min = e->timestamp;
2139 av_log(s, AV_LOG_TRACE, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
2140 pos_min, av_ts2str(ts_min));
2142 av_assert1(index == 0);
2145 index = av_index_search_timestamp(st, target_ts,
2146 flags & ~AVSEEK_FLAG_BACKWARD);
2147 av_assert0(index < st->nb_index_entries);
2149 e = &st->index_entries[index];
2150 av_assert1(e->timestamp >= target_ts);
2152 ts_max = e->timestamp;
2153 pos_limit = pos_max - e->min_distance;
2154 av_log(s, AV_LOG_TRACE, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
2155 " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
2159 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
2160 ts_min, ts_max, flags, &ts, avif->read_timestamp);
2165 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
2168 ff_read_frame_flush(s);
2169 ff_update_cur_dts(s, st, ts);
2174 int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
2175 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2177 int64_t step = 1024;
2178 int64_t limit, ts_max;
2179 int64_t filesize = avio_size(s->pb);
2180 int64_t pos_max = filesize - 1;
2183 pos_max = FFMAX(0, (pos_max) - step);
2184 ts_max = ff_read_timestamp(s, stream_index,
2185 &pos_max, limit, read_timestamp);
2187 } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
2188 if (ts_max == AV_NOPTS_VALUE)
2192 int64_t tmp_pos = pos_max + 1;
2193 int64_t tmp_ts = ff_read_timestamp(s, stream_index,
2194 &tmp_pos, INT64_MAX, read_timestamp);
2195 if (tmp_ts == AV_NOPTS_VALUE)
2197 av_assert0(tmp_pos > pos_max);
2200 if (tmp_pos >= filesize)
2212 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
2213 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
2214 int64_t ts_min, int64_t ts_max,
2215 int flags, int64_t *ts_ret,
2216 int64_t (*read_timestamp)(struct AVFormatContext *, int,
2217 int64_t *, int64_t))
2224 av_log(s, AV_LOG_TRACE, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2226 if (ts_min == AV_NOPTS_VALUE) {
2227 pos_min = s->internal->data_offset;
2228 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2229 if (ts_min == AV_NOPTS_VALUE)
2233 if (ts_min >= target_ts) {
2238 if (ts_max == AV_NOPTS_VALUE) {
2239 if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
2241 pos_limit = pos_max;
2244 if (ts_max <= target_ts) {
2249 av_assert0(ts_min < ts_max);
2252 while (pos_min < pos_limit) {
2253 av_log(s, AV_LOG_TRACE,
2254 "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
2255 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
2256 av_assert0(pos_limit <= pos_max);
2258 if (no_change == 0) {
2259 int64_t approximate_keyframe_distance = pos_max - pos_limit;
2260 // interpolate position (better than dichotomy)
2261 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
2263 pos_min - approximate_keyframe_distance;
2264 } else if (no_change == 1) {
2265 // bisection if interpolation did not change min / max pos last time
2266 pos = (pos_min + pos_limit) >> 1;
2268 /* linear search if bisection failed, can only happen if there
2269 * are very few or no keyframes between min/max */
2274 else if (pos > pos_limit)
2278 // May pass pos_limit instead of -1.
2279 ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
2284 av_log(s, AV_LOG_TRACE, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
2285 " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
2286 pos_min, pos, pos_max,
2287 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
2288 pos_limit, start_pos, no_change);
2289 if (ts == AV_NOPTS_VALUE) {
2290 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
2293 if (target_ts <= ts) {
2294 pos_limit = start_pos - 1;
2298 if (target_ts >= ts) {
2304 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
2305 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
2308 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2310 ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2311 av_log(s, AV_LOG_TRACE, "pos=0x%"PRIx64" %s<=%s<=%s\n",
2312 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
2318 static int seek_frame_byte(AVFormatContext *s, int stream_index,
2319 int64_t pos, int flags)
2321 int64_t pos_min, pos_max;
2323 pos_min = s->internal->data_offset;
2324 pos_max = avio_size(s->pb) - 1;
2328 else if (pos > pos_max)
2331 avio_seek(s->pb, pos, SEEK_SET);
2333 s->io_repositioned = 1;
2338 static int seek_frame_generic(AVFormatContext *s, int stream_index,
2339 int64_t timestamp, int flags)
2346 st = s->streams[stream_index];
2348 index = av_index_search_timestamp(st, timestamp, flags);
2350 if (index < 0 && st->nb_index_entries &&
2351 timestamp < st->index_entries[0].timestamp)
2354 if (index < 0 || index == st->nb_index_entries - 1) {
2358 if (st->nb_index_entries) {
2359 av_assert0(st->index_entries);
2360 ie = &st->index_entries[st->nb_index_entries - 1];
2361 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2363 ff_update_cur_dts(s, st, ie->timestamp);
2365 if ((ret = avio_seek(s->pb, s->internal->data_offset, SEEK_SET)) < 0)
2371 read_status = av_read_frame(s, &pkt);
2372 } while (read_status == AVERROR(EAGAIN));
2373 if (read_status < 0)
2375 if (stream_index == pkt.stream_index && pkt.dts > timestamp) {
2376 if (pkt.flags & AV_PKT_FLAG_KEY) {
2377 av_packet_unref(&pkt);
2380 if (nonkey++ > 1000 && st->codecpar->codec_id != AV_CODEC_ID_CDGRAPHICS) {
2381 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);
2382 av_packet_unref(&pkt);
2386 av_packet_unref(&pkt);
2388 index = av_index_search_timestamp(st, timestamp, flags);
2393 ff_read_frame_flush(s);
2394 if (s->iformat->read_seek)
2395 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2397 ie = &st->index_entries[index];
2398 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2400 ff_update_cur_dts(s, st, ie->timestamp);
2405 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2406 int64_t timestamp, int flags)
2411 if (flags & AVSEEK_FLAG_BYTE) {
2412 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2414 ff_read_frame_flush(s);
2415 return seek_frame_byte(s, stream_index, timestamp, flags);
2418 if (stream_index < 0) {
2419 stream_index = av_find_default_stream_index(s);
2420 if (stream_index < 0)
2423 st = s->streams[stream_index];
2424 /* timestamp for default must be expressed in AV_TIME_BASE units */
2425 timestamp = av_rescale(timestamp, st->time_base.den,
2426 AV_TIME_BASE * (int64_t) st->time_base.num);
2429 /* first, we try the format specific seek */
2430 if (s->iformat->read_seek) {
2431 ff_read_frame_flush(s);
2432 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2438 if (s->iformat->read_timestamp &&
2439 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2440 ff_read_frame_flush(s);
2441 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2442 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2443 ff_read_frame_flush(s);
2444 return seek_frame_generic(s, stream_index, timestamp, flags);
2449 int av_seek_frame(AVFormatContext *s, int stream_index,
2450 int64_t timestamp, int flags)
2454 if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2455 int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2456 if ((flags & AVSEEK_FLAG_BACKWARD))
2460 return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2461 flags & ~AVSEEK_FLAG_BACKWARD);
2464 ret = seek_frame_internal(s, stream_index, timestamp, flags);
2467 ret = avformat_queue_attached_pictures(s);
2472 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
2473 int64_t ts, int64_t max_ts, int flags)
2475 if (min_ts > ts || max_ts < ts)
2477 if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2478 return AVERROR(EINVAL);
2481 flags |= AVSEEK_FLAG_ANY;
2482 flags &= ~AVSEEK_FLAG_BACKWARD;
2484 if (s->iformat->read_seek2) {
2486 ff_read_frame_flush(s);
2488 if (stream_index == -1 && s->nb_streams == 1) {
2489 AVRational time_base = s->streams[0]->time_base;
2490 ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2491 min_ts = av_rescale_rnd(min_ts, time_base.den,
2492 time_base.num * (int64_t)AV_TIME_BASE,
2493 AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
2494 max_ts = av_rescale_rnd(max_ts, time_base.den,
2495 time_base.num * (int64_t)AV_TIME_BASE,
2496 AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
2500 ret = s->iformat->read_seek2(s, stream_index, min_ts,
2504 ret = avformat_queue_attached_pictures(s);
2508 if (s->iformat->read_timestamp) {
2509 // try to seek via read_timestamp()
2512 // Fall back on old API if new is not implemented but old is.
2513 // Note the old API has somewhat different semantics.
2514 if (s->iformat->read_seek || 1) {
2515 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2516 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2517 if (ret<0 && ts != min_ts && max_ts != ts) {
2518 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2520 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2525 // try some generic seek like seek_frame_generic() but with new ts semantics
2526 return -1; //unreachable
2529 int avformat_flush(AVFormatContext *s)
2531 ff_read_frame_flush(s);
2535 /*******************************************************/
2538 * Return TRUE if the stream has accurate duration in any stream.
2540 * @return TRUE if the stream has accurate duration for at least one component.
2542 static int has_duration(AVFormatContext *ic)
2547 for (i = 0; i < ic->nb_streams; i++) {
2548 st = ic->streams[i];
2549 if (st->duration != AV_NOPTS_VALUE)
2552 if (ic->duration != AV_NOPTS_VALUE)
2558 * Estimate the stream timings from the one of each components.
2560 * Also computes the global bitrate if possible.
2562 static void update_stream_timings(AVFormatContext *ic)
2564 int64_t start_time, start_time1, start_time_text, end_time, end_time1, end_time_text;
2565 int64_t duration, duration1, filesize;
2570 start_time = INT64_MAX;
2571 start_time_text = INT64_MAX;
2572 end_time = INT64_MIN;
2573 end_time_text = INT64_MIN;
2574 duration = INT64_MIN;
2575 for (i = 0; i < ic->nb_streams; i++) {
2576 st = ic->streams[i];
2577 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2578 start_time1 = av_rescale_q(st->start_time, st->time_base,
2580 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
2581 if (start_time1 < start_time_text)
2582 start_time_text = start_time1;
2584 start_time = FFMIN(start_time, start_time1);
2585 end_time1 = av_rescale_q_rnd(st->duration, st->time_base,
2587 AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
2588 if (end_time1 != AV_NOPTS_VALUE && (end_time1 > 0 ? start_time1 <= INT64_MAX - end_time1 : start_time1 >= INT64_MIN - end_time1)) {
2589 end_time1 += start_time1;
2590 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
2591 end_time_text = FFMAX(end_time_text, end_time1);
2593 end_time = FFMAX(end_time, end_time1);
2595 for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
2596 if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2597 p->start_time = start_time1;
2598 if (p->end_time < end_time1)
2599 p->end_time = end_time1;
2602 if (st->duration != AV_NOPTS_VALUE) {
2603 duration1 = av_rescale_q(st->duration, st->time_base,
2605 duration = FFMAX(duration, duration1);
2608 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2609 start_time = start_time_text;
2610 else if (start_time > start_time_text)
2611 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2613 if (end_time == INT64_MIN || (end_time < end_time_text && end_time_text - end_time < AV_TIME_BASE)) {
2614 end_time = end_time_text;
2615 } else if (end_time < end_time_text) {
2616 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream endtime %f\n", end_time_text / (float)AV_TIME_BASE);
2619 if (start_time != INT64_MAX) {
2620 ic->start_time = start_time;
2621 if (end_time != INT64_MIN) {
2622 if (ic->nb_programs > 1) {
2623 for (i = 0; i < ic->nb_programs; i++) {
2624 p = ic->programs[i];
2625 if (p->start_time != AV_NOPTS_VALUE &&
2626 p->end_time > p->start_time &&
2627 p->end_time - (uint64_t)p->start_time <= INT64_MAX)
2628 duration = FFMAX(duration, p->end_time - p->start_time);
2630 } else if (end_time >= start_time && end_time - (uint64_t)start_time <= INT64_MAX) {
2631 duration = FFMAX(duration, end_time - start_time);
2635 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2636 ic->duration = duration;
2638 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration > 0) {
2639 /* compute the bitrate */
2640 double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2641 (double) ic->duration;
2642 if (bitrate >= 0 && bitrate <= INT64_MAX)
2643 ic->bit_rate = bitrate;
2647 static void fill_all_stream_timings(AVFormatContext *ic)
2652 update_stream_timings(ic);
2653 for (i = 0; i < ic->nb_streams; i++) {
2654 st = ic->streams[i];
2655 if (st->start_time == AV_NOPTS_VALUE) {
2656 if (ic->start_time != AV_NOPTS_VALUE)
2657 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
2659 if (ic->duration != AV_NOPTS_VALUE)
2660 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
2666 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2668 int64_t filesize, duration;
2669 int i, show_warning = 0;
2672 /* if bit_rate is already set, we believe it */
2673 if (ic->bit_rate <= 0) {
2674 int64_t bit_rate = 0;
2675 for (i = 0; i < ic->nb_streams; i++) {
2676 st = ic->streams[i];
2677 if (st->codecpar->bit_rate <= 0 && st->internal->avctx->bit_rate > 0)
2678 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
2679 if (st->codecpar->bit_rate > 0) {
2680 if (INT64_MAX - st->codecpar->bit_rate < bit_rate) {
2684 bit_rate += st->codecpar->bit_rate;
2685 } else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && st->codec_info_nb_frames > 1) {
2686 // If we have a videostream with packets but without a bitrate
2687 // then consider the sum not known
2692 ic->bit_rate = bit_rate;
2695 /* if duration is already set, we believe it */
2696 if (ic->duration == AV_NOPTS_VALUE &&
2697 ic->bit_rate != 0) {
2698 filesize = ic->pb ? avio_size(ic->pb) : 0;
2699 if (filesize > ic->internal->data_offset) {
2700 filesize -= ic->internal->data_offset;
2701 for (i = 0; i < ic->nb_streams; i++) {
2702 st = ic->streams[i];
2703 if ( st->time_base.num <= INT64_MAX / ic->bit_rate
2704 && st->duration == AV_NOPTS_VALUE) {
2705 duration = av_rescale(8 * filesize, st->time_base.den,
2707 (int64_t) st->time_base.num);
2708 st->duration = duration;
2715 av_log(ic, AV_LOG_WARNING,
2716 "Estimating duration from bitrate, this may be inaccurate\n");
2719 #define DURATION_MAX_READ_SIZE 250000LL
2720 #define DURATION_MAX_RETRY 6
2722 /* only usable for MPEG-PS streams */
2723 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2725 AVPacket pkt1, *pkt = &pkt1;
2727 int num, den, read_size, i, ret;
2728 int found_duration = 0;
2730 int64_t filesize, offset, duration;
2733 /* flush packet queue */
2734 flush_packet_queue(ic);
2736 for (i = 0; i < ic->nb_streams; i++) {
2737 st = ic->streams[i];
2738 if (st->start_time == AV_NOPTS_VALUE &&
2739 st->first_dts == AV_NOPTS_VALUE &&
2740 st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN)
2741 av_log(ic, AV_LOG_WARNING,
2742 "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2745 av_parser_close(st->parser);
2750 av_opt_set(ic, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN);
2751 /* estimate the end time (duration) */
2752 /* XXX: may need to support wrapping */
2753 filesize = ic->pb ? avio_size(ic->pb) : 0;
2755 is_end = found_duration;
2756 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
2760 avio_seek(ic->pb, offset, SEEK_SET);
2763 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
2767 ret = ff_read_packet(ic, pkt);
2768 } while (ret == AVERROR(EAGAIN));
2771 read_size += pkt->size;
2772 st = ic->streams[pkt->stream_index];
2773 if (pkt->pts != AV_NOPTS_VALUE &&
2774 (st->start_time != AV_NOPTS_VALUE ||
2775 st->first_dts != AV_NOPTS_VALUE)) {
2776 if (pkt->duration == 0) {
2777 ff_compute_frame_duration(ic, &num, &den, st, st->parser, pkt);
2779 pkt->duration = av_rescale_rnd(1,
2780 num * (int64_t) st->time_base.den,
2781 den * (int64_t) st->time_base.num,
2785 duration = pkt->pts + pkt->duration;
2787 if (st->start_time != AV_NOPTS_VALUE)
2788 duration -= st->start_time;
2790 duration -= st->first_dts;
2792 if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
2793 (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2794 st->duration = duration;
2795 st->info->last_duration = duration;
2798 av_packet_unref(pkt);
2801 /* check if all audio/video streams have valid duration */
2804 for (i = 0; i < ic->nb_streams; i++) {
2805 st = ic->streams[i];
2806 switch (st->codecpar->codec_type) {
2807 case AVMEDIA_TYPE_VIDEO:
2808 case AVMEDIA_TYPE_AUDIO:
2809 if (st->duration == AV_NOPTS_VALUE)
2816 ++retry <= DURATION_MAX_RETRY);
2818 av_opt_set(ic, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN);
2820 /* warn about audio/video streams which duration could not be estimated */
2821 for (i = 0; i < ic->nb_streams; i++) {
2822 st = ic->streams[i];
2823 if (st->duration == AV_NOPTS_VALUE) {
2824 switch (st->codecpar->codec_type) {
2825 case AVMEDIA_TYPE_VIDEO:
2826 case AVMEDIA_TYPE_AUDIO:
2827 if (st->start_time != AV_NOPTS_VALUE || st->first_dts != AV_NOPTS_VALUE) {
2828 av_log(ic, AV_LOG_DEBUG, "stream %d : no PTS found at end of file, duration not set\n", i);
2830 av_log(ic, AV_LOG_DEBUG, "stream %d : no TS found at start of file, duration not set\n", i);
2834 fill_all_stream_timings(ic);
2836 avio_seek(ic->pb, old_offset, SEEK_SET);
2837 for (i = 0; i < ic->nb_streams; i++) {
2840 st = ic->streams[i];
2841 st->cur_dts = st->first_dts;
2842 st->last_IP_pts = AV_NOPTS_VALUE;
2843 st->last_dts_for_order_check = AV_NOPTS_VALUE;
2844 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
2845 st->pts_buffer[j] = AV_NOPTS_VALUE;
2849 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2853 /* get the file size, if possible */
2854 if (ic->iformat->flags & AVFMT_NOFILE) {
2857 file_size = avio_size(ic->pb);
2858 file_size = FFMAX(0, file_size);
2861 if ((!strcmp(ic->iformat->name, "mpeg") ||
2862 !strcmp(ic->iformat->name, "mpegts")) &&
2863 file_size && (ic->pb->seekable & AVIO_SEEKABLE_NORMAL)) {
2864 /* get accurate estimate from the PTSes */
2865 estimate_timings_from_pts(ic, old_offset);
2866 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2867 } else if (has_duration(ic)) {
2868 /* at least one component has timings - we use them for all
2870 fill_all_stream_timings(ic);
2871 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2873 /* less precise: use bitrate info */
2874 estimate_timings_from_bit_rate(ic);
2875 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2877 update_stream_timings(ic);
2881 AVStream av_unused *st;
2882 for (i = 0; i < ic->nb_streams; i++) {
2883 st = ic->streams[i];
2884 av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %0.3f duration: %0.3f\n", i,
2885 (double) st->start_time * av_q2d(st->time_base),
2886 (double) st->duration * av_q2d(st->time_base));
2888 av_log(ic, AV_LOG_TRACE,
2889 "format: start_time: %0.3f duration: %0.3f bitrate=%"PRId64" kb/s\n",
2890 (double) ic->start_time / AV_TIME_BASE,
2891 (double) ic->duration / AV_TIME_BASE,
2892 (int64_t)ic->bit_rate / 1000);
2896 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2898 AVCodecContext *avctx = st->internal->avctx;
2900 #define FAIL(errmsg) do { \
2902 *errmsg_ptr = errmsg; \
2906 if ( avctx->codec_id == AV_CODEC_ID_NONE
2907 && avctx->codec_type != AVMEDIA_TYPE_DATA)
2908 FAIL("unknown codec");
2909 switch (avctx->codec_type) {
2910 case AVMEDIA_TYPE_AUDIO:
2911 if (!avctx->frame_size && determinable_frame_size(avctx))
2912 FAIL("unspecified frame size");
2913 if (st->info->found_decoder >= 0 &&
2914 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2915 FAIL("unspecified sample format");
2916 if (!avctx->sample_rate)
2917 FAIL("unspecified sample rate");
2918 if (!avctx->channels)
2919 FAIL("unspecified number of channels");
2920 if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
2921 FAIL("no decodable DTS frames");
2923 case AVMEDIA_TYPE_VIDEO:
2925 FAIL("unspecified size");
2926 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
2927 FAIL("unspecified pixel format");
2928 if (st->codecpar->codec_id == AV_CODEC_ID_RV30 || st->codecpar->codec_id == AV_CODEC_ID_RV40)
2929 if (!st->sample_aspect_ratio.num && !st->codecpar->sample_aspect_ratio.num && !st->codec_info_nb_frames)
2930 FAIL("no frame in rv30/40 and no sar");
2932 case AVMEDIA_TYPE_SUBTITLE:
2933 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
2934 FAIL("unspecified size");
2936 case AVMEDIA_TYPE_DATA:
2937 if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
2943 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2944 static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
2945 AVDictionary **options)
2947 AVCodecContext *avctx = st->internal->avctx;
2948 const AVCodec *codec;
2949 int got_picture = 1, ret = 0;
2950 AVFrame *frame = av_frame_alloc();
2951 AVSubtitle subtitle;
2952 AVPacket pkt = *avpkt;
2953 int do_skip_frame = 0;
2954 enum AVDiscard skip_frame;
2957 return AVERROR(ENOMEM);
2959 if (!avcodec_is_open(avctx) &&
2960 st->info->found_decoder <= 0 &&
2961 (st->codecpar->codec_id != -st->info->found_decoder || !st->codecpar->codec_id)) {
2962 AVDictionary *thread_opt = NULL;
2964 codec = find_probe_decoder(s, st, st->codecpar->codec_id);
2967 st->info->found_decoder = -st->codecpar->codec_id;
2972 /* Force thread count to 1 since the H.264 decoder will not extract
2973 * SPS and PPS to extradata during multi-threaded decoding. */
2974 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2975 if (s->codec_whitelist)
2976 av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
2977 ret = avcodec_open2(avctx, codec, options ? options : &thread_opt);
2979 av_dict_free(&thread_opt);
2981 st->info->found_decoder = -avctx->codec_id;
2984 st->info->found_decoder = 1;
2985 } else if (!st->info->found_decoder)
2986 st->info->found_decoder = 1;
2988 if (st->info->found_decoder < 0) {
2993 if (avpriv_codec_get_cap_skip_frame_fill_param(avctx->codec)) {
2995 skip_frame = avctx->skip_frame;
2996 avctx->skip_frame = AVDISCARD_ALL;
2999 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
3001 (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
3002 (!st->codec_info_nb_frames &&
3003 (avctx->codec->capabilities & AV_CODEC_CAP_CHANNEL_CONF)))) {
3005 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
3006 avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
3007 ret = avcodec_send_packet(avctx, &pkt);
3008 if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3012 ret = avcodec_receive_frame(avctx, frame);
3015 if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
3017 } else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3018 ret = avcodec_decode_subtitle2(avctx, &subtitle,
3019 &got_picture, &pkt);
3025 st->nb_decoded_frames++;
3030 if (!pkt.data && !got_picture)
3034 if (do_skip_frame) {
3035 avctx->skip_frame = skip_frame;
3038 av_frame_free(&frame);
3042 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
3044 while (tags->id != AV_CODEC_ID_NONE) {
3052 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
3055 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3056 if (tag == tags[i].tag)
3058 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3059 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
3061 return AV_CODEC_ID_NONE;
3064 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
3066 if (bps <= 0 || bps > 64)
3067 return AV_CODEC_ID_NONE;
3072 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
3074 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
3076 return AV_CODEC_ID_NONE;
3081 if (sflags & (1 << (bps - 1))) {
3084 return AV_CODEC_ID_PCM_S8;
3086 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
3088 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
3090 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
3092 return be ? AV_CODEC_ID_PCM_S64BE : AV_CODEC_ID_PCM_S64LE;
3094 return AV_CODEC_ID_NONE;
3099 return AV_CODEC_ID_PCM_U8;
3101 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
3103 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
3105 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
3107 return AV_CODEC_ID_NONE;
3113 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
3116 if (!av_codec_get_tag2(tags, id, &tag))
3121 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
3125 for (i = 0; tags && tags[i]; i++) {
3126 const AVCodecTag *codec_tags = tags[i];
3127 while (codec_tags->id != AV_CODEC_ID_NONE) {
3128 if (codec_tags->id == id) {
3129 *tag = codec_tags->tag;
3138 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
3141 for (i = 0; tags && tags[i]; i++) {
3142 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
3143 if (id != AV_CODEC_ID_NONE)
3146 return AV_CODEC_ID_NONE;
3149 static void compute_chapters_end(AVFormatContext *s)
3152 int64_t max_time = 0;
3154 if (s->duration > 0 && s->start_time < INT64_MAX - s->duration)
3155 max_time = s->duration +
3156 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
3158 for (i = 0; i < s->nb_chapters; i++)
3159 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
3160 AVChapter *ch = s->chapters[i];
3161 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
3165 for (j = 0; j < s->nb_chapters; j++) {
3166 AVChapter *ch1 = s->chapters[j];
3167 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
3169 if (j != i && next_start > ch->start && next_start < end)
3172 ch->end = (end == INT64_MAX || end < ch->start) ? ch->start : end;
3176 static int get_std_framerate(int i)
3179 return (i + 1) * 1001;
3183 return (i + 31) * 1001 * 12;
3187 return ((const int[]) { 80, 120, 240})[i] * 1001 * 12;
3191 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
3194 /* Is the time base unreliable?
3195 * This is a heuristic to balance between quick acceptance of the values in
3196 * the headers vs. some extra checks.
3197 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
3198 * MPEG-2 commonly misuses field repeat flags to store different framerates.
3199 * And there are "variable" fps files this needs to detect as well. */
3200 static int tb_unreliable(AVCodecContext *c)
3202 if (c->time_base.den >= 101LL * c->time_base.num ||
3203 c->time_base.den < 5LL * c->time_base.num ||
3204 // c->codec_tag == AV_RL32("DIVX") ||
3205 // c->codec_tag == AV_RL32("XVID") ||
3206 c->codec_tag == AV_RL32("mp4v") ||
3207 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
3208 c->codec_id == AV_CODEC_ID_GIF ||
3209 c->codec_id == AV_CODEC_ID_HEVC ||
3210 c->codec_id == AV_CODEC_ID_H264)
3215 int ff_alloc_extradata(AVCodecParameters *par, int size)
3219 if (size < 0 || size >= INT32_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
3220 par->extradata = NULL;
3221 par->extradata_size = 0;
3222 return AVERROR(EINVAL);
3224 par->extradata = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
3225 if (par->extradata) {
3226 memset(par->extradata + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3227 par->extradata_size = size;
3230 par->extradata_size = 0;
3231 ret = AVERROR(ENOMEM);
3236 int ff_get_extradata(AVFormatContext *s, AVCodecParameters *par, AVIOContext *pb, int size)
3238 int ret = ff_alloc_extradata(par, size);
3241 ret = avio_read(pb, par->extradata, size);
3243 av_freep(&par->extradata);
3244 par->extradata_size = 0;
3245 av_log(s, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
3246 return ret < 0 ? ret : AVERROR_INVALIDDATA;
3252 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
3255 int64_t last = st->info->last_dts;
3257 if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
3258 && ts - (uint64_t)last < INT64_MAX) {
3259 double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
3260 int64_t duration = ts - last;
3262 if (!st->info->duration_error)
3263 st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
3264 if (!st->info->duration_error)
3265 return AVERROR(ENOMEM);
3267 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3268 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
3269 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3270 if (st->info->duration_error[0][1][i] < 1e10) {
3271 int framerate = get_std_framerate(i);
3272 double sdts = dts*framerate/(1001*12);
3273 for (j= 0; j<2; j++) {
3274 int64_t ticks = llrint(sdts+j*0.5);
3275 double error= sdts - ticks + j*0.5;
3276 st->info->duration_error[j][0][i] += error;
3277 st->info->duration_error[j][1][i] += error*error;
3281 st->info->duration_count++;
3282 st->info->rfps_duration_sum += duration;
3284 if (st->info->duration_count % 10 == 0) {
3285 int n = st->info->duration_count;
3286 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3287 if (st->info->duration_error[0][1][i] < 1e10) {
3288 double a0 = st->info->duration_error[0][0][i] / n;
3289 double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
3290 double a1 = st->info->duration_error[1][0][i] / n;
3291 double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
3292 if (error0 > 0.04 && error1 > 0.04) {
3293 st->info->duration_error[0][1][i] = 2e10;
3294 st->info->duration_error[1][1][i] = 2e10;
3300 // ignore the first 4 values, they might have some random jitter
3301 if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
3302 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
3304 if (ts != AV_NOPTS_VALUE)
3305 st->info->last_dts = ts;
3310 void ff_rfps_calculate(AVFormatContext *ic)
3314 for (i = 0; i < ic->nb_streams; i++) {
3315 AVStream *st = ic->streams[i];
3317 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
3319 // the check for tb_unreliable() is not completely correct, since this is not about handling
3320 // an unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3321 // ipmovie.c produces.
3322 if (tb_unreliable(st->internal->avctx) && 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)
3323 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);
3324 if (st->info->duration_count>1 && !st->r_frame_rate.num
3325 && tb_unreliable(st->internal->avctx)) {
3327 double best_error= 0.01;
3328 AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
3330 for (j= 0; j<MAX_STD_TIMEBASES; j++) {
3333 if (st->info->codec_info_duration &&
3334 st->info->codec_info_duration*av_q2d(st->time_base) < (1001*11.5)/get_std_framerate(j))
3336 if (!st->info->codec_info_duration && get_std_framerate(j) < 1001*12)
3339 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
3342 for (k= 0; k<2; k++) {
3343 int n = st->info->duration_count;
3344 double a= st->info->duration_error[k][0][j] / n;
3345 double error= st->info->duration_error[k][1][j]/n - a*a;
3347 if (error < best_error && best_error> 0.000000001) {
3349 num = get_std_framerate(j);
3352 av_log(ic, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
3355 // do not increase frame rate by more than 1 % in order to match a standard rate.
3356 if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
3357 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
3359 if ( !st->avg_frame_rate.num
3360 && st->r_frame_rate.num && st->info->rfps_duration_sum
3361 && st->info->codec_info_duration <= 0
3362 && st->info->duration_count > 2
3363 && 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
3365 av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
3366 st->avg_frame_rate = st->r_frame_rate;
3369 av_freep(&st->info->duration_error);
3370 st->info->last_dts = AV_NOPTS_VALUE;
3371 st->info->duration_count = 0;
3372 st->info->rfps_duration_sum = 0;
3376 static int extract_extradata_check(AVStream *st)
3378 const AVBitStreamFilter *f;
3380 f = av_bsf_get_by_name("extract_extradata");
3385 const enum AVCodecID *ids;
3386 for (ids = f->codec_ids; *ids != AV_CODEC_ID_NONE; ids++)
3387 if (*ids == st->codecpar->codec_id)
3394 static int extract_extradata_init(AVStream *st)
3396 AVStreamInternal *i = st->internal;
3397 const AVBitStreamFilter *f;
3400 f = av_bsf_get_by_name("extract_extradata");
3404 /* check that the codec id is supported */
3405 ret = extract_extradata_check(st);
3409 i->extract_extradata.pkt = av_packet_alloc();
3410 if (!i->extract_extradata.pkt)
3411 return AVERROR(ENOMEM);
3413 ret = av_bsf_alloc(f, &i->extract_extradata.bsf);
3417 ret = avcodec_parameters_copy(i->extract_extradata.bsf->par_in,
3422 i->extract_extradata.bsf->time_base_in = st->time_base;
3424 /* if init fails here, we assume extracting extradata is just not
3425 * supported for this codec, so we return success */
3426 ret = av_bsf_init(i->extract_extradata.bsf);
3428 av_bsf_free(&i->extract_extradata.bsf);
3433 i->extract_extradata.inited = 1;
3437 av_bsf_free(&i->extract_extradata.bsf);
3438 av_packet_free(&i->extract_extradata.pkt);
3442 static int extract_extradata(AVStream *st, AVPacket *pkt)
3444 AVStreamInternal *i = st->internal;
3448 if (!i->extract_extradata.inited) {
3449 ret = extract_extradata_init(st);
3454 if (i->extract_extradata.inited && !i->extract_extradata.bsf)
3457 pkt_ref = i->extract_extradata.pkt;
3458 ret = av_packet_ref(pkt_ref, pkt);
3462 ret = av_bsf_send_packet(i->extract_extradata.bsf, pkt_ref);
3464 av_packet_unref(pkt_ref);
3468 while (ret >= 0 && !i->avctx->extradata) {
3472 ret = av_bsf_receive_packet(i->extract_extradata.bsf, pkt_ref);
3474 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3479 extradata = av_packet_get_side_data(pkt_ref, AV_PKT_DATA_NEW_EXTRADATA,
3483 i->avctx->extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
3484 if (!i->avctx->extradata) {
3485 av_packet_unref(pkt_ref);
3486 return AVERROR(ENOMEM);
3488 memcpy(i->avctx->extradata, extradata, extradata_size);
3489 i->avctx->extradata_size = extradata_size;
3491 av_packet_unref(pkt_ref);
3497 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3499 int i, count = 0, ret = 0, j;
3502 AVCodecContext *avctx;
3503 AVPacket pkt1, *pkt;
3504 int64_t old_offset = avio_tell(ic->pb);
3505 // new streams might appear, no options for those
3506 int orig_nb_streams = ic->nb_streams;
3508 int64_t max_analyze_duration = ic->max_analyze_duration;
3509 int64_t max_stream_analyze_duration;
3510 int64_t max_subtitle_analyze_duration;
3511 int64_t probesize = ic->probesize;
3512 int eof_reached = 0;
3513 int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
3515 flush_codecs = probesize > 0;
3517 av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3519 max_stream_analyze_duration = max_analyze_duration;
3520 max_subtitle_analyze_duration = max_analyze_duration;
3521 if (!max_analyze_duration) {
3522 max_stream_analyze_duration =
3523 max_analyze_duration = 5*AV_TIME_BASE;
3524 max_subtitle_analyze_duration = 30*AV_TIME_BASE;
3525 if (!strcmp(ic->iformat->name, "flv"))
3526 max_stream_analyze_duration = 90*AV_TIME_BASE;
3527 if (!strcmp(ic->iformat->name, "mpeg") || !strcmp(ic->iformat->name, "mpegts"))
3528 max_stream_analyze_duration = 7*AV_TIME_BASE;
3532 av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d nb_streams:%d\n",
3533 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, ic->nb_streams);
3535 for (i = 0; i < ic->nb_streams; i++) {
3536 const AVCodec *codec;
3537 AVDictionary *thread_opt = NULL;
3538 st = ic->streams[i];
3539 avctx = st->internal->avctx;
3541 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3542 st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3543 /* if (!st->time_base.num)
3545 if (!avctx->time_base.num)
3546 avctx->time_base = st->time_base;
3549 /* check if the caller has overridden the codec id */
3550 #if FF_API_LAVF_AVCTX
3551 FF_DISABLE_DEPRECATION_WARNINGS
3552 if (st->codec->codec_id != st->internal->orig_codec_id) {
3553 st->codecpar->codec_id = st->codec->codec_id;
3554 st->codecpar->codec_type = st->codec->codec_type;
3555 st->internal->orig_codec_id = st->codec->codec_id;
3557 FF_ENABLE_DEPRECATION_WARNINGS
3559 // only for the split stuff
3560 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->request_probe <= 0) {
3561 st->parser = av_parser_init(st->codecpar->codec_id);
3563 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3564 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3565 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3566 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3568 } else if (st->need_parsing) {
3569 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3570 "%s, packets or times may be invalid.\n",
3571 avcodec_get_name(st->codecpar->codec_id));
3575 if (st->codecpar->codec_id != st->internal->orig_codec_id)
3576 st->internal->orig_codec_id = st->codecpar->codec_id;
3578 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3580 goto find_stream_info_err;
3581 if (st->request_probe <= 0)
3582 st->internal->avctx_inited = 1;
3584 codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3586 /* Force thread count to 1 since the H.264 decoder will not extract
3587 * SPS and PPS to extradata during multi-threaded decoding. */
3588 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3590 if (ic->codec_whitelist)
3591 av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3593 /* Ensure that subtitle_header is properly set. */
3594 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE
3595 && codec && !avctx->codec) {
3596 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3597 av_log(ic, AV_LOG_WARNING,
3598 "Failed to open codec in %s\n",__FUNCTION__);
3601 // Try to just open decoders, in case this is enough to get parameters.
3602 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3603 if (codec && !avctx->codec)
3604 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3605 av_log(ic, AV_LOG_WARNING,
3606 "Failed to open codec in %s\n",__FUNCTION__);
3609 av_dict_free(&thread_opt);
3612 for (i = 0; i < ic->nb_streams; i++) {
3613 #if FF_API_R_FRAME_RATE
3614 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3616 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3617 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
3622 int analyzed_all_streams;
3623 if (ff_check_interrupt(&ic->interrupt_callback)) {
3625 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3629 /* check if one codec still needs to be handled */
3630 for (i = 0; i < ic->nb_streams; i++) {
3631 int fps_analyze_framecount = 20;
3634 st = ic->streams[i];
3635 if (!has_codec_parameters(st, NULL))
3637 /* If the timebase is coarse (like the usual millisecond precision
3638 * of mkv), we need to analyze more frames to reliably arrive at
3639 * the correct fps. */
3640 if (av_q2d(st->time_base) > 0.0005)
3641 fps_analyze_framecount *= 2;
3642 if (!tb_unreliable(st->internal->avctx))
3643 fps_analyze_framecount = 0;
3644 if (ic->fps_probe_size >= 0)
3645 fps_analyze_framecount = ic->fps_probe_size;
3646 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3647 fps_analyze_framecount = 0;
3648 /* variable fps and no guess at the real fps */
3649 count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
3650 st->info->codec_info_duration_fields/2 :
3651 st->info->duration_count;
3652 if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3653 st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3654 if (count < fps_analyze_framecount)
3657 // Look at the first 3 frames if there is evidence of frame delay
3658 // but the decoder delay is not set.
3659 if (st->info->frame_delay_evidence && count < 2 && st->internal->avctx->has_b_frames == 0)
3661 if (!st->internal->avctx->extradata &&
3662 (!st->internal->extract_extradata.inited ||
3663 st->internal->extract_extradata.bsf) &&
3664 extract_extradata_check(st))
3666 if (st->first_dts == AV_NOPTS_VALUE &&
3667 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3668 st->codec_info_nb_frames < ((st->disposition & AV_DISPOSITION_ATTACHED_PIC) ? 1 : ic->max_ts_probe) &&
3669 (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3670 st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))
3673 analyzed_all_streams = 0;
3674 if (!missing_streams || !*missing_streams)
3675 if (i == ic->nb_streams) {
3676 analyzed_all_streams = 1;
3677 /* NOTE: If the format has no header, then we need to read some
3678 * packets to get most of the streams, so we cannot stop here. */
3679 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3680 /* If we found the info for all the codecs, we can stop. */
3682 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3687 /* We did not get all the codec info, but we read too much data. */
3688 if (read_size >= probesize) {
3690 av_log(ic, AV_LOG_DEBUG,
3691 "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3692 for (i = 0; i < ic->nb_streams; i++)
3693 if (!ic->streams[i]->r_frame_rate.num &&
3694 ic->streams[i]->info->duration_count <= 1 &&
3695 ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
3696 strcmp(ic->iformat->name, "image2"))
3697 av_log(ic, AV_LOG_WARNING,
3698 "Stream #%d: not enough frames to estimate rate; "
3699 "consider increasing probesize\n", i);
3703 /* NOTE: A new stream can be added there if no header in file
3704 * (AVFMTCTX_NOHEADER). */
3705 ret = read_frame_internal(ic, &pkt1);
3706 if (ret == AVERROR(EAGAIN))
3717 if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
3718 ret = add_to_pktbuf(&ic->internal->packet_buffer, pkt,
3719 &ic->internal->packet_buffer_end, 0);
3721 goto find_stream_info_err;
3724 st = ic->streams[pkt->stream_index];
3725 if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3726 read_size += pkt->size;
3728 avctx = st->internal->avctx;
3729 if (!st->internal->avctx_inited) {
3730 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3732 goto find_stream_info_err;
3733 st->internal->avctx_inited = 1;
3736 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3737 /* check for non-increasing dts */
3738 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3739 st->info->fps_last_dts >= pkt->dts) {
3740 av_log(ic, AV_LOG_DEBUG,
3741 "Non-increasing DTS in stream %d: packet %d with DTS "
3742 "%"PRId64", packet %d with DTS %"PRId64"\n",
3743 st->index, st->info->fps_last_dts_idx,
3744 st->info->fps_last_dts, st->codec_info_nb_frames,
3746 st->info->fps_first_dts =
3747 st->info->fps_last_dts = AV_NOPTS_VALUE;
3749 /* Check for a discontinuity in dts. If the difference in dts
3750 * is more than 1000 times the average packet duration in the
3751 * sequence, we treat it as a discontinuity. */
3752 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3753 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3754 (pkt->dts - st->info->fps_last_dts) / 1000 >
3755 (st->info->fps_last_dts - st->info->fps_first_dts) /
3756 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3757 av_log(ic, AV_LOG_WARNING,
3758 "DTS discontinuity in stream %d: packet %d with DTS "
3759 "%"PRId64", packet %d with DTS %"PRId64"\n",
3760 st->index, st->info->fps_last_dts_idx,
3761 st->info->fps_last_dts, st->codec_info_nb_frames,
3763 st->info->fps_first_dts =
3764 st->info->fps_last_dts = AV_NOPTS_VALUE;
3767 /* update stored dts values */
3768 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3769 st->info->fps_first_dts = pkt->dts;
3770 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3772 st->info->fps_last_dts = pkt->dts;
3773 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3775 if (st->codec_info_nb_frames>1) {
3779 if (st->time_base.den > 0)
3780 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3781 if (st->avg_frame_rate.num > 0)
3782 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3785 && st->codec_info_nb_frames>30
3786 && st->info->fps_first_dts != AV_NOPTS_VALUE
3787 && st->info->fps_last_dts != AV_NOPTS_VALUE)
3788 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3790 if (analyzed_all_streams) limit = max_analyze_duration;
3791 else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) limit = max_subtitle_analyze_duration;
3792 else limit = max_stream_analyze_duration;
3795 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds st:%d\n",
3797 t, pkt->stream_index);
3798 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3799 av_packet_unref(pkt);
3802 if (pkt->duration) {
3803 if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE && pkt->pts != AV_NOPTS_VALUE && pkt->pts >= st->start_time) {
3804 st->info->codec_info_duration = FFMIN(pkt->pts - st->start_time, st->info->codec_info_duration + pkt->duration);
3806 st->info->codec_info_duration += pkt->duration;
3807 st->info->codec_info_duration_fields += st->parser && st->need_parsing && avctx->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3810 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3811 #if FF_API_R_FRAME_RATE
3812 ff_rfps_add_frame(ic, st, pkt->dts);
3814 if (pkt->dts != pkt->pts && pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE)
3815 st->info->frame_delay_evidence = 1;
3817 if (!st->internal->avctx->extradata) {
3818 ret = extract_extradata(st, pkt);
3820 goto find_stream_info_err;
3823 /* If still no information, we try to open the codec and to
3824 * decompress the frame. We try to avoid that in most cases as
3825 * it takes longer and uses more memory. For MPEG-4, we need to
3826 * decompress for QuickTime.
3828 * If AV_CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3829 * least one frame of codec data, this makes sure the codec initializes
3830 * the channel configuration and does not only trust the values from
3832 try_decode_frame(ic, st, pkt,
3833 (options && i < orig_nb_streams) ? &options[i] : NULL);
3835 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3836 av_packet_unref(pkt);
3838 st->codec_info_nb_frames++;
3844 for (stream_index = 0; stream_index < ic->nb_streams; stream_index++) {
3845 st = ic->streams[stream_index];
3846 avctx = st->internal->avctx;
3847 if (!has_codec_parameters(st, NULL)) {
3848 const AVCodec *codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3849 if (codec && !avctx->codec) {
3850 AVDictionary *opts = NULL;
3851 if (ic->codec_whitelist)
3852 av_dict_set(&opts, "codec_whitelist", ic->codec_whitelist, 0);
3853 if (avcodec_open2(avctx, codec, (options && stream_index < orig_nb_streams) ? &options[stream_index] : &opts) < 0)
3854 av_log(ic, AV_LOG_WARNING,
3855 "Failed to open codec in %s\n",__FUNCTION__);
3856 av_dict_free(&opts);
3860 // EOF already reached while reading the stream above.
3861 // So continue with reoordering DTS with whatever delay we have.
3862 if (ic->internal->packet_buffer && !has_decode_delay_been_guessed(st)) {
3863 update_dts_from_pts(ic, stream_index, ic->internal->packet_buffer);
3869 AVPacket empty_pkt = { 0 };
3871 av_init_packet(&empty_pkt);
3873 for (i = 0; i < ic->nb_streams; i++) {
3875 st = ic->streams[i];
3877 /* flush the decoders */
3878 if (st->info->found_decoder == 1) {
3880 err = try_decode_frame(ic, st, &empty_pkt,
3881 (options && i < orig_nb_streams)
3882 ? &options[i] : NULL);
3883 } while (err > 0 && !has_codec_parameters(st, NULL));
3886 av_log(ic, AV_LOG_INFO,
3887 "decoding for stream %d failed\n", st->index);
3893 ff_rfps_calculate(ic);
3895 for (i = 0; i < ic->nb_streams; i++) {
3896 st = ic->streams[i];
3897 avctx = st->internal->avctx;
3898 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
3899 if (avctx->codec_id == AV_CODEC_ID_RAWVIDEO && !avctx->codec_tag && !avctx->bits_per_coded_sample) {
3900 uint32_t tag= avcodec_pix_fmt_to_codec_tag(avctx->pix_fmt);
3901 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == avctx->pix_fmt)
3902 avctx->codec_tag= tag;
3905 /* estimate average framerate if not set by demuxer */
3906 if (st->info->codec_info_duration_fields &&
3907 !st->avg_frame_rate.num &&
3908 st->info->codec_info_duration) {
3910 double best_error = 0.01;
3911 AVRational codec_frame_rate = avctx->framerate;
3913 if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
3914 st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
3915 st->info->codec_info_duration < 0)
3917 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3918 st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
3919 st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
3921 /* Round guessed framerate to a "standard" framerate if it's
3922 * within 1% of the original estimate. */
3923 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
3924 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
3925 double error = fabs(av_q2d(st->avg_frame_rate) /
3926 av_q2d(std_fps) - 1);
3928 if (error < best_error) {
3930 best_fps = std_fps.num;
3933 if (ic->internal->prefer_codec_framerate && codec_frame_rate.num > 0 && codec_frame_rate.den > 0) {
3934 error = fabs(av_q2d(codec_frame_rate) /
3935 av_q2d(std_fps) - 1);
3936 if (error < best_error) {
3938 best_fps = std_fps.num;
3943 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3944 best_fps, 12 * 1001, INT_MAX);
3947 if (!st->r_frame_rate.num) {
3948 if ( avctx->time_base.den * (int64_t) st->time_base.num
3949 <= avctx->time_base.num * avctx->ticks_per_frame * (int64_t) st->time_base.den) {
3950 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den,
3951 avctx->time_base.den, (int64_t)avctx->time_base.num * avctx->ticks_per_frame, INT_MAX);
3953 st->r_frame_rate.num = st->time_base.den;
3954 st->r_frame_rate.den = st->time_base.num;
3957 if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
3958 AVRational hw_ratio = { avctx->height, avctx->width };
3959 st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
3962 } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
3963 if (!avctx->bits_per_coded_sample)
3964 avctx->bits_per_coded_sample =
3965 av_get_bits_per_sample(avctx->codec_id);
3966 // set stream disposition based on audio service type
3967 switch (avctx->audio_service_type) {
3968 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
3969 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
3971 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
3972 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
3974 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
3975 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
3977 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
3978 st->disposition = AV_DISPOSITION_COMMENT;
3980 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
3981 st->disposition = AV_DISPOSITION_KARAOKE;
3988 estimate_timings(ic, old_offset);
3990 av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
3992 if (ret >= 0 && ic->nb_streams)
3993 /* We could not have all the codec parameters before EOF. */
3995 for (i = 0; i < ic->nb_streams; i++) {
3997 st = ic->streams[i];
3999 /* if no packet was ever seen, update context now for has_codec_parameters */
4000 if (!st->internal->avctx_inited) {
4001 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
4002 st->codecpar->format == AV_SAMPLE_FMT_NONE)
4003 st->codecpar->format = st->internal->avctx->sample_fmt;
4004 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
4006 goto find_stream_info_err;
4008 if (!has_codec_parameters(st, &errmsg)) {
4010 avcodec_string(buf, sizeof(buf), st->internal->avctx, 0);
4011 av_log(ic, AV_LOG_WARNING,
4012 "Could not find codec parameters for stream %d (%s): %s\n"
4013 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
4020 compute_chapters_end(ic);
4022 /* update the stream parameters from the internal codec contexts */
4023 for (i = 0; i < ic->nb_streams; i++) {
4024 st = ic->streams[i];
4026 if (st->internal->avctx_inited) {
4027 int orig_w = st->codecpar->width;
4028 int orig_h = st->codecpar->height;
4029 ret = avcodec_parameters_from_context(st->codecpar, st->internal->avctx);
4031 goto find_stream_info_err;
4033 // The decoder might reduce the video size by the lowres factor.
4034 if (st->internal->avctx->lowres && orig_w) {
4035 st->codecpar->width = orig_w;
4036 st->codecpar->height = orig_h;
4041 #if FF_API_LAVF_AVCTX
4042 FF_DISABLE_DEPRECATION_WARNINGS
4043 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
4045 goto find_stream_info_err;
4048 // The old API (AVStream.codec) "requires" the resolution to be adjusted
4049 // by the lowres factor.
4050 if (st->internal->avctx->lowres && st->internal->avctx->width) {
4051 st->codec->lowres = st->internal->avctx->lowres;
4052 st->codec->width = st->internal->avctx->width;
4053 st->codec->height = st->internal->avctx->height;
4057 if (st->codec->codec_tag != MKTAG('t','m','c','d')) {
4058 st->codec->time_base = st->internal->avctx->time_base;
4059 st->codec->ticks_per_frame = st->internal->avctx->ticks_per_frame;
4061 st->codec->framerate = st->avg_frame_rate;
4063 if (st->internal->avctx->subtitle_header) {
4064 st->codec->subtitle_header = av_malloc(st->internal->avctx->subtitle_header_size);
4065 if (!st->codec->subtitle_header)
4066 goto find_stream_info_err;
4067 st->codec->subtitle_header_size = st->internal->avctx->subtitle_header_size;
4068 memcpy(st->codec->subtitle_header, st->internal->avctx->subtitle_header,
4069 st->codec->subtitle_header_size);
4072 // Fields unavailable in AVCodecParameters
4073 st->codec->coded_width = st->internal->avctx->coded_width;
4074 st->codec->coded_height = st->internal->avctx->coded_height;
4075 st->codec->properties = st->internal->avctx->properties;
4076 FF_ENABLE_DEPRECATION_WARNINGS
4079 st->internal->avctx_inited = 0;
4082 find_stream_info_err:
4083 for (i = 0; i < ic->nb_streams; i++) {
4084 st = ic->streams[i];
4086 av_freep(&st->info->duration_error);
4087 avcodec_close(ic->streams[i]->internal->avctx);
4088 av_freep(&ic->streams[i]->info);
4089 av_bsf_free(&ic->streams[i]->internal->extract_extradata.bsf);
4090 av_packet_free(&ic->streams[i]->internal->extract_extradata.pkt);
4093 av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
4094 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
4098 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
4102 for (i = 0; i < ic->nb_programs; i++) {
4103 if (ic->programs[i] == last) {
4107 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
4108 if (ic->programs[i]->stream_index[j] == s)
4109 return ic->programs[i];
4115 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
4116 int wanted_stream_nb, int related_stream,
4117 AVCodec **decoder_ret, int flags)
4119 int i, nb_streams = ic->nb_streams;
4120 int ret = AVERROR_STREAM_NOT_FOUND;
4121 int best_count = -1, best_multiframe = -1, best_disposition = -1;
4122 int count, multiframe, disposition;
4123 int64_t best_bitrate = -1;
4125 unsigned *program = NULL;
4126 const AVCodec *decoder = NULL, *best_decoder = NULL;
4128 if (related_stream >= 0 && wanted_stream_nb < 0) {
4129 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
4131 program = p->stream_index;
4132 nb_streams = p->nb_stream_indexes;
4135 for (i = 0; i < nb_streams; i++) {
4136 int real_stream_index = program ? program[i] : i;
4137 AVStream *st = ic->streams[real_stream_index];
4138 AVCodecParameters *par = st->codecpar;
4139 if (par->codec_type != type)
4141 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
4143 if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate))
4146 decoder = find_decoder(ic, st, par->codec_id);
4149 ret = AVERROR_DECODER_NOT_FOUND;
4153 disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED));
4154 count = st->codec_info_nb_frames;
4155 bitrate = par->bit_rate;
4156 multiframe = FFMIN(5, count);
4157 if ((best_disposition > disposition) ||
4158 (best_disposition == disposition && best_multiframe > multiframe) ||
4159 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate > bitrate) ||
4160 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
4162 best_disposition = disposition;
4164 best_bitrate = bitrate;
4165 best_multiframe = multiframe;
4166 ret = real_stream_index;
4167 best_decoder = decoder;
4168 if (program && i == nb_streams - 1 && ret < 0) {
4170 nb_streams = ic->nb_streams;
4171 /* no related stream found, try again with everything */
4176 *decoder_ret = (AVCodec*)best_decoder;
4180 /*******************************************************/
4182 int av_read_play(AVFormatContext *s)
4184 if (s->iformat->read_play)
4185 return s->iformat->read_play(s);
4187 return avio_pause(s->pb, 0);
4188 return AVERROR(ENOSYS);
4191 int av_read_pause(AVFormatContext *s)
4193 if (s->iformat->read_pause)
4194 return s->iformat->read_pause(s);
4196 return avio_pause(s->pb, 1);
4197 return AVERROR(ENOSYS);
4200 int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src)
4205 dst->time_base = src->time_base;
4206 dst->nb_frames = src->nb_frames;
4207 dst->disposition = src->disposition;
4208 dst->sample_aspect_ratio = src->sample_aspect_ratio;
4209 dst->avg_frame_rate = src->avg_frame_rate;
4210 dst->r_frame_rate = src->r_frame_rate;
4212 av_dict_free(&dst->metadata);
4213 ret = av_dict_copy(&dst->metadata, src->metadata, 0);
4217 ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
4221 /* Free existing side data*/
4222 for (i = 0; i < dst->nb_side_data; i++)
4223 av_free(dst->side_data[i].data);
4224 av_freep(&dst->side_data);
4225 dst->nb_side_data = 0;
4227 /* Copy side data if present */
4228 if (src->nb_side_data) {
4229 dst->side_data = av_mallocz_array(src->nb_side_data,
4230 sizeof(AVPacketSideData));
4231 if (!dst->side_data)
4232 return AVERROR(ENOMEM);
4233 dst->nb_side_data = src->nb_side_data;
4235 for (i = 0; i < src->nb_side_data; i++) {
4236 uint8_t *data = av_memdup(src->side_data[i].data,
4237 src->side_data[i].size);
4239 return AVERROR(ENOMEM);
4240 dst->side_data[i].type = src->side_data[i].type;
4241 dst->side_data[i].size = src->side_data[i].size;
4242 dst->side_data[i].data = data;
4246 av_freep(&dst->recommended_encoder_configuration);
4247 if (src->recommended_encoder_configuration) {
4248 const char *conf_str = src->recommended_encoder_configuration;
4249 dst->recommended_encoder_configuration = av_strdup(conf_str);
4250 if (!dst->recommended_encoder_configuration)
4251 return AVERROR(ENOMEM);
4257 static void free_stream(AVStream **pst)
4259 AVStream *st = *pst;
4265 for (i = 0; i < st->nb_side_data; i++)
4266 av_freep(&st->side_data[i].data);
4267 av_freep(&st->side_data);
4270 av_parser_close(st->parser);
4272 if (st->attached_pic.data)
4273 av_packet_unref(&st->attached_pic);
4276 avcodec_free_context(&st->internal->avctx);
4277 for (i = 0; i < st->internal->nb_bsfcs; i++) {
4278 av_bsf_free(&st->internal->bsfcs[i]);
4279 av_freep(&st->internal->bsfcs);
4281 av_freep(&st->internal->priv_pts);
4282 av_bsf_free(&st->internal->extract_extradata.bsf);
4283 av_packet_free(&st->internal->extract_extradata.pkt);
4285 av_freep(&st->internal);
4287 av_dict_free(&st->metadata);
4288 avcodec_parameters_free(&st->codecpar);
4289 av_freep(&st->probe_data.buf);
4290 av_freep(&st->index_entries);
4291 #if FF_API_LAVF_AVCTX
4292 FF_DISABLE_DEPRECATION_WARNINGS
4293 avcodec_free_context(&st->codec);
4294 FF_ENABLE_DEPRECATION_WARNINGS
4296 av_freep(&st->priv_data);
4298 av_freep(&st->info->duration_error);
4299 av_freep(&st->info);
4300 av_freep(&st->recommended_encoder_configuration);
4305 void ff_free_stream(AVFormatContext *s, AVStream *st)
4307 av_assert0(s->nb_streams>0);
4308 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
4310 free_stream(&s->streams[ --s->nb_streams ]);
4313 void avformat_free_context(AVFormatContext *s)
4321 if (s->iformat && s->iformat->priv_class && s->priv_data)
4322 av_opt_free(s->priv_data);
4323 if (s->oformat && s->oformat->priv_class && s->priv_data)
4324 av_opt_free(s->priv_data);
4326 for (i = s->nb_streams - 1; i >= 0; i--)
4327 ff_free_stream(s, s->streams[i]);
4330 for (i = s->nb_programs - 1; i >= 0; i--) {
4331 av_dict_free(&s->programs[i]->metadata);
4332 av_freep(&s->programs[i]->stream_index);
4333 av_freep(&s->programs[i]);
4335 av_freep(&s->programs);
4336 av_freep(&s->priv_data);
4337 while (s->nb_chapters--) {
4338 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
4339 av_freep(&s->chapters[s->nb_chapters]);
4341 av_freep(&s->chapters);
4342 av_dict_free(&s->metadata);
4343 av_dict_free(&s->internal->id3v2_meta);
4344 av_freep(&s->streams);
4345 flush_packet_queue(s);
4346 av_freep(&s->internal);
4350 void avformat_close_input(AVFormatContext **ps)
4361 if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
4362 (s->flags & AVFMT_FLAG_CUSTOM_IO))
4365 flush_packet_queue(s);
4368 if (s->iformat->read_close)
4369 s->iformat->read_close(s);
4371 avformat_free_context(s);
4378 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
4384 if (s->nb_streams >= FFMIN(s->max_streams, INT_MAX/sizeof(*streams))) {
4385 if (s->max_streams < INT_MAX/sizeof(*streams))
4386 av_log(s, AV_LOG_ERROR, "Number of streams exceeds max_streams parameter (%d), see the documentation if you wish to increase it\n", s->max_streams);
4389 streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
4392 s->streams = streams;
4394 st = av_mallocz(sizeof(AVStream));
4397 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
4401 st->info->last_dts = AV_NOPTS_VALUE;
4403 #if FF_API_LAVF_AVCTX
4404 FF_DISABLE_DEPRECATION_WARNINGS
4405 st->codec = avcodec_alloc_context3(c);
4411 FF_ENABLE_DEPRECATION_WARNINGS
4414 st->internal = av_mallocz(sizeof(*st->internal));
4418 st->codecpar = avcodec_parameters_alloc();
4422 st->internal->avctx = avcodec_alloc_context3(NULL);
4423 if (!st->internal->avctx)
4427 #if FF_API_LAVF_AVCTX
4428 FF_DISABLE_DEPRECATION_WARNINGS
4429 /* no default bitrate if decoding */
4430 st->codec->bit_rate = 0;
4431 FF_ENABLE_DEPRECATION_WARNINGS
4434 /* default pts setting is MPEG-like */
4435 avpriv_set_pts_info(st, 33, 1, 90000);
4436 /* we set the current DTS to 0 so that formats without any timestamps
4437 * but durations get some timestamps, formats with some unknown
4438 * timestamps have their first few packets buffered and the
4439 * timestamps corrected before they are returned to the user */
4440 st->cur_dts = RELATIVE_TS_BASE;
4442 st->cur_dts = AV_NOPTS_VALUE;
4445 st->index = s->nb_streams;
4446 st->start_time = AV_NOPTS_VALUE;
4447 st->duration = AV_NOPTS_VALUE;
4448 st->first_dts = AV_NOPTS_VALUE;
4449 st->probe_packets = MAX_PROBE_PACKETS;
4450 st->pts_wrap_reference = AV_NOPTS_VALUE;
4451 st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4453 st->last_IP_pts = AV_NOPTS_VALUE;
4454 st->last_dts_for_order_check = AV_NOPTS_VALUE;
4455 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
4456 st->pts_buffer[i] = AV_NOPTS_VALUE;
4458 st->sample_aspect_ratio = (AVRational) { 0, 1 };
4460 #if FF_API_R_FRAME_RATE
4461 st->info->last_dts = AV_NOPTS_VALUE;
4463 st->info->fps_first_dts = AV_NOPTS_VALUE;
4464 st->info->fps_last_dts = AV_NOPTS_VALUE;
4466 st->inject_global_side_data = s->internal->inject_global_side_data;
4468 st->internal->need_context_update = 1;
4470 s->streams[s->nb_streams++] = st;
4477 AVProgram *av_new_program(AVFormatContext *ac, int id)
4479 AVProgram *program = NULL;
4482 av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
4484 for (i = 0; i < ac->nb_programs; i++)
4485 if (ac->programs[i]->id == id)
4486 program = ac->programs[i];
4489 program = av_mallocz(sizeof(AVProgram));
4492 dynarray_add(&ac->programs, &ac->nb_programs, program);
4493 program->discard = AVDISCARD_NONE;
4496 program->pts_wrap_reference = AV_NOPTS_VALUE;
4497 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4499 program->start_time =
4500 program->end_time = AV_NOPTS_VALUE;
4505 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
4506 int64_t start, int64_t end, const char *title)
4508 AVChapter *chapter = NULL;
4511 if (end != AV_NOPTS_VALUE && start > end) {
4512 av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
4516 for (i = 0; i < s->nb_chapters; i++)
4517 if (s->chapters[i]->id == id)
4518 chapter = s->chapters[i];
4521 chapter = av_mallocz(sizeof(AVChapter));
4524 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
4526 av_dict_set(&chapter->metadata, "title", title, 0);
4528 chapter->time_base = time_base;
4529 chapter->start = start;
4535 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
4538 AVProgram *program = NULL;
4541 if (idx >= ac->nb_streams) {
4542 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
4546 for (i = 0; i < ac->nb_programs; i++) {
4547 if (ac->programs[i]->id != progid)
4549 program = ac->programs[i];
4550 for (j = 0; j < program->nb_stream_indexes; j++)
4551 if (program->stream_index[j] == idx)
4554 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
4557 program->stream_index = tmp;
4558 program->stream_index[program->nb_stream_indexes++] = idx;
4563 uint64_t ff_ntp_time(void)
4565 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
4568 int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags)
4571 char *q, buf1[20], c;
4572 int nd, len, percentd_found;
4584 while (av_isdigit(*p))
4585 nd = nd * 10 + *p++ - '0';
4587 } while (av_isdigit(c));
4593 if (!(flags & AV_FRAME_FILENAME_FLAGS_MULTIPLE) && percentd_found)
4598 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
4600 if ((q - buf + len) > buf_size - 1)
4602 memcpy(q, buf1, len);
4610 if ((q - buf) < buf_size - 1)
4614 if (!percentd_found)
4623 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
4625 return av_get_frame_filename2(buf, buf_size, path, number, 0);
4628 void av_url_split(char *proto, int proto_size,
4629 char *authorization, int authorization_size,
4630 char *hostname, int hostname_size,
4631 int *port_ptr, char *path, int path_size, const char *url)
4633 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
4639 if (authorization_size > 0)
4640 authorization[0] = 0;
4641 if (hostname_size > 0)
4646 /* parse protocol */
4647 if ((p = strchr(url, ':'))) {
4648 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4655 /* no protocol means plain filename */
4656 av_strlcpy(path, url, path_size);
4660 /* separate path from hostname */
4661 ls = strchr(p, '/');
4662 ls2 = strchr(p, '?');
4666 ls = FFMIN(ls, ls2);
4668 av_strlcpy(path, ls, path_size);
4670 ls = &p[strlen(p)]; // XXX
4672 /* the rest is hostname, use that to parse auth/port */
4674 /* authorization (user[:pass]@hostname) */
4676 while ((at = strchr(p, '@')) && at < ls) {
4677 av_strlcpy(authorization, at2,
4678 FFMIN(authorization_size, at + 1 - at2));
4679 p = at + 1; /* skip '@' */
4682 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4684 av_strlcpy(hostname, p + 1,
4685 FFMIN(hostname_size, brk - p));
4686 if (brk[1] == ':' && port_ptr)
4687 *port_ptr = atoi(brk + 2);
4688 } else if ((col = strchr(p, ':')) && col < ls) {
4689 av_strlcpy(hostname, p,
4690 FFMIN(col + 1 - p, hostname_size));
4692 *port_ptr = atoi(col + 1);
4694 av_strlcpy(hostname, p,
4695 FFMIN(ls + 1 - p, hostname_size));
4699 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4702 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4705 'C', 'D', 'E', 'F' };
4706 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4709 'c', 'd', 'e', 'f' };
4710 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4712 for (i = 0; i < s; i++) {
4713 buff[i * 2] = hex_table[src[i] >> 4];
4714 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4720 int ff_hex_to_data(uint8_t *data, const char *p)
4727 p += strspn(p, SPACE_CHARS);
4730 c = av_toupper((unsigned char) *p++);
4731 if (c >= '0' && c <= '9')
4733 else if (c >= 'A' && c <= 'F')
4748 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4749 unsigned int pts_num, unsigned int pts_den)
4752 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
4753 if (new_tb.num != pts_num)
4754 av_log(NULL, AV_LOG_DEBUG,
4755 "st:%d removing common factor %d from timebase\n",
4756 s->index, pts_num / new_tb.num);
4758 av_log(NULL, AV_LOG_WARNING,
4759 "st:%d has too large timebase, reducing\n", s->index);
4761 if (new_tb.num <= 0 || new_tb.den <= 0) {
4762 av_log(NULL, AV_LOG_ERROR,
4763 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4764 new_tb.num, new_tb.den,
4768 s->time_base = new_tb;
4769 #if FF_API_LAVF_AVCTX
4770 FF_DISABLE_DEPRECATION_WARNINGS
4771 s->codec->pkt_timebase = new_tb;
4772 FF_ENABLE_DEPRECATION_WARNINGS
4774 s->internal->avctx->pkt_timebase = new_tb;
4775 s->pts_wrap_bits = pts_wrap_bits;
4778 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4781 const char *ptr = str;
4783 /* Parse key=value pairs. */
4786 char *dest = NULL, *dest_end;
4787 int key_len, dest_len = 0;
4789 /* Skip whitespace and potential commas. */
4790 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4797 if (!(ptr = strchr(key, '=')))
4800 key_len = ptr - key;
4802 callback_get_buf(context, key, key_len, &dest, &dest_len);
4803 dest_end = dest + dest_len - 1;
4807 while (*ptr && *ptr != '\"') {
4811 if (dest && dest < dest_end)
4815 if (dest && dest < dest_end)
4823 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
4824 if (dest && dest < dest_end)
4832 int ff_find_stream_index(AVFormatContext *s, int id)
4835 for (i = 0; i < s->nb_streams; i++)
4836 if (s->streams[i]->id == id)
4841 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
4845 unsigned int codec_tag;
4846 if (ofmt->query_codec)
4847 return ofmt->query_codec(codec_id, std_compliance);
4848 else if (ofmt->codec_tag)
4849 return !!av_codec_get_tag2(ofmt->codec_tag, codec_id, &codec_tag);
4850 else if (codec_id == ofmt->video_codec ||
4851 codec_id == ofmt->audio_codec ||
4852 codec_id == ofmt->subtitle_codec ||
4853 codec_id == ofmt->data_codec)
4856 return AVERROR_PATCHWELCOME;
4859 int avformat_network_init(void)
4863 ff_network_inited_globally = 1;
4864 if ((ret = ff_network_init()) < 0)
4866 if ((ret = ff_tls_init()) < 0)
4872 int avformat_network_deinit(void)
4877 ff_network_inited_globally = 0;
4882 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4883 uint64_t channel_layout, int32_t sample_rate,
4884 int32_t width, int32_t height)
4890 return AVERROR(EINVAL);
4893 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4895 if (channel_layout) {
4897 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4901 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4903 if (width || height) {
4905 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4907 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4909 return AVERROR(ENOMEM);
4910 bytestream_put_le32(&data, flags);
4912 bytestream_put_le32(&data, channels);
4914 bytestream_put_le64(&data, channel_layout);
4916 bytestream_put_le32(&data, sample_rate);
4917 if (width || height) {
4918 bytestream_put_le32(&data, width);
4919 bytestream_put_le32(&data, height);
4924 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
4926 AVRational undef = {0, 1};
4927 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
4928 AVRational codec_sample_aspect_ratio = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
4929 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
4931 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
4932 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
4933 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
4934 stream_sample_aspect_ratio = undef;
4936 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
4937 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
4938 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
4939 frame_sample_aspect_ratio = undef;
4941 if (stream_sample_aspect_ratio.num)
4942 return stream_sample_aspect_ratio;
4944 return frame_sample_aspect_ratio;
4947 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
4949 AVRational fr = st->r_frame_rate;
4950 AVRational codec_fr = st->internal->avctx->framerate;
4951 AVRational avg_fr = st->avg_frame_rate;
4953 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
4954 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
4959 if (st->internal->avctx->ticks_per_frame > 1) {
4960 if ( codec_fr.num > 0 && codec_fr.den > 0 &&
4961 (fr.num == 0 || av_q2d(codec_fr) < av_q2d(fr)*0.7 && fabs(1.0 - av_q2d(av_div_q(avg_fr, fr))) > 0.1))
4968 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
4971 if (*spec <= '9' && *spec >= '0') /* opt:index */
4972 return strtol(spec, NULL, 0) == st->index;
4973 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
4974 *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
4975 enum AVMediaType type;
4979 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
4980 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
4981 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
4982 case 'd': type = AVMEDIA_TYPE_DATA; break;
4983 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
4984 case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
4985 default: av_assert0(0);
4987 #if FF_API_LAVF_AVCTX
4988 FF_DISABLE_DEPRECATION_WARNINGS
4989 if (type != st->codecpar->codec_type
4990 && (st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN || st->codec->codec_type != type))
4992 FF_ENABLE_DEPRECATION_WARNINGS
4994 if (type != st->codecpar->codec_type)
4997 if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
4999 if (*spec++ == ':') { /* possibly followed by :index */
5000 int i, index = strtol(spec, NULL, 0);
5001 for (i = 0; i < s->nb_streams; i++) {
5002 #if FF_API_LAVF_AVCTX
5003 FF_DISABLE_DEPRECATION_WARNINGS
5004 if ((s->streams[i]->codecpar->codec_type == type
5005 || s->streams[i]->codec->codec_type == type
5007 !(nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) &&
5009 return i == st->index;
5010 FF_ENABLE_DEPRECATION_WARNINGS
5012 if ((s->streams[i]->codecpar->codec_type == type) &&
5013 !(nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) &&
5015 return i == st->index;
5021 } else if (*spec == 'p' && *(spec + 1) == ':') {
5025 prog_id = strtol(spec, &endptr, 0);
5026 for (i = 0; i < s->nb_programs; i++) {
5027 if (s->programs[i]->id != prog_id)
5030 if (*endptr++ == ':') {
5031 int stream_idx = strtol(endptr, NULL, 0);
5032 return stream_idx >= 0 &&
5033 stream_idx < s->programs[i]->nb_stream_indexes &&
5034 st->index == s->programs[i]->stream_index[stream_idx];
5037 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
5038 if (st->index == s->programs[i]->stream_index[j])
5042 } else if (*spec == '#' ||
5043 (*spec == 'i' && *(spec + 1) == ':')) {
5046 spec += 1 + (*spec == 'i');
5047 stream_id = strtol(spec, &endptr, 0);
5049 return stream_id == st->id;
5050 } else if (*spec == 'm' && *(spec + 1) == ':') {
5051 AVDictionaryEntry *tag;
5056 val = strchr(spec, ':');
5058 key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
5060 return AVERROR(ENOMEM);
5062 tag = av_dict_get(st->metadata, key, NULL, 0);
5064 if (!val || !strcmp(tag->value, val + 1))
5073 } else if (*spec == 'u') {
5074 AVCodecParameters *par = st->codecpar;
5075 #if FF_API_LAVF_AVCTX
5076 FF_DISABLE_DEPRECATION_WARNINGS
5077 AVCodecContext *codec = st->codec;
5078 FF_ENABLE_DEPRECATION_WARNINGS
5081 switch (par->codec_type) {
5082 case AVMEDIA_TYPE_AUDIO:
5083 val = par->sample_rate && par->channels;
5084 #if FF_API_LAVF_AVCTX
5085 val = val || (codec->sample_rate && codec->channels);
5087 if (par->format == AV_SAMPLE_FMT_NONE
5088 #if FF_API_LAVF_AVCTX
5089 && codec->sample_fmt == AV_SAMPLE_FMT_NONE
5094 case AVMEDIA_TYPE_VIDEO:
5095 val = par->width && par->height;
5096 #if FF_API_LAVF_AVCTX
5097 val = val || (codec->width && codec->height);
5099 if (par->format == AV_PIX_FMT_NONE
5100 #if FF_API_LAVF_AVCTX
5101 && codec->pix_fmt == AV_PIX_FMT_NONE
5106 case AVMEDIA_TYPE_UNKNOWN:
5113 #if FF_API_LAVF_AVCTX
5114 return (par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0;
5116 return par->codec_id != AV_CODEC_ID_NONE && val != 0;
5118 } else if (!*spec) /* empty specifier, matches everything */
5121 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
5122 return AVERROR(EINVAL);
5125 int ff_generate_avci_extradata(AVStream *st)
5127 static const uint8_t avci100_1080p_extradata[] = {
5129 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5130 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5131 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5132 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
5133 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
5134 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
5135 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
5136 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
5137 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5139 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5142 static const uint8_t avci100_1080i_extradata[] = {
5144 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5145 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5146 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5147 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
5148 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
5149 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
5150 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
5151 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
5152 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
5153 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
5154 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
5156 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5159 static const uint8_t avci50_1080p_extradata[] = {
5161 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5162 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5163 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5164 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5165 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5166 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
5167 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
5168 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
5169 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
5171 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5174 static const uint8_t avci50_1080i_extradata[] = {
5176 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5177 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5178 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5179 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
5180 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
5181 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
5182 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
5183 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
5184 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
5185 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
5186 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
5188 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5191 static const uint8_t avci100_720p_extradata[] = {
5193 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5194 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
5195 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
5196 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
5197 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
5198 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
5199 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
5200 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
5201 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
5202 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
5204 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
5207 static const uint8_t avci50_720p_extradata[] = {
5209 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
5210 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5211 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5212 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5213 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5214 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
5215 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
5216 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
5217 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
5219 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5223 const uint8_t *data = NULL;
5226 if (st->codecpar->width == 1920) {
5227 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5228 data = avci100_1080p_extradata;
5229 size = sizeof(avci100_1080p_extradata);
5231 data = avci100_1080i_extradata;
5232 size = sizeof(avci100_1080i_extradata);
5234 } else if (st->codecpar->width == 1440) {
5235 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5236 data = avci50_1080p_extradata;
5237 size = sizeof(avci50_1080p_extradata);
5239 data = avci50_1080i_extradata;
5240 size = sizeof(avci50_1080i_extradata);
5242 } else if (st->codecpar->width == 1280) {
5243 data = avci100_720p_extradata;
5244 size = sizeof(avci100_720p_extradata);
5245 } else if (st->codecpar->width == 960) {
5246 data = avci50_720p_extradata;
5247 size = sizeof(avci50_720p_extradata);
5253 av_freep(&st->codecpar->extradata);
5254 if (ff_alloc_extradata(st->codecpar, size))
5255 return AVERROR(ENOMEM);
5256 memcpy(st->codecpar->extradata, data, size);
5261 uint8_t *av_stream_get_side_data(const AVStream *st,
5262 enum AVPacketSideDataType type, int *size)
5266 for (i = 0; i < st->nb_side_data; i++) {
5267 if (st->side_data[i].type == type) {
5269 *size = st->side_data[i].size;
5270 return st->side_data[i].data;
5276 int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
5277 uint8_t *data, size_t size)
5279 AVPacketSideData *sd, *tmp;
5282 for (i = 0; i < st->nb_side_data; i++) {
5283 sd = &st->side_data[i];
5285 if (sd->type == type) {
5286 av_freep(&sd->data);
5293 if ((unsigned)st->nb_side_data + 1 >= INT_MAX / sizeof(*st->side_data))
5294 return AVERROR(ERANGE);
5296 tmp = av_realloc(st->side_data, (st->nb_side_data + 1) * sizeof(*tmp));
5298 return AVERROR(ENOMEM);
5301 st->side_data = tmp;
5304 sd = &st->side_data[st->nb_side_data - 1];
5312 uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
5316 uint8_t *data = av_malloc(size);
5321 ret = av_stream_add_side_data(st, type, data, size);
5330 int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
5333 const AVBitStreamFilter *bsf;
5335 AVCodecParameters *in_par;
5337 if (!(bsf = av_bsf_get_by_name(name))) {
5338 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter '%s'\n", name);
5339 return AVERROR_BSF_NOT_FOUND;
5342 if ((ret = av_bsf_alloc(bsf, &bsfc)) < 0)
5345 if (st->internal->nb_bsfcs) {
5346 in_par = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->par_out;
5347 bsfc->time_base_in = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->time_base_out;
5349 in_par = st->codecpar;
5350 bsfc->time_base_in = st->time_base;
5353 if ((ret = avcodec_parameters_copy(bsfc->par_in, in_par)) < 0) {
5358 if (args && bsfc->filter->priv_class) {
5359 const AVOption *opt = av_opt_next(bsfc->priv_data, NULL);
5360 const char * shorthand[2] = {NULL};
5363 shorthand[0] = opt->name;
5365 if ((ret = av_opt_set_from_string(bsfc->priv_data, args, shorthand, "=", ":")) < 0) {
5371 if ((ret = av_bsf_init(bsfc)) < 0) {
5376 if ((ret = av_dynarray_add_nofree(&st->internal->bsfcs, &st->internal->nb_bsfcs, bsfc))) {
5381 av_log(NULL, AV_LOG_VERBOSE,
5382 "Automatically inserted bitstream filter '%s'; args='%s'\n",
5383 name, args ? args : "");
5388 FF_DISABLE_DEPRECATION_WARNINGS
5389 int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt,
5390 AVBitStreamFilterContext *bsfc)
5394 AVPacket new_pkt = *pkt;
5395 int a = av_bitstream_filter_filter(bsfc, codec, NULL,
5396 &new_pkt.data, &new_pkt.size,
5397 pkt->data, pkt->size,
5398 pkt->flags & AV_PKT_FLAG_KEY);
5399 if (a == 0 && new_pkt.size == 0 && new_pkt.side_data_elems == 0) {
5400 av_packet_unref(pkt);
5401 memset(pkt, 0, sizeof(*pkt));
5404 if(a == 0 && new_pkt.data != pkt->data) {
5405 uint8_t *t = av_malloc(new_pkt.size + AV_INPUT_BUFFER_PADDING_SIZE); //the new should be a subset of the old so cannot overflow
5407 memcpy(t, new_pkt.data, new_pkt.size);
5408 memset(t + new_pkt.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
5413 a = AVERROR(ENOMEM);
5417 new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
5418 av_buffer_default_free, NULL, 0);
5420 pkt->side_data = NULL;
5421 pkt->side_data_elems = 0;
5422 av_packet_unref(pkt);
5424 av_freep(&new_pkt.data);
5425 a = AVERROR(ENOMEM);
5429 av_log(codec, AV_LOG_ERROR,
5430 "Failed to open bitstream filter %s for stream %d with codec %s",
5431 bsfc->filter->name, pkt->stream_index,
5432 codec->codec ? codec->codec->name : "copy");
5442 FF_ENABLE_DEPRECATION_WARNINGS
5445 int ff_format_output_open(AVFormatContext *s, const char *url, AVDictionary **options)
5448 return AVERROR(EINVAL);
5450 if (!(s->oformat->flags & AVFMT_NOFILE))
5451 return s->io_open(s, &s->pb, url, AVIO_FLAG_WRITE, options);
5455 void ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
5458 s->io_close(s, *pb);
5462 int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
5464 AVDictionaryEntry *entry;
5465 int64_t parsed_timestamp;
5467 if ((entry = av_dict_get(s->metadata, "creation_time", NULL, 0))) {
5468 if ((ret = av_parse_time(&parsed_timestamp, entry->value, 0)) >= 0) {
5469 *timestamp = return_seconds ? parsed_timestamp / 1000000 : parsed_timestamp;
5472 av_log(s, AV_LOG_WARNING, "Failed to parse creation_time %s\n", entry->value);
5479 int ff_standardize_creation_time(AVFormatContext *s)
5482 int ret = ff_parse_creation_time_metadata(s, ×tamp, 0);
5484 return avpriv_dict_set_timestamp(&s->metadata, "creation_time", timestamp);
5488 int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette)
5493 side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &size);
5495 if (size != AVPALETTE_SIZE) {
5496 av_log(s, AV_LOG_ERROR, "Invalid palette side data\n");
5497 return AVERROR_INVALIDDATA;
5499 memcpy(palette, side_data, AVPALETTE_SIZE);
5503 if (ret == CONTAINS_PAL) {
5505 for (i = 0; i < AVPALETTE_COUNT; i++)
5506 palette[i] = AV_RL32(pkt->data + pkt->size - AVPALETTE_SIZE + i*4);
5513 int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf)
5518 ret = av_bprint_finalize(buf, &str);
5521 if (!av_bprint_is_complete(buf)) {
5523 return AVERROR(ENOMEM);
5526 par->extradata = str;
5527 /* Note: the string is NUL terminated (so extradata can be read as a
5528 * string), but the ending character is not accounted in the size (in
5529 * binary formats you are likely not supposed to mux that character). When
5530 * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE
5532 par->extradata_size = buf->len;
5536 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
5537 AVStream *ost, const AVStream *ist,
5538 enum AVTimebaseSource copy_tb)
5540 //TODO: use [io]st->internal->avctx
5541 const AVCodecContext *dec_ctx = ist->codec;
5542 AVCodecContext *enc_ctx = ost->codec;
5544 enc_ctx->time_base = ist->time_base;
5546 * Avi is a special case here because it supports variable fps but
5547 * having the fps and timebase differe significantly adds quite some
5550 if (!strcmp(ofmt->name, "avi")) {
5551 #if FF_API_R_FRAME_RATE
5552 if (copy_tb == AVFMT_TBCF_AUTO && ist->r_frame_rate.num
5553 && av_q2d(ist->r_frame_rate) >= av_q2d(ist->avg_frame_rate)
5554 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(ist->time_base)
5555 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx->time_base)
5556 && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx->time_base) < 1.0/500
5557 || copy_tb == AVFMT_TBCF_R_FRAMERATE) {
5558 enc_ctx->time_base.num = ist->r_frame_rate.den;
5559 enc_ctx->time_base.den = 2*ist->r_frame_rate.num;
5560 enc_ctx->ticks_per_frame = 2;
5563 if (copy_tb == AVFMT_TBCF_AUTO && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > 2*av_q2d(ist->time_base)
5564 && av_q2d(ist->time_base) < 1.0/500
5565 || copy_tb == AVFMT_TBCF_DECODER) {
5566 enc_ctx->time_base = dec_ctx->time_base;
5567 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5568 enc_ctx->time_base.den *= 2;
5569 enc_ctx->ticks_per_frame = 2;
5571 } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS)
5572 && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
5573 if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx->time_base.den
5574 && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > av_q2d(ist->time_base)
5575 && av_q2d(ist->time_base) < 1.0/500
5576 || copy_tb == AVFMT_TBCF_DECODER) {
5577 enc_ctx->time_base = dec_ctx->time_base;
5578 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5582 if ((enc_ctx->codec_tag == AV_RL32("tmcd") || ost->codecpar->codec_tag == AV_RL32("tmcd"))
5583 && dec_ctx->time_base.num < dec_ctx->time_base.den
5584 && dec_ctx->time_base.num > 0
5585 && 121LL*dec_ctx->time_base.num > dec_ctx->time_base.den) {
5586 enc_ctx->time_base = dec_ctx->time_base;
5589 if (ost->avg_frame_rate.num)
5590 enc_ctx->time_base = av_inv_q(ost->avg_frame_rate);
5592 av_reduce(&enc_ctx->time_base.num, &enc_ctx->time_base.den,
5593 enc_ctx->time_base.num, enc_ctx->time_base.den, INT_MAX);
5598 AVRational av_stream_get_codec_timebase(const AVStream *st)
5600 // See avformat_transfer_internal_stream_timing_info() TODO.
5601 #if FF_API_LAVF_AVCTX
5602 FF_DISABLE_DEPRECATION_WARNINGS
5603 return st->codec->time_base;
5604 FF_ENABLE_DEPRECATION_WARNINGS
5606 return st->internal->avctx->time_base;