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/thread.h"
36 #include "libavutil/time.h"
37 #include "libavutil/time_internal.h"
38 #include "libavutil/timestamp.h"
40 #include "libavcodec/bytestream.h"
41 #include "libavcodec/internal.h"
42 #include "libavcodec/raw.h"
44 #include "audiointerleave.h"
46 #include "avio_internal.h"
56 #include "libavutil/ffversion.h"
57 const char av_format_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
59 static AVMutex avformat_mutex = AV_MUTEX_INITIALIZER;
63 * various utility functions for use within FFmpeg
66 unsigned avformat_version(void)
68 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
69 return LIBAVFORMAT_VERSION_INT;
72 const char *avformat_configuration(void)
74 return FFMPEG_CONFIGURATION;
77 const char *avformat_license(void)
79 #define LICENSE_PREFIX "libavformat license: "
80 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
83 int ff_lock_avformat(void)
85 return ff_mutex_lock(&avformat_mutex) ? -1 : 0;
88 int ff_unlock_avformat(void)
90 return ff_mutex_unlock(&avformat_mutex) ? -1 : 0;
93 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
95 static int is_relative(int64_t ts) {
96 return ts > (RELATIVE_TS_BASE - (1LL<<48));
100 * Wrap a given time stamp, if there is an indication for an overflow
103 * @param timestamp the time stamp to wrap
104 * @return resulting time stamp
106 static int64_t wrap_timestamp(const AVStream *st, int64_t timestamp)
108 if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&
109 st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
110 if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
111 timestamp < st->pts_wrap_reference)
112 return timestamp + (1ULL << st->pts_wrap_bits);
113 else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
114 timestamp >= st->pts_wrap_reference)
115 return timestamp - (1ULL << st->pts_wrap_bits);
120 #if FF_API_FORMAT_GET_SET
121 MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
122 #if FF_API_LAVF_FFSERVER
123 FF_DISABLE_DEPRECATION_WARNINGS
124 MAKE_ACCESSORS(AVStream, stream, char *, recommended_encoder_configuration)
125 FF_ENABLE_DEPRECATION_WARNINGS
127 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, video_codec)
128 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, audio_codec)
129 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
130 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, data_codec)
131 MAKE_ACCESSORS(AVFormatContext, format, int, metadata_header_padding)
132 MAKE_ACCESSORS(AVFormatContext, format, void *, opaque)
133 MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb)
134 #if FF_API_OLD_OPEN_CALLBACKS
135 FF_DISABLE_DEPRECATION_WARNINGS
136 MAKE_ACCESSORS(AVFormatContext, format, AVOpenCallback, open_cb)
137 FF_ENABLE_DEPRECATION_WARNINGS
141 int64_t av_stream_get_end_pts(const AVStream *st)
143 if (st->internal->priv_pts) {
144 return st->internal->priv_pts->val;
146 return AV_NOPTS_VALUE;
149 struct AVCodecParserContext *av_stream_get_parser(const AVStream *st)
154 void av_format_inject_global_side_data(AVFormatContext *s)
157 s->internal->inject_global_side_data = 1;
158 for (i = 0; i < s->nb_streams; i++) {
159 AVStream *st = s->streams[i];
160 st->inject_global_side_data = 1;
164 int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
166 av_assert0(!dst->codec_whitelist &&
167 !dst->format_whitelist &&
168 !dst->protocol_whitelist &&
169 !dst->protocol_blacklist);
170 dst-> codec_whitelist = av_strdup(src->codec_whitelist);
171 dst->format_whitelist = av_strdup(src->format_whitelist);
172 dst->protocol_whitelist = av_strdup(src->protocol_whitelist);
173 dst->protocol_blacklist = av_strdup(src->protocol_blacklist);
174 if ( (src-> codec_whitelist && !dst-> codec_whitelist)
175 || (src-> format_whitelist && !dst-> format_whitelist)
176 || (src->protocol_whitelist && !dst->protocol_whitelist)
177 || (src->protocol_blacklist && !dst->protocol_blacklist)) {
178 av_log(dst, AV_LOG_ERROR, "Failed to duplicate black/whitelist\n");
179 return AVERROR(ENOMEM);
184 static const AVCodec *find_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
186 #if FF_API_LAVF_AVCTX
187 FF_DISABLE_DEPRECATION_WARNINGS
188 if (st->codec->codec)
189 return st->codec->codec;
190 FF_ENABLE_DEPRECATION_WARNINGS
193 switch (st->codecpar->codec_type) {
194 case AVMEDIA_TYPE_VIDEO:
195 if (s->video_codec) return s->video_codec;
197 case AVMEDIA_TYPE_AUDIO:
198 if (s->audio_codec) return s->audio_codec;
200 case AVMEDIA_TYPE_SUBTITLE:
201 if (s->subtitle_codec) return s->subtitle_codec;
205 return avcodec_find_decoder(codec_id);
208 static const AVCodec *find_probe_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
210 const AVCodec *codec;
212 #if CONFIG_H264_DECODER
213 /* Other parts of the code assume this decoder to be used for h264,
214 * so force it if possible. */
215 if (codec_id == AV_CODEC_ID_H264)
216 return avcodec_find_decoder_by_name("h264");
219 codec = find_decoder(s, st, codec_id);
223 if (codec->capabilities & AV_CODEC_CAP_AVOID_PROBING) {
224 const AVCodec *probe_codec = NULL;
225 while (probe_codec = av_codec_next(probe_codec)) {
226 if (probe_codec->id == codec_id &&
227 av_codec_is_decoder(probe_codec) &&
228 !(probe_codec->capabilities & (AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_EXPERIMENTAL))) {
237 #if FF_API_FORMAT_GET_SET
238 int av_format_get_probe_score(const AVFormatContext *s)
240 return s->probe_score;
244 /* an arbitrarily chosen "sane" max packet size -- 50M */
245 #define SANE_CHUNK_SIZE (50000000)
247 int ffio_limit(AVIOContext *s, int size)
249 if (s->maxsize>= 0) {
250 int64_t remaining= s->maxsize - avio_tell(s);
251 if (remaining < size) {
252 int64_t newsize = avio_size(s);
253 if (!s->maxsize || s->maxsize<newsize)
254 s->maxsize = newsize - !newsize;
255 remaining= s->maxsize - avio_tell(s);
256 remaining= FFMAX(remaining, 0);
259 if (s->maxsize>= 0 && remaining+1 < size) {
260 av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
267 /* Read the data in sane-sized chunks and append to pkt.
268 * Return the number of bytes read or an error. */
269 static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
271 int64_t orig_pos = pkt->pos; // av_grow_packet might reset pos
272 int orig_size = pkt->size;
276 int prev_size = pkt->size;
279 /* When the caller requests a lot of data, limit it to the amount
280 * left in file or SANE_CHUNK_SIZE when it is not known. */
282 if (read_size > SANE_CHUNK_SIZE/10) {
283 read_size = ffio_limit(s, read_size);
284 // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
286 read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
289 ret = av_grow_packet(pkt, read_size);
293 ret = avio_read(s, pkt->data + prev_size, read_size);
294 if (ret != read_size) {
295 av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
302 pkt->flags |= AV_PKT_FLAG_CORRUPT;
306 av_packet_unref(pkt);
307 return pkt->size > orig_size ? pkt->size - orig_size : ret;
310 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
315 pkt->pos = avio_tell(s);
317 return append_packet_chunked(s, pkt, size);
320 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
323 return av_get_packet(s, pkt, size);
324 return append_packet_chunked(s, pkt, size);
327 int av_filename_number_test(const char *filename)
331 (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0);
334 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
337 static const struct {
340 enum AVMediaType type;
342 { "aac", AV_CODEC_ID_AAC, AVMEDIA_TYPE_AUDIO },
343 { "ac3", AV_CODEC_ID_AC3, AVMEDIA_TYPE_AUDIO },
344 { "aptx", AV_CODEC_ID_APTX, AVMEDIA_TYPE_AUDIO },
345 { "dts", AV_CODEC_ID_DTS, AVMEDIA_TYPE_AUDIO },
346 { "dvbsub", AV_CODEC_ID_DVB_SUBTITLE,AVMEDIA_TYPE_SUBTITLE },
347 { "dvbtxt", AV_CODEC_ID_DVB_TELETEXT,AVMEDIA_TYPE_SUBTITLE },
348 { "eac3", AV_CODEC_ID_EAC3, AVMEDIA_TYPE_AUDIO },
349 { "h264", AV_CODEC_ID_H264, AVMEDIA_TYPE_VIDEO },
350 { "hevc", AV_CODEC_ID_HEVC, AVMEDIA_TYPE_VIDEO },
351 { "loas", AV_CODEC_ID_AAC_LATM, AVMEDIA_TYPE_AUDIO },
352 { "m4v", AV_CODEC_ID_MPEG4, AVMEDIA_TYPE_VIDEO },
353 { "mjpeg_2000",AV_CODEC_ID_JPEG2000, AVMEDIA_TYPE_VIDEO },
354 { "mp3", AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO },
355 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
356 { "truehd", AV_CODEC_ID_TRUEHD, AVMEDIA_TYPE_AUDIO },
360 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
364 av_log(s, AV_LOG_DEBUG,
365 "Probe with size=%d, packets=%d detected %s with score=%d\n",
366 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets,
368 for (i = 0; fmt_id_type[i].name; i++) {
369 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
370 if (fmt_id_type[i].type != AVMEDIA_TYPE_AUDIO &&
371 st->codecpar->sample_rate)
373 if (st->request_probe > score &&
374 st->codecpar->codec_id != fmt_id_type[i].id)
376 st->codecpar->codec_id = fmt_id_type[i].id;
377 st->codecpar->codec_type = fmt_id_type[i].type;
378 st->internal->need_context_update = 1;
379 #if FF_API_LAVF_AVCTX
380 FF_DISABLE_DEPRECATION_WARNINGS
381 st->codec->codec_type = st->codecpar->codec_type;
382 st->codec->codec_id = st->codecpar->codec_id;
383 FF_ENABLE_DEPRECATION_WARNINGS
392 /************************************************************/
393 /* input media file */
395 int av_demuxer_open(AVFormatContext *ic) {
398 if (ic->format_whitelist && av_match_list(ic->iformat->name, ic->format_whitelist, ',') <= 0) {
399 av_log(ic, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", ic->format_whitelist);
400 return AVERROR(EINVAL);
403 if (ic->iformat->read_header) {
404 err = ic->iformat->read_header(ic);
409 if (ic->pb && !ic->internal->data_offset)
410 ic->internal->data_offset = avio_tell(ic->pb);
415 /* Open input file and probe the format if necessary. */
416 static int init_input(AVFormatContext *s, const char *filename,
417 AVDictionary **options)
420 AVProbeData pd = { filename, NULL, 0 };
421 int score = AVPROBE_SCORE_RETRY;
424 s->flags |= AVFMT_FLAG_CUSTOM_IO;
426 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
427 s, 0, s->format_probesize);
428 else if (s->iformat->flags & AVFMT_NOFILE)
429 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
430 "will be ignored with AVFMT_NOFILE format.\n");
434 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
435 (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
438 if ((ret = s->io_open(s, &s->pb, filename, AVIO_FLAG_READ | s->avio_flags, options)) < 0)
443 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
444 s, 0, s->format_probesize);
447 static int add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
448 AVPacketList **plast_pktl, int ref)
450 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
454 return AVERROR(ENOMEM);
457 if ((ret = av_packet_ref(&pktl->pkt, pkt)) < 0) {
466 (*plast_pktl)->next = pktl;
468 *packet_buffer = pktl;
470 /* Add the packet in the buffered packet list. */
475 int avformat_queue_attached_pictures(AVFormatContext *s)
478 for (i = 0; i < s->nb_streams; i++)
479 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
480 s->streams[i]->discard < AVDISCARD_ALL) {
481 if (s->streams[i]->attached_pic.size <= 0) {
482 av_log(s, AV_LOG_WARNING,
483 "Attached picture on stream %d has invalid size, "
488 ret = add_to_pktbuf(&s->internal->raw_packet_buffer,
489 &s->streams[i]->attached_pic,
490 &s->internal->raw_packet_buffer_end, 1);
497 static int update_stream_avctx(AVFormatContext *s)
500 for (i = 0; i < s->nb_streams; i++) {
501 AVStream *st = s->streams[i];
503 if (!st->internal->need_context_update)
506 /* close parser, because it depends on the codec */
507 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
508 av_parser_close(st->parser);
512 /* update internal codec context, for the parser */
513 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
517 #if FF_API_LAVF_AVCTX
518 FF_DISABLE_DEPRECATION_WARNINGS
519 /* update deprecated public codec context */
520 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
523 FF_ENABLE_DEPRECATION_WARNINGS
526 st->internal->need_context_update = 0;
532 int avformat_open_input(AVFormatContext **ps, const char *filename,
533 AVInputFormat *fmt, AVDictionary **options)
535 AVFormatContext *s = *ps;
537 AVDictionary *tmp = NULL;
538 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
540 if (!s && !(s = avformat_alloc_context()))
541 return AVERROR(ENOMEM);
543 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
544 return AVERROR(EINVAL);
550 av_dict_copy(&tmp, *options, 0);
552 if (s->pb) // must be before any goto fail
553 s->flags |= AVFMT_FLAG_CUSTOM_IO;
555 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
558 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
559 if ((ret = init_input(s, filename, &tmp)) < 0)
561 s->probe_score = ret;
563 if (!s->protocol_whitelist && s->pb && s->pb->protocol_whitelist) {
564 s->protocol_whitelist = av_strdup(s->pb->protocol_whitelist);
565 if (!s->protocol_whitelist) {
566 ret = AVERROR(ENOMEM);
571 if (!s->protocol_blacklist && s->pb && s->pb->protocol_blacklist) {
572 s->protocol_blacklist = av_strdup(s->pb->protocol_blacklist);
573 if (!s->protocol_blacklist) {
574 ret = AVERROR(ENOMEM);
579 if (s->format_whitelist && av_match_list(s->iformat->name, s->format_whitelist, ',') <= 0) {
580 av_log(s, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", s->format_whitelist);
581 ret = AVERROR(EINVAL);
585 avio_skip(s->pb, s->skip_initial_bytes);
587 /* Check filename in case an image number is expected. */
588 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
589 if (!av_filename_number_test(filename)) {
590 ret = AVERROR(EINVAL);
595 s->duration = s->start_time = AV_NOPTS_VALUE;
597 /* Allocate private data. */
598 if (s->iformat->priv_data_size > 0) {
599 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
600 ret = AVERROR(ENOMEM);
603 if (s->iformat->priv_class) {
604 *(const AVClass **) s->priv_data = s->iformat->priv_class;
605 av_opt_set_defaults(s->priv_data);
606 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
611 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
613 ff_id3v2_read_dict(s->pb, &s->internal->id3v2_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
616 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
617 if ((ret = s->iformat->read_header(s)) < 0)
621 s->metadata = s->internal->id3v2_meta;
622 s->internal->id3v2_meta = NULL;
623 } else if (s->internal->id3v2_meta) {
624 int level = AV_LOG_WARNING;
625 if (s->error_recognition & AV_EF_COMPLIANT)
626 level = AV_LOG_ERROR;
627 av_log(s, level, "Discarding ID3 tags because more suitable tags were found.\n");
628 av_dict_free(&s->internal->id3v2_meta);
629 if (s->error_recognition & AV_EF_EXPLODE)
630 return AVERROR_INVALIDDATA;
633 if (id3v2_extra_meta) {
634 if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
635 !strcmp(s->iformat->name, "tta")) {
636 if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
638 if ((ret = ff_id3v2_parse_chapters(s, &id3v2_extra_meta)) < 0)
640 if ((ret = ff_id3v2_parse_priv(s, &id3v2_extra_meta)) < 0)
643 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
645 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
647 if ((ret = avformat_queue_attached_pictures(s)) < 0)
650 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
651 s->internal->data_offset = avio_tell(s->pb);
653 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
655 update_stream_avctx(s);
657 for (i = 0; i < s->nb_streams; i++)
658 s->streams[i]->internal->orig_codec_id = s->streams[i]->codecpar->codec_id;
661 av_dict_free(options);
668 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
670 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
672 avformat_free_context(s);
677 /*******************************************************/
679 static void force_codec_ids(AVFormatContext *s, AVStream *st)
681 switch (st->codecpar->codec_type) {
682 case AVMEDIA_TYPE_VIDEO:
683 if (s->video_codec_id)
684 st->codecpar->codec_id = s->video_codec_id;
686 case AVMEDIA_TYPE_AUDIO:
687 if (s->audio_codec_id)
688 st->codecpar->codec_id = s->audio_codec_id;
690 case AVMEDIA_TYPE_SUBTITLE:
691 if (s->subtitle_codec_id)
692 st->codecpar->codec_id = s->subtitle_codec_id;
694 case AVMEDIA_TYPE_DATA:
695 if (s->data_codec_id)
696 st->codecpar->codec_id = s->data_codec_id;
701 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
703 if (st->request_probe>0) {
704 AVProbeData *pd = &st->probe_data;
706 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
710 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
712 av_log(s, AV_LOG_WARNING,
713 "Failed to reallocate probe buffer for stream %d\n",
718 memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
719 pd->buf_size += pkt->size;
720 memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
723 st->probe_packets = 0;
725 av_log(s, AV_LOG_WARNING,
726 "nothing to probe for stream %d\n", st->index);
730 end= s->internal->raw_packet_buffer_remaining_size <= 0
731 || st->probe_packets<= 0;
733 if (end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
734 int score = set_codec_from_probe_data(s, st, pd);
735 if ( (st->codecpar->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
739 st->request_probe = -1;
740 if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
741 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
743 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
745 force_codec_ids(s, st);
751 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
753 int64_t ref = pkt->dts;
754 int i, pts_wrap_behavior;
755 int64_t pts_wrap_reference;
756 AVProgram *first_program;
758 if (ref == AV_NOPTS_VALUE)
760 if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
762 ref &= (1LL << st->pts_wrap_bits)-1;
764 // reference time stamp should be 60 s before first time stamp
765 pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
766 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
767 pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
768 (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
769 AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
771 first_program = av_find_program_from_stream(s, NULL, stream_index);
773 if (!first_program) {
774 int default_stream_index = av_find_default_stream_index(s);
775 if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
776 for (i = 0; i < s->nb_streams; i++) {
777 if (av_find_program_from_stream(s, NULL, i))
779 s->streams[i]->pts_wrap_reference = pts_wrap_reference;
780 s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
784 st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
785 st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
789 AVProgram *program = first_program;
791 if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
792 pts_wrap_reference = program->pts_wrap_reference;
793 pts_wrap_behavior = program->pts_wrap_behavior;
796 program = av_find_program_from_stream(s, program, stream_index);
799 // update every program with differing pts_wrap_reference
800 program = first_program;
802 if (program->pts_wrap_reference != pts_wrap_reference) {
803 for (i = 0; i<program->nb_stream_indexes; i++) {
804 s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
805 s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
808 program->pts_wrap_reference = pts_wrap_reference;
809 program->pts_wrap_behavior = pts_wrap_behavior;
811 program = av_find_program_from_stream(s, program, stream_index);
817 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
823 AVPacketList *pktl = s->internal->raw_packet_buffer;
827 st = s->streams[pkt->stream_index];
828 if (s->internal->raw_packet_buffer_remaining_size <= 0)
829 if ((err = probe_codec(s, st, NULL)) < 0)
831 if (st->request_probe <= 0) {
832 s->internal->raw_packet_buffer = pktl->next;
833 s->internal->raw_packet_buffer_remaining_size += pkt->size;
842 ret = s->iformat->read_packet(s, pkt);
844 /* Some demuxers return FFERROR_REDO when they consume
845 data and discard it (ignored streams, junk, extradata).
846 We must re-call the demuxer to get the real packet. */
847 if (ret == FFERROR_REDO)
849 if (!pktl || ret == AVERROR(EAGAIN))
851 for (i = 0; i < s->nb_streams; i++) {
853 if (st->probe_packets || st->request_probe > 0)
854 if ((err = probe_codec(s, st, NULL)) < 0)
856 av_assert0(st->request_probe <= 0);
862 AVPacket tmp = { 0 };
863 ret = av_packet_ref(&tmp, pkt);
869 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
870 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
871 av_log(s, AV_LOG_WARNING,
872 "Dropped corrupted packet (stream = %d)\n",
874 av_packet_unref(pkt);
878 if (pkt->stream_index >= (unsigned)s->nb_streams) {
879 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
883 st = s->streams[pkt->stream_index];
885 if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
886 // correct first time stamps to negative values
887 if (!is_relative(st->first_dts))
888 st->first_dts = wrap_timestamp(st, st->first_dts);
889 if (!is_relative(st->start_time))
890 st->start_time = wrap_timestamp(st, st->start_time);
891 if (!is_relative(st->cur_dts))
892 st->cur_dts = wrap_timestamp(st, st->cur_dts);
895 pkt->dts = wrap_timestamp(st, pkt->dts);
896 pkt->pts = wrap_timestamp(st, pkt->pts);
898 force_codec_ids(s, st);
900 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
901 if (s->use_wallclock_as_timestamps)
902 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
904 if (!pktl && st->request_probe <= 0)
907 err = add_to_pktbuf(&s->internal->raw_packet_buffer, pkt,
908 &s->internal->raw_packet_buffer_end, 0);
911 s->internal->raw_packet_buffer_remaining_size -= pkt->size;
913 if ((err = probe_codec(s, st, pkt)) < 0)
919 /**********************************************************/
921 static int determinable_frame_size(AVCodecContext *avctx)
923 switch(avctx->codec_id) {
924 case AV_CODEC_ID_MP1:
925 case AV_CODEC_ID_MP2:
926 case AV_CODEC_ID_MP3:
934 * Return the frame duration in seconds. Return 0 if not available.
936 void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
937 AVCodecParserContext *pc, AVPacket *pkt)
939 AVRational codec_framerate = s->iformat ? st->internal->avctx->framerate :
940 av_mul_q(av_inv_q(st->internal->avctx->time_base), (AVRational){1, st->internal->avctx->ticks_per_frame});
941 int frame_size, sample_rate;
943 #if FF_API_LAVF_AVCTX
944 FF_DISABLE_DEPRECATION_WARNINGS
945 if ((!codec_framerate.den || !codec_framerate.num) && st->codec->time_base.den && st->codec->time_base.num)
946 codec_framerate = av_mul_q(av_inv_q(st->codec->time_base), (AVRational){1, st->codec->ticks_per_frame});
947 FF_ENABLE_DEPRECATION_WARNINGS
952 switch (st->codecpar->codec_type) {
953 case AVMEDIA_TYPE_VIDEO:
954 if (st->r_frame_rate.num && !pc && s->iformat) {
955 *pnum = st->r_frame_rate.den;
956 *pden = st->r_frame_rate.num;
957 } else if (st->time_base.num * 1000LL > st->time_base.den) {
958 *pnum = st->time_base.num;
959 *pden = st->time_base.den;
960 } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
961 av_assert0(st->internal->avctx->ticks_per_frame);
962 av_reduce(pnum, pden,
964 codec_framerate.num * (int64_t)st->internal->avctx->ticks_per_frame,
967 if (pc && pc->repeat_pict) {
968 av_assert0(s->iformat); // this may be wrong for interlaced encoding but its not used for that case
969 av_reduce(pnum, pden,
970 (*pnum) * (1LL + pc->repeat_pict),
974 /* If this codec can be interlaced or progressive then we need
975 * a parser to compute duration of a packet. Thus if we have
976 * no parser in such case leave duration undefined. */
977 if (st->internal->avctx->ticks_per_frame > 1 && !pc)
981 case AVMEDIA_TYPE_AUDIO:
982 if (st->internal->avctx_inited) {
983 frame_size = av_get_audio_frame_duration(st->internal->avctx, pkt->size);
984 sample_rate = st->internal->avctx->sample_rate;
986 frame_size = av_get_audio_frame_duration2(st->codecpar, pkt->size);
987 sample_rate = st->codecpar->sample_rate;
989 if (frame_size <= 0 || sample_rate <= 0)
999 static int is_intra_only(enum AVCodecID id)
1001 const AVCodecDescriptor *d = avcodec_descriptor_get(id);
1004 if (d->type == AVMEDIA_TYPE_VIDEO && !(d->props & AV_CODEC_PROP_INTRA_ONLY))
1009 static int has_decode_delay_been_guessed(AVStream *st)
1011 if (st->codecpar->codec_id != AV_CODEC_ID_H264) return 1;
1012 if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
1014 #if CONFIG_H264_DECODER
1015 if (st->internal->avctx->has_b_frames &&
1016 avpriv_h264_has_num_reorder_frames(st->internal->avctx) == st->internal->avctx->has_b_frames)
1019 if (st->internal->avctx->has_b_frames<3)
1020 return st->nb_decoded_frames >= 7;
1021 else if (st->internal->avctx->has_b_frames<4)
1022 return st->nb_decoded_frames >= 18;
1024 return st->nb_decoded_frames >= 20;
1027 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
1031 if (pktl == s->internal->packet_buffer_end)
1032 return s->internal->parse_queue;
1036 static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
1037 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1038 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1041 int delay = st->internal->avctx->has_b_frames;
1044 if (dts == AV_NOPTS_VALUE) {
1045 int64_t best_score = INT64_MAX;
1046 for (i = 0; i<delay; i++) {
1047 if (st->pts_reorder_error_count[i]) {
1048 int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
1049 if (score < best_score) {
1051 dts = pts_buffer[i];
1056 for (i = 0; i<delay; i++) {
1057 if (pts_buffer[i] != AV_NOPTS_VALUE) {
1058 int64_t diff = FFABS(pts_buffer[i] - dts)
1059 + (uint64_t)st->pts_reorder_error[i];
1060 diff = FFMAX(diff, st->pts_reorder_error[i]);
1061 st->pts_reorder_error[i] = diff;
1062 st->pts_reorder_error_count[i]++;
1063 if (st->pts_reorder_error_count[i] > 250) {
1064 st->pts_reorder_error[i] >>= 1;
1065 st->pts_reorder_error_count[i] >>= 1;
1072 if (dts == AV_NOPTS_VALUE)
1073 dts = pts_buffer[0];
1079 * Updates the dts of packets of a stream in pkt_buffer, by re-ordering the pts
1080 * of the packets in a window.
1082 static void update_dts_from_pts(AVFormatContext *s, int stream_index,
1083 AVPacketList *pkt_buffer)
1085 AVStream *st = s->streams[stream_index];
1086 int delay = st->internal->avctx->has_b_frames;
1089 int64_t pts_buffer[MAX_REORDER_DELAY+1];
1091 for (i = 0; i<MAX_REORDER_DELAY+1; i++)
1092 pts_buffer[i] = AV_NOPTS_VALUE;
1094 for (; pkt_buffer; pkt_buffer = get_next_pkt(s, st, pkt_buffer)) {
1095 if (pkt_buffer->pkt.stream_index != stream_index)
1098 if (pkt_buffer->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1099 pts_buffer[0] = pkt_buffer->pkt.pts;
1100 for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
1101 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
1103 pkt_buffer->pkt.dts = select_from_pts_buffer(st, pts_buffer, pkt_buffer->pkt.dts);
1108 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
1109 int64_t dts, int64_t pts, AVPacket *pkt)
1111 AVStream *st = s->streams[stream_index];
1112 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1113 AVPacketList *pktl_it;
1117 if (st->first_dts != AV_NOPTS_VALUE ||
1118 dts == AV_NOPTS_VALUE ||
1119 st->cur_dts == AV_NOPTS_VALUE ||
1123 st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
1125 shift = (uint64_t)st->first_dts - RELATIVE_TS_BASE;
1127 if (is_relative(pts))
1130 for (pktl_it = pktl; pktl_it; pktl_it = get_next_pkt(s, st, pktl_it)) {
1131 if (pktl_it->pkt.stream_index != stream_index)
1133 if (is_relative(pktl_it->pkt.pts))
1134 pktl_it->pkt.pts += shift;
1136 if (is_relative(pktl_it->pkt.dts))
1137 pktl_it->pkt.dts += shift;
1139 if (st->start_time == AV_NOPTS_VALUE && pktl_it->pkt.pts != AV_NOPTS_VALUE) {
1140 st->start_time = pktl_it->pkt.pts;
1141 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1142 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1146 if (has_decode_delay_been_guessed(st)) {
1147 update_dts_from_pts(s, stream_index, pktl);
1150 if (st->start_time == AV_NOPTS_VALUE) {
1151 st->start_time = pts;
1152 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1153 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1157 static void update_initial_durations(AVFormatContext *s, AVStream *st,
1158 int stream_index, int duration)
1160 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1161 int64_t cur_dts = RELATIVE_TS_BASE;
1163 if (st->first_dts != AV_NOPTS_VALUE) {
1164 if (st->update_initial_durations_done)
1166 st->update_initial_durations_done = 1;
1167 cur_dts = st->first_dts;
1168 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1169 if (pktl->pkt.stream_index == stream_index) {
1170 if (pktl->pkt.pts != pktl->pkt.dts ||
1171 pktl->pkt.dts != AV_NOPTS_VALUE ||
1174 cur_dts -= duration;
1177 if (pktl && pktl->pkt.dts != st->first_dts) {
1178 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %"PRId64") in the queue\n",
1179 av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
1183 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
1186 pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1187 st->first_dts = cur_dts;
1188 } else if (st->cur_dts != RELATIVE_TS_BASE)
1191 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1192 if (pktl->pkt.stream_index != stream_index)
1194 if ((pktl->pkt.pts == pktl->pkt.dts ||
1195 pktl->pkt.pts == AV_NOPTS_VALUE) &&
1196 (pktl->pkt.dts == AV_NOPTS_VALUE ||
1197 pktl->pkt.dts == st->first_dts ||
1198 pktl->pkt.dts == RELATIVE_TS_BASE) &&
1199 !pktl->pkt.duration) {
1200 pktl->pkt.dts = cur_dts;
1201 if (!st->internal->avctx->has_b_frames)
1202 pktl->pkt.pts = cur_dts;
1203 // if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
1204 pktl->pkt.duration = duration;
1207 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
1210 st->cur_dts = cur_dts;
1213 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1214 AVCodecParserContext *pc, AVPacket *pkt,
1215 int64_t next_dts, int64_t next_pts)
1217 int num, den, presentation_delayed, delay, i;
1219 AVRational duration;
1220 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1221 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1223 if (s->flags & AVFMT_FLAG_NOFILLIN)
1226 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
1227 if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
1228 if (st->last_dts_for_order_check <= pkt->dts) {
1231 av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
1232 "DTS %"PRIi64" < %"PRIi64" out of order\n",
1234 st->last_dts_for_order_check);
1235 st->dts_misordered++;
1237 if (st->dts_ordered + st->dts_misordered > 250) {
1238 st->dts_ordered >>= 1;
1239 st->dts_misordered >>= 1;
1243 st->last_dts_for_order_check = pkt->dts;
1244 if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
1245 pkt->dts = AV_NOPTS_VALUE;
1248 if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1249 pkt->dts = AV_NOPTS_VALUE;
1251 if (pc && pc->pict_type == AV_PICTURE_TYPE_B
1252 && !st->internal->avctx->has_b_frames)
1253 //FIXME Set low_delay = 0 when has_b_frames = 1
1254 st->internal->avctx->has_b_frames = 1;
1256 /* do we have a video B-frame ? */
1257 delay = st->internal->avctx->has_b_frames;
1258 presentation_delayed = 0;
1260 /* XXX: need has_b_frame, but cannot get it if the codec is
1261 * not initialized */
1263 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1264 presentation_delayed = 1;
1266 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
1267 st->pts_wrap_bits < 63 &&
1268 pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
1269 if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
1270 pkt->dts -= 1LL << st->pts_wrap_bits;
1272 pkt->pts += 1LL << st->pts_wrap_bits;
1275 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1276 * We take the conservative approach and discard both.
1277 * Note: If this is misbehaving for an H.264 file, then possibly
1278 * presentation_delayed is not set correctly. */
1279 if (delay == 1 && pkt->dts == pkt->pts &&
1280 pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
1281 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1282 if ( strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
1283 && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1284 pkt->dts = AV_NOPTS_VALUE;
1287 duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
1288 if (pkt->duration == 0) {
1289 ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
1291 duration = (AVRational) {num, den};
1292 pkt->duration = av_rescale_rnd(1,
1293 num * (int64_t) st->time_base.den,
1294 den * (int64_t) st->time_base.num,
1299 if (pkt->duration != 0 && (s->internal->packet_buffer || s->internal->parse_queue))
1300 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1302 /* Correct timestamps with byte offset if demuxers only have timestamps
1303 * on packet boundaries */
1304 if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
1305 /* this will estimate bitrate based on this frame's duration and size */
1306 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1307 if (pkt->pts != AV_NOPTS_VALUE)
1309 if (pkt->dts != AV_NOPTS_VALUE)
1313 /* This may be redundant, but it should not hurt. */
1314 if (pkt->dts != AV_NOPTS_VALUE &&
1315 pkt->pts != AV_NOPTS_VALUE &&
1316 pkt->pts > pkt->dts)
1317 presentation_delayed = 1;
1319 if (s->debug & FF_FDEBUG_TS)
1320 av_log(s, AV_LOG_TRACE,
1321 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%"PRId64" delay:%d onein_oneout:%d\n",
1322 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
1323 pkt->stream_index, pc, pkt->duration, delay, onein_oneout);
1325 /* Interpolate PTS and DTS if they are not present. We skip H264
1326 * currently because delay and has_b_frames are not reliably set. */
1327 if ((delay == 0 || (delay == 1 && pc)) &&
1329 if (presentation_delayed) {
1330 /* DTS = decompression timestamp */
1331 /* PTS = presentation timestamp */
1332 if (pkt->dts == AV_NOPTS_VALUE)
1333 pkt->dts = st->last_IP_pts;
1334 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1335 if (pkt->dts == AV_NOPTS_VALUE)
1336 pkt->dts = st->cur_dts;
1338 /* This is tricky: the dts must be incremented by the duration
1339 * of the frame we are displaying, i.e. the last I- or P-frame. */
1340 if (st->last_IP_duration == 0)
1341 st->last_IP_duration = pkt->duration;
1342 if (pkt->dts != AV_NOPTS_VALUE)
1343 st->cur_dts = pkt->dts + st->last_IP_duration;
1344 if (pkt->dts != AV_NOPTS_VALUE &&
1345 pkt->pts == AV_NOPTS_VALUE &&
1346 st->last_IP_duration > 0 &&
1347 ((uint64_t)st->cur_dts - (uint64_t)next_dts + 1) <= 2 &&
1348 next_dts != next_pts &&
1349 next_pts != AV_NOPTS_VALUE)
1350 pkt->pts = next_dts;
1352 st->last_IP_duration = pkt->duration;
1353 st->last_IP_pts = pkt->pts;
1354 /* Cannot compute PTS if not present (we can compute it only
1355 * by knowing the future. */
1356 } else if (pkt->pts != AV_NOPTS_VALUE ||
1357 pkt->dts != AV_NOPTS_VALUE ||
1360 /* presentation is not delayed : PTS and DTS are the same */
1361 if (pkt->pts == AV_NOPTS_VALUE)
1362 pkt->pts = pkt->dts;
1363 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1365 if (pkt->pts == AV_NOPTS_VALUE)
1366 pkt->pts = st->cur_dts;
1367 pkt->dts = pkt->pts;
1368 if (pkt->pts != AV_NOPTS_VALUE)
1369 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
1373 if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1374 st->pts_buffer[0] = pkt->pts;
1375 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
1376 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
1378 if(has_decode_delay_been_guessed(st))
1379 pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
1381 // We skipped it above so we try here.
1383 // This should happen on the first packet
1384 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1385 if (pkt->dts > st->cur_dts)
1386 st->cur_dts = pkt->dts;
1388 if (s->debug & FF_FDEBUG_TS)
1389 av_log(s, AV_LOG_TRACE, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1390 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
1393 if (is_intra_only(st->codecpar->codec_id))
1394 pkt->flags |= AV_PKT_FLAG_KEY;
1395 #if FF_API_CONVERGENCE_DURATION
1396 FF_DISABLE_DEPRECATION_WARNINGS
1398 pkt->convergence_duration = pc->convergence_duration;
1399 FF_ENABLE_DEPRECATION_WARNINGS
1403 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1406 AVPacketList *pktl = *pkt_buf;
1407 *pkt_buf = pktl->next;
1408 av_packet_unref(&pktl->pkt);
1411 *pkt_buf_end = NULL;
1415 * Parse a packet, add all split parts to parse_queue.
1417 * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
1419 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1421 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1422 AVStream *st = s->streams[stream_index];
1423 uint8_t *data = pkt ? pkt->data : NULL;
1424 int size = pkt ? pkt->size : 0;
1425 int ret = 0, got_output = 0;
1428 av_init_packet(&flush_pkt);
1431 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1432 // preserve 0-size sync packets
1433 compute_pkt_fields(s, st, st->parser, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1436 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1438 int64_t next_pts = pkt->pts;
1439 int64_t next_dts = pkt->dts;
1441 av_init_packet(&out_pkt);
1442 len = av_parser_parse2(st->parser, st->internal->avctx,
1443 &out_pkt.data, &out_pkt.size, data, size,
1444 pkt->pts, pkt->dts, pkt->pos);
1446 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1448 /* increment read pointer */
1452 got_output = !!out_pkt.size;
1457 if (pkt->side_data) {
1458 out_pkt.side_data = pkt->side_data;
1459 out_pkt.side_data_elems = pkt->side_data_elems;
1460 pkt->side_data = NULL;
1461 pkt->side_data_elems = 0;
1464 /* set the duration */
1465 out_pkt.duration = (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->duration : 0;
1466 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1467 if (st->internal->avctx->sample_rate > 0) {
1469 av_rescale_q_rnd(st->parser->duration,
1470 (AVRational) { 1, st->internal->avctx->sample_rate },
1476 out_pkt.stream_index = st->index;
1477 out_pkt.pts = st->parser->pts;
1478 out_pkt.dts = st->parser->dts;
1479 out_pkt.pos = st->parser->pos;
1480 out_pkt.flags |= pkt->flags & AV_PKT_FLAG_DISCARD;
1482 if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1483 out_pkt.pos = st->parser->frame_offset;
1485 if (st->parser->key_frame == 1 ||
1486 (st->parser->key_frame == -1 &&
1487 st->parser->pict_type == AV_PICTURE_TYPE_I))
1488 out_pkt.flags |= AV_PKT_FLAG_KEY;
1490 if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1491 out_pkt.flags |= AV_PKT_FLAG_KEY;
1493 compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts);
1495 ret = add_to_pktbuf(&s->internal->parse_queue, &out_pkt,
1496 &s->internal->parse_queue_end, 1);
1497 av_packet_unref(&out_pkt);
1502 /* end of the stream => close and free the parser */
1503 if (pkt == &flush_pkt) {
1504 av_parser_close(st->parser);
1509 av_packet_unref(pkt);
1513 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1514 AVPacketList **pkt_buffer_end,
1518 av_assert0(*pkt_buffer);
1521 *pkt_buffer = pktl->next;
1523 *pkt_buffer_end = NULL;
1528 static int64_t ts_to_samples(AVStream *st, int64_t ts)
1530 return av_rescale(ts, st->time_base.num * st->codecpar->sample_rate, st->time_base.den);
1533 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1535 int ret = 0, i, got_packet = 0;
1536 AVDictionary *metadata = NULL;
1538 av_init_packet(pkt);
1540 while (!got_packet && !s->internal->parse_queue) {
1544 /* read next packet */
1545 ret = ff_read_packet(s, &cur_pkt);
1547 if (ret == AVERROR(EAGAIN))
1549 /* flush the parsers */
1550 for (i = 0; i < s->nb_streams; i++) {
1552 if (st->parser && st->need_parsing)
1553 parse_packet(s, NULL, st->index);
1555 /* all remaining packets are now in parse_queue =>
1556 * really terminate parsing */
1560 st = s->streams[cur_pkt.stream_index];
1562 /* update context if required */
1563 if (st->internal->need_context_update) {
1564 if (avcodec_is_open(st->internal->avctx)) {
1565 av_log(s, AV_LOG_DEBUG, "Demuxer context update while decoder is open, closing and trying to re-open\n");
1566 avcodec_close(st->internal->avctx);
1567 st->info->found_decoder = 0;
1570 /* close parser, because it depends on the codec */
1571 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
1572 av_parser_close(st->parser);
1576 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
1580 #if FF_API_LAVF_AVCTX
1581 FF_DISABLE_DEPRECATION_WARNINGS
1582 /* update deprecated public codec context */
1583 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
1586 FF_ENABLE_DEPRECATION_WARNINGS
1589 st->internal->need_context_update = 0;
1592 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1593 cur_pkt.dts != AV_NOPTS_VALUE &&
1594 cur_pkt.pts < cur_pkt.dts) {
1595 av_log(s, AV_LOG_WARNING,
1596 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1597 cur_pkt.stream_index,
1598 av_ts2str(cur_pkt.pts),
1599 av_ts2str(cur_pkt.dts),
1602 if (s->debug & FF_FDEBUG_TS)
1603 av_log(s, AV_LOG_DEBUG,
1604 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"PRId64", flags=%d\n",
1605 cur_pkt.stream_index,
1606 av_ts2str(cur_pkt.pts),
1607 av_ts2str(cur_pkt.dts),
1608 cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
1610 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1611 st->parser = av_parser_init(st->codecpar->codec_id);
1613 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1614 "%s, packets or times may be invalid.\n",
1615 avcodec_get_name(st->codecpar->codec_id));
1616 /* no parser available: just output the raw packets */
1617 st->need_parsing = AVSTREAM_PARSE_NONE;
1618 } else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1619 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1620 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1621 st->parser->flags |= PARSER_FLAG_ONCE;
1622 else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1623 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1626 if (!st->need_parsing || !st->parser) {
1627 /* no parsing needed: we just output the packet as is */
1629 compute_pkt_fields(s, st, NULL, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1630 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1631 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1632 ff_reduce_index(s, st->index);
1633 av_add_index_entry(st, pkt->pos, pkt->dts,
1634 0, 0, AVINDEX_KEYFRAME);
1637 } else if (st->discard < AVDISCARD_ALL) {
1638 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1640 st->codecpar->sample_rate = st->internal->avctx->sample_rate;
1641 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
1642 st->codecpar->channels = st->internal->avctx->channels;
1643 st->codecpar->channel_layout = st->internal->avctx->channel_layout;
1644 st->codecpar->codec_id = st->internal->avctx->codec_id;
1647 av_packet_unref(&cur_pkt);
1649 if (pkt->flags & AV_PKT_FLAG_KEY)
1650 st->skip_to_keyframe = 0;
1651 if (st->skip_to_keyframe) {
1652 av_packet_unref(&cur_pkt);
1660 if (!got_packet && s->internal->parse_queue)
1661 ret = read_from_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt);
1664 AVStream *st = s->streams[pkt->stream_index];
1665 int discard_padding = 0;
1666 if (st->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
1667 int64_t pts = pkt->pts - (is_relative(pkt->pts) ? RELATIVE_TS_BASE : 0);
1668 int64_t sample = ts_to_samples(st, pts);
1669 int duration = ts_to_samples(st, pkt->duration);
1670 int64_t end_sample = sample + duration;
1671 if (duration > 0 && end_sample >= st->first_discard_sample &&
1672 sample < st->last_discard_sample)
1673 discard_padding = FFMIN(end_sample - st->first_discard_sample, duration);
1675 if (st->start_skip_samples && (pkt->pts == 0 || pkt->pts == RELATIVE_TS_BASE))
1676 st->skip_samples = st->start_skip_samples;
1677 if (st->skip_samples || discard_padding) {
1678 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1680 AV_WL32(p, st->skip_samples);
1681 AV_WL32(p + 4, discard_padding);
1682 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d / discard %d\n", st->skip_samples, discard_padding);
1684 st->skip_samples = 0;
1687 if (st->inject_global_side_data) {
1688 for (i = 0; i < st->nb_side_data; i++) {
1689 AVPacketSideData *src_sd = &st->side_data[i];
1692 if (av_packet_get_side_data(pkt, src_sd->type, NULL))
1695 dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
1697 av_log(s, AV_LOG_WARNING, "Could not inject global side data\n");
1701 memcpy(dst_data, src_sd->data, src_sd->size);
1703 st->inject_global_side_data = 0;
1707 av_opt_get_dict_val(s, "metadata", AV_OPT_SEARCH_CHILDREN, &metadata);
1709 s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
1710 av_dict_copy(&s->metadata, metadata, 0);
1711 av_dict_free(&metadata);
1712 av_opt_set_dict_val(s, "metadata", NULL, AV_OPT_SEARCH_CHILDREN);
1715 #if FF_API_LAVF_AVCTX
1716 update_stream_avctx(s);
1719 if (s->debug & FF_FDEBUG_TS)
1720 av_log(s, AV_LOG_DEBUG,
1721 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1722 "size=%d, duration=%"PRId64", flags=%d\n",
1724 av_ts2str(pkt->pts),
1725 av_ts2str(pkt->dts),
1726 pkt->size, pkt->duration, pkt->flags);
1731 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1733 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1739 ret = s->internal->packet_buffer
1740 ? read_from_packet_buffer(&s->internal->packet_buffer,
1741 &s->internal->packet_buffer_end, pkt)
1742 : read_frame_internal(s, pkt);
1749 AVPacketList *pktl = s->internal->packet_buffer;
1752 AVPacket *next_pkt = &pktl->pkt;
1754 if (next_pkt->dts != AV_NOPTS_VALUE) {
1755 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1756 // last dts seen for this stream. if any of packets following
1757 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1758 int64_t last_dts = next_pkt->dts;
1759 av_assert2(wrap_bits <= 64);
1760 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1761 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1762 av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2ULL << (wrap_bits - 1)) < 0) {
1763 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2ULL << (wrap_bits - 1))) {
1765 next_pkt->pts = pktl->pkt.dts;
1767 if (last_dts != AV_NOPTS_VALUE) {
1768 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1769 last_dts = pktl->pkt.dts;
1774 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1775 // Fixing the last reference frame had none pts issue (For MXF etc).
1776 // We only do this when
1778 // 2. we are not able to resolve a pts value for current packet.
1779 // 3. the packets for this stream at the end of the files had valid dts.
1780 next_pkt->pts = last_dts + next_pkt->duration;
1782 pktl = s->internal->packet_buffer;
1785 /* read packet from packet buffer, if there is data */
1786 st = s->streams[next_pkt->stream_index];
1787 if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
1788 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1789 ret = read_from_packet_buffer(&s->internal->packet_buffer,
1790 &s->internal->packet_buffer_end, pkt);
1795 ret = read_frame_internal(s, pkt);
1797 if (pktl && ret != AVERROR(EAGAIN)) {
1804 ret = add_to_pktbuf(&s->internal->packet_buffer, pkt,
1805 &s->internal->packet_buffer_end, 1);
1806 av_packet_unref(pkt);
1813 st = s->streams[pkt->stream_index];
1814 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1815 ff_reduce_index(s, st->index);
1816 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1819 if (is_relative(pkt->dts))
1820 pkt->dts -= RELATIVE_TS_BASE;
1821 if (is_relative(pkt->pts))
1822 pkt->pts -= RELATIVE_TS_BASE;
1827 /* XXX: suppress the packet queue */
1828 static void flush_packet_queue(AVFormatContext *s)
1832 free_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end);
1833 free_packet_buffer(&s->internal->packet_buffer, &s->internal->packet_buffer_end);
1834 free_packet_buffer(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
1836 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1839 /*******************************************************/
1842 int av_find_default_stream_index(AVFormatContext *s)
1846 int best_stream = 0;
1847 int best_score = INT_MIN;
1849 if (s->nb_streams <= 0)
1851 for (i = 0; i < s->nb_streams; i++) {
1854 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1855 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
1857 if (st->codecpar->width && st->codecpar->height)
1861 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1862 if (st->codecpar->sample_rate)
1865 if (st->codec_info_nb_frames)
1868 if (st->discard != AVDISCARD_ALL)
1871 if (score > best_score) {
1879 /** Flush the frame reader. */
1880 void ff_read_frame_flush(AVFormatContext *s)
1885 flush_packet_queue(s);
1887 /* Reset read state for each stream. */
1888 for (i = 0; i < s->nb_streams; i++) {
1892 av_parser_close(st->parser);
1895 st->last_IP_pts = AV_NOPTS_VALUE;
1896 st->last_dts_for_order_check = AV_NOPTS_VALUE;
1897 if (st->first_dts == AV_NOPTS_VALUE)
1898 st->cur_dts = RELATIVE_TS_BASE;
1900 /* We set the current DTS to an unspecified origin. */
1901 st->cur_dts = AV_NOPTS_VALUE;
1903 st->probe_packets = MAX_PROBE_PACKETS;
1905 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1906 st->pts_buffer[j] = AV_NOPTS_VALUE;
1908 if (s->internal->inject_global_side_data)
1909 st->inject_global_side_data = 1;
1911 st->skip_samples = 0;
1915 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1919 for (i = 0; i < s->nb_streams; i++) {
1920 AVStream *st = s->streams[i];
1923 av_rescale(timestamp,
1924 st->time_base.den * (int64_t) ref_st->time_base.num,
1925 st->time_base.num * (int64_t) ref_st->time_base.den);
1929 void ff_reduce_index(AVFormatContext *s, int stream_index)
1931 AVStream *st = s->streams[stream_index];
1932 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1934 if ((unsigned) st->nb_index_entries >= max_entries) {
1936 for (i = 0; 2 * i < st->nb_index_entries; i++)
1937 st->index_entries[i] = st->index_entries[2 * i];
1938 st->nb_index_entries = i;
1942 int ff_add_index_entry(AVIndexEntry **index_entries,
1943 int *nb_index_entries,
1944 unsigned int *index_entries_allocated_size,
1945 int64_t pos, int64_t timestamp,
1946 int size, int distance, int flags)
1948 AVIndexEntry *entries, *ie;
1951 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1954 if (timestamp == AV_NOPTS_VALUE)
1955 return AVERROR(EINVAL);
1957 if (size < 0 || size > 0x3FFFFFFF)
1958 return AVERROR(EINVAL);
1960 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1961 timestamp -= RELATIVE_TS_BASE;
1963 entries = av_fast_realloc(*index_entries,
1964 index_entries_allocated_size,
1965 (*nb_index_entries + 1) *
1966 sizeof(AVIndexEntry));
1970 *index_entries = entries;
1972 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
1973 timestamp, AVSEEK_FLAG_ANY);
1976 index = (*nb_index_entries)++;
1977 ie = &entries[index];
1978 av_assert0(index == 0 || ie[-1].timestamp < timestamp);
1980 ie = &entries[index];
1981 if (ie->timestamp != timestamp) {
1982 if (ie->timestamp <= timestamp)
1984 memmove(entries + index + 1, entries + index,
1985 sizeof(AVIndexEntry) * (*nb_index_entries - index));
1986 (*nb_index_entries)++;
1987 } else if (ie->pos == pos && distance < ie->min_distance)
1988 // do not reduce the distance
1989 distance = ie->min_distance;
1993 ie->timestamp = timestamp;
1994 ie->min_distance = distance;
2001 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
2002 int size, int distance, int flags)
2004 timestamp = wrap_timestamp(st, timestamp);
2005 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
2006 &st->index_entries_allocated_size, pos,
2007 timestamp, size, distance, flags);
2010 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
2011 int64_t wanted_timestamp, int flags)
2019 // Optimize appending index entries at the end.
2020 if (b && entries[b - 1].timestamp < wanted_timestamp)
2026 // Search for the next non-discarded packet.
2027 while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b && m < nb_entries - 1) {
2029 if (m == b && entries[m].timestamp >= wanted_timestamp) {
2035 timestamp = entries[m].timestamp;
2036 if (timestamp >= wanted_timestamp)
2038 if (timestamp <= wanted_timestamp)
2041 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
2043 if (!(flags & AVSEEK_FLAG_ANY))
2044 while (m >= 0 && m < nb_entries &&
2045 !(entries[m].flags & AVINDEX_KEYFRAME))
2046 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
2048 if (m == nb_entries)
2053 void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
2056 int64_t pos_delta = 0;
2058 //We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
2059 const char *proto = avio_find_protocol_name(s->filename);
2062 av_log(s, AV_LOG_INFO,
2063 "Protocol name not provided, cannot determine if input is local or "
2064 "a network protocol, buffers and access patterns cannot be configured "
2065 "optimally without knowing the protocol\n");
2068 if (proto && !(strcmp(proto, "file") && strcmp(proto, "pipe") && strcmp(proto, "cache")))
2071 for (ist1 = 0; ist1 < s->nb_streams; ist1++) {
2072 AVStream *st1 = s->streams[ist1];
2073 for (ist2 = 0; ist2 < s->nb_streams; ist2++) {
2074 AVStream *st2 = s->streams[ist2];
2080 for (i1 = i2 = 0; i1 < st1->nb_index_entries; i1++) {
2081 AVIndexEntry *e1 = &st1->index_entries[i1];
2082 int64_t e1_pts = av_rescale_q(e1->timestamp, st1->time_base, AV_TIME_BASE_Q);
2084 skip = FFMAX(skip, e1->size);
2085 for (; i2 < st2->nb_index_entries; i2++) {
2086 AVIndexEntry *e2 = &st2->index_entries[i2];
2087 int64_t e2_pts = av_rescale_q(e2->timestamp, st2->time_base, AV_TIME_BASE_Q);
2088 if (e2_pts - e1_pts < time_tolerance)
2090 pos_delta = FFMAX(pos_delta, e1->pos - e2->pos);
2098 /* XXX This could be adjusted depending on protocol*/
2099 if (s->pb->buffer_size < pos_delta && pos_delta < (1<<24)) {
2100 av_log(s, AV_LOG_VERBOSE, "Reconfiguring buffers to size %"PRId64"\n", pos_delta);
2101 ffio_set_buf_size(s->pb, pos_delta);
2102 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, pos_delta/2);
2105 if (skip < (1<<23)) {
2106 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, skip);
2110 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
2112 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
2113 wanted_timestamp, flags);
2116 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
2117 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2119 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
2120 if (stream_index >= 0)
2121 ts = wrap_timestamp(s->streams[stream_index], ts);
2125 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
2126 int64_t target_ts, int flags)
2128 AVInputFormat *avif = s->iformat;
2129 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
2130 int64_t ts_min, ts_max, ts;
2135 if (stream_index < 0)
2138 av_log(s, AV_LOG_TRACE, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2141 ts_min = AV_NOPTS_VALUE;
2142 pos_limit = -1; // GCC falsely says it may be uninitialized.
2144 st = s->streams[stream_index];
2145 if (st->index_entries) {
2148 /* FIXME: Whole function must be checked for non-keyframe entries in
2149 * index case, especially read_timestamp(). */
2150 index = av_index_search_timestamp(st, target_ts,
2151 flags | AVSEEK_FLAG_BACKWARD);
2152 index = FFMAX(index, 0);
2153 e = &st->index_entries[index];
2155 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
2157 ts_min = e->timestamp;
2158 av_log(s, AV_LOG_TRACE, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
2159 pos_min, av_ts2str(ts_min));
2161 av_assert1(index == 0);
2164 index = av_index_search_timestamp(st, target_ts,
2165 flags & ~AVSEEK_FLAG_BACKWARD);
2166 av_assert0(index < st->nb_index_entries);
2168 e = &st->index_entries[index];
2169 av_assert1(e->timestamp >= target_ts);
2171 ts_max = e->timestamp;
2172 pos_limit = pos_max - e->min_distance;
2173 av_log(s, AV_LOG_TRACE, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
2174 " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
2178 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
2179 ts_min, ts_max, flags, &ts, avif->read_timestamp);
2184 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
2187 ff_read_frame_flush(s);
2188 ff_update_cur_dts(s, st, ts);
2193 int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
2194 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2196 int64_t step = 1024;
2197 int64_t limit, ts_max;
2198 int64_t filesize = avio_size(s->pb);
2199 int64_t pos_max = filesize - 1;
2202 pos_max = FFMAX(0, (pos_max) - step);
2203 ts_max = ff_read_timestamp(s, stream_index,
2204 &pos_max, limit, read_timestamp);
2206 } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
2207 if (ts_max == AV_NOPTS_VALUE)
2211 int64_t tmp_pos = pos_max + 1;
2212 int64_t tmp_ts = ff_read_timestamp(s, stream_index,
2213 &tmp_pos, INT64_MAX, read_timestamp);
2214 if (tmp_ts == AV_NOPTS_VALUE)
2216 av_assert0(tmp_pos > pos_max);
2219 if (tmp_pos >= filesize)
2231 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
2232 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
2233 int64_t ts_min, int64_t ts_max,
2234 int flags, int64_t *ts_ret,
2235 int64_t (*read_timestamp)(struct AVFormatContext *, int,
2236 int64_t *, int64_t))
2243 av_log(s, AV_LOG_TRACE, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2245 if (ts_min == AV_NOPTS_VALUE) {
2246 pos_min = s->internal->data_offset;
2247 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2248 if (ts_min == AV_NOPTS_VALUE)
2252 if (ts_min >= target_ts) {
2257 if (ts_max == AV_NOPTS_VALUE) {
2258 if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
2260 pos_limit = pos_max;
2263 if (ts_max <= target_ts) {
2268 av_assert0(ts_min < ts_max);
2271 while (pos_min < pos_limit) {
2272 av_log(s, AV_LOG_TRACE,
2273 "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
2274 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
2275 av_assert0(pos_limit <= pos_max);
2277 if (no_change == 0) {
2278 int64_t approximate_keyframe_distance = pos_max - pos_limit;
2279 // interpolate position (better than dichotomy)
2280 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
2282 pos_min - approximate_keyframe_distance;
2283 } else if (no_change == 1) {
2284 // bisection if interpolation did not change min / max pos last time
2285 pos = (pos_min + pos_limit) >> 1;
2287 /* linear search if bisection failed, can only happen if there
2288 * are very few or no keyframes between min/max */
2293 else if (pos > pos_limit)
2297 // May pass pos_limit instead of -1.
2298 ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
2303 av_log(s, AV_LOG_TRACE, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
2304 " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
2305 pos_min, pos, pos_max,
2306 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
2307 pos_limit, start_pos, no_change);
2308 if (ts == AV_NOPTS_VALUE) {
2309 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
2312 if (target_ts <= ts) {
2313 pos_limit = start_pos - 1;
2317 if (target_ts >= ts) {
2323 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
2324 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
2327 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2329 ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2330 av_log(s, AV_LOG_TRACE, "pos=0x%"PRIx64" %s<=%s<=%s\n",
2331 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
2337 static int seek_frame_byte(AVFormatContext *s, int stream_index,
2338 int64_t pos, int flags)
2340 int64_t pos_min, pos_max;
2342 pos_min = s->internal->data_offset;
2343 pos_max = avio_size(s->pb) - 1;
2347 else if (pos > pos_max)
2350 avio_seek(s->pb, pos, SEEK_SET);
2352 s->io_repositioned = 1;
2357 static int seek_frame_generic(AVFormatContext *s, int stream_index,
2358 int64_t timestamp, int flags)
2365 st = s->streams[stream_index];
2367 index = av_index_search_timestamp(st, timestamp, flags);
2369 if (index < 0 && st->nb_index_entries &&
2370 timestamp < st->index_entries[0].timestamp)
2373 if (index < 0 || index == st->nb_index_entries - 1) {
2377 if (st->nb_index_entries) {
2378 av_assert0(st->index_entries);
2379 ie = &st->index_entries[st->nb_index_entries - 1];
2380 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2382 ff_update_cur_dts(s, st, ie->timestamp);
2384 if ((ret = avio_seek(s->pb, s->internal->data_offset, SEEK_SET)) < 0)
2390 read_status = av_read_frame(s, &pkt);
2391 } while (read_status == AVERROR(EAGAIN));
2392 if (read_status < 0)
2394 if (stream_index == pkt.stream_index && pkt.dts > timestamp) {
2395 if (pkt.flags & AV_PKT_FLAG_KEY) {
2396 av_packet_unref(&pkt);
2399 if (nonkey++ > 1000 && st->codecpar->codec_id != AV_CODEC_ID_CDGRAPHICS) {
2400 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);
2401 av_packet_unref(&pkt);
2405 av_packet_unref(&pkt);
2407 index = av_index_search_timestamp(st, timestamp, flags);
2412 ff_read_frame_flush(s);
2413 if (s->iformat->read_seek)
2414 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2416 ie = &st->index_entries[index];
2417 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2419 ff_update_cur_dts(s, st, ie->timestamp);
2424 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2425 int64_t timestamp, int flags)
2430 if (flags & AVSEEK_FLAG_BYTE) {
2431 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2433 ff_read_frame_flush(s);
2434 return seek_frame_byte(s, stream_index, timestamp, flags);
2437 if (stream_index < 0) {
2438 stream_index = av_find_default_stream_index(s);
2439 if (stream_index < 0)
2442 st = s->streams[stream_index];
2443 /* timestamp for default must be expressed in AV_TIME_BASE units */
2444 timestamp = av_rescale(timestamp, st->time_base.den,
2445 AV_TIME_BASE * (int64_t) st->time_base.num);
2448 /* first, we try the format specific seek */
2449 if (s->iformat->read_seek) {
2450 ff_read_frame_flush(s);
2451 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2457 if (s->iformat->read_timestamp &&
2458 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2459 ff_read_frame_flush(s);
2460 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2461 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2462 ff_read_frame_flush(s);
2463 return seek_frame_generic(s, stream_index, timestamp, flags);
2468 int av_seek_frame(AVFormatContext *s, int stream_index,
2469 int64_t timestamp, int flags)
2473 if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2474 int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2475 if ((flags & AVSEEK_FLAG_BACKWARD))
2479 return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2480 flags & ~AVSEEK_FLAG_BACKWARD);
2483 ret = seek_frame_internal(s, stream_index, timestamp, flags);
2486 ret = avformat_queue_attached_pictures(s);
2491 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
2492 int64_t ts, int64_t max_ts, int flags)
2494 if (min_ts > ts || max_ts < ts)
2496 if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2497 return AVERROR(EINVAL);
2500 flags |= AVSEEK_FLAG_ANY;
2501 flags &= ~AVSEEK_FLAG_BACKWARD;
2503 if (s->iformat->read_seek2) {
2505 ff_read_frame_flush(s);
2507 if (stream_index == -1 && s->nb_streams == 1) {
2508 AVRational time_base = s->streams[0]->time_base;
2509 ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2510 min_ts = av_rescale_rnd(min_ts, time_base.den,
2511 time_base.num * (int64_t)AV_TIME_BASE,
2512 AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
2513 max_ts = av_rescale_rnd(max_ts, time_base.den,
2514 time_base.num * (int64_t)AV_TIME_BASE,
2515 AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
2519 ret = s->iformat->read_seek2(s, stream_index, min_ts,
2523 ret = avformat_queue_attached_pictures(s);
2527 if (s->iformat->read_timestamp) {
2528 // try to seek via read_timestamp()
2531 // Fall back on old API if new is not implemented but old is.
2532 // Note the old API has somewhat different semantics.
2533 if (s->iformat->read_seek || 1) {
2534 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2535 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2536 if (ret<0 && ts != min_ts && max_ts != ts) {
2537 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2539 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2544 // try some generic seek like seek_frame_generic() but with new ts semantics
2545 return -1; //unreachable
2548 int avformat_flush(AVFormatContext *s)
2550 ff_read_frame_flush(s);
2554 /*******************************************************/
2557 * Return TRUE if the stream has accurate duration in any stream.
2559 * @return TRUE if the stream has accurate duration for at least one component.
2561 static int has_duration(AVFormatContext *ic)
2566 for (i = 0; i < ic->nb_streams; i++) {
2567 st = ic->streams[i];
2568 if (st->duration != AV_NOPTS_VALUE)
2571 if (ic->duration != AV_NOPTS_VALUE)
2577 * Estimate the stream timings from the one of each components.
2579 * Also computes the global bitrate if possible.
2581 static void update_stream_timings(AVFormatContext *ic)
2583 int64_t start_time, start_time1, start_time_text, end_time, end_time1, end_time_text;
2584 int64_t duration, duration1, filesize;
2589 start_time = INT64_MAX;
2590 start_time_text = INT64_MAX;
2591 end_time = INT64_MIN;
2592 end_time_text = INT64_MIN;
2593 duration = INT64_MIN;
2594 for (i = 0; i < ic->nb_streams; i++) {
2595 st = ic->streams[i];
2596 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2597 start_time1 = av_rescale_q(st->start_time, st->time_base,
2599 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
2600 if (start_time1 < start_time_text)
2601 start_time_text = start_time1;
2603 start_time = FFMIN(start_time, start_time1);
2604 end_time1 = av_rescale_q_rnd(st->duration, st->time_base,
2606 AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
2607 if (end_time1 != AV_NOPTS_VALUE && (end_time1 > 0 ? start_time1 <= INT64_MAX - end_time1 : start_time1 >= INT64_MIN - end_time1)) {
2608 end_time1 += start_time1;
2609 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
2610 end_time_text = FFMAX(end_time_text, end_time1);
2612 end_time = FFMAX(end_time, end_time1);
2614 for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
2615 if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2616 p->start_time = start_time1;
2617 if (p->end_time < end_time1)
2618 p->end_time = end_time1;
2621 if (st->duration != AV_NOPTS_VALUE) {
2622 duration1 = av_rescale_q(st->duration, st->time_base,
2624 duration = FFMAX(duration, duration1);
2627 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2628 start_time = start_time_text;
2629 else if (start_time > start_time_text)
2630 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2632 if (end_time == INT64_MIN || (end_time < end_time_text && end_time_text - end_time < AV_TIME_BASE)) {
2633 end_time = end_time_text;
2634 } else if (end_time < end_time_text) {
2635 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream endtime %f\n", end_time_text / (float)AV_TIME_BASE);
2638 if (start_time != INT64_MAX) {
2639 ic->start_time = start_time;
2640 if (end_time != INT64_MIN) {
2641 if (ic->nb_programs > 1) {
2642 for (i = 0; i < ic->nb_programs; i++) {
2643 p = ic->programs[i];
2644 if (p->start_time != AV_NOPTS_VALUE &&
2645 p->end_time > p->start_time &&
2646 p->end_time - (uint64_t)p->start_time <= INT64_MAX)
2647 duration = FFMAX(duration, p->end_time - p->start_time);
2649 } else if (end_time >= start_time && end_time - (uint64_t)start_time <= INT64_MAX) {
2650 duration = FFMAX(duration, end_time - start_time);
2654 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2655 ic->duration = duration;
2657 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration > 0) {
2658 /* compute the bitrate */
2659 double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2660 (double) ic->duration;
2661 if (bitrate >= 0 && bitrate <= INT64_MAX)
2662 ic->bit_rate = bitrate;
2666 static void fill_all_stream_timings(AVFormatContext *ic)
2671 update_stream_timings(ic);
2672 for (i = 0; i < ic->nb_streams; i++) {
2673 st = ic->streams[i];
2674 if (st->start_time == AV_NOPTS_VALUE) {
2675 if (ic->start_time != AV_NOPTS_VALUE)
2676 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
2678 if (ic->duration != AV_NOPTS_VALUE)
2679 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
2685 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2687 int64_t filesize, duration;
2688 int i, show_warning = 0;
2691 /* if bit_rate is already set, we believe it */
2692 if (ic->bit_rate <= 0) {
2693 int64_t bit_rate = 0;
2694 for (i = 0; i < ic->nb_streams; i++) {
2695 st = ic->streams[i];
2696 if (st->codecpar->bit_rate <= 0 && st->internal->avctx->bit_rate > 0)
2697 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
2698 if (st->codecpar->bit_rate > 0) {
2699 if (INT64_MAX - st->codecpar->bit_rate < bit_rate) {
2703 bit_rate += st->codecpar->bit_rate;
2704 } else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && st->codec_info_nb_frames > 1) {
2705 // If we have a videostream with packets but without a bitrate
2706 // then consider the sum not known
2711 ic->bit_rate = bit_rate;
2714 /* if duration is already set, we believe it */
2715 if (ic->duration == AV_NOPTS_VALUE &&
2716 ic->bit_rate != 0) {
2717 filesize = ic->pb ? avio_size(ic->pb) : 0;
2718 if (filesize > ic->internal->data_offset) {
2719 filesize -= ic->internal->data_offset;
2720 for (i = 0; i < ic->nb_streams; i++) {
2721 st = ic->streams[i];
2722 if ( st->time_base.num <= INT64_MAX / ic->bit_rate
2723 && st->duration == AV_NOPTS_VALUE) {
2724 duration = av_rescale(8 * filesize, st->time_base.den,
2726 (int64_t) st->time_base.num);
2727 st->duration = duration;
2734 av_log(ic, AV_LOG_WARNING,
2735 "Estimating duration from bitrate, this may be inaccurate\n");
2738 #define DURATION_MAX_READ_SIZE 250000LL
2739 #define DURATION_MAX_RETRY 6
2741 /* only usable for MPEG-PS streams */
2742 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2744 AVPacket pkt1, *pkt = &pkt1;
2746 int num, den, read_size, i, ret;
2747 int found_duration = 0;
2749 int64_t filesize, offset, duration;
2752 /* flush packet queue */
2753 flush_packet_queue(ic);
2755 for (i = 0; i < ic->nb_streams; i++) {
2756 st = ic->streams[i];
2757 if (st->start_time == AV_NOPTS_VALUE &&
2758 st->first_dts == AV_NOPTS_VALUE &&
2759 st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN)
2760 av_log(ic, AV_LOG_WARNING,
2761 "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2764 av_parser_close(st->parser);
2769 av_opt_set(ic, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN);
2770 /* estimate the end time (duration) */
2771 /* XXX: may need to support wrapping */
2772 filesize = ic->pb ? avio_size(ic->pb) : 0;
2774 is_end = found_duration;
2775 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
2779 avio_seek(ic->pb, offset, SEEK_SET);
2782 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
2786 ret = ff_read_packet(ic, pkt);
2787 } while (ret == AVERROR(EAGAIN));
2790 read_size += pkt->size;
2791 st = ic->streams[pkt->stream_index];
2792 if (pkt->pts != AV_NOPTS_VALUE &&
2793 (st->start_time != AV_NOPTS_VALUE ||
2794 st->first_dts != AV_NOPTS_VALUE)) {
2795 if (pkt->duration == 0) {
2796 ff_compute_frame_duration(ic, &num, &den, st, st->parser, pkt);
2798 pkt->duration = av_rescale_rnd(1,
2799 num * (int64_t) st->time_base.den,
2800 den * (int64_t) st->time_base.num,
2804 duration = pkt->pts + pkt->duration;
2806 if (st->start_time != AV_NOPTS_VALUE)
2807 duration -= st->start_time;
2809 duration -= st->first_dts;
2811 if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
2812 (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2813 st->duration = duration;
2814 st->info->last_duration = duration;
2817 av_packet_unref(pkt);
2820 /* check if all audio/video streams have valid duration */
2823 for (i = 0; i < ic->nb_streams; i++) {
2824 st = ic->streams[i];
2825 switch (st->codecpar->codec_type) {
2826 case AVMEDIA_TYPE_VIDEO:
2827 case AVMEDIA_TYPE_AUDIO:
2828 if (st->duration == AV_NOPTS_VALUE)
2835 ++retry <= DURATION_MAX_RETRY);
2837 av_opt_set(ic, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN);
2839 /* warn about audio/video streams which duration could not be estimated */
2840 for (i = 0; i < ic->nb_streams; i++) {
2841 st = ic->streams[i];
2842 if (st->duration == AV_NOPTS_VALUE) {
2843 switch (st->codecpar->codec_type) {
2844 case AVMEDIA_TYPE_VIDEO:
2845 case AVMEDIA_TYPE_AUDIO:
2846 if (st->start_time != AV_NOPTS_VALUE || st->first_dts != AV_NOPTS_VALUE) {
2847 av_log(ic, AV_LOG_DEBUG, "stream %d : no PTS found at end of file, duration not set\n", i);
2849 av_log(ic, AV_LOG_DEBUG, "stream %d : no TS found at start of file, duration not set\n", i);
2853 fill_all_stream_timings(ic);
2855 avio_seek(ic->pb, old_offset, SEEK_SET);
2856 for (i = 0; i < ic->nb_streams; i++) {
2859 st = ic->streams[i];
2860 st->cur_dts = st->first_dts;
2861 st->last_IP_pts = AV_NOPTS_VALUE;
2862 st->last_dts_for_order_check = AV_NOPTS_VALUE;
2863 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
2864 st->pts_buffer[j] = AV_NOPTS_VALUE;
2868 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2872 /* get the file size, if possible */
2873 if (ic->iformat->flags & AVFMT_NOFILE) {
2876 file_size = avio_size(ic->pb);
2877 file_size = FFMAX(0, file_size);
2880 if ((!strcmp(ic->iformat->name, "mpeg") ||
2881 !strcmp(ic->iformat->name, "mpegts")) &&
2882 file_size && (ic->pb->seekable & AVIO_SEEKABLE_NORMAL)) {
2883 /* get accurate estimate from the PTSes */
2884 estimate_timings_from_pts(ic, old_offset);
2885 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2886 } else if (has_duration(ic)) {
2887 /* at least one component has timings - we use them for all
2889 fill_all_stream_timings(ic);
2890 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2892 /* less precise: use bitrate info */
2893 estimate_timings_from_bit_rate(ic);
2894 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2896 update_stream_timings(ic);
2900 AVStream av_unused *st;
2901 for (i = 0; i < ic->nb_streams; i++) {
2902 st = ic->streams[i];
2903 av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %0.3f duration: %0.3f\n", i,
2904 (double) st->start_time * av_q2d(st->time_base),
2905 (double) st->duration * av_q2d(st->time_base));
2907 av_log(ic, AV_LOG_TRACE,
2908 "format: start_time: %0.3f duration: %0.3f bitrate=%"PRId64" kb/s\n",
2909 (double) ic->start_time / AV_TIME_BASE,
2910 (double) ic->duration / AV_TIME_BASE,
2911 (int64_t)ic->bit_rate / 1000);
2915 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2917 AVCodecContext *avctx = st->internal->avctx;
2919 #define FAIL(errmsg) do { \
2921 *errmsg_ptr = errmsg; \
2925 if ( avctx->codec_id == AV_CODEC_ID_NONE
2926 && avctx->codec_type != AVMEDIA_TYPE_DATA)
2927 FAIL("unknown codec");
2928 switch (avctx->codec_type) {
2929 case AVMEDIA_TYPE_AUDIO:
2930 if (!avctx->frame_size && determinable_frame_size(avctx))
2931 FAIL("unspecified frame size");
2932 if (st->info->found_decoder >= 0 &&
2933 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2934 FAIL("unspecified sample format");
2935 if (!avctx->sample_rate)
2936 FAIL("unspecified sample rate");
2937 if (!avctx->channels)
2938 FAIL("unspecified number of channels");
2939 if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
2940 FAIL("no decodable DTS frames");
2942 case AVMEDIA_TYPE_VIDEO:
2944 FAIL("unspecified size");
2945 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
2946 FAIL("unspecified pixel format");
2947 if (st->codecpar->codec_id == AV_CODEC_ID_RV30 || st->codecpar->codec_id == AV_CODEC_ID_RV40)
2948 if (!st->sample_aspect_ratio.num && !st->codecpar->sample_aspect_ratio.num && !st->codec_info_nb_frames)
2949 FAIL("no frame in rv30/40 and no sar");
2951 case AVMEDIA_TYPE_SUBTITLE:
2952 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
2953 FAIL("unspecified size");
2955 case AVMEDIA_TYPE_DATA:
2956 if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
2962 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2963 static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
2964 AVDictionary **options)
2966 AVCodecContext *avctx = st->internal->avctx;
2967 const AVCodec *codec;
2968 int got_picture = 1, ret = 0;
2969 AVFrame *frame = av_frame_alloc();
2970 AVSubtitle subtitle;
2971 AVPacket pkt = *avpkt;
2972 int do_skip_frame = 0;
2973 enum AVDiscard skip_frame;
2976 return AVERROR(ENOMEM);
2978 if (!avcodec_is_open(avctx) &&
2979 st->info->found_decoder <= 0 &&
2980 (st->codecpar->codec_id != -st->info->found_decoder || !st->codecpar->codec_id)) {
2981 AVDictionary *thread_opt = NULL;
2983 codec = find_probe_decoder(s, st, st->codecpar->codec_id);
2986 st->info->found_decoder = -st->codecpar->codec_id;
2991 /* Force thread count to 1 since the H.264 decoder will not extract
2992 * SPS and PPS to extradata during multi-threaded decoding. */
2993 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2994 if (s->codec_whitelist)
2995 av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
2996 ret = avcodec_open2(avctx, codec, options ? options : &thread_opt);
2998 av_dict_free(&thread_opt);
3000 st->info->found_decoder = -avctx->codec_id;
3003 st->info->found_decoder = 1;
3004 } else if (!st->info->found_decoder)
3005 st->info->found_decoder = 1;
3007 if (st->info->found_decoder < 0) {
3012 if (avpriv_codec_get_cap_skip_frame_fill_param(avctx->codec)) {
3014 skip_frame = avctx->skip_frame;
3015 avctx->skip_frame = AVDISCARD_ALL;
3018 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
3020 (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
3021 (!st->codec_info_nb_frames &&
3022 (avctx->codec->capabilities & AV_CODEC_CAP_CHANNEL_CONF)))) {
3024 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
3025 avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
3026 ret = avcodec_send_packet(avctx, &pkt);
3027 if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3031 ret = avcodec_receive_frame(avctx, frame);
3034 if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
3036 } else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3037 ret = avcodec_decode_subtitle2(avctx, &subtitle,
3038 &got_picture, &pkt);
3044 st->nb_decoded_frames++;
3049 if (!pkt.data && !got_picture)
3053 if (do_skip_frame) {
3054 avctx->skip_frame = skip_frame;
3057 av_frame_free(&frame);
3061 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
3063 while (tags->id != AV_CODEC_ID_NONE) {
3071 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
3074 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3075 if (tag == tags[i].tag)
3077 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3078 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
3080 return AV_CODEC_ID_NONE;
3083 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
3085 if (bps <= 0 || bps > 64)
3086 return AV_CODEC_ID_NONE;
3091 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
3093 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
3095 return AV_CODEC_ID_NONE;
3100 if (sflags & (1 << (bps - 1))) {
3103 return AV_CODEC_ID_PCM_S8;
3105 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
3107 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
3109 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
3111 return be ? AV_CODEC_ID_PCM_S64BE : AV_CODEC_ID_PCM_S64LE;
3113 return AV_CODEC_ID_NONE;
3118 return AV_CODEC_ID_PCM_U8;
3120 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
3122 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
3124 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
3126 return AV_CODEC_ID_NONE;
3132 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
3135 if (!av_codec_get_tag2(tags, id, &tag))
3140 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
3144 for (i = 0; tags && tags[i]; i++) {
3145 const AVCodecTag *codec_tags = tags[i];
3146 while (codec_tags->id != AV_CODEC_ID_NONE) {
3147 if (codec_tags->id == id) {
3148 *tag = codec_tags->tag;
3157 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
3160 for (i = 0; tags && tags[i]; i++) {
3161 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
3162 if (id != AV_CODEC_ID_NONE)
3165 return AV_CODEC_ID_NONE;
3168 static void compute_chapters_end(AVFormatContext *s)
3171 int64_t max_time = 0;
3173 if (s->duration > 0 && s->start_time < INT64_MAX - s->duration)
3174 max_time = s->duration +
3175 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
3177 for (i = 0; i < s->nb_chapters; i++)
3178 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
3179 AVChapter *ch = s->chapters[i];
3180 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
3184 for (j = 0; j < s->nb_chapters; j++) {
3185 AVChapter *ch1 = s->chapters[j];
3186 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
3188 if (j != i && next_start > ch->start && next_start < end)
3191 ch->end = (end == INT64_MAX || end < ch->start) ? ch->start : end;
3195 static int get_std_framerate(int i)
3198 return (i + 1) * 1001;
3202 return (i + 31) * 1001 * 12;
3206 return ((const int[]) { 80, 120, 240})[i] * 1001 * 12;
3210 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
3213 /* Is the time base unreliable?
3214 * This is a heuristic to balance between quick acceptance of the values in
3215 * the headers vs. some extra checks.
3216 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
3217 * MPEG-2 commonly misuses field repeat flags to store different framerates.
3218 * And there are "variable" fps files this needs to detect as well. */
3219 static int tb_unreliable(AVCodecContext *c)
3221 if (c->time_base.den >= 101LL * c->time_base.num ||
3222 c->time_base.den < 5LL * c->time_base.num ||
3223 // c->codec_tag == AV_RL32("DIVX") ||
3224 // c->codec_tag == AV_RL32("XVID") ||
3225 c->codec_tag == AV_RL32("mp4v") ||
3226 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
3227 c->codec_id == AV_CODEC_ID_GIF ||
3228 c->codec_id == AV_CODEC_ID_HEVC ||
3229 c->codec_id == AV_CODEC_ID_H264)
3234 int ff_alloc_extradata(AVCodecParameters *par, int size)
3238 if (size < 0 || size >= INT32_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
3239 par->extradata = NULL;
3240 par->extradata_size = 0;
3241 return AVERROR(EINVAL);
3243 par->extradata = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
3244 if (par->extradata) {
3245 memset(par->extradata + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3246 par->extradata_size = size;
3249 par->extradata_size = 0;
3250 ret = AVERROR(ENOMEM);
3255 int ff_get_extradata(AVFormatContext *s, AVCodecParameters *par, AVIOContext *pb, int size)
3257 int ret = ff_alloc_extradata(par, size);
3260 ret = avio_read(pb, par->extradata, size);
3262 av_freep(&par->extradata);
3263 par->extradata_size = 0;
3264 av_log(s, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
3265 return ret < 0 ? ret : AVERROR_INVALIDDATA;
3271 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
3274 int64_t last = st->info->last_dts;
3276 if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
3277 && ts - (uint64_t)last < INT64_MAX) {
3278 double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
3279 int64_t duration = ts - last;
3281 if (!st->info->duration_error)
3282 st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
3283 if (!st->info->duration_error)
3284 return AVERROR(ENOMEM);
3286 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3287 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
3288 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3289 if (st->info->duration_error[0][1][i] < 1e10) {
3290 int framerate = get_std_framerate(i);
3291 double sdts = dts*framerate/(1001*12);
3292 for (j= 0; j<2; j++) {
3293 int64_t ticks = llrint(sdts+j*0.5);
3294 double error= sdts - ticks + j*0.5;
3295 st->info->duration_error[j][0][i] += error;
3296 st->info->duration_error[j][1][i] += error*error;
3300 st->info->duration_count++;
3301 st->info->rfps_duration_sum += duration;
3303 if (st->info->duration_count % 10 == 0) {
3304 int n = st->info->duration_count;
3305 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3306 if (st->info->duration_error[0][1][i] < 1e10) {
3307 double a0 = st->info->duration_error[0][0][i] / n;
3308 double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
3309 double a1 = st->info->duration_error[1][0][i] / n;
3310 double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
3311 if (error0 > 0.04 && error1 > 0.04) {
3312 st->info->duration_error[0][1][i] = 2e10;
3313 st->info->duration_error[1][1][i] = 2e10;
3319 // ignore the first 4 values, they might have some random jitter
3320 if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
3321 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
3323 if (ts != AV_NOPTS_VALUE)
3324 st->info->last_dts = ts;
3329 void ff_rfps_calculate(AVFormatContext *ic)
3333 for (i = 0; i < ic->nb_streams; i++) {
3334 AVStream *st = ic->streams[i];
3336 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
3338 // the check for tb_unreliable() is not completely correct, since this is not about handling
3339 // an unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3340 // ipmovie.c produces.
3341 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)
3342 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);
3343 if (st->info->duration_count>1 && !st->r_frame_rate.num
3344 && tb_unreliable(st->internal->avctx)) {
3346 double best_error= 0.01;
3347 AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
3349 for (j= 0; j<MAX_STD_TIMEBASES; j++) {
3352 if (st->info->codec_info_duration &&
3353 st->info->codec_info_duration*av_q2d(st->time_base) < (1001*11.5)/get_std_framerate(j))
3355 if (!st->info->codec_info_duration && get_std_framerate(j) < 1001*12)
3358 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
3361 for (k= 0; k<2; k++) {
3362 int n = st->info->duration_count;
3363 double a= st->info->duration_error[k][0][j] / n;
3364 double error= st->info->duration_error[k][1][j]/n - a*a;
3366 if (error < best_error && best_error> 0.000000001) {
3368 num = get_std_framerate(j);
3371 av_log(ic, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
3374 // do not increase frame rate by more than 1 % in order to match a standard rate.
3375 if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
3376 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
3378 if ( !st->avg_frame_rate.num
3379 && st->r_frame_rate.num && st->info->rfps_duration_sum
3380 && st->info->codec_info_duration <= 0
3381 && st->info->duration_count > 2
3382 && 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
3384 av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
3385 st->avg_frame_rate = st->r_frame_rate;
3388 av_freep(&st->info->duration_error);
3389 st->info->last_dts = AV_NOPTS_VALUE;
3390 st->info->duration_count = 0;
3391 st->info->rfps_duration_sum = 0;
3395 static int extract_extradata_check(AVStream *st)
3397 const AVBitStreamFilter *f;
3399 f = av_bsf_get_by_name("extract_extradata");
3404 const enum AVCodecID *ids;
3405 for (ids = f->codec_ids; *ids != AV_CODEC_ID_NONE; ids++)
3406 if (*ids == st->codecpar->codec_id)
3413 static int extract_extradata_init(AVStream *st)
3415 AVStreamInternal *i = st->internal;
3416 const AVBitStreamFilter *f;
3419 f = av_bsf_get_by_name("extract_extradata");
3423 /* check that the codec id is supported */
3424 ret = extract_extradata_check(st);
3428 i->extract_extradata.pkt = av_packet_alloc();
3429 if (!i->extract_extradata.pkt)
3430 return AVERROR(ENOMEM);
3432 ret = av_bsf_alloc(f, &i->extract_extradata.bsf);
3436 ret = avcodec_parameters_copy(i->extract_extradata.bsf->par_in,
3441 i->extract_extradata.bsf->time_base_in = st->time_base;
3443 /* if init fails here, we assume extracting extradata is just not
3444 * supported for this codec, so we return success */
3445 ret = av_bsf_init(i->extract_extradata.bsf);
3447 av_bsf_free(&i->extract_extradata.bsf);
3452 i->extract_extradata.inited = 1;
3456 av_bsf_free(&i->extract_extradata.bsf);
3457 av_packet_free(&i->extract_extradata.pkt);
3461 static int extract_extradata(AVStream *st, AVPacket *pkt)
3463 AVStreamInternal *i = st->internal;
3467 if (!i->extract_extradata.inited) {
3468 ret = extract_extradata_init(st);
3473 if (i->extract_extradata.inited && !i->extract_extradata.bsf)
3476 pkt_ref = i->extract_extradata.pkt;
3477 ret = av_packet_ref(pkt_ref, pkt);
3481 ret = av_bsf_send_packet(i->extract_extradata.bsf, pkt_ref);
3483 av_packet_unref(pkt_ref);
3487 while (ret >= 0 && !i->avctx->extradata) {
3491 ret = av_bsf_receive_packet(i->extract_extradata.bsf, pkt_ref);
3493 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3498 extradata = av_packet_get_side_data(pkt_ref, AV_PKT_DATA_NEW_EXTRADATA,
3502 i->avctx->extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
3503 if (!i->avctx->extradata) {
3504 av_packet_unref(pkt_ref);
3505 return AVERROR(ENOMEM);
3507 memcpy(i->avctx->extradata, extradata, extradata_size);
3508 i->avctx->extradata_size = extradata_size;
3510 av_packet_unref(pkt_ref);
3516 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3518 int i, count = 0, ret = 0, j;
3521 AVCodecContext *avctx;
3522 AVPacket pkt1, *pkt;
3523 int64_t old_offset = avio_tell(ic->pb);
3524 // new streams might appear, no options for those
3525 int orig_nb_streams = ic->nb_streams;
3527 int64_t max_analyze_duration = ic->max_analyze_duration;
3528 int64_t max_stream_analyze_duration;
3529 int64_t max_subtitle_analyze_duration;
3530 int64_t probesize = ic->probesize;
3531 int eof_reached = 0;
3532 int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
3534 flush_codecs = probesize > 0;
3536 av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3538 max_stream_analyze_duration = max_analyze_duration;
3539 max_subtitle_analyze_duration = max_analyze_duration;
3540 if (!max_analyze_duration) {
3541 max_stream_analyze_duration =
3542 max_analyze_duration = 5*AV_TIME_BASE;
3543 max_subtitle_analyze_duration = 30*AV_TIME_BASE;
3544 if (!strcmp(ic->iformat->name, "flv"))
3545 max_stream_analyze_duration = 90*AV_TIME_BASE;
3546 if (!strcmp(ic->iformat->name, "mpeg") || !strcmp(ic->iformat->name, "mpegts"))
3547 max_stream_analyze_duration = 7*AV_TIME_BASE;
3551 av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d nb_streams:%d\n",
3552 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, ic->nb_streams);
3554 for (i = 0; i < ic->nb_streams; i++) {
3555 const AVCodec *codec;
3556 AVDictionary *thread_opt = NULL;
3557 st = ic->streams[i];
3558 avctx = st->internal->avctx;
3560 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3561 st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3562 /* if (!st->time_base.num)
3564 if (!avctx->time_base.num)
3565 avctx->time_base = st->time_base;
3568 /* check if the caller has overridden the codec id */
3569 #if FF_API_LAVF_AVCTX
3570 FF_DISABLE_DEPRECATION_WARNINGS
3571 if (st->codec->codec_id != st->internal->orig_codec_id) {
3572 st->codecpar->codec_id = st->codec->codec_id;
3573 st->codecpar->codec_type = st->codec->codec_type;
3574 st->internal->orig_codec_id = st->codec->codec_id;
3576 FF_ENABLE_DEPRECATION_WARNINGS
3578 // only for the split stuff
3579 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->request_probe <= 0) {
3580 st->parser = av_parser_init(st->codecpar->codec_id);
3582 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3583 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3584 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3585 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3587 } else if (st->need_parsing) {
3588 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3589 "%s, packets or times may be invalid.\n",
3590 avcodec_get_name(st->codecpar->codec_id));
3594 if (st->codecpar->codec_id != st->internal->orig_codec_id)
3595 st->internal->orig_codec_id = st->codecpar->codec_id;
3597 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3599 goto find_stream_info_err;
3600 if (st->request_probe <= 0)
3601 st->internal->avctx_inited = 1;
3603 codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3605 /* Force thread count to 1 since the H.264 decoder will not extract
3606 * SPS and PPS to extradata during multi-threaded decoding. */
3607 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3609 if (ic->codec_whitelist)
3610 av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3612 /* Ensure that subtitle_header is properly set. */
3613 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE
3614 && codec && !avctx->codec) {
3615 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3616 av_log(ic, AV_LOG_WARNING,
3617 "Failed to open codec in %s\n",__FUNCTION__);
3620 // Try to just open decoders, in case this is enough to get parameters.
3621 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3622 if (codec && !avctx->codec)
3623 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3624 av_log(ic, AV_LOG_WARNING,
3625 "Failed to open codec in %s\n",__FUNCTION__);
3628 av_dict_free(&thread_opt);
3631 for (i = 0; i < ic->nb_streams; i++) {
3632 #if FF_API_R_FRAME_RATE
3633 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3635 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3636 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
3641 int analyzed_all_streams;
3642 if (ff_check_interrupt(&ic->interrupt_callback)) {
3644 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3648 /* check if one codec still needs to be handled */
3649 for (i = 0; i < ic->nb_streams; i++) {
3650 int fps_analyze_framecount = 20;
3653 st = ic->streams[i];
3654 if (!has_codec_parameters(st, NULL))
3656 /* If the timebase is coarse (like the usual millisecond precision
3657 * of mkv), we need to analyze more frames to reliably arrive at
3658 * the correct fps. */
3659 if (av_q2d(st->time_base) > 0.0005)
3660 fps_analyze_framecount *= 2;
3661 if (!tb_unreliable(st->internal->avctx))
3662 fps_analyze_framecount = 0;
3663 if (ic->fps_probe_size >= 0)
3664 fps_analyze_framecount = ic->fps_probe_size;
3665 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3666 fps_analyze_framecount = 0;
3667 /* variable fps and no guess at the real fps */
3668 count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
3669 st->info->codec_info_duration_fields/2 :
3670 st->info->duration_count;
3671 if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3672 st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3673 if (count < fps_analyze_framecount)
3676 // Look at the first 3 frames if there is evidence of frame delay
3677 // but the decoder delay is not set.
3678 if (st->info->frame_delay_evidence && count < 2 && st->internal->avctx->has_b_frames == 0)
3680 if (!st->internal->avctx->extradata &&
3681 (!st->internal->extract_extradata.inited ||
3682 st->internal->extract_extradata.bsf) &&
3683 extract_extradata_check(st))
3685 if (st->first_dts == AV_NOPTS_VALUE &&
3686 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3687 st->codec_info_nb_frames < ((st->disposition & AV_DISPOSITION_ATTACHED_PIC) ? 1 : ic->max_ts_probe) &&
3688 (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3689 st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))
3692 analyzed_all_streams = 0;
3693 if (!missing_streams || !*missing_streams)
3694 if (i == ic->nb_streams) {
3695 analyzed_all_streams = 1;
3696 /* NOTE: If the format has no header, then we need to read some
3697 * packets to get most of the streams, so we cannot stop here. */
3698 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3699 /* If we found the info for all the codecs, we can stop. */
3701 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3706 /* We did not get all the codec info, but we read too much data. */
3707 if (read_size >= probesize) {
3709 av_log(ic, AV_LOG_DEBUG,
3710 "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3711 for (i = 0; i < ic->nb_streams; i++)
3712 if (!ic->streams[i]->r_frame_rate.num &&
3713 ic->streams[i]->info->duration_count <= 1 &&
3714 ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
3715 strcmp(ic->iformat->name, "image2"))
3716 av_log(ic, AV_LOG_WARNING,
3717 "Stream #%d: not enough frames to estimate rate; "
3718 "consider increasing probesize\n", i);
3722 /* NOTE: A new stream can be added there if no header in file
3723 * (AVFMTCTX_NOHEADER). */
3724 ret = read_frame_internal(ic, &pkt1);
3725 if (ret == AVERROR(EAGAIN))
3736 if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
3737 ret = add_to_pktbuf(&ic->internal->packet_buffer, pkt,
3738 &ic->internal->packet_buffer_end, 0);
3740 goto find_stream_info_err;
3743 st = ic->streams[pkt->stream_index];
3744 if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3745 read_size += pkt->size;
3747 avctx = st->internal->avctx;
3748 if (!st->internal->avctx_inited) {
3749 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3751 goto find_stream_info_err;
3752 st->internal->avctx_inited = 1;
3755 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3756 /* check for non-increasing dts */
3757 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3758 st->info->fps_last_dts >= pkt->dts) {
3759 av_log(ic, AV_LOG_DEBUG,
3760 "Non-increasing DTS in stream %d: packet %d with DTS "
3761 "%"PRId64", packet %d with DTS %"PRId64"\n",
3762 st->index, st->info->fps_last_dts_idx,
3763 st->info->fps_last_dts, st->codec_info_nb_frames,
3765 st->info->fps_first_dts =
3766 st->info->fps_last_dts = AV_NOPTS_VALUE;
3768 /* Check for a discontinuity in dts. If the difference in dts
3769 * is more than 1000 times the average packet duration in the
3770 * sequence, we treat it as a discontinuity. */
3771 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3772 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3773 (pkt->dts - st->info->fps_last_dts) / 1000 >
3774 (st->info->fps_last_dts - st->info->fps_first_dts) /
3775 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3776 av_log(ic, AV_LOG_WARNING,
3777 "DTS discontinuity in stream %d: packet %d with DTS "
3778 "%"PRId64", packet %d with DTS %"PRId64"\n",
3779 st->index, st->info->fps_last_dts_idx,
3780 st->info->fps_last_dts, st->codec_info_nb_frames,
3782 st->info->fps_first_dts =
3783 st->info->fps_last_dts = AV_NOPTS_VALUE;
3786 /* update stored dts values */
3787 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3788 st->info->fps_first_dts = pkt->dts;
3789 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3791 st->info->fps_last_dts = pkt->dts;
3792 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3794 if (st->codec_info_nb_frames>1) {
3798 if (st->time_base.den > 0)
3799 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3800 if (st->avg_frame_rate.num > 0)
3801 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3804 && st->codec_info_nb_frames>30
3805 && st->info->fps_first_dts != AV_NOPTS_VALUE
3806 && st->info->fps_last_dts != AV_NOPTS_VALUE)
3807 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3809 if (analyzed_all_streams) limit = max_analyze_duration;
3810 else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) limit = max_subtitle_analyze_duration;
3811 else limit = max_stream_analyze_duration;
3814 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds st:%d\n",
3816 t, pkt->stream_index);
3817 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3818 av_packet_unref(pkt);
3821 if (pkt->duration) {
3822 if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE && pkt->pts != AV_NOPTS_VALUE && pkt->pts >= st->start_time) {
3823 st->info->codec_info_duration = FFMIN(pkt->pts - st->start_time, st->info->codec_info_duration + pkt->duration);
3825 st->info->codec_info_duration += pkt->duration;
3826 st->info->codec_info_duration_fields += st->parser && st->need_parsing && avctx->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3829 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3830 #if FF_API_R_FRAME_RATE
3831 ff_rfps_add_frame(ic, st, pkt->dts);
3833 if (pkt->dts != pkt->pts && pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE)
3834 st->info->frame_delay_evidence = 1;
3836 if (!st->internal->avctx->extradata) {
3837 ret = extract_extradata(st, pkt);
3839 goto find_stream_info_err;
3842 /* If still no information, we try to open the codec and to
3843 * decompress the frame. We try to avoid that in most cases as
3844 * it takes longer and uses more memory. For MPEG-4, we need to
3845 * decompress for QuickTime.
3847 * If AV_CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3848 * least one frame of codec data, this makes sure the codec initializes
3849 * the channel configuration and does not only trust the values from
3851 try_decode_frame(ic, st, pkt,
3852 (options && i < orig_nb_streams) ? &options[i] : NULL);
3854 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3855 av_packet_unref(pkt);
3857 st->codec_info_nb_frames++;
3863 for (stream_index = 0; stream_index < ic->nb_streams; stream_index++) {
3864 st = ic->streams[stream_index];
3865 avctx = st->internal->avctx;
3866 if (!has_codec_parameters(st, NULL)) {
3867 const AVCodec *codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3868 if (codec && !avctx->codec) {
3869 AVDictionary *opts = NULL;
3870 if (ic->codec_whitelist)
3871 av_dict_set(&opts, "codec_whitelist", ic->codec_whitelist, 0);
3872 if (avcodec_open2(avctx, codec, (options && stream_index < orig_nb_streams) ? &options[stream_index] : &opts) < 0)
3873 av_log(ic, AV_LOG_WARNING,
3874 "Failed to open codec in %s\n",__FUNCTION__);
3875 av_dict_free(&opts);
3879 // EOF already reached while reading the stream above.
3880 // So continue with reoordering DTS with whatever delay we have.
3881 if (ic->internal->packet_buffer && !has_decode_delay_been_guessed(st)) {
3882 update_dts_from_pts(ic, stream_index, ic->internal->packet_buffer);
3888 AVPacket empty_pkt = { 0 };
3890 av_init_packet(&empty_pkt);
3892 for (i = 0; i < ic->nb_streams; i++) {
3894 st = ic->streams[i];
3896 /* flush the decoders */
3897 if (st->info->found_decoder == 1) {
3899 err = try_decode_frame(ic, st, &empty_pkt,
3900 (options && i < orig_nb_streams)
3901 ? &options[i] : NULL);
3902 } while (err > 0 && !has_codec_parameters(st, NULL));
3905 av_log(ic, AV_LOG_INFO,
3906 "decoding for stream %d failed\n", st->index);
3912 ff_rfps_calculate(ic);
3914 for (i = 0; i < ic->nb_streams; i++) {
3915 st = ic->streams[i];
3916 avctx = st->internal->avctx;
3917 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
3918 if (avctx->codec_id == AV_CODEC_ID_RAWVIDEO && !avctx->codec_tag && !avctx->bits_per_coded_sample) {
3919 uint32_t tag= avcodec_pix_fmt_to_codec_tag(avctx->pix_fmt);
3920 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == avctx->pix_fmt)
3921 avctx->codec_tag= tag;
3924 /* estimate average framerate if not set by demuxer */
3925 if (st->info->codec_info_duration_fields &&
3926 !st->avg_frame_rate.num &&
3927 st->info->codec_info_duration) {
3929 double best_error = 0.01;
3930 AVRational codec_frame_rate = avctx->framerate;
3932 if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
3933 st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
3934 st->info->codec_info_duration < 0)
3936 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3937 st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
3938 st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
3940 /* Round guessed framerate to a "standard" framerate if it's
3941 * within 1% of the original estimate. */
3942 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
3943 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
3944 double error = fabs(av_q2d(st->avg_frame_rate) /
3945 av_q2d(std_fps) - 1);
3947 if (error < best_error) {
3949 best_fps = std_fps.num;
3952 if (ic->internal->prefer_codec_framerate && codec_frame_rate.num > 0 && codec_frame_rate.den > 0) {
3953 error = fabs(av_q2d(codec_frame_rate) /
3954 av_q2d(std_fps) - 1);
3955 if (error < best_error) {
3957 best_fps = std_fps.num;
3962 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3963 best_fps, 12 * 1001, INT_MAX);
3966 if (!st->r_frame_rate.num) {
3967 if ( avctx->time_base.den * (int64_t) st->time_base.num
3968 <= avctx->time_base.num * avctx->ticks_per_frame * (int64_t) st->time_base.den) {
3969 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den,
3970 avctx->time_base.den, (int64_t)avctx->time_base.num * avctx->ticks_per_frame, INT_MAX);
3972 st->r_frame_rate.num = st->time_base.den;
3973 st->r_frame_rate.den = st->time_base.num;
3976 if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
3977 AVRational hw_ratio = { avctx->height, avctx->width };
3978 st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
3981 } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
3982 if (!avctx->bits_per_coded_sample)
3983 avctx->bits_per_coded_sample =
3984 av_get_bits_per_sample(avctx->codec_id);
3985 // set stream disposition based on audio service type
3986 switch (avctx->audio_service_type) {
3987 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
3988 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
3990 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
3991 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
3993 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
3994 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
3996 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
3997 st->disposition = AV_DISPOSITION_COMMENT;
3999 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
4000 st->disposition = AV_DISPOSITION_KARAOKE;
4007 estimate_timings(ic, old_offset);
4009 av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
4011 if (ret >= 0 && ic->nb_streams)
4012 /* We could not have all the codec parameters before EOF. */
4014 for (i = 0; i < ic->nb_streams; i++) {
4016 st = ic->streams[i];
4018 /* if no packet was ever seen, update context now for has_codec_parameters */
4019 if (!st->internal->avctx_inited) {
4020 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
4021 st->codecpar->format == AV_SAMPLE_FMT_NONE)
4022 st->codecpar->format = st->internal->avctx->sample_fmt;
4023 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
4025 goto find_stream_info_err;
4027 if (!has_codec_parameters(st, &errmsg)) {
4029 avcodec_string(buf, sizeof(buf), st->internal->avctx, 0);
4030 av_log(ic, AV_LOG_WARNING,
4031 "Could not find codec parameters for stream %d (%s): %s\n"
4032 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
4039 compute_chapters_end(ic);
4041 /* update the stream parameters from the internal codec contexts */
4042 for (i = 0; i < ic->nb_streams; i++) {
4043 st = ic->streams[i];
4045 if (st->internal->avctx_inited) {
4046 int orig_w = st->codecpar->width;
4047 int orig_h = st->codecpar->height;
4048 ret = avcodec_parameters_from_context(st->codecpar, st->internal->avctx);
4050 goto find_stream_info_err;
4052 // The decoder might reduce the video size by the lowres factor.
4053 if (st->internal->avctx->lowres && orig_w) {
4054 st->codecpar->width = orig_w;
4055 st->codecpar->height = orig_h;
4060 #if FF_API_LAVF_AVCTX
4061 FF_DISABLE_DEPRECATION_WARNINGS
4062 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
4064 goto find_stream_info_err;
4067 // The old API (AVStream.codec) "requires" the resolution to be adjusted
4068 // by the lowres factor.
4069 if (st->internal->avctx->lowres && st->internal->avctx->width) {
4070 st->codec->lowres = st->internal->avctx->lowres;
4071 st->codec->width = st->internal->avctx->width;
4072 st->codec->height = st->internal->avctx->height;
4076 if (st->codec->codec_tag != MKTAG('t','m','c','d')) {
4077 st->codec->time_base = st->internal->avctx->time_base;
4078 st->codec->ticks_per_frame = st->internal->avctx->ticks_per_frame;
4080 st->codec->framerate = st->avg_frame_rate;
4082 if (st->internal->avctx->subtitle_header) {
4083 st->codec->subtitle_header = av_malloc(st->internal->avctx->subtitle_header_size);
4084 if (!st->codec->subtitle_header)
4085 goto find_stream_info_err;
4086 st->codec->subtitle_header_size = st->internal->avctx->subtitle_header_size;
4087 memcpy(st->codec->subtitle_header, st->internal->avctx->subtitle_header,
4088 st->codec->subtitle_header_size);
4091 // Fields unavailable in AVCodecParameters
4092 st->codec->coded_width = st->internal->avctx->coded_width;
4093 st->codec->coded_height = st->internal->avctx->coded_height;
4094 st->codec->properties = st->internal->avctx->properties;
4095 FF_ENABLE_DEPRECATION_WARNINGS
4098 st->internal->avctx_inited = 0;
4101 find_stream_info_err:
4102 for (i = 0; i < ic->nb_streams; i++) {
4103 st = ic->streams[i];
4105 av_freep(&st->info->duration_error);
4106 avcodec_close(ic->streams[i]->internal->avctx);
4107 av_freep(&ic->streams[i]->info);
4108 av_bsf_free(&ic->streams[i]->internal->extract_extradata.bsf);
4109 av_packet_free(&ic->streams[i]->internal->extract_extradata.pkt);
4112 av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
4113 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
4117 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
4121 for (i = 0; i < ic->nb_programs; i++) {
4122 if (ic->programs[i] == last) {
4126 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
4127 if (ic->programs[i]->stream_index[j] == s)
4128 return ic->programs[i];
4134 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
4135 int wanted_stream_nb, int related_stream,
4136 AVCodec **decoder_ret, int flags)
4138 int i, nb_streams = ic->nb_streams;
4139 int ret = AVERROR_STREAM_NOT_FOUND;
4140 int best_count = -1, best_multiframe = -1, best_disposition = -1;
4141 int count, multiframe, disposition;
4142 int64_t best_bitrate = -1;
4144 unsigned *program = NULL;
4145 const AVCodec *decoder = NULL, *best_decoder = NULL;
4147 if (related_stream >= 0 && wanted_stream_nb < 0) {
4148 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
4150 program = p->stream_index;
4151 nb_streams = p->nb_stream_indexes;
4154 for (i = 0; i < nb_streams; i++) {
4155 int real_stream_index = program ? program[i] : i;
4156 AVStream *st = ic->streams[real_stream_index];
4157 AVCodecParameters *par = st->codecpar;
4158 if (par->codec_type != type)
4160 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
4162 if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate))
4165 decoder = find_decoder(ic, st, par->codec_id);
4168 ret = AVERROR_DECODER_NOT_FOUND;
4172 disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED));
4173 count = st->codec_info_nb_frames;
4174 bitrate = par->bit_rate;
4175 multiframe = FFMIN(5, count);
4176 if ((best_disposition > disposition) ||
4177 (best_disposition == disposition && best_multiframe > multiframe) ||
4178 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate > bitrate) ||
4179 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
4181 best_disposition = disposition;
4183 best_bitrate = bitrate;
4184 best_multiframe = multiframe;
4185 ret = real_stream_index;
4186 best_decoder = decoder;
4187 if (program && i == nb_streams - 1 && ret < 0) {
4189 nb_streams = ic->nb_streams;
4190 /* no related stream found, try again with everything */
4195 *decoder_ret = (AVCodec*)best_decoder;
4199 /*******************************************************/
4201 int av_read_play(AVFormatContext *s)
4203 if (s->iformat->read_play)
4204 return s->iformat->read_play(s);
4206 return avio_pause(s->pb, 0);
4207 return AVERROR(ENOSYS);
4210 int av_read_pause(AVFormatContext *s)
4212 if (s->iformat->read_pause)
4213 return s->iformat->read_pause(s);
4215 return avio_pause(s->pb, 1);
4216 return AVERROR(ENOSYS);
4219 int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src)
4224 dst->time_base = src->time_base;
4225 dst->nb_frames = src->nb_frames;
4226 dst->disposition = src->disposition;
4227 dst->sample_aspect_ratio = src->sample_aspect_ratio;
4228 dst->avg_frame_rate = src->avg_frame_rate;
4229 dst->r_frame_rate = src->r_frame_rate;
4231 av_dict_free(&dst->metadata);
4232 ret = av_dict_copy(&dst->metadata, src->metadata, 0);
4236 ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
4240 /* Free existing side data*/
4241 for (i = 0; i < dst->nb_side_data; i++)
4242 av_free(dst->side_data[i].data);
4243 av_freep(&dst->side_data);
4244 dst->nb_side_data = 0;
4246 /* Copy side data if present */
4247 if (src->nb_side_data) {
4248 dst->side_data = av_mallocz_array(src->nb_side_data,
4249 sizeof(AVPacketSideData));
4250 if (!dst->side_data)
4251 return AVERROR(ENOMEM);
4252 dst->nb_side_data = src->nb_side_data;
4254 for (i = 0; i < src->nb_side_data; i++) {
4255 uint8_t *data = av_memdup(src->side_data[i].data,
4256 src->side_data[i].size);
4258 return AVERROR(ENOMEM);
4259 dst->side_data[i].type = src->side_data[i].type;
4260 dst->side_data[i].size = src->side_data[i].size;
4261 dst->side_data[i].data = data;
4265 #if FF_API_LAVF_FFSERVER
4266 FF_DISABLE_DEPRECATION_WARNINGS
4267 av_freep(&dst->recommended_encoder_configuration);
4268 if (src->recommended_encoder_configuration) {
4269 const char *conf_str = src->recommended_encoder_configuration;
4270 dst->recommended_encoder_configuration = av_strdup(conf_str);
4271 if (!dst->recommended_encoder_configuration)
4272 return AVERROR(ENOMEM);
4274 FF_ENABLE_DEPRECATION_WARNINGS
4280 static void free_stream(AVStream **pst)
4282 AVStream *st = *pst;
4288 for (i = 0; i < st->nb_side_data; i++)
4289 av_freep(&st->side_data[i].data);
4290 av_freep(&st->side_data);
4293 av_parser_close(st->parser);
4295 if (st->attached_pic.data)
4296 av_packet_unref(&st->attached_pic);
4299 avcodec_free_context(&st->internal->avctx);
4300 for (i = 0; i < st->internal->nb_bsfcs; i++) {
4301 av_bsf_free(&st->internal->bsfcs[i]);
4302 av_freep(&st->internal->bsfcs);
4304 av_freep(&st->internal->priv_pts);
4305 av_bsf_free(&st->internal->extract_extradata.bsf);
4306 av_packet_free(&st->internal->extract_extradata.pkt);
4308 av_freep(&st->internal);
4310 av_dict_free(&st->metadata);
4311 avcodec_parameters_free(&st->codecpar);
4312 av_freep(&st->probe_data.buf);
4313 av_freep(&st->index_entries);
4314 #if FF_API_LAVF_AVCTX
4315 FF_DISABLE_DEPRECATION_WARNINGS
4316 avcodec_free_context(&st->codec);
4317 FF_ENABLE_DEPRECATION_WARNINGS
4319 av_freep(&st->priv_data);
4321 av_freep(&st->info->duration_error);
4322 av_freep(&st->info);
4323 #if FF_API_LAVF_FFSERVER
4324 FF_DISABLE_DEPRECATION_WARNINGS
4325 av_freep(&st->recommended_encoder_configuration);
4326 FF_ENABLE_DEPRECATION_WARNINGS
4332 void ff_free_stream(AVFormatContext *s, AVStream *st)
4334 av_assert0(s->nb_streams>0);
4335 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
4337 free_stream(&s->streams[ --s->nb_streams ]);
4340 void avformat_free_context(AVFormatContext *s)
4348 if (s->iformat && s->iformat->priv_class && s->priv_data)
4349 av_opt_free(s->priv_data);
4350 if (s->oformat && s->oformat->priv_class && s->priv_data)
4351 av_opt_free(s->priv_data);
4353 for (i = s->nb_streams - 1; i >= 0; i--)
4354 ff_free_stream(s, s->streams[i]);
4357 for (i = s->nb_programs - 1; i >= 0; i--) {
4358 av_dict_free(&s->programs[i]->metadata);
4359 av_freep(&s->programs[i]->stream_index);
4360 av_freep(&s->programs[i]);
4362 av_freep(&s->programs);
4363 av_freep(&s->priv_data);
4364 while (s->nb_chapters--) {
4365 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
4366 av_freep(&s->chapters[s->nb_chapters]);
4368 av_freep(&s->chapters);
4369 av_dict_free(&s->metadata);
4370 av_dict_free(&s->internal->id3v2_meta);
4371 av_freep(&s->streams);
4372 flush_packet_queue(s);
4373 av_freep(&s->internal);
4377 void avformat_close_input(AVFormatContext **ps)
4388 if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
4389 (s->flags & AVFMT_FLAG_CUSTOM_IO))
4392 flush_packet_queue(s);
4395 if (s->iformat->read_close)
4396 s->iformat->read_close(s);
4398 avformat_free_context(s);
4405 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
4411 if (s->nb_streams >= FFMIN(s->max_streams, INT_MAX/sizeof(*streams))) {
4412 if (s->max_streams < INT_MAX/sizeof(*streams))
4413 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);
4416 streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
4419 s->streams = streams;
4421 st = av_mallocz(sizeof(AVStream));
4424 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
4428 st->info->last_dts = AV_NOPTS_VALUE;
4430 #if FF_API_LAVF_AVCTX
4431 FF_DISABLE_DEPRECATION_WARNINGS
4432 st->codec = avcodec_alloc_context3(c);
4438 FF_ENABLE_DEPRECATION_WARNINGS
4441 st->internal = av_mallocz(sizeof(*st->internal));
4445 st->codecpar = avcodec_parameters_alloc();
4449 st->internal->avctx = avcodec_alloc_context3(NULL);
4450 if (!st->internal->avctx)
4454 #if FF_API_LAVF_AVCTX
4455 FF_DISABLE_DEPRECATION_WARNINGS
4456 /* no default bitrate if decoding */
4457 st->codec->bit_rate = 0;
4458 FF_ENABLE_DEPRECATION_WARNINGS
4461 /* default pts setting is MPEG-like */
4462 avpriv_set_pts_info(st, 33, 1, 90000);
4463 /* we set the current DTS to 0 so that formats without any timestamps
4464 * but durations get some timestamps, formats with some unknown
4465 * timestamps have their first few packets buffered and the
4466 * timestamps corrected before they are returned to the user */
4467 st->cur_dts = RELATIVE_TS_BASE;
4469 st->cur_dts = AV_NOPTS_VALUE;
4472 st->index = s->nb_streams;
4473 st->start_time = AV_NOPTS_VALUE;
4474 st->duration = AV_NOPTS_VALUE;
4475 st->first_dts = AV_NOPTS_VALUE;
4476 st->probe_packets = MAX_PROBE_PACKETS;
4477 st->pts_wrap_reference = AV_NOPTS_VALUE;
4478 st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4480 st->last_IP_pts = AV_NOPTS_VALUE;
4481 st->last_dts_for_order_check = AV_NOPTS_VALUE;
4482 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
4483 st->pts_buffer[i] = AV_NOPTS_VALUE;
4485 st->sample_aspect_ratio = (AVRational) { 0, 1 };
4487 #if FF_API_R_FRAME_RATE
4488 st->info->last_dts = AV_NOPTS_VALUE;
4490 st->info->fps_first_dts = AV_NOPTS_VALUE;
4491 st->info->fps_last_dts = AV_NOPTS_VALUE;
4493 st->inject_global_side_data = s->internal->inject_global_side_data;
4495 st->internal->need_context_update = 1;
4497 s->streams[s->nb_streams++] = st;
4504 AVProgram *av_new_program(AVFormatContext *ac, int id)
4506 AVProgram *program = NULL;
4509 av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
4511 for (i = 0; i < ac->nb_programs; i++)
4512 if (ac->programs[i]->id == id)
4513 program = ac->programs[i];
4516 program = av_mallocz(sizeof(AVProgram));
4519 dynarray_add(&ac->programs, &ac->nb_programs, program);
4520 program->discard = AVDISCARD_NONE;
4523 program->pts_wrap_reference = AV_NOPTS_VALUE;
4524 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4526 program->start_time =
4527 program->end_time = AV_NOPTS_VALUE;
4532 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
4533 int64_t start, int64_t end, const char *title)
4535 AVChapter *chapter = NULL;
4538 if (end != AV_NOPTS_VALUE && start > end) {
4539 av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
4543 for (i = 0; i < s->nb_chapters; i++)
4544 if (s->chapters[i]->id == id)
4545 chapter = s->chapters[i];
4548 chapter = av_mallocz(sizeof(AVChapter));
4551 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
4553 av_dict_set(&chapter->metadata, "title", title, 0);
4555 chapter->time_base = time_base;
4556 chapter->start = start;
4562 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
4565 AVProgram *program = NULL;
4568 if (idx >= ac->nb_streams) {
4569 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
4573 for (i = 0; i < ac->nb_programs; i++) {
4574 if (ac->programs[i]->id != progid)
4576 program = ac->programs[i];
4577 for (j = 0; j < program->nb_stream_indexes; j++)
4578 if (program->stream_index[j] == idx)
4581 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
4584 program->stream_index = tmp;
4585 program->stream_index[program->nb_stream_indexes++] = idx;
4590 uint64_t ff_ntp_time(void)
4592 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
4595 int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags)
4598 char *q, buf1[20], c;
4599 int nd, len, percentd_found;
4611 while (av_isdigit(*p))
4612 nd = nd * 10 + *p++ - '0';
4614 } while (av_isdigit(c));
4620 if (!(flags & AV_FRAME_FILENAME_FLAGS_MULTIPLE) && percentd_found)
4625 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
4627 if ((q - buf + len) > buf_size - 1)
4629 memcpy(q, buf1, len);
4637 if ((q - buf) < buf_size - 1)
4641 if (!percentd_found)
4650 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
4652 return av_get_frame_filename2(buf, buf_size, path, number, 0);
4655 void av_url_split(char *proto, int proto_size,
4656 char *authorization, int authorization_size,
4657 char *hostname, int hostname_size,
4658 int *port_ptr, char *path, int path_size, const char *url)
4660 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
4666 if (authorization_size > 0)
4667 authorization[0] = 0;
4668 if (hostname_size > 0)
4673 /* parse protocol */
4674 if ((p = strchr(url, ':'))) {
4675 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4682 /* no protocol means plain filename */
4683 av_strlcpy(path, url, path_size);
4687 /* separate path from hostname */
4688 ls = strchr(p, '/');
4689 ls2 = strchr(p, '?');
4693 ls = FFMIN(ls, ls2);
4695 av_strlcpy(path, ls, path_size);
4697 ls = &p[strlen(p)]; // XXX
4699 /* the rest is hostname, use that to parse auth/port */
4701 /* authorization (user[:pass]@hostname) */
4703 while ((at = strchr(p, '@')) && at < ls) {
4704 av_strlcpy(authorization, at2,
4705 FFMIN(authorization_size, at + 1 - at2));
4706 p = at + 1; /* skip '@' */
4709 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4711 av_strlcpy(hostname, p + 1,
4712 FFMIN(hostname_size, brk - p));
4713 if (brk[1] == ':' && port_ptr)
4714 *port_ptr = atoi(brk + 2);
4715 } else if ((col = strchr(p, ':')) && col < ls) {
4716 av_strlcpy(hostname, p,
4717 FFMIN(col + 1 - p, hostname_size));
4719 *port_ptr = atoi(col + 1);
4721 av_strlcpy(hostname, p,
4722 FFMIN(ls + 1 - p, hostname_size));
4726 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4729 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4732 'C', 'D', 'E', 'F' };
4733 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4736 'c', 'd', 'e', 'f' };
4737 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4739 for (i = 0; i < s; i++) {
4740 buff[i * 2] = hex_table[src[i] >> 4];
4741 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4747 int ff_hex_to_data(uint8_t *data, const char *p)
4754 p += strspn(p, SPACE_CHARS);
4757 c = av_toupper((unsigned char) *p++);
4758 if (c >= '0' && c <= '9')
4760 else if (c >= 'A' && c <= 'F')
4775 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4776 unsigned int pts_num, unsigned int pts_den)
4779 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
4780 if (new_tb.num != pts_num)
4781 av_log(NULL, AV_LOG_DEBUG,
4782 "st:%d removing common factor %d from timebase\n",
4783 s->index, pts_num / new_tb.num);
4785 av_log(NULL, AV_LOG_WARNING,
4786 "st:%d has too large timebase, reducing\n", s->index);
4788 if (new_tb.num <= 0 || new_tb.den <= 0) {
4789 av_log(NULL, AV_LOG_ERROR,
4790 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4791 new_tb.num, new_tb.den,
4795 s->time_base = new_tb;
4796 #if FF_API_LAVF_AVCTX
4797 FF_DISABLE_DEPRECATION_WARNINGS
4798 s->codec->pkt_timebase = new_tb;
4799 FF_ENABLE_DEPRECATION_WARNINGS
4801 s->internal->avctx->pkt_timebase = new_tb;
4802 s->pts_wrap_bits = pts_wrap_bits;
4805 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4808 const char *ptr = str;
4810 /* Parse key=value pairs. */
4813 char *dest = NULL, *dest_end;
4814 int key_len, dest_len = 0;
4816 /* Skip whitespace and potential commas. */
4817 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4824 if (!(ptr = strchr(key, '=')))
4827 key_len = ptr - key;
4829 callback_get_buf(context, key, key_len, &dest, &dest_len);
4830 dest_end = dest + dest_len - 1;
4834 while (*ptr && *ptr != '\"') {
4838 if (dest && dest < dest_end)
4842 if (dest && dest < dest_end)
4850 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
4851 if (dest && dest < dest_end)
4859 int ff_find_stream_index(AVFormatContext *s, int id)
4862 for (i = 0; i < s->nb_streams; i++)
4863 if (s->streams[i]->id == id)
4868 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
4872 unsigned int codec_tag;
4873 if (ofmt->query_codec)
4874 return ofmt->query_codec(codec_id, std_compliance);
4875 else if (ofmt->codec_tag)
4876 return !!av_codec_get_tag2(ofmt->codec_tag, codec_id, &codec_tag);
4877 else if (codec_id == ofmt->video_codec ||
4878 codec_id == ofmt->audio_codec ||
4879 codec_id == ofmt->subtitle_codec ||
4880 codec_id == ofmt->data_codec)
4883 return AVERROR_PATCHWELCOME;
4886 int avformat_network_init(void)
4890 if ((ret = ff_network_init()) < 0)
4892 if ((ret = ff_tls_init()) < 0)
4898 int avformat_network_deinit(void)
4907 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4908 uint64_t channel_layout, int32_t sample_rate,
4909 int32_t width, int32_t height)
4915 return AVERROR(EINVAL);
4918 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4920 if (channel_layout) {
4922 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4926 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4928 if (width || height) {
4930 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4932 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4934 return AVERROR(ENOMEM);
4935 bytestream_put_le32(&data, flags);
4937 bytestream_put_le32(&data, channels);
4939 bytestream_put_le64(&data, channel_layout);
4941 bytestream_put_le32(&data, sample_rate);
4942 if (width || height) {
4943 bytestream_put_le32(&data, width);
4944 bytestream_put_le32(&data, height);
4949 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
4951 AVRational undef = {0, 1};
4952 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
4953 AVRational codec_sample_aspect_ratio = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
4954 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
4956 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
4957 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
4958 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
4959 stream_sample_aspect_ratio = undef;
4961 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
4962 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
4963 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
4964 frame_sample_aspect_ratio = undef;
4966 if (stream_sample_aspect_ratio.num)
4967 return stream_sample_aspect_ratio;
4969 return frame_sample_aspect_ratio;
4972 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
4974 AVRational fr = st->r_frame_rate;
4975 AVRational codec_fr = st->internal->avctx->framerate;
4976 AVRational avg_fr = st->avg_frame_rate;
4978 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
4979 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
4984 if (st->internal->avctx->ticks_per_frame > 1) {
4985 if ( codec_fr.num > 0 && codec_fr.den > 0 &&
4986 (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))
4993 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
4996 if (*spec <= '9' && *spec >= '0') /* opt:index */
4997 return strtol(spec, NULL, 0) == st->index;
4998 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
4999 *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
5000 enum AVMediaType type;
5004 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
5005 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
5006 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
5007 case 'd': type = AVMEDIA_TYPE_DATA; break;
5008 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
5009 case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
5010 default: av_assert0(0);
5012 #if FF_API_LAVF_AVCTX
5013 FF_DISABLE_DEPRECATION_WARNINGS
5014 if (type != st->codecpar->codec_type
5015 && (st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN || st->codec->codec_type != type))
5017 FF_ENABLE_DEPRECATION_WARNINGS
5019 if (type != st->codecpar->codec_type)
5022 if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
5024 if (*spec++ == ':') { /* possibly followed by :index */
5025 int i, index = strtol(spec, NULL, 0);
5026 for (i = 0; i < s->nb_streams; i++) {
5027 #if FF_API_LAVF_AVCTX
5028 FF_DISABLE_DEPRECATION_WARNINGS
5029 if ((s->streams[i]->codecpar->codec_type == type
5030 || s->streams[i]->codec->codec_type == type
5032 !(nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) &&
5034 return i == st->index;
5035 FF_ENABLE_DEPRECATION_WARNINGS
5037 if ((s->streams[i]->codecpar->codec_type == type) &&
5038 !(nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) &&
5040 return i == st->index;
5046 } else if (*spec == 'p' && *(spec + 1) == ':') {
5050 prog_id = strtol(spec, &endptr, 0);
5051 for (i = 0; i < s->nb_programs; i++) {
5052 if (s->programs[i]->id != prog_id)
5055 if (*endptr++ == ':') {
5056 int stream_idx = strtol(endptr, NULL, 0);
5057 return stream_idx >= 0 &&
5058 stream_idx < s->programs[i]->nb_stream_indexes &&
5059 st->index == s->programs[i]->stream_index[stream_idx];
5062 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
5063 if (st->index == s->programs[i]->stream_index[j])
5067 } else if (*spec == '#' ||
5068 (*spec == 'i' && *(spec + 1) == ':')) {
5071 spec += 1 + (*spec == 'i');
5072 stream_id = strtol(spec, &endptr, 0);
5074 return stream_id == st->id;
5075 } else if (*spec == 'm' && *(spec + 1) == ':') {
5076 AVDictionaryEntry *tag;
5081 val = strchr(spec, ':');
5083 key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
5085 return AVERROR(ENOMEM);
5087 tag = av_dict_get(st->metadata, key, NULL, 0);
5089 if (!val || !strcmp(tag->value, val + 1))
5098 } else if (*spec == 'u') {
5099 AVCodecParameters *par = st->codecpar;
5100 #if FF_API_LAVF_AVCTX
5101 FF_DISABLE_DEPRECATION_WARNINGS
5102 AVCodecContext *codec = st->codec;
5103 FF_ENABLE_DEPRECATION_WARNINGS
5106 switch (par->codec_type) {
5107 case AVMEDIA_TYPE_AUDIO:
5108 val = par->sample_rate && par->channels;
5109 #if FF_API_LAVF_AVCTX
5110 val = val || (codec->sample_rate && codec->channels);
5112 if (par->format == AV_SAMPLE_FMT_NONE
5113 #if FF_API_LAVF_AVCTX
5114 && codec->sample_fmt == AV_SAMPLE_FMT_NONE
5119 case AVMEDIA_TYPE_VIDEO:
5120 val = par->width && par->height;
5121 #if FF_API_LAVF_AVCTX
5122 val = val || (codec->width && codec->height);
5124 if (par->format == AV_PIX_FMT_NONE
5125 #if FF_API_LAVF_AVCTX
5126 && codec->pix_fmt == AV_PIX_FMT_NONE
5131 case AVMEDIA_TYPE_UNKNOWN:
5138 #if FF_API_LAVF_AVCTX
5139 return (par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0;
5141 return par->codec_id != AV_CODEC_ID_NONE && val != 0;
5143 } else if (!*spec) /* empty specifier, matches everything */
5146 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
5147 return AVERROR(EINVAL);
5150 int ff_generate_avci_extradata(AVStream *st)
5152 static const uint8_t avci100_1080p_extradata[] = {
5154 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5155 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5156 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5157 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
5158 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
5159 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
5160 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
5161 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
5162 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5164 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5167 static const uint8_t avci100_1080i_extradata[] = {
5169 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5170 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5171 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5172 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
5173 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
5174 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
5175 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
5176 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
5177 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
5178 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
5179 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
5181 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5184 static const uint8_t avci50_1080p_extradata[] = {
5186 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5187 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5188 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5189 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5190 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5191 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
5192 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
5193 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
5194 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
5196 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5199 static const uint8_t avci50_1080i_extradata[] = {
5201 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5202 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5203 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5204 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
5205 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
5206 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
5207 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
5208 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
5209 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
5210 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
5211 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
5213 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5216 static const uint8_t avci100_720p_extradata[] = {
5218 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5219 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
5220 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
5221 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
5222 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
5223 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
5224 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
5225 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
5226 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
5227 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
5229 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
5232 static const uint8_t avci50_720p_extradata[] = {
5234 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
5235 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5236 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5237 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5238 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5239 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
5240 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
5241 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
5242 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
5244 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5248 const uint8_t *data = NULL;
5251 if (st->codecpar->width == 1920) {
5252 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5253 data = avci100_1080p_extradata;
5254 size = sizeof(avci100_1080p_extradata);
5256 data = avci100_1080i_extradata;
5257 size = sizeof(avci100_1080i_extradata);
5259 } else if (st->codecpar->width == 1440) {
5260 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5261 data = avci50_1080p_extradata;
5262 size = sizeof(avci50_1080p_extradata);
5264 data = avci50_1080i_extradata;
5265 size = sizeof(avci50_1080i_extradata);
5267 } else if (st->codecpar->width == 1280) {
5268 data = avci100_720p_extradata;
5269 size = sizeof(avci100_720p_extradata);
5270 } else if (st->codecpar->width == 960) {
5271 data = avci50_720p_extradata;
5272 size = sizeof(avci50_720p_extradata);
5278 av_freep(&st->codecpar->extradata);
5279 if (ff_alloc_extradata(st->codecpar, size))
5280 return AVERROR(ENOMEM);
5281 memcpy(st->codecpar->extradata, data, size);
5286 uint8_t *av_stream_get_side_data(const AVStream *st,
5287 enum AVPacketSideDataType type, int *size)
5291 for (i = 0; i < st->nb_side_data; i++) {
5292 if (st->side_data[i].type == type) {
5294 *size = st->side_data[i].size;
5295 return st->side_data[i].data;
5301 int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
5302 uint8_t *data, size_t size)
5304 AVPacketSideData *sd, *tmp;
5307 for (i = 0; i < st->nb_side_data; i++) {
5308 sd = &st->side_data[i];
5310 if (sd->type == type) {
5311 av_freep(&sd->data);
5318 if ((unsigned)st->nb_side_data + 1 >= INT_MAX / sizeof(*st->side_data))
5319 return AVERROR(ERANGE);
5321 tmp = av_realloc(st->side_data, (st->nb_side_data + 1) * sizeof(*tmp));
5323 return AVERROR(ENOMEM);
5326 st->side_data = tmp;
5329 sd = &st->side_data[st->nb_side_data - 1];
5337 uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
5341 uint8_t *data = av_malloc(size);
5346 ret = av_stream_add_side_data(st, type, data, size);
5355 int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
5358 const AVBitStreamFilter *bsf;
5360 AVCodecParameters *in_par;
5362 if (!(bsf = av_bsf_get_by_name(name))) {
5363 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter '%s'\n", name);
5364 return AVERROR_BSF_NOT_FOUND;
5367 if ((ret = av_bsf_alloc(bsf, &bsfc)) < 0)
5370 if (st->internal->nb_bsfcs) {
5371 in_par = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->par_out;
5372 bsfc->time_base_in = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->time_base_out;
5374 in_par = st->codecpar;
5375 bsfc->time_base_in = st->time_base;
5378 if ((ret = avcodec_parameters_copy(bsfc->par_in, in_par)) < 0) {
5383 if (args && bsfc->filter->priv_class) {
5384 const AVOption *opt = av_opt_next(bsfc->priv_data, NULL);
5385 const char * shorthand[2] = {NULL};
5388 shorthand[0] = opt->name;
5390 if ((ret = av_opt_set_from_string(bsfc->priv_data, args, shorthand, "=", ":")) < 0) {
5396 if ((ret = av_bsf_init(bsfc)) < 0) {
5401 if ((ret = av_dynarray_add_nofree(&st->internal->bsfcs, &st->internal->nb_bsfcs, bsfc))) {
5406 av_log(NULL, AV_LOG_VERBOSE,
5407 "Automatically inserted bitstream filter '%s'; args='%s'\n",
5408 name, args ? args : "");
5413 FF_DISABLE_DEPRECATION_WARNINGS
5414 int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt,
5415 AVBitStreamFilterContext *bsfc)
5419 AVPacket new_pkt = *pkt;
5420 int a = av_bitstream_filter_filter(bsfc, codec, NULL,
5421 &new_pkt.data, &new_pkt.size,
5422 pkt->data, pkt->size,
5423 pkt->flags & AV_PKT_FLAG_KEY);
5424 if (a == 0 && new_pkt.size == 0 && new_pkt.side_data_elems == 0) {
5425 av_packet_unref(pkt);
5426 memset(pkt, 0, sizeof(*pkt));
5429 if(a == 0 && new_pkt.data != pkt->data) {
5430 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
5432 memcpy(t, new_pkt.data, new_pkt.size);
5433 memset(t + new_pkt.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
5438 a = AVERROR(ENOMEM);
5442 new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
5443 av_buffer_default_free, NULL, 0);
5445 pkt->side_data = NULL;
5446 pkt->side_data_elems = 0;
5447 av_packet_unref(pkt);
5449 av_freep(&new_pkt.data);
5450 a = AVERROR(ENOMEM);
5454 av_log(codec, AV_LOG_ERROR,
5455 "Failed to open bitstream filter %s for stream %d with codec %s",
5456 bsfc->filter->name, pkt->stream_index,
5457 codec->codec ? codec->codec->name : "copy");
5467 FF_ENABLE_DEPRECATION_WARNINGS
5470 int ff_format_output_open(AVFormatContext *s, const char *url, AVDictionary **options)
5473 return AVERROR(EINVAL);
5475 if (!(s->oformat->flags & AVFMT_NOFILE))
5476 return s->io_open(s, &s->pb, url, AVIO_FLAG_WRITE, options);
5480 void ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
5483 s->io_close(s, *pb);
5487 int ff_is_http_proto(char *filename) {
5488 const char *proto = avio_find_protocol_name(filename);
5489 return proto ? (!av_strcasecmp(proto, "http") || !av_strcasecmp(proto, "https")) : 0;
5492 int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
5494 AVDictionaryEntry *entry;
5495 int64_t parsed_timestamp;
5497 if ((entry = av_dict_get(s->metadata, "creation_time", NULL, 0))) {
5498 if ((ret = av_parse_time(&parsed_timestamp, entry->value, 0)) >= 0) {
5499 *timestamp = return_seconds ? parsed_timestamp / 1000000 : parsed_timestamp;
5502 av_log(s, AV_LOG_WARNING, "Failed to parse creation_time %s\n", entry->value);
5509 int ff_standardize_creation_time(AVFormatContext *s)
5512 int ret = ff_parse_creation_time_metadata(s, ×tamp, 0);
5514 return avpriv_dict_set_timestamp(&s->metadata, "creation_time", timestamp);
5518 int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette)
5523 side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &size);
5525 if (size != AVPALETTE_SIZE) {
5526 av_log(s, AV_LOG_ERROR, "Invalid palette side data\n");
5527 return AVERROR_INVALIDDATA;
5529 memcpy(palette, side_data, AVPALETTE_SIZE);
5533 if (ret == CONTAINS_PAL) {
5535 for (i = 0; i < AVPALETTE_COUNT; i++)
5536 palette[i] = AV_RL32(pkt->data + pkt->size - AVPALETTE_SIZE + i*4);
5543 int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf)
5548 ret = av_bprint_finalize(buf, &str);
5551 if (!av_bprint_is_complete(buf)) {
5553 return AVERROR(ENOMEM);
5556 par->extradata = str;
5557 /* Note: the string is NUL terminated (so extradata can be read as a
5558 * string), but the ending character is not accounted in the size (in
5559 * binary formats you are likely not supposed to mux that character). When
5560 * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE
5562 par->extradata_size = buf->len;
5566 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
5567 AVStream *ost, const AVStream *ist,
5568 enum AVTimebaseSource copy_tb)
5570 //TODO: use [io]st->internal->avctx
5571 const AVCodecContext *dec_ctx = ist->codec;
5572 AVCodecContext *enc_ctx = ost->codec;
5574 enc_ctx->time_base = ist->time_base;
5576 * Avi is a special case here because it supports variable fps but
5577 * having the fps and timebase differe significantly adds quite some
5580 if (!strcmp(ofmt->name, "avi")) {
5581 #if FF_API_R_FRAME_RATE
5582 if (copy_tb == AVFMT_TBCF_AUTO && ist->r_frame_rate.num
5583 && av_q2d(ist->r_frame_rate) >= av_q2d(ist->avg_frame_rate)
5584 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(ist->time_base)
5585 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx->time_base)
5586 && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx->time_base) < 1.0/500
5587 || copy_tb == AVFMT_TBCF_R_FRAMERATE) {
5588 enc_ctx->time_base.num = ist->r_frame_rate.den;
5589 enc_ctx->time_base.den = 2*ist->r_frame_rate.num;
5590 enc_ctx->ticks_per_frame = 2;
5593 if (copy_tb == AVFMT_TBCF_AUTO && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > 2*av_q2d(ist->time_base)
5594 && av_q2d(ist->time_base) < 1.0/500
5595 || copy_tb == AVFMT_TBCF_DECODER) {
5596 enc_ctx->time_base = dec_ctx->time_base;
5597 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5598 enc_ctx->time_base.den *= 2;
5599 enc_ctx->ticks_per_frame = 2;
5601 } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS)
5602 && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
5603 if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx->time_base.den
5604 && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > av_q2d(ist->time_base)
5605 && av_q2d(ist->time_base) < 1.0/500
5606 || copy_tb == AVFMT_TBCF_DECODER) {
5607 enc_ctx->time_base = dec_ctx->time_base;
5608 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5612 if ((enc_ctx->codec_tag == AV_RL32("tmcd") || ost->codecpar->codec_tag == AV_RL32("tmcd"))
5613 && dec_ctx->time_base.num < dec_ctx->time_base.den
5614 && dec_ctx->time_base.num > 0
5615 && 121LL*dec_ctx->time_base.num > dec_ctx->time_base.den) {
5616 enc_ctx->time_base = dec_ctx->time_base;
5619 if (ost->avg_frame_rate.num)
5620 enc_ctx->time_base = av_inv_q(ost->avg_frame_rate);
5622 av_reduce(&enc_ctx->time_base.num, &enc_ctx->time_base.den,
5623 enc_ctx->time_base.num, enc_ctx->time_base.den, INT_MAX);
5628 AVRational av_stream_get_codec_timebase(const AVStream *st)
5630 // See avformat_transfer_internal_stream_timing_info() TODO.
5631 #if FF_API_LAVF_AVCTX
5632 FF_DISABLE_DEPRECATION_WARNINGS
5633 return st->codec->time_base;
5634 FF_ENABLE_DEPRECATION_WARNINGS
5636 return st->internal->avctx->time_base;