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 const 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 int ff_packet_list_put(AVPacketList **packet_buffer,
448 AVPacketList **plast_pktl,
449 AVPacket *pkt, int flags)
451 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
455 return AVERROR(ENOMEM);
457 if (flags & FF_PACKETLIST_FLAG_REF_PACKET) {
458 if ((ret = av_packet_ref(&pktl->pkt, pkt)) < 0) {
463 av_packet_move_ref(&pktl->pkt, pkt);
467 (*plast_pktl)->next = pktl;
469 *packet_buffer = pktl;
471 /* Add the packet in the buffered packet list. */
476 int avformat_queue_attached_pictures(AVFormatContext *s)
479 for (i = 0; i < s->nb_streams; i++)
480 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
481 s->streams[i]->discard < AVDISCARD_ALL) {
482 if (s->streams[i]->attached_pic.size <= 0) {
483 av_log(s, AV_LOG_WARNING,
484 "Attached picture on stream %d has invalid size, "
489 ret = ff_packet_list_put(&s->internal->raw_packet_buffer,
490 &s->internal->raw_packet_buffer_end,
491 &s->streams[i]->attached_pic,
492 FF_PACKETLIST_FLAG_REF_PACKET);
499 static int update_stream_avctx(AVFormatContext *s)
502 for (i = 0; i < s->nb_streams; i++) {
503 AVStream *st = s->streams[i];
505 if (!st->internal->need_context_update)
508 /* close parser, because it depends on the codec */
509 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
510 av_parser_close(st->parser);
514 /* update internal codec context, for the parser */
515 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
519 #if FF_API_LAVF_AVCTX
520 FF_DISABLE_DEPRECATION_WARNINGS
521 /* update deprecated public codec context */
522 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
525 FF_ENABLE_DEPRECATION_WARNINGS
528 st->internal->need_context_update = 0;
534 int avformat_open_input(AVFormatContext **ps, const char *filename,
535 ff_const59 AVInputFormat *fmt, AVDictionary **options)
537 AVFormatContext *s = *ps;
539 AVDictionary *tmp = NULL;
540 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
542 if (!s && !(s = avformat_alloc_context()))
543 return AVERROR(ENOMEM);
545 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
546 return AVERROR(EINVAL);
552 av_dict_copy(&tmp, *options, 0);
554 if (s->pb) // must be before any goto fail
555 s->flags |= AVFMT_FLAG_CUSTOM_IO;
557 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
560 if (!(s->url = av_strdup(filename ? filename : ""))) {
561 ret = AVERROR(ENOMEM);
565 #if FF_API_FORMAT_FILENAME
566 FF_DISABLE_DEPRECATION_WARNINGS
567 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
568 FF_ENABLE_DEPRECATION_WARNINGS
570 if ((ret = init_input(s, filename, &tmp)) < 0)
572 s->probe_score = ret;
574 if (!s->protocol_whitelist && s->pb && s->pb->protocol_whitelist) {
575 s->protocol_whitelist = av_strdup(s->pb->protocol_whitelist);
576 if (!s->protocol_whitelist) {
577 ret = AVERROR(ENOMEM);
582 if (!s->protocol_blacklist && s->pb && s->pb->protocol_blacklist) {
583 s->protocol_blacklist = av_strdup(s->pb->protocol_blacklist);
584 if (!s->protocol_blacklist) {
585 ret = AVERROR(ENOMEM);
590 if (s->format_whitelist && av_match_list(s->iformat->name, s->format_whitelist, ',') <= 0) {
591 av_log(s, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", s->format_whitelist);
592 ret = AVERROR(EINVAL);
596 avio_skip(s->pb, s->skip_initial_bytes);
598 /* Check filename in case an image number is expected. */
599 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
600 if (!av_filename_number_test(filename)) {
601 ret = AVERROR(EINVAL);
606 s->duration = s->start_time = AV_NOPTS_VALUE;
608 /* Allocate private data. */
609 if (s->iformat->priv_data_size > 0) {
610 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
611 ret = AVERROR(ENOMEM);
614 if (s->iformat->priv_class) {
615 *(const AVClass **) s->priv_data = s->iformat->priv_class;
616 av_opt_set_defaults(s->priv_data);
617 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
622 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
624 ff_id3v2_read_dict(s->pb, &s->internal->id3v2_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
627 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
628 if ((ret = s->iformat->read_header(s)) < 0)
632 s->metadata = s->internal->id3v2_meta;
633 s->internal->id3v2_meta = NULL;
634 } else if (s->internal->id3v2_meta) {
635 int level = AV_LOG_WARNING;
636 if (s->error_recognition & AV_EF_COMPLIANT)
637 level = AV_LOG_ERROR;
638 av_log(s, level, "Discarding ID3 tags because more suitable tags were found.\n");
639 av_dict_free(&s->internal->id3v2_meta);
640 if (s->error_recognition & AV_EF_EXPLODE)
641 return AVERROR_INVALIDDATA;
644 if (id3v2_extra_meta) {
645 if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
646 !strcmp(s->iformat->name, "tta") || !strcmp(s->iformat->name, "wav")) {
647 if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
649 if ((ret = ff_id3v2_parse_chapters(s, &id3v2_extra_meta)) < 0)
651 if ((ret = ff_id3v2_parse_priv(s, &id3v2_extra_meta)) < 0)
654 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
656 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
658 if ((ret = avformat_queue_attached_pictures(s)) < 0)
661 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
662 s->internal->data_offset = avio_tell(s->pb);
664 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
666 update_stream_avctx(s);
668 for (i = 0; i < s->nb_streams; i++)
669 s->streams[i]->internal->orig_codec_id = s->streams[i]->codecpar->codec_id;
672 av_dict_free(options);
679 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
681 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
683 avformat_free_context(s);
688 /*******************************************************/
690 static void force_codec_ids(AVFormatContext *s, AVStream *st)
692 switch (st->codecpar->codec_type) {
693 case AVMEDIA_TYPE_VIDEO:
694 if (s->video_codec_id)
695 st->codecpar->codec_id = s->video_codec_id;
697 case AVMEDIA_TYPE_AUDIO:
698 if (s->audio_codec_id)
699 st->codecpar->codec_id = s->audio_codec_id;
701 case AVMEDIA_TYPE_SUBTITLE:
702 if (s->subtitle_codec_id)
703 st->codecpar->codec_id = s->subtitle_codec_id;
705 case AVMEDIA_TYPE_DATA:
706 if (s->data_codec_id)
707 st->codecpar->codec_id = s->data_codec_id;
712 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
714 if (st->request_probe>0) {
715 AVProbeData *pd = &st->probe_data;
717 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
721 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
723 av_log(s, AV_LOG_WARNING,
724 "Failed to reallocate probe buffer for stream %d\n",
729 memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
730 pd->buf_size += pkt->size;
731 memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
734 st->probe_packets = 0;
736 av_log(s, AV_LOG_WARNING,
737 "nothing to probe for stream %d\n", st->index);
741 end= s->internal->raw_packet_buffer_remaining_size <= 0
742 || st->probe_packets<= 0;
744 if (end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
745 int score = set_codec_from_probe_data(s, st, pd);
746 if ( (st->codecpar->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
750 st->request_probe = -1;
751 if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
752 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
754 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
756 force_codec_ids(s, st);
762 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
764 int64_t ref = pkt->dts;
765 int i, pts_wrap_behavior;
766 int64_t pts_wrap_reference;
767 AVProgram *first_program;
769 if (ref == AV_NOPTS_VALUE)
771 if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
773 ref &= (1LL << st->pts_wrap_bits)-1;
775 // reference time stamp should be 60 s before first time stamp
776 pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
777 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
778 pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
779 (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
780 AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
782 first_program = av_find_program_from_stream(s, NULL, stream_index);
784 if (!first_program) {
785 int default_stream_index = av_find_default_stream_index(s);
786 if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
787 for (i = 0; i < s->nb_streams; i++) {
788 if (av_find_program_from_stream(s, NULL, i))
790 s->streams[i]->pts_wrap_reference = pts_wrap_reference;
791 s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
795 st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
796 st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
800 AVProgram *program = first_program;
802 if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
803 pts_wrap_reference = program->pts_wrap_reference;
804 pts_wrap_behavior = program->pts_wrap_behavior;
807 program = av_find_program_from_stream(s, program, stream_index);
810 // update every program with differing pts_wrap_reference
811 program = first_program;
813 if (program->pts_wrap_reference != pts_wrap_reference) {
814 for (i = 0; i<program->nb_stream_indexes; i++) {
815 s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
816 s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
819 program->pts_wrap_reference = pts_wrap_reference;
820 program->pts_wrap_behavior = pts_wrap_behavior;
822 program = av_find_program_from_stream(s, program, stream_index);
828 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
834 AVPacketList *pktl = s->internal->raw_packet_buffer;
835 const AVPacket *pkt1;
838 st = s->streams[pktl->pkt.stream_index];
839 if (s->internal->raw_packet_buffer_remaining_size <= 0)
840 if ((err = probe_codec(s, st, NULL)) < 0)
842 if (st->request_probe <= 0) {
843 ff_packet_list_get(&s->internal->raw_packet_buffer,
844 &s->internal->raw_packet_buffer_end, pkt);
845 s->internal->raw_packet_buffer_remaining_size += pkt->size;
853 ret = s->iformat->read_packet(s, pkt);
855 av_packet_unref(pkt);
857 /* Some demuxers return FFERROR_REDO when they consume
858 data and discard it (ignored streams, junk, extradata).
859 We must re-call the demuxer to get the real packet. */
860 if (ret == FFERROR_REDO)
862 if (!pktl || ret == AVERROR(EAGAIN))
864 for (i = 0; i < s->nb_streams; i++) {
866 if (st->probe_packets || st->request_probe > 0)
867 if ((err = probe_codec(s, st, NULL)) < 0)
869 av_assert0(st->request_probe <= 0);
874 err = av_packet_make_refcounted(pkt);
876 av_packet_unref(pkt);
880 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
881 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
882 av_log(s, AV_LOG_WARNING,
883 "Dropped corrupted packet (stream = %d)\n",
885 av_packet_unref(pkt);
889 av_assert0(pkt->stream_index < (unsigned)s->nb_streams &&
890 "Invalid stream index.\n");
892 st = s->streams[pkt->stream_index];
894 if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
895 // correct first time stamps to negative values
896 if (!is_relative(st->first_dts))
897 st->first_dts = wrap_timestamp(st, st->first_dts);
898 if (!is_relative(st->start_time))
899 st->start_time = wrap_timestamp(st, st->start_time);
900 if (!is_relative(st->cur_dts))
901 st->cur_dts = wrap_timestamp(st, st->cur_dts);
904 pkt->dts = wrap_timestamp(st, pkt->dts);
905 pkt->pts = wrap_timestamp(st, pkt->pts);
907 force_codec_ids(s, st);
909 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
910 if (s->use_wallclock_as_timestamps)
911 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
913 if (!pktl && st->request_probe <= 0)
916 err = ff_packet_list_put(&s->internal->raw_packet_buffer,
917 &s->internal->raw_packet_buffer_end,
920 av_packet_unref(pkt);
923 pkt1 = &s->internal->raw_packet_buffer_end->pkt;
924 s->internal->raw_packet_buffer_remaining_size -= pkt1->size;
926 if ((err = probe_codec(s, st, pkt1)) < 0)
932 /**********************************************************/
934 static int determinable_frame_size(AVCodecContext *avctx)
936 switch(avctx->codec_id) {
937 case AV_CODEC_ID_MP1:
938 case AV_CODEC_ID_MP2:
939 case AV_CODEC_ID_MP3:
940 case AV_CODEC_ID_CODEC2:
948 * Return the frame duration in seconds. Return 0 if not available.
950 void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
951 AVCodecParserContext *pc, AVPacket *pkt)
953 AVRational codec_framerate = s->iformat ? st->internal->avctx->framerate :
954 av_mul_q(av_inv_q(st->internal->avctx->time_base), (AVRational){1, st->internal->avctx->ticks_per_frame});
955 int frame_size, sample_rate;
957 #if FF_API_LAVF_AVCTX
958 FF_DISABLE_DEPRECATION_WARNINGS
959 if ((!codec_framerate.den || !codec_framerate.num) && st->codec->time_base.den && st->codec->time_base.num)
960 codec_framerate = av_mul_q(av_inv_q(st->codec->time_base), (AVRational){1, st->codec->ticks_per_frame});
961 FF_ENABLE_DEPRECATION_WARNINGS
966 switch (st->codecpar->codec_type) {
967 case AVMEDIA_TYPE_VIDEO:
968 if (st->r_frame_rate.num && !pc && s->iformat) {
969 *pnum = st->r_frame_rate.den;
970 *pden = st->r_frame_rate.num;
971 } else if (st->time_base.num * 1000LL > st->time_base.den) {
972 *pnum = st->time_base.num;
973 *pden = st->time_base.den;
974 } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
975 av_assert0(st->internal->avctx->ticks_per_frame);
976 av_reduce(pnum, pden,
978 codec_framerate.num * (int64_t)st->internal->avctx->ticks_per_frame,
981 if (pc && pc->repeat_pict) {
982 av_assert0(s->iformat); // this may be wrong for interlaced encoding but its not used for that case
983 av_reduce(pnum, pden,
984 (*pnum) * (1LL + pc->repeat_pict),
988 /* If this codec can be interlaced or progressive then we need
989 * a parser to compute duration of a packet. Thus if we have
990 * no parser in such case leave duration undefined. */
991 if (st->internal->avctx->ticks_per_frame > 1 && !pc)
995 case AVMEDIA_TYPE_AUDIO:
996 if (st->internal->avctx_inited) {
997 frame_size = av_get_audio_frame_duration(st->internal->avctx, pkt->size);
998 sample_rate = st->internal->avctx->sample_rate;
1000 frame_size = av_get_audio_frame_duration2(st->codecpar, pkt->size);
1001 sample_rate = st->codecpar->sample_rate;
1003 if (frame_size <= 0 || sample_rate <= 0)
1006 *pden = sample_rate;
1013 static int is_intra_only(enum AVCodecID id)
1015 const AVCodecDescriptor *d = avcodec_descriptor_get(id);
1018 if (d->type == AVMEDIA_TYPE_VIDEO && !(d->props & AV_CODEC_PROP_INTRA_ONLY))
1023 static int has_decode_delay_been_guessed(AVStream *st)
1025 if (st->codecpar->codec_id != AV_CODEC_ID_H264) return 1;
1026 if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
1028 #if CONFIG_H264_DECODER
1029 if (st->internal->avctx->has_b_frames &&
1030 avpriv_h264_has_num_reorder_frames(st->internal->avctx) == st->internal->avctx->has_b_frames)
1033 if (st->internal->avctx->has_b_frames<3)
1034 return st->nb_decoded_frames >= 7;
1035 else if (st->internal->avctx->has_b_frames<4)
1036 return st->nb_decoded_frames >= 18;
1038 return st->nb_decoded_frames >= 20;
1041 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
1045 if (pktl == s->internal->packet_buffer_end)
1046 return s->internal->parse_queue;
1050 static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
1051 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1052 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1055 int delay = st->internal->avctx->has_b_frames;
1058 if (dts == AV_NOPTS_VALUE) {
1059 int64_t best_score = INT64_MAX;
1060 for (i = 0; i<delay; i++) {
1061 if (st->pts_reorder_error_count[i]) {
1062 int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
1063 if (score < best_score) {
1065 dts = pts_buffer[i];
1070 for (i = 0; i<delay; i++) {
1071 if (pts_buffer[i] != AV_NOPTS_VALUE) {
1072 int64_t diff = FFABS(pts_buffer[i] - dts)
1073 + (uint64_t)st->pts_reorder_error[i];
1074 diff = FFMAX(diff, st->pts_reorder_error[i]);
1075 st->pts_reorder_error[i] = diff;
1076 st->pts_reorder_error_count[i]++;
1077 if (st->pts_reorder_error_count[i] > 250) {
1078 st->pts_reorder_error[i] >>= 1;
1079 st->pts_reorder_error_count[i] >>= 1;
1086 if (dts == AV_NOPTS_VALUE)
1087 dts = pts_buffer[0];
1093 * Updates the dts of packets of a stream in pkt_buffer, by re-ordering the pts
1094 * of the packets in a window.
1096 static void update_dts_from_pts(AVFormatContext *s, int stream_index,
1097 AVPacketList *pkt_buffer)
1099 AVStream *st = s->streams[stream_index];
1100 int delay = st->internal->avctx->has_b_frames;
1103 int64_t pts_buffer[MAX_REORDER_DELAY+1];
1105 for (i = 0; i<MAX_REORDER_DELAY+1; i++)
1106 pts_buffer[i] = AV_NOPTS_VALUE;
1108 for (; pkt_buffer; pkt_buffer = get_next_pkt(s, st, pkt_buffer)) {
1109 if (pkt_buffer->pkt.stream_index != stream_index)
1112 if (pkt_buffer->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1113 pts_buffer[0] = pkt_buffer->pkt.pts;
1114 for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
1115 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
1117 pkt_buffer->pkt.dts = select_from_pts_buffer(st, pts_buffer, pkt_buffer->pkt.dts);
1122 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
1123 int64_t dts, int64_t pts, AVPacket *pkt)
1125 AVStream *st = s->streams[stream_index];
1126 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1127 AVPacketList *pktl_it;
1131 if (st->first_dts != AV_NOPTS_VALUE ||
1132 dts == AV_NOPTS_VALUE ||
1133 st->cur_dts == AV_NOPTS_VALUE ||
1134 st->cur_dts < INT_MIN + RELATIVE_TS_BASE ||
1138 st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
1140 shift = (uint64_t)st->first_dts - RELATIVE_TS_BASE;
1142 if (is_relative(pts))
1145 for (pktl_it = pktl; pktl_it; pktl_it = get_next_pkt(s, st, pktl_it)) {
1146 if (pktl_it->pkt.stream_index != stream_index)
1148 if (is_relative(pktl_it->pkt.pts))
1149 pktl_it->pkt.pts += shift;
1151 if (is_relative(pktl_it->pkt.dts))
1152 pktl_it->pkt.dts += shift;
1154 if (st->start_time == AV_NOPTS_VALUE && pktl_it->pkt.pts != AV_NOPTS_VALUE) {
1155 st->start_time = pktl_it->pkt.pts;
1156 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1157 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1161 if (has_decode_delay_been_guessed(st)) {
1162 update_dts_from_pts(s, stream_index, pktl);
1165 if (st->start_time == AV_NOPTS_VALUE) {
1166 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO || !(pkt->flags & AV_PKT_FLAG_DISCARD)) {
1167 st->start_time = pts;
1169 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1170 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1174 static void update_initial_durations(AVFormatContext *s, AVStream *st,
1175 int stream_index, int duration)
1177 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1178 int64_t cur_dts = RELATIVE_TS_BASE;
1180 if (st->first_dts != AV_NOPTS_VALUE) {
1181 if (st->update_initial_durations_done)
1183 st->update_initial_durations_done = 1;
1184 cur_dts = st->first_dts;
1185 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1186 if (pktl->pkt.stream_index == stream_index) {
1187 if (pktl->pkt.pts != pktl->pkt.dts ||
1188 pktl->pkt.dts != AV_NOPTS_VALUE ||
1191 cur_dts -= duration;
1194 if (pktl && pktl->pkt.dts != st->first_dts) {
1195 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %"PRId64") in the queue\n",
1196 av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
1200 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
1203 pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1204 st->first_dts = cur_dts;
1205 } else if (st->cur_dts != RELATIVE_TS_BASE)
1208 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1209 if (pktl->pkt.stream_index != stream_index)
1211 if ((pktl->pkt.pts == pktl->pkt.dts ||
1212 pktl->pkt.pts == AV_NOPTS_VALUE) &&
1213 (pktl->pkt.dts == AV_NOPTS_VALUE ||
1214 pktl->pkt.dts == st->first_dts ||
1215 pktl->pkt.dts == RELATIVE_TS_BASE) &&
1216 !pktl->pkt.duration) {
1217 pktl->pkt.dts = cur_dts;
1218 if (!st->internal->avctx->has_b_frames)
1219 pktl->pkt.pts = cur_dts;
1220 // if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
1221 pktl->pkt.duration = duration;
1224 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
1227 st->cur_dts = cur_dts;
1230 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1231 AVCodecParserContext *pc, AVPacket *pkt,
1232 int64_t next_dts, int64_t next_pts)
1234 int num, den, presentation_delayed, delay, i;
1236 AVRational duration;
1237 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1238 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1240 if (s->flags & AVFMT_FLAG_NOFILLIN)
1243 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
1244 if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
1245 if (st->last_dts_for_order_check <= pkt->dts) {
1248 av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
1249 "DTS %"PRIi64" < %"PRIi64" out of order\n",
1251 st->last_dts_for_order_check);
1252 st->dts_misordered++;
1254 if (st->dts_ordered + st->dts_misordered > 250) {
1255 st->dts_ordered >>= 1;
1256 st->dts_misordered >>= 1;
1260 st->last_dts_for_order_check = pkt->dts;
1261 if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
1262 pkt->dts = AV_NOPTS_VALUE;
1265 if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1266 pkt->dts = AV_NOPTS_VALUE;
1268 if (pc && pc->pict_type == AV_PICTURE_TYPE_B
1269 && !st->internal->avctx->has_b_frames)
1270 //FIXME Set low_delay = 0 when has_b_frames = 1
1271 st->internal->avctx->has_b_frames = 1;
1273 /* do we have a video B-frame ? */
1274 delay = st->internal->avctx->has_b_frames;
1275 presentation_delayed = 0;
1277 /* XXX: need has_b_frame, but cannot get it if the codec is
1278 * not initialized */
1280 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1281 presentation_delayed = 1;
1283 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
1284 st->pts_wrap_bits < 63 &&
1285 pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
1286 if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
1287 pkt->dts -= 1LL << st->pts_wrap_bits;
1289 pkt->pts += 1LL << st->pts_wrap_bits;
1292 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1293 * We take the conservative approach and discard both.
1294 * Note: If this is misbehaving for an H.264 file, then possibly
1295 * presentation_delayed is not set correctly. */
1296 if (delay == 1 && pkt->dts == pkt->pts &&
1297 pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
1298 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1299 if ( strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
1300 && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1301 pkt->dts = AV_NOPTS_VALUE;
1304 duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
1305 if (pkt->duration <= 0) {
1306 ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
1308 duration = (AVRational) {num, den};
1309 pkt->duration = av_rescale_rnd(1,
1310 num * (int64_t) st->time_base.den,
1311 den * (int64_t) st->time_base.num,
1316 if (pkt->duration > 0 && (s->internal->packet_buffer || s->internal->parse_queue))
1317 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1319 /* Correct timestamps with byte offset if demuxers only have timestamps
1320 * on packet boundaries */
1321 if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
1322 /* this will estimate bitrate based on this frame's duration and size */
1323 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1324 if (pkt->pts != AV_NOPTS_VALUE)
1326 if (pkt->dts != AV_NOPTS_VALUE)
1330 /* This may be redundant, but it should not hurt. */
1331 if (pkt->dts != AV_NOPTS_VALUE &&
1332 pkt->pts != AV_NOPTS_VALUE &&
1333 pkt->pts > pkt->dts)
1334 presentation_delayed = 1;
1336 if (s->debug & FF_FDEBUG_TS)
1337 av_log(s, AV_LOG_DEBUG,
1338 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%"PRId64" delay:%d onein_oneout:%d\n",
1339 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
1340 pkt->stream_index, pc, pkt->duration, delay, onein_oneout);
1342 /* Interpolate PTS and DTS if they are not present. We skip H264
1343 * currently because delay and has_b_frames are not reliably set. */
1344 if ((delay == 0 || (delay == 1 && pc)) &&
1346 if (presentation_delayed) {
1347 /* DTS = decompression timestamp */
1348 /* PTS = presentation timestamp */
1349 if (pkt->dts == AV_NOPTS_VALUE)
1350 pkt->dts = st->last_IP_pts;
1351 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1352 if (pkt->dts == AV_NOPTS_VALUE)
1353 pkt->dts = st->cur_dts;
1355 /* This is tricky: the dts must be incremented by the duration
1356 * of the frame we are displaying, i.e. the last I- or P-frame. */
1357 if (st->last_IP_duration == 0 && (uint64_t)pkt->duration <= INT32_MAX)
1358 st->last_IP_duration = pkt->duration;
1359 if (pkt->dts != AV_NOPTS_VALUE)
1360 st->cur_dts = pkt->dts + st->last_IP_duration;
1361 if (pkt->dts != AV_NOPTS_VALUE &&
1362 pkt->pts == AV_NOPTS_VALUE &&
1363 st->last_IP_duration > 0 &&
1364 ((uint64_t)st->cur_dts - (uint64_t)next_dts + 1) <= 2 &&
1365 next_dts != next_pts &&
1366 next_pts != AV_NOPTS_VALUE)
1367 pkt->pts = next_dts;
1369 if ((uint64_t)pkt->duration <= INT32_MAX)
1370 st->last_IP_duration = pkt->duration;
1371 st->last_IP_pts = pkt->pts;
1372 /* Cannot compute PTS if not present (we can compute it only
1373 * by knowing the future. */
1374 } else if (pkt->pts != AV_NOPTS_VALUE ||
1375 pkt->dts != AV_NOPTS_VALUE ||
1376 pkt->duration > 0 ) {
1378 /* presentation is not delayed : PTS and DTS are the same */
1379 if (pkt->pts == AV_NOPTS_VALUE)
1380 pkt->pts = pkt->dts;
1381 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1383 if (pkt->pts == AV_NOPTS_VALUE)
1384 pkt->pts = st->cur_dts;
1385 pkt->dts = pkt->pts;
1386 if (pkt->pts != AV_NOPTS_VALUE && duration.num >= 0)
1387 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
1391 if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1392 st->pts_buffer[0] = pkt->pts;
1393 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
1394 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
1396 if(has_decode_delay_been_guessed(st))
1397 pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
1399 // We skipped it above so we try here.
1401 // This should happen on the first packet
1402 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1403 if (pkt->dts > st->cur_dts)
1404 st->cur_dts = pkt->dts;
1406 if (s->debug & FF_FDEBUG_TS)
1407 av_log(s, AV_LOG_DEBUG, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s st:%d (%d)\n",
1408 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), st->index, st->id);
1411 if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA || is_intra_only(st->codecpar->codec_id))
1412 pkt->flags |= AV_PKT_FLAG_KEY;
1413 #if FF_API_CONVERGENCE_DURATION
1414 FF_DISABLE_DEPRECATION_WARNINGS
1416 pkt->convergence_duration = pc->convergence_duration;
1417 FF_ENABLE_DEPRECATION_WARNINGS
1421 void ff_packet_list_free(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1423 AVPacketList *tmp = *pkt_buf;
1426 AVPacketList *pktl = tmp;
1428 av_packet_unref(&pktl->pkt);
1432 *pkt_buf_end = NULL;
1436 * Parse a packet, add all split parts to parse_queue.
1438 * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
1440 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1442 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1443 AVStream *st = s->streams[stream_index];
1444 uint8_t *data = pkt ? pkt->data : NULL;
1445 int size = pkt ? pkt->size : 0;
1446 int ret = 0, got_output = 0;
1449 av_init_packet(&flush_pkt);
1452 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1453 // preserve 0-size sync packets
1454 compute_pkt_fields(s, st, st->parser, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1457 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1459 int64_t next_pts = pkt->pts;
1460 int64_t next_dts = pkt->dts;
1462 av_init_packet(&out_pkt);
1463 len = av_parser_parse2(st->parser, st->internal->avctx,
1464 &out_pkt.data, &out_pkt.size, data, size,
1465 pkt->pts, pkt->dts, pkt->pos);
1467 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1469 /* increment read pointer */
1473 got_output = !!out_pkt.size;
1478 if (pkt->buf && out_pkt.data == pkt->data) {
1479 /* reference pkt->buf only when out_pkt.data is guaranteed to point
1480 * to data in it and not in the parser's internal buffer. */
1481 /* XXX: Ensure this is the case with all parsers when st->parser->flags
1482 * is PARSER_FLAG_COMPLETE_FRAMES and check for that instead? */
1483 out_pkt.buf = av_buffer_ref(pkt->buf);
1485 ret = AVERROR(ENOMEM);
1489 ret = av_packet_make_refcounted(&out_pkt);
1494 if (pkt->side_data) {
1495 out_pkt.side_data = pkt->side_data;
1496 out_pkt.side_data_elems = pkt->side_data_elems;
1497 pkt->side_data = NULL;
1498 pkt->side_data_elems = 0;
1501 /* set the duration */
1502 out_pkt.duration = (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->duration : 0;
1503 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1504 if (st->internal->avctx->sample_rate > 0) {
1506 av_rescale_q_rnd(st->parser->duration,
1507 (AVRational) { 1, st->internal->avctx->sample_rate },
1513 out_pkt.stream_index = st->index;
1514 out_pkt.pts = st->parser->pts;
1515 out_pkt.dts = st->parser->dts;
1516 out_pkt.pos = st->parser->pos;
1517 out_pkt.flags |= pkt->flags & AV_PKT_FLAG_DISCARD;
1519 if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1520 out_pkt.pos = st->parser->frame_offset;
1522 if (st->parser->key_frame == 1 ||
1523 (st->parser->key_frame == -1 &&
1524 st->parser->pict_type == AV_PICTURE_TYPE_I))
1525 out_pkt.flags |= AV_PKT_FLAG_KEY;
1527 if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1528 out_pkt.flags |= AV_PKT_FLAG_KEY;
1530 compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts);
1532 ret = ff_packet_list_put(&s->internal->parse_queue,
1533 &s->internal->parse_queue_end,
1536 av_packet_unref(&out_pkt);
1541 /* end of the stream => close and free the parser */
1542 if (pkt == &flush_pkt) {
1543 av_parser_close(st->parser);
1548 av_packet_unref(pkt);
1552 int ff_packet_list_get(AVPacketList **pkt_buffer,
1553 AVPacketList **pkt_buffer_end,
1557 av_assert0(*pkt_buffer);
1560 *pkt_buffer = pktl->next;
1562 *pkt_buffer_end = NULL;
1567 static int64_t ts_to_samples(AVStream *st, int64_t ts)
1569 return av_rescale(ts, st->time_base.num * st->codecpar->sample_rate, st->time_base.den);
1572 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1574 int ret = 0, i, got_packet = 0;
1575 AVDictionary *metadata = NULL;
1577 av_init_packet(pkt);
1579 while (!got_packet && !s->internal->parse_queue) {
1583 /* read next packet */
1584 ret = ff_read_packet(s, &cur_pkt);
1586 if (ret == AVERROR(EAGAIN))
1588 /* flush the parsers */
1589 for (i = 0; i < s->nb_streams; i++) {
1591 if (st->parser && st->need_parsing)
1592 parse_packet(s, NULL, st->index);
1594 /* all remaining packets are now in parse_queue =>
1595 * really terminate parsing */
1599 st = s->streams[cur_pkt.stream_index];
1601 /* update context if required */
1602 if (st->internal->need_context_update) {
1603 if (avcodec_is_open(st->internal->avctx)) {
1604 av_log(s, AV_LOG_DEBUG, "Demuxer context update while decoder is open, closing and trying to re-open\n");
1605 avcodec_close(st->internal->avctx);
1606 st->info->found_decoder = 0;
1609 /* close parser, because it depends on the codec */
1610 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
1611 av_parser_close(st->parser);
1615 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
1617 av_packet_unref(&cur_pkt);
1621 #if FF_API_LAVF_AVCTX
1622 FF_DISABLE_DEPRECATION_WARNINGS
1623 /* update deprecated public codec context */
1624 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
1626 av_packet_unref(&cur_pkt);
1629 FF_ENABLE_DEPRECATION_WARNINGS
1632 st->internal->need_context_update = 0;
1635 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1636 cur_pkt.dts != AV_NOPTS_VALUE &&
1637 cur_pkt.pts < cur_pkt.dts) {
1638 av_log(s, AV_LOG_WARNING,
1639 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1640 cur_pkt.stream_index,
1641 av_ts2str(cur_pkt.pts),
1642 av_ts2str(cur_pkt.dts),
1645 if (s->debug & FF_FDEBUG_TS)
1646 av_log(s, AV_LOG_DEBUG,
1647 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"PRId64", flags=%d\n",
1648 cur_pkt.stream_index,
1649 av_ts2str(cur_pkt.pts),
1650 av_ts2str(cur_pkt.dts),
1651 cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
1653 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1654 st->parser = av_parser_init(st->codecpar->codec_id);
1656 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1657 "%s, packets or times may be invalid.\n",
1658 avcodec_get_name(st->codecpar->codec_id));
1659 /* no parser available: just output the raw packets */
1660 st->need_parsing = AVSTREAM_PARSE_NONE;
1661 } else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1662 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1663 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1664 st->parser->flags |= PARSER_FLAG_ONCE;
1665 else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1666 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1669 if (!st->need_parsing || !st->parser) {
1670 /* no parsing needed: we just output the packet as is */
1672 compute_pkt_fields(s, st, NULL, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1673 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1674 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1675 ff_reduce_index(s, st->index);
1676 av_add_index_entry(st, pkt->pos, pkt->dts,
1677 0, 0, AVINDEX_KEYFRAME);
1680 } else if (st->discard < AVDISCARD_ALL) {
1681 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1683 st->codecpar->sample_rate = st->internal->avctx->sample_rate;
1684 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
1685 st->codecpar->channels = st->internal->avctx->channels;
1686 st->codecpar->channel_layout = st->internal->avctx->channel_layout;
1687 st->codecpar->codec_id = st->internal->avctx->codec_id;
1690 av_packet_unref(&cur_pkt);
1692 if (pkt->flags & AV_PKT_FLAG_KEY)
1693 st->skip_to_keyframe = 0;
1694 if (st->skip_to_keyframe) {
1695 av_packet_unref(&cur_pkt);
1703 if (!got_packet && s->internal->parse_queue)
1704 ret = ff_packet_list_get(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt);
1707 AVStream *st = s->streams[pkt->stream_index];
1708 int discard_padding = 0;
1709 if (st->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
1710 int64_t pts = pkt->pts - (is_relative(pkt->pts) ? RELATIVE_TS_BASE : 0);
1711 int64_t sample = ts_to_samples(st, pts);
1712 int duration = ts_to_samples(st, pkt->duration);
1713 int64_t end_sample = sample + duration;
1714 if (duration > 0 && end_sample >= st->first_discard_sample &&
1715 sample < st->last_discard_sample)
1716 discard_padding = FFMIN(end_sample - st->first_discard_sample, duration);
1718 if (st->start_skip_samples && (pkt->pts == 0 || pkt->pts == RELATIVE_TS_BASE))
1719 st->skip_samples = st->start_skip_samples;
1720 if (st->skip_samples || discard_padding) {
1721 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1723 AV_WL32(p, st->skip_samples);
1724 AV_WL32(p + 4, discard_padding);
1725 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d / discard %d\n", st->skip_samples, discard_padding);
1727 st->skip_samples = 0;
1730 if (st->inject_global_side_data) {
1731 for (i = 0; i < st->nb_side_data; i++) {
1732 AVPacketSideData *src_sd = &st->side_data[i];
1735 if (av_packet_get_side_data(pkt, src_sd->type, NULL))
1738 dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
1740 av_log(s, AV_LOG_WARNING, "Could not inject global side data\n");
1744 memcpy(dst_data, src_sd->data, src_sd->size);
1746 st->inject_global_side_data = 0;
1750 av_opt_get_dict_val(s, "metadata", AV_OPT_SEARCH_CHILDREN, &metadata);
1752 s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
1753 av_dict_copy(&s->metadata, metadata, 0);
1754 av_dict_free(&metadata);
1755 av_opt_set_dict_val(s, "metadata", NULL, AV_OPT_SEARCH_CHILDREN);
1758 #if FF_API_LAVF_AVCTX
1759 update_stream_avctx(s);
1762 if (s->debug & FF_FDEBUG_TS)
1763 av_log(s, AV_LOG_DEBUG,
1764 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1765 "size=%d, duration=%"PRId64", flags=%d\n",
1767 av_ts2str(pkt->pts),
1768 av_ts2str(pkt->dts),
1769 pkt->size, pkt->duration, pkt->flags);
1771 /* A demuxer might have returned EOF because of an IO error, let's
1772 * propagate this back to the user. */
1773 if (ret == AVERROR_EOF && s->pb && s->pb->error < 0 && s->pb->error != AVERROR(EAGAIN))
1779 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1781 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1787 ret = s->internal->packet_buffer
1788 ? ff_packet_list_get(&s->internal->packet_buffer,
1789 &s->internal->packet_buffer_end, pkt)
1790 : read_frame_internal(s, pkt);
1797 AVPacketList *pktl = s->internal->packet_buffer;
1800 AVPacket *next_pkt = &pktl->pkt;
1802 if (next_pkt->dts != AV_NOPTS_VALUE) {
1803 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1804 // last dts seen for this stream. if any of packets following
1805 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1806 int64_t last_dts = next_pkt->dts;
1807 av_assert2(wrap_bits <= 64);
1808 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1809 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1810 av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2ULL << (wrap_bits - 1)) < 0) {
1811 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2ULL << (wrap_bits - 1))) {
1813 next_pkt->pts = pktl->pkt.dts;
1815 if (last_dts != AV_NOPTS_VALUE) {
1816 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1817 last_dts = pktl->pkt.dts;
1822 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1823 // Fixing the last reference frame had none pts issue (For MXF etc).
1824 // We only do this when
1826 // 2. we are not able to resolve a pts value for current packet.
1827 // 3. the packets for this stream at the end of the files had valid dts.
1828 next_pkt->pts = last_dts + next_pkt->duration;
1830 pktl = s->internal->packet_buffer;
1833 /* read packet from packet buffer, if there is data */
1834 st = s->streams[next_pkt->stream_index];
1835 if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
1836 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1837 ret = ff_packet_list_get(&s->internal->packet_buffer,
1838 &s->internal->packet_buffer_end, pkt);
1843 ret = read_frame_internal(s, pkt);
1845 if (pktl && ret != AVERROR(EAGAIN)) {
1852 ret = ff_packet_list_put(&s->internal->packet_buffer,
1853 &s->internal->packet_buffer_end,
1854 pkt, FF_PACKETLIST_FLAG_REF_PACKET);
1855 av_packet_unref(pkt);
1862 st = s->streams[pkt->stream_index];
1863 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1864 ff_reduce_index(s, st->index);
1865 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1868 if (is_relative(pkt->dts))
1869 pkt->dts -= RELATIVE_TS_BASE;
1870 if (is_relative(pkt->pts))
1871 pkt->pts -= RELATIVE_TS_BASE;
1876 /* XXX: suppress the packet queue */
1877 static void flush_packet_queue(AVFormatContext *s)
1881 ff_packet_list_free(&s->internal->parse_queue, &s->internal->parse_queue_end);
1882 ff_packet_list_free(&s->internal->packet_buffer, &s->internal->packet_buffer_end);
1883 ff_packet_list_free(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
1885 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1888 /*******************************************************/
1891 int av_find_default_stream_index(AVFormatContext *s)
1895 int best_stream = 0;
1896 int best_score = INT_MIN;
1898 if (s->nb_streams <= 0)
1900 for (i = 0; i < s->nb_streams; i++) {
1903 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1904 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
1906 if (st->codecpar->width && st->codecpar->height)
1910 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1911 if (st->codecpar->sample_rate)
1914 if (st->codec_info_nb_frames)
1917 if (st->discard != AVDISCARD_ALL)
1920 if (score > best_score) {
1928 /** Flush the frame reader. */
1929 void ff_read_frame_flush(AVFormatContext *s)
1934 flush_packet_queue(s);
1936 /* Reset read state for each stream. */
1937 for (i = 0; i < s->nb_streams; i++) {
1941 av_parser_close(st->parser);
1944 st->last_IP_pts = AV_NOPTS_VALUE;
1945 st->last_dts_for_order_check = AV_NOPTS_VALUE;
1946 if (st->first_dts == AV_NOPTS_VALUE)
1947 st->cur_dts = RELATIVE_TS_BASE;
1949 /* We set the current DTS to an unspecified origin. */
1950 st->cur_dts = AV_NOPTS_VALUE;
1952 st->probe_packets = MAX_PROBE_PACKETS;
1954 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1955 st->pts_buffer[j] = AV_NOPTS_VALUE;
1957 if (s->internal->inject_global_side_data)
1958 st->inject_global_side_data = 1;
1960 st->skip_samples = 0;
1964 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1968 for (i = 0; i < s->nb_streams; i++) {
1969 AVStream *st = s->streams[i];
1972 av_rescale(timestamp,
1973 st->time_base.den * (int64_t) ref_st->time_base.num,
1974 st->time_base.num * (int64_t) ref_st->time_base.den);
1978 void ff_reduce_index(AVFormatContext *s, int stream_index)
1980 AVStream *st = s->streams[stream_index];
1981 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1983 if ((unsigned) st->nb_index_entries >= max_entries) {
1985 for (i = 0; 2 * i < st->nb_index_entries; i++)
1986 st->index_entries[i] = st->index_entries[2 * i];
1987 st->nb_index_entries = i;
1991 int ff_add_index_entry(AVIndexEntry **index_entries,
1992 int *nb_index_entries,
1993 unsigned int *index_entries_allocated_size,
1994 int64_t pos, int64_t timestamp,
1995 int size, int distance, int flags)
1997 AVIndexEntry *entries, *ie;
2000 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
2003 if (timestamp == AV_NOPTS_VALUE)
2004 return AVERROR(EINVAL);
2006 if (size < 0 || size > 0x3FFFFFFF)
2007 return AVERROR(EINVAL);
2009 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
2010 timestamp -= RELATIVE_TS_BASE;
2012 entries = av_fast_realloc(*index_entries,
2013 index_entries_allocated_size,
2014 (*nb_index_entries + 1) *
2015 sizeof(AVIndexEntry));
2019 *index_entries = entries;
2021 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
2022 timestamp, AVSEEK_FLAG_ANY);
2025 index = (*nb_index_entries)++;
2026 ie = &entries[index];
2027 av_assert0(index == 0 || ie[-1].timestamp < timestamp);
2029 ie = &entries[index];
2030 if (ie->timestamp != timestamp) {
2031 if (ie->timestamp <= timestamp)
2033 memmove(entries + index + 1, entries + index,
2034 sizeof(AVIndexEntry) * (*nb_index_entries - index));
2035 (*nb_index_entries)++;
2036 } else if (ie->pos == pos && distance < ie->min_distance)
2037 // do not reduce the distance
2038 distance = ie->min_distance;
2042 ie->timestamp = timestamp;
2043 ie->min_distance = distance;
2050 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
2051 int size, int distance, int flags)
2053 timestamp = wrap_timestamp(st, timestamp);
2054 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
2055 &st->index_entries_allocated_size, pos,
2056 timestamp, size, distance, flags);
2059 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
2060 int64_t wanted_timestamp, int flags)
2068 // Optimize appending index entries at the end.
2069 if (b && entries[b - 1].timestamp < wanted_timestamp)
2075 // Search for the next non-discarded packet.
2076 while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b && m < nb_entries - 1) {
2078 if (m == b && entries[m].timestamp >= wanted_timestamp) {
2084 timestamp = entries[m].timestamp;
2085 if (timestamp >= wanted_timestamp)
2087 if (timestamp <= wanted_timestamp)
2090 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
2092 if (!(flags & AVSEEK_FLAG_ANY))
2093 while (m >= 0 && m < nb_entries &&
2094 !(entries[m].flags & AVINDEX_KEYFRAME))
2095 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
2097 if (m == nb_entries)
2102 void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
2105 int64_t pos_delta = 0;
2107 //We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
2108 const char *proto = avio_find_protocol_name(s->url);
2111 av_log(s, AV_LOG_INFO,
2112 "Protocol name not provided, cannot determine if input is local or "
2113 "a network protocol, buffers and access patterns cannot be configured "
2114 "optimally without knowing the protocol\n");
2117 if (proto && !(strcmp(proto, "file") && strcmp(proto, "pipe") && strcmp(proto, "cache")))
2120 for (ist1 = 0; ist1 < s->nb_streams; ist1++) {
2121 AVStream *st1 = s->streams[ist1];
2122 for (ist2 = 0; ist2 < s->nb_streams; ist2++) {
2123 AVStream *st2 = s->streams[ist2];
2129 for (i1 = i2 = 0; i1 < st1->nb_index_entries; i1++) {
2130 AVIndexEntry *e1 = &st1->index_entries[i1];
2131 int64_t e1_pts = av_rescale_q(e1->timestamp, st1->time_base, AV_TIME_BASE_Q);
2133 skip = FFMAX(skip, e1->size);
2134 for (; i2 < st2->nb_index_entries; i2++) {
2135 AVIndexEntry *e2 = &st2->index_entries[i2];
2136 int64_t e2_pts = av_rescale_q(e2->timestamp, st2->time_base, AV_TIME_BASE_Q);
2137 if (e2_pts - e1_pts < time_tolerance)
2139 pos_delta = FFMAX(pos_delta, e1->pos - e2->pos);
2147 /* XXX This could be adjusted depending on protocol*/
2148 if (s->pb->buffer_size < pos_delta && pos_delta < (1<<24)) {
2149 av_log(s, AV_LOG_VERBOSE, "Reconfiguring buffers to size %"PRId64"\n", pos_delta);
2151 /* realloc the buffer and the original data will be retained */
2152 if (ffio_realloc_buf(s->pb, pos_delta)) {
2153 av_log(s, AV_LOG_ERROR, "Realloc buffer fail.\n");
2157 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, pos_delta/2);
2160 if (skip < (1<<23)) {
2161 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, skip);
2165 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
2167 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
2168 wanted_timestamp, flags);
2171 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
2172 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2174 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
2175 if (stream_index >= 0)
2176 ts = wrap_timestamp(s->streams[stream_index], ts);
2180 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
2181 int64_t target_ts, int flags)
2183 const AVInputFormat *avif = s->iformat;
2184 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
2185 int64_t ts_min, ts_max, ts;
2190 if (stream_index < 0)
2193 av_log(s, AV_LOG_TRACE, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2196 ts_min = AV_NOPTS_VALUE;
2197 pos_limit = -1; // GCC falsely says it may be uninitialized.
2199 st = s->streams[stream_index];
2200 if (st->index_entries) {
2203 /* FIXME: Whole function must be checked for non-keyframe entries in
2204 * index case, especially read_timestamp(). */
2205 index = av_index_search_timestamp(st, target_ts,
2206 flags | AVSEEK_FLAG_BACKWARD);
2207 index = FFMAX(index, 0);
2208 e = &st->index_entries[index];
2210 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
2212 ts_min = e->timestamp;
2213 av_log(s, AV_LOG_TRACE, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
2214 pos_min, av_ts2str(ts_min));
2216 av_assert1(index == 0);
2219 index = av_index_search_timestamp(st, target_ts,
2220 flags & ~AVSEEK_FLAG_BACKWARD);
2221 av_assert0(index < st->nb_index_entries);
2223 e = &st->index_entries[index];
2224 av_assert1(e->timestamp >= target_ts);
2226 ts_max = e->timestamp;
2227 pos_limit = pos_max - e->min_distance;
2228 av_log(s, AV_LOG_TRACE, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
2229 " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
2233 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
2234 ts_min, ts_max, flags, &ts, avif->read_timestamp);
2239 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
2242 ff_read_frame_flush(s);
2243 ff_update_cur_dts(s, st, ts);
2248 int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
2249 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2251 int64_t step = 1024;
2252 int64_t limit, ts_max;
2253 int64_t filesize = avio_size(s->pb);
2254 int64_t pos_max = filesize - 1;
2257 pos_max = FFMAX(0, (pos_max) - step);
2258 ts_max = ff_read_timestamp(s, stream_index,
2259 &pos_max, limit, read_timestamp);
2261 } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
2262 if (ts_max == AV_NOPTS_VALUE)
2266 int64_t tmp_pos = pos_max + 1;
2267 int64_t tmp_ts = ff_read_timestamp(s, stream_index,
2268 &tmp_pos, INT64_MAX, read_timestamp);
2269 if (tmp_ts == AV_NOPTS_VALUE)
2271 av_assert0(tmp_pos > pos_max);
2274 if (tmp_pos >= filesize)
2286 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
2287 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
2288 int64_t ts_min, int64_t ts_max,
2289 int flags, int64_t *ts_ret,
2290 int64_t (*read_timestamp)(struct AVFormatContext *, int,
2291 int64_t *, int64_t))
2298 av_log(s, AV_LOG_TRACE, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2300 if (ts_min == AV_NOPTS_VALUE) {
2301 pos_min = s->internal->data_offset;
2302 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2303 if (ts_min == AV_NOPTS_VALUE)
2307 if (ts_min >= target_ts) {
2312 if (ts_max == AV_NOPTS_VALUE) {
2313 if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
2315 pos_limit = pos_max;
2318 if (ts_max <= target_ts) {
2323 av_assert0(ts_min < ts_max);
2326 while (pos_min < pos_limit) {
2327 av_log(s, AV_LOG_TRACE,
2328 "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
2329 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
2330 av_assert0(pos_limit <= pos_max);
2332 if (no_change == 0) {
2333 int64_t approximate_keyframe_distance = pos_max - pos_limit;
2334 // interpolate position (better than dichotomy)
2335 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
2337 pos_min - approximate_keyframe_distance;
2338 } else if (no_change == 1) {
2339 // bisection if interpolation did not change min / max pos last time
2340 pos = (pos_min + pos_limit) >> 1;
2342 /* linear search if bisection failed, can only happen if there
2343 * are very few or no keyframes between min/max */
2348 else if (pos > pos_limit)
2352 // May pass pos_limit instead of -1.
2353 ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
2358 av_log(s, AV_LOG_TRACE, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
2359 " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
2360 pos_min, pos, pos_max,
2361 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
2362 pos_limit, start_pos, no_change);
2363 if (ts == AV_NOPTS_VALUE) {
2364 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
2367 if (target_ts <= ts) {
2368 pos_limit = start_pos - 1;
2372 if (target_ts >= ts) {
2378 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
2379 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
2382 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2384 ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2385 av_log(s, AV_LOG_TRACE, "pos=0x%"PRIx64" %s<=%s<=%s\n",
2386 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
2392 static int seek_frame_byte(AVFormatContext *s, int stream_index,
2393 int64_t pos, int flags)
2395 int64_t pos_min, pos_max;
2397 pos_min = s->internal->data_offset;
2398 pos_max = avio_size(s->pb) - 1;
2402 else if (pos > pos_max)
2405 avio_seek(s->pb, pos, SEEK_SET);
2407 s->io_repositioned = 1;
2412 static int seek_frame_generic(AVFormatContext *s, int stream_index,
2413 int64_t timestamp, int flags)
2420 st = s->streams[stream_index];
2422 index = av_index_search_timestamp(st, timestamp, flags);
2424 if (index < 0 && st->nb_index_entries &&
2425 timestamp < st->index_entries[0].timestamp)
2428 if (index < 0 || index == st->nb_index_entries - 1) {
2432 if (st->nb_index_entries) {
2433 av_assert0(st->index_entries);
2434 ie = &st->index_entries[st->nb_index_entries - 1];
2435 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2437 ff_update_cur_dts(s, st, ie->timestamp);
2439 if ((ret = avio_seek(s->pb, s->internal->data_offset, SEEK_SET)) < 0)
2445 read_status = av_read_frame(s, &pkt);
2446 } while (read_status == AVERROR(EAGAIN));
2447 if (read_status < 0)
2449 if (stream_index == pkt.stream_index && pkt.dts > timestamp) {
2450 if (pkt.flags & AV_PKT_FLAG_KEY) {
2451 av_packet_unref(&pkt);
2454 if (nonkey++ > 1000 && st->codecpar->codec_id != AV_CODEC_ID_CDGRAPHICS) {
2455 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);
2456 av_packet_unref(&pkt);
2460 av_packet_unref(&pkt);
2462 index = av_index_search_timestamp(st, timestamp, flags);
2467 ff_read_frame_flush(s);
2468 if (s->iformat->read_seek)
2469 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2471 ie = &st->index_entries[index];
2472 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2474 ff_update_cur_dts(s, st, ie->timestamp);
2479 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2480 int64_t timestamp, int flags)
2485 if (flags & AVSEEK_FLAG_BYTE) {
2486 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2488 ff_read_frame_flush(s);
2489 return seek_frame_byte(s, stream_index, timestamp, flags);
2492 if (stream_index < 0) {
2493 stream_index = av_find_default_stream_index(s);
2494 if (stream_index < 0)
2497 st = s->streams[stream_index];
2498 /* timestamp for default must be expressed in AV_TIME_BASE units */
2499 timestamp = av_rescale(timestamp, st->time_base.den,
2500 AV_TIME_BASE * (int64_t) st->time_base.num);
2503 /* first, we try the format specific seek */
2504 if (s->iformat->read_seek) {
2505 ff_read_frame_flush(s);
2506 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2512 if (s->iformat->read_timestamp &&
2513 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2514 ff_read_frame_flush(s);
2515 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2516 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2517 ff_read_frame_flush(s);
2518 return seek_frame_generic(s, stream_index, timestamp, flags);
2523 int av_seek_frame(AVFormatContext *s, int stream_index,
2524 int64_t timestamp, int flags)
2528 if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2529 int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2530 if ((flags & AVSEEK_FLAG_BACKWARD))
2534 return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2535 flags & ~AVSEEK_FLAG_BACKWARD);
2538 ret = seek_frame_internal(s, stream_index, timestamp, flags);
2541 ret = avformat_queue_attached_pictures(s);
2546 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
2547 int64_t ts, int64_t max_ts, int flags)
2549 if (min_ts > ts || max_ts < ts)
2551 if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2552 return AVERROR(EINVAL);
2555 flags |= AVSEEK_FLAG_ANY;
2556 flags &= ~AVSEEK_FLAG_BACKWARD;
2558 if (s->iformat->read_seek2) {
2560 ff_read_frame_flush(s);
2562 if (stream_index == -1 && s->nb_streams == 1) {
2563 AVRational time_base = s->streams[0]->time_base;
2564 ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2565 min_ts = av_rescale_rnd(min_ts, time_base.den,
2566 time_base.num * (int64_t)AV_TIME_BASE,
2567 AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
2568 max_ts = av_rescale_rnd(max_ts, time_base.den,
2569 time_base.num * (int64_t)AV_TIME_BASE,
2570 AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
2574 ret = s->iformat->read_seek2(s, stream_index, min_ts,
2578 ret = avformat_queue_attached_pictures(s);
2582 if (s->iformat->read_timestamp) {
2583 // try to seek via read_timestamp()
2586 // Fall back on old API if new is not implemented but old is.
2587 // Note the old API has somewhat different semantics.
2588 if (s->iformat->read_seek || 1) {
2589 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2590 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2591 if (ret<0 && ts != min_ts && max_ts != ts) {
2592 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2594 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2599 // try some generic seek like seek_frame_generic() but with new ts semantics
2600 return -1; //unreachable
2603 int avformat_flush(AVFormatContext *s)
2605 ff_read_frame_flush(s);
2609 /*******************************************************/
2612 * Return TRUE if the stream has accurate duration in any stream.
2614 * @return TRUE if the stream has accurate duration for at least one component.
2616 static int has_duration(AVFormatContext *ic)
2621 for (i = 0; i < ic->nb_streams; i++) {
2622 st = ic->streams[i];
2623 if (st->duration != AV_NOPTS_VALUE)
2626 if (ic->duration != AV_NOPTS_VALUE)
2632 * Estimate the stream timings from the one of each components.
2634 * Also computes the global bitrate if possible.
2636 static void update_stream_timings(AVFormatContext *ic)
2638 int64_t start_time, start_time1, start_time_text, end_time, end_time1, end_time_text;
2639 int64_t duration, duration1, duration_text, filesize;
2643 start_time = INT64_MAX;
2644 start_time_text = INT64_MAX;
2645 end_time = INT64_MIN;
2646 end_time_text = INT64_MIN;
2647 duration = INT64_MIN;
2648 duration_text = INT64_MIN;
2650 for (i = 0; i < ic->nb_streams; i++) {
2651 AVStream *st = ic->streams[i];
2652 int is_text = st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE ||
2653 st->codecpar->codec_type == AVMEDIA_TYPE_DATA;
2654 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2655 start_time1 = av_rescale_q(st->start_time, st->time_base,
2658 start_time_text = FFMIN(start_time_text, start_time1);
2660 start_time = FFMIN(start_time, start_time1);
2661 end_time1 = av_rescale_q_rnd(st->duration, st->time_base,
2663 AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
2664 if (end_time1 != AV_NOPTS_VALUE && (end_time1 > 0 ? start_time1 <= INT64_MAX - end_time1 : start_time1 >= INT64_MIN - end_time1)) {
2665 end_time1 += start_time1;
2667 end_time_text = FFMAX(end_time_text, end_time1);
2669 end_time = FFMAX(end_time, end_time1);
2671 for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
2672 if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2673 p->start_time = start_time1;
2674 if (p->end_time < end_time1)
2675 p->end_time = end_time1;
2678 if (st->duration != AV_NOPTS_VALUE) {
2679 duration1 = av_rescale_q(st->duration, st->time_base,
2682 duration_text = FFMAX(duration_text, duration1);
2684 duration = FFMAX(duration, duration1);
2687 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - (uint64_t)start_time_text < AV_TIME_BASE))
2688 start_time = start_time_text;
2689 else if (start_time > start_time_text)
2690 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2692 if (end_time == INT64_MIN || (end_time < end_time_text && end_time_text - (uint64_t)end_time < AV_TIME_BASE))
2693 end_time = end_time_text;
2694 else if (end_time < end_time_text)
2695 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream endtime %f\n", end_time_text / (float)AV_TIME_BASE);
2697 if (duration == INT64_MIN || (duration < duration_text && duration_text - duration < AV_TIME_BASE))
2698 duration = duration_text;
2699 else if (duration < duration_text)
2700 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream duration %f\n", duration_text / (float)AV_TIME_BASE);
2702 if (start_time != INT64_MAX) {
2703 ic->start_time = start_time;
2704 if (end_time != INT64_MIN) {
2705 if (ic->nb_programs > 1) {
2706 for (i = 0; i < ic->nb_programs; i++) {
2707 p = ic->programs[i];
2708 if (p->start_time != AV_NOPTS_VALUE &&
2709 p->end_time > p->start_time &&
2710 p->end_time - (uint64_t)p->start_time <= INT64_MAX)
2711 duration = FFMAX(duration, p->end_time - p->start_time);
2713 } else if (end_time >= start_time && end_time - (uint64_t)start_time <= INT64_MAX) {
2714 duration = FFMAX(duration, end_time - start_time);
2718 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2719 ic->duration = duration;
2721 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration > 0) {
2722 /* compute the bitrate */
2723 double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2724 (double) ic->duration;
2725 if (bitrate >= 0 && bitrate <= INT64_MAX)
2726 ic->bit_rate = bitrate;
2730 static void fill_all_stream_timings(AVFormatContext *ic)
2735 update_stream_timings(ic);
2736 for (i = 0; i < ic->nb_streams; i++) {
2737 st = ic->streams[i];
2738 if (st->start_time == AV_NOPTS_VALUE) {
2739 if (ic->start_time != AV_NOPTS_VALUE)
2740 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
2742 if (ic->duration != AV_NOPTS_VALUE)
2743 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
2749 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2751 int64_t filesize, duration;
2752 int i, show_warning = 0;
2755 /* if bit_rate is already set, we believe it */
2756 if (ic->bit_rate <= 0) {
2757 int64_t bit_rate = 0;
2758 for (i = 0; i < ic->nb_streams; i++) {
2759 st = ic->streams[i];
2760 if (st->codecpar->bit_rate <= 0 && st->internal->avctx->bit_rate > 0)
2761 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
2762 if (st->codecpar->bit_rate > 0) {
2763 if (INT64_MAX - st->codecpar->bit_rate < bit_rate) {
2767 bit_rate += st->codecpar->bit_rate;
2768 } else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && st->codec_info_nb_frames > 1) {
2769 // If we have a videostream with packets but without a bitrate
2770 // then consider the sum not known
2775 ic->bit_rate = bit_rate;
2778 /* if duration is already set, we believe it */
2779 if (ic->duration == AV_NOPTS_VALUE &&
2780 ic->bit_rate != 0) {
2781 filesize = ic->pb ? avio_size(ic->pb) : 0;
2782 if (filesize > ic->internal->data_offset) {
2783 filesize -= ic->internal->data_offset;
2784 for (i = 0; i < ic->nb_streams; i++) {
2785 st = ic->streams[i];
2786 if ( st->time_base.num <= INT64_MAX / ic->bit_rate
2787 && st->duration == AV_NOPTS_VALUE) {
2788 duration = av_rescale(8 * filesize, st->time_base.den,
2790 (int64_t) st->time_base.num);
2791 st->duration = duration;
2798 av_log(ic, AV_LOG_WARNING,
2799 "Estimating duration from bitrate, this may be inaccurate\n");
2802 #define DURATION_MAX_READ_SIZE 250000LL
2803 #define DURATION_MAX_RETRY 6
2805 /* only usable for MPEG-PS streams */
2806 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2808 AVPacket pkt1, *pkt = &pkt1;
2810 int num, den, read_size, i, ret;
2811 int found_duration = 0;
2813 int64_t filesize, offset, duration;
2816 /* flush packet queue */
2817 flush_packet_queue(ic);
2819 for (i = 0; i < ic->nb_streams; i++) {
2820 st = ic->streams[i];
2821 if (st->start_time == AV_NOPTS_VALUE &&
2822 st->first_dts == AV_NOPTS_VALUE &&
2823 st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN)
2824 av_log(ic, AV_LOG_WARNING,
2825 "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2828 av_parser_close(st->parser);
2833 if (ic->skip_estimate_duration_from_pts) {
2834 av_log(ic, AV_LOG_INFO, "Skipping duration calculation in estimate_timings_from_pts\n");
2835 goto skip_duration_calc;
2838 av_opt_set(ic, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN);
2839 /* estimate the end time (duration) */
2840 /* XXX: may need to support wrapping */
2841 filesize = ic->pb ? avio_size(ic->pb) : 0;
2843 is_end = found_duration;
2844 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
2848 avio_seek(ic->pb, offset, SEEK_SET);
2851 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
2855 ret = ff_read_packet(ic, pkt);
2856 } while (ret == AVERROR(EAGAIN));
2859 read_size += pkt->size;
2860 st = ic->streams[pkt->stream_index];
2861 if (pkt->pts != AV_NOPTS_VALUE &&
2862 (st->start_time != AV_NOPTS_VALUE ||
2863 st->first_dts != AV_NOPTS_VALUE)) {
2864 if (pkt->duration == 0) {
2865 ff_compute_frame_duration(ic, &num, &den, st, st->parser, pkt);
2867 pkt->duration = av_rescale_rnd(1,
2868 num * (int64_t) st->time_base.den,
2869 den * (int64_t) st->time_base.num,
2873 duration = pkt->pts + pkt->duration;
2875 if (st->start_time != AV_NOPTS_VALUE)
2876 duration -= st->start_time;
2878 duration -= st->first_dts;
2880 if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
2881 (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2882 st->duration = duration;
2883 st->info->last_duration = duration;
2886 av_packet_unref(pkt);
2889 /* check if all audio/video streams have valid duration */
2892 for (i = 0; i < ic->nb_streams; i++) {
2893 st = ic->streams[i];
2894 switch (st->codecpar->codec_type) {
2895 case AVMEDIA_TYPE_VIDEO:
2896 case AVMEDIA_TYPE_AUDIO:
2897 if (st->duration == AV_NOPTS_VALUE)
2904 ++retry <= DURATION_MAX_RETRY);
2906 av_opt_set(ic, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN);
2908 /* warn about audio/video streams which duration could not be estimated */
2909 for (i = 0; i < ic->nb_streams; i++) {
2910 st = ic->streams[i];
2911 if (st->duration == AV_NOPTS_VALUE) {
2912 switch (st->codecpar->codec_type) {
2913 case AVMEDIA_TYPE_VIDEO:
2914 case AVMEDIA_TYPE_AUDIO:
2915 if (st->start_time != AV_NOPTS_VALUE || st->first_dts != AV_NOPTS_VALUE) {
2916 av_log(ic, AV_LOG_DEBUG, "stream %d : no PTS found at end of file, duration not set\n", i);
2918 av_log(ic, AV_LOG_DEBUG, "stream %d : no TS found at start of file, duration not set\n", i);
2923 fill_all_stream_timings(ic);
2925 avio_seek(ic->pb, old_offset, SEEK_SET);
2926 for (i = 0; i < ic->nb_streams; i++) {
2929 st = ic->streams[i];
2930 st->cur_dts = st->first_dts;
2931 st->last_IP_pts = AV_NOPTS_VALUE;
2932 st->last_dts_for_order_check = AV_NOPTS_VALUE;
2933 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
2934 st->pts_buffer[j] = AV_NOPTS_VALUE;
2938 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2942 /* get the file size, if possible */
2943 if (ic->iformat->flags & AVFMT_NOFILE) {
2946 file_size = avio_size(ic->pb);
2947 file_size = FFMAX(0, file_size);
2950 if ((!strcmp(ic->iformat->name, "mpeg") ||
2951 !strcmp(ic->iformat->name, "mpegts")) &&
2952 file_size && (ic->pb->seekable & AVIO_SEEKABLE_NORMAL)) {
2953 /* get accurate estimate from the PTSes */
2954 estimate_timings_from_pts(ic, old_offset);
2955 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2956 } else if (has_duration(ic)) {
2957 /* at least one component has timings - we use them for all
2959 fill_all_stream_timings(ic);
2960 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2962 /* less precise: use bitrate info */
2963 estimate_timings_from_bit_rate(ic);
2964 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2966 update_stream_timings(ic);
2970 AVStream av_unused *st;
2971 for (i = 0; i < ic->nb_streams; i++) {
2972 st = ic->streams[i];
2973 if (st->time_base.den)
2974 av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %0.3f duration: %0.3f\n", i,
2975 (double) st->start_time * av_q2d(st->time_base),
2976 (double) st->duration * av_q2d(st->time_base));
2978 av_log(ic, AV_LOG_TRACE,
2979 "format: start_time: %0.3f duration: %0.3f bitrate=%"PRId64" kb/s\n",
2980 (double) ic->start_time / AV_TIME_BASE,
2981 (double) ic->duration / AV_TIME_BASE,
2982 (int64_t)ic->bit_rate / 1000);
2986 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2988 AVCodecContext *avctx = st->internal->avctx;
2990 #define FAIL(errmsg) do { \
2992 *errmsg_ptr = errmsg; \
2996 if ( avctx->codec_id == AV_CODEC_ID_NONE
2997 && avctx->codec_type != AVMEDIA_TYPE_DATA)
2998 FAIL("unknown codec");
2999 switch (avctx->codec_type) {
3000 case AVMEDIA_TYPE_AUDIO:
3001 if (!avctx->frame_size && determinable_frame_size(avctx))
3002 FAIL("unspecified frame size");
3003 if (st->info->found_decoder >= 0 &&
3004 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
3005 FAIL("unspecified sample format");
3006 if (!avctx->sample_rate)
3007 FAIL("unspecified sample rate");
3008 if (!avctx->channels)
3009 FAIL("unspecified number of channels");
3010 if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
3011 FAIL("no decodable DTS frames");
3013 case AVMEDIA_TYPE_VIDEO:
3015 FAIL("unspecified size");
3016 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
3017 FAIL("unspecified pixel format");
3018 if (st->codecpar->codec_id == AV_CODEC_ID_RV30 || st->codecpar->codec_id == AV_CODEC_ID_RV40)
3019 if (!st->sample_aspect_ratio.num && !st->codecpar->sample_aspect_ratio.num && !st->codec_info_nb_frames)
3020 FAIL("no frame in rv30/40 and no sar");
3022 case AVMEDIA_TYPE_SUBTITLE:
3023 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
3024 FAIL("unspecified size");
3026 case AVMEDIA_TYPE_DATA:
3027 if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
3033 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
3034 static int try_decode_frame(AVFormatContext *s, AVStream *st,
3035 const AVPacket *avpkt, AVDictionary **options)
3037 AVCodecContext *avctx = st->internal->avctx;
3038 const AVCodec *codec;
3039 int got_picture = 1, ret = 0;
3040 AVFrame *frame = av_frame_alloc();
3041 AVSubtitle subtitle;
3042 AVPacket pkt = *avpkt;
3043 int do_skip_frame = 0;
3044 enum AVDiscard skip_frame;
3047 return AVERROR(ENOMEM);
3049 if (!avcodec_is_open(avctx) &&
3050 st->info->found_decoder <= 0 &&
3051 (st->codecpar->codec_id != -st->info->found_decoder || !st->codecpar->codec_id)) {
3052 AVDictionary *thread_opt = NULL;
3054 codec = find_probe_decoder(s, st, st->codecpar->codec_id);
3057 st->info->found_decoder = -st->codecpar->codec_id;
3062 /* Force thread count to 1 since the H.264 decoder will not extract
3063 * SPS and PPS to extradata during multi-threaded decoding. */
3064 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
3065 if (s->codec_whitelist)
3066 av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
3067 ret = avcodec_open2(avctx, codec, options ? options : &thread_opt);
3069 av_dict_free(&thread_opt);
3071 st->info->found_decoder = -avctx->codec_id;
3074 st->info->found_decoder = 1;
3075 } else if (!st->info->found_decoder)
3076 st->info->found_decoder = 1;
3078 if (st->info->found_decoder < 0) {
3083 if (avpriv_codec_get_cap_skip_frame_fill_param(avctx->codec)) {
3085 skip_frame = avctx->skip_frame;
3086 avctx->skip_frame = AVDISCARD_ALL;
3089 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
3091 (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
3092 (!st->codec_info_nb_frames &&
3093 (avctx->codec->capabilities & AV_CODEC_CAP_CHANNEL_CONF)))) {
3095 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
3096 avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
3097 ret = avcodec_send_packet(avctx, &pkt);
3098 if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3102 ret = avcodec_receive_frame(avctx, frame);
3105 if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
3107 } else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3108 ret = avcodec_decode_subtitle2(avctx, &subtitle,
3109 &got_picture, &pkt);
3115 st->nb_decoded_frames++;
3120 if (!pkt.data && !got_picture)
3124 if (do_skip_frame) {
3125 avctx->skip_frame = skip_frame;
3128 av_frame_free(&frame);
3132 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
3134 while (tags->id != AV_CODEC_ID_NONE) {
3142 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
3145 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3146 if (tag == tags[i].tag)
3148 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3149 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
3151 return AV_CODEC_ID_NONE;
3154 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
3156 if (bps <= 0 || bps > 64)
3157 return AV_CODEC_ID_NONE;
3162 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
3164 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
3166 return AV_CODEC_ID_NONE;
3171 if (sflags & (1 << (bps - 1))) {
3174 return AV_CODEC_ID_PCM_S8;
3176 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
3178 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
3180 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
3182 return be ? AV_CODEC_ID_PCM_S64BE : AV_CODEC_ID_PCM_S64LE;
3184 return AV_CODEC_ID_NONE;
3189 return AV_CODEC_ID_PCM_U8;
3191 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
3193 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
3195 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
3197 return AV_CODEC_ID_NONE;
3203 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
3206 if (!av_codec_get_tag2(tags, id, &tag))
3211 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
3215 for (i = 0; tags && tags[i]; i++) {
3216 const AVCodecTag *codec_tags = tags[i];
3217 while (codec_tags->id != AV_CODEC_ID_NONE) {
3218 if (codec_tags->id == id) {
3219 *tag = codec_tags->tag;
3228 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
3231 for (i = 0; tags && tags[i]; i++) {
3232 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
3233 if (id != AV_CODEC_ID_NONE)
3236 return AV_CODEC_ID_NONE;
3239 static void compute_chapters_end(AVFormatContext *s)
3242 int64_t max_time = 0;
3244 if (s->duration > 0 && s->start_time < INT64_MAX - s->duration)
3245 max_time = s->duration +
3246 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
3248 for (i = 0; i < s->nb_chapters; i++)
3249 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
3250 AVChapter *ch = s->chapters[i];
3251 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
3255 for (j = 0; j < s->nb_chapters; j++) {
3256 AVChapter *ch1 = s->chapters[j];
3257 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
3259 if (j != i && next_start > ch->start && next_start < end)
3262 ch->end = (end == INT64_MAX || end < ch->start) ? ch->start : end;
3266 static int get_std_framerate(int i)
3269 return (i + 1) * 1001;
3273 return (i + 31) * 1001 * 12;
3277 return ((const int[]) { 80, 120, 240})[i] * 1001 * 12;
3281 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
3284 /* Is the time base unreliable?
3285 * This is a heuristic to balance between quick acceptance of the values in
3286 * the headers vs. some extra checks.
3287 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
3288 * MPEG-2 commonly misuses field repeat flags to store different framerates.
3289 * And there are "variable" fps files this needs to detect as well. */
3290 static int tb_unreliable(AVCodecContext *c)
3292 if (c->time_base.den >= 101LL * c->time_base.num ||
3293 c->time_base.den < 5LL * c->time_base.num ||
3294 // c->codec_tag == AV_RL32("DIVX") ||
3295 // c->codec_tag == AV_RL32("XVID") ||
3296 c->codec_tag == AV_RL32("mp4v") ||
3297 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
3298 c->codec_id == AV_CODEC_ID_GIF ||
3299 c->codec_id == AV_CODEC_ID_HEVC ||
3300 c->codec_id == AV_CODEC_ID_H264)
3305 int ff_alloc_extradata(AVCodecParameters *par, int size)
3307 av_freep(&par->extradata);
3308 par->extradata_size = 0;
3310 if (size < 0 || size >= INT32_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
3311 return AVERROR(EINVAL);
3313 par->extradata = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
3314 if (!par->extradata)
3315 return AVERROR(ENOMEM);
3317 memset(par->extradata + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3318 par->extradata_size = size;
3323 int ff_get_extradata(AVFormatContext *s, AVCodecParameters *par, AVIOContext *pb, int size)
3325 int ret = ff_alloc_extradata(par, size);
3328 ret = avio_read(pb, par->extradata, size);
3330 av_freep(&par->extradata);
3331 par->extradata_size = 0;
3332 av_log(s, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
3333 return ret < 0 ? ret : AVERROR_INVALIDDATA;
3339 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
3342 int64_t last = st->info->last_dts;
3344 if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
3345 && ts - (uint64_t)last < INT64_MAX) {
3346 double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
3347 int64_t duration = ts - last;
3349 if (!st->info->duration_error)
3350 st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
3351 if (!st->info->duration_error)
3352 return AVERROR(ENOMEM);
3354 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3355 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
3356 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3357 if (st->info->duration_error[0][1][i] < 1e10) {
3358 int framerate = get_std_framerate(i);
3359 double sdts = dts*framerate/(1001*12);
3360 for (j= 0; j<2; j++) {
3361 int64_t ticks = llrint(sdts+j*0.5);
3362 double error= sdts - ticks + j*0.5;
3363 st->info->duration_error[j][0][i] += error;
3364 st->info->duration_error[j][1][i] += error*error;
3368 if (st->info->rfps_duration_sum <= INT64_MAX - duration) {
3369 st->info->duration_count++;
3370 st->info->rfps_duration_sum += duration;
3373 if (st->info->duration_count % 10 == 0) {
3374 int n = st->info->duration_count;
3375 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3376 if (st->info->duration_error[0][1][i] < 1e10) {
3377 double a0 = st->info->duration_error[0][0][i] / n;
3378 double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
3379 double a1 = st->info->duration_error[1][0][i] / n;
3380 double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
3381 if (error0 > 0.04 && error1 > 0.04) {
3382 st->info->duration_error[0][1][i] = 2e10;
3383 st->info->duration_error[1][1][i] = 2e10;
3389 // ignore the first 4 values, they might have some random jitter
3390 if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
3391 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
3393 if (ts != AV_NOPTS_VALUE)
3394 st->info->last_dts = ts;
3399 void ff_rfps_calculate(AVFormatContext *ic)
3403 for (i = 0; i < ic->nb_streams; i++) {
3404 AVStream *st = ic->streams[i];
3406 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
3408 // the check for tb_unreliable() is not completely correct, since this is not about handling
3409 // an unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3410 // ipmovie.c produces.
3411 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)
3412 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);
3413 if (st->info->duration_count>1 && !st->r_frame_rate.num
3414 && tb_unreliable(st->internal->avctx)) {
3416 double best_error= 0.01;
3417 AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
3419 for (j= 0; j<MAX_STD_TIMEBASES; j++) {
3422 if (st->info->codec_info_duration &&
3423 st->info->codec_info_duration*av_q2d(st->time_base) < (1001*11.5)/get_std_framerate(j))
3425 if (!st->info->codec_info_duration && get_std_framerate(j) < 1001*12)
3428 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
3431 for (k= 0; k<2; k++) {
3432 int n = st->info->duration_count;
3433 double a= st->info->duration_error[k][0][j] / n;
3434 double error= st->info->duration_error[k][1][j]/n - a*a;
3436 if (error < best_error && best_error> 0.000000001) {
3438 num = get_std_framerate(j);
3441 av_log(ic, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
3444 // do not increase frame rate by more than 1 % in order to match a standard rate.
3445 if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
3446 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
3448 if ( !st->avg_frame_rate.num
3449 && st->r_frame_rate.num && st->info->rfps_duration_sum
3450 && st->info->codec_info_duration <= 0
3451 && st->info->duration_count > 2
3452 && 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
3454 av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
3455 st->avg_frame_rate = st->r_frame_rate;
3458 av_freep(&st->info->duration_error);
3459 st->info->last_dts = AV_NOPTS_VALUE;
3460 st->info->duration_count = 0;
3461 st->info->rfps_duration_sum = 0;
3465 static int extract_extradata_check(AVStream *st)
3467 const AVBitStreamFilter *f;
3469 f = av_bsf_get_by_name("extract_extradata");
3474 const enum AVCodecID *ids;
3475 for (ids = f->codec_ids; *ids != AV_CODEC_ID_NONE; ids++)
3476 if (*ids == st->codecpar->codec_id)
3483 static int extract_extradata_init(AVStream *st)
3485 AVStreamInternal *sti = st->internal;
3486 const AVBitStreamFilter *f;
3489 f = av_bsf_get_by_name("extract_extradata");
3493 /* check that the codec id is supported */
3494 ret = extract_extradata_check(st);
3498 sti->extract_extradata.pkt = av_packet_alloc();
3499 if (!sti->extract_extradata.pkt)
3500 return AVERROR(ENOMEM);
3502 ret = av_bsf_alloc(f, &sti->extract_extradata.bsf);
3506 ret = avcodec_parameters_copy(sti->extract_extradata.bsf->par_in,
3511 sti->extract_extradata.bsf->time_base_in = st->time_base;
3513 ret = av_bsf_init(sti->extract_extradata.bsf);
3518 sti->extract_extradata.inited = 1;
3522 av_bsf_free(&sti->extract_extradata.bsf);
3523 av_packet_free(&sti->extract_extradata.pkt);
3527 static int extract_extradata(AVStream *st, const AVPacket *pkt)
3529 AVStreamInternal *sti = st->internal;
3533 if (!sti->extract_extradata.inited) {
3534 ret = extract_extradata_init(st);
3539 if (sti->extract_extradata.inited && !sti->extract_extradata.bsf)
3542 pkt_ref = sti->extract_extradata.pkt;
3543 ret = av_packet_ref(pkt_ref, pkt);
3547 ret = av_bsf_send_packet(sti->extract_extradata.bsf, pkt_ref);
3549 av_packet_unref(pkt_ref);
3553 while (ret >= 0 && !sti->avctx->extradata) {
3557 ret = av_bsf_receive_packet(sti->extract_extradata.bsf, pkt_ref);
3559 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3564 extradata = av_packet_get_side_data(pkt_ref, AV_PKT_DATA_NEW_EXTRADATA,
3568 av_assert0(!sti->avctx->extradata);
3569 if ((unsigned)extradata_size < FF_MAX_EXTRADATA_SIZE)
3570 sti->avctx->extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
3571 if (!sti->avctx->extradata) {
3572 av_packet_unref(pkt_ref);
3573 return AVERROR(ENOMEM);
3575 memcpy(sti->avctx->extradata, extradata, extradata_size);
3576 sti->avctx->extradata_size = extradata_size;
3578 av_packet_unref(pkt_ref);
3584 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3586 int i, count = 0, ret = 0, j;
3589 AVCodecContext *avctx;
3591 int64_t old_offset = avio_tell(ic->pb);
3592 // new streams might appear, no options for those
3593 int orig_nb_streams = ic->nb_streams;
3595 int64_t max_analyze_duration = ic->max_analyze_duration;
3596 int64_t max_stream_analyze_duration;
3597 int64_t max_subtitle_analyze_duration;
3598 int64_t probesize = ic->probesize;
3599 int eof_reached = 0;
3600 int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
3602 flush_codecs = probesize > 0;
3604 av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3606 max_stream_analyze_duration = max_analyze_duration;
3607 max_subtitle_analyze_duration = max_analyze_duration;
3608 if (!max_analyze_duration) {
3609 max_stream_analyze_duration =
3610 max_analyze_duration = 5*AV_TIME_BASE;
3611 max_subtitle_analyze_duration = 30*AV_TIME_BASE;
3612 if (!strcmp(ic->iformat->name, "flv"))
3613 max_stream_analyze_duration = 90*AV_TIME_BASE;
3614 if (!strcmp(ic->iformat->name, "mpeg") || !strcmp(ic->iformat->name, "mpegts"))
3615 max_stream_analyze_duration = 7*AV_TIME_BASE;
3619 av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d nb_streams:%d\n",
3620 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, ic->nb_streams);
3622 for (i = 0; i < ic->nb_streams; i++) {
3623 const AVCodec *codec;
3624 AVDictionary *thread_opt = NULL;
3625 st = ic->streams[i];
3626 avctx = st->internal->avctx;
3628 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3629 st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3630 /* if (!st->time_base.num)
3632 if (!avctx->time_base.num)
3633 avctx->time_base = st->time_base;
3636 /* check if the caller has overridden the codec id */
3637 #if FF_API_LAVF_AVCTX
3638 FF_DISABLE_DEPRECATION_WARNINGS
3639 if (st->codec->codec_id != st->internal->orig_codec_id) {
3640 st->codecpar->codec_id = st->codec->codec_id;
3641 st->codecpar->codec_type = st->codec->codec_type;
3642 st->internal->orig_codec_id = st->codec->codec_id;
3644 FF_ENABLE_DEPRECATION_WARNINGS
3646 // only for the split stuff
3647 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->request_probe <= 0) {
3648 st->parser = av_parser_init(st->codecpar->codec_id);
3650 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3651 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3652 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3653 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3655 } else if (st->need_parsing) {
3656 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3657 "%s, packets or times may be invalid.\n",
3658 avcodec_get_name(st->codecpar->codec_id));
3662 if (st->codecpar->codec_id != st->internal->orig_codec_id)
3663 st->internal->orig_codec_id = st->codecpar->codec_id;
3665 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3667 goto find_stream_info_err;
3668 if (st->request_probe <= 0)
3669 st->internal->avctx_inited = 1;
3671 codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3673 /* Force thread count to 1 since the H.264 decoder will not extract
3674 * SPS and PPS to extradata during multi-threaded decoding. */
3675 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3677 if (ic->codec_whitelist)
3678 av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3680 /* Ensure that subtitle_header is properly set. */
3681 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE
3682 && codec && !avctx->codec) {
3683 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3684 av_log(ic, AV_LOG_WARNING,
3685 "Failed to open codec in %s\n",__FUNCTION__);
3688 // Try to just open decoders, in case this is enough to get parameters.
3689 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3690 if (codec && !avctx->codec)
3691 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3692 av_log(ic, AV_LOG_WARNING,
3693 "Failed to open codec in %s\n",__FUNCTION__);
3696 av_dict_free(&thread_opt);
3699 for (i = 0; i < ic->nb_streams; i++) {
3700 #if FF_API_R_FRAME_RATE
3701 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3703 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3704 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
3709 const AVPacket *pkt;
3710 int analyzed_all_streams;
3711 if (ff_check_interrupt(&ic->interrupt_callback)) {
3713 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3717 /* check if one codec still needs to be handled */
3718 for (i = 0; i < ic->nb_streams; i++) {
3719 int fps_analyze_framecount = 20;
3722 st = ic->streams[i];
3723 if (!has_codec_parameters(st, NULL))
3725 /* If the timebase is coarse (like the usual millisecond precision
3726 * of mkv), we need to analyze more frames to reliably arrive at
3727 * the correct fps. */
3728 if (av_q2d(st->time_base) > 0.0005)
3729 fps_analyze_framecount *= 2;
3730 if (!tb_unreliable(st->internal->avctx))
3731 fps_analyze_framecount = 0;
3732 if (ic->fps_probe_size >= 0)
3733 fps_analyze_framecount = ic->fps_probe_size;
3734 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3735 fps_analyze_framecount = 0;
3736 /* variable fps and no guess at the real fps */
3737 count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
3738 st->info->codec_info_duration_fields/2 :
3739 st->info->duration_count;
3740 if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3741 st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3742 if (count < fps_analyze_framecount)
3745 // Look at the first 3 frames if there is evidence of frame delay
3746 // but the decoder delay is not set.
3747 if (st->info->frame_delay_evidence && count < 2 && st->internal->avctx->has_b_frames == 0)
3749 if (!st->internal->avctx->extradata &&
3750 (!st->internal->extract_extradata.inited ||
3751 st->internal->extract_extradata.bsf) &&
3752 extract_extradata_check(st))
3754 if (st->first_dts == AV_NOPTS_VALUE &&
3755 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3756 st->codec_info_nb_frames < ((st->disposition & AV_DISPOSITION_ATTACHED_PIC) ? 1 : ic->max_ts_probe) &&
3757 (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3758 st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))
3761 analyzed_all_streams = 0;
3762 if (!missing_streams || !*missing_streams)
3763 if (i == ic->nb_streams) {
3764 analyzed_all_streams = 1;
3765 /* NOTE: If the format has no header, then we need to read some
3766 * packets to get most of the streams, so we cannot stop here. */
3767 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3768 /* If we found the info for all the codecs, we can stop. */
3770 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3775 /* We did not get all the codec info, but we read too much data. */
3776 if (read_size >= probesize) {
3778 av_log(ic, AV_LOG_DEBUG,
3779 "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3780 for (i = 0; i < ic->nb_streams; i++)
3781 if (!ic->streams[i]->r_frame_rate.num &&
3782 ic->streams[i]->info->duration_count <= 1 &&
3783 ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
3784 strcmp(ic->iformat->name, "image2"))
3785 av_log(ic, AV_LOG_WARNING,
3786 "Stream #%d: not enough frames to estimate rate; "
3787 "consider increasing probesize\n", i);
3791 /* NOTE: A new stream can be added there if no header in file
3792 * (AVFMTCTX_NOHEADER). */
3793 ret = read_frame_internal(ic, &pkt1);
3794 if (ret == AVERROR(EAGAIN))
3803 if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
3804 ret = ff_packet_list_put(&ic->internal->packet_buffer,
3805 &ic->internal->packet_buffer_end,
3808 goto find_stream_info_err;
3810 pkt = &ic->internal->packet_buffer_end->pkt;
3815 st = ic->streams[pkt->stream_index];
3816 if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3817 read_size += pkt->size;
3819 avctx = st->internal->avctx;
3820 if (!st->internal->avctx_inited) {
3821 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3823 goto find_stream_info_err;
3824 st->internal->avctx_inited = 1;
3827 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3828 /* check for non-increasing dts */
3829 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3830 st->info->fps_last_dts >= pkt->dts) {
3831 av_log(ic, AV_LOG_DEBUG,
3832 "Non-increasing DTS in stream %d: packet %d with DTS "
3833 "%"PRId64", packet %d with DTS %"PRId64"\n",
3834 st->index, st->info->fps_last_dts_idx,
3835 st->info->fps_last_dts, st->codec_info_nb_frames,
3837 st->info->fps_first_dts =
3838 st->info->fps_last_dts = AV_NOPTS_VALUE;
3840 /* Check for a discontinuity in dts. If the difference in dts
3841 * is more than 1000 times the average packet duration in the
3842 * sequence, we treat it as a discontinuity. */
3843 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3844 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3845 (pkt->dts - (uint64_t)st->info->fps_last_dts) / 1000 >
3846 (st->info->fps_last_dts - (uint64_t)st->info->fps_first_dts) /
3847 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3848 av_log(ic, AV_LOG_WARNING,
3849 "DTS discontinuity in stream %d: packet %d with DTS "
3850 "%"PRId64", packet %d with DTS %"PRId64"\n",
3851 st->index, st->info->fps_last_dts_idx,
3852 st->info->fps_last_dts, st->codec_info_nb_frames,
3854 st->info->fps_first_dts =
3855 st->info->fps_last_dts = AV_NOPTS_VALUE;
3858 /* update stored dts values */
3859 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3860 st->info->fps_first_dts = pkt->dts;
3861 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3863 st->info->fps_last_dts = pkt->dts;
3864 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3866 if (st->codec_info_nb_frames>1) {
3870 if (st->time_base.den > 0)
3871 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3872 if (st->avg_frame_rate.num > 0)
3873 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3876 && st->codec_info_nb_frames>30
3877 && st->info->fps_first_dts != AV_NOPTS_VALUE
3878 && st->info->fps_last_dts != AV_NOPTS_VALUE)
3879 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3881 if (analyzed_all_streams) limit = max_analyze_duration;
3882 else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) limit = max_subtitle_analyze_duration;
3883 else limit = max_stream_analyze_duration;
3886 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds st:%d\n",
3888 t, pkt->stream_index);
3889 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3890 av_packet_unref(&pkt1);
3893 if (pkt->duration) {
3894 if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE && pkt->pts != AV_NOPTS_VALUE && st->start_time != AV_NOPTS_VALUE && pkt->pts >= st->start_time) {
3895 st->info->codec_info_duration = FFMIN(pkt->pts - st->start_time, st->info->codec_info_duration + pkt->duration);
3897 st->info->codec_info_duration += pkt->duration;
3898 st->info->codec_info_duration_fields += st->parser && st->need_parsing && avctx->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3901 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3902 #if FF_API_R_FRAME_RATE
3903 ff_rfps_add_frame(ic, st, pkt->dts);
3905 if (pkt->dts != pkt->pts && pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE)
3906 st->info->frame_delay_evidence = 1;
3908 if (!st->internal->avctx->extradata) {
3909 ret = extract_extradata(st, pkt);
3911 goto find_stream_info_err;
3914 /* If still no information, we try to open the codec and to
3915 * decompress the frame. We try to avoid that in most cases as
3916 * it takes longer and uses more memory. For MPEG-4, we need to
3917 * decompress for QuickTime.
3919 * If AV_CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3920 * least one frame of codec data, this makes sure the codec initializes
3921 * the channel configuration and does not only trust the values from
3923 try_decode_frame(ic, st, pkt,
3924 (options && i < orig_nb_streams) ? &options[i] : NULL);
3926 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3927 av_packet_unref(&pkt1);
3929 st->codec_info_nb_frames++;
3935 for (stream_index = 0; stream_index < ic->nb_streams; stream_index++) {
3936 st = ic->streams[stream_index];
3937 avctx = st->internal->avctx;
3938 if (!has_codec_parameters(st, NULL)) {
3939 const AVCodec *codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3940 if (codec && !avctx->codec) {
3941 AVDictionary *opts = NULL;
3942 if (ic->codec_whitelist)
3943 av_dict_set(&opts, "codec_whitelist", ic->codec_whitelist, 0);
3944 if (avcodec_open2(avctx, codec, (options && stream_index < orig_nb_streams) ? &options[stream_index] : &opts) < 0)
3945 av_log(ic, AV_LOG_WARNING,
3946 "Failed to open codec in %s\n",__FUNCTION__);
3947 av_dict_free(&opts);
3951 // EOF already reached while reading the stream above.
3952 // So continue with reoordering DTS with whatever delay we have.
3953 if (ic->internal->packet_buffer && !has_decode_delay_been_guessed(st)) {
3954 update_dts_from_pts(ic, stream_index, ic->internal->packet_buffer);
3960 AVPacket empty_pkt = { 0 };
3962 av_init_packet(&empty_pkt);
3964 for (i = 0; i < ic->nb_streams; i++) {
3966 st = ic->streams[i];
3968 /* flush the decoders */
3969 if (st->info->found_decoder == 1) {
3971 err = try_decode_frame(ic, st, &empty_pkt,
3972 (options && i < orig_nb_streams)
3973 ? &options[i] : NULL);
3974 } while (err > 0 && !has_codec_parameters(st, NULL));
3977 av_log(ic, AV_LOG_INFO,
3978 "decoding for stream %d failed\n", st->index);
3984 ff_rfps_calculate(ic);
3986 for (i = 0; i < ic->nb_streams; i++) {
3987 st = ic->streams[i];
3988 avctx = st->internal->avctx;
3989 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
3990 if (avctx->codec_id == AV_CODEC_ID_RAWVIDEO && !avctx->codec_tag && !avctx->bits_per_coded_sample) {
3991 uint32_t tag= avcodec_pix_fmt_to_codec_tag(avctx->pix_fmt);
3992 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == avctx->pix_fmt)
3993 avctx->codec_tag= tag;
3996 /* estimate average framerate if not set by demuxer */
3997 if (st->info->codec_info_duration_fields &&
3998 !st->avg_frame_rate.num &&
3999 st->info->codec_info_duration) {
4001 double best_error = 0.01;
4002 AVRational codec_frame_rate = avctx->framerate;
4004 if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
4005 st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
4006 st->info->codec_info_duration < 0)
4008 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
4009 st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
4010 st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
4012 /* Round guessed framerate to a "standard" framerate if it's
4013 * within 1% of the original estimate. */
4014 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
4015 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
4016 double error = fabs(av_q2d(st->avg_frame_rate) /
4017 av_q2d(std_fps) - 1);
4019 if (error < best_error) {
4021 best_fps = std_fps.num;
4024 if (ic->internal->prefer_codec_framerate && codec_frame_rate.num > 0 && codec_frame_rate.den > 0) {
4025 error = fabs(av_q2d(codec_frame_rate) /
4026 av_q2d(std_fps) - 1);
4027 if (error < best_error) {
4029 best_fps = std_fps.num;
4034 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
4035 best_fps, 12 * 1001, INT_MAX);
4038 if (!st->r_frame_rate.num) {
4039 if ( avctx->time_base.den * (int64_t) st->time_base.num
4040 <= avctx->time_base.num * avctx->ticks_per_frame * (int64_t) st->time_base.den) {
4041 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den,
4042 avctx->time_base.den, (int64_t)avctx->time_base.num * avctx->ticks_per_frame, INT_MAX);
4044 st->r_frame_rate.num = st->time_base.den;
4045 st->r_frame_rate.den = st->time_base.num;
4048 if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
4049 AVRational hw_ratio = { avctx->height, avctx->width };
4050 st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
4053 } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
4054 if (!avctx->bits_per_coded_sample)
4055 avctx->bits_per_coded_sample =
4056 av_get_bits_per_sample(avctx->codec_id);
4057 // set stream disposition based on audio service type
4058 switch (avctx->audio_service_type) {
4059 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
4060 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
4062 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
4063 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
4065 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
4066 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
4068 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
4069 st->disposition = AV_DISPOSITION_COMMENT;
4071 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
4072 st->disposition = AV_DISPOSITION_KARAOKE;
4079 estimate_timings(ic, old_offset);
4081 av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
4083 if (ret >= 0 && ic->nb_streams)
4084 /* We could not have all the codec parameters before EOF. */
4086 for (i = 0; i < ic->nb_streams; i++) {
4088 st = ic->streams[i];
4090 /* if no packet was ever seen, update context now for has_codec_parameters */
4091 if (!st->internal->avctx_inited) {
4092 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
4093 st->codecpar->format == AV_SAMPLE_FMT_NONE)
4094 st->codecpar->format = st->internal->avctx->sample_fmt;
4095 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
4097 goto find_stream_info_err;
4099 if (!has_codec_parameters(st, &errmsg)) {
4101 avcodec_string(buf, sizeof(buf), st->internal->avctx, 0);
4102 av_log(ic, AV_LOG_WARNING,
4103 "Could not find codec parameters for stream %d (%s): %s\n"
4104 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
4111 compute_chapters_end(ic);
4113 /* update the stream parameters from the internal codec contexts */
4114 for (i = 0; i < ic->nb_streams; i++) {
4115 st = ic->streams[i];
4117 if (st->internal->avctx_inited) {
4118 int orig_w = st->codecpar->width;
4119 int orig_h = st->codecpar->height;
4120 ret = avcodec_parameters_from_context(st->codecpar, st->internal->avctx);
4122 goto find_stream_info_err;
4124 // The decoder might reduce the video size by the lowres factor.
4125 if (st->internal->avctx->lowres && orig_w) {
4126 st->codecpar->width = orig_w;
4127 st->codecpar->height = orig_h;
4132 #if FF_API_LAVF_AVCTX
4133 FF_DISABLE_DEPRECATION_WARNINGS
4134 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
4136 goto find_stream_info_err;
4139 // The old API (AVStream.codec) "requires" the resolution to be adjusted
4140 // by the lowres factor.
4141 if (st->internal->avctx->lowres && st->internal->avctx->width) {
4142 st->codec->lowres = st->internal->avctx->lowres;
4143 st->codec->width = st->internal->avctx->width;
4144 st->codec->height = st->internal->avctx->height;
4148 if (st->codec->codec_tag != MKTAG('t','m','c','d')) {
4149 st->codec->time_base = st->internal->avctx->time_base;
4150 st->codec->ticks_per_frame = st->internal->avctx->ticks_per_frame;
4152 st->codec->framerate = st->avg_frame_rate;
4154 if (st->internal->avctx->subtitle_header) {
4155 st->codec->subtitle_header = av_malloc(st->internal->avctx->subtitle_header_size);
4156 if (!st->codec->subtitle_header)
4157 goto find_stream_info_err;
4158 st->codec->subtitle_header_size = st->internal->avctx->subtitle_header_size;
4159 memcpy(st->codec->subtitle_header, st->internal->avctx->subtitle_header,
4160 st->codec->subtitle_header_size);
4163 // Fields unavailable in AVCodecParameters
4164 st->codec->coded_width = st->internal->avctx->coded_width;
4165 st->codec->coded_height = st->internal->avctx->coded_height;
4166 st->codec->properties = st->internal->avctx->properties;
4167 FF_ENABLE_DEPRECATION_WARNINGS
4170 st->internal->avctx_inited = 0;
4173 find_stream_info_err:
4174 for (i = 0; i < ic->nb_streams; i++) {
4175 st = ic->streams[i];
4177 av_freep(&st->info->duration_error);
4178 avcodec_close(ic->streams[i]->internal->avctx);
4179 av_freep(&ic->streams[i]->info);
4180 av_bsf_free(&ic->streams[i]->internal->extract_extradata.bsf);
4181 av_packet_free(&ic->streams[i]->internal->extract_extradata.pkt);
4184 av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
4185 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
4189 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
4193 for (i = 0; i < ic->nb_programs; i++) {
4194 if (ic->programs[i] == last) {
4198 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
4199 if (ic->programs[i]->stream_index[j] == s)
4200 return ic->programs[i];
4206 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
4207 int wanted_stream_nb, int related_stream,
4208 AVCodec **decoder_ret, int flags)
4210 int i, nb_streams = ic->nb_streams;
4211 int ret = AVERROR_STREAM_NOT_FOUND;
4212 int best_count = -1, best_multiframe = -1, best_disposition = -1;
4213 int count, multiframe, disposition;
4214 int64_t best_bitrate = -1;
4216 unsigned *program = NULL;
4217 const AVCodec *decoder = NULL, *best_decoder = NULL;
4219 if (related_stream >= 0 && wanted_stream_nb < 0) {
4220 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
4222 program = p->stream_index;
4223 nb_streams = p->nb_stream_indexes;
4226 for (i = 0; i < nb_streams; i++) {
4227 int real_stream_index = program ? program[i] : i;
4228 AVStream *st = ic->streams[real_stream_index];
4229 AVCodecParameters *par = st->codecpar;
4230 if (par->codec_type != type)
4232 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
4234 if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate))
4237 decoder = find_decoder(ic, st, par->codec_id);
4240 ret = AVERROR_DECODER_NOT_FOUND;
4244 disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED))
4245 + !! (st->disposition & AV_DISPOSITION_DEFAULT);
4246 count = st->codec_info_nb_frames;
4247 bitrate = par->bit_rate;
4248 multiframe = FFMIN(5, count);
4249 if ((best_disposition > disposition) ||
4250 (best_disposition == disposition && best_multiframe > multiframe) ||
4251 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate > bitrate) ||
4252 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
4254 best_disposition = disposition;
4256 best_bitrate = bitrate;
4257 best_multiframe = multiframe;
4258 ret = real_stream_index;
4259 best_decoder = decoder;
4260 if (program && i == nb_streams - 1 && ret < 0) {
4262 nb_streams = ic->nb_streams;
4263 /* no related stream found, try again with everything */
4268 *decoder_ret = (AVCodec*)best_decoder;
4272 /*******************************************************/
4274 int av_read_play(AVFormatContext *s)
4276 if (s->iformat->read_play)
4277 return s->iformat->read_play(s);
4279 return avio_pause(s->pb, 0);
4280 return AVERROR(ENOSYS);
4283 int av_read_pause(AVFormatContext *s)
4285 if (s->iformat->read_pause)
4286 return s->iformat->read_pause(s);
4288 return avio_pause(s->pb, 1);
4289 return AVERROR(ENOSYS);
4292 int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src)
4297 dst->time_base = src->time_base;
4298 dst->nb_frames = src->nb_frames;
4299 dst->disposition = src->disposition;
4300 dst->sample_aspect_ratio = src->sample_aspect_ratio;
4301 dst->avg_frame_rate = src->avg_frame_rate;
4302 dst->r_frame_rate = src->r_frame_rate;
4304 av_dict_free(&dst->metadata);
4305 ret = av_dict_copy(&dst->metadata, src->metadata, 0);
4309 ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
4313 /* Free existing side data*/
4314 for (i = 0; i < dst->nb_side_data; i++)
4315 av_free(dst->side_data[i].data);
4316 av_freep(&dst->side_data);
4317 dst->nb_side_data = 0;
4319 /* Copy side data if present */
4320 if (src->nb_side_data) {
4321 dst->side_data = av_mallocz_array(src->nb_side_data,
4322 sizeof(AVPacketSideData));
4323 if (!dst->side_data)
4324 return AVERROR(ENOMEM);
4325 dst->nb_side_data = src->nb_side_data;
4327 for (i = 0; i < src->nb_side_data; i++) {
4328 uint8_t *data = av_memdup(src->side_data[i].data,
4329 src->side_data[i].size);
4331 return AVERROR(ENOMEM);
4332 dst->side_data[i].type = src->side_data[i].type;
4333 dst->side_data[i].size = src->side_data[i].size;
4334 dst->side_data[i].data = data;
4338 #if FF_API_LAVF_FFSERVER
4339 FF_DISABLE_DEPRECATION_WARNINGS
4340 av_freep(&dst->recommended_encoder_configuration);
4341 if (src->recommended_encoder_configuration) {
4342 const char *conf_str = src->recommended_encoder_configuration;
4343 dst->recommended_encoder_configuration = av_strdup(conf_str);
4344 if (!dst->recommended_encoder_configuration)
4345 return AVERROR(ENOMEM);
4347 FF_ENABLE_DEPRECATION_WARNINGS
4353 static void free_stream(AVStream **pst)
4355 AVStream *st = *pst;
4361 for (i = 0; i < st->nb_side_data; i++)
4362 av_freep(&st->side_data[i].data);
4363 av_freep(&st->side_data);
4366 av_parser_close(st->parser);
4368 if (st->attached_pic.data)
4369 av_packet_unref(&st->attached_pic);
4372 avcodec_free_context(&st->internal->avctx);
4373 for (i = 0; i < st->internal->nb_bsfcs; i++) {
4374 av_bsf_free(&st->internal->bsfcs[i]);
4375 av_freep(&st->internal->bsfcs);
4377 av_freep(&st->internal->priv_pts);
4378 av_bsf_free(&st->internal->extract_extradata.bsf);
4379 av_packet_free(&st->internal->extract_extradata.pkt);
4381 av_freep(&st->internal);
4383 av_dict_free(&st->metadata);
4384 avcodec_parameters_free(&st->codecpar);
4385 av_freep(&st->probe_data.buf);
4386 av_freep(&st->index_entries);
4387 #if FF_API_LAVF_AVCTX
4388 FF_DISABLE_DEPRECATION_WARNINGS
4389 avcodec_free_context(&st->codec);
4390 FF_ENABLE_DEPRECATION_WARNINGS
4392 av_freep(&st->priv_data);
4394 av_freep(&st->info->duration_error);
4395 av_freep(&st->info);
4396 #if FF_API_LAVF_FFSERVER
4397 FF_DISABLE_DEPRECATION_WARNINGS
4398 av_freep(&st->recommended_encoder_configuration);
4399 FF_ENABLE_DEPRECATION_WARNINGS
4405 void ff_free_stream(AVFormatContext *s, AVStream *st)
4407 av_assert0(s->nb_streams>0);
4408 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
4410 free_stream(&s->streams[ --s->nb_streams ]);
4413 void avformat_free_context(AVFormatContext *s)
4421 if (s->iformat && s->iformat->priv_class && s->priv_data)
4422 av_opt_free(s->priv_data);
4423 if (s->oformat && s->oformat->priv_class && s->priv_data)
4424 av_opt_free(s->priv_data);
4426 for (i = s->nb_streams - 1; i >= 0; i--)
4427 ff_free_stream(s, s->streams[i]);
4430 for (i = s->nb_programs - 1; i >= 0; i--) {
4431 av_dict_free(&s->programs[i]->metadata);
4432 av_freep(&s->programs[i]->stream_index);
4433 av_freep(&s->programs[i]);
4435 av_freep(&s->programs);
4436 av_freep(&s->priv_data);
4437 while (s->nb_chapters--) {
4438 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
4439 av_freep(&s->chapters[s->nb_chapters]);
4441 av_freep(&s->chapters);
4442 av_dict_free(&s->metadata);
4443 av_dict_free(&s->internal->id3v2_meta);
4444 av_freep(&s->streams);
4445 flush_packet_queue(s);
4446 av_freep(&s->internal);
4451 void avformat_close_input(AVFormatContext **ps)
4462 if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
4463 (s->flags & AVFMT_FLAG_CUSTOM_IO))
4466 flush_packet_queue(s);
4469 if (s->iformat->read_close)
4470 s->iformat->read_close(s);
4472 avformat_free_context(s);
4479 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
4485 if (s->nb_streams >= FFMIN(s->max_streams, INT_MAX/sizeof(*streams))) {
4486 if (s->max_streams < INT_MAX/sizeof(*streams))
4487 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);
4490 streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
4493 s->streams = streams;
4495 st = av_mallocz(sizeof(AVStream));
4498 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
4502 st->info->last_dts = AV_NOPTS_VALUE;
4504 #if FF_API_LAVF_AVCTX
4505 FF_DISABLE_DEPRECATION_WARNINGS
4506 st->codec = avcodec_alloc_context3(c);
4512 FF_ENABLE_DEPRECATION_WARNINGS
4515 st->internal = av_mallocz(sizeof(*st->internal));
4519 st->codecpar = avcodec_parameters_alloc();
4523 st->internal->avctx = avcodec_alloc_context3(NULL);
4524 if (!st->internal->avctx)
4528 #if FF_API_LAVF_AVCTX
4529 FF_DISABLE_DEPRECATION_WARNINGS
4530 /* no default bitrate if decoding */
4531 st->codec->bit_rate = 0;
4532 FF_ENABLE_DEPRECATION_WARNINGS
4535 /* default pts setting is MPEG-like */
4536 avpriv_set_pts_info(st, 33, 1, 90000);
4537 /* we set the current DTS to 0 so that formats without any timestamps
4538 * but durations get some timestamps, formats with some unknown
4539 * timestamps have their first few packets buffered and the
4540 * timestamps corrected before they are returned to the user */
4541 st->cur_dts = RELATIVE_TS_BASE;
4543 st->cur_dts = AV_NOPTS_VALUE;
4546 st->index = s->nb_streams;
4547 st->start_time = AV_NOPTS_VALUE;
4548 st->duration = AV_NOPTS_VALUE;
4549 st->first_dts = AV_NOPTS_VALUE;
4550 st->probe_packets = MAX_PROBE_PACKETS;
4551 st->pts_wrap_reference = AV_NOPTS_VALUE;
4552 st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4554 st->last_IP_pts = AV_NOPTS_VALUE;
4555 st->last_dts_for_order_check = AV_NOPTS_VALUE;
4556 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
4557 st->pts_buffer[i] = AV_NOPTS_VALUE;
4559 st->sample_aspect_ratio = (AVRational) { 0, 1 };
4561 #if FF_API_R_FRAME_RATE
4562 st->info->last_dts = AV_NOPTS_VALUE;
4564 st->info->fps_first_dts = AV_NOPTS_VALUE;
4565 st->info->fps_last_dts = AV_NOPTS_VALUE;
4567 st->inject_global_side_data = s->internal->inject_global_side_data;
4569 st->internal->need_context_update = 1;
4571 s->streams[s->nb_streams++] = st;
4578 AVProgram *av_new_program(AVFormatContext *ac, int id)
4580 AVProgram *program = NULL;
4583 av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
4585 for (i = 0; i < ac->nb_programs; i++)
4586 if (ac->programs[i]->id == id)
4587 program = ac->programs[i];
4590 program = av_mallocz(sizeof(AVProgram));
4593 dynarray_add(&ac->programs, &ac->nb_programs, program);
4594 program->discard = AVDISCARD_NONE;
4595 program->pmt_version = -1;
4598 program->pts_wrap_reference = AV_NOPTS_VALUE;
4599 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4601 program->start_time =
4602 program->end_time = AV_NOPTS_VALUE;
4607 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
4608 int64_t start, int64_t end, const char *title)
4610 AVChapter *chapter = NULL;
4613 if (end != AV_NOPTS_VALUE && start > end) {
4614 av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
4618 for (i = 0; i < s->nb_chapters; i++)
4619 if (s->chapters[i]->id == id)
4620 chapter = s->chapters[i];
4623 chapter = av_mallocz(sizeof(AVChapter));
4626 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
4628 av_dict_set(&chapter->metadata, "title", title, 0);
4630 chapter->time_base = time_base;
4631 chapter->start = start;
4637 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
4640 AVProgram *program = NULL;
4643 if (idx >= ac->nb_streams) {
4644 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
4648 for (i = 0; i < ac->nb_programs; i++) {
4649 if (ac->programs[i]->id != progid)
4651 program = ac->programs[i];
4652 for (j = 0; j < program->nb_stream_indexes; j++)
4653 if (program->stream_index[j] == idx)
4656 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
4659 program->stream_index = tmp;
4660 program->stream_index[program->nb_stream_indexes++] = idx;
4665 uint64_t ff_ntp_time(void)
4667 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
4670 uint64_t ff_get_formatted_ntp_time(uint64_t ntp_time_us)
4672 uint64_t ntp_ts, frac_part, sec;
4675 //current ntp time in seconds and micro seconds
4676 sec = ntp_time_us / 1000000;
4677 usec = ntp_time_us % 1000000;
4679 //encoding in ntp timestamp format
4680 frac_part = usec * 0xFFFFFFFFULL;
4681 frac_part /= 1000000;
4683 if (sec > 0xFFFFFFFFULL)
4684 av_log(NULL, AV_LOG_WARNING, "NTP time format roll over detected\n");
4687 ntp_ts |= frac_part;
4692 int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags)
4695 char *q, buf1[20], c;
4696 int nd, len, percentd_found;
4708 while (av_isdigit(*p))
4709 nd = nd * 10 + *p++ - '0';
4711 } while (av_isdigit(c));
4717 if (!(flags & AV_FRAME_FILENAME_FLAGS_MULTIPLE) && percentd_found)
4722 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
4724 if ((q - buf + len) > buf_size - 1)
4726 memcpy(q, buf1, len);
4734 if ((q - buf) < buf_size - 1)
4738 if (!percentd_found)
4747 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
4749 return av_get_frame_filename2(buf, buf_size, path, number, 0);
4752 void av_url_split(char *proto, int proto_size,
4753 char *authorization, int authorization_size,
4754 char *hostname, int hostname_size,
4755 int *port_ptr, char *path, int path_size, const char *url)
4757 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
4763 if (authorization_size > 0)
4764 authorization[0] = 0;
4765 if (hostname_size > 0)
4770 /* parse protocol */
4771 if ((p = strchr(url, ':'))) {
4772 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4779 /* no protocol means plain filename */
4780 av_strlcpy(path, url, path_size);
4784 /* separate path from hostname */
4785 ls = strchr(p, '/');
4786 ls2 = strchr(p, '?');
4790 ls = FFMIN(ls, ls2);
4792 av_strlcpy(path, ls, path_size);
4794 ls = &p[strlen(p)]; // XXX
4796 /* the rest is hostname, use that to parse auth/port */
4798 /* authorization (user[:pass]@hostname) */
4800 while ((at = strchr(p, '@')) && at < ls) {
4801 av_strlcpy(authorization, at2,
4802 FFMIN(authorization_size, at + 1 - at2));
4803 p = at + 1; /* skip '@' */
4806 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4808 av_strlcpy(hostname, p + 1,
4809 FFMIN(hostname_size, brk - p));
4810 if (brk[1] == ':' && port_ptr)
4811 *port_ptr = atoi(brk + 2);
4812 } else if ((col = strchr(p, ':')) && col < ls) {
4813 av_strlcpy(hostname, p,
4814 FFMIN(col + 1 - p, hostname_size));
4816 *port_ptr = atoi(col + 1);
4818 av_strlcpy(hostname, p,
4819 FFMIN(ls + 1 - p, hostname_size));
4823 int ff_mkdir_p(const char *path)
4826 char *temp = av_strdup(path);
4830 if (!path || !temp) {
4834 if (!av_strncasecmp(temp, "/", 1) || !av_strncasecmp(temp, "\\", 1)) {
4836 } else if (!av_strncasecmp(temp, "./", 2) || !av_strncasecmp(temp, ".\\", 2)) {
4840 for ( ; *pos != '\0'; ++pos) {
4841 if (*pos == '/' || *pos == '\\') {
4844 ret = mkdir(temp, 0755);
4849 if ((*(pos - 1) != '/') || (*(pos - 1) != '\\')) {
4850 ret = mkdir(temp, 0755);
4857 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4860 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4863 'C', 'D', 'E', 'F' };
4864 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4867 'c', 'd', 'e', 'f' };
4868 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4870 for (i = 0; i < s; i++) {
4871 buff[i * 2] = hex_table[src[i] >> 4];
4872 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4878 int ff_hex_to_data(uint8_t *data, const char *p)
4885 p += strspn(p, SPACE_CHARS);
4888 c = av_toupper((unsigned char) *p++);
4889 if (c >= '0' && c <= '9')
4891 else if (c >= 'A' && c <= 'F')
4906 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4907 unsigned int pts_num, unsigned int pts_den)
4910 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
4911 if (new_tb.num != pts_num)
4912 av_log(NULL, AV_LOG_DEBUG,
4913 "st:%d removing common factor %d from timebase\n",
4914 s->index, pts_num / new_tb.num);
4916 av_log(NULL, AV_LOG_WARNING,
4917 "st:%d has too large timebase, reducing\n", s->index);
4919 if (new_tb.num <= 0 || new_tb.den <= 0) {
4920 av_log(NULL, AV_LOG_ERROR,
4921 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4922 new_tb.num, new_tb.den,
4926 s->time_base = new_tb;
4927 #if FF_API_LAVF_AVCTX
4928 FF_DISABLE_DEPRECATION_WARNINGS
4929 s->codec->pkt_timebase = new_tb;
4930 FF_ENABLE_DEPRECATION_WARNINGS
4932 s->internal->avctx->pkt_timebase = new_tb;
4933 s->pts_wrap_bits = pts_wrap_bits;
4936 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4939 const char *ptr = str;
4941 /* Parse key=value pairs. */
4944 char *dest = NULL, *dest_end;
4945 int key_len, dest_len = 0;
4947 /* Skip whitespace and potential commas. */
4948 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4955 if (!(ptr = strchr(key, '=')))
4958 key_len = ptr - key;
4960 callback_get_buf(context, key, key_len, &dest, &dest_len);
4961 dest_end = dest + dest_len - 1;
4965 while (*ptr && *ptr != '\"') {
4969 if (dest && dest < dest_end)
4973 if (dest && dest < dest_end)
4981 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
4982 if (dest && dest < dest_end)
4990 int ff_find_stream_index(AVFormatContext *s, int id)
4993 for (i = 0; i < s->nb_streams; i++)
4994 if (s->streams[i]->id == id)
4999 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
5003 unsigned int codec_tag;
5004 if (ofmt->query_codec)
5005 return ofmt->query_codec(codec_id, std_compliance);
5006 else if (ofmt->codec_tag)
5007 return !!av_codec_get_tag2(ofmt->codec_tag, codec_id, &codec_tag);
5008 else if (codec_id == ofmt->video_codec ||
5009 codec_id == ofmt->audio_codec ||
5010 codec_id == ofmt->subtitle_codec ||
5011 codec_id == ofmt->data_codec)
5014 return AVERROR_PATCHWELCOME;
5017 int avformat_network_init(void)
5021 if ((ret = ff_network_init()) < 0)
5023 if ((ret = ff_tls_init()) < 0)
5029 int avformat_network_deinit(void)
5038 int ff_add_param_change(AVPacket *pkt, int32_t channels,
5039 uint64_t channel_layout, int32_t sample_rate,
5040 int32_t width, int32_t height)
5046 return AVERROR(EINVAL);
5049 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
5051 if (channel_layout) {
5053 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
5057 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
5059 if (width || height) {
5061 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
5063 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
5065 return AVERROR(ENOMEM);
5066 bytestream_put_le32(&data, flags);
5068 bytestream_put_le32(&data, channels);
5070 bytestream_put_le64(&data, channel_layout);
5072 bytestream_put_le32(&data, sample_rate);
5073 if (width || height) {
5074 bytestream_put_le32(&data, width);
5075 bytestream_put_le32(&data, height);
5080 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
5082 AVRational undef = {0, 1};
5083 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
5084 AVRational codec_sample_aspect_ratio = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
5085 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
5087 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
5088 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
5089 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
5090 stream_sample_aspect_ratio = undef;
5092 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
5093 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
5094 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
5095 frame_sample_aspect_ratio = undef;
5097 if (stream_sample_aspect_ratio.num)
5098 return stream_sample_aspect_ratio;
5100 return frame_sample_aspect_ratio;
5103 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
5105 AVRational fr = st->r_frame_rate;
5106 AVRational codec_fr = st->internal->avctx->framerate;
5107 AVRational avg_fr = st->avg_frame_rate;
5109 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
5110 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
5115 if (st->internal->avctx->ticks_per_frame > 1) {
5116 if ( codec_fr.num > 0 && codec_fr.den > 0 &&
5117 (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))
5125 * Matches a stream specifier (but ignores requested index).
5127 * @param indexptr set to point to the requested stream index if there is one
5129 * @return <0 on error
5130 * 0 if st is NOT a matching stream
5131 * >0 if st is a matching stream
5133 static int match_stream_specifier(AVFormatContext *s, AVStream *st,
5134 const char *spec, const char **indexptr, AVProgram **p)
5136 int match = 1; /* Stores if the specifier matches so far. */
5138 if (*spec <= '9' && *spec >= '0') { /* opt:index */
5142 } else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
5143 *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
5144 enum AVMediaType type;
5148 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
5149 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
5150 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
5151 case 'd': type = AVMEDIA_TYPE_DATA; break;
5152 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
5153 case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
5154 default: av_assert0(0);
5156 if (*spec && *spec++ != ':') /* If we are not at the end, then another specifier must follow. */
5157 return AVERROR(EINVAL);
5159 #if FF_API_LAVF_AVCTX
5160 FF_DISABLE_DEPRECATION_WARNINGS
5161 if (type != st->codecpar->codec_type
5162 && (st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN || st->codec->codec_type != type))
5164 FF_ENABLE_DEPRECATION_WARNINGS
5166 if (type != st->codecpar->codec_type)
5169 if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
5171 } else if (*spec == 'p' && *(spec + 1) == ':') {
5176 prog_id = strtol(spec, &endptr, 0);
5177 /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
5178 if (spec == endptr || (*endptr && *endptr++ != ':'))
5179 return AVERROR(EINVAL);
5182 for (i = 0; i < s->nb_programs; i++) {
5183 if (s->programs[i]->id != prog_id)
5186 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++) {
5187 if (st->index == s->programs[i]->stream_index[j]) {
5190 *p = s->programs[i];
5199 } else if (*spec == '#' ||
5200 (*spec == 'i' && *(spec + 1) == ':')) {
5203 spec += 1 + (*spec == 'i');
5204 stream_id = strtol(spec, &endptr, 0);
5205 if (spec == endptr || *endptr) /* Disallow empty id and make sure we are at the end. */
5206 return AVERROR(EINVAL);
5207 return match && (stream_id == st->id);
5208 } else if (*spec == 'm' && *(spec + 1) == ':') {
5209 AVDictionaryEntry *tag;
5215 val = strchr(spec, ':');
5217 key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
5219 return AVERROR(ENOMEM);
5221 tag = av_dict_get(st->metadata, key, NULL, 0);
5223 if (!val || !strcmp(tag->value, val + 1))
5232 return match && ret;
5233 } else if (*spec == 'u' && *(spec + 1) == '\0') {
5234 AVCodecParameters *par = st->codecpar;
5235 #if FF_API_LAVF_AVCTX
5236 FF_DISABLE_DEPRECATION_WARNINGS
5237 AVCodecContext *codec = st->codec;
5238 FF_ENABLE_DEPRECATION_WARNINGS
5241 switch (par->codec_type) {
5242 case AVMEDIA_TYPE_AUDIO:
5243 val = par->sample_rate && par->channels;
5244 #if FF_API_LAVF_AVCTX
5245 val = val || (codec->sample_rate && codec->channels);
5247 if (par->format == AV_SAMPLE_FMT_NONE
5248 #if FF_API_LAVF_AVCTX
5249 && codec->sample_fmt == AV_SAMPLE_FMT_NONE
5254 case AVMEDIA_TYPE_VIDEO:
5255 val = par->width && par->height;
5256 #if FF_API_LAVF_AVCTX
5257 val = val || (codec->width && codec->height);
5259 if (par->format == AV_PIX_FMT_NONE
5260 #if FF_API_LAVF_AVCTX
5261 && codec->pix_fmt == AV_PIX_FMT_NONE
5266 case AVMEDIA_TYPE_UNKNOWN:
5273 #if FF_API_LAVF_AVCTX
5274 return match && ((par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0);
5276 return match && (par->codec_id != AV_CODEC_ID_NONE && val != 0);
5279 return AVERROR(EINVAL);
5287 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
5292 const char *indexptr = NULL;
5293 AVProgram *p = NULL;
5296 ret = match_stream_specifier(s, st, spec, &indexptr, &p);
5303 index = strtol(indexptr, &endptr, 0);
5304 if (*endptr) { /* We can't have anything after the requested index. */
5305 ret = AVERROR(EINVAL);
5309 /* This is not really needed but saves us a loop for simple stream index specifiers. */
5310 if (spec == indexptr)
5311 return (index == st->index);
5313 /* If we requested a matching stream index, we have to ensure st is that. */
5314 nb_streams = p ? p->nb_stream_indexes : s->nb_streams;
5315 for (int i = 0; i < nb_streams && index >= 0; i++) {
5316 AVStream *candidate = p ? s->streams[p->stream_index[i]] : s->streams[i];
5317 ret = match_stream_specifier(s, candidate, spec, NULL, NULL);
5320 if (ret > 0 && index-- == 0 && st == candidate)
5326 if (ret == AVERROR(EINVAL))
5327 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
5331 int ff_generate_avci_extradata(AVStream *st)
5333 static const uint8_t avci100_1080p_extradata[] = {
5335 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5336 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5337 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5338 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
5339 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
5340 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
5341 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
5342 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
5343 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5345 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5348 static const uint8_t avci100_1080i_extradata[] = {
5350 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5351 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5352 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5353 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
5354 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
5355 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
5356 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
5357 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
5358 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
5359 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
5360 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
5362 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5365 static const uint8_t avci50_1080p_extradata[] = {
5367 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5368 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5369 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5370 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5371 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5372 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
5373 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
5374 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
5375 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
5377 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5380 static const uint8_t avci50_1080i_extradata[] = {
5382 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5383 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5384 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5385 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
5386 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
5387 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
5388 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
5389 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
5390 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
5391 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
5392 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
5394 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5397 static const uint8_t avci100_720p_extradata[] = {
5399 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5400 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
5401 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
5402 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
5403 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
5404 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
5405 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
5406 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
5407 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
5408 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
5410 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
5413 static const uint8_t avci50_720p_extradata[] = {
5415 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
5416 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5417 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5418 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5419 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5420 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
5421 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
5422 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
5423 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
5425 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5429 const uint8_t *data = NULL;
5432 if (st->codecpar->width == 1920) {
5433 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5434 data = avci100_1080p_extradata;
5435 size = sizeof(avci100_1080p_extradata);
5437 data = avci100_1080i_extradata;
5438 size = sizeof(avci100_1080i_extradata);
5440 } else if (st->codecpar->width == 1440) {
5441 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5442 data = avci50_1080p_extradata;
5443 size = sizeof(avci50_1080p_extradata);
5445 data = avci50_1080i_extradata;
5446 size = sizeof(avci50_1080i_extradata);
5448 } else if (st->codecpar->width == 1280) {
5449 data = avci100_720p_extradata;
5450 size = sizeof(avci100_720p_extradata);
5451 } else if (st->codecpar->width == 960) {
5452 data = avci50_720p_extradata;
5453 size = sizeof(avci50_720p_extradata);
5459 av_freep(&st->codecpar->extradata);
5460 if (ff_alloc_extradata(st->codecpar, size))
5461 return AVERROR(ENOMEM);
5462 memcpy(st->codecpar->extradata, data, size);
5467 uint8_t *av_stream_get_side_data(const AVStream *st,
5468 enum AVPacketSideDataType type, int *size)
5472 for (i = 0; i < st->nb_side_data; i++) {
5473 if (st->side_data[i].type == type) {
5475 *size = st->side_data[i].size;
5476 return st->side_data[i].data;
5482 int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
5483 uint8_t *data, size_t size)
5485 AVPacketSideData *sd, *tmp;
5488 for (i = 0; i < st->nb_side_data; i++) {
5489 sd = &st->side_data[i];
5491 if (sd->type == type) {
5492 av_freep(&sd->data);
5499 if ((unsigned)st->nb_side_data + 1 >= INT_MAX / sizeof(*st->side_data))
5500 return AVERROR(ERANGE);
5502 tmp = av_realloc(st->side_data, (st->nb_side_data + 1) * sizeof(*tmp));
5504 return AVERROR(ENOMEM);
5507 st->side_data = tmp;
5510 sd = &st->side_data[st->nb_side_data - 1];
5518 uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
5522 uint8_t *data = av_malloc(size);
5527 ret = av_stream_add_side_data(st, type, data, size);
5536 int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
5539 const AVBitStreamFilter *bsf;
5541 AVCodecParameters *in_par;
5543 if (!(bsf = av_bsf_get_by_name(name))) {
5544 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter '%s'\n", name);
5545 return AVERROR_BSF_NOT_FOUND;
5548 if ((ret = av_bsf_alloc(bsf, &bsfc)) < 0)
5551 if (st->internal->nb_bsfcs) {
5552 in_par = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->par_out;
5553 bsfc->time_base_in = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->time_base_out;
5555 in_par = st->codecpar;
5556 bsfc->time_base_in = st->time_base;
5559 if ((ret = avcodec_parameters_copy(bsfc->par_in, in_par)) < 0) {
5564 if (args && bsfc->filter->priv_class) {
5565 const AVOption *opt = av_opt_next(bsfc->priv_data, NULL);
5566 const char * shorthand[2] = {NULL};
5569 shorthand[0] = opt->name;
5571 if ((ret = av_opt_set_from_string(bsfc->priv_data, args, shorthand, "=", ":")) < 0) {
5577 if ((ret = av_bsf_init(bsfc)) < 0) {
5582 if ((ret = av_dynarray_add_nofree(&st->internal->bsfcs, &st->internal->nb_bsfcs, bsfc))) {
5587 av_log(NULL, AV_LOG_VERBOSE,
5588 "Automatically inserted bitstream filter '%s'; args='%s'\n",
5589 name, args ? args : "");
5594 FF_DISABLE_DEPRECATION_WARNINGS
5595 int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt,
5596 AVBitStreamFilterContext *bsfc)
5600 AVPacket new_pkt = *pkt;
5601 int a = av_bitstream_filter_filter(bsfc, codec, NULL,
5602 &new_pkt.data, &new_pkt.size,
5603 pkt->data, pkt->size,
5604 pkt->flags & AV_PKT_FLAG_KEY);
5605 if (a == 0 && new_pkt.size == 0 && new_pkt.side_data_elems == 0) {
5606 av_packet_unref(pkt);
5607 memset(pkt, 0, sizeof(*pkt));
5610 if(a == 0 && new_pkt.data != pkt->data) {
5611 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
5613 memcpy(t, new_pkt.data, new_pkt.size);
5614 memset(t + new_pkt.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
5619 a = AVERROR(ENOMEM);
5623 new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
5624 av_buffer_default_free, NULL, 0);
5626 pkt->side_data = NULL;
5627 pkt->side_data_elems = 0;
5628 av_packet_unref(pkt);
5630 av_freep(&new_pkt.data);
5631 a = AVERROR(ENOMEM);
5635 av_log(codec, AV_LOG_ERROR,
5636 "Failed to open bitstream filter %s for stream %d with codec %s",
5637 bsfc->filter->name, pkt->stream_index,
5638 codec->codec ? codec->codec->name : "copy");
5648 FF_ENABLE_DEPRECATION_WARNINGS
5651 int ff_format_output_open(AVFormatContext *s, const char *url, AVDictionary **options)
5654 return AVERROR(EINVAL);
5656 if (!(s->oformat->flags & AVFMT_NOFILE))
5657 return s->io_open(s, &s->pb, url, AVIO_FLAG_WRITE, options);
5661 void ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
5664 s->io_close(s, *pb);
5668 int ff_is_http_proto(char *filename) {
5669 const char *proto = avio_find_protocol_name(filename);
5670 return proto ? (!av_strcasecmp(proto, "http") || !av_strcasecmp(proto, "https")) : 0;
5673 int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
5675 AVDictionaryEntry *entry;
5676 int64_t parsed_timestamp;
5678 if ((entry = av_dict_get(s->metadata, "creation_time", NULL, 0))) {
5679 if ((ret = av_parse_time(&parsed_timestamp, entry->value, 0)) >= 0) {
5680 *timestamp = return_seconds ? parsed_timestamp / 1000000 : parsed_timestamp;
5683 av_log(s, AV_LOG_WARNING, "Failed to parse creation_time %s\n", entry->value);
5690 int ff_standardize_creation_time(AVFormatContext *s)
5693 int ret = ff_parse_creation_time_metadata(s, ×tamp, 0);
5695 return avpriv_dict_set_timestamp(&s->metadata, "creation_time", timestamp);
5699 int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette)
5704 side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &size);
5706 if (size != AVPALETTE_SIZE) {
5707 av_log(s, AV_LOG_ERROR, "Invalid palette side data\n");
5708 return AVERROR_INVALIDDATA;
5710 memcpy(palette, side_data, AVPALETTE_SIZE);
5714 if (ret == CONTAINS_PAL) {
5716 for (i = 0; i < AVPALETTE_COUNT; i++)
5717 palette[i] = AV_RL32(pkt->data + pkt->size - AVPALETTE_SIZE + i*4);
5724 int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf)
5729 ret = av_bprint_finalize(buf, &str);
5732 if (!av_bprint_is_complete(buf)) {
5734 return AVERROR(ENOMEM);
5737 par->extradata = str;
5738 /* Note: the string is NUL terminated (so extradata can be read as a
5739 * string), but the ending character is not accounted in the size (in
5740 * binary formats you are likely not supposed to mux that character). When
5741 * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE
5743 par->extradata_size = buf->len;
5747 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
5748 AVStream *ost, const AVStream *ist,
5749 enum AVTimebaseSource copy_tb)
5751 //TODO: use [io]st->internal->avctx
5752 const AVCodecContext *dec_ctx = ist->codec;
5753 AVCodecContext *enc_ctx = ost->codec;
5755 enc_ctx->time_base = ist->time_base;
5757 * Avi is a special case here because it supports variable fps but
5758 * having the fps and timebase differe significantly adds quite some
5761 if (!strcmp(ofmt->name, "avi")) {
5762 #if FF_API_R_FRAME_RATE
5763 if (copy_tb == AVFMT_TBCF_AUTO && ist->r_frame_rate.num
5764 && av_q2d(ist->r_frame_rate) >= av_q2d(ist->avg_frame_rate)
5765 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(ist->time_base)
5766 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx->time_base)
5767 && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx->time_base) < 1.0/500
5768 || copy_tb == AVFMT_TBCF_R_FRAMERATE) {
5769 enc_ctx->time_base.num = ist->r_frame_rate.den;
5770 enc_ctx->time_base.den = 2*ist->r_frame_rate.num;
5771 enc_ctx->ticks_per_frame = 2;
5774 if (copy_tb == AVFMT_TBCF_AUTO && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > 2*av_q2d(ist->time_base)
5775 && av_q2d(ist->time_base) < 1.0/500
5776 || copy_tb == AVFMT_TBCF_DECODER) {
5777 enc_ctx->time_base = dec_ctx->time_base;
5778 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5779 enc_ctx->time_base.den *= 2;
5780 enc_ctx->ticks_per_frame = 2;
5782 } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS)
5783 && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
5784 if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx->time_base.den
5785 && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > av_q2d(ist->time_base)
5786 && av_q2d(ist->time_base) < 1.0/500
5787 || copy_tb == AVFMT_TBCF_DECODER) {
5788 enc_ctx->time_base = dec_ctx->time_base;
5789 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5793 if ((enc_ctx->codec_tag == AV_RL32("tmcd") || ost->codecpar->codec_tag == AV_RL32("tmcd"))
5794 && dec_ctx->time_base.num < dec_ctx->time_base.den
5795 && dec_ctx->time_base.num > 0
5796 && 121LL*dec_ctx->time_base.num > dec_ctx->time_base.den) {
5797 enc_ctx->time_base = dec_ctx->time_base;
5800 if (ost->avg_frame_rate.num)
5801 enc_ctx->time_base = av_inv_q(ost->avg_frame_rate);
5803 av_reduce(&enc_ctx->time_base.num, &enc_ctx->time_base.den,
5804 enc_ctx->time_base.num, enc_ctx->time_base.den, INT_MAX);
5809 AVRational av_stream_get_codec_timebase(const AVStream *st)
5811 // See avformat_transfer_internal_stream_timing_info() TODO.
5812 #if FF_API_LAVF_AVCTX
5813 FF_DISABLE_DEPRECATION_WARNINGS
5814 return st->codec->time_base;
5815 FF_ENABLE_DEPRECATION_WARNINGS
5817 return st->internal->avctx->time_base;
5821 void ff_format_set_url(AVFormatContext *s, char *url)
5826 #if FF_API_FORMAT_FILENAME
5827 FF_DISABLE_DEPRECATION_WARNINGS
5828 av_strlcpy(s->filename, url, sizeof(s->filename));
5829 FF_ENABLE_DEPRECATION_WARNINGS