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
26 #include "libavutil/avassert.h"
27 #include "libavutil/avstring.h"
28 #include "libavutil/dict.h"
29 #include "libavutil/internal.h"
30 #include "libavutil/mathematics.h"
31 #include "libavutil/opt.h"
32 #include "libavutil/parseutils.h"
33 #include "libavutil/pixfmt.h"
34 #include "libavutil/thread.h"
35 #include "libavutil/time.h"
36 #include "libavutil/timestamp.h"
38 #include "libavcodec/bytestream.h"
39 #include "libavcodec/internal.h"
40 #include "libavcodec/packet_internal.h"
41 #include "libavcodec/raw.h"
44 #include "avio_internal.h"
52 #include "libavutil/ffversion.h"
53 const char av_format_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
55 static AVMutex avformat_mutex = AV_MUTEX_INITIALIZER;
59 * various utility functions for use within FFmpeg
62 unsigned avformat_version(void)
64 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
65 return LIBAVFORMAT_VERSION_INT;
68 const char *avformat_configuration(void)
70 return FFMPEG_CONFIGURATION;
73 const char *avformat_license(void)
75 #define LICENSE_PREFIX "libavformat license: "
76 return &LICENSE_PREFIX FFMPEG_LICENSE[sizeof(LICENSE_PREFIX) - 1];
79 int ff_lock_avformat(void)
81 return ff_mutex_lock(&avformat_mutex) ? -1 : 0;
84 int ff_unlock_avformat(void)
86 return ff_mutex_unlock(&avformat_mutex) ? -1 : 0;
89 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
91 static int is_relative(int64_t ts) {
92 return ts > (RELATIVE_TS_BASE - (1LL<<48));
96 * Wrap a given time stamp, if there is an indication for an overflow
99 * @param timestamp the time stamp to wrap
100 * @return resulting time stamp
102 static int64_t wrap_timestamp(const AVStream *st, int64_t timestamp)
104 if (st->internal->pts_wrap_behavior != AV_PTS_WRAP_IGNORE && st->pts_wrap_bits < 64 &&
105 st->internal->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
106 if (st->internal->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
107 timestamp < st->internal->pts_wrap_reference)
108 return timestamp + (1ULL << st->pts_wrap_bits);
109 else if (st->internal->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
110 timestamp >= st->internal->pts_wrap_reference)
111 return timestamp - (1ULL << st->pts_wrap_bits);
116 #if FF_API_FORMAT_GET_SET
117 MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
118 #if FF_API_LAVF_FFSERVER
119 FF_DISABLE_DEPRECATION_WARNINGS
120 MAKE_ACCESSORS(AVStream, stream, char *, recommended_encoder_configuration)
121 FF_ENABLE_DEPRECATION_WARNINGS
123 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, video_codec)
124 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, audio_codec)
125 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
126 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, data_codec)
127 MAKE_ACCESSORS(AVFormatContext, format, int, metadata_header_padding)
128 MAKE_ACCESSORS(AVFormatContext, format, void *, opaque)
129 MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb)
130 #if FF_API_OLD_OPEN_CALLBACKS
131 FF_DISABLE_DEPRECATION_WARNINGS
132 MAKE_ACCESSORS(AVFormatContext, format, AVOpenCallback, open_cb)
133 FF_ENABLE_DEPRECATION_WARNINGS
137 int64_t av_stream_get_end_pts(const AVStream *st)
139 if (st->internal->priv_pts) {
140 return st->internal->priv_pts->val;
142 return AV_NOPTS_VALUE;
145 struct AVCodecParserContext *av_stream_get_parser(const AVStream *st)
150 void av_format_inject_global_side_data(AVFormatContext *s)
153 s->internal->inject_global_side_data = 1;
154 for (i = 0; i < s->nb_streams; i++) {
155 AVStream *st = s->streams[i];
156 st->internal->inject_global_side_data = 1;
160 int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
162 av_assert0(!dst->codec_whitelist &&
163 !dst->format_whitelist &&
164 !dst->protocol_whitelist &&
165 !dst->protocol_blacklist);
166 dst-> codec_whitelist = av_strdup(src->codec_whitelist);
167 dst->format_whitelist = av_strdup(src->format_whitelist);
168 dst->protocol_whitelist = av_strdup(src->protocol_whitelist);
169 dst->protocol_blacklist = av_strdup(src->protocol_blacklist);
170 if ( (src-> codec_whitelist && !dst-> codec_whitelist)
171 || (src-> format_whitelist && !dst-> format_whitelist)
172 || (src->protocol_whitelist && !dst->protocol_whitelist)
173 || (src->protocol_blacklist && !dst->protocol_blacklist)) {
174 av_log(dst, AV_LOG_ERROR, "Failed to duplicate black/whitelist\n");
175 return AVERROR(ENOMEM);
180 static const AVCodec *find_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
182 #if FF_API_LAVF_AVCTX
183 FF_DISABLE_DEPRECATION_WARNINGS
184 if (st->codec->codec)
185 return st->codec->codec;
186 FF_ENABLE_DEPRECATION_WARNINGS
189 switch (st->codecpar->codec_type) {
190 case AVMEDIA_TYPE_VIDEO:
191 if (s->video_codec) return s->video_codec;
193 case AVMEDIA_TYPE_AUDIO:
194 if (s->audio_codec) return s->audio_codec;
196 case AVMEDIA_TYPE_SUBTITLE:
197 if (s->subtitle_codec) return s->subtitle_codec;
201 return avcodec_find_decoder(codec_id);
204 static const AVCodec *find_probe_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
206 const AVCodec *codec;
208 #if CONFIG_H264_DECODER
209 /* Other parts of the code assume this decoder to be used for h264,
210 * so force it if possible. */
211 if (codec_id == AV_CODEC_ID_H264)
212 return avcodec_find_decoder_by_name("h264");
215 codec = find_decoder(s, st, codec_id);
219 if (codec->capabilities & AV_CODEC_CAP_AVOID_PROBING) {
220 const AVCodec *probe_codec = NULL;
222 while ((probe_codec = av_codec_iterate(&iter))) {
223 if (probe_codec->id == codec->id &&
224 av_codec_is_decoder(probe_codec) &&
225 !(probe_codec->capabilities & (AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_EXPERIMENTAL))) {
234 #if FF_API_FORMAT_GET_SET
235 int av_format_get_probe_score(const AVFormatContext *s)
237 return s->probe_score;
241 /* an arbitrarily chosen "sane" max packet size -- 50M */
242 #define SANE_CHUNK_SIZE (50000000)
244 int ffio_limit(AVIOContext *s, int size)
246 if (s->maxsize>= 0) {
247 int64_t pos = avio_tell(s);
248 int64_t remaining= s->maxsize - pos;
249 if (remaining < size) {
250 int64_t newsize = avio_size(s);
251 if (!s->maxsize || s->maxsize<newsize)
252 s->maxsize = newsize - !newsize;
253 if (pos > s->maxsize && s->maxsize >= 0)
254 s->maxsize = AVERROR(EIO);
256 remaining = s->maxsize - pos;
259 if (s->maxsize >= 0 && remaining < size && size > 1) {
260 av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG,
261 "Truncating packet of size %d to %"PRId64"\n",
262 size, remaining + !remaining);
263 size = remaining + !remaining;
269 /* Read the data in sane-sized chunks and append to pkt.
270 * Return the number of bytes read or an error. */
271 static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
273 int orig_size = pkt->size;
277 int prev_size = pkt->size;
280 /* When the caller requests a lot of data, limit it to the amount
281 * left in file or SANE_CHUNK_SIZE when it is not known. */
283 if (read_size > SANE_CHUNK_SIZE/10) {
284 read_size = ffio_limit(s, read_size);
285 // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
287 read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
290 ret = av_grow_packet(pkt, read_size);
294 ret = avio_read(s, pkt->data + prev_size, read_size);
295 if (ret != read_size) {
296 av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
303 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)
312 #if FF_API_INIT_PACKET
313 FF_DISABLE_DEPRECATION_WARNINGS
317 FF_ENABLE_DEPRECATION_WARNINGS
319 av_packet_unref(pkt);
321 pkt->pos = avio_tell(s);
323 return append_packet_chunked(s, pkt, size);
326 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
329 return av_get_packet(s, pkt, size);
330 return append_packet_chunked(s, pkt, size);
333 int av_filename_number_test(const char *filename)
337 (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0);
340 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
343 static const struct {
346 enum AVMediaType type;
348 { "aac", AV_CODEC_ID_AAC, AVMEDIA_TYPE_AUDIO },
349 { "ac3", AV_CODEC_ID_AC3, AVMEDIA_TYPE_AUDIO },
350 { "aptx", AV_CODEC_ID_APTX, AVMEDIA_TYPE_AUDIO },
351 { "dts", AV_CODEC_ID_DTS, AVMEDIA_TYPE_AUDIO },
352 { "dvbsub", AV_CODEC_ID_DVB_SUBTITLE,AVMEDIA_TYPE_SUBTITLE },
353 { "dvbtxt", AV_CODEC_ID_DVB_TELETEXT,AVMEDIA_TYPE_SUBTITLE },
354 { "eac3", AV_CODEC_ID_EAC3, AVMEDIA_TYPE_AUDIO },
355 { "h264", AV_CODEC_ID_H264, AVMEDIA_TYPE_VIDEO },
356 { "hevc", AV_CODEC_ID_HEVC, AVMEDIA_TYPE_VIDEO },
357 { "loas", AV_CODEC_ID_AAC_LATM, AVMEDIA_TYPE_AUDIO },
358 { "m4v", AV_CODEC_ID_MPEG4, AVMEDIA_TYPE_VIDEO },
359 { "mjpeg_2000",AV_CODEC_ID_JPEG2000, AVMEDIA_TYPE_VIDEO },
360 { "mp3", AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO },
361 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
362 { "truehd", AV_CODEC_ID_TRUEHD, AVMEDIA_TYPE_AUDIO },
366 const AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
370 av_log(s, AV_LOG_DEBUG,
371 "Probe with size=%d, packets=%d detected %s with score=%d\n",
372 pd->buf_size, s->max_probe_packets - st->probe_packets,
374 for (i = 0; fmt_id_type[i].name; i++) {
375 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
376 if (fmt_id_type[i].type != AVMEDIA_TYPE_AUDIO &&
377 st->codecpar->sample_rate)
379 if (st->internal->request_probe > score &&
380 st->codecpar->codec_id != fmt_id_type[i].id)
382 st->codecpar->codec_id = fmt_id_type[i].id;
383 st->codecpar->codec_type = fmt_id_type[i].type;
384 st->internal->need_context_update = 1;
385 #if FF_API_LAVF_AVCTX
386 FF_DISABLE_DEPRECATION_WARNINGS
387 st->codec->codec_type = st->codecpar->codec_type;
388 st->codec->codec_id = st->codecpar->codec_id;
389 FF_ENABLE_DEPRECATION_WARNINGS
398 /************************************************************/
399 /* input media file */
401 #if FF_API_DEMUXER_OPEN
402 int av_demuxer_open(AVFormatContext *ic) {
405 if (ic->format_whitelist && av_match_list(ic->iformat->name, ic->format_whitelist, ',') <= 0) {
406 av_log(ic, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", ic->format_whitelist);
407 return AVERROR(EINVAL);
410 if (ic->iformat->read_header) {
411 err = ic->iformat->read_header(ic);
416 if (ic->pb && !ic->internal->data_offset)
417 ic->internal->data_offset = avio_tell(ic->pb);
422 /* Open input file and probe the format if necessary. */
423 static int init_input(AVFormatContext *s, const char *filename,
424 AVDictionary **options)
427 AVProbeData pd = { filename, NULL, 0 };
428 int score = AVPROBE_SCORE_RETRY;
431 s->flags |= AVFMT_FLAG_CUSTOM_IO;
433 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
434 s, 0, s->format_probesize);
435 else if (s->iformat->flags & AVFMT_NOFILE)
436 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
437 "will be ignored with AVFMT_NOFILE format.\n");
441 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
442 (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
445 if ((ret = s->io_open(s, &s->pb, filename, AVIO_FLAG_READ | s->avio_flags, options)) < 0)
450 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
451 s, 0, s->format_probesize);
454 int avformat_queue_attached_pictures(AVFormatContext *s)
457 for (i = 0; i < s->nb_streams; i++)
458 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
459 s->streams[i]->discard < AVDISCARD_ALL) {
460 if (s->streams[i]->attached_pic.size <= 0) {
461 av_log(s, AV_LOG_WARNING,
462 "Attached picture on stream %d has invalid size, "
467 ret = avpriv_packet_list_put(&s->internal->raw_packet_buffer,
468 &s->internal->raw_packet_buffer_end,
469 &s->streams[i]->attached_pic,
477 static int update_stream_avctx(AVFormatContext *s)
480 for (i = 0; i < s->nb_streams; i++) {
481 AVStream *st = s->streams[i];
483 if (!st->internal->need_context_update)
486 /* close parser, because it depends on the codec */
487 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
488 av_parser_close(st->parser);
492 /* update internal codec context, for the parser */
493 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
497 #if FF_API_LAVF_AVCTX
498 FF_DISABLE_DEPRECATION_WARNINGS
499 /* update deprecated public codec context */
500 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
503 FF_ENABLE_DEPRECATION_WARNINGS
506 st->internal->need_context_update = 0;
512 int avformat_open_input(AVFormatContext **ps, const char *filename,
513 ff_const59 AVInputFormat *fmt, AVDictionary **options)
515 AVFormatContext *s = *ps;
517 AVDictionary *tmp = NULL;
518 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
520 if (!s && !(s = avformat_alloc_context()))
521 return AVERROR(ENOMEM);
523 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
524 return AVERROR(EINVAL);
530 av_dict_copy(&tmp, *options, 0);
532 if (s->pb) // must be before any goto fail
533 s->flags |= AVFMT_FLAG_CUSTOM_IO;
535 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
538 if (!(s->url = av_strdup(filename ? filename : ""))) {
539 ret = AVERROR(ENOMEM);
543 #if FF_API_FORMAT_FILENAME
544 FF_DISABLE_DEPRECATION_WARNINGS
545 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
546 FF_ENABLE_DEPRECATION_WARNINGS
548 if ((ret = init_input(s, filename, &tmp)) < 0)
550 s->probe_score = ret;
552 if (!s->protocol_whitelist && s->pb && s->pb->protocol_whitelist) {
553 s->protocol_whitelist = av_strdup(s->pb->protocol_whitelist);
554 if (!s->protocol_whitelist) {
555 ret = AVERROR(ENOMEM);
560 if (!s->protocol_blacklist && s->pb && s->pb->protocol_blacklist) {
561 s->protocol_blacklist = av_strdup(s->pb->protocol_blacklist);
562 if (!s->protocol_blacklist) {
563 ret = AVERROR(ENOMEM);
568 if (s->format_whitelist && av_match_list(s->iformat->name, s->format_whitelist, ',') <= 0) {
569 av_log(s, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", s->format_whitelist);
570 ret = AVERROR(EINVAL);
574 avio_skip(s->pb, s->skip_initial_bytes);
576 /* Check filename in case an image number is expected. */
577 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
578 if (!av_filename_number_test(filename)) {
579 ret = AVERROR(EINVAL);
584 s->duration = s->start_time = AV_NOPTS_VALUE;
586 /* Allocate private data. */
587 if (s->iformat->priv_data_size > 0) {
588 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
589 ret = AVERROR(ENOMEM);
592 if (s->iformat->priv_class) {
593 *(const AVClass **) s->priv_data = s->iformat->priv_class;
594 av_opt_set_defaults(s->priv_data);
595 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
600 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
602 ff_id3v2_read_dict(s->pb, &s->internal->id3v2_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
604 #if FF_API_DEMUXER_OPEN
605 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
607 if (s->iformat->read_header)
609 if ((ret = s->iformat->read_header(s)) < 0)
613 s->metadata = s->internal->id3v2_meta;
614 s->internal->id3v2_meta = NULL;
615 } else if (s->internal->id3v2_meta) {
616 av_log(s, AV_LOG_WARNING, "Discarding ID3 tags because more suitable tags were found.\n");
617 av_dict_free(&s->internal->id3v2_meta);
620 if (id3v2_extra_meta) {
621 if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
622 !strcmp(s->iformat->name, "tta") || !strcmp(s->iformat->name, "wav")) {
623 if ((ret = ff_id3v2_parse_apic(s, id3v2_extra_meta)) < 0)
625 if ((ret = ff_id3v2_parse_chapters(s, id3v2_extra_meta)) < 0)
627 if ((ret = ff_id3v2_parse_priv(s, id3v2_extra_meta)) < 0)
630 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
632 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
634 if ((ret = avformat_queue_attached_pictures(s)) < 0)
637 #if FF_API_DEMUXER_OPEN
638 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
640 if (s->pb && !s->internal->data_offset)
642 s->internal->data_offset = avio_tell(s->pb);
644 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
646 update_stream_avctx(s);
648 for (i = 0; i < s->nb_streams; i++)
649 s->streams[i]->internal->orig_codec_id = s->streams[i]->codecpar->codec_id;
652 av_dict_free(options);
659 if (s->iformat->read_close)
660 s->iformat->read_close(s);
662 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
664 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
666 avformat_free_context(s);
671 /*******************************************************/
673 static void force_codec_ids(AVFormatContext *s, AVStream *st)
675 switch (st->codecpar->codec_type) {
676 case AVMEDIA_TYPE_VIDEO:
677 if (s->video_codec_id)
678 st->codecpar->codec_id = s->video_codec_id;
680 case AVMEDIA_TYPE_AUDIO:
681 if (s->audio_codec_id)
682 st->codecpar->codec_id = s->audio_codec_id;
684 case AVMEDIA_TYPE_SUBTITLE:
685 if (s->subtitle_codec_id)
686 st->codecpar->codec_id = s->subtitle_codec_id;
688 case AVMEDIA_TYPE_DATA:
689 if (s->data_codec_id)
690 st->codecpar->codec_id = s->data_codec_id;
695 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
697 if (st->internal->request_probe>0) {
698 AVProbeData *pd = &st->internal->probe_data;
700 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
704 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
706 av_log(s, AV_LOG_WARNING,
707 "Failed to reallocate probe buffer for stream %d\n",
712 memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
713 pd->buf_size += pkt->size;
714 memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
717 st->probe_packets = 0;
719 av_log(s, AV_LOG_WARNING,
720 "nothing to probe for stream %d\n", st->index);
724 end= s->internal->raw_packet_buffer_remaining_size <= 0
725 || st->probe_packets<= 0;
727 if (end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
728 int score = set_codec_from_probe_data(s, st, pd);
729 if ( (st->codecpar->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
733 st->internal->request_probe = -1;
734 if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
735 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
737 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
739 force_codec_ids(s, st);
745 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
747 int64_t ref = pkt->dts;
748 int i, pts_wrap_behavior;
749 int64_t pts_wrap_reference;
750 AVProgram *first_program;
752 if (ref == AV_NOPTS_VALUE)
754 if (st->internal->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
756 ref &= (1LL << st->pts_wrap_bits)-1;
758 // reference time stamp should be 60 s before first time stamp
759 pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
760 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
761 pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
762 (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
763 AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
765 first_program = av_find_program_from_stream(s, NULL, stream_index);
767 if (!first_program) {
768 int default_stream_index = av_find_default_stream_index(s);
769 if (s->streams[default_stream_index]->internal->pts_wrap_reference == AV_NOPTS_VALUE) {
770 for (i = 0; i < s->nb_streams; i++) {
771 if (av_find_program_from_stream(s, NULL, i))
773 s->streams[i]->internal->pts_wrap_reference = pts_wrap_reference;
774 s->streams[i]->internal->pts_wrap_behavior = pts_wrap_behavior;
778 st->internal->pts_wrap_reference = s->streams[default_stream_index]->internal->pts_wrap_reference;
779 st->internal->pts_wrap_behavior = s->streams[default_stream_index]->internal->pts_wrap_behavior;
783 AVProgram *program = first_program;
785 if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
786 pts_wrap_reference = program->pts_wrap_reference;
787 pts_wrap_behavior = program->pts_wrap_behavior;
790 program = av_find_program_from_stream(s, program, stream_index);
793 // update every program with differing pts_wrap_reference
794 program = first_program;
796 if (program->pts_wrap_reference != pts_wrap_reference) {
797 for (i = 0; i<program->nb_stream_indexes; i++) {
798 s->streams[program->stream_index[i]]->internal->pts_wrap_reference = pts_wrap_reference;
799 s->streams[program->stream_index[i]]->internal->pts_wrap_behavior = pts_wrap_behavior;
802 program->pts_wrap_reference = pts_wrap_reference;
803 program->pts_wrap_behavior = pts_wrap_behavior;
805 program = av_find_program_from_stream(s, program, stream_index);
811 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
816 #if FF_API_INIT_PACKET
817 FF_DISABLE_DEPRECATION_WARNINGS
821 FF_ENABLE_DEPRECATION_WARNINGS
823 av_packet_unref(pkt);
827 PacketList *pktl = s->internal->raw_packet_buffer;
828 const AVPacket *pkt1;
831 st = s->streams[pktl->pkt.stream_index];
832 if (s->internal->raw_packet_buffer_remaining_size <= 0)
833 if ((err = probe_codec(s, st, NULL)) < 0)
835 if (st->internal->request_probe <= 0) {
836 avpriv_packet_list_get(&s->internal->raw_packet_buffer,
837 &s->internal->raw_packet_buffer_end, pkt);
838 s->internal->raw_packet_buffer_remaining_size += pkt->size;
843 ret = s->iformat->read_packet(s, pkt);
845 av_packet_unref(pkt);
847 /* Some demuxers return FFERROR_REDO when they consume
848 data and discard it (ignored streams, junk, extradata).
849 We must re-call the demuxer to get the real packet. */
850 if (ret == FFERROR_REDO)
852 if (!pktl || ret == AVERROR(EAGAIN))
854 for (i = 0; i < s->nb_streams; i++) {
856 if (st->probe_packets || st->internal->request_probe > 0)
857 if ((err = probe_codec(s, st, NULL)) < 0)
859 av_assert0(st->internal->request_probe <= 0);
864 err = av_packet_make_refcounted(pkt);
866 av_packet_unref(pkt);
870 if (pkt->flags & AV_PKT_FLAG_CORRUPT) {
871 av_log(s, AV_LOG_WARNING,
872 "Packet corrupt (stream = %d, dts = %s)",
873 pkt->stream_index, av_ts2str(pkt->dts));
874 if (s->flags & AVFMT_FLAG_DISCARD_CORRUPT) {
875 av_log(s, AV_LOG_WARNING, ", dropping it.\n");
876 av_packet_unref(pkt);
879 av_log(s, AV_LOG_WARNING, ".\n");
882 av_assert0(pkt->stream_index < (unsigned)s->nb_streams &&
883 "Invalid stream index.\n");
885 st = s->streams[pkt->stream_index];
887 if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->internal->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
888 // correct first time stamps to negative values
889 if (!is_relative(st->first_dts))
890 st->first_dts = wrap_timestamp(st, st->first_dts);
891 if (!is_relative(st->start_time))
892 st->start_time = wrap_timestamp(st, st->start_time);
893 if (!is_relative(st->cur_dts))
894 st->cur_dts = wrap_timestamp(st, st->cur_dts);
897 pkt->dts = wrap_timestamp(st, pkt->dts);
898 pkt->pts = wrap_timestamp(st, pkt->pts);
900 force_codec_ids(s, st);
902 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
903 if (s->use_wallclock_as_timestamps)
904 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
906 if (!pktl && st->internal->request_probe <= 0)
909 err = avpriv_packet_list_put(&s->internal->raw_packet_buffer,
910 &s->internal->raw_packet_buffer_end,
913 av_packet_unref(pkt);
916 pkt1 = &s->internal->raw_packet_buffer_end->pkt;
917 s->internal->raw_packet_buffer_remaining_size -= pkt1->size;
919 if ((err = probe_codec(s, st, pkt1)) < 0)
925 /**********************************************************/
927 static int determinable_frame_size(AVCodecContext *avctx)
929 switch(avctx->codec_id) {
930 case AV_CODEC_ID_MP1:
931 case AV_CODEC_ID_MP2:
932 case AV_CODEC_ID_MP3:
933 case AV_CODEC_ID_CODEC2:
941 * Return the frame duration in seconds. Return 0 if not available.
943 void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
944 AVCodecParserContext *pc, AVPacket *pkt)
946 AVRational codec_framerate = s->iformat ? st->internal->avctx->framerate :
947 av_mul_q(av_inv_q(st->internal->avctx->time_base), (AVRational){1, st->internal->avctx->ticks_per_frame});
948 int frame_size, sample_rate;
950 #if FF_API_LAVF_AVCTX
951 FF_DISABLE_DEPRECATION_WARNINGS
952 if ((!codec_framerate.den || !codec_framerate.num) && st->codec->time_base.den && st->codec->time_base.num)
953 codec_framerate = av_mul_q(av_inv_q(st->codec->time_base), (AVRational){1, st->codec->ticks_per_frame});
954 FF_ENABLE_DEPRECATION_WARNINGS
959 switch (st->codecpar->codec_type) {
960 case AVMEDIA_TYPE_VIDEO:
961 if (st->r_frame_rate.num && !pc && s->iformat) {
962 *pnum = st->r_frame_rate.den;
963 *pden = st->r_frame_rate.num;
964 } else if (st->time_base.num * 1000LL > st->time_base.den) {
965 *pnum = st->time_base.num;
966 *pden = st->time_base.den;
967 } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
968 av_assert0(st->internal->avctx->ticks_per_frame);
969 av_reduce(pnum, pden,
971 codec_framerate.num * (int64_t)st->internal->avctx->ticks_per_frame,
974 if (pc && pc->repeat_pict) {
975 av_assert0(s->iformat); // this may be wrong for interlaced encoding but its not used for that case
976 av_reduce(pnum, pden,
977 (*pnum) * (1LL + pc->repeat_pict),
981 /* If this codec can be interlaced or progressive then we need
982 * a parser to compute duration of a packet. Thus if we have
983 * no parser in such case leave duration undefined. */
984 if (st->internal->avctx->ticks_per_frame > 1 && !pc)
988 case AVMEDIA_TYPE_AUDIO:
989 if (st->internal->avctx_inited) {
990 frame_size = av_get_audio_frame_duration(st->internal->avctx, pkt->size);
991 sample_rate = st->internal->avctx->sample_rate;
993 frame_size = av_get_audio_frame_duration2(st->codecpar, pkt->size);
994 sample_rate = st->codecpar->sample_rate;
996 if (frame_size <= 0 || sample_rate <= 0)
1006 int ff_is_intra_only(enum AVCodecID id)
1008 const AVCodecDescriptor *d = avcodec_descriptor_get(id);
1011 if ((d->type == AVMEDIA_TYPE_VIDEO || d->type == AVMEDIA_TYPE_AUDIO) &&
1012 !(d->props & AV_CODEC_PROP_INTRA_ONLY))
1017 static int has_decode_delay_been_guessed(AVStream *st)
1019 if (st->codecpar->codec_id != AV_CODEC_ID_H264) return 1;
1020 if (!st->internal->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
1022 #if CONFIG_H264_DECODER
1023 if (st->internal->avctx->has_b_frames &&
1024 avpriv_h264_has_num_reorder_frames(st->internal->avctx) == st->internal->avctx->has_b_frames)
1027 if (st->internal->avctx->has_b_frames<3)
1028 return st->internal->nb_decoded_frames >= 7;
1029 else if (st->internal->avctx->has_b_frames<4)
1030 return st->internal->nb_decoded_frames >= 18;
1032 return st->internal->nb_decoded_frames >= 20;
1035 static PacketList *get_next_pkt(AVFormatContext *s, AVStream *st, PacketList *pktl)
1039 if (pktl == s->internal->packet_buffer_end)
1040 return s->internal->parse_queue;
1044 static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
1045 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1046 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1049 int delay = st->internal->avctx->has_b_frames;
1052 if (dts == AV_NOPTS_VALUE) {
1053 int64_t best_score = INT64_MAX;
1054 for (i = 0; i<delay; i++) {
1055 if (st->internal->pts_reorder_error_count[i]) {
1056 int64_t score = st->internal->pts_reorder_error[i] / st->internal->pts_reorder_error_count[i];
1057 if (score < best_score) {
1059 dts = pts_buffer[i];
1064 for (i = 0; i<delay; i++) {
1065 if (pts_buffer[i] != AV_NOPTS_VALUE) {
1066 int64_t diff = FFABS(pts_buffer[i] - dts)
1067 + (uint64_t)st->internal->pts_reorder_error[i];
1068 diff = FFMAX(diff, st->internal->pts_reorder_error[i]);
1069 st->internal->pts_reorder_error[i] = diff;
1070 st->internal->pts_reorder_error_count[i]++;
1071 if (st->internal->pts_reorder_error_count[i] > 250) {
1072 st->internal->pts_reorder_error[i] >>= 1;
1073 st->internal->pts_reorder_error_count[i] >>= 1;
1080 if (dts == AV_NOPTS_VALUE)
1081 dts = pts_buffer[0];
1087 * Updates the dts of packets of a stream in pkt_buffer, by re-ordering the pts
1088 * of the packets in a window.
1090 static void update_dts_from_pts(AVFormatContext *s, int stream_index,
1091 PacketList *pkt_buffer)
1093 AVStream *st = s->streams[stream_index];
1094 int delay = st->internal->avctx->has_b_frames;
1097 int64_t pts_buffer[MAX_REORDER_DELAY+1];
1099 for (i = 0; i<MAX_REORDER_DELAY+1; i++)
1100 pts_buffer[i] = AV_NOPTS_VALUE;
1102 for (; pkt_buffer; pkt_buffer = get_next_pkt(s, st, pkt_buffer)) {
1103 if (pkt_buffer->pkt.stream_index != stream_index)
1106 if (pkt_buffer->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1107 pts_buffer[0] = pkt_buffer->pkt.pts;
1108 for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
1109 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
1111 pkt_buffer->pkt.dts = select_from_pts_buffer(st, pts_buffer, pkt_buffer->pkt.dts);
1116 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
1117 int64_t dts, int64_t pts, AVPacket *pkt)
1119 AVStream *st = s->streams[stream_index];
1120 PacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1121 PacketList *pktl_it;
1125 if (st->first_dts != AV_NOPTS_VALUE ||
1126 dts == AV_NOPTS_VALUE ||
1127 st->cur_dts == AV_NOPTS_VALUE ||
1128 st->cur_dts < INT_MIN + RELATIVE_TS_BASE ||
1129 dts < INT_MIN + (st->cur_dts - RELATIVE_TS_BASE) ||
1133 st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
1135 shift = (uint64_t)st->first_dts - RELATIVE_TS_BASE;
1137 if (is_relative(pts))
1140 for (pktl_it = pktl; pktl_it; pktl_it = get_next_pkt(s, st, pktl_it)) {
1141 if (pktl_it->pkt.stream_index != stream_index)
1143 if (is_relative(pktl_it->pkt.pts))
1144 pktl_it->pkt.pts += shift;
1146 if (is_relative(pktl_it->pkt.dts))
1147 pktl_it->pkt.dts += shift;
1149 if (st->start_time == AV_NOPTS_VALUE && pktl_it->pkt.pts != AV_NOPTS_VALUE) {
1150 st->start_time = pktl_it->pkt.pts;
1151 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1152 st->start_time = av_sat_add64(st->start_time, av_rescale_q(st->internal->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base));
1156 if (has_decode_delay_been_guessed(st)) {
1157 update_dts_from_pts(s, stream_index, pktl);
1160 if (st->start_time == AV_NOPTS_VALUE) {
1161 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO || !(pkt->flags & AV_PKT_FLAG_DISCARD)) {
1162 st->start_time = pts;
1164 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1165 st->start_time = av_sat_add64(st->start_time, av_rescale_q(st->internal->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base));
1169 static void update_initial_durations(AVFormatContext *s, AVStream *st,
1170 int stream_index, int64_t duration)
1172 PacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1173 int64_t cur_dts = RELATIVE_TS_BASE;
1175 if (st->first_dts != AV_NOPTS_VALUE) {
1176 if (st->internal->update_initial_durations_done)
1178 st->internal->update_initial_durations_done = 1;
1179 cur_dts = st->first_dts;
1180 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1181 if (pktl->pkt.stream_index == stream_index) {
1182 if (pktl->pkt.pts != pktl->pkt.dts ||
1183 pktl->pkt.dts != AV_NOPTS_VALUE ||
1186 cur_dts -= duration;
1189 if (pktl && pktl->pkt.dts != st->first_dts) {
1190 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %"PRId64") in the queue\n",
1191 av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
1195 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
1198 pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1199 st->first_dts = cur_dts;
1200 } else if (st->cur_dts != RELATIVE_TS_BASE)
1203 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1204 if (pktl->pkt.stream_index != stream_index)
1206 if ((pktl->pkt.pts == pktl->pkt.dts ||
1207 pktl->pkt.pts == AV_NOPTS_VALUE) &&
1208 (pktl->pkt.dts == AV_NOPTS_VALUE ||
1209 pktl->pkt.dts == st->first_dts ||
1210 pktl->pkt.dts == RELATIVE_TS_BASE) &&
1211 !pktl->pkt.duration) {
1212 pktl->pkt.dts = cur_dts;
1213 if (!st->internal->avctx->has_b_frames)
1214 pktl->pkt.pts = cur_dts;
1215 pktl->pkt.duration = duration;
1218 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
1221 st->cur_dts = cur_dts;
1224 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1225 AVCodecParserContext *pc, AVPacket *pkt,
1226 int64_t next_dts, int64_t next_pts)
1228 int num, den, presentation_delayed, delay, i;
1230 AVRational duration;
1231 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1232 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1234 if (s->flags & AVFMT_FLAG_NOFILLIN)
1237 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
1238 if (pkt->dts == pkt->pts && st->internal->last_dts_for_order_check != AV_NOPTS_VALUE) {
1239 if (st->internal->last_dts_for_order_check <= pkt->dts) {
1240 st->internal->dts_ordered++;
1242 av_log(s, st->internal->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
1243 "DTS %"PRIi64" < %"PRIi64" out of order\n",
1245 st->internal->last_dts_for_order_check);
1246 st->internal->dts_misordered++;
1248 if (st->internal->dts_ordered + st->internal->dts_misordered > 250) {
1249 st->internal->dts_ordered >>= 1;
1250 st->internal->dts_misordered >>= 1;
1254 st->internal->last_dts_for_order_check = pkt->dts;
1255 if (st->internal->dts_ordered < 8*st->internal->dts_misordered && pkt->dts == pkt->pts)
1256 pkt->dts = AV_NOPTS_VALUE;
1259 if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1260 pkt->dts = AV_NOPTS_VALUE;
1262 if (pc && pc->pict_type == AV_PICTURE_TYPE_B
1263 && !st->internal->avctx->has_b_frames)
1264 //FIXME Set low_delay = 0 when has_b_frames = 1
1265 st->internal->avctx->has_b_frames = 1;
1267 /* do we have a video B-frame ? */
1268 delay = st->internal->avctx->has_b_frames;
1269 presentation_delayed = 0;
1271 /* XXX: need has_b_frame, but cannot get it if the codec is
1272 * not initialized */
1274 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1275 presentation_delayed = 1;
1277 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
1278 st->pts_wrap_bits < 63 && pkt->dts > INT64_MIN + (1LL << (st->pts_wrap_bits - 1)) &&
1279 pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
1280 if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
1281 pkt->dts -= 1LL << st->pts_wrap_bits;
1283 pkt->pts += 1LL << st->pts_wrap_bits;
1286 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1287 * We take the conservative approach and discard both.
1288 * Note: If this is misbehaving for an H.264 file, then possibly
1289 * presentation_delayed is not set correctly. */
1290 if (delay == 1 && pkt->dts == pkt->pts &&
1291 pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
1292 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1293 if ( strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
1294 && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1295 pkt->dts = AV_NOPTS_VALUE;
1298 duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
1299 if (pkt->duration <= 0) {
1300 ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
1302 duration = (AVRational) {num, den};
1303 pkt->duration = av_rescale_rnd(1,
1304 num * (int64_t) st->time_base.den,
1305 den * (int64_t) st->time_base.num,
1310 if (pkt->duration > 0 && (s->internal->packet_buffer || s->internal->parse_queue))
1311 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1313 /* Correct timestamps with byte offset if demuxers only have timestamps
1314 * on packet boundaries */
1315 if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
1316 /* this will estimate bitrate based on this frame's duration and size */
1317 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1318 if (pkt->pts != AV_NOPTS_VALUE)
1320 if (pkt->dts != AV_NOPTS_VALUE)
1324 /* This may be redundant, but it should not hurt. */
1325 if (pkt->dts != AV_NOPTS_VALUE &&
1326 pkt->pts != AV_NOPTS_VALUE &&
1327 pkt->pts > pkt->dts)
1328 presentation_delayed = 1;
1330 if (s->debug & FF_FDEBUG_TS)
1331 av_log(s, AV_LOG_DEBUG,
1332 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%"PRId64" delay:%d onein_oneout:%d\n",
1333 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
1334 pkt->stream_index, pc, pkt->duration, delay, onein_oneout);
1336 /* Interpolate PTS and DTS if they are not present. We skip H264
1337 * currently because delay and has_b_frames are not reliably set. */
1338 if ((delay == 0 || (delay == 1 && pc)) &&
1340 if (presentation_delayed) {
1341 /* DTS = decompression timestamp */
1342 /* PTS = presentation timestamp */
1343 if (pkt->dts == AV_NOPTS_VALUE)
1344 pkt->dts = st->last_IP_pts;
1345 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1346 if (pkt->dts == AV_NOPTS_VALUE)
1347 pkt->dts = st->cur_dts;
1349 /* This is tricky: the dts must be incremented by the duration
1350 * of the frame we are displaying, i.e. the last I- or P-frame. */
1351 if (st->last_IP_duration == 0 && (uint64_t)pkt->duration <= INT32_MAX)
1352 st->last_IP_duration = pkt->duration;
1353 if (pkt->dts != AV_NOPTS_VALUE)
1354 st->cur_dts = av_sat_add64(pkt->dts, st->last_IP_duration);
1355 if (pkt->dts != AV_NOPTS_VALUE &&
1356 pkt->pts == AV_NOPTS_VALUE &&
1357 st->last_IP_duration > 0 &&
1358 ((uint64_t)st->cur_dts - (uint64_t)next_dts + 1) <= 2 &&
1359 next_dts != next_pts &&
1360 next_pts != AV_NOPTS_VALUE)
1361 pkt->pts = next_dts;
1363 if ((uint64_t)pkt->duration <= INT32_MAX)
1364 st->last_IP_duration = pkt->duration;
1365 st->last_IP_pts = pkt->pts;
1366 /* Cannot compute PTS if not present (we can compute it only
1367 * by knowing the future. */
1368 } else if (pkt->pts != AV_NOPTS_VALUE ||
1369 pkt->dts != AV_NOPTS_VALUE ||
1370 pkt->duration > 0 ) {
1372 /* presentation is not delayed : PTS and DTS are the same */
1373 if (pkt->pts == AV_NOPTS_VALUE)
1374 pkt->pts = pkt->dts;
1375 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1377 if (pkt->pts == AV_NOPTS_VALUE)
1378 pkt->pts = st->cur_dts;
1379 pkt->dts = pkt->pts;
1380 if (pkt->pts != AV_NOPTS_VALUE && duration.num >= 0)
1381 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
1385 if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1386 st->internal->pts_buffer[0] = pkt->pts;
1387 for (i = 0; i<delay && st->internal->pts_buffer[i] > st->internal->pts_buffer[i + 1]; i++)
1388 FFSWAP(int64_t, st->internal->pts_buffer[i], st->internal->pts_buffer[i + 1]);
1390 if(has_decode_delay_been_guessed(st))
1391 pkt->dts = select_from_pts_buffer(st, st->internal->pts_buffer, pkt->dts);
1393 // We skipped it above so we try here.
1395 // This should happen on the first packet
1396 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1397 if (pkt->dts > st->cur_dts)
1398 st->cur_dts = pkt->dts;
1400 if (s->debug & FF_FDEBUG_TS)
1401 av_log(s, AV_LOG_DEBUG, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s st:%d (%d)\n",
1402 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), st->index, st->id);
1405 if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA || ff_is_intra_only(st->codecpar->codec_id))
1406 pkt->flags |= AV_PKT_FLAG_KEY;
1407 #if FF_API_CONVERGENCE_DURATION
1408 FF_DISABLE_DEPRECATION_WARNINGS
1410 pkt->convergence_duration = pc->convergence_duration;
1411 FF_ENABLE_DEPRECATION_WARNINGS
1416 * Parse a packet, add all split parts to parse_queue.
1418 * @param pkt Packet to parse; must not be NULL.
1419 * @param flush Indicates whether to flush. If set, pkt must be blank.
1421 static int parse_packet(AVFormatContext *s, AVPacket *pkt,
1422 int stream_index, int flush)
1424 AVPacket *out_pkt = s->internal->parse_pkt;
1425 AVStream *st = s->streams[stream_index];
1426 uint8_t *data = pkt->data;
1427 int size = pkt->size;
1428 int ret = 0, got_output = flush;
1430 if (size || flush) {
1431 av_packet_unref(out_pkt);
1432 } else if (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1433 // preserve 0-size sync packets
1434 compute_pkt_fields(s, st, st->parser, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1437 while (size > 0 || (flush && got_output)) {
1439 int64_t next_pts = pkt->pts;
1440 int64_t next_dts = pkt->dts;
1442 len = av_parser_parse2(st->parser, st->internal->avctx,
1443 &out_pkt->data, &out_pkt->size, data, size,
1444 pkt->pts, pkt->dts, pkt->pos);
1446 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1448 /* increment read pointer */
1449 av_assert1(data || !len);
1450 data = len ? data + len : data;
1453 got_output = !!out_pkt->size;
1458 if (pkt->buf && out_pkt->data == pkt->data) {
1459 /* reference pkt->buf only when out_pkt->data is guaranteed to point
1460 * to data in it and not in the parser's internal buffer. */
1461 /* XXX: Ensure this is the case with all parsers when st->parser->flags
1462 * is PARSER_FLAG_COMPLETE_FRAMES and check for that instead? */
1463 out_pkt->buf = av_buffer_ref(pkt->buf);
1464 if (!out_pkt->buf) {
1465 ret = AVERROR(ENOMEM);
1469 ret = av_packet_make_refcounted(out_pkt);
1474 if (pkt->side_data) {
1475 out_pkt->side_data = pkt->side_data;
1476 out_pkt->side_data_elems = pkt->side_data_elems;
1477 pkt->side_data = NULL;
1478 pkt->side_data_elems = 0;
1481 /* set the duration */
1482 out_pkt->duration = (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->duration : 0;
1483 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1484 if (st->internal->avctx->sample_rate > 0) {
1486 av_rescale_q_rnd(st->parser->duration,
1487 (AVRational) { 1, st->internal->avctx->sample_rate },
1493 out_pkt->stream_index = st->index;
1494 out_pkt->pts = st->parser->pts;
1495 out_pkt->dts = st->parser->dts;
1496 out_pkt->pos = st->parser->pos;
1497 out_pkt->flags |= pkt->flags & AV_PKT_FLAG_DISCARD;
1499 if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1500 out_pkt->pos = st->parser->frame_offset;
1502 if (st->parser->key_frame == 1 ||
1503 (st->parser->key_frame == -1 &&
1504 st->parser->pict_type == AV_PICTURE_TYPE_I))
1505 out_pkt->flags |= AV_PKT_FLAG_KEY;
1507 if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1508 out_pkt->flags |= AV_PKT_FLAG_KEY;
1510 compute_pkt_fields(s, st, st->parser, out_pkt, next_dts, next_pts);
1512 ret = avpriv_packet_list_put(&s->internal->parse_queue,
1513 &s->internal->parse_queue_end,
1516 av_packet_unref(out_pkt);
1521 /* end of the stream => close and free the parser */
1523 av_parser_close(st->parser);
1528 av_packet_unref(pkt);
1532 static int64_t ts_to_samples(AVStream *st, int64_t ts)
1534 return av_rescale(ts, st->time_base.num * st->codecpar->sample_rate, st->time_base.den);
1537 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1539 int ret, i, got_packet = 0;
1540 AVDictionary *metadata = NULL;
1542 while (!got_packet && !s->internal->parse_queue) {
1545 /* read next packet */
1546 ret = ff_read_packet(s, pkt);
1548 if (ret == AVERROR(EAGAIN))
1550 /* flush the parsers */
1551 for (i = 0; i < s->nb_streams; i++) {
1553 if (st->parser && st->need_parsing)
1554 parse_packet(s, pkt, st->index, 1);
1556 /* all remaining packets are now in parse_queue =>
1557 * really terminate parsing */
1561 st = s->streams[pkt->stream_index];
1563 st->event_flags |= AVSTREAM_EVENT_FLAG_NEW_PACKETS;
1565 /* update context if required */
1566 if (st->internal->need_context_update) {
1567 if (avcodec_is_open(st->internal->avctx)) {
1568 av_log(s, AV_LOG_DEBUG, "Demuxer context update while decoder is open, closing and trying to re-open\n");
1569 avcodec_close(st->internal->avctx);
1570 st->internal->info->found_decoder = 0;
1573 /* close parser, because it depends on the codec */
1574 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
1575 av_parser_close(st->parser);
1579 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
1581 av_packet_unref(pkt);
1585 #if FF_API_LAVF_AVCTX
1586 FF_DISABLE_DEPRECATION_WARNINGS
1587 /* update deprecated public codec context */
1588 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
1590 av_packet_unref(pkt);
1593 FF_ENABLE_DEPRECATION_WARNINGS
1596 st->internal->need_context_update = 0;
1599 if (pkt->pts != AV_NOPTS_VALUE &&
1600 pkt->dts != AV_NOPTS_VALUE &&
1601 pkt->pts < pkt->dts) {
1602 av_log(s, AV_LOG_WARNING,
1603 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1605 av_ts2str(pkt->pts),
1606 av_ts2str(pkt->dts),
1609 if (s->debug & FF_FDEBUG_TS)
1610 av_log(s, AV_LOG_DEBUG,
1611 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"PRId64", flags=%d\n",
1613 av_ts2str(pkt->pts),
1614 av_ts2str(pkt->dts),
1615 pkt->size, pkt->duration, pkt->flags);
1617 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1618 st->parser = av_parser_init(st->codecpar->codec_id);
1620 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1621 "%s, packets or times may be invalid.\n",
1622 avcodec_get_name(st->codecpar->codec_id));
1623 /* no parser available: just output the raw packets */
1624 st->need_parsing = AVSTREAM_PARSE_NONE;
1625 } else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1626 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1627 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1628 st->parser->flags |= PARSER_FLAG_ONCE;
1629 else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1630 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1633 if (!st->need_parsing || !st->parser) {
1634 /* no parsing needed: we just output the packet as is */
1635 compute_pkt_fields(s, st, NULL, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1636 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1637 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1638 ff_reduce_index(s, st->index);
1639 av_add_index_entry(st, pkt->pos, pkt->dts,
1640 0, 0, AVINDEX_KEYFRAME);
1643 } else if (st->discard < AVDISCARD_ALL) {
1644 if ((ret = parse_packet(s, pkt, pkt->stream_index, 0)) < 0)
1646 st->codecpar->sample_rate = st->internal->avctx->sample_rate;
1647 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
1648 st->codecpar->channels = st->internal->avctx->channels;
1649 st->codecpar->channel_layout = st->internal->avctx->channel_layout;
1650 st->codecpar->codec_id = st->internal->avctx->codec_id;
1653 av_packet_unref(pkt);
1655 if (pkt->flags & AV_PKT_FLAG_KEY)
1656 st->internal->skip_to_keyframe = 0;
1657 if (st->internal->skip_to_keyframe) {
1658 av_packet_unref(pkt);
1663 if (!got_packet && s->internal->parse_queue)
1664 ret = avpriv_packet_list_get(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt);
1667 AVStream *st = s->streams[pkt->stream_index];
1668 int discard_padding = 0;
1669 if (st->internal->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
1670 int64_t pts = pkt->pts - (is_relative(pkt->pts) ? RELATIVE_TS_BASE : 0);
1671 int64_t sample = ts_to_samples(st, pts);
1672 int duration = ts_to_samples(st, pkt->duration);
1673 int64_t end_sample = sample + duration;
1674 if (duration > 0 && end_sample >= st->internal->first_discard_sample &&
1675 sample < st->internal->last_discard_sample)
1676 discard_padding = FFMIN(end_sample - st->internal->first_discard_sample, duration);
1678 if (st->internal->start_skip_samples && (pkt->pts == 0 || pkt->pts == RELATIVE_TS_BASE))
1679 st->internal->skip_samples = st->internal->start_skip_samples;
1680 if (st->internal->skip_samples || discard_padding) {
1681 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1683 AV_WL32(p, st->internal->skip_samples);
1684 AV_WL32(p + 4, discard_padding);
1685 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d / discard %d\n", st->internal->skip_samples, discard_padding);
1687 st->internal->skip_samples = 0;
1690 if (st->internal->inject_global_side_data) {
1691 for (i = 0; i < st->nb_side_data; i++) {
1692 AVPacketSideData *src_sd = &st->side_data[i];
1695 if (av_packet_get_side_data(pkt, src_sd->type, NULL))
1698 dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
1700 av_log(s, AV_LOG_WARNING, "Could not inject global side data\n");
1704 memcpy(dst_data, src_sd->data, src_sd->size);
1706 st->internal->inject_global_side_data = 0;
1710 av_opt_get_dict_val(s, "metadata", AV_OPT_SEARCH_CHILDREN, &metadata);
1712 s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
1713 av_dict_copy(&s->metadata, metadata, 0);
1714 av_dict_free(&metadata);
1715 av_opt_set_dict_val(s, "metadata", NULL, AV_OPT_SEARCH_CHILDREN);
1718 #if FF_API_LAVF_AVCTX
1719 update_stream_avctx(s);
1722 if (s->debug & FF_FDEBUG_TS)
1723 av_log(s, AV_LOG_DEBUG,
1724 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1725 "size=%d, duration=%"PRId64", flags=%d\n",
1727 av_ts2str(pkt->pts),
1728 av_ts2str(pkt->dts),
1729 pkt->size, pkt->duration, pkt->flags);
1731 /* A demuxer might have returned EOF because of an IO error, let's
1732 * propagate this back to the user. */
1733 if (ret == AVERROR_EOF && s->pb && s->pb->error < 0 && s->pb->error != AVERROR(EAGAIN))
1739 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1741 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1747 ret = s->internal->packet_buffer
1748 ? avpriv_packet_list_get(&s->internal->packet_buffer,
1749 &s->internal->packet_buffer_end, pkt)
1750 : read_frame_internal(s, pkt);
1757 PacketList *pktl = s->internal->packet_buffer;
1760 AVPacket *next_pkt = &pktl->pkt;
1762 if (next_pkt->dts != AV_NOPTS_VALUE) {
1763 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1764 // last dts seen for this stream. if any of packets following
1765 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1766 int64_t last_dts = next_pkt->dts;
1767 av_assert2(wrap_bits <= 64);
1768 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1769 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1770 av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2ULL << (wrap_bits - 1)) < 0) {
1771 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2ULL << (wrap_bits - 1))) {
1773 next_pkt->pts = pktl->pkt.dts;
1775 if (last_dts != AV_NOPTS_VALUE) {
1776 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1777 last_dts = pktl->pkt.dts;
1782 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1783 // Fixing the last reference frame had none pts issue (For MXF etc).
1784 // We only do this when
1786 // 2. we are not able to resolve a pts value for current packet.
1787 // 3. the packets for this stream at the end of the files had valid dts.
1788 next_pkt->pts = last_dts + next_pkt->duration;
1790 pktl = s->internal->packet_buffer;
1793 /* read packet from packet buffer, if there is data */
1794 st = s->streams[next_pkt->stream_index];
1795 if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
1796 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1797 ret = avpriv_packet_list_get(&s->internal->packet_buffer,
1798 &s->internal->packet_buffer_end, pkt);
1803 ret = read_frame_internal(s, pkt);
1805 if (pktl && ret != AVERROR(EAGAIN)) {
1812 ret = avpriv_packet_list_put(&s->internal->packet_buffer,
1813 &s->internal->packet_buffer_end,
1816 av_packet_unref(pkt);
1823 st = s->streams[pkt->stream_index];
1824 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1825 ff_reduce_index(s, st->index);
1826 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1829 if (is_relative(pkt->dts))
1830 pkt->dts -= RELATIVE_TS_BASE;
1831 if (is_relative(pkt->pts))
1832 pkt->pts -= RELATIVE_TS_BASE;
1837 /* XXX: suppress the packet queue */
1838 static void flush_packet_queue(AVFormatContext *s)
1842 avpriv_packet_list_free(&s->internal->parse_queue, &s->internal->parse_queue_end);
1843 avpriv_packet_list_free(&s->internal->packet_buffer, &s->internal->packet_buffer_end);
1844 avpriv_packet_list_free(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
1846 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1849 /*******************************************************/
1852 int av_find_default_stream_index(AVFormatContext *s)
1856 int best_stream = 0;
1857 int best_score = INT_MIN;
1859 if (s->nb_streams <= 0)
1861 for (i = 0; i < s->nb_streams; i++) {
1864 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1865 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
1867 if (st->codecpar->width && st->codecpar->height)
1871 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1872 if (st->codecpar->sample_rate)
1875 if (st->codec_info_nb_frames)
1878 if (st->discard != AVDISCARD_ALL)
1881 if (score > best_score) {
1889 /** Flush the frame reader. */
1890 void ff_read_frame_flush(AVFormatContext *s)
1895 flush_packet_queue(s);
1897 /* Reset read state for each stream. */
1898 for (i = 0; i < s->nb_streams; i++) {
1902 av_parser_close(st->parser);
1905 st->last_IP_pts = AV_NOPTS_VALUE;
1906 st->internal->last_dts_for_order_check = AV_NOPTS_VALUE;
1907 if (st->first_dts == AV_NOPTS_VALUE)
1908 st->cur_dts = RELATIVE_TS_BASE;
1910 /* We set the current DTS to an unspecified origin. */
1911 st->cur_dts = AV_NOPTS_VALUE;
1913 st->probe_packets = s->max_probe_packets;
1915 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1916 st->internal->pts_buffer[j] = AV_NOPTS_VALUE;
1918 if (s->internal->inject_global_side_data)
1919 st->internal->inject_global_side_data = 1;
1921 st->internal->skip_samples = 0;
1925 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1929 for (i = 0; i < s->nb_streams; i++) {
1930 AVStream *st = s->streams[i];
1933 av_rescale(timestamp,
1934 st->time_base.den * (int64_t) ref_st->time_base.num,
1935 st->time_base.num * (int64_t) ref_st->time_base.den);
1939 void ff_reduce_index(AVFormatContext *s, int stream_index)
1941 AVStream *st = s->streams[stream_index];
1942 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1944 if ((unsigned) st->internal->nb_index_entries >= max_entries) {
1946 for (i = 0; 2 * i < st->internal->nb_index_entries; i++)
1947 st->internal->index_entries[i] = st->internal->index_entries[2 * i];
1948 st->internal->nb_index_entries = i;
1952 int ff_add_index_entry(AVIndexEntry **index_entries,
1953 int *nb_index_entries,
1954 unsigned int *index_entries_allocated_size,
1955 int64_t pos, int64_t timestamp,
1956 int size, int distance, int flags)
1958 AVIndexEntry *entries, *ie;
1961 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1964 if (timestamp == AV_NOPTS_VALUE)
1965 return AVERROR(EINVAL);
1967 if (size < 0 || size > 0x3FFFFFFF)
1968 return AVERROR(EINVAL);
1970 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1971 timestamp -= RELATIVE_TS_BASE;
1973 entries = av_fast_realloc(*index_entries,
1974 index_entries_allocated_size,
1975 (*nb_index_entries + 1) *
1976 sizeof(AVIndexEntry));
1980 *index_entries = entries;
1982 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
1983 timestamp, AVSEEK_FLAG_ANY);
1986 index = (*nb_index_entries)++;
1987 ie = &entries[index];
1988 av_assert0(index == 0 || ie[-1].timestamp < timestamp);
1990 ie = &entries[index];
1991 if (ie->timestamp != timestamp) {
1992 if (ie->timestamp <= timestamp)
1994 memmove(entries + index + 1, entries + index,
1995 sizeof(AVIndexEntry) * (*nb_index_entries - index));
1996 (*nb_index_entries)++;
1997 } else if (ie->pos == pos && distance < ie->min_distance)
1998 // do not reduce the distance
1999 distance = ie->min_distance;
2003 ie->timestamp = timestamp;
2004 ie->min_distance = distance;
2011 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
2012 int size, int distance, int flags)
2014 timestamp = wrap_timestamp(st, timestamp);
2015 return ff_add_index_entry(&st->internal->index_entries, &st->internal->nb_index_entries,
2016 &st->internal->index_entries_allocated_size, pos,
2017 timestamp, size, distance, flags);
2020 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
2021 int64_t wanted_timestamp, int flags)
2029 // Optimize appending index entries at the end.
2030 if (b && entries[b - 1].timestamp < wanted_timestamp)
2036 // Search for the next non-discarded packet.
2037 while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b && m < nb_entries - 1) {
2039 if (m == b && entries[m].timestamp >= wanted_timestamp) {
2045 timestamp = entries[m].timestamp;
2046 if (timestamp >= wanted_timestamp)
2048 if (timestamp <= wanted_timestamp)
2051 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
2053 if (!(flags & AVSEEK_FLAG_ANY))
2054 while (m >= 0 && m < nb_entries &&
2055 !(entries[m].flags & AVINDEX_KEYFRAME))
2056 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
2058 if (m == nb_entries)
2063 void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
2066 int64_t pos_delta = 0;
2068 //We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
2069 const char *proto = avio_find_protocol_name(s->url);
2071 av_assert0(time_tolerance >= 0);
2074 av_log(s, AV_LOG_INFO,
2075 "Protocol name not provided, cannot determine if input is local or "
2076 "a network protocol, buffers and access patterns cannot be configured "
2077 "optimally without knowing the protocol\n");
2080 if (proto && !(strcmp(proto, "file") && strcmp(proto, "pipe") && strcmp(proto, "cache")))
2083 for (ist1 = 0; ist1 < s->nb_streams; ist1++) {
2084 AVStream *st1 = s->streams[ist1];
2085 for (ist2 = 0; ist2 < s->nb_streams; ist2++) {
2086 AVStream *st2 = s->streams[ist2];
2092 for (i1 = i2 = 0; i1 < st1->internal->nb_index_entries; i1++) {
2093 AVIndexEntry *e1 = &st1->internal->index_entries[i1];
2094 int64_t e1_pts = av_rescale_q(e1->timestamp, st1->time_base, AV_TIME_BASE_Q);
2096 skip = FFMAX(skip, e1->size);
2097 for (; i2 < st2->internal->nb_index_entries; i2++) {
2098 AVIndexEntry *e2 = &st2->internal->index_entries[i2];
2099 int64_t e2_pts = av_rescale_q(e2->timestamp, st2->time_base, AV_TIME_BASE_Q);
2100 if (e2_pts < e1_pts || e2_pts - (uint64_t)e1_pts < time_tolerance)
2102 pos_delta = FFMAX(pos_delta, e1->pos - e2->pos);
2110 /* XXX This could be adjusted depending on protocol*/
2111 if (s->pb->buffer_size < pos_delta && pos_delta < (1<<24)) {
2112 av_log(s, AV_LOG_VERBOSE, "Reconfiguring buffers to size %"PRId64"\n", pos_delta);
2114 /* realloc the buffer and the original data will be retained */
2115 if (ffio_realloc_buf(s->pb, pos_delta)) {
2116 av_log(s, AV_LOG_ERROR, "Realloc buffer fail.\n");
2120 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, pos_delta/2);
2123 if (skip < (1<<23)) {
2124 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, skip);
2128 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
2130 return ff_index_search_timestamp(st->internal->index_entries, st->internal->nb_index_entries,
2131 wanted_timestamp, flags);
2134 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
2135 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2137 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
2138 if (stream_index >= 0)
2139 ts = wrap_timestamp(s->streams[stream_index], ts);
2143 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
2144 int64_t target_ts, int flags)
2146 const AVInputFormat *avif = s->iformat;
2147 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
2148 int64_t ts_min, ts_max, ts;
2153 if (stream_index < 0)
2156 av_log(s, AV_LOG_TRACE, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2159 ts_min = AV_NOPTS_VALUE;
2160 pos_limit = -1; // GCC falsely says it may be uninitialized.
2162 st = s->streams[stream_index];
2163 if (st->internal->index_entries) {
2166 /* FIXME: Whole function must be checked for non-keyframe entries in
2167 * index case, especially read_timestamp(). */
2168 index = av_index_search_timestamp(st, target_ts,
2169 flags | AVSEEK_FLAG_BACKWARD);
2170 index = FFMAX(index, 0);
2171 e = &st->internal->index_entries[index];
2173 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
2175 ts_min = e->timestamp;
2176 av_log(s, AV_LOG_TRACE, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
2177 pos_min, av_ts2str(ts_min));
2179 av_assert1(index == 0);
2182 index = av_index_search_timestamp(st, target_ts,
2183 flags & ~AVSEEK_FLAG_BACKWARD);
2184 av_assert0(index < st->internal->nb_index_entries);
2186 e = &st->internal->index_entries[index];
2187 av_assert1(e->timestamp >= target_ts);
2189 ts_max = e->timestamp;
2190 pos_limit = pos_max - e->min_distance;
2191 av_log(s, AV_LOG_TRACE, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
2192 " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
2196 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
2197 ts_min, ts_max, flags, &ts, avif->read_timestamp);
2202 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
2205 ff_read_frame_flush(s);
2206 ff_update_cur_dts(s, st, ts);
2211 int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
2212 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2214 int64_t step = 1024;
2215 int64_t limit, ts_max;
2216 int64_t filesize = avio_size(s->pb);
2217 int64_t pos_max = filesize - 1;
2220 pos_max = FFMAX(0, (pos_max) - step);
2221 ts_max = ff_read_timestamp(s, stream_index,
2222 &pos_max, limit, read_timestamp);
2224 } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
2225 if (ts_max == AV_NOPTS_VALUE)
2229 int64_t tmp_pos = pos_max + 1;
2230 int64_t tmp_ts = ff_read_timestamp(s, stream_index,
2231 &tmp_pos, INT64_MAX, read_timestamp);
2232 if (tmp_ts == AV_NOPTS_VALUE)
2234 av_assert0(tmp_pos > pos_max);
2237 if (tmp_pos >= filesize)
2249 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
2250 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
2251 int64_t ts_min, int64_t ts_max,
2252 int flags, int64_t *ts_ret,
2253 int64_t (*read_timestamp)(struct AVFormatContext *, int,
2254 int64_t *, int64_t))
2261 av_log(s, AV_LOG_TRACE, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2263 if (ts_min == AV_NOPTS_VALUE) {
2264 pos_min = s->internal->data_offset;
2265 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2266 if (ts_min == AV_NOPTS_VALUE)
2270 if (ts_min >= target_ts) {
2275 if (ts_max == AV_NOPTS_VALUE) {
2276 if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
2278 pos_limit = pos_max;
2281 if (ts_max <= target_ts) {
2286 av_assert0(ts_min < ts_max);
2289 while (pos_min < pos_limit) {
2290 av_log(s, AV_LOG_TRACE,
2291 "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
2292 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
2293 av_assert0(pos_limit <= pos_max);
2295 if (no_change == 0) {
2296 int64_t approximate_keyframe_distance = pos_max - pos_limit;
2297 // interpolate position (better than dichotomy)
2298 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
2300 pos_min - approximate_keyframe_distance;
2301 } else if (no_change == 1) {
2302 // bisection if interpolation did not change min / max pos last time
2303 pos = (pos_min + pos_limit) >> 1;
2305 /* linear search if bisection failed, can only happen if there
2306 * are very few or no keyframes between min/max */
2311 else if (pos > pos_limit)
2315 // May pass pos_limit instead of -1.
2316 ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
2321 av_log(s, AV_LOG_TRACE, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
2322 " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
2323 pos_min, pos, pos_max,
2324 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
2325 pos_limit, start_pos, no_change);
2326 if (ts == AV_NOPTS_VALUE) {
2327 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
2330 if (target_ts <= ts) {
2331 pos_limit = start_pos - 1;
2335 if (target_ts >= ts) {
2341 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
2342 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
2345 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2347 ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2348 av_log(s, AV_LOG_TRACE, "pos=0x%"PRIx64" %s<=%s<=%s\n",
2349 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
2355 static int seek_frame_byte(AVFormatContext *s, int stream_index,
2356 int64_t pos, int flags)
2358 int64_t pos_min, pos_max;
2360 pos_min = s->internal->data_offset;
2361 pos_max = avio_size(s->pb) - 1;
2365 else if (pos > pos_max)
2368 avio_seek(s->pb, pos, SEEK_SET);
2370 s->io_repositioned = 1;
2375 static int seek_frame_generic(AVFormatContext *s, int stream_index,
2376 int64_t timestamp, int flags)
2383 st = s->streams[stream_index];
2385 index = av_index_search_timestamp(st, timestamp, flags);
2387 if (index < 0 && st->internal->nb_index_entries &&
2388 timestamp < st->internal->index_entries[0].timestamp)
2391 if (index < 0 || index == st->internal->nb_index_entries - 1) {
2392 AVPacket *pkt = s->internal->pkt;
2395 if (st->internal->nb_index_entries) {
2396 av_assert0(st->internal->index_entries);
2397 ie = &st->internal->index_entries[st->internal->nb_index_entries - 1];
2398 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2400 ff_update_cur_dts(s, st, ie->timestamp);
2402 if ((ret = avio_seek(s->pb, s->internal->data_offset, SEEK_SET)) < 0)
2405 av_packet_unref(pkt);
2409 read_status = av_read_frame(s, pkt);
2410 } while (read_status == AVERROR(EAGAIN));
2411 if (read_status < 0)
2413 if (stream_index == pkt->stream_index && pkt->dts > timestamp) {
2414 if (pkt->flags & AV_PKT_FLAG_KEY) {
2415 av_packet_unref(pkt);
2418 if (nonkey++ > 1000 && st->codecpar->codec_id != AV_CODEC_ID_CDGRAPHICS) {
2419 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);
2420 av_packet_unref(pkt);
2424 av_packet_unref(pkt);
2426 index = av_index_search_timestamp(st, timestamp, flags);
2431 ff_read_frame_flush(s);
2432 if (s->iformat->read_seek)
2433 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2435 ie = &st->internal->index_entries[index];
2436 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2438 ff_update_cur_dts(s, st, ie->timestamp);
2443 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2444 int64_t timestamp, int flags)
2449 if (flags & AVSEEK_FLAG_BYTE) {
2450 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2452 ff_read_frame_flush(s);
2453 return seek_frame_byte(s, stream_index, timestamp, flags);
2456 if (stream_index < 0) {
2457 stream_index = av_find_default_stream_index(s);
2458 if (stream_index < 0)
2461 st = s->streams[stream_index];
2462 /* timestamp for default must be expressed in AV_TIME_BASE units */
2463 timestamp = av_rescale(timestamp, st->time_base.den,
2464 AV_TIME_BASE * (int64_t) st->time_base.num);
2467 /* first, we try the format specific seek */
2468 if (s->iformat->read_seek) {
2469 ff_read_frame_flush(s);
2470 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2476 if (s->iformat->read_timestamp &&
2477 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2478 ff_read_frame_flush(s);
2479 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2480 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2481 ff_read_frame_flush(s);
2482 return seek_frame_generic(s, stream_index, timestamp, flags);
2487 int av_seek_frame(AVFormatContext *s, int stream_index,
2488 int64_t timestamp, int flags)
2492 if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2493 int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2494 if ((flags & AVSEEK_FLAG_BACKWARD))
2498 return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2499 flags & ~AVSEEK_FLAG_BACKWARD);
2502 ret = seek_frame_internal(s, stream_index, timestamp, flags);
2505 ret = avformat_queue_attached_pictures(s);
2510 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
2511 int64_t ts, int64_t max_ts, int flags)
2513 if (min_ts > ts || max_ts < ts)
2515 if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2516 return AVERROR(EINVAL);
2519 flags |= AVSEEK_FLAG_ANY;
2520 flags &= ~AVSEEK_FLAG_BACKWARD;
2522 if (s->iformat->read_seek2) {
2524 ff_read_frame_flush(s);
2526 if (stream_index == -1 && s->nb_streams == 1) {
2527 AVRational time_base = s->streams[0]->time_base;
2528 ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2529 min_ts = av_rescale_rnd(min_ts, time_base.den,
2530 time_base.num * (int64_t)AV_TIME_BASE,
2531 AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
2532 max_ts = av_rescale_rnd(max_ts, time_base.den,
2533 time_base.num * (int64_t)AV_TIME_BASE,
2534 AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
2538 ret = s->iformat->read_seek2(s, stream_index, min_ts,
2542 ret = avformat_queue_attached_pictures(s);
2546 if (s->iformat->read_timestamp) {
2547 // try to seek via read_timestamp()
2550 // Fall back on old API if new is not implemented but old is.
2551 // Note the old API has somewhat different semantics.
2552 if (s->iformat->read_seek || 1) {
2553 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2554 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2555 if (ret<0 && ts != min_ts && max_ts != ts) {
2556 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2558 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2563 // try some generic seek like seek_frame_generic() but with new ts semantics
2564 return -1; //unreachable
2567 int avformat_flush(AVFormatContext *s)
2569 ff_read_frame_flush(s);
2573 /*******************************************************/
2576 * Return TRUE if the stream has accurate duration in any stream.
2578 * @return TRUE if the stream has accurate duration for at least one component.
2580 static int has_duration(AVFormatContext *ic)
2585 for (i = 0; i < ic->nb_streams; i++) {
2586 st = ic->streams[i];
2587 if (st->duration != AV_NOPTS_VALUE)
2590 if (ic->duration != AV_NOPTS_VALUE)
2596 * Estimate the stream timings from the one of each components.
2598 * Also computes the global bitrate if possible.
2600 static void update_stream_timings(AVFormatContext *ic)
2602 int64_t start_time, start_time1, start_time_text, end_time, end_time1, end_time_text;
2603 int64_t duration, duration1, duration_text, filesize;
2607 start_time = INT64_MAX;
2608 start_time_text = INT64_MAX;
2609 end_time = INT64_MIN;
2610 end_time_text = INT64_MIN;
2611 duration = INT64_MIN;
2612 duration_text = INT64_MIN;
2614 for (i = 0; i < ic->nb_streams; i++) {
2615 AVStream *st = ic->streams[i];
2616 int is_text = st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE ||
2617 st->codecpar->codec_type == AVMEDIA_TYPE_DATA;
2618 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2619 start_time1 = av_rescale_q(st->start_time, st->time_base,
2622 start_time_text = FFMIN(start_time_text, start_time1);
2624 start_time = FFMIN(start_time, start_time1);
2625 end_time1 = av_rescale_q_rnd(st->duration, st->time_base,
2627 AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
2628 if (end_time1 != AV_NOPTS_VALUE && (end_time1 > 0 ? start_time1 <= INT64_MAX - end_time1 : start_time1 >= INT64_MIN - end_time1)) {
2629 end_time1 += start_time1;
2631 end_time_text = FFMAX(end_time_text, end_time1);
2633 end_time = FFMAX(end_time, end_time1);
2635 for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
2636 if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2637 p->start_time = start_time1;
2638 if (p->end_time < end_time1)
2639 p->end_time = end_time1;
2642 if (st->duration != AV_NOPTS_VALUE) {
2643 duration1 = av_rescale_q(st->duration, st->time_base,
2646 duration_text = FFMAX(duration_text, duration1);
2648 duration = FFMAX(duration, duration1);
2651 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - (uint64_t)start_time_text < AV_TIME_BASE))
2652 start_time = start_time_text;
2653 else if (start_time > start_time_text)
2654 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2656 if (end_time == INT64_MIN || (end_time < end_time_text && end_time_text - (uint64_t)end_time < AV_TIME_BASE))
2657 end_time = end_time_text;
2658 else if (end_time < end_time_text)
2659 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream endtime %f\n", end_time_text / (float)AV_TIME_BASE);
2661 if (duration == INT64_MIN || (duration < duration_text && duration_text - duration < AV_TIME_BASE))
2662 duration = duration_text;
2663 else if (duration < duration_text)
2664 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream duration %f\n", duration_text / (float)AV_TIME_BASE);
2666 if (start_time != INT64_MAX) {
2667 ic->start_time = start_time;
2668 if (end_time != INT64_MIN) {
2669 if (ic->nb_programs > 1) {
2670 for (i = 0; i < ic->nb_programs; i++) {
2671 p = ic->programs[i];
2672 if (p->start_time != AV_NOPTS_VALUE &&
2673 p->end_time > p->start_time &&
2674 p->end_time - (uint64_t)p->start_time <= INT64_MAX)
2675 duration = FFMAX(duration, p->end_time - p->start_time);
2677 } else if (end_time >= start_time && end_time - (uint64_t)start_time <= INT64_MAX) {
2678 duration = FFMAX(duration, end_time - start_time);
2682 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2683 ic->duration = duration;
2685 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration > 0) {
2686 /* compute the bitrate */
2687 double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2688 (double) ic->duration;
2689 if (bitrate >= 0 && bitrate <= INT64_MAX)
2690 ic->bit_rate = bitrate;
2694 static void fill_all_stream_timings(AVFormatContext *ic)
2699 update_stream_timings(ic);
2700 for (i = 0; i < ic->nb_streams; i++) {
2701 st = ic->streams[i];
2702 if (st->start_time == AV_NOPTS_VALUE) {
2703 if (ic->start_time != AV_NOPTS_VALUE)
2704 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
2706 if (ic->duration != AV_NOPTS_VALUE)
2707 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
2713 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2715 int64_t filesize, duration;
2716 int i, show_warning = 0;
2719 /* if bit_rate is already set, we believe it */
2720 if (ic->bit_rate <= 0) {
2721 int64_t bit_rate = 0;
2722 for (i = 0; i < ic->nb_streams; i++) {
2723 st = ic->streams[i];
2724 if (st->codecpar->bit_rate <= 0 && st->internal->avctx->bit_rate > 0)
2725 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
2726 if (st->codecpar->bit_rate > 0) {
2727 if (INT64_MAX - st->codecpar->bit_rate < bit_rate) {
2731 bit_rate += st->codecpar->bit_rate;
2732 } else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && st->codec_info_nb_frames > 1) {
2733 // If we have a videostream with packets but without a bitrate
2734 // then consider the sum not known
2739 ic->bit_rate = bit_rate;
2742 /* if duration is already set, we believe it */
2743 if (ic->duration == AV_NOPTS_VALUE &&
2744 ic->bit_rate != 0) {
2745 filesize = ic->pb ? avio_size(ic->pb) : 0;
2746 if (filesize > ic->internal->data_offset) {
2747 filesize -= ic->internal->data_offset;
2748 for (i = 0; i < ic->nb_streams; i++) {
2749 st = ic->streams[i];
2750 if ( st->time_base.num <= INT64_MAX / ic->bit_rate
2751 && st->duration == AV_NOPTS_VALUE) {
2752 duration = av_rescale(filesize, 8LL * st->time_base.den,
2754 (int64_t) st->time_base.num);
2755 st->duration = duration;
2762 av_log(ic, AV_LOG_WARNING,
2763 "Estimating duration from bitrate, this may be inaccurate\n");
2766 #define DURATION_MAX_READ_SIZE 250000LL
2767 #define DURATION_MAX_RETRY 6
2769 /* only usable for MPEG-PS streams */
2770 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2772 AVPacket *pkt = ic->internal->pkt;
2774 int num, den, read_size, i, ret;
2775 int found_duration = 0;
2777 int64_t filesize, offset, duration;
2780 /* flush packet queue */
2781 flush_packet_queue(ic);
2783 for (i = 0; i < ic->nb_streams; i++) {
2784 st = ic->streams[i];
2785 if (st->start_time == AV_NOPTS_VALUE &&
2786 st->first_dts == AV_NOPTS_VALUE &&
2787 st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN)
2788 av_log(ic, AV_LOG_WARNING,
2789 "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2792 av_parser_close(st->parser);
2797 if (ic->skip_estimate_duration_from_pts) {
2798 av_log(ic, AV_LOG_INFO, "Skipping duration calculation in estimate_timings_from_pts\n");
2799 goto skip_duration_calc;
2802 av_opt_set(ic, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN);
2803 /* estimate the end time (duration) */
2804 /* XXX: may need to support wrapping */
2805 filesize = ic->pb ? avio_size(ic->pb) : 0;
2807 is_end = found_duration;
2808 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
2812 avio_seek(ic->pb, offset, SEEK_SET);
2815 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
2819 ret = ff_read_packet(ic, pkt);
2820 } while (ret == AVERROR(EAGAIN));
2823 read_size += pkt->size;
2824 st = ic->streams[pkt->stream_index];
2825 if (pkt->pts != AV_NOPTS_VALUE &&
2826 (st->start_time != AV_NOPTS_VALUE ||
2827 st->first_dts != AV_NOPTS_VALUE)) {
2828 if (pkt->duration == 0) {
2829 ff_compute_frame_duration(ic, &num, &den, st, st->parser, pkt);
2831 pkt->duration = av_rescale_rnd(1,
2832 num * (int64_t) st->time_base.den,
2833 den * (int64_t) st->time_base.num,
2837 duration = pkt->pts + pkt->duration;
2839 if (st->start_time != AV_NOPTS_VALUE)
2840 duration -= st->start_time;
2842 duration -= st->first_dts;
2844 if (st->duration == AV_NOPTS_VALUE || st->internal->info->last_duration<= 0 ||
2845 (st->duration < duration && FFABS(duration - st->internal->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2846 st->duration = duration;
2847 st->internal->info->last_duration = duration;
2850 av_packet_unref(pkt);
2853 /* check if all audio/video streams have valid duration */
2856 for (i = 0; i < ic->nb_streams; i++) {
2857 st = ic->streams[i];
2858 switch (st->codecpar->codec_type) {
2859 case AVMEDIA_TYPE_VIDEO:
2860 case AVMEDIA_TYPE_AUDIO:
2861 if (st->duration == AV_NOPTS_VALUE)
2868 ++retry <= DURATION_MAX_RETRY);
2870 av_opt_set(ic, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN);
2872 /* warn about audio/video streams which duration could not be estimated */
2873 for (i = 0; i < ic->nb_streams; i++) {
2874 st = ic->streams[i];
2875 if (st->duration == AV_NOPTS_VALUE) {
2876 switch (st->codecpar->codec_type) {
2877 case AVMEDIA_TYPE_VIDEO:
2878 case AVMEDIA_TYPE_AUDIO:
2879 if (st->start_time != AV_NOPTS_VALUE || st->first_dts != AV_NOPTS_VALUE) {
2880 av_log(ic, AV_LOG_WARNING, "stream %d : no PTS found at end of file, duration not set\n", i);
2882 av_log(ic, AV_LOG_WARNING, "stream %d : no TS found at start of file, duration not set\n", i);
2887 fill_all_stream_timings(ic);
2889 avio_seek(ic->pb, old_offset, SEEK_SET);
2890 for (i = 0; i < ic->nb_streams; i++) {
2893 st = ic->streams[i];
2894 st->cur_dts = st->first_dts;
2895 st->last_IP_pts = AV_NOPTS_VALUE;
2896 st->internal->last_dts_for_order_check = AV_NOPTS_VALUE;
2897 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
2898 st->internal->pts_buffer[j] = AV_NOPTS_VALUE;
2902 /* 1:1 map to AVDurationEstimationMethod */
2903 static const char *const duration_name[] = {
2904 [AVFMT_DURATION_FROM_PTS] = "pts",
2905 [AVFMT_DURATION_FROM_STREAM] = "stream",
2906 [AVFMT_DURATION_FROM_BITRATE] = "bit rate",
2909 static const char *duration_estimate_name(enum AVDurationEstimationMethod method)
2911 return duration_name[method];
2914 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2918 /* get the file size, if possible */
2919 if (ic->iformat->flags & AVFMT_NOFILE) {
2922 file_size = avio_size(ic->pb);
2923 file_size = FFMAX(0, file_size);
2926 if ((!strcmp(ic->iformat->name, "mpeg") ||
2927 !strcmp(ic->iformat->name, "mpegts")) &&
2928 file_size && (ic->pb->seekable & AVIO_SEEKABLE_NORMAL)) {
2929 /* get accurate estimate from the PTSes */
2930 estimate_timings_from_pts(ic, old_offset);
2931 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2932 } else if (has_duration(ic)) {
2933 /* at least one component has timings - we use them for all
2935 fill_all_stream_timings(ic);
2936 /* nut demuxer estimate the duration from PTS */
2937 if(!strcmp(ic->iformat->name, "nut"))
2938 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2940 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2942 /* less precise: use bitrate info */
2943 estimate_timings_from_bit_rate(ic);
2944 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2946 update_stream_timings(ic);
2950 AVStream av_unused *st;
2951 for (i = 0; i < ic->nb_streams; i++) {
2952 st = ic->streams[i];
2953 if (st->time_base.den)
2954 av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %s duration: %s\n", i,
2955 av_ts2timestr(st->start_time, &st->time_base),
2956 av_ts2timestr(st->duration, &st->time_base));
2958 av_log(ic, AV_LOG_TRACE,
2959 "format: start_time: %s duration: %s (estimate from %s) bitrate=%"PRId64" kb/s\n",
2960 av_ts2timestr(ic->start_time, &AV_TIME_BASE_Q),
2961 av_ts2timestr(ic->duration, &AV_TIME_BASE_Q),
2962 duration_estimate_name(ic->duration_estimation_method),
2963 (int64_t)ic->bit_rate / 1000);
2967 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2969 AVCodecContext *avctx = st->internal->avctx;
2971 #define FAIL(errmsg) do { \
2973 *errmsg_ptr = errmsg; \
2977 if ( avctx->codec_id == AV_CODEC_ID_NONE
2978 && avctx->codec_type != AVMEDIA_TYPE_DATA)
2979 FAIL("unknown codec");
2980 switch (avctx->codec_type) {
2981 case AVMEDIA_TYPE_AUDIO:
2982 if (!avctx->frame_size && determinable_frame_size(avctx))
2983 FAIL("unspecified frame size");
2984 if (st->internal->info->found_decoder >= 0 &&
2985 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2986 FAIL("unspecified sample format");
2987 if (!avctx->sample_rate)
2988 FAIL("unspecified sample rate");
2989 if (!avctx->channels)
2990 FAIL("unspecified number of channels");
2991 if (st->internal->info->found_decoder >= 0 && !st->internal->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
2992 FAIL("no decodable DTS frames");
2994 case AVMEDIA_TYPE_VIDEO:
2996 FAIL("unspecified size");
2997 if (st->internal->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
2998 FAIL("unspecified pixel format");
2999 if (st->codecpar->codec_id == AV_CODEC_ID_RV30 || st->codecpar->codec_id == AV_CODEC_ID_RV40)
3000 if (!st->sample_aspect_ratio.num && !st->codecpar->sample_aspect_ratio.num && !st->codec_info_nb_frames)
3001 FAIL("no frame in rv30/40 and no sar");
3003 case AVMEDIA_TYPE_SUBTITLE:
3004 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
3005 FAIL("unspecified size");
3007 case AVMEDIA_TYPE_DATA:
3008 if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
3014 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
3015 static int try_decode_frame(AVFormatContext *s, AVStream *st,
3016 const AVPacket *avpkt, AVDictionary **options)
3018 AVCodecContext *avctx = st->internal->avctx;
3019 const AVCodec *codec;
3020 int got_picture = 1, ret = 0;
3021 AVFrame *frame = av_frame_alloc();
3022 AVSubtitle subtitle;
3023 AVPacket pkt = *avpkt;
3024 int do_skip_frame = 0;
3025 enum AVDiscard skip_frame;
3028 return AVERROR(ENOMEM);
3030 if (!avcodec_is_open(avctx) &&
3031 st->internal->info->found_decoder <= 0 &&
3032 (st->codecpar->codec_id != -st->internal->info->found_decoder || !st->codecpar->codec_id)) {
3033 AVDictionary *thread_opt = NULL;
3035 codec = find_probe_decoder(s, st, st->codecpar->codec_id);
3038 st->internal->info->found_decoder = -st->codecpar->codec_id;
3043 /* Force thread count to 1 since the H.264 decoder will not extract
3044 * SPS and PPS to extradata during multi-threaded decoding. */
3045 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
3046 /* Force lowres to 0. The decoder might reduce the video size by the
3047 * lowres factor, and we don't want that propagated to the stream's
3049 av_dict_set(options ? options : &thread_opt, "lowres", "0", 0);
3050 if (s->codec_whitelist)
3051 av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
3052 ret = avcodec_open2(avctx, codec, options ? options : &thread_opt);
3054 av_dict_free(&thread_opt);
3056 st->internal->info->found_decoder = -avctx->codec_id;
3059 st->internal->info->found_decoder = 1;
3060 } else if (!st->internal->info->found_decoder)
3061 st->internal->info->found_decoder = 1;
3063 if (st->internal->info->found_decoder < 0) {
3068 if (avpriv_codec_get_cap_skip_frame_fill_param(avctx->codec)) {
3070 skip_frame = avctx->skip_frame;
3071 avctx->skip_frame = AVDISCARD_ALL;
3074 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
3076 (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
3077 (!st->codec_info_nb_frames &&
3078 (avctx->codec->capabilities & AV_CODEC_CAP_CHANNEL_CONF)))) {
3080 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
3081 avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
3082 ret = avcodec_send_packet(avctx, &pkt);
3083 if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3087 ret = avcodec_receive_frame(avctx, frame);
3090 if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
3092 } else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3093 ret = avcodec_decode_subtitle2(avctx, &subtitle,
3094 &got_picture, &pkt);
3096 avsubtitle_free(&subtitle);
3102 st->internal->nb_decoded_frames++;
3107 if (!pkt.data && !got_picture)
3111 if (do_skip_frame) {
3112 avctx->skip_frame = skip_frame;
3115 av_frame_free(&frame);
3119 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
3121 while (tags->id != AV_CODEC_ID_NONE) {
3129 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
3132 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3133 if (tag == tags[i].tag)
3135 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3136 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
3138 return AV_CODEC_ID_NONE;
3141 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
3143 if (bps <= 0 || bps > 64)
3144 return AV_CODEC_ID_NONE;
3149 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
3151 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
3153 return AV_CODEC_ID_NONE;
3158 if (sflags & (1 << (bps - 1))) {
3161 return AV_CODEC_ID_PCM_S8;
3163 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
3165 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
3167 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
3169 return be ? AV_CODEC_ID_PCM_S64BE : AV_CODEC_ID_PCM_S64LE;
3171 return AV_CODEC_ID_NONE;
3176 return AV_CODEC_ID_PCM_U8;
3178 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
3180 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
3182 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
3184 return AV_CODEC_ID_NONE;
3190 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
3193 if (!av_codec_get_tag2(tags, id, &tag))
3198 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
3202 for (i = 0; tags && tags[i]; i++) {
3203 const AVCodecTag *codec_tags = tags[i];
3204 while (codec_tags->id != AV_CODEC_ID_NONE) {
3205 if (codec_tags->id == id) {
3206 *tag = codec_tags->tag;
3215 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
3218 for (i = 0; tags && tags[i]; i++) {
3219 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
3220 if (id != AV_CODEC_ID_NONE)
3223 return AV_CODEC_ID_NONE;
3226 static int chapter_start_cmp(const void *p1, const void *p2)
3228 AVChapter *ch1 = *(AVChapter**)p1;
3229 AVChapter *ch2 = *(AVChapter**)p2;
3230 int delta = av_compare_ts(ch1->start, ch1->time_base, ch2->start, ch2->time_base);
3233 return (ch1 > ch2) - (ch1 < ch2);
3236 static int compute_chapters_end(AVFormatContext *s)
3239 int64_t max_time = 0;
3240 AVChapter **timetable = av_malloc(s->nb_chapters * sizeof(*timetable));
3243 return AVERROR(ENOMEM);
3245 if (s->duration > 0 && s->start_time < INT64_MAX - s->duration)
3246 max_time = s->duration +
3247 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
3249 for (i = 0; i < s->nb_chapters; i++)
3250 timetable[i] = s->chapters[i];
3251 qsort(timetable, s->nb_chapters, sizeof(*timetable), chapter_start_cmp);
3253 for (i = 0; i < s->nb_chapters; i++)
3254 if (timetable[i]->end == AV_NOPTS_VALUE) {
3255 AVChapter *ch = timetable[i];
3256 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
3260 if (i + 1 < s->nb_chapters) {
3261 AVChapter *ch1 = timetable[i + 1];
3262 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
3264 if (next_start > ch->start && next_start < end)
3267 ch->end = (end == INT64_MAX || end < ch->start) ? ch->start : end;
3273 static int get_std_framerate(int i)
3276 return (i + 1) * 1001;
3280 return (i + 31) * 1001 * 12;
3284 return ((const int[]) { 80, 120, 240})[i] * 1001 * 12;
3288 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
3291 /* Is the time base unreliable?
3292 * This is a heuristic to balance between quick acceptance of the values in
3293 * the headers vs. some extra checks.
3294 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
3295 * MPEG-2 commonly misuses field repeat flags to store different framerates.
3296 * And there are "variable" fps files this needs to detect as well. */
3297 static int tb_unreliable(AVCodecContext *c)
3299 if (c->time_base.den >= 101LL * c->time_base.num ||
3300 c->time_base.den < 5LL * c->time_base.num ||
3301 // c->codec_tag == AV_RL32("DIVX") ||
3302 // c->codec_tag == AV_RL32("XVID") ||
3303 c->codec_tag == AV_RL32("mp4v") ||
3304 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
3305 c->codec_id == AV_CODEC_ID_GIF ||
3306 c->codec_id == AV_CODEC_ID_HEVC ||
3307 c->codec_id == AV_CODEC_ID_H264)
3312 int ff_alloc_extradata(AVCodecParameters *par, int size)
3314 av_freep(&par->extradata);
3315 par->extradata_size = 0;
3317 if (size < 0 || size >= INT32_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
3318 return AVERROR(EINVAL);
3320 par->extradata = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
3321 if (!par->extradata)
3322 return AVERROR(ENOMEM);
3324 memset(par->extradata + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3325 par->extradata_size = size;
3330 int ff_get_extradata(AVFormatContext *s, AVCodecParameters *par, AVIOContext *pb, int size)
3332 int ret = ff_alloc_extradata(par, size);
3335 ret = avio_read(pb, par->extradata, size);
3337 av_freep(&par->extradata);
3338 par->extradata_size = 0;
3339 av_log(s, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
3340 return ret < 0 ? ret : AVERROR_INVALIDDATA;
3346 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
3349 int64_t last = st->internal->info->last_dts;
3351 if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
3352 && ts - (uint64_t)last < INT64_MAX) {
3353 double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
3354 int64_t duration = ts - last;
3356 if (!st->internal->info->duration_error)
3357 st->internal->info->duration_error = av_mallocz(sizeof(st->internal->info->duration_error[0])*2);
3358 if (!st->internal->info->duration_error)
3359 return AVERROR(ENOMEM);
3361 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3362 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
3363 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3364 if (st->internal->info->duration_error[0][1][i] < 1e10) {
3365 int framerate = get_std_framerate(i);
3366 double sdts = dts*framerate/(1001*12);
3367 for (j= 0; j<2; j++) {
3368 int64_t ticks = llrint(sdts+j*0.5);
3369 double error= sdts - ticks + j*0.5;
3370 st->internal->info->duration_error[j][0][i] += error;
3371 st->internal->info->duration_error[j][1][i] += error*error;
3375 if (st->internal->info->rfps_duration_sum <= INT64_MAX - duration) {
3376 st->internal->info->duration_count++;
3377 st->internal->info->rfps_duration_sum += duration;
3380 if (st->internal->info->duration_count % 10 == 0) {
3381 int n = st->internal->info->duration_count;
3382 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3383 if (st->internal->info->duration_error[0][1][i] < 1e10) {
3384 double a0 = st->internal->info->duration_error[0][0][i] / n;
3385 double error0 = st->internal->info->duration_error[0][1][i] / n - a0*a0;
3386 double a1 = st->internal->info->duration_error[1][0][i] / n;
3387 double error1 = st->internal->info->duration_error[1][1][i] / n - a1*a1;
3388 if (error0 > 0.04 && error1 > 0.04) {
3389 st->internal->info->duration_error[0][1][i] = 2e10;
3390 st->internal->info->duration_error[1][1][i] = 2e10;
3396 // ignore the first 4 values, they might have some random jitter
3397 if (st->internal->info->duration_count > 3 && is_relative(ts) == is_relative(last))
3398 st->internal->info->duration_gcd = av_gcd(st->internal->info->duration_gcd, duration);
3400 if (ts != AV_NOPTS_VALUE)
3401 st->internal->info->last_dts = ts;
3406 void ff_rfps_calculate(AVFormatContext *ic)
3410 for (i = 0; i < ic->nb_streams; i++) {
3411 AVStream *st = ic->streams[i];
3413 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
3415 // the check for tb_unreliable() is not completely correct, since this is not about handling
3416 // an unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3417 // ipmovie.c produces.
3418 if (tb_unreliable(st->internal->avctx) && st->internal->info->duration_count > 15 && st->internal->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
3419 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->internal->info->duration_gcd, INT_MAX);
3420 if (st->internal->info->duration_count>1 && !st->r_frame_rate.num
3421 && tb_unreliable(st->internal->avctx)) {
3423 double best_error= 0.01;
3424 AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
3426 for (j= 0; j<MAX_STD_TIMEBASES; j++) {
3429 if (st->internal->info->codec_info_duration &&
3430 st->internal->info->codec_info_duration*av_q2d(st->time_base) < (1001*11.5)/get_std_framerate(j))
3432 if (!st->internal->info->codec_info_duration && get_std_framerate(j) < 1001*12)
3435 if (av_q2d(st->time_base) * st->internal->info->rfps_duration_sum / st->internal->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
3438 for (k= 0; k<2; k++) {
3439 int n = st->internal->info->duration_count;
3440 double a= st->internal->info->duration_error[k][0][j] / n;
3441 double error= st->internal->info->duration_error[k][1][j]/n - a*a;
3443 if (error < best_error && best_error> 0.000000001) {
3445 num = get_std_framerate(j);
3448 av_log(ic, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
3451 // do not increase frame rate by more than 1 % in order to match a standard rate.
3452 if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
3453 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
3455 if ( !st->avg_frame_rate.num
3456 && st->r_frame_rate.num && st->internal->info->rfps_duration_sum
3457 && st->internal->info->codec_info_duration <= 0
3458 && st->internal->info->duration_count > 2
3459 && fabs(1.0 / (av_q2d(st->r_frame_rate) * av_q2d(st->time_base)) - st->internal->info->rfps_duration_sum / (double)st->internal->info->duration_count) <= 1.0
3461 av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
3462 st->avg_frame_rate = st->r_frame_rate;
3465 av_freep(&st->internal->info->duration_error);
3466 st->internal->info->last_dts = AV_NOPTS_VALUE;
3467 st->internal->info->duration_count = 0;
3468 st->internal->info->rfps_duration_sum = 0;
3472 static int extract_extradata_check(AVStream *st)
3474 const AVBitStreamFilter *f;
3476 f = av_bsf_get_by_name("extract_extradata");
3481 const enum AVCodecID *ids;
3482 for (ids = f->codec_ids; *ids != AV_CODEC_ID_NONE; ids++)
3483 if (*ids == st->codecpar->codec_id)
3490 static int extract_extradata_init(AVStream *st)
3492 AVStreamInternal *sti = st->internal;
3493 const AVBitStreamFilter *f;
3496 f = av_bsf_get_by_name("extract_extradata");
3500 /* check that the codec id is supported */
3501 ret = extract_extradata_check(st);
3505 sti->extract_extradata.pkt = av_packet_alloc();
3506 if (!sti->extract_extradata.pkt)
3507 return AVERROR(ENOMEM);
3509 ret = av_bsf_alloc(f, &sti->extract_extradata.bsf);
3513 ret = avcodec_parameters_copy(sti->extract_extradata.bsf->par_in,
3518 sti->extract_extradata.bsf->time_base_in = st->time_base;
3520 ret = av_bsf_init(sti->extract_extradata.bsf);
3525 sti->extract_extradata.inited = 1;
3529 av_bsf_free(&sti->extract_extradata.bsf);
3530 av_packet_free(&sti->extract_extradata.pkt);
3534 static int extract_extradata(AVStream *st, const AVPacket *pkt)
3536 AVStreamInternal *sti = st->internal;
3540 if (!sti->extract_extradata.inited) {
3541 ret = extract_extradata_init(st);
3546 if (sti->extract_extradata.inited && !sti->extract_extradata.bsf)
3549 pkt_ref = sti->extract_extradata.pkt;
3550 ret = av_packet_ref(pkt_ref, pkt);
3554 ret = av_bsf_send_packet(sti->extract_extradata.bsf, pkt_ref);
3556 av_packet_unref(pkt_ref);
3560 while (ret >= 0 && !sti->avctx->extradata) {
3561 ret = av_bsf_receive_packet(sti->extract_extradata.bsf, pkt_ref);
3563 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3568 for (int i = 0; i < pkt_ref->side_data_elems; i++) {
3569 AVPacketSideData *side_data = &pkt_ref->side_data[i];
3570 if (side_data->type == AV_PKT_DATA_NEW_EXTRADATA) {
3571 sti->avctx->extradata = side_data->data;
3572 sti->avctx->extradata_size = side_data->size;
3573 side_data->data = NULL;
3574 side_data->size = 0;
3578 av_packet_unref(pkt_ref);
3584 static int add_coded_side_data(AVStream *st, AVCodecContext *avctx)
3588 for (i = 0; i < avctx->nb_coded_side_data; i++) {
3589 const AVPacketSideData *sd_src = &avctx->coded_side_data[i];
3591 dst_data = av_stream_new_side_data(st, sd_src->type, sd_src->size);
3593 return AVERROR(ENOMEM);
3594 memcpy(dst_data, sd_src->data, sd_src->size);
3599 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3601 int i, count = 0, ret = 0, j;
3604 AVCodecContext *avctx;
3605 AVPacket *pkt1 = ic->internal->pkt;
3606 int64_t old_offset = avio_tell(ic->pb);
3607 // new streams might appear, no options for those
3608 int orig_nb_streams = ic->nb_streams;
3610 int64_t max_analyze_duration = ic->max_analyze_duration;
3611 int64_t max_stream_analyze_duration;
3612 int64_t max_subtitle_analyze_duration;
3613 int64_t probesize = ic->probesize;
3614 int eof_reached = 0;
3615 int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
3617 flush_codecs = probesize > 0;
3619 av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3621 max_stream_analyze_duration = max_analyze_duration;
3622 max_subtitle_analyze_duration = max_analyze_duration;
3623 if (!max_analyze_duration) {
3624 max_stream_analyze_duration =
3625 max_analyze_duration = 5*AV_TIME_BASE;
3626 max_subtitle_analyze_duration = 30*AV_TIME_BASE;
3627 if (!strcmp(ic->iformat->name, "flv"))
3628 max_stream_analyze_duration = 90*AV_TIME_BASE;
3629 if (!strcmp(ic->iformat->name, "mpeg") || !strcmp(ic->iformat->name, "mpegts"))
3630 max_stream_analyze_duration = 7*AV_TIME_BASE;
3634 av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d nb_streams:%d\n",
3635 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, ic->nb_streams);
3637 for (i = 0; i < ic->nb_streams; i++) {
3638 const AVCodec *codec;
3639 AVDictionary *thread_opt = NULL;
3640 st = ic->streams[i];
3641 avctx = st->internal->avctx;
3643 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3644 st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3645 /* if (!st->time_base.num)
3647 if (!avctx->time_base.num)
3648 avctx->time_base = st->time_base;
3651 /* check if the caller has overridden the codec id */
3652 #if FF_API_LAVF_AVCTX
3653 FF_DISABLE_DEPRECATION_WARNINGS
3654 if (st->codec->codec_id != st->internal->orig_codec_id) {
3655 st->codecpar->codec_id = st->codec->codec_id;
3656 st->codecpar->codec_type = st->codec->codec_type;
3657 st->internal->orig_codec_id = st->codec->codec_id;
3659 FF_ENABLE_DEPRECATION_WARNINGS
3661 // only for the split stuff
3662 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->internal->request_probe <= 0) {
3663 st->parser = av_parser_init(st->codecpar->codec_id);
3665 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3666 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3667 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3668 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3670 } else if (st->need_parsing) {
3671 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3672 "%s, packets or times may be invalid.\n",
3673 avcodec_get_name(st->codecpar->codec_id));
3677 if (st->codecpar->codec_id != st->internal->orig_codec_id)
3678 st->internal->orig_codec_id = st->codecpar->codec_id;
3680 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3682 goto find_stream_info_err;
3683 if (st->internal->request_probe <= 0)
3684 st->internal->avctx_inited = 1;
3686 codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3688 /* Force thread count to 1 since the H.264 decoder will not extract
3689 * SPS and PPS to extradata during multi-threaded decoding. */
3690 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3691 /* Force lowres to 0. The decoder might reduce the video size by the
3692 * lowres factor, and we don't want that propagated to the stream's
3694 av_dict_set(options ? &options[i] : &thread_opt, "lowres", "0", 0);
3696 if (ic->codec_whitelist)
3697 av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3699 /* Ensure that subtitle_header is properly set. */
3700 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE
3701 && codec && !avctx->codec) {
3702 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3703 av_log(ic, AV_LOG_WARNING,
3704 "Failed to open codec in %s\n",__FUNCTION__);
3707 // Try to just open decoders, in case this is enough to get parameters.
3708 if (!has_codec_parameters(st, NULL) && st->internal->request_probe <= 0) {
3709 if (codec && !avctx->codec)
3710 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3711 av_log(ic, AV_LOG_WARNING,
3712 "Failed to open codec in %s\n",__FUNCTION__);
3715 av_dict_free(&thread_opt);
3718 for (i = 0; i < ic->nb_streams; i++) {
3719 #if FF_API_R_FRAME_RATE
3720 ic->streams[i]->internal->info->last_dts = AV_NOPTS_VALUE;
3722 ic->streams[i]->internal->info->fps_first_dts = AV_NOPTS_VALUE;
3723 ic->streams[i]->internal->info->fps_last_dts = AV_NOPTS_VALUE;
3728 const AVPacket *pkt;
3729 int analyzed_all_streams;
3730 if (ff_check_interrupt(&ic->interrupt_callback)) {
3732 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3736 /* check if one codec still needs to be handled */
3737 for (i = 0; i < ic->nb_streams; i++) {
3738 int fps_analyze_framecount = 20;
3741 st = ic->streams[i];
3742 if (!has_codec_parameters(st, NULL))
3744 /* If the timebase is coarse (like the usual millisecond precision
3745 * of mkv), we need to analyze more frames to reliably arrive at
3746 * the correct fps. */
3747 if (av_q2d(st->time_base) > 0.0005)
3748 fps_analyze_framecount *= 2;
3749 if (!tb_unreliable(st->internal->avctx))
3750 fps_analyze_framecount = 0;
3751 if (ic->fps_probe_size >= 0)
3752 fps_analyze_framecount = ic->fps_probe_size;
3753 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3754 fps_analyze_framecount = 0;
3755 /* variable fps and no guess at the real fps */
3756 count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
3757 st->internal->info->codec_info_duration_fields/2 :
3758 st->internal->info->duration_count;
3759 if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3760 st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3761 if (count < fps_analyze_framecount)
3764 // Look at the first 3 frames if there is evidence of frame delay
3765 // but the decoder delay is not set.
3766 if (st->internal->info->frame_delay_evidence && count < 2 && st->internal->avctx->has_b_frames == 0)
3768 if (!st->internal->avctx->extradata &&
3769 (!st->internal->extract_extradata.inited ||
3770 st->internal->extract_extradata.bsf) &&
3771 extract_extradata_check(st))
3773 if (st->first_dts == AV_NOPTS_VALUE &&
3774 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3775 st->codec_info_nb_frames < ((st->disposition & AV_DISPOSITION_ATTACHED_PIC) ? 1 : ic->max_ts_probe) &&
3776 (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3777 st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))
3780 analyzed_all_streams = 0;
3781 if (!missing_streams || !*missing_streams)
3782 if (i == ic->nb_streams) {
3783 analyzed_all_streams = 1;
3784 /* NOTE: If the format has no header, then we need to read some
3785 * packets to get most of the streams, so we cannot stop here. */
3786 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3787 /* If we found the info for all the codecs, we can stop. */
3789 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3794 /* We did not get all the codec info, but we read too much data. */
3795 if (read_size >= probesize) {
3797 av_log(ic, AV_LOG_DEBUG,
3798 "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3799 for (i = 0; i < ic->nb_streams; i++)
3800 if (!ic->streams[i]->r_frame_rate.num &&
3801 ic->streams[i]->internal->info->duration_count <= 1 &&
3802 ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
3803 strcmp(ic->iformat->name, "image2"))
3804 av_log(ic, AV_LOG_WARNING,
3805 "Stream #%d: not enough frames to estimate rate; "
3806 "consider increasing probesize\n", i);
3810 /* NOTE: A new stream can be added there if no header in file
3811 * (AVFMTCTX_NOHEADER). */
3812 ret = read_frame_internal(ic, pkt1);
3813 if (ret == AVERROR(EAGAIN))
3822 if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
3823 ret = avpriv_packet_list_put(&ic->internal->packet_buffer,
3824 &ic->internal->packet_buffer_end,
3827 goto unref_then_goto_end;
3829 pkt = &ic->internal->packet_buffer_end->pkt;
3834 st = ic->streams[pkt->stream_index];
3835 if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3836 read_size += pkt->size;
3838 avctx = st->internal->avctx;
3839 if (!st->internal->avctx_inited) {
3840 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3842 goto unref_then_goto_end;
3843 st->internal->avctx_inited = 1;
3846 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3847 /* check for non-increasing dts */
3848 if (st->internal->info->fps_last_dts != AV_NOPTS_VALUE &&
3849 st->internal->info->fps_last_dts >= pkt->dts) {
3850 av_log(ic, AV_LOG_DEBUG,
3851 "Non-increasing DTS in stream %d: packet %d with DTS "
3852 "%"PRId64", packet %d with DTS %"PRId64"\n",
3853 st->index, st->internal->info->fps_last_dts_idx,
3854 st->internal->info->fps_last_dts, st->codec_info_nb_frames,
3856 st->internal->info->fps_first_dts =
3857 st->internal->info->fps_last_dts = AV_NOPTS_VALUE;
3859 /* Check for a discontinuity in dts. If the difference in dts
3860 * is more than 1000 times the average packet duration in the
3861 * sequence, we treat it as a discontinuity. */
3862 if (st->internal->info->fps_last_dts != AV_NOPTS_VALUE &&
3863 st->internal->info->fps_last_dts_idx > st->internal->info->fps_first_dts_idx &&
3864 (pkt->dts - (uint64_t)st->internal->info->fps_last_dts) / 1000 >
3865 (st->internal->info->fps_last_dts - (uint64_t)st->internal->info->fps_first_dts) /
3866 (st->internal->info->fps_last_dts_idx - st->internal->info->fps_first_dts_idx)) {
3867 av_log(ic, AV_LOG_WARNING,
3868 "DTS discontinuity in stream %d: packet %d with DTS "
3869 "%"PRId64", packet %d with DTS %"PRId64"\n",
3870 st->index, st->internal->info->fps_last_dts_idx,
3871 st->internal->info->fps_last_dts, st->codec_info_nb_frames,
3873 st->internal->info->fps_first_dts =
3874 st->internal->info->fps_last_dts = AV_NOPTS_VALUE;
3877 /* update stored dts values */
3878 if (st->internal->info->fps_first_dts == AV_NOPTS_VALUE) {
3879 st->internal->info->fps_first_dts = pkt->dts;
3880 st->internal->info->fps_first_dts_idx = st->codec_info_nb_frames;
3882 st->internal->info->fps_last_dts = pkt->dts;
3883 st->internal->info->fps_last_dts_idx = st->codec_info_nb_frames;
3885 if (st->codec_info_nb_frames>1) {
3889 if (st->time_base.den > 0)
3890 t = av_rescale_q(st->internal->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3891 if (st->avg_frame_rate.num > 0)
3892 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3895 && st->codec_info_nb_frames>30
3896 && st->internal->info->fps_first_dts != AV_NOPTS_VALUE
3897 && st->internal->info->fps_last_dts != AV_NOPTS_VALUE) {
3898 int64_t dur = av_sat_sub64(st->internal->info->fps_last_dts, st->internal->info->fps_first_dts);
3899 t = FFMAX(t, av_rescale_q(dur, st->time_base, AV_TIME_BASE_Q));
3902 if (analyzed_all_streams) limit = max_analyze_duration;
3903 else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) limit = max_subtitle_analyze_duration;
3904 else limit = max_stream_analyze_duration;
3907 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds st:%d\n",
3909 t, pkt->stream_index);
3910 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3911 av_packet_unref(pkt1);
3914 if (pkt->duration) {
3915 if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE && pkt->pts != AV_NOPTS_VALUE && st->start_time != AV_NOPTS_VALUE && pkt->pts >= st->start_time) {
3916 st->internal->info->codec_info_duration = FFMIN(pkt->pts - st->start_time, st->internal->info->codec_info_duration + pkt->duration);
3918 st->internal->info->codec_info_duration += pkt->duration;
3919 st->internal->info->codec_info_duration_fields += st->parser && st->need_parsing && avctx->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3922 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3923 #if FF_API_R_FRAME_RATE
3924 ff_rfps_add_frame(ic, st, pkt->dts);
3926 if (pkt->dts != pkt->pts && pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE)
3927 st->internal->info->frame_delay_evidence = 1;
3929 if (!st->internal->avctx->extradata) {
3930 ret = extract_extradata(st, pkt);
3932 goto unref_then_goto_end;
3935 /* If still no information, we try to open the codec and to
3936 * decompress the frame. We try to avoid that in most cases as
3937 * it takes longer and uses more memory. For MPEG-4, we need to
3938 * decompress for QuickTime.
3940 * If AV_CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3941 * least one frame of codec data, this makes sure the codec initializes
3942 * the channel configuration and does not only trust the values from
3944 try_decode_frame(ic, st, pkt,
3945 (options && i < orig_nb_streams) ? &options[i] : NULL);
3947 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3948 av_packet_unref(pkt1);
3950 st->codec_info_nb_frames++;
3956 for (stream_index = 0; stream_index < ic->nb_streams; stream_index++) {
3957 st = ic->streams[stream_index];
3958 avctx = st->internal->avctx;
3959 if (!has_codec_parameters(st, NULL)) {
3960 const AVCodec *codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3961 if (codec && !avctx->codec) {
3962 AVDictionary *opts = NULL;
3963 if (ic->codec_whitelist)
3964 av_dict_set(&opts, "codec_whitelist", ic->codec_whitelist, 0);
3965 if (avcodec_open2(avctx, codec, (options && stream_index < orig_nb_streams) ? &options[stream_index] : &opts) < 0)
3966 av_log(ic, AV_LOG_WARNING,
3967 "Failed to open codec in %s\n",__FUNCTION__);
3968 av_dict_free(&opts);
3972 // EOF already reached while reading the stream above.
3973 // So continue with reoordering DTS with whatever delay we have.
3974 if (ic->internal->packet_buffer && !has_decode_delay_been_guessed(st)) {
3975 update_dts_from_pts(ic, stream_index, ic->internal->packet_buffer);
3981 AVPacket *empty_pkt = ic->internal->pkt;
3983 av_packet_unref(empty_pkt);
3985 for (i = 0; i < ic->nb_streams; i++) {
3987 st = ic->streams[i];
3989 /* flush the decoders */
3990 if (st->internal->info->found_decoder == 1) {
3992 err = try_decode_frame(ic, st, empty_pkt,
3993 (options && i < orig_nb_streams)
3994 ? &options[i] : NULL);
3995 } while (err > 0 && !has_codec_parameters(st, NULL));
3998 av_log(ic, AV_LOG_INFO,
3999 "decoding for stream %d failed\n", st->index);
4005 ff_rfps_calculate(ic);
4007 for (i = 0; i < ic->nb_streams; i++) {
4008 st = ic->streams[i];
4009 avctx = st->internal->avctx;
4010 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
4011 if (avctx->codec_id == AV_CODEC_ID_RAWVIDEO && !avctx->codec_tag && !avctx->bits_per_coded_sample) {
4012 uint32_t tag= avcodec_pix_fmt_to_codec_tag(avctx->pix_fmt);
4013 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == avctx->pix_fmt)
4014 avctx->codec_tag= tag;
4017 /* estimate average framerate if not set by demuxer */
4018 if (st->internal->info->codec_info_duration_fields &&
4019 !st->avg_frame_rate.num &&
4020 st->internal->info->codec_info_duration) {
4022 double best_error = 0.01;
4023 AVRational codec_frame_rate = avctx->framerate;
4025 if (st->internal->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
4026 st->internal->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
4027 st->internal->info->codec_info_duration < 0)
4029 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
4030 st->internal->info->codec_info_duration_fields * (int64_t) st->time_base.den,
4031 st->internal->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
4033 /* Round guessed framerate to a "standard" framerate if it's
4034 * within 1% of the original estimate. */
4035 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
4036 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
4037 double error = fabs(av_q2d(st->avg_frame_rate) /
4038 av_q2d(std_fps) - 1);
4040 if (error < best_error) {
4042 best_fps = std_fps.num;
4045 if (ic->internal->prefer_codec_framerate && codec_frame_rate.num > 0 && codec_frame_rate.den > 0) {
4046 error = fabs(av_q2d(codec_frame_rate) /
4047 av_q2d(std_fps) - 1);
4048 if (error < best_error) {
4050 best_fps = std_fps.num;
4055 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
4056 best_fps, 12 * 1001, INT_MAX);
4059 if (!st->r_frame_rate.num) {
4060 if ( avctx->time_base.den * (int64_t) st->time_base.num
4061 <= avctx->time_base.num * avctx->ticks_per_frame * (uint64_t) st->time_base.den) {
4062 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den,
4063 avctx->time_base.den, (int64_t)avctx->time_base.num * avctx->ticks_per_frame, INT_MAX);
4065 st->r_frame_rate.num = st->time_base.den;
4066 st->r_frame_rate.den = st->time_base.num;
4069 if (st->internal->display_aspect_ratio.num && st->internal->display_aspect_ratio.den) {
4070 AVRational hw_ratio = { avctx->height, avctx->width };
4071 st->sample_aspect_ratio = av_mul_q(st->internal->display_aspect_ratio,
4074 } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
4075 if (!avctx->bits_per_coded_sample)
4076 avctx->bits_per_coded_sample =
4077 av_get_bits_per_sample(avctx->codec_id);
4078 // set stream disposition based on audio service type
4079 switch (avctx->audio_service_type) {
4080 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
4081 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
4083 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
4084 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
4086 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
4087 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
4089 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
4090 st->disposition = AV_DISPOSITION_COMMENT;
4092 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
4093 st->disposition = AV_DISPOSITION_KARAOKE;
4100 estimate_timings(ic, old_offset);
4102 av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
4104 if (ret >= 0 && ic->nb_streams)
4105 /* We could not have all the codec parameters before EOF. */
4107 for (i = 0; i < ic->nb_streams; i++) {
4109 st = ic->streams[i];
4111 /* if no packet was ever seen, update context now for has_codec_parameters */
4112 if (!st->internal->avctx_inited) {
4113 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
4114 st->codecpar->format == AV_SAMPLE_FMT_NONE)
4115 st->codecpar->format = st->internal->avctx->sample_fmt;
4116 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
4118 goto find_stream_info_err;
4120 if (!has_codec_parameters(st, &errmsg)) {
4122 avcodec_string(buf, sizeof(buf), st->internal->avctx, 0);
4123 av_log(ic, AV_LOG_WARNING,
4124 "Could not find codec parameters for stream %d (%s): %s\n"
4125 "Consider increasing the value for the 'analyzeduration' (%"PRId64") and 'probesize' (%"PRId64") options\n",
4126 i, buf, errmsg, ic->max_analyze_duration, ic->probesize);
4132 ret = compute_chapters_end(ic);
4134 goto find_stream_info_err;
4136 /* update the stream parameters from the internal codec contexts */
4137 for (i = 0; i < ic->nb_streams; i++) {
4138 st = ic->streams[i];
4140 if (st->internal->avctx_inited) {
4141 ret = avcodec_parameters_from_context(st->codecpar, st->internal->avctx);
4143 goto find_stream_info_err;
4144 ret = add_coded_side_data(st, st->internal->avctx);
4146 goto find_stream_info_err;
4149 #if FF_API_LAVF_AVCTX
4150 FF_DISABLE_DEPRECATION_WARNINGS
4151 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
4153 goto find_stream_info_err;
4155 // The old API (AVStream.codec) "requires" the resolution to be adjusted
4156 // by the lowres factor.
4157 if (st->internal->avctx->lowres && st->internal->avctx->width) {
4158 st->codec->lowres = st->internal->avctx->lowres;
4159 st->codec->width = st->internal->avctx->width;
4160 st->codec->height = st->internal->avctx->height;
4163 if (st->codec->codec_tag != MKTAG('t','m','c','d')) {
4164 st->codec->time_base = st->internal->avctx->time_base;
4165 st->codec->ticks_per_frame = st->internal->avctx->ticks_per_frame;
4167 st->codec->framerate = st->avg_frame_rate;
4169 if (st->internal->avctx->subtitle_header) {
4170 st->codec->subtitle_header = av_malloc(st->internal->avctx->subtitle_header_size);
4171 if (!st->codec->subtitle_header)
4172 goto find_stream_info_err;
4173 st->codec->subtitle_header_size = st->internal->avctx->subtitle_header_size;
4174 memcpy(st->codec->subtitle_header, st->internal->avctx->subtitle_header,
4175 st->codec->subtitle_header_size);
4178 // Fields unavailable in AVCodecParameters
4179 st->codec->coded_width = st->internal->avctx->coded_width;
4180 st->codec->coded_height = st->internal->avctx->coded_height;
4181 st->codec->properties = st->internal->avctx->properties;
4182 FF_ENABLE_DEPRECATION_WARNINGS
4185 st->internal->avctx_inited = 0;
4188 find_stream_info_err:
4189 for (i = 0; i < ic->nb_streams; i++) {
4190 st = ic->streams[i];
4191 if (st->internal->info)
4192 av_freep(&st->internal->info->duration_error);
4193 avcodec_close(ic->streams[i]->internal->avctx);
4194 av_freep(&ic->streams[i]->internal->info);
4195 av_bsf_free(&ic->streams[i]->internal->extract_extradata.bsf);
4196 av_packet_free(&ic->streams[i]->internal->extract_extradata.pkt);
4199 av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
4200 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
4203 unref_then_goto_end:
4204 av_packet_unref(pkt1);
4205 goto find_stream_info_err;
4208 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
4212 for (i = 0; i < ic->nb_programs; i++) {
4213 if (ic->programs[i] == last) {
4217 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
4218 if (ic->programs[i]->stream_index[j] == s)
4219 return ic->programs[i];
4225 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
4226 int wanted_stream_nb, int related_stream,
4227 AVCodec **decoder_ret, int flags)
4229 int i, nb_streams = ic->nb_streams;
4230 int ret = AVERROR_STREAM_NOT_FOUND;
4231 int best_count = -1, best_multiframe = -1, best_disposition = -1;
4232 int count, multiframe, disposition;
4233 int64_t best_bitrate = -1;
4235 unsigned *program = NULL;
4236 const AVCodec *decoder = NULL, *best_decoder = NULL;
4238 if (related_stream >= 0 && wanted_stream_nb < 0) {
4239 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
4241 program = p->stream_index;
4242 nb_streams = p->nb_stream_indexes;
4245 for (i = 0; i < nb_streams; i++) {
4246 int real_stream_index = program ? program[i] : i;
4247 AVStream *st = ic->streams[real_stream_index];
4248 AVCodecParameters *par = st->codecpar;
4249 if (par->codec_type != type)
4251 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
4253 if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate))
4256 decoder = find_decoder(ic, st, par->codec_id);
4259 ret = AVERROR_DECODER_NOT_FOUND;
4263 disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED))
4264 + !! (st->disposition & AV_DISPOSITION_DEFAULT);
4265 count = st->codec_info_nb_frames;
4266 bitrate = par->bit_rate;
4267 multiframe = FFMIN(5, count);
4268 if ((best_disposition > disposition) ||
4269 (best_disposition == disposition && best_multiframe > multiframe) ||
4270 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate > bitrate) ||
4271 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
4273 best_disposition = disposition;
4275 best_bitrate = bitrate;
4276 best_multiframe = multiframe;
4277 ret = real_stream_index;
4278 best_decoder = decoder;
4279 if (program && i == nb_streams - 1 && ret < 0) {
4281 nb_streams = ic->nb_streams;
4282 /* no related stream found, try again with everything */
4287 *decoder_ret = (AVCodec*)best_decoder;
4291 /*******************************************************/
4293 int av_read_play(AVFormatContext *s)
4295 if (s->iformat->read_play)
4296 return s->iformat->read_play(s);
4298 return avio_pause(s->pb, 0);
4299 return AVERROR(ENOSYS);
4302 int av_read_pause(AVFormatContext *s)
4304 if (s->iformat->read_pause)
4305 return s->iformat->read_pause(s);
4307 return avio_pause(s->pb, 1);
4308 return AVERROR(ENOSYS);
4311 int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src)
4316 dst->time_base = src->time_base;
4317 dst->nb_frames = src->nb_frames;
4318 dst->disposition = src->disposition;
4319 dst->sample_aspect_ratio = src->sample_aspect_ratio;
4320 dst->avg_frame_rate = src->avg_frame_rate;
4321 dst->r_frame_rate = src->r_frame_rate;
4323 av_dict_free(&dst->metadata);
4324 ret = av_dict_copy(&dst->metadata, src->metadata, 0);
4328 ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
4332 /* Free existing side data*/
4333 for (i = 0; i < dst->nb_side_data; i++)
4334 av_free(dst->side_data[i].data);
4335 av_freep(&dst->side_data);
4336 dst->nb_side_data = 0;
4338 /* Copy side data if present */
4339 if (src->nb_side_data) {
4340 dst->side_data = av_mallocz_array(src->nb_side_data,
4341 sizeof(AVPacketSideData));
4342 if (!dst->side_data)
4343 return AVERROR(ENOMEM);
4344 dst->nb_side_data = src->nb_side_data;
4346 for (i = 0; i < src->nb_side_data; i++) {
4347 uint8_t *data = av_memdup(src->side_data[i].data,
4348 src->side_data[i].size);
4350 return AVERROR(ENOMEM);
4351 dst->side_data[i].type = src->side_data[i].type;
4352 dst->side_data[i].size = src->side_data[i].size;
4353 dst->side_data[i].data = data;
4357 #if FF_API_LAVF_FFSERVER
4358 FF_DISABLE_DEPRECATION_WARNINGS
4359 av_freep(&dst->recommended_encoder_configuration);
4360 if (src->recommended_encoder_configuration) {
4361 const char *conf_str = src->recommended_encoder_configuration;
4362 dst->recommended_encoder_configuration = av_strdup(conf_str);
4363 if (!dst->recommended_encoder_configuration)
4364 return AVERROR(ENOMEM);
4366 FF_ENABLE_DEPRECATION_WARNINGS
4372 static void free_stream(AVStream **pst)
4374 AVStream *st = *pst;
4380 for (i = 0; i < st->nb_side_data; i++)
4381 av_freep(&st->side_data[i].data);
4382 av_freep(&st->side_data);
4385 av_parser_close(st->parser);
4387 if (st->attached_pic.data)
4388 av_packet_unref(&st->attached_pic);
4391 avcodec_free_context(&st->internal->avctx);
4392 av_bsf_free(&st->internal->bsfc);
4393 av_freep(&st->internal->priv_pts);
4394 av_freep(&st->internal->index_entries);
4395 av_freep(&st->internal->probe_data.buf);
4397 av_bsf_free(&st->internal->extract_extradata.bsf);
4398 av_packet_free(&st->internal->extract_extradata.pkt);
4400 if (st->internal->info)
4401 av_freep(&st->internal->info->duration_error);
4402 av_freep(&st->internal->info);
4404 av_freep(&st->internal);
4406 av_dict_free(&st->metadata);
4407 avcodec_parameters_free(&st->codecpar);
4408 #if FF_API_LAVF_AVCTX
4409 FF_DISABLE_DEPRECATION_WARNINGS
4410 avcodec_free_context(&st->codec);
4411 FF_ENABLE_DEPRECATION_WARNINGS
4413 av_freep(&st->priv_data);
4414 #if FF_API_LAVF_FFSERVER
4415 FF_DISABLE_DEPRECATION_WARNINGS
4416 av_freep(&st->recommended_encoder_configuration);
4417 FF_ENABLE_DEPRECATION_WARNINGS
4423 void ff_free_stream(AVFormatContext *s, AVStream *st)
4425 av_assert0(s->nb_streams>0);
4426 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
4428 free_stream(&s->streams[ --s->nb_streams ]);
4431 void avformat_free_context(AVFormatContext *s)
4438 if (s->oformat && s->oformat->deinit && s->internal->initialized)
4439 s->oformat->deinit(s);
4442 if (s->iformat && s->iformat->priv_class && s->priv_data)
4443 av_opt_free(s->priv_data);
4444 if (s->oformat && s->oformat->priv_class && s->priv_data)
4445 av_opt_free(s->priv_data);
4447 for (i = 0; i < s->nb_streams; i++)
4448 free_stream(&s->streams[i]);
4451 for (i = 0; i < s->nb_programs; i++) {
4452 av_dict_free(&s->programs[i]->metadata);
4453 av_freep(&s->programs[i]->stream_index);
4454 av_freep(&s->programs[i]);
4458 av_freep(&s->programs);
4459 av_freep(&s->priv_data);
4460 while (s->nb_chapters--) {
4461 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
4462 av_freep(&s->chapters[s->nb_chapters]);
4464 av_freep(&s->chapters);
4465 av_dict_free(&s->metadata);
4466 av_dict_free(&s->internal->id3v2_meta);
4467 av_packet_free(&s->internal->pkt);
4468 av_packet_free(&s->internal->parse_pkt);
4469 av_freep(&s->streams);
4470 flush_packet_queue(s);
4471 av_freep(&s->internal);
4476 void avformat_close_input(AVFormatContext **ps)
4487 if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
4488 (s->flags & AVFMT_FLAG_CUSTOM_IO))
4491 flush_packet_queue(s);
4494 if (s->iformat->read_close)
4495 s->iformat->read_close(s);
4497 avformat_free_context(s);
4504 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
4510 if (s->nb_streams >= FFMIN(s->max_streams, INT_MAX/sizeof(*streams))) {
4511 if (s->max_streams < INT_MAX/sizeof(*streams))
4512 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);
4515 streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
4518 s->streams = streams;
4520 st = av_mallocz(sizeof(AVStream));
4524 #if FF_API_LAVF_AVCTX
4525 FF_DISABLE_DEPRECATION_WARNINGS
4526 st->codec = avcodec_alloc_context3(c);
4531 FF_ENABLE_DEPRECATION_WARNINGS
4534 st->internal = av_mallocz(sizeof(*st->internal));
4538 st->internal->info = av_mallocz(sizeof(*st->internal->info));
4539 if (!st->internal->info)
4541 st->internal->info->last_dts = AV_NOPTS_VALUE;
4543 st->codecpar = avcodec_parameters_alloc();
4547 st->internal->avctx = avcodec_alloc_context3(NULL);
4548 if (!st->internal->avctx)
4552 #if FF_API_LAVF_AVCTX
4553 FF_DISABLE_DEPRECATION_WARNINGS
4554 /* no default bitrate if decoding */
4555 st->codec->bit_rate = 0;
4556 FF_ENABLE_DEPRECATION_WARNINGS
4559 /* default pts setting is MPEG-like */
4560 avpriv_set_pts_info(st, 33, 1, 90000);
4561 /* we set the current DTS to 0 so that formats without any timestamps
4562 * but durations get some timestamps, formats with some unknown
4563 * timestamps have their first few packets buffered and the
4564 * timestamps corrected before they are returned to the user */
4565 st->cur_dts = RELATIVE_TS_BASE;
4567 st->cur_dts = AV_NOPTS_VALUE;
4570 st->index = s->nb_streams;
4571 st->start_time = AV_NOPTS_VALUE;
4572 st->duration = AV_NOPTS_VALUE;
4573 st->first_dts = AV_NOPTS_VALUE;
4574 st->probe_packets = s->max_probe_packets;
4575 st->internal->pts_wrap_reference = AV_NOPTS_VALUE;
4576 st->internal->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4578 st->last_IP_pts = AV_NOPTS_VALUE;
4579 st->internal->last_dts_for_order_check = AV_NOPTS_VALUE;
4580 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
4581 st->internal->pts_buffer[i] = AV_NOPTS_VALUE;
4583 st->sample_aspect_ratio = (AVRational) { 0, 1 };
4585 #if FF_API_R_FRAME_RATE
4586 st->internal->info->last_dts = AV_NOPTS_VALUE;
4588 st->internal->info->fps_first_dts = AV_NOPTS_VALUE;
4589 st->internal->info->fps_last_dts = AV_NOPTS_VALUE;
4591 st->internal->inject_global_side_data = s->internal->inject_global_side_data;
4593 st->internal->need_context_update = 1;
4595 s->streams[s->nb_streams++] = st;
4602 AVProgram *av_new_program(AVFormatContext *ac, int id)
4604 AVProgram *program = NULL;
4607 av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
4609 for (i = 0; i < ac->nb_programs; i++)
4610 if (ac->programs[i]->id == id)
4611 program = ac->programs[i];
4614 program = av_mallocz(sizeof(AVProgram));
4617 dynarray_add(&ac->programs, &ac->nb_programs, program);
4618 program->discard = AVDISCARD_NONE;
4619 program->pmt_version = -1;
4621 program->pts_wrap_reference = AV_NOPTS_VALUE;
4622 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4623 program->start_time =
4624 program->end_time = AV_NOPTS_VALUE;
4629 #if FF_API_CHAPTER_ID_INT
4630 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
4632 AVChapter *avpriv_new_chapter(AVFormatContext *s, int64_t id, AVRational time_base,
4634 int64_t start, int64_t end, const char *title)
4636 AVChapter *chapter = NULL;
4639 if (end != AV_NOPTS_VALUE && start > end) {
4640 av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
4644 if (!s->nb_chapters) {
4645 s->internal->chapter_ids_monotonic = 1;
4646 } else if (!s->internal->chapter_ids_monotonic || s->chapters[s->nb_chapters-1]->id >= id) {
4647 s->internal->chapter_ids_monotonic = 0;
4648 for (i = 0; i < s->nb_chapters; i++)
4649 if (s->chapters[i]->id == id)
4650 chapter = s->chapters[i];
4654 chapter = av_mallocz(sizeof(AVChapter));
4657 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
4659 av_dict_set(&chapter->metadata, "title", title, 0);
4661 chapter->time_base = time_base;
4662 chapter->start = start;
4668 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
4671 AVProgram *program = NULL;
4674 if (idx >= ac->nb_streams) {
4675 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
4679 for (i = 0; i < ac->nb_programs; i++) {
4680 if (ac->programs[i]->id != progid)
4682 program = ac->programs[i];
4683 for (j = 0; j < program->nb_stream_indexes; j++)
4684 if (program->stream_index[j] == idx)
4687 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
4690 program->stream_index = tmp;
4691 program->stream_index[program->nb_stream_indexes++] = idx;
4696 uint64_t ff_ntp_time(void)
4698 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
4701 uint64_t ff_get_formatted_ntp_time(uint64_t ntp_time_us)
4703 uint64_t ntp_ts, frac_part, sec;
4706 //current ntp time in seconds and micro seconds
4707 sec = ntp_time_us / 1000000;
4708 usec = ntp_time_us % 1000000;
4710 //encoding in ntp timestamp format
4711 frac_part = usec * 0xFFFFFFFFULL;
4712 frac_part /= 1000000;
4714 if (sec > 0xFFFFFFFFULL)
4715 av_log(NULL, AV_LOG_WARNING, "NTP time format roll over detected\n");
4718 ntp_ts |= frac_part;
4723 int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags)
4726 char *q, buf1[20], c;
4727 int nd, len, percentd_found;
4739 while (av_isdigit(*p)) {
4740 if (nd >= INT_MAX / 10 - 255)
4742 nd = nd * 10 + *p++ - '0';
4745 } while (av_isdigit(c));
4751 if (!(flags & AV_FRAME_FILENAME_FLAGS_MULTIPLE) && percentd_found)
4756 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
4758 if ((q - buf + len) > buf_size - 1)
4760 memcpy(q, buf1, len);
4768 if ((q - buf) < buf_size - 1)
4772 if (!percentd_found)
4781 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
4783 return av_get_frame_filename2(buf, buf_size, path, number, 0);
4786 void av_url_split(char *proto, int proto_size,
4787 char *authorization, int authorization_size,
4788 char *hostname, int hostname_size,
4789 int *port_ptr, char *path, int path_size, const char *url)
4791 const char *p, *ls, *at, *at2, *col, *brk;
4797 if (authorization_size > 0)
4798 authorization[0] = 0;
4799 if (hostname_size > 0)
4804 /* parse protocol */
4805 if ((p = strchr(url, ':'))) {
4806 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4813 /* no protocol means plain filename */
4814 av_strlcpy(path, url, path_size);
4818 /* separate path from hostname */
4819 ls = p + strcspn(p, "/?#");
4820 av_strlcpy(path, ls, path_size);
4822 /* the rest is hostname, use that to parse auth/port */
4824 /* authorization (user[:pass]@hostname) */
4826 while ((at = strchr(p, '@')) && at < ls) {
4827 av_strlcpy(authorization, at2,
4828 FFMIN(authorization_size, at + 1 - at2));
4829 p = at + 1; /* skip '@' */
4832 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4834 av_strlcpy(hostname, p + 1,
4835 FFMIN(hostname_size, brk - p));
4836 if (brk[1] == ':' && port_ptr)
4837 *port_ptr = atoi(brk + 2);
4838 } else if ((col = strchr(p, ':')) && col < ls) {
4839 av_strlcpy(hostname, p,
4840 FFMIN(col + 1 - p, hostname_size));
4842 *port_ptr = atoi(col + 1);
4844 av_strlcpy(hostname, p,
4845 FFMIN(ls + 1 - p, hostname_size));
4849 int ff_mkdir_p(const char *path)
4852 char *temp = av_strdup(path);
4856 if (!path || !temp) {
4860 if (!av_strncasecmp(temp, "/", 1) || !av_strncasecmp(temp, "\\", 1)) {
4862 } else if (!av_strncasecmp(temp, "./", 2) || !av_strncasecmp(temp, ".\\", 2)) {
4866 for ( ; *pos != '\0'; ++pos) {
4867 if (*pos == '/' || *pos == '\\') {
4870 ret = mkdir(temp, 0755);
4875 if ((*(pos - 1) != '/') || (*(pos - 1) != '\\')) {
4876 ret = mkdir(temp, 0755);
4883 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4886 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4889 'C', 'D', 'E', 'F' };
4890 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4893 'c', 'd', 'e', 'f' };
4894 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4896 for (i = 0; i < s; i++) {
4897 buff[i * 2] = hex_table[src[i] >> 4];
4898 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4904 int ff_hex_to_data(uint8_t *data, const char *p)
4911 p += strspn(p, SPACE_CHARS);
4914 c = av_toupper((unsigned char) *p++);
4915 if (c >= '0' && c <= '9')
4917 else if (c >= 'A' && c <= 'F')
4932 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4933 unsigned int pts_num, unsigned int pts_den)
4936 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
4937 if (new_tb.num != pts_num)
4938 av_log(NULL, AV_LOG_DEBUG,
4939 "st:%d removing common factor %d from timebase\n",
4940 s->index, pts_num / new_tb.num);
4942 av_log(NULL, AV_LOG_WARNING,
4943 "st:%d has too large timebase, reducing\n", s->index);
4945 if (new_tb.num <= 0 || new_tb.den <= 0) {
4946 av_log(NULL, AV_LOG_ERROR,
4947 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4948 new_tb.num, new_tb.den,
4952 s->time_base = new_tb;
4953 #if FF_API_LAVF_AVCTX
4954 FF_DISABLE_DEPRECATION_WARNINGS
4955 s->codec->pkt_timebase = new_tb;
4956 FF_ENABLE_DEPRECATION_WARNINGS
4958 s->internal->avctx->pkt_timebase = new_tb;
4959 s->pts_wrap_bits = pts_wrap_bits;
4962 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4965 const char *ptr = str;
4967 /* Parse key=value pairs. */
4970 char *dest = NULL, *dest_end;
4971 int key_len, dest_len = 0;
4973 /* Skip whitespace and potential commas. */
4974 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4981 if (!(ptr = strchr(key, '=')))
4984 key_len = ptr - key;
4986 callback_get_buf(context, key, key_len, &dest, &dest_len);
4987 dest_end = dest + dest_len - 1;
4991 while (*ptr && *ptr != '\"') {
4995 if (dest && dest < dest_end)
4999 if (dest && dest < dest_end)
5007 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
5008 if (dest && dest < dest_end)
5016 int ff_find_stream_index(AVFormatContext *s, int id)
5019 for (i = 0; i < s->nb_streams; i++)
5020 if (s->streams[i]->id == id)
5025 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
5029 unsigned int codec_tag;
5030 if (ofmt->query_codec)
5031 return ofmt->query_codec(codec_id, std_compliance);
5032 else if (ofmt->codec_tag)
5033 return !!av_codec_get_tag2(ofmt->codec_tag, codec_id, &codec_tag);
5034 else if (codec_id == ofmt->video_codec ||
5035 codec_id == ofmt->audio_codec ||
5036 codec_id == ofmt->subtitle_codec ||
5037 codec_id == ofmt->data_codec)
5040 return AVERROR_PATCHWELCOME;
5043 int avformat_network_init(void)
5047 if ((ret = ff_network_init()) < 0)
5049 if ((ret = ff_tls_init()) < 0)
5055 int avformat_network_deinit(void)
5064 int ff_add_param_change(AVPacket *pkt, int32_t channels,
5065 uint64_t channel_layout, int32_t sample_rate,
5066 int32_t width, int32_t height)
5072 return AVERROR(EINVAL);
5075 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
5077 if (channel_layout) {
5079 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
5083 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
5085 if (width || height) {
5087 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
5089 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
5091 return AVERROR(ENOMEM);
5092 bytestream_put_le32(&data, flags);
5094 bytestream_put_le32(&data, channels);
5096 bytestream_put_le64(&data, channel_layout);
5098 bytestream_put_le32(&data, sample_rate);
5099 if (width || height) {
5100 bytestream_put_le32(&data, width);
5101 bytestream_put_le32(&data, height);
5106 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
5108 AVRational undef = {0, 1};
5109 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
5110 AVRational codec_sample_aspect_ratio = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
5111 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
5113 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
5114 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
5115 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
5116 stream_sample_aspect_ratio = undef;
5118 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
5119 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
5120 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
5121 frame_sample_aspect_ratio = undef;
5123 if (stream_sample_aspect_ratio.num)
5124 return stream_sample_aspect_ratio;
5126 return frame_sample_aspect_ratio;
5129 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
5131 AVRational fr = st->r_frame_rate;
5132 AVRational codec_fr = st->internal->avctx->framerate;
5133 AVRational avg_fr = st->avg_frame_rate;
5135 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
5136 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
5141 if (st->internal->avctx->ticks_per_frame > 1) {
5142 if ( codec_fr.num > 0 && codec_fr.den > 0 &&
5143 (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))
5151 * Matches a stream specifier (but ignores requested index).
5153 * @param indexptr set to point to the requested stream index if there is one
5155 * @return <0 on error
5156 * 0 if st is NOT a matching stream
5157 * >0 if st is a matching stream
5159 static int match_stream_specifier(AVFormatContext *s, AVStream *st,
5160 const char *spec, const char **indexptr, AVProgram **p)
5162 int match = 1; /* Stores if the specifier matches so far. */
5164 if (*spec <= '9' && *spec >= '0') { /* opt:index */
5168 } else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
5169 *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
5170 enum AVMediaType type;
5174 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
5175 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
5176 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
5177 case 'd': type = AVMEDIA_TYPE_DATA; break;
5178 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
5179 case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
5180 default: av_assert0(0);
5182 if (*spec && *spec++ != ':') /* If we are not at the end, then another specifier must follow. */
5183 return AVERROR(EINVAL);
5185 #if FF_API_LAVF_AVCTX
5186 FF_DISABLE_DEPRECATION_WARNINGS
5187 if (type != st->codecpar->codec_type
5188 && (st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN || st->codec->codec_type != type))
5190 FF_ENABLE_DEPRECATION_WARNINGS
5192 if (type != st->codecpar->codec_type)
5195 if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
5197 } else if (*spec == 'p' && *(spec + 1) == ':') {
5202 prog_id = strtol(spec, &endptr, 0);
5203 /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
5204 if (spec == endptr || (*endptr && *endptr++ != ':'))
5205 return AVERROR(EINVAL);
5208 for (i = 0; i < s->nb_programs; i++) {
5209 if (s->programs[i]->id != prog_id)
5212 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++) {
5213 if (st->index == s->programs[i]->stream_index[j]) {
5216 *p = s->programs[i];
5225 } else if (*spec == '#' ||
5226 (*spec == 'i' && *(spec + 1) == ':')) {
5229 spec += 1 + (*spec == 'i');
5230 stream_id = strtol(spec, &endptr, 0);
5231 if (spec == endptr || *endptr) /* Disallow empty id and make sure we are at the end. */
5232 return AVERROR(EINVAL);
5233 return match && (stream_id == st->id);
5234 } else if (*spec == 'm' && *(spec + 1) == ':') {
5235 AVDictionaryEntry *tag;
5241 val = strchr(spec, ':');
5243 key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
5245 return AVERROR(ENOMEM);
5247 tag = av_dict_get(st->metadata, key, NULL, 0);
5249 if (!val || !strcmp(tag->value, val + 1))
5258 return match && ret;
5259 } else if (*spec == 'u' && *(spec + 1) == '\0') {
5260 AVCodecParameters *par = st->codecpar;
5261 #if FF_API_LAVF_AVCTX
5262 FF_DISABLE_DEPRECATION_WARNINGS
5263 AVCodecContext *codec = st->codec;
5264 FF_ENABLE_DEPRECATION_WARNINGS
5267 switch (par->codec_type) {
5268 case AVMEDIA_TYPE_AUDIO:
5269 val = par->sample_rate && par->channels;
5270 #if FF_API_LAVF_AVCTX
5271 val = val || (codec->sample_rate && codec->channels);
5273 if (par->format == AV_SAMPLE_FMT_NONE
5274 #if FF_API_LAVF_AVCTX
5275 && codec->sample_fmt == AV_SAMPLE_FMT_NONE
5280 case AVMEDIA_TYPE_VIDEO:
5281 val = par->width && par->height;
5282 #if FF_API_LAVF_AVCTX
5283 val = val || (codec->width && codec->height);
5285 if (par->format == AV_PIX_FMT_NONE
5286 #if FF_API_LAVF_AVCTX
5287 && codec->pix_fmt == AV_PIX_FMT_NONE
5292 case AVMEDIA_TYPE_UNKNOWN:
5299 #if FF_API_LAVF_AVCTX
5300 return match && ((par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0);
5302 return match && (par->codec_id != AV_CODEC_ID_NONE && val != 0);
5305 return AVERROR(EINVAL);
5313 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
5318 const char *indexptr = NULL;
5319 AVProgram *p = NULL;
5322 ret = match_stream_specifier(s, st, spec, &indexptr, &p);
5329 index = strtol(indexptr, &endptr, 0);
5330 if (*endptr) { /* We can't have anything after the requested index. */
5331 ret = AVERROR(EINVAL);
5335 /* This is not really needed but saves us a loop for simple stream index specifiers. */
5336 if (spec == indexptr)
5337 return (index == st->index);
5339 /* If we requested a matching stream index, we have to ensure st is that. */
5340 nb_streams = p ? p->nb_stream_indexes : s->nb_streams;
5341 for (int i = 0; i < nb_streams && index >= 0; i++) {
5342 AVStream *candidate = p ? s->streams[p->stream_index[i]] : s->streams[i];
5343 ret = match_stream_specifier(s, candidate, spec, NULL, NULL);
5346 if (ret > 0 && index-- == 0 && st == candidate)
5352 if (ret == AVERROR(EINVAL))
5353 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
5357 int ff_generate_avci_extradata(AVStream *st)
5359 static const uint8_t avci100_1080p_extradata[] = {
5361 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5362 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5363 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5364 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
5365 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
5366 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
5367 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
5368 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
5369 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5371 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5374 static const uint8_t avci100_1080i_extradata[] = {
5376 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5377 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5378 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5379 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
5380 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
5381 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
5382 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
5383 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
5384 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
5385 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
5386 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
5388 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5391 static const uint8_t avci50_1080p_extradata[] = {
5393 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5394 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5395 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5396 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5397 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5398 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
5399 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
5400 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
5401 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
5403 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5406 static const uint8_t avci50_1080i_extradata[] = {
5408 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5409 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5410 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5411 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
5412 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
5413 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
5414 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
5415 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
5416 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
5417 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
5418 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
5420 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5423 static const uint8_t avci100_720p_extradata[] = {
5425 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5426 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
5427 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
5428 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
5429 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
5430 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
5431 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
5432 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
5433 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
5434 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
5436 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
5439 static const uint8_t avci50_720p_extradata[] = {
5441 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
5442 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5443 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5444 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5445 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5446 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
5447 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
5448 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
5449 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
5451 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5455 const uint8_t *data = NULL;
5458 if (st->codecpar->width == 1920) {
5459 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5460 data = avci100_1080p_extradata;
5461 size = sizeof(avci100_1080p_extradata);
5463 data = avci100_1080i_extradata;
5464 size = sizeof(avci100_1080i_extradata);
5466 } else if (st->codecpar->width == 1440) {
5467 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5468 data = avci50_1080p_extradata;
5469 size = sizeof(avci50_1080p_extradata);
5471 data = avci50_1080i_extradata;
5472 size = sizeof(avci50_1080i_extradata);
5474 } else if (st->codecpar->width == 1280) {
5475 data = avci100_720p_extradata;
5476 size = sizeof(avci100_720p_extradata);
5477 } else if (st->codecpar->width == 960) {
5478 data = avci50_720p_extradata;
5479 size = sizeof(avci50_720p_extradata);
5485 if ((ret = ff_alloc_extradata(st->codecpar, size)) < 0)
5487 memcpy(st->codecpar->extradata, data, size);
5492 uint8_t *av_stream_get_side_data(const AVStream *st,
5493 enum AVPacketSideDataType type, buffer_size_t *size)
5497 for (i = 0; i < st->nb_side_data; i++) {
5498 if (st->side_data[i].type == type) {
5500 *size = st->side_data[i].size;
5501 return st->side_data[i].data;
5509 int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
5510 uint8_t *data, size_t size)
5512 AVPacketSideData *sd, *tmp;
5515 for (i = 0; i < st->nb_side_data; i++) {
5516 sd = &st->side_data[i];
5518 if (sd->type == type) {
5519 av_freep(&sd->data);
5526 if ((unsigned)st->nb_side_data + 1 >= INT_MAX / sizeof(*st->side_data))
5527 return AVERROR(ERANGE);
5529 tmp = av_realloc(st->side_data, (st->nb_side_data + 1) * sizeof(*tmp));
5531 return AVERROR(ENOMEM);
5534 st->side_data = tmp;
5537 sd = &st->side_data[st->nb_side_data - 1];
5545 uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
5549 uint8_t *data = av_malloc(size);
5554 ret = av_stream_add_side_data(st, type, data, size);
5563 int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
5566 const AVBitStreamFilter *bsf;
5569 av_assert0(!st->internal->bsfc);
5571 if (!(bsf = av_bsf_get_by_name(name))) {
5572 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter '%s'\n", name);
5573 return AVERROR_BSF_NOT_FOUND;
5576 if ((ret = av_bsf_alloc(bsf, &bsfc)) < 0)
5579 bsfc->time_base_in = st->time_base;
5580 if ((ret = avcodec_parameters_copy(bsfc->par_in, st->codecpar)) < 0) {
5585 if (args && bsfc->filter->priv_class) {
5586 const AVOption *opt = av_opt_next(bsfc->priv_data, NULL);
5587 const char * shorthand[2] = {NULL};
5590 shorthand[0] = opt->name;
5592 if ((ret = av_opt_set_from_string(bsfc->priv_data, args, shorthand, "=", ":")) < 0) {
5598 if ((ret = av_bsf_init(bsfc)) < 0) {
5603 st->internal->bsfc = bsfc;
5605 av_log(NULL, AV_LOG_VERBOSE,
5606 "Automatically inserted bitstream filter '%s'; args='%s'\n",
5607 name, args ? args : "");
5612 FF_DISABLE_DEPRECATION_WARNINGS
5613 int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt,
5614 AVBitStreamFilterContext *bsfc)
5618 AVPacket new_pkt = *pkt;
5619 int a = av_bitstream_filter_filter(bsfc, codec, NULL,
5620 &new_pkt.data, &new_pkt.size,
5621 pkt->data, pkt->size,
5622 pkt->flags & AV_PKT_FLAG_KEY);
5623 if (a == 0 && new_pkt.size == 0 && new_pkt.side_data_elems == 0) {
5624 av_packet_unref(pkt);
5625 memset(pkt, 0, sizeof(*pkt));
5628 if(a == 0 && new_pkt.data != pkt->data) {
5629 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
5631 memcpy(t, new_pkt.data, new_pkt.size);
5632 memset(t + new_pkt.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
5637 a = AVERROR(ENOMEM);
5641 new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
5642 av_buffer_default_free, NULL, 0);
5644 pkt->side_data = NULL;
5645 pkt->side_data_elems = 0;
5646 av_packet_unref(pkt);
5648 av_freep(&new_pkt.data);
5649 a = AVERROR(ENOMEM);
5653 av_log(codec, AV_LOG_ERROR,
5654 "Failed to open bitstream filter %s for stream %d with codec %s",
5655 bsfc->filter->name, pkt->stream_index,
5656 codec->codec ? codec->codec->name : "copy");
5666 FF_ENABLE_DEPRECATION_WARNINGS
5669 int ff_format_output_open(AVFormatContext *s, const char *url, AVDictionary **options)
5672 return AVERROR(EINVAL);
5674 if (!(s->oformat->flags & AVFMT_NOFILE))
5675 return s->io_open(s, &s->pb, url, AVIO_FLAG_WRITE, options);
5679 void ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
5682 s->io_close(s, *pb);
5686 int ff_is_http_proto(char *filename) {
5687 const char *proto = avio_find_protocol_name(filename);
5688 return proto ? (!av_strcasecmp(proto, "http") || !av_strcasecmp(proto, "https")) : 0;
5691 int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
5693 AVDictionaryEntry *entry;
5694 int64_t parsed_timestamp;
5696 if ((entry = av_dict_get(s->metadata, "creation_time", NULL, 0))) {
5697 if ((ret = av_parse_time(&parsed_timestamp, entry->value, 0)) >= 0) {
5698 *timestamp = return_seconds ? parsed_timestamp / 1000000 : parsed_timestamp;
5701 av_log(s, AV_LOG_WARNING, "Failed to parse creation_time %s\n", entry->value);
5708 int ff_standardize_creation_time(AVFormatContext *s)
5711 int ret = ff_parse_creation_time_metadata(s, ×tamp, 0);
5713 return avpriv_dict_set_timestamp(&s->metadata, "creation_time", timestamp);
5717 int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette)
5722 side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &size);
5724 if (size != AVPALETTE_SIZE) {
5725 av_log(s, AV_LOG_ERROR, "Invalid palette side data\n");
5726 return AVERROR_INVALIDDATA;
5728 memcpy(palette, side_data, AVPALETTE_SIZE);
5732 if (ret == CONTAINS_PAL) {
5734 for (i = 0; i < AVPALETTE_COUNT; i++)
5735 palette[i] = AV_RL32(pkt->data + pkt->size - AVPALETTE_SIZE + i*4);
5742 int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf)
5747 ret = av_bprint_finalize(buf, &str);
5750 if (!av_bprint_is_complete(buf)) {
5752 return AVERROR(ENOMEM);
5755 par->extradata = str;
5756 /* Note: the string is NUL terminated (so extradata can be read as a
5757 * string), but the ending character is not accounted in the size (in
5758 * binary formats you are likely not supposed to mux that character). When
5759 * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE
5761 par->extradata_size = buf->len;
5765 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
5766 AVStream *ost, const AVStream *ist,
5767 enum AVTimebaseSource copy_tb)
5769 //TODO: use [io]st->internal->avctx
5770 const AVCodecContext *dec_ctx;
5771 AVCodecContext *enc_ctx;
5773 #if FF_API_LAVF_AVCTX
5774 FF_DISABLE_DEPRECATION_WARNINGS
5775 dec_ctx = ist->codec;
5776 enc_ctx = ost->codec;
5777 FF_ENABLE_DEPRECATION_WARNINGS
5779 dec_ctx = ist->internal->avctx;
5780 enc_ctx = ost->internal->avctx;
5783 enc_ctx->time_base = ist->time_base;
5785 * Avi is a special case here because it supports variable fps but
5786 * having the fps and timebase differe significantly adds quite some
5789 if (!strcmp(ofmt->name, "avi")) {
5790 #if FF_API_R_FRAME_RATE
5791 if (copy_tb == AVFMT_TBCF_AUTO && ist->r_frame_rate.num
5792 && av_q2d(ist->r_frame_rate) >= av_q2d(ist->avg_frame_rate)
5793 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(ist->time_base)
5794 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx->time_base)
5795 && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx->time_base) < 1.0/500
5796 || copy_tb == AVFMT_TBCF_R_FRAMERATE) {
5797 enc_ctx->time_base.num = ist->r_frame_rate.den;
5798 enc_ctx->time_base.den = 2*ist->r_frame_rate.num;
5799 enc_ctx->ticks_per_frame = 2;
5802 if (copy_tb == AVFMT_TBCF_AUTO && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > 2*av_q2d(ist->time_base)
5803 && av_q2d(ist->time_base) < 1.0/500
5804 || copy_tb == AVFMT_TBCF_DECODER) {
5805 enc_ctx->time_base = dec_ctx->time_base;
5806 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5807 enc_ctx->time_base.den *= 2;
5808 enc_ctx->ticks_per_frame = 2;
5810 } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS)
5811 && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
5812 if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx->time_base.den
5813 && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > av_q2d(ist->time_base)
5814 && av_q2d(ist->time_base) < 1.0/500
5815 || copy_tb == AVFMT_TBCF_DECODER) {
5816 enc_ctx->time_base = dec_ctx->time_base;
5817 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5821 if ((enc_ctx->codec_tag == AV_RL32("tmcd") || ost->codecpar->codec_tag == AV_RL32("tmcd"))
5822 && dec_ctx->time_base.num < dec_ctx->time_base.den
5823 && dec_ctx->time_base.num > 0
5824 && 121LL*dec_ctx->time_base.num > dec_ctx->time_base.den) {
5825 enc_ctx->time_base = dec_ctx->time_base;
5828 if (ost->avg_frame_rate.num)
5829 enc_ctx->time_base = av_inv_q(ost->avg_frame_rate);
5831 av_reduce(&enc_ctx->time_base.num, &enc_ctx->time_base.den,
5832 enc_ctx->time_base.num, enc_ctx->time_base.den, INT_MAX);
5837 AVRational av_stream_get_codec_timebase(const AVStream *st)
5839 // See avformat_transfer_internal_stream_timing_info() TODO.
5840 #if FF_API_LAVF_AVCTX
5841 FF_DISABLE_DEPRECATION_WARNINGS
5842 return st->codec->time_base;
5843 FF_ENABLE_DEPRECATION_WARNINGS
5845 return st->internal->avctx->time_base;
5849 void ff_format_set_url(AVFormatContext *s, char *url)
5854 #if FF_API_FORMAT_FILENAME
5855 FF_DISABLE_DEPRECATION_WARNINGS
5856 av_strlcpy(s->filename, url, sizeof(s->filename));
5857 FF_ENABLE_DEPRECATION_WARNINGS