2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 #include "libavutil/avassert.h"
28 #include "libavutil/avstring.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/internal.h"
31 #include "libavutil/mathematics.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/parseutils.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/time.h"
36 #include "libavutil/time_internal.h"
37 #include "libavutil/timestamp.h"
39 #include "libavcodec/bytestream.h"
40 #include "libavcodec/internal.h"
41 #include "libavcodec/raw.h"
43 #include "audiointerleave.h"
45 #include "avio_internal.h"
55 #include "libavutil/ffversion.h"
56 const char av_format_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
60 * various utility functions for use within FFmpeg
63 unsigned avformat_version(void)
65 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
66 return LIBAVFORMAT_VERSION_INT;
69 const char *avformat_configuration(void)
71 return FFMPEG_CONFIGURATION;
74 const char *avformat_license(void)
76 #define LICENSE_PREFIX "libavformat license: "
77 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
80 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
82 static int is_relative(int64_t ts) {
83 return ts > (RELATIVE_TS_BASE - (1LL<<48));
87 * Wrap a given time stamp, if there is an indication for an overflow
90 * @param timestamp the time stamp to wrap
91 * @return resulting time stamp
93 static int64_t wrap_timestamp(const AVStream *st, int64_t timestamp)
95 if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&
96 st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
97 if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
98 timestamp < st->pts_wrap_reference)
99 return timestamp + (1ULL << st->pts_wrap_bits);
100 else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
101 timestamp >= st->pts_wrap_reference)
102 return timestamp - (1ULL << st->pts_wrap_bits);
107 MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
108 MAKE_ACCESSORS(AVStream, stream, char *, recommended_encoder_configuration)
109 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, video_codec)
110 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, audio_codec)
111 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
112 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, data_codec)
113 MAKE_ACCESSORS(AVFormatContext, format, int, metadata_header_padding)
114 MAKE_ACCESSORS(AVFormatContext, format, void *, opaque)
115 MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb)
116 #if FF_API_OLD_OPEN_CALLBACKS
117 FF_DISABLE_DEPRECATION_WARNINGS
118 MAKE_ACCESSORS(AVFormatContext, format, AVOpenCallback, open_cb)
119 FF_ENABLE_DEPRECATION_WARNINGS
122 int64_t av_stream_get_end_pts(const AVStream *st)
125 return st->priv_pts->val;
127 return AV_NOPTS_VALUE;
130 struct AVCodecParserContext *av_stream_get_parser(const AVStream *st)
135 void av_format_inject_global_side_data(AVFormatContext *s)
138 s->internal->inject_global_side_data = 1;
139 for (i = 0; i < s->nb_streams; i++) {
140 AVStream *st = s->streams[i];
141 st->inject_global_side_data = 1;
145 int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
147 av_assert0(!dst->codec_whitelist &&
148 !dst->format_whitelist &&
149 !dst->protocol_whitelist &&
150 !dst->protocol_blacklist);
151 dst-> codec_whitelist = av_strdup(src->codec_whitelist);
152 dst->format_whitelist = av_strdup(src->format_whitelist);
153 dst->protocol_whitelist = av_strdup(src->protocol_whitelist);
154 dst->protocol_blacklist = av_strdup(src->protocol_blacklist);
155 if ( (src-> codec_whitelist && !dst-> codec_whitelist)
156 || (src-> format_whitelist && !dst-> format_whitelist)
157 || (src->protocol_whitelist && !dst->protocol_whitelist)
158 || (src->protocol_blacklist && !dst->protocol_blacklist)) {
159 av_log(dst, AV_LOG_ERROR, "Failed to duplicate black/whitelist\n");
160 return AVERROR(ENOMEM);
165 static const AVCodec *find_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
167 #if FF_API_LAVF_AVCTX
168 FF_DISABLE_DEPRECATION_WARNINGS
169 if (st->codec->codec)
170 return st->codec->codec;
171 FF_ENABLE_DEPRECATION_WARNINGS
174 switch (st->codecpar->codec_type) {
175 case AVMEDIA_TYPE_VIDEO:
176 if (s->video_codec) return s->video_codec;
178 case AVMEDIA_TYPE_AUDIO:
179 if (s->audio_codec) return s->audio_codec;
181 case AVMEDIA_TYPE_SUBTITLE:
182 if (s->subtitle_codec) return s->subtitle_codec;
186 return avcodec_find_decoder(codec_id);
189 static const AVCodec *find_probe_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
191 const AVCodec *codec;
193 #if CONFIG_H264_DECODER
194 /* Other parts of the code assume this decoder to be used for h264,
195 * so force it if possible. */
196 if (codec_id == AV_CODEC_ID_H264)
197 return avcodec_find_decoder_by_name("h264");
200 codec = find_decoder(s, st, codec_id);
204 if (codec->capabilities & AV_CODEC_CAP_AVOID_PROBING) {
205 const AVCodec *probe_codec = NULL;
206 while (probe_codec = av_codec_next(probe_codec)) {
207 if (probe_codec->id == codec_id &&
208 av_codec_is_decoder(probe_codec) &&
209 !(probe_codec->capabilities & (AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_EXPERIMENTAL))) {
218 int av_format_get_probe_score(const AVFormatContext *s)
220 return s->probe_score;
223 /* an arbitrarily chosen "sane" max packet size -- 50M */
224 #define SANE_CHUNK_SIZE (50000000)
226 int ffio_limit(AVIOContext *s, int size)
228 if (s->maxsize>= 0) {
229 int64_t remaining= s->maxsize - avio_tell(s);
230 if (remaining < size) {
231 int64_t newsize = avio_size(s);
232 if (!s->maxsize || s->maxsize<newsize)
233 s->maxsize = newsize - !newsize;
234 remaining= s->maxsize - avio_tell(s);
235 remaining= FFMAX(remaining, 0);
238 if (s->maxsize>= 0 && remaining+1 < size) {
239 av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
246 /* Read the data in sane-sized chunks and append to pkt.
247 * Return the number of bytes read or an error. */
248 static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
250 int64_t orig_pos = pkt->pos; // av_grow_packet might reset pos
251 int orig_size = pkt->size;
255 int prev_size = pkt->size;
258 /* When the caller requests a lot of data, limit it to the amount
259 * left in file or SANE_CHUNK_SIZE when it is not known. */
261 if (read_size > SANE_CHUNK_SIZE/10) {
262 read_size = ffio_limit(s, read_size);
263 // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
265 read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
268 ret = av_grow_packet(pkt, read_size);
272 ret = avio_read(s, pkt->data + prev_size, read_size);
273 if (ret != read_size) {
274 av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
281 pkt->flags |= AV_PKT_FLAG_CORRUPT;
285 av_packet_unref(pkt);
286 return pkt->size > orig_size ? pkt->size - orig_size : ret;
289 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
294 pkt->pos = avio_tell(s);
296 return append_packet_chunked(s, pkt, size);
299 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
302 return av_get_packet(s, pkt, size);
303 return append_packet_chunked(s, pkt, size);
306 int av_filename_number_test(const char *filename)
310 (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0);
313 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
316 static const struct {
319 enum AVMediaType type;
321 { "aac", AV_CODEC_ID_AAC, AVMEDIA_TYPE_AUDIO },
322 { "ac3", AV_CODEC_ID_AC3, AVMEDIA_TYPE_AUDIO },
323 { "dts", AV_CODEC_ID_DTS, AVMEDIA_TYPE_AUDIO },
324 { "dvbsub", AV_CODEC_ID_DVB_SUBTITLE,AVMEDIA_TYPE_SUBTITLE },
325 { "dvbtxt", AV_CODEC_ID_DVB_TELETEXT,AVMEDIA_TYPE_SUBTITLE },
326 { "eac3", AV_CODEC_ID_EAC3, AVMEDIA_TYPE_AUDIO },
327 { "h264", AV_CODEC_ID_H264, AVMEDIA_TYPE_VIDEO },
328 { "hevc", AV_CODEC_ID_HEVC, AVMEDIA_TYPE_VIDEO },
329 { "loas", AV_CODEC_ID_AAC_LATM, AVMEDIA_TYPE_AUDIO },
330 { "m4v", AV_CODEC_ID_MPEG4, AVMEDIA_TYPE_VIDEO },
331 { "mp3", AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO },
332 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
333 { "truehd", AV_CODEC_ID_TRUEHD, AVMEDIA_TYPE_AUDIO },
337 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
341 av_log(s, AV_LOG_DEBUG,
342 "Probe with size=%d, packets=%d detected %s with score=%d\n",
343 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets,
345 for (i = 0; fmt_id_type[i].name; i++) {
346 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
347 if (fmt_id_type[i].type != AVMEDIA_TYPE_AUDIO &&
348 st->codecpar->sample_rate)
350 if (st->request_probe > score &&
351 st->codecpar->codec_id != fmt_id_type[i].id)
353 st->codecpar->codec_id = fmt_id_type[i].id;
354 st->codecpar->codec_type = fmt_id_type[i].type;
355 st->internal->need_context_update = 1;
356 #if FF_API_LAVF_AVCTX
357 FF_DISABLE_DEPRECATION_WARNINGS
358 st->codec->codec_type = st->codecpar->codec_type;
359 st->codec->codec_id = st->codecpar->codec_id;
360 FF_ENABLE_DEPRECATION_WARNINGS
369 /************************************************************/
370 /* input media file */
372 int av_demuxer_open(AVFormatContext *ic) {
375 if (ic->format_whitelist && av_match_list(ic->iformat->name, ic->format_whitelist, ',') <= 0) {
376 av_log(ic, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", ic->format_whitelist);
377 return AVERROR(EINVAL);
380 if (ic->iformat->read_header) {
381 err = ic->iformat->read_header(ic);
386 if (ic->pb && !ic->internal->data_offset)
387 ic->internal->data_offset = avio_tell(ic->pb);
392 /* Open input file and probe the format if necessary. */
393 static int init_input(AVFormatContext *s, const char *filename,
394 AVDictionary **options)
397 AVProbeData pd = { filename, NULL, 0 };
398 int score = AVPROBE_SCORE_RETRY;
401 s->flags |= AVFMT_FLAG_CUSTOM_IO;
403 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
404 s, 0, s->format_probesize);
405 else if (s->iformat->flags & AVFMT_NOFILE)
406 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
407 "will be ignored with AVFMT_NOFILE format.\n");
411 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
412 (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
415 if ((ret = s->io_open(s, &s->pb, filename, AVIO_FLAG_READ | s->avio_flags, options)) < 0)
420 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
421 s, 0, s->format_probesize);
424 static int add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
425 AVPacketList **plast_pktl, int ref)
427 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
431 return AVERROR(ENOMEM);
434 if ((ret = av_packet_ref(&pktl->pkt, pkt)) < 0) {
443 (*plast_pktl)->next = pktl;
445 *packet_buffer = pktl;
447 /* Add the packet in the buffered packet list. */
452 int avformat_queue_attached_pictures(AVFormatContext *s)
455 for (i = 0; i < s->nb_streams; i++)
456 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
457 s->streams[i]->discard < AVDISCARD_ALL) {
458 if (s->streams[i]->attached_pic.size <= 0) {
459 av_log(s, AV_LOG_WARNING,
460 "Attached picture on stream %d has invalid size, "
465 ret = add_to_pktbuf(&s->internal->raw_packet_buffer,
466 &s->streams[i]->attached_pic,
467 &s->internal->raw_packet_buffer_end, 1);
474 static int update_stream_avctx(AVFormatContext *s)
477 for (i = 0; i < s->nb_streams; i++) {
478 AVStream *st = s->streams[i];
480 if (!st->internal->need_context_update)
483 /* close parser, because it depends on the codec */
484 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
485 av_parser_close(st->parser);
489 /* update internal codec context, for the parser */
490 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
494 #if FF_API_LAVF_AVCTX
495 FF_DISABLE_DEPRECATION_WARNINGS
496 /* update deprecated public codec context */
497 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
500 FF_ENABLE_DEPRECATION_WARNINGS
503 st->internal->need_context_update = 0;
509 int avformat_open_input(AVFormatContext **ps, const char *filename,
510 AVInputFormat *fmt, AVDictionary **options)
512 AVFormatContext *s = *ps;
514 AVDictionary *tmp = NULL;
515 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
517 if (!s && !(s = avformat_alloc_context()))
518 return AVERROR(ENOMEM);
520 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
521 return AVERROR(EINVAL);
527 av_dict_copy(&tmp, *options, 0);
529 if (s->pb) // must be before any goto fail
530 s->flags |= AVFMT_FLAG_CUSTOM_IO;
532 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
535 if ((ret = init_input(s, filename, &tmp)) < 0)
537 s->probe_score = ret;
539 if (!s->protocol_whitelist && s->pb && s->pb->protocol_whitelist) {
540 s->protocol_whitelist = av_strdup(s->pb->protocol_whitelist);
541 if (!s->protocol_whitelist) {
542 ret = AVERROR(ENOMEM);
547 if (!s->protocol_blacklist && s->pb && s->pb->protocol_blacklist) {
548 s->protocol_blacklist = av_strdup(s->pb->protocol_blacklist);
549 if (!s->protocol_blacklist) {
550 ret = AVERROR(ENOMEM);
555 if (s->format_whitelist && av_match_list(s->iformat->name, s->format_whitelist, ',') <= 0) {
556 av_log(s, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", s->format_whitelist);
557 ret = AVERROR(EINVAL);
561 avio_skip(s->pb, s->skip_initial_bytes);
563 /* Check filename in case an image number is expected. */
564 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
565 if (!av_filename_number_test(filename)) {
566 ret = AVERROR(EINVAL);
571 s->duration = s->start_time = AV_NOPTS_VALUE;
572 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
574 /* Allocate private data. */
575 if (s->iformat->priv_data_size > 0) {
576 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
577 ret = AVERROR(ENOMEM);
580 if (s->iformat->priv_class) {
581 *(const AVClass **) s->priv_data = s->iformat->priv_class;
582 av_opt_set_defaults(s->priv_data);
583 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
588 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
590 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, 0);
592 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
593 if ((ret = s->iformat->read_header(s)) < 0)
596 if (id3v2_extra_meta) {
597 if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
598 !strcmp(s->iformat->name, "tta")) {
599 if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
602 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
604 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
606 if ((ret = avformat_queue_attached_pictures(s)) < 0)
609 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
610 s->internal->data_offset = avio_tell(s->pb);
612 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
614 update_stream_avctx(s);
616 for (i = 0; i < s->nb_streams; i++)
617 s->streams[i]->internal->orig_codec_id = s->streams[i]->codecpar->codec_id;
620 av_dict_free(options);
627 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
629 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
631 avformat_free_context(s);
636 /*******************************************************/
638 static void force_codec_ids(AVFormatContext *s, AVStream *st)
640 switch (st->codecpar->codec_type) {
641 case AVMEDIA_TYPE_VIDEO:
642 if (s->video_codec_id)
643 st->codecpar->codec_id = s->video_codec_id;
645 case AVMEDIA_TYPE_AUDIO:
646 if (s->audio_codec_id)
647 st->codecpar->codec_id = s->audio_codec_id;
649 case AVMEDIA_TYPE_SUBTITLE:
650 if (s->subtitle_codec_id)
651 st->codecpar->codec_id = s->subtitle_codec_id;
653 case AVMEDIA_TYPE_DATA:
654 if (s->data_codec_id)
655 st->codecpar->codec_id = s->data_codec_id;
660 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
662 if (st->request_probe>0) {
663 AVProbeData *pd = &st->probe_data;
665 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
669 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
671 av_log(s, AV_LOG_WARNING,
672 "Failed to reallocate probe buffer for stream %d\n",
677 memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
678 pd->buf_size += pkt->size;
679 memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
682 st->probe_packets = 0;
684 av_log(s, AV_LOG_WARNING,
685 "nothing to probe for stream %d\n", st->index);
689 end= s->internal->raw_packet_buffer_remaining_size <= 0
690 || st->probe_packets<= 0;
692 if (end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
693 int score = set_codec_from_probe_data(s, st, pd);
694 if ( (st->codecpar->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
698 st->request_probe = -1;
699 if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
700 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
702 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
704 force_codec_ids(s, st);
710 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
712 int64_t ref = pkt->dts;
713 int i, pts_wrap_behavior;
714 int64_t pts_wrap_reference;
715 AVProgram *first_program;
717 if (ref == AV_NOPTS_VALUE)
719 if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
721 ref &= (1LL << st->pts_wrap_bits)-1;
723 // reference time stamp should be 60 s before first time stamp
724 pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
725 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
726 pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
727 (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
728 AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
730 first_program = av_find_program_from_stream(s, NULL, stream_index);
732 if (!first_program) {
733 int default_stream_index = av_find_default_stream_index(s);
734 if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
735 for (i = 0; i < s->nb_streams; i++) {
736 if (av_find_program_from_stream(s, NULL, i))
738 s->streams[i]->pts_wrap_reference = pts_wrap_reference;
739 s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
743 st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
744 st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
748 AVProgram *program = first_program;
750 if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
751 pts_wrap_reference = program->pts_wrap_reference;
752 pts_wrap_behavior = program->pts_wrap_behavior;
755 program = av_find_program_from_stream(s, program, stream_index);
758 // update every program with differing pts_wrap_reference
759 program = first_program;
761 if (program->pts_wrap_reference != pts_wrap_reference) {
762 for (i = 0; i<program->nb_stream_indexes; i++) {
763 s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
764 s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
767 program->pts_wrap_reference = pts_wrap_reference;
768 program->pts_wrap_behavior = pts_wrap_behavior;
770 program = av_find_program_from_stream(s, program, stream_index);
776 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
782 AVPacketList *pktl = s->internal->raw_packet_buffer;
786 st = s->streams[pkt->stream_index];
787 if (s->internal->raw_packet_buffer_remaining_size <= 0)
788 if ((err = probe_codec(s, st, NULL)) < 0)
790 if (st->request_probe <= 0) {
791 s->internal->raw_packet_buffer = pktl->next;
792 s->internal->raw_packet_buffer_remaining_size += pkt->size;
801 ret = s->iformat->read_packet(s, pkt);
803 /* Some demuxers return FFERROR_REDO when they consume
804 data and discard it (ignored streams, junk, extradata).
805 We must re-call the demuxer to get the real packet. */
806 if (ret == FFERROR_REDO)
808 if (!pktl || ret == AVERROR(EAGAIN))
810 for (i = 0; i < s->nb_streams; i++) {
812 if (st->probe_packets || st->request_probe > 0)
813 if ((err = probe_codec(s, st, NULL)) < 0)
815 av_assert0(st->request_probe <= 0);
821 AVPacket tmp = { 0 };
822 ret = av_packet_ref(&tmp, pkt);
828 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
829 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
830 av_log(s, AV_LOG_WARNING,
831 "Dropped corrupted packet (stream = %d)\n",
833 av_packet_unref(pkt);
837 if (pkt->stream_index >= (unsigned)s->nb_streams) {
838 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
842 st = s->streams[pkt->stream_index];
844 if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
845 // correct first time stamps to negative values
846 if (!is_relative(st->first_dts))
847 st->first_dts = wrap_timestamp(st, st->first_dts);
848 if (!is_relative(st->start_time))
849 st->start_time = wrap_timestamp(st, st->start_time);
850 if (!is_relative(st->cur_dts))
851 st->cur_dts = wrap_timestamp(st, st->cur_dts);
854 pkt->dts = wrap_timestamp(st, pkt->dts);
855 pkt->pts = wrap_timestamp(st, pkt->pts);
857 force_codec_ids(s, st);
859 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
860 if (s->use_wallclock_as_timestamps)
861 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
863 if (!pktl && st->request_probe <= 0)
866 err = add_to_pktbuf(&s->internal->raw_packet_buffer, pkt,
867 &s->internal->raw_packet_buffer_end, 0);
870 s->internal->raw_packet_buffer_remaining_size -= pkt->size;
872 if ((err = probe_codec(s, st, pkt)) < 0)
878 /**********************************************************/
880 static int determinable_frame_size(AVCodecContext *avctx)
882 if (/*avctx->codec_id == AV_CODEC_ID_AAC ||*/
883 avctx->codec_id == AV_CODEC_ID_MP1 ||
884 avctx->codec_id == AV_CODEC_ID_MP2 ||
885 avctx->codec_id == AV_CODEC_ID_MP3/* ||
886 avctx->codec_id == AV_CODEC_ID_CELT*/)
892 * Return the frame duration in seconds. Return 0 if not available.
894 void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
895 AVCodecParserContext *pc, AVPacket *pkt)
897 AVRational codec_framerate = s->iformat ? st->internal->avctx->framerate :
898 av_mul_q(av_inv_q(st->internal->avctx->time_base), (AVRational){1, st->internal->avctx->ticks_per_frame});
899 int frame_size, sample_rate;
901 #if FF_API_LAVF_AVCTX
902 FF_DISABLE_DEPRECATION_WARNINGS
903 if ((!codec_framerate.den || !codec_framerate.num) && st->codec->time_base.den && st->codec->time_base.num)
904 codec_framerate = av_mul_q(av_inv_q(st->codec->time_base), (AVRational){1, st->codec->ticks_per_frame});
905 FF_ENABLE_DEPRECATION_WARNINGS
910 switch (st->codecpar->codec_type) {
911 case AVMEDIA_TYPE_VIDEO:
912 if (st->r_frame_rate.num && !pc && s->iformat) {
913 *pnum = st->r_frame_rate.den;
914 *pden = st->r_frame_rate.num;
915 } else if (st->time_base.num * 1000LL > st->time_base.den) {
916 *pnum = st->time_base.num;
917 *pden = st->time_base.den;
918 } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
919 av_assert0(st->internal->avctx->ticks_per_frame);
920 av_reduce(pnum, pden,
922 codec_framerate.num * (int64_t)st->internal->avctx->ticks_per_frame,
925 if (pc && pc->repeat_pict) {
926 av_assert0(s->iformat); // this may be wrong for interlaced encoding but its not used for that case
927 av_reduce(pnum, pden,
928 (*pnum) * (1LL + pc->repeat_pict),
932 /* If this codec can be interlaced or progressive then we need
933 * a parser to compute duration of a packet. Thus if we have
934 * no parser in such case leave duration undefined. */
935 if (st->internal->avctx->ticks_per_frame > 1 && !pc)
939 case AVMEDIA_TYPE_AUDIO:
940 if (st->internal->avctx_inited) {
941 frame_size = av_get_audio_frame_duration(st->internal->avctx, pkt->size);
942 sample_rate = st->internal->avctx->sample_rate;
944 frame_size = av_get_audio_frame_duration2(st->codecpar, pkt->size);
945 sample_rate = st->codecpar->sample_rate;
947 if (frame_size <= 0 || sample_rate <= 0)
957 static int is_intra_only(enum AVCodecID id)
959 const AVCodecDescriptor *d = avcodec_descriptor_get(id);
962 if (d->type == AVMEDIA_TYPE_VIDEO && !(d->props & AV_CODEC_PROP_INTRA_ONLY))
967 static int has_decode_delay_been_guessed(AVStream *st)
969 if (st->codecpar->codec_id != AV_CODEC_ID_H264) return 1;
970 if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
972 #if CONFIG_H264_DECODER
973 if (st->internal->avctx->has_b_frames &&
974 avpriv_h264_has_num_reorder_frames(st->internal->avctx) == st->internal->avctx->has_b_frames)
977 if (st->internal->avctx->has_b_frames<3)
978 return st->nb_decoded_frames >= 7;
979 else if (st->internal->avctx->has_b_frames<4)
980 return st->nb_decoded_frames >= 18;
982 return st->nb_decoded_frames >= 20;
985 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
989 if (pktl == s->internal->packet_buffer_end)
990 return s->internal->parse_queue;
994 static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
995 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
996 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
999 int delay = st->internal->avctx->has_b_frames;
1002 if (dts == AV_NOPTS_VALUE) {
1003 int64_t best_score = INT64_MAX;
1004 for (i = 0; i<delay; i++) {
1005 if (st->pts_reorder_error_count[i]) {
1006 int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
1007 if (score < best_score) {
1009 dts = pts_buffer[i];
1014 for (i = 0; i<delay; i++) {
1015 if (pts_buffer[i] != AV_NOPTS_VALUE) {
1016 int64_t diff = FFABS(pts_buffer[i] - dts)
1017 + (uint64_t)st->pts_reorder_error[i];
1018 diff = FFMAX(diff, st->pts_reorder_error[i]);
1019 st->pts_reorder_error[i] = diff;
1020 st->pts_reorder_error_count[i]++;
1021 if (st->pts_reorder_error_count[i] > 250) {
1022 st->pts_reorder_error[i] >>= 1;
1023 st->pts_reorder_error_count[i] >>= 1;
1030 if (dts == AV_NOPTS_VALUE)
1031 dts = pts_buffer[0];
1037 * Updates the dts of packets of a stream in pkt_buffer, by re-ordering the pts
1038 * of the packets in a window.
1040 static void update_dts_from_pts(AVFormatContext *s, int stream_index,
1041 AVPacketList *pkt_buffer)
1043 AVStream *st = s->streams[stream_index];
1044 int delay = st->internal->avctx->has_b_frames;
1047 int64_t pts_buffer[MAX_REORDER_DELAY+1];
1049 for (i = 0; i<MAX_REORDER_DELAY+1; i++)
1050 pts_buffer[i] = AV_NOPTS_VALUE;
1052 for (; pkt_buffer; pkt_buffer = get_next_pkt(s, st, pkt_buffer)) {
1053 if (pkt_buffer->pkt.stream_index != stream_index)
1056 if (pkt_buffer->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1057 pts_buffer[0] = pkt_buffer->pkt.pts;
1058 for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
1059 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
1061 pkt_buffer->pkt.dts = select_from_pts_buffer(st, pts_buffer, pkt_buffer->pkt.dts);
1066 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
1067 int64_t dts, int64_t pts, AVPacket *pkt)
1069 AVStream *st = s->streams[stream_index];
1070 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1071 AVPacketList *pktl_it;
1075 if (st->first_dts != AV_NOPTS_VALUE ||
1076 dts == AV_NOPTS_VALUE ||
1077 st->cur_dts == AV_NOPTS_VALUE ||
1081 st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
1083 shift = (uint64_t)st->first_dts - RELATIVE_TS_BASE;
1085 if (is_relative(pts))
1088 for (pktl_it = pktl; pktl_it; pktl_it = get_next_pkt(s, st, pktl_it)) {
1089 if (pktl_it->pkt.stream_index != stream_index)
1091 if (is_relative(pktl_it->pkt.pts))
1092 pktl_it->pkt.pts += shift;
1094 if (is_relative(pktl_it->pkt.dts))
1095 pktl_it->pkt.dts += shift;
1097 if (st->start_time == AV_NOPTS_VALUE && pktl_it->pkt.pts != AV_NOPTS_VALUE) {
1098 st->start_time = pktl_it->pkt.pts;
1099 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1100 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1104 if (has_decode_delay_been_guessed(st)) {
1105 update_dts_from_pts(s, stream_index, pktl);
1108 if (st->start_time == AV_NOPTS_VALUE) {
1109 st->start_time = pts;
1110 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1111 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1115 static void update_initial_durations(AVFormatContext *s, AVStream *st,
1116 int stream_index, int duration)
1118 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1119 int64_t cur_dts = RELATIVE_TS_BASE;
1121 if (st->first_dts != AV_NOPTS_VALUE) {
1122 if (st->update_initial_durations_done)
1124 st->update_initial_durations_done = 1;
1125 cur_dts = st->first_dts;
1126 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1127 if (pktl->pkt.stream_index == stream_index) {
1128 if (pktl->pkt.pts != pktl->pkt.dts ||
1129 pktl->pkt.dts != AV_NOPTS_VALUE ||
1132 cur_dts -= duration;
1135 if (pktl && pktl->pkt.dts != st->first_dts) {
1136 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %"PRId64") in the queue\n",
1137 av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
1141 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
1144 pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1145 st->first_dts = cur_dts;
1146 } else if (st->cur_dts != RELATIVE_TS_BASE)
1149 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1150 if (pktl->pkt.stream_index != stream_index)
1152 if (pktl->pkt.pts == pktl->pkt.dts &&
1153 (pktl->pkt.dts == AV_NOPTS_VALUE || pktl->pkt.dts == st->first_dts) &&
1154 !pktl->pkt.duration) {
1155 pktl->pkt.dts = cur_dts;
1156 if (!st->internal->avctx->has_b_frames)
1157 pktl->pkt.pts = cur_dts;
1158 // if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
1159 pktl->pkt.duration = duration;
1162 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
1165 st->cur_dts = cur_dts;
1168 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1169 AVCodecParserContext *pc, AVPacket *pkt,
1170 int64_t next_dts, int64_t next_pts)
1172 int num, den, presentation_delayed, delay, i;
1174 AVRational duration;
1175 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1176 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1178 if (s->flags & AVFMT_FLAG_NOFILLIN)
1181 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
1182 if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
1183 if (st->last_dts_for_order_check <= pkt->dts) {
1186 av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
1187 "DTS %"PRIi64" < %"PRIi64" out of order\n",
1189 st->last_dts_for_order_check);
1190 st->dts_misordered++;
1192 if (st->dts_ordered + st->dts_misordered > 250) {
1193 st->dts_ordered >>= 1;
1194 st->dts_misordered >>= 1;
1198 st->last_dts_for_order_check = pkt->dts;
1199 if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
1200 pkt->dts = AV_NOPTS_VALUE;
1203 if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1204 pkt->dts = AV_NOPTS_VALUE;
1206 if (pc && pc->pict_type == AV_PICTURE_TYPE_B
1207 && !st->internal->avctx->has_b_frames)
1208 //FIXME Set low_delay = 0 when has_b_frames = 1
1209 st->internal->avctx->has_b_frames = 1;
1211 /* do we have a video B-frame ? */
1212 delay = st->internal->avctx->has_b_frames;
1213 presentation_delayed = 0;
1215 /* XXX: need has_b_frame, but cannot get it if the codec is
1216 * not initialized */
1218 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1219 presentation_delayed = 1;
1221 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
1222 st->pts_wrap_bits < 63 &&
1223 pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
1224 if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
1225 pkt->dts -= 1LL << st->pts_wrap_bits;
1227 pkt->pts += 1LL << st->pts_wrap_bits;
1230 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1231 * We take the conservative approach and discard both.
1232 * Note: If this is misbehaving for an H.264 file, then possibly
1233 * presentation_delayed is not set correctly. */
1234 if (delay == 1 && pkt->dts == pkt->pts &&
1235 pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
1236 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1237 if ( strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
1238 && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1239 pkt->dts = AV_NOPTS_VALUE;
1242 duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
1243 if (pkt->duration == 0) {
1244 ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
1246 duration = (AVRational) {num, den};
1247 pkt->duration = av_rescale_rnd(1,
1248 num * (int64_t) st->time_base.den,
1249 den * (int64_t) st->time_base.num,
1254 if (pkt->duration != 0 && (s->internal->packet_buffer || s->internal->parse_queue))
1255 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1257 /* Correct timestamps with byte offset if demuxers only have timestamps
1258 * on packet boundaries */
1259 if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
1260 /* this will estimate bitrate based on this frame's duration and size */
1261 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1262 if (pkt->pts != AV_NOPTS_VALUE)
1264 if (pkt->dts != AV_NOPTS_VALUE)
1268 /* This may be redundant, but it should not hurt. */
1269 if (pkt->dts != AV_NOPTS_VALUE &&
1270 pkt->pts != AV_NOPTS_VALUE &&
1271 pkt->pts > pkt->dts)
1272 presentation_delayed = 1;
1274 if (s->debug & FF_FDEBUG_TS)
1275 av_log(s, AV_LOG_TRACE,
1276 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%"PRId64" delay:%d onein_oneout:%d\n",
1277 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
1278 pkt->stream_index, pc, pkt->duration, delay, onein_oneout);
1280 /* Interpolate PTS and DTS if they are not present. We skip H264
1281 * currently because delay and has_b_frames are not reliably set. */
1282 if ((delay == 0 || (delay == 1 && pc)) &&
1284 if (presentation_delayed) {
1285 /* DTS = decompression timestamp */
1286 /* PTS = presentation timestamp */
1287 if (pkt->dts == AV_NOPTS_VALUE)
1288 pkt->dts = st->last_IP_pts;
1289 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1290 if (pkt->dts == AV_NOPTS_VALUE)
1291 pkt->dts = st->cur_dts;
1293 /* This is tricky: the dts must be incremented by the duration
1294 * of the frame we are displaying, i.e. the last I- or P-frame. */
1295 if (st->last_IP_duration == 0)
1296 st->last_IP_duration = pkt->duration;
1297 if (pkt->dts != AV_NOPTS_VALUE)
1298 st->cur_dts = pkt->dts + st->last_IP_duration;
1299 if (pkt->dts != AV_NOPTS_VALUE &&
1300 pkt->pts == AV_NOPTS_VALUE &&
1301 st->last_IP_duration > 0 &&
1302 ((uint64_t)st->cur_dts - (uint64_t)next_dts + 1) <= 2 &&
1303 next_dts != next_pts &&
1304 next_pts != AV_NOPTS_VALUE)
1305 pkt->pts = next_dts;
1307 st->last_IP_duration = pkt->duration;
1308 st->last_IP_pts = pkt->pts;
1309 /* Cannot compute PTS if not present (we can compute it only
1310 * by knowing the future. */
1311 } else if (pkt->pts != AV_NOPTS_VALUE ||
1312 pkt->dts != AV_NOPTS_VALUE ||
1315 /* presentation is not delayed : PTS and DTS are the same */
1316 if (pkt->pts == AV_NOPTS_VALUE)
1317 pkt->pts = pkt->dts;
1318 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1320 if (pkt->pts == AV_NOPTS_VALUE)
1321 pkt->pts = st->cur_dts;
1322 pkt->dts = pkt->pts;
1323 if (pkt->pts != AV_NOPTS_VALUE)
1324 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
1328 if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1329 st->pts_buffer[0] = pkt->pts;
1330 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
1331 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
1333 if(has_decode_delay_been_guessed(st))
1334 pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
1336 // We skipped it above so we try here.
1338 // This should happen on the first packet
1339 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1340 if (pkt->dts > st->cur_dts)
1341 st->cur_dts = pkt->dts;
1343 if (s->debug & FF_FDEBUG_TS)
1344 av_log(s, AV_LOG_TRACE, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1345 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
1348 if (is_intra_only(st->codecpar->codec_id))
1349 pkt->flags |= AV_PKT_FLAG_KEY;
1350 #if FF_API_CONVERGENCE_DURATION
1351 FF_DISABLE_DEPRECATION_WARNINGS
1353 pkt->convergence_duration = pc->convergence_duration;
1354 FF_ENABLE_DEPRECATION_WARNINGS
1358 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1361 AVPacketList *pktl = *pkt_buf;
1362 *pkt_buf = pktl->next;
1363 av_packet_unref(&pktl->pkt);
1366 *pkt_buf_end = NULL;
1370 * Parse a packet, add all split parts to parse_queue.
1372 * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
1374 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1376 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1377 AVStream *st = s->streams[stream_index];
1378 uint8_t *data = pkt ? pkt->data : NULL;
1379 int size = pkt ? pkt->size : 0;
1380 int ret = 0, got_output = 0;
1383 av_init_packet(&flush_pkt);
1386 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1387 // preserve 0-size sync packets
1388 compute_pkt_fields(s, st, st->parser, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1391 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1393 int64_t next_pts = pkt->pts;
1394 int64_t next_dts = pkt->dts;
1396 av_init_packet(&out_pkt);
1397 len = av_parser_parse2(st->parser, st->internal->avctx,
1398 &out_pkt.data, &out_pkt.size, data, size,
1399 pkt->pts, pkt->dts, pkt->pos);
1401 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1403 /* increment read pointer */
1407 got_output = !!out_pkt.size;
1412 if (pkt->side_data) {
1413 out_pkt.side_data = pkt->side_data;
1414 out_pkt.side_data_elems = pkt->side_data_elems;
1415 pkt->side_data = NULL;
1416 pkt->side_data_elems = 0;
1419 /* set the duration */
1420 out_pkt.duration = (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->duration : 0;
1421 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1422 if (st->internal->avctx->sample_rate > 0) {
1424 av_rescale_q_rnd(st->parser->duration,
1425 (AVRational) { 1, st->internal->avctx->sample_rate },
1431 out_pkt.stream_index = st->index;
1432 out_pkt.pts = st->parser->pts;
1433 out_pkt.dts = st->parser->dts;
1434 out_pkt.pos = st->parser->pos;
1436 if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1437 out_pkt.pos = st->parser->frame_offset;
1439 if (st->parser->key_frame == 1 ||
1440 (st->parser->key_frame == -1 &&
1441 st->parser->pict_type == AV_PICTURE_TYPE_I))
1442 out_pkt.flags |= AV_PKT_FLAG_KEY;
1444 if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1445 out_pkt.flags |= AV_PKT_FLAG_KEY;
1447 compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts);
1449 ret = add_to_pktbuf(&s->internal->parse_queue, &out_pkt,
1450 &s->internal->parse_queue_end, 1);
1451 av_packet_unref(&out_pkt);
1456 /* end of the stream => close and free the parser */
1457 if (pkt == &flush_pkt) {
1458 av_parser_close(st->parser);
1463 av_packet_unref(pkt);
1467 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1468 AVPacketList **pkt_buffer_end,
1472 av_assert0(*pkt_buffer);
1475 *pkt_buffer = pktl->next;
1477 *pkt_buffer_end = NULL;
1482 static int64_t ts_to_samples(AVStream *st, int64_t ts)
1484 return av_rescale(ts, st->time_base.num * st->codecpar->sample_rate, st->time_base.den);
1487 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1489 int ret = 0, i, got_packet = 0;
1490 AVDictionary *metadata = NULL;
1492 av_init_packet(pkt);
1494 while (!got_packet && !s->internal->parse_queue) {
1498 /* read next packet */
1499 ret = ff_read_packet(s, &cur_pkt);
1501 if (ret == AVERROR(EAGAIN))
1503 /* flush the parsers */
1504 for (i = 0; i < s->nb_streams; i++) {
1506 if (st->parser && st->need_parsing)
1507 parse_packet(s, NULL, st->index);
1509 /* all remaining packets are now in parse_queue =>
1510 * really terminate parsing */
1514 st = s->streams[cur_pkt.stream_index];
1516 /* update context if required */
1517 if (st->internal->need_context_update) {
1518 if (avcodec_is_open(st->internal->avctx)) {
1519 av_log(s, AV_LOG_DEBUG, "Demuxer context update while decoder is open, closing and trying to re-open\n");
1520 avcodec_close(st->internal->avctx);
1521 st->info->found_decoder = 0;
1524 /* close parser, because it depends on the codec */
1525 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
1526 av_parser_close(st->parser);
1530 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
1534 #if FF_API_LAVF_AVCTX
1535 FF_DISABLE_DEPRECATION_WARNINGS
1536 /* update deprecated public codec context */
1537 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
1540 FF_ENABLE_DEPRECATION_WARNINGS
1543 st->internal->need_context_update = 0;
1546 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1547 cur_pkt.dts != AV_NOPTS_VALUE &&
1548 cur_pkt.pts < cur_pkt.dts) {
1549 av_log(s, AV_LOG_WARNING,
1550 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1551 cur_pkt.stream_index,
1552 av_ts2str(cur_pkt.pts),
1553 av_ts2str(cur_pkt.dts),
1556 if (s->debug & FF_FDEBUG_TS)
1557 av_log(s, AV_LOG_DEBUG,
1558 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"PRId64", flags=%d\n",
1559 cur_pkt.stream_index,
1560 av_ts2str(cur_pkt.pts),
1561 av_ts2str(cur_pkt.dts),
1562 cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
1564 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1565 st->parser = av_parser_init(st->codecpar->codec_id);
1567 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1568 "%s, packets or times may be invalid.\n",
1569 avcodec_get_name(st->codecpar->codec_id));
1570 /* no parser available: just output the raw packets */
1571 st->need_parsing = AVSTREAM_PARSE_NONE;
1572 } else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1573 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1574 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1575 st->parser->flags |= PARSER_FLAG_ONCE;
1576 else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1577 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1580 if (!st->need_parsing || !st->parser) {
1581 /* no parsing needed: we just output the packet as is */
1583 compute_pkt_fields(s, st, NULL, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1584 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1585 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1586 ff_reduce_index(s, st->index);
1587 av_add_index_entry(st, pkt->pos, pkt->dts,
1588 0, 0, AVINDEX_KEYFRAME);
1591 } else if (st->discard < AVDISCARD_ALL) {
1592 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1594 st->codecpar->sample_rate = st->internal->avctx->sample_rate;
1595 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
1596 st->codecpar->channels = st->internal->avctx->channels;
1597 st->codecpar->channel_layout = st->internal->avctx->channel_layout;
1598 st->codecpar->codec_id = st->internal->avctx->codec_id;
1601 av_packet_unref(&cur_pkt);
1603 if (pkt->flags & AV_PKT_FLAG_KEY)
1604 st->skip_to_keyframe = 0;
1605 if (st->skip_to_keyframe) {
1606 av_packet_unref(&cur_pkt);
1614 if (!got_packet && s->internal->parse_queue)
1615 ret = read_from_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt);
1618 AVStream *st = s->streams[pkt->stream_index];
1619 int discard_padding = 0;
1620 if (st->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
1621 int64_t pts = pkt->pts - (is_relative(pkt->pts) ? RELATIVE_TS_BASE : 0);
1622 int64_t sample = ts_to_samples(st, pts);
1623 int duration = ts_to_samples(st, pkt->duration);
1624 int64_t end_sample = sample + duration;
1625 if (duration > 0 && end_sample >= st->first_discard_sample &&
1626 sample < st->last_discard_sample)
1627 discard_padding = FFMIN(end_sample - st->first_discard_sample, duration);
1629 if (st->start_skip_samples && (pkt->pts == 0 || pkt->pts == RELATIVE_TS_BASE))
1630 st->skip_samples = st->start_skip_samples;
1631 if (st->skip_samples || discard_padding) {
1632 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1634 AV_WL32(p, st->skip_samples);
1635 AV_WL32(p + 4, discard_padding);
1636 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d / discard %d\n", st->skip_samples, discard_padding);
1638 st->skip_samples = 0;
1641 if (st->inject_global_side_data) {
1642 for (i = 0; i < st->nb_side_data; i++) {
1643 AVPacketSideData *src_sd = &st->side_data[i];
1646 if (av_packet_get_side_data(pkt, src_sd->type, NULL))
1649 dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
1651 av_log(s, AV_LOG_WARNING, "Could not inject global side data\n");
1655 memcpy(dst_data, src_sd->data, src_sd->size);
1657 st->inject_global_side_data = 0;
1660 if (!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
1661 av_packet_merge_side_data(pkt);
1664 av_opt_get_dict_val(s, "metadata", AV_OPT_SEARCH_CHILDREN, &metadata);
1666 s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
1667 av_dict_copy(&s->metadata, metadata, 0);
1668 av_dict_free(&metadata);
1669 av_opt_set_dict_val(s, "metadata", NULL, AV_OPT_SEARCH_CHILDREN);
1672 #if FF_API_LAVF_AVCTX
1673 update_stream_avctx(s);
1676 if (s->debug & FF_FDEBUG_TS)
1677 av_log(s, AV_LOG_DEBUG,
1678 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1679 "size=%d, duration=%"PRId64", flags=%d\n",
1681 av_ts2str(pkt->pts),
1682 av_ts2str(pkt->dts),
1683 pkt->size, pkt->duration, pkt->flags);
1688 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1690 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1696 ret = s->internal->packet_buffer
1697 ? read_from_packet_buffer(&s->internal->packet_buffer,
1698 &s->internal->packet_buffer_end, pkt)
1699 : read_frame_internal(s, pkt);
1706 AVPacketList *pktl = s->internal->packet_buffer;
1709 AVPacket *next_pkt = &pktl->pkt;
1711 if (next_pkt->dts != AV_NOPTS_VALUE) {
1712 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1713 // last dts seen for this stream. if any of packets following
1714 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1715 int64_t last_dts = next_pkt->dts;
1716 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1717 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1718 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0)) {
1719 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) {
1721 next_pkt->pts = pktl->pkt.dts;
1723 if (last_dts != AV_NOPTS_VALUE) {
1724 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1725 last_dts = pktl->pkt.dts;
1730 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1731 // Fixing the last reference frame had none pts issue (For MXF etc).
1732 // We only do this when
1734 // 2. we are not able to resolve a pts value for current packet.
1735 // 3. the packets for this stream at the end of the files had valid dts.
1736 next_pkt->pts = last_dts + next_pkt->duration;
1738 pktl = s->internal->packet_buffer;
1741 /* read packet from packet buffer, if there is data */
1742 st = s->streams[next_pkt->stream_index];
1743 if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
1744 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1745 ret = read_from_packet_buffer(&s->internal->packet_buffer,
1746 &s->internal->packet_buffer_end, pkt);
1751 ret = read_frame_internal(s, pkt);
1753 if (pktl && ret != AVERROR(EAGAIN)) {
1760 ret = add_to_pktbuf(&s->internal->packet_buffer, pkt,
1761 &s->internal->packet_buffer_end, 1);
1762 av_packet_unref(pkt);
1769 st = s->streams[pkt->stream_index];
1770 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1771 ff_reduce_index(s, st->index);
1772 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1775 if (is_relative(pkt->dts))
1776 pkt->dts -= RELATIVE_TS_BASE;
1777 if (is_relative(pkt->pts))
1778 pkt->pts -= RELATIVE_TS_BASE;
1783 /* XXX: suppress the packet queue */
1784 static void flush_packet_queue(AVFormatContext *s)
1788 free_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end);
1789 free_packet_buffer(&s->internal->packet_buffer, &s->internal->packet_buffer_end);
1790 free_packet_buffer(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
1792 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1795 /*******************************************************/
1798 int av_find_default_stream_index(AVFormatContext *s)
1802 int best_stream = 0;
1803 int best_score = INT_MIN;
1805 if (s->nb_streams <= 0)
1807 for (i = 0; i < s->nb_streams; i++) {
1810 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1811 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
1813 if (st->codecpar->width && st->codecpar->height)
1817 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1818 if (st->codecpar->sample_rate)
1821 if (st->codec_info_nb_frames)
1824 if (st->discard != AVDISCARD_ALL)
1827 if (score > best_score) {
1835 /** Flush the frame reader. */
1836 void ff_read_frame_flush(AVFormatContext *s)
1841 flush_packet_queue(s);
1843 /* Reset read state for each stream. */
1844 for (i = 0; i < s->nb_streams; i++) {
1848 av_parser_close(st->parser);
1851 st->last_IP_pts = AV_NOPTS_VALUE;
1852 st->last_dts_for_order_check = AV_NOPTS_VALUE;
1853 if (st->first_dts == AV_NOPTS_VALUE)
1854 st->cur_dts = RELATIVE_TS_BASE;
1856 /* We set the current DTS to an unspecified origin. */
1857 st->cur_dts = AV_NOPTS_VALUE;
1859 st->probe_packets = MAX_PROBE_PACKETS;
1861 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1862 st->pts_buffer[j] = AV_NOPTS_VALUE;
1864 if (s->internal->inject_global_side_data)
1865 st->inject_global_side_data = 1;
1867 st->skip_samples = 0;
1871 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1875 for (i = 0; i < s->nb_streams; i++) {
1876 AVStream *st = s->streams[i];
1879 av_rescale(timestamp,
1880 st->time_base.den * (int64_t) ref_st->time_base.num,
1881 st->time_base.num * (int64_t) ref_st->time_base.den);
1885 void ff_reduce_index(AVFormatContext *s, int stream_index)
1887 AVStream *st = s->streams[stream_index];
1888 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1890 if ((unsigned) st->nb_index_entries >= max_entries) {
1892 for (i = 0; 2 * i < st->nb_index_entries; i++)
1893 st->index_entries[i] = st->index_entries[2 * i];
1894 st->nb_index_entries = i;
1898 int ff_add_index_entry(AVIndexEntry **index_entries,
1899 int *nb_index_entries,
1900 unsigned int *index_entries_allocated_size,
1901 int64_t pos, int64_t timestamp,
1902 int size, int distance, int flags)
1904 AVIndexEntry *entries, *ie;
1907 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1910 if (timestamp == AV_NOPTS_VALUE)
1911 return AVERROR(EINVAL);
1913 if (size < 0 || size > 0x3FFFFFFF)
1914 return AVERROR(EINVAL);
1916 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1917 timestamp -= RELATIVE_TS_BASE;
1919 entries = av_fast_realloc(*index_entries,
1920 index_entries_allocated_size,
1921 (*nb_index_entries + 1) *
1922 sizeof(AVIndexEntry));
1926 *index_entries = entries;
1928 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
1929 timestamp, AVSEEK_FLAG_ANY);
1932 index = (*nb_index_entries)++;
1933 ie = &entries[index];
1934 av_assert0(index == 0 || ie[-1].timestamp < timestamp);
1936 ie = &entries[index];
1937 if (ie->timestamp != timestamp) {
1938 if (ie->timestamp <= timestamp)
1940 memmove(entries + index + 1, entries + index,
1941 sizeof(AVIndexEntry) * (*nb_index_entries - index));
1942 (*nb_index_entries)++;
1943 } else if (ie->pos == pos && distance < ie->min_distance)
1944 // do not reduce the distance
1945 distance = ie->min_distance;
1949 ie->timestamp = timestamp;
1950 ie->min_distance = distance;
1957 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
1958 int size, int distance, int flags)
1960 timestamp = wrap_timestamp(st, timestamp);
1961 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1962 &st->index_entries_allocated_size, pos,
1963 timestamp, size, distance, flags);
1966 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1967 int64_t wanted_timestamp, int flags)
1975 // Optimize appending index entries at the end.
1976 if (b && entries[b - 1].timestamp < wanted_timestamp)
1982 // Search for the next non-discarded packet.
1983 while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b) {
1985 if (m == b && entries[m].timestamp >= wanted_timestamp) {
1991 timestamp = entries[m].timestamp;
1992 if (timestamp >= wanted_timestamp)
1994 if (timestamp <= wanted_timestamp)
1997 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1999 if (!(flags & AVSEEK_FLAG_ANY))
2000 while (m >= 0 && m < nb_entries &&
2001 !(entries[m].flags & AVINDEX_KEYFRAME))
2002 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
2004 if (m == nb_entries)
2009 void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
2012 int64_t pos_delta = 0;
2014 //We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
2015 const char *proto = avio_find_protocol_name(s->filename);
2018 av_log(s, AV_LOG_INFO,
2019 "Protocol name not provided, cannot determine if input is local or "
2020 "a network protocol, buffers and access patterns cannot be configured "
2021 "optimally without knowing the protocol\n");
2024 if (proto && !(strcmp(proto, "file") && strcmp(proto, "pipe") && strcmp(proto, "cache")))
2027 for (ist1 = 0; ist1 < s->nb_streams; ist1++) {
2028 AVStream *st1 = s->streams[ist1];
2029 for (ist2 = 0; ist2 < s->nb_streams; ist2++) {
2030 AVStream *st2 = s->streams[ist2];
2036 for (i1 = i2 = 0; i1 < st1->nb_index_entries; i1++) {
2037 AVIndexEntry *e1 = &st1->index_entries[i1];
2038 int64_t e1_pts = av_rescale_q(e1->timestamp, st1->time_base, AV_TIME_BASE_Q);
2040 skip = FFMAX(skip, e1->size);
2041 for (; i2 < st2->nb_index_entries; i2++) {
2042 AVIndexEntry *e2 = &st2->index_entries[i2];
2043 int64_t e2_pts = av_rescale_q(e2->timestamp, st2->time_base, AV_TIME_BASE_Q);
2044 if (e2_pts - e1_pts < time_tolerance)
2046 pos_delta = FFMAX(pos_delta, e1->pos - e2->pos);
2054 /* XXX This could be adjusted depending on protocol*/
2055 if (s->pb->buffer_size < pos_delta && pos_delta < (1<<24)) {
2056 av_log(s, AV_LOG_VERBOSE, "Reconfiguring buffers to size %"PRId64"\n", pos_delta);
2057 ffio_set_buf_size(s->pb, pos_delta);
2058 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, pos_delta/2);
2061 if (skip < (1<<23)) {
2062 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, skip);
2066 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
2068 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
2069 wanted_timestamp, flags);
2072 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
2073 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2075 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
2076 if (stream_index >= 0)
2077 ts = wrap_timestamp(s->streams[stream_index], ts);
2081 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
2082 int64_t target_ts, int flags)
2084 AVInputFormat *avif = s->iformat;
2085 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
2086 int64_t ts_min, ts_max, ts;
2091 if (stream_index < 0)
2094 av_log(s, AV_LOG_TRACE, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2097 ts_min = AV_NOPTS_VALUE;
2098 pos_limit = -1; // GCC falsely says it may be uninitialized.
2100 st = s->streams[stream_index];
2101 if (st->index_entries) {
2104 /* FIXME: Whole function must be checked for non-keyframe entries in
2105 * index case, especially read_timestamp(). */
2106 index = av_index_search_timestamp(st, target_ts,
2107 flags | AVSEEK_FLAG_BACKWARD);
2108 index = FFMAX(index, 0);
2109 e = &st->index_entries[index];
2111 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
2113 ts_min = e->timestamp;
2114 av_log(s, AV_LOG_TRACE, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
2115 pos_min, av_ts2str(ts_min));
2117 av_assert1(index == 0);
2120 index = av_index_search_timestamp(st, target_ts,
2121 flags & ~AVSEEK_FLAG_BACKWARD);
2122 av_assert0(index < st->nb_index_entries);
2124 e = &st->index_entries[index];
2125 av_assert1(e->timestamp >= target_ts);
2127 ts_max = e->timestamp;
2128 pos_limit = pos_max - e->min_distance;
2129 av_log(s, AV_LOG_TRACE, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
2130 " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
2134 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
2135 ts_min, ts_max, flags, &ts, avif->read_timestamp);
2140 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
2143 ff_read_frame_flush(s);
2144 ff_update_cur_dts(s, st, ts);
2149 int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
2150 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2152 int64_t step = 1024;
2153 int64_t limit, ts_max;
2154 int64_t filesize = avio_size(s->pb);
2155 int64_t pos_max = filesize - 1;
2158 pos_max = FFMAX(0, (pos_max) - step);
2159 ts_max = ff_read_timestamp(s, stream_index,
2160 &pos_max, limit, read_timestamp);
2162 } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
2163 if (ts_max == AV_NOPTS_VALUE)
2167 int64_t tmp_pos = pos_max + 1;
2168 int64_t tmp_ts = ff_read_timestamp(s, stream_index,
2169 &tmp_pos, INT64_MAX, read_timestamp);
2170 if (tmp_ts == AV_NOPTS_VALUE)
2172 av_assert0(tmp_pos > pos_max);
2175 if (tmp_pos >= filesize)
2187 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
2188 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
2189 int64_t ts_min, int64_t ts_max,
2190 int flags, int64_t *ts_ret,
2191 int64_t (*read_timestamp)(struct AVFormatContext *, int,
2192 int64_t *, int64_t))
2199 av_log(s, AV_LOG_TRACE, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2201 if (ts_min == AV_NOPTS_VALUE) {
2202 pos_min = s->internal->data_offset;
2203 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2204 if (ts_min == AV_NOPTS_VALUE)
2208 if (ts_min >= target_ts) {
2213 if (ts_max == AV_NOPTS_VALUE) {
2214 if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
2216 pos_limit = pos_max;
2219 if (ts_max <= target_ts) {
2224 av_assert0(ts_min < ts_max);
2227 while (pos_min < pos_limit) {
2228 av_log(s, AV_LOG_TRACE,
2229 "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
2230 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
2231 av_assert0(pos_limit <= pos_max);
2233 if (no_change == 0) {
2234 int64_t approximate_keyframe_distance = pos_max - pos_limit;
2235 // interpolate position (better than dichotomy)
2236 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
2238 pos_min - approximate_keyframe_distance;
2239 } else if (no_change == 1) {
2240 // bisection if interpolation did not change min / max pos last time
2241 pos = (pos_min + pos_limit) >> 1;
2243 /* linear search if bisection failed, can only happen if there
2244 * are very few or no keyframes between min/max */
2249 else if (pos > pos_limit)
2253 // May pass pos_limit instead of -1.
2254 ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
2259 av_log(s, AV_LOG_TRACE, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
2260 " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
2261 pos_min, pos, pos_max,
2262 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
2263 pos_limit, start_pos, no_change);
2264 if (ts == AV_NOPTS_VALUE) {
2265 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
2268 if (target_ts <= ts) {
2269 pos_limit = start_pos - 1;
2273 if (target_ts >= ts) {
2279 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
2280 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
2283 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2285 ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2286 av_log(s, AV_LOG_TRACE, "pos=0x%"PRIx64" %s<=%s<=%s\n",
2287 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
2293 static int seek_frame_byte(AVFormatContext *s, int stream_index,
2294 int64_t pos, int flags)
2296 int64_t pos_min, pos_max;
2298 pos_min = s->internal->data_offset;
2299 pos_max = avio_size(s->pb) - 1;
2303 else if (pos > pos_max)
2306 avio_seek(s->pb, pos, SEEK_SET);
2308 s->io_repositioned = 1;
2313 static int seek_frame_generic(AVFormatContext *s, int stream_index,
2314 int64_t timestamp, int flags)
2321 st = s->streams[stream_index];
2323 index = av_index_search_timestamp(st, timestamp, flags);
2325 if (index < 0 && st->nb_index_entries &&
2326 timestamp < st->index_entries[0].timestamp)
2329 if (index < 0 || index == st->nb_index_entries - 1) {
2333 if (st->nb_index_entries) {
2334 av_assert0(st->index_entries);
2335 ie = &st->index_entries[st->nb_index_entries - 1];
2336 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2338 ff_update_cur_dts(s, st, ie->timestamp);
2340 if ((ret = avio_seek(s->pb, s->internal->data_offset, SEEK_SET)) < 0)
2346 read_status = av_read_frame(s, &pkt);
2347 } while (read_status == AVERROR(EAGAIN));
2348 if (read_status < 0)
2350 if (stream_index == pkt.stream_index && pkt.dts > timestamp) {
2351 if (pkt.flags & AV_PKT_FLAG_KEY) {
2352 av_packet_unref(&pkt);
2355 if (nonkey++ > 1000 && st->codecpar->codec_id != AV_CODEC_ID_CDGRAPHICS) {
2356 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);
2357 av_packet_unref(&pkt);
2361 av_packet_unref(&pkt);
2363 index = av_index_search_timestamp(st, timestamp, flags);
2368 ff_read_frame_flush(s);
2369 if (s->iformat->read_seek)
2370 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2372 ie = &st->index_entries[index];
2373 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2375 ff_update_cur_dts(s, st, ie->timestamp);
2380 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2381 int64_t timestamp, int flags)
2386 if (flags & AVSEEK_FLAG_BYTE) {
2387 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2389 ff_read_frame_flush(s);
2390 return seek_frame_byte(s, stream_index, timestamp, flags);
2393 if (stream_index < 0) {
2394 stream_index = av_find_default_stream_index(s);
2395 if (stream_index < 0)
2398 st = s->streams[stream_index];
2399 /* timestamp for default must be expressed in AV_TIME_BASE units */
2400 timestamp = av_rescale(timestamp, st->time_base.den,
2401 AV_TIME_BASE * (int64_t) st->time_base.num);
2404 /* first, we try the format specific seek */
2405 if (s->iformat->read_seek) {
2406 ff_read_frame_flush(s);
2407 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2413 if (s->iformat->read_timestamp &&
2414 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2415 ff_read_frame_flush(s);
2416 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2417 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2418 ff_read_frame_flush(s);
2419 return seek_frame_generic(s, stream_index, timestamp, flags);
2424 int av_seek_frame(AVFormatContext *s, int stream_index,
2425 int64_t timestamp, int flags)
2429 if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2430 int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2431 if ((flags & AVSEEK_FLAG_BACKWARD))
2435 return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2436 flags & ~AVSEEK_FLAG_BACKWARD);
2439 ret = seek_frame_internal(s, stream_index, timestamp, flags);
2442 ret = avformat_queue_attached_pictures(s);
2447 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
2448 int64_t ts, int64_t max_ts, int flags)
2450 if (min_ts > ts || max_ts < ts)
2452 if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2453 return AVERROR(EINVAL);
2456 flags |= AVSEEK_FLAG_ANY;
2457 flags &= ~AVSEEK_FLAG_BACKWARD;
2459 if (s->iformat->read_seek2) {
2461 ff_read_frame_flush(s);
2463 if (stream_index == -1 && s->nb_streams == 1) {
2464 AVRational time_base = s->streams[0]->time_base;
2465 ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2466 min_ts = av_rescale_rnd(min_ts, time_base.den,
2467 time_base.num * (int64_t)AV_TIME_BASE,
2468 AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
2469 max_ts = av_rescale_rnd(max_ts, time_base.den,
2470 time_base.num * (int64_t)AV_TIME_BASE,
2471 AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
2475 ret = s->iformat->read_seek2(s, stream_index, min_ts,
2479 ret = avformat_queue_attached_pictures(s);
2483 if (s->iformat->read_timestamp) {
2484 // try to seek via read_timestamp()
2487 // Fall back on old API if new is not implemented but old is.
2488 // Note the old API has somewhat different semantics.
2489 if (s->iformat->read_seek || 1) {
2490 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2491 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2492 if (ret<0 && ts != min_ts && max_ts != ts) {
2493 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2495 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2500 // try some generic seek like seek_frame_generic() but with new ts semantics
2501 return -1; //unreachable
2504 int avformat_flush(AVFormatContext *s)
2506 ff_read_frame_flush(s);
2510 /*******************************************************/
2513 * Return TRUE if the stream has accurate duration in any stream.
2515 * @return TRUE if the stream has accurate duration for at least one component.
2517 static int has_duration(AVFormatContext *ic)
2522 for (i = 0; i < ic->nb_streams; i++) {
2523 st = ic->streams[i];
2524 if (st->duration != AV_NOPTS_VALUE)
2527 if (ic->duration != AV_NOPTS_VALUE)
2533 * Estimate the stream timings from the one of each components.
2535 * Also computes the global bitrate if possible.
2537 static void update_stream_timings(AVFormatContext *ic)
2539 int64_t start_time, start_time1, start_time_text, end_time, end_time1, end_time_text;
2540 int64_t duration, duration1, filesize;
2545 start_time = INT64_MAX;
2546 start_time_text = INT64_MAX;
2547 end_time = INT64_MIN;
2548 end_time_text = INT64_MIN;
2549 duration = INT64_MIN;
2550 for (i = 0; i < ic->nb_streams; i++) {
2551 st = ic->streams[i];
2552 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2553 start_time1 = av_rescale_q(st->start_time, st->time_base,
2555 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
2556 if (start_time1 < start_time_text)
2557 start_time_text = start_time1;
2559 start_time = FFMIN(start_time, start_time1);
2560 end_time1 = av_rescale_q_rnd(st->duration, st->time_base,
2562 AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
2563 if (end_time1 != AV_NOPTS_VALUE && (end_time1 > 0 ? start_time1 <= INT64_MAX - end_time1 : start_time1 >= INT64_MIN - end_time1)) {
2564 end_time1 += start_time1;
2565 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
2566 end_time_text = FFMAX(end_time_text, end_time1);
2568 end_time = FFMAX(end_time, end_time1);
2570 for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
2571 if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2572 p->start_time = start_time1;
2573 if (p->end_time < end_time1)
2574 p->end_time = end_time1;
2577 if (st->duration != AV_NOPTS_VALUE) {
2578 duration1 = av_rescale_q(st->duration, st->time_base,
2580 duration = FFMAX(duration, duration1);
2583 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2584 start_time = start_time_text;
2585 else if (start_time > start_time_text)
2586 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2588 if (end_time == INT64_MIN || (end_time < end_time_text && end_time_text - end_time < AV_TIME_BASE)) {
2589 end_time = end_time_text;
2590 } else if (end_time < end_time_text) {
2591 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream endtime %f\n", end_time_text / (float)AV_TIME_BASE);
2594 if (start_time != INT64_MAX) {
2595 ic->start_time = start_time;
2596 if (end_time != INT64_MIN) {
2597 if (ic->nb_programs > 1) {
2598 for (i = 0; i < ic->nb_programs; i++) {
2599 p = ic->programs[i];
2600 if (p->start_time != AV_NOPTS_VALUE &&
2601 p->end_time > p->start_time &&
2602 p->end_time - (uint64_t)p->start_time <= INT64_MAX)
2603 duration = FFMAX(duration, p->end_time - p->start_time);
2605 } else if (end_time >= start_time && end_time - (uint64_t)start_time <= INT64_MAX) {
2606 duration = FFMAX(duration, end_time - start_time);
2610 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2611 ic->duration = duration;
2613 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration > 0) {
2614 /* compute the bitrate */
2615 double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2616 (double) ic->duration;
2617 if (bitrate >= 0 && bitrate <= INT64_MAX)
2618 ic->bit_rate = bitrate;
2622 static void fill_all_stream_timings(AVFormatContext *ic)
2627 update_stream_timings(ic);
2628 for (i = 0; i < ic->nb_streams; i++) {
2629 st = ic->streams[i];
2630 if (st->start_time == AV_NOPTS_VALUE) {
2631 if (ic->start_time != AV_NOPTS_VALUE)
2632 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
2634 if (ic->duration != AV_NOPTS_VALUE)
2635 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
2641 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2643 int64_t filesize, duration;
2644 int i, show_warning = 0;
2647 /* if bit_rate is already set, we believe it */
2648 if (ic->bit_rate <= 0) {
2649 int64_t bit_rate = 0;
2650 for (i = 0; i < ic->nb_streams; i++) {
2651 st = ic->streams[i];
2652 if (st->codecpar->bit_rate <= 0 && st->internal->avctx->bit_rate > 0)
2653 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
2654 if (st->codecpar->bit_rate > 0) {
2655 if (INT64_MAX - st->codecpar->bit_rate < bit_rate) {
2659 bit_rate += st->codecpar->bit_rate;
2660 } else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && st->codec_info_nb_frames > 1) {
2661 // If we have a videostream with packets but without a bitrate
2662 // then consider the sum not known
2667 ic->bit_rate = bit_rate;
2670 /* if duration is already set, we believe it */
2671 if (ic->duration == AV_NOPTS_VALUE &&
2672 ic->bit_rate != 0) {
2673 filesize = ic->pb ? avio_size(ic->pb) : 0;
2674 if (filesize > ic->internal->data_offset) {
2675 filesize -= ic->internal->data_offset;
2676 for (i = 0; i < ic->nb_streams; i++) {
2677 st = ic->streams[i];
2678 if ( st->time_base.num <= INT64_MAX / ic->bit_rate
2679 && st->duration == AV_NOPTS_VALUE) {
2680 duration = av_rescale(8 * filesize, st->time_base.den,
2682 (int64_t) st->time_base.num);
2683 st->duration = duration;
2690 av_log(ic, AV_LOG_WARNING,
2691 "Estimating duration from bitrate, this may be inaccurate\n");
2694 #define DURATION_MAX_READ_SIZE 250000LL
2695 #define DURATION_MAX_RETRY 6
2697 /* only usable for MPEG-PS streams */
2698 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2700 AVPacket pkt1, *pkt = &pkt1;
2702 int num, den, read_size, i, ret;
2703 int found_duration = 0;
2705 int64_t filesize, offset, duration;
2708 /* flush packet queue */
2709 flush_packet_queue(ic);
2711 for (i = 0; i < ic->nb_streams; i++) {
2712 st = ic->streams[i];
2713 if (st->start_time == AV_NOPTS_VALUE &&
2714 st->first_dts == AV_NOPTS_VALUE &&
2715 st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN)
2716 av_log(ic, AV_LOG_WARNING,
2717 "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2720 av_parser_close(st->parser);
2725 av_opt_set(ic, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN);
2726 /* estimate the end time (duration) */
2727 /* XXX: may need to support wrapping */
2728 filesize = ic->pb ? avio_size(ic->pb) : 0;
2730 is_end = found_duration;
2731 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
2735 avio_seek(ic->pb, offset, SEEK_SET);
2738 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
2742 ret = ff_read_packet(ic, pkt);
2743 } while (ret == AVERROR(EAGAIN));
2746 read_size += pkt->size;
2747 st = ic->streams[pkt->stream_index];
2748 if (pkt->pts != AV_NOPTS_VALUE &&
2749 (st->start_time != AV_NOPTS_VALUE ||
2750 st->first_dts != AV_NOPTS_VALUE)) {
2751 if (pkt->duration == 0) {
2752 ff_compute_frame_duration(ic, &num, &den, st, st->parser, pkt);
2754 pkt->duration = av_rescale_rnd(1,
2755 num * (int64_t) st->time_base.den,
2756 den * (int64_t) st->time_base.num,
2760 duration = pkt->pts + pkt->duration;
2762 if (st->start_time != AV_NOPTS_VALUE)
2763 duration -= st->start_time;
2765 duration -= st->first_dts;
2767 if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
2768 (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2769 st->duration = duration;
2770 st->info->last_duration = duration;
2773 av_packet_unref(pkt);
2776 /* check if all audio/video streams have valid duration */
2779 for (i = 0; i < ic->nb_streams; i++) {
2780 st = ic->streams[i];
2781 switch (st->codecpar->codec_type) {
2782 case AVMEDIA_TYPE_VIDEO:
2783 case AVMEDIA_TYPE_AUDIO:
2784 if (st->duration == AV_NOPTS_VALUE)
2791 ++retry <= DURATION_MAX_RETRY);
2793 av_opt_set(ic, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN);
2795 /* warn about audio/video streams which duration could not be estimated */
2796 for (i = 0; i < ic->nb_streams; i++) {
2797 st = ic->streams[i];
2798 if (st->duration == AV_NOPTS_VALUE) {
2799 switch (st->codecpar->codec_type) {
2800 case AVMEDIA_TYPE_VIDEO:
2801 case AVMEDIA_TYPE_AUDIO:
2802 if (st->start_time != AV_NOPTS_VALUE || st->first_dts != AV_NOPTS_VALUE) {
2803 av_log(ic, AV_LOG_DEBUG, "stream %d : no PTS found at end of file, duration not set\n", i);
2805 av_log(ic, AV_LOG_DEBUG, "stream %d : no TS found at start of file, duration not set\n", i);
2809 fill_all_stream_timings(ic);
2811 avio_seek(ic->pb, old_offset, SEEK_SET);
2812 for (i = 0; i < ic->nb_streams; i++) {
2815 st = ic->streams[i];
2816 st->cur_dts = st->first_dts;
2817 st->last_IP_pts = AV_NOPTS_VALUE;
2818 st->last_dts_for_order_check = AV_NOPTS_VALUE;
2819 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
2820 st->pts_buffer[j] = AV_NOPTS_VALUE;
2824 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2828 /* get the file size, if possible */
2829 if (ic->iformat->flags & AVFMT_NOFILE) {
2832 file_size = avio_size(ic->pb);
2833 file_size = FFMAX(0, file_size);
2836 if ((!strcmp(ic->iformat->name, "mpeg") ||
2837 !strcmp(ic->iformat->name, "mpegts")) &&
2838 file_size && ic->pb->seekable) {
2839 /* get accurate estimate from the PTSes */
2840 estimate_timings_from_pts(ic, old_offset);
2841 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2842 } else if (has_duration(ic)) {
2843 /* at least one component has timings - we use them for all
2845 fill_all_stream_timings(ic);
2846 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2848 /* less precise: use bitrate info */
2849 estimate_timings_from_bit_rate(ic);
2850 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2852 update_stream_timings(ic);
2856 AVStream av_unused *st;
2857 for (i = 0; i < ic->nb_streams; i++) {
2858 st = ic->streams[i];
2859 av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %0.3f duration: %0.3f\n", i,
2860 (double) st->start_time * av_q2d(st->time_base),
2861 (double) st->duration * av_q2d(st->time_base));
2863 av_log(ic, AV_LOG_TRACE,
2864 "format: start_time: %0.3f duration: %0.3f bitrate=%"PRId64" kb/s\n",
2865 (double) ic->start_time / AV_TIME_BASE,
2866 (double) ic->duration / AV_TIME_BASE,
2867 (int64_t)ic->bit_rate / 1000);
2871 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2873 AVCodecContext *avctx = st->internal->avctx;
2875 #define FAIL(errmsg) do { \
2877 *errmsg_ptr = errmsg; \
2881 if ( avctx->codec_id == AV_CODEC_ID_NONE
2882 && avctx->codec_type != AVMEDIA_TYPE_DATA)
2883 FAIL("unknown codec");
2884 switch (avctx->codec_type) {
2885 case AVMEDIA_TYPE_AUDIO:
2886 if (!avctx->frame_size && determinable_frame_size(avctx))
2887 FAIL("unspecified frame size");
2888 if (st->info->found_decoder >= 0 &&
2889 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2890 FAIL("unspecified sample format");
2891 if (!avctx->sample_rate)
2892 FAIL("unspecified sample rate");
2893 if (!avctx->channels)
2894 FAIL("unspecified number of channels");
2895 if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
2896 FAIL("no decodable DTS frames");
2898 case AVMEDIA_TYPE_VIDEO:
2900 FAIL("unspecified size");
2901 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
2902 FAIL("unspecified pixel format");
2903 if (st->codecpar->codec_id == AV_CODEC_ID_RV30 || st->codecpar->codec_id == AV_CODEC_ID_RV40)
2904 if (!st->sample_aspect_ratio.num && !st->codecpar->sample_aspect_ratio.num && !st->codec_info_nb_frames)
2905 FAIL("no frame in rv30/40 and no sar");
2907 case AVMEDIA_TYPE_SUBTITLE:
2908 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
2909 FAIL("unspecified size");
2911 case AVMEDIA_TYPE_DATA:
2912 if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
2918 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2919 static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
2920 AVDictionary **options)
2922 AVCodecContext *avctx = st->internal->avctx;
2923 const AVCodec *codec;
2924 int got_picture = 1, ret = 0;
2925 AVFrame *frame = av_frame_alloc();
2926 AVSubtitle subtitle;
2927 AVPacket pkt = *avpkt;
2928 int do_skip_frame = 0;
2929 enum AVDiscard skip_frame;
2932 return AVERROR(ENOMEM);
2934 if (!avcodec_is_open(avctx) &&
2935 st->info->found_decoder <= 0 &&
2936 (st->codecpar->codec_id != -st->info->found_decoder || !st->codecpar->codec_id)) {
2937 AVDictionary *thread_opt = NULL;
2939 codec = find_probe_decoder(s, st, st->codecpar->codec_id);
2942 st->info->found_decoder = -st->codecpar->codec_id;
2947 /* Force thread count to 1 since the H.264 decoder will not extract
2948 * SPS and PPS to extradata during multi-threaded decoding. */
2949 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2950 if (s->codec_whitelist)
2951 av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
2952 ret = avcodec_open2(avctx, codec, options ? options : &thread_opt);
2954 av_dict_free(&thread_opt);
2956 st->info->found_decoder = -avctx->codec_id;
2959 st->info->found_decoder = 1;
2960 } else if (!st->info->found_decoder)
2961 st->info->found_decoder = 1;
2963 if (st->info->found_decoder < 0) {
2968 if (avpriv_codec_get_cap_skip_frame_fill_param(avctx->codec)) {
2970 skip_frame = avctx->skip_frame;
2971 avctx->skip_frame = AVDISCARD_ALL;
2974 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2976 (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
2977 (!st->codec_info_nb_frames &&
2978 (avctx->codec->capabilities & AV_CODEC_CAP_CHANNEL_CONF)))) {
2980 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
2981 avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
2982 ret = avcodec_send_packet(avctx, &pkt);
2983 if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
2987 ret = avcodec_receive_frame(avctx, frame);
2990 if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
2992 } else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2993 ret = avcodec_decode_subtitle2(avctx, &subtitle,
2994 &got_picture, &pkt);
3000 st->nb_decoded_frames++;
3005 if (!pkt.data && !got_picture)
3009 if (do_skip_frame) {
3010 avctx->skip_frame = skip_frame;
3013 av_frame_free(&frame);
3017 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
3019 while (tags->id != AV_CODEC_ID_NONE) {
3027 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
3030 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3031 if (tag == tags[i].tag)
3033 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3034 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
3036 return AV_CODEC_ID_NONE;
3039 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
3041 if (bps <= 0 || bps > 64)
3042 return AV_CODEC_ID_NONE;
3047 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
3049 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
3051 return AV_CODEC_ID_NONE;
3056 if (sflags & (1 << (bps - 1))) {
3059 return AV_CODEC_ID_PCM_S8;
3061 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
3063 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
3065 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
3067 return be ? AV_CODEC_ID_PCM_S64BE : AV_CODEC_ID_PCM_S64LE;
3069 return AV_CODEC_ID_NONE;
3074 return AV_CODEC_ID_PCM_U8;
3076 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
3078 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
3080 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
3082 return AV_CODEC_ID_NONE;
3088 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
3091 if (!av_codec_get_tag2(tags, id, &tag))
3096 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
3100 for (i = 0; tags && tags[i]; i++) {
3101 const AVCodecTag *codec_tags = tags[i];
3102 while (codec_tags->id != AV_CODEC_ID_NONE) {
3103 if (codec_tags->id == id) {
3104 *tag = codec_tags->tag;
3113 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
3116 for (i = 0; tags && tags[i]; i++) {
3117 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
3118 if (id != AV_CODEC_ID_NONE)
3121 return AV_CODEC_ID_NONE;
3124 static void compute_chapters_end(AVFormatContext *s)
3127 int64_t max_time = 0;
3129 if (s->duration > 0 && s->start_time < INT64_MAX - s->duration)
3130 max_time = s->duration +
3131 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
3133 for (i = 0; i < s->nb_chapters; i++)
3134 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
3135 AVChapter *ch = s->chapters[i];
3136 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
3140 for (j = 0; j < s->nb_chapters; j++) {
3141 AVChapter *ch1 = s->chapters[j];
3142 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
3144 if (j != i && next_start > ch->start && next_start < end)
3147 ch->end = (end == INT64_MAX) ? ch->start : end;
3151 static int get_std_framerate(int i)
3154 return (i + 1) * 1001;
3158 return (i + 31) * 1001 * 12;
3162 return ((const int[]) { 80, 120, 240})[i] * 1001 * 12;
3166 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
3169 /* Is the time base unreliable?
3170 * This is a heuristic to balance between quick acceptance of the values in
3171 * the headers vs. some extra checks.
3172 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
3173 * MPEG-2 commonly misuses field repeat flags to store different framerates.
3174 * And there are "variable" fps files this needs to detect as well. */
3175 static int tb_unreliable(AVCodecContext *c)
3177 if (c->time_base.den >= 101LL * c->time_base.num ||
3178 c->time_base.den < 5LL * c->time_base.num ||
3179 // c->codec_tag == AV_RL32("DIVX") ||
3180 // c->codec_tag == AV_RL32("XVID") ||
3181 c->codec_tag == AV_RL32("mp4v") ||
3182 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
3183 c->codec_id == AV_CODEC_ID_GIF ||
3184 c->codec_id == AV_CODEC_ID_HEVC ||
3185 c->codec_id == AV_CODEC_ID_H264)
3190 int ff_alloc_extradata(AVCodecParameters *par, int size)
3194 if (size < 0 || size >= INT32_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
3195 par->extradata = NULL;
3196 par->extradata_size = 0;
3197 return AVERROR(EINVAL);
3199 par->extradata = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
3200 if (par->extradata) {
3201 memset(par->extradata + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3202 par->extradata_size = size;
3205 par->extradata_size = 0;
3206 ret = AVERROR(ENOMEM);
3211 int ff_get_extradata(AVFormatContext *s, AVCodecParameters *par, AVIOContext *pb, int size)
3213 int ret = ff_alloc_extradata(par, size);
3216 ret = avio_read(pb, par->extradata, size);
3218 av_freep(&par->extradata);
3219 par->extradata_size = 0;
3220 av_log(s, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
3221 return ret < 0 ? ret : AVERROR_INVALIDDATA;
3227 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
3230 int64_t last = st->info->last_dts;
3232 if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
3233 && ts - (uint64_t)last < INT64_MAX) {
3234 double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
3235 int64_t duration = ts - last;
3237 if (!st->info->duration_error)
3238 st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
3239 if (!st->info->duration_error)
3240 return AVERROR(ENOMEM);
3242 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3243 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
3244 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3245 if (st->info->duration_error[0][1][i] < 1e10) {
3246 int framerate = get_std_framerate(i);
3247 double sdts = dts*framerate/(1001*12);
3248 for (j= 0; j<2; j++) {
3249 int64_t ticks = llrint(sdts+j*0.5);
3250 double error= sdts - ticks + j*0.5;
3251 st->info->duration_error[j][0][i] += error;
3252 st->info->duration_error[j][1][i] += error*error;
3256 st->info->duration_count++;
3257 st->info->rfps_duration_sum += duration;
3259 if (st->info->duration_count % 10 == 0) {
3260 int n = st->info->duration_count;
3261 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3262 if (st->info->duration_error[0][1][i] < 1e10) {
3263 double a0 = st->info->duration_error[0][0][i] / n;
3264 double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
3265 double a1 = st->info->duration_error[1][0][i] / n;
3266 double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
3267 if (error0 > 0.04 && error1 > 0.04) {
3268 st->info->duration_error[0][1][i] = 2e10;
3269 st->info->duration_error[1][1][i] = 2e10;
3275 // ignore the first 4 values, they might have some random jitter
3276 if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
3277 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
3279 if (ts != AV_NOPTS_VALUE)
3280 st->info->last_dts = ts;
3285 void ff_rfps_calculate(AVFormatContext *ic)
3289 for (i = 0; i < ic->nb_streams; i++) {
3290 AVStream *st = ic->streams[i];
3292 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
3294 // the check for tb_unreliable() is not completely correct, since this is not about handling
3295 // an unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3296 // ipmovie.c produces.
3297 if (tb_unreliable(st->internal->avctx) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
3298 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->info->duration_gcd, INT_MAX);
3299 if (st->info->duration_count>1 && !st->r_frame_rate.num
3300 && tb_unreliable(st->internal->avctx)) {
3302 double best_error= 0.01;
3303 AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
3305 for (j= 0; j<MAX_STD_TIMEBASES; j++) {
3308 if (st->info->codec_info_duration &&
3309 st->info->codec_info_duration*av_q2d(st->time_base) < (1001*11.5)/get_std_framerate(j))
3311 if (!st->info->codec_info_duration && get_std_framerate(j) < 1001*12)
3314 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
3317 for (k= 0; k<2; k++) {
3318 int n = st->info->duration_count;
3319 double a= st->info->duration_error[k][0][j] / n;
3320 double error= st->info->duration_error[k][1][j]/n - a*a;
3322 if (error < best_error && best_error> 0.000000001) {
3324 num = get_std_framerate(j);
3327 av_log(ic, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
3330 // do not increase frame rate by more than 1 % in order to match a standard rate.
3331 if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
3332 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
3334 if ( !st->avg_frame_rate.num
3335 && st->r_frame_rate.num && st->info->rfps_duration_sum
3336 && st->info->codec_info_duration <= 0
3337 && st->info->duration_count > 2
3338 && fabs(1.0 / (av_q2d(st->r_frame_rate) * av_q2d(st->time_base)) - st->info->rfps_duration_sum / (double)st->info->duration_count) <= 1.0
3340 av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
3341 st->avg_frame_rate = st->r_frame_rate;
3344 av_freep(&st->info->duration_error);
3345 st->info->last_dts = AV_NOPTS_VALUE;
3346 st->info->duration_count = 0;
3347 st->info->rfps_duration_sum = 0;
3351 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3353 int i, count = 0, ret = 0, j;
3356 AVCodecContext *avctx;
3357 AVPacket pkt1, *pkt;
3358 int64_t old_offset = avio_tell(ic->pb);
3359 // new streams might appear, no options for those
3360 int orig_nb_streams = ic->nb_streams;
3362 int64_t max_analyze_duration = ic->max_analyze_duration;
3363 int64_t max_stream_analyze_duration;
3364 int64_t max_subtitle_analyze_duration;
3365 int64_t probesize = ic->probesize;
3366 int eof_reached = 0;
3367 int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
3369 flush_codecs = probesize > 0;
3371 av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3373 max_stream_analyze_duration = max_analyze_duration;
3374 max_subtitle_analyze_duration = max_analyze_duration;
3375 if (!max_analyze_duration) {
3376 max_stream_analyze_duration =
3377 max_analyze_duration = 5*AV_TIME_BASE;
3378 max_subtitle_analyze_duration = 30*AV_TIME_BASE;
3379 if (!strcmp(ic->iformat->name, "flv"))
3380 max_stream_analyze_duration = 90*AV_TIME_BASE;
3381 if (!strcmp(ic->iformat->name, "mpeg") || !strcmp(ic->iformat->name, "mpegts"))
3382 max_stream_analyze_duration = 7*AV_TIME_BASE;
3386 av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d nb_streams:%d\n",
3387 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, ic->nb_streams);
3389 for (i = 0; i < ic->nb_streams; i++) {
3390 const AVCodec *codec;
3391 AVDictionary *thread_opt = NULL;
3392 st = ic->streams[i];
3393 avctx = st->internal->avctx;
3395 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3396 st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3397 /* if (!st->time_base.num)
3399 if (!avctx->time_base.num)
3400 avctx->time_base = st->time_base;
3403 /* check if the caller has overridden the codec id */
3404 #if FF_API_LAVF_AVCTX
3405 FF_DISABLE_DEPRECATION_WARNINGS
3406 if (st->codec->codec_id != st->internal->orig_codec_id) {
3407 st->codecpar->codec_id = st->codec->codec_id;
3408 st->codecpar->codec_type = st->codec->codec_type;
3409 st->internal->orig_codec_id = st->codec->codec_id;
3411 FF_ENABLE_DEPRECATION_WARNINGS
3413 // only for the split stuff
3414 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->request_probe <= 0) {
3415 st->parser = av_parser_init(st->codecpar->codec_id);
3417 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3418 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3419 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3420 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3422 } else if (st->need_parsing) {
3423 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3424 "%s, packets or times may be invalid.\n",
3425 avcodec_get_name(st->codecpar->codec_id));
3429 if (st->codecpar->codec_id != st->internal->orig_codec_id)
3430 st->internal->orig_codec_id = st->codecpar->codec_id;
3432 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3434 goto find_stream_info_err;
3435 if (st->request_probe <= 0)
3436 st->internal->avctx_inited = 1;
3438 codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3440 /* Force thread count to 1 since the H.264 decoder will not extract
3441 * SPS and PPS to extradata during multi-threaded decoding. */
3442 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3444 if (ic->codec_whitelist)
3445 av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3447 /* Ensure that subtitle_header is properly set. */
3448 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE
3449 && codec && !avctx->codec) {
3450 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3451 av_log(ic, AV_LOG_WARNING,
3452 "Failed to open codec in %s\n",__FUNCTION__);
3455 // Try to just open decoders, in case this is enough to get parameters.
3456 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3457 if (codec && !avctx->codec)
3458 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3459 av_log(ic, AV_LOG_WARNING,
3460 "Failed to open codec in %s\n",__FUNCTION__);
3463 av_dict_free(&thread_opt);
3466 for (i = 0; i < ic->nb_streams; i++) {
3467 #if FF_API_R_FRAME_RATE
3468 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3470 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3471 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
3476 int analyzed_all_streams;
3477 if (ff_check_interrupt(&ic->interrupt_callback)) {
3479 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3483 /* check if one codec still needs to be handled */
3484 for (i = 0; i < ic->nb_streams; i++) {
3485 int fps_analyze_framecount = 20;
3487 st = ic->streams[i];
3488 if (!has_codec_parameters(st, NULL))
3490 /* If the timebase is coarse (like the usual millisecond precision
3491 * of mkv), we need to analyze more frames to reliably arrive at
3492 * the correct fps. */
3493 if (av_q2d(st->time_base) > 0.0005)
3494 fps_analyze_framecount *= 2;
3495 if (!tb_unreliable(st->internal->avctx))
3496 fps_analyze_framecount = 0;
3497 if (ic->fps_probe_size >= 0)
3498 fps_analyze_framecount = ic->fps_probe_size;
3499 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3500 fps_analyze_framecount = 0;
3501 /* variable fps and no guess at the real fps */
3502 if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3503 st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3504 int count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
3505 st->info->codec_info_duration_fields/2 :
3506 st->info->duration_count;
3507 if (count < fps_analyze_framecount)
3510 if (st->parser && st->parser->parser->split &&
3511 !st->internal->avctx->extradata)
3513 if (st->first_dts == AV_NOPTS_VALUE &&
3514 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3515 st->codec_info_nb_frames < ((st->disposition & AV_DISPOSITION_ATTACHED_PIC) ? 1 : ic->max_ts_probe) &&
3516 (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3517 st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))
3520 analyzed_all_streams = 0;
3521 if (!missing_streams || !*missing_streams)
3522 if (i == ic->nb_streams) {
3523 analyzed_all_streams = 1;
3524 /* NOTE: If the format has no header, then we need to read some
3525 * packets to get most of the streams, so we cannot stop here. */
3526 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3527 /* If we found the info for all the codecs, we can stop. */
3529 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3534 /* We did not get all the codec info, but we read too much data. */
3535 if (read_size >= probesize) {
3537 av_log(ic, AV_LOG_DEBUG,
3538 "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3539 for (i = 0; i < ic->nb_streams; i++)
3540 if (!ic->streams[i]->r_frame_rate.num &&
3541 ic->streams[i]->info->duration_count <= 1 &&
3542 ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
3543 strcmp(ic->iformat->name, "image2"))
3544 av_log(ic, AV_LOG_WARNING,
3545 "Stream #%d: not enough frames to estimate rate; "
3546 "consider increasing probesize\n", i);
3550 /* NOTE: A new stream can be added there if no header in file
3551 * (AVFMTCTX_NOHEADER). */
3552 ret = read_frame_internal(ic, &pkt1);
3553 if (ret == AVERROR(EAGAIN))
3564 if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
3565 ret = add_to_pktbuf(&ic->internal->packet_buffer, pkt,
3566 &ic->internal->packet_buffer_end, 0);
3568 goto find_stream_info_err;
3571 st = ic->streams[pkt->stream_index];
3572 if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3573 read_size += pkt->size;
3575 avctx = st->internal->avctx;
3576 if (!st->internal->avctx_inited) {
3577 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3579 goto find_stream_info_err;
3580 st->internal->avctx_inited = 1;
3583 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3584 /* check for non-increasing dts */
3585 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3586 st->info->fps_last_dts >= pkt->dts) {
3587 av_log(ic, AV_LOG_DEBUG,
3588 "Non-increasing DTS in stream %d: packet %d with DTS "
3589 "%"PRId64", packet %d with DTS %"PRId64"\n",
3590 st->index, st->info->fps_last_dts_idx,
3591 st->info->fps_last_dts, st->codec_info_nb_frames,
3593 st->info->fps_first_dts =
3594 st->info->fps_last_dts = AV_NOPTS_VALUE;
3596 /* Check for a discontinuity in dts. If the difference in dts
3597 * is more than 1000 times the average packet duration in the
3598 * sequence, we treat it as a discontinuity. */
3599 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3600 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3601 (pkt->dts - st->info->fps_last_dts) / 1000 >
3602 (st->info->fps_last_dts - st->info->fps_first_dts) /
3603 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3604 av_log(ic, AV_LOG_WARNING,
3605 "DTS discontinuity in stream %d: packet %d with DTS "
3606 "%"PRId64", packet %d with DTS %"PRId64"\n",
3607 st->index, st->info->fps_last_dts_idx,
3608 st->info->fps_last_dts, st->codec_info_nb_frames,
3610 st->info->fps_first_dts =
3611 st->info->fps_last_dts = AV_NOPTS_VALUE;
3614 /* update stored dts values */
3615 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3616 st->info->fps_first_dts = pkt->dts;
3617 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3619 st->info->fps_last_dts = pkt->dts;
3620 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3622 if (st->codec_info_nb_frames>1) {
3626 if (st->time_base.den > 0)
3627 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3628 if (st->avg_frame_rate.num > 0)
3629 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3632 && st->codec_info_nb_frames>30
3633 && st->info->fps_first_dts != AV_NOPTS_VALUE
3634 && st->info->fps_last_dts != AV_NOPTS_VALUE)
3635 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3637 if (analyzed_all_streams) limit = max_analyze_duration;
3638 else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) limit = max_subtitle_analyze_duration;
3639 else limit = max_stream_analyze_duration;
3642 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds st:%d\n",
3644 t, pkt->stream_index);
3645 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3646 av_packet_unref(pkt);
3649 if (pkt->duration) {
3650 if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE && pkt->pts != AV_NOPTS_VALUE && pkt->pts >= st->start_time) {
3651 st->info->codec_info_duration = FFMIN(pkt->pts - st->start_time, st->info->codec_info_duration + pkt->duration);
3653 st->info->codec_info_duration += pkt->duration;
3654 st->info->codec_info_duration_fields += st->parser && st->need_parsing && avctx->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3657 #if FF_API_R_FRAME_RATE
3658 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
3659 ff_rfps_add_frame(ic, st, pkt->dts);
3661 if (st->parser && st->parser->parser->split && !avctx->extradata) {
3662 int i = st->parser->parser->split(avctx, pkt->data, pkt->size);
3663 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
3664 avctx->extradata_size = i;
3665 avctx->extradata = av_mallocz(avctx->extradata_size +
3666 AV_INPUT_BUFFER_PADDING_SIZE);
3667 if (!avctx->extradata)
3668 return AVERROR(ENOMEM);
3669 memcpy(avctx->extradata, pkt->data,
3670 avctx->extradata_size);
3674 /* If still no information, we try to open the codec and to
3675 * decompress the frame. We try to avoid that in most cases as
3676 * it takes longer and uses more memory. For MPEG-4, we need to
3677 * decompress for QuickTime.
3679 * If AV_CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3680 * least one frame of codec data, this makes sure the codec initializes
3681 * the channel configuration and does not only trust the values from
3683 try_decode_frame(ic, st, pkt,
3684 (options && i < orig_nb_streams) ? &options[i] : NULL);
3686 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3687 av_packet_unref(pkt);
3689 st->codec_info_nb_frames++;
3695 for (stream_index = 0; stream_index < ic->nb_streams; stream_index++) {
3696 st = ic->streams[stream_index];
3697 avctx = st->internal->avctx;
3698 if (!has_codec_parameters(st, NULL)) {
3699 const AVCodec *codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3700 if (codec && !avctx->codec) {
3701 AVDictionary *opts = NULL;
3702 if (ic->codec_whitelist)
3703 av_dict_set(&opts, "codec_whitelist", ic->codec_whitelist, 0);
3704 if (avcodec_open2(avctx, codec, (options && stream_index < orig_nb_streams) ? &options[stream_index] : &opts) < 0)
3705 av_log(ic, AV_LOG_WARNING,
3706 "Failed to open codec in %s\n",__FUNCTION__);
3707 av_dict_free(&opts);
3711 // EOF already reached while reading the stream above.
3712 // So continue with reoordering DTS with whatever delay we have.
3713 if (ic->internal->packet_buffer && !has_decode_delay_been_guessed(st)) {
3714 update_dts_from_pts(ic, stream_index, ic->internal->packet_buffer);
3720 AVPacket empty_pkt = { 0 };
3722 av_init_packet(&empty_pkt);
3724 for (i = 0; i < ic->nb_streams; i++) {
3726 st = ic->streams[i];
3728 /* flush the decoders */
3729 if (st->info->found_decoder == 1) {
3731 err = try_decode_frame(ic, st, &empty_pkt,
3732 (options && i < orig_nb_streams)
3733 ? &options[i] : NULL);
3734 } while (err > 0 && !has_codec_parameters(st, NULL));
3737 av_log(ic, AV_LOG_INFO,
3738 "decoding for stream %d failed\n", st->index);
3744 // close codecs which were opened in try_decode_frame()
3745 for (i = 0; i < ic->nb_streams; i++) {
3746 st = ic->streams[i];
3747 avcodec_close(st->internal->avctx);
3750 ff_rfps_calculate(ic);
3752 for (i = 0; i < ic->nb_streams; i++) {
3753 st = ic->streams[i];
3754 avctx = st->internal->avctx;
3755 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
3756 if (avctx->codec_id == AV_CODEC_ID_RAWVIDEO && !avctx->codec_tag && !avctx->bits_per_coded_sample) {
3757 uint32_t tag= avcodec_pix_fmt_to_codec_tag(avctx->pix_fmt);
3758 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == avctx->pix_fmt)
3759 avctx->codec_tag= tag;
3762 /* estimate average framerate if not set by demuxer */
3763 if (st->info->codec_info_duration_fields &&
3764 !st->avg_frame_rate.num &&
3765 st->info->codec_info_duration) {
3767 double best_error = 0.01;
3769 if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
3770 st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
3771 st->info->codec_info_duration < 0)
3773 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3774 st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
3775 st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
3777 /* Round guessed framerate to a "standard" framerate if it's
3778 * within 1% of the original estimate. */
3779 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
3780 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
3781 double error = fabs(av_q2d(st->avg_frame_rate) /
3782 av_q2d(std_fps) - 1);
3784 if (error < best_error) {
3786 best_fps = std_fps.num;
3790 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3791 best_fps, 12 * 1001, INT_MAX);
3794 if (!st->r_frame_rate.num) {
3795 if ( avctx->time_base.den * (int64_t) st->time_base.num
3796 <= avctx->time_base.num * avctx->ticks_per_frame * (int64_t) st->time_base.den) {
3797 st->r_frame_rate.num = avctx->time_base.den;
3798 st->r_frame_rate.den = avctx->time_base.num * avctx->ticks_per_frame;
3800 st->r_frame_rate.num = st->time_base.den;
3801 st->r_frame_rate.den = st->time_base.num;
3804 if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
3805 AVRational hw_ratio = { avctx->height, avctx->width };
3806 st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
3809 } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
3810 if (!avctx->bits_per_coded_sample)
3811 avctx->bits_per_coded_sample =
3812 av_get_bits_per_sample(avctx->codec_id);
3813 // set stream disposition based on audio service type
3814 switch (avctx->audio_service_type) {
3815 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
3816 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
3818 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
3819 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
3821 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
3822 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
3824 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
3825 st->disposition = AV_DISPOSITION_COMMENT;
3827 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
3828 st->disposition = AV_DISPOSITION_KARAOKE;
3835 estimate_timings(ic, old_offset);
3837 av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
3839 if (ret >= 0 && ic->nb_streams)
3840 /* We could not have all the codec parameters before EOF. */
3842 for (i = 0; i < ic->nb_streams; i++) {
3844 st = ic->streams[i];
3846 /* if no packet was ever seen, update context now for has_codec_parameters */
3847 if (!st->internal->avctx_inited) {
3848 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
3849 st->codecpar->format == AV_SAMPLE_FMT_NONE)
3850 st->codecpar->format = st->internal->avctx->sample_fmt;
3851 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
3853 goto find_stream_info_err;
3855 if (!has_codec_parameters(st, &errmsg)) {
3857 avcodec_string(buf, sizeof(buf), st->internal->avctx, 0);
3858 av_log(ic, AV_LOG_WARNING,
3859 "Could not find codec parameters for stream %d (%s): %s\n"
3860 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
3867 compute_chapters_end(ic);
3869 /* update the stream parameters from the internal codec contexts */
3870 for (i = 0; i < ic->nb_streams; i++) {
3871 st = ic->streams[i];
3873 if (st->internal->avctx_inited) {
3874 int orig_w = st->codecpar->width;
3875 int orig_h = st->codecpar->height;
3876 ret = avcodec_parameters_from_context(st->codecpar, st->internal->avctx);
3878 goto find_stream_info_err;
3879 // The decoder might reduce the video size by the lowres factor.
3880 if (av_codec_get_lowres(st->internal->avctx) && orig_w) {
3881 st->codecpar->width = orig_w;
3882 st->codecpar->height = orig_h;
3886 #if FF_API_LAVF_AVCTX
3887 FF_DISABLE_DEPRECATION_WARNINGS
3888 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
3890 goto find_stream_info_err;
3892 // The old API (AVStream.codec) "requires" the resolution to be adjusted
3893 // by the lowres factor.
3894 if (av_codec_get_lowres(st->internal->avctx) && st->internal->avctx->width) {
3895 av_codec_set_lowres(st->codec, av_codec_get_lowres(st->internal->avctx));
3896 st->codec->width = st->internal->avctx->width;
3897 st->codec->height = st->internal->avctx->height;
3900 if (st->codec->codec_tag != MKTAG('t','m','c','d')) {
3901 st->codec->time_base = st->internal->avctx->time_base;
3902 st->codec->ticks_per_frame = st->internal->avctx->ticks_per_frame;
3904 st->codec->framerate = st->avg_frame_rate;
3906 if (st->internal->avctx->subtitle_header) {
3907 st->codec->subtitle_header = av_malloc(st->internal->avctx->subtitle_header_size);
3908 if (!st->codec->subtitle_header)
3909 goto find_stream_info_err;
3910 st->codec->subtitle_header_size = st->internal->avctx->subtitle_header_size;
3911 memcpy(st->codec->subtitle_header, st->internal->avctx->subtitle_header,
3912 st->codec->subtitle_header_size);
3915 // Fields unavailable in AVCodecParameters
3916 st->codec->coded_width = st->internal->avctx->coded_width;
3917 st->codec->coded_height = st->internal->avctx->coded_height;
3918 st->codec->properties = st->internal->avctx->properties;
3919 FF_ENABLE_DEPRECATION_WARNINGS
3922 st->internal->avctx_inited = 0;
3925 find_stream_info_err:
3926 for (i = 0; i < ic->nb_streams; i++) {
3927 st = ic->streams[i];
3929 av_freep(&st->info->duration_error);
3930 av_freep(&ic->streams[i]->info);
3933 av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
3934 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
3938 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
3942 for (i = 0; i < ic->nb_programs; i++) {
3943 if (ic->programs[i] == last) {
3947 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
3948 if (ic->programs[i]->stream_index[j] == s)
3949 return ic->programs[i];
3955 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
3956 int wanted_stream_nb, int related_stream,
3957 AVCodec **decoder_ret, int flags)
3959 int i, nb_streams = ic->nb_streams;
3960 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe;
3961 unsigned *program = NULL;
3962 const AVCodec *decoder = NULL, *best_decoder = NULL;
3964 if (related_stream >= 0 && wanted_stream_nb < 0) {
3965 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
3967 program = p->stream_index;
3968 nb_streams = p->nb_stream_indexes;
3971 for (i = 0; i < nb_streams; i++) {
3972 int real_stream_index = program ? program[i] : i;
3973 AVStream *st = ic->streams[real_stream_index];
3974 AVCodecParameters *par = st->codecpar;
3975 if (par->codec_type != type)
3977 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
3979 if (wanted_stream_nb != real_stream_index &&
3980 st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED |
3981 AV_DISPOSITION_VISUAL_IMPAIRED))
3983 if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate))
3986 decoder = find_decoder(ic, st, par->codec_id);
3989 ret = AVERROR_DECODER_NOT_FOUND;
3993 count = st->codec_info_nb_frames;
3994 bitrate = par->bit_rate;
3995 multiframe = FFMIN(5, count);
3996 if ((best_multiframe > multiframe) ||
3997 (best_multiframe == multiframe && best_bitrate > bitrate) ||
3998 (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
4001 best_bitrate = bitrate;
4002 best_multiframe = multiframe;
4003 ret = real_stream_index;
4004 best_decoder = decoder;
4005 if (program && i == nb_streams - 1 && ret < 0) {
4007 nb_streams = ic->nb_streams;
4008 /* no related stream found, try again with everything */
4013 *decoder_ret = (AVCodec*)best_decoder;
4017 /*******************************************************/
4019 int av_read_play(AVFormatContext *s)
4021 if (s->iformat->read_play)
4022 return s->iformat->read_play(s);
4024 return avio_pause(s->pb, 0);
4025 return AVERROR(ENOSYS);
4028 int av_read_pause(AVFormatContext *s)
4030 if (s->iformat->read_pause)
4031 return s->iformat->read_pause(s);
4033 return avio_pause(s->pb, 1);
4034 return AVERROR(ENOSYS);
4037 int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src)
4042 dst->time_base = src->time_base;
4043 dst->nb_frames = src->nb_frames;
4044 dst->disposition = src->disposition;
4045 dst->sample_aspect_ratio = src->sample_aspect_ratio;
4046 dst->avg_frame_rate = src->avg_frame_rate;
4047 dst->r_frame_rate = src->r_frame_rate;
4049 av_dict_free(&dst->metadata);
4050 ret = av_dict_copy(&dst->metadata, src->metadata, 0);
4054 ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
4058 /* Free existing side data*/
4059 for (i = 0; i < dst->nb_side_data; i++)
4060 av_free(dst->side_data[i].data);
4061 av_freep(&dst->side_data);
4062 dst->nb_side_data = 0;
4064 /* Copy side data if present */
4065 if (src->nb_side_data) {
4066 dst->side_data = av_mallocz_array(src->nb_side_data,
4067 sizeof(AVPacketSideData));
4068 if (!dst->side_data)
4069 return AVERROR(ENOMEM);
4070 dst->nb_side_data = src->nb_side_data;
4072 for (i = 0; i < src->nb_side_data; i++) {
4073 uint8_t *data = av_memdup(src->side_data[i].data,
4074 src->side_data[i].size);
4076 return AVERROR(ENOMEM);
4077 dst->side_data[i].type = src->side_data[i].type;
4078 dst->side_data[i].size = src->side_data[i].size;
4079 dst->side_data[i].data = data;
4083 av_freep(&dst->recommended_encoder_configuration);
4084 if (src->recommended_encoder_configuration) {
4085 const char *conf_str = src->recommended_encoder_configuration;
4086 dst->recommended_encoder_configuration = av_strdup(conf_str);
4087 if (!dst->recommended_encoder_configuration)
4088 return AVERROR(ENOMEM);
4094 static void free_stream(AVStream **pst)
4096 AVStream *st = *pst;
4102 for (i = 0; i < st->nb_side_data; i++)
4103 av_freep(&st->side_data[i].data);
4104 av_freep(&st->side_data);
4107 av_parser_close(st->parser);
4109 if (st->attached_pic.data)
4110 av_packet_unref(&st->attached_pic);
4113 avcodec_free_context(&st->internal->avctx);
4114 for (i = 0; i < st->internal->nb_bsfcs; i++) {
4115 av_bsf_free(&st->internal->bsfcs[i]);
4116 av_freep(&st->internal->bsfcs);
4119 av_freep(&st->internal);
4121 av_dict_free(&st->metadata);
4122 avcodec_parameters_free(&st->codecpar);
4123 av_freep(&st->probe_data.buf);
4124 av_freep(&st->index_entries);
4125 #if FF_API_LAVF_AVCTX
4126 FF_DISABLE_DEPRECATION_WARNINGS
4127 av_freep(&st->codec->extradata);
4128 av_freep(&st->codec->subtitle_header);
4129 av_freep(&st->codec);
4130 FF_ENABLE_DEPRECATION_WARNINGS
4132 av_freep(&st->priv_data);
4134 av_freep(&st->info->duration_error);
4135 av_freep(&st->info);
4136 av_freep(&st->recommended_encoder_configuration);
4137 av_freep(&st->priv_pts);
4142 void ff_free_stream(AVFormatContext *s, AVStream *st)
4144 av_assert0(s->nb_streams>0);
4145 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
4147 free_stream(&s->streams[ --s->nb_streams ]);
4150 void avformat_free_context(AVFormatContext *s)
4158 if (s->iformat && s->iformat->priv_class && s->priv_data)
4159 av_opt_free(s->priv_data);
4160 if (s->oformat && s->oformat->priv_class && s->priv_data)
4161 av_opt_free(s->priv_data);
4163 for (i = s->nb_streams - 1; i >= 0; i--)
4164 ff_free_stream(s, s->streams[i]);
4167 for (i = s->nb_programs - 1; i >= 0; i--) {
4168 av_dict_free(&s->programs[i]->metadata);
4169 av_freep(&s->programs[i]->stream_index);
4170 av_freep(&s->programs[i]);
4172 av_freep(&s->programs);
4173 av_freep(&s->priv_data);
4174 while (s->nb_chapters--) {
4175 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
4176 av_freep(&s->chapters[s->nb_chapters]);
4178 av_freep(&s->chapters);
4179 av_dict_free(&s->metadata);
4180 av_freep(&s->streams);
4181 av_freep(&s->internal);
4182 flush_packet_queue(s);
4186 void avformat_close_input(AVFormatContext **ps)
4197 if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
4198 (s->flags & AVFMT_FLAG_CUSTOM_IO))
4201 flush_packet_queue(s);
4204 if (s->iformat->read_close)
4205 s->iformat->read_close(s);
4207 avformat_free_context(s);
4214 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
4220 if (s->nb_streams >= INT_MAX/sizeof(*streams))
4222 streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
4225 s->streams = streams;
4227 st = av_mallocz(sizeof(AVStream));
4230 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
4234 st->info->last_dts = AV_NOPTS_VALUE;
4236 #if FF_API_LAVF_AVCTX
4237 FF_DISABLE_DEPRECATION_WARNINGS
4238 st->codec = avcodec_alloc_context3(c);
4244 FF_ENABLE_DEPRECATION_WARNINGS
4247 st->internal = av_mallocz(sizeof(*st->internal));
4251 st->codecpar = avcodec_parameters_alloc();
4255 st->internal->avctx = avcodec_alloc_context3(NULL);
4256 if (!st->internal->avctx)
4260 #if FF_API_LAVF_AVCTX
4261 FF_DISABLE_DEPRECATION_WARNINGS
4262 /* no default bitrate if decoding */
4263 st->codec->bit_rate = 0;
4264 FF_ENABLE_DEPRECATION_WARNINGS
4267 /* default pts setting is MPEG-like */
4268 avpriv_set_pts_info(st, 33, 1, 90000);
4269 /* we set the current DTS to 0 so that formats without any timestamps
4270 * but durations get some timestamps, formats with some unknown
4271 * timestamps have their first few packets buffered and the
4272 * timestamps corrected before they are returned to the user */
4273 st->cur_dts = RELATIVE_TS_BASE;
4275 st->cur_dts = AV_NOPTS_VALUE;
4278 st->index = s->nb_streams;
4279 st->start_time = AV_NOPTS_VALUE;
4280 st->duration = AV_NOPTS_VALUE;
4281 st->first_dts = AV_NOPTS_VALUE;
4282 st->probe_packets = MAX_PROBE_PACKETS;
4283 st->pts_wrap_reference = AV_NOPTS_VALUE;
4284 st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4286 st->last_IP_pts = AV_NOPTS_VALUE;
4287 st->last_dts_for_order_check = AV_NOPTS_VALUE;
4288 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
4289 st->pts_buffer[i] = AV_NOPTS_VALUE;
4291 st->sample_aspect_ratio = (AVRational) { 0, 1 };
4293 #if FF_API_R_FRAME_RATE
4294 st->info->last_dts = AV_NOPTS_VALUE;
4296 st->info->fps_first_dts = AV_NOPTS_VALUE;
4297 st->info->fps_last_dts = AV_NOPTS_VALUE;
4299 st->inject_global_side_data = s->internal->inject_global_side_data;
4301 st->internal->need_context_update = 1;
4303 s->streams[s->nb_streams++] = st;
4310 AVProgram *av_new_program(AVFormatContext *ac, int id)
4312 AVProgram *program = NULL;
4315 av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
4317 for (i = 0; i < ac->nb_programs; i++)
4318 if (ac->programs[i]->id == id)
4319 program = ac->programs[i];
4322 program = av_mallocz(sizeof(AVProgram));
4325 dynarray_add(&ac->programs, &ac->nb_programs, program);
4326 program->discard = AVDISCARD_NONE;
4329 program->pts_wrap_reference = AV_NOPTS_VALUE;
4330 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4332 program->start_time =
4333 program->end_time = AV_NOPTS_VALUE;
4338 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
4339 int64_t start, int64_t end, const char *title)
4341 AVChapter *chapter = NULL;
4344 if (end != AV_NOPTS_VALUE && start > end) {
4345 av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
4349 for (i = 0; i < s->nb_chapters; i++)
4350 if (s->chapters[i]->id == id)
4351 chapter = s->chapters[i];
4354 chapter = av_mallocz(sizeof(AVChapter));
4357 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
4359 av_dict_set(&chapter->metadata, "title", title, 0);
4361 chapter->time_base = time_base;
4362 chapter->start = start;
4368 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
4371 AVProgram *program = NULL;
4374 if (idx >= ac->nb_streams) {
4375 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
4379 for (i = 0; i < ac->nb_programs; i++) {
4380 if (ac->programs[i]->id != progid)
4382 program = ac->programs[i];
4383 for (j = 0; j < program->nb_stream_indexes; j++)
4384 if (program->stream_index[j] == idx)
4387 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
4390 program->stream_index = tmp;
4391 program->stream_index[program->nb_stream_indexes++] = idx;
4396 uint64_t ff_ntp_time(void)
4398 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
4401 int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags)
4404 char *q, buf1[20], c;
4405 int nd, len, percentd_found;
4417 while (av_isdigit(*p))
4418 nd = nd * 10 + *p++ - '0';
4420 } while (av_isdigit(c));
4426 if (!(flags & AV_FRAME_FILENAME_FLAGS_MULTIPLE) && percentd_found)
4431 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
4433 if ((q - buf + len) > buf_size - 1)
4435 memcpy(q, buf1, len);
4443 if ((q - buf) < buf_size - 1)
4447 if (!percentd_found)
4456 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
4458 return av_get_frame_filename2(buf, buf_size, path, number, 0);
4461 void av_url_split(char *proto, int proto_size,
4462 char *authorization, int authorization_size,
4463 char *hostname, int hostname_size,
4464 int *port_ptr, char *path, int path_size, const char *url)
4466 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
4472 if (authorization_size > 0)
4473 authorization[0] = 0;
4474 if (hostname_size > 0)
4479 /* parse protocol */
4480 if ((p = strchr(url, ':'))) {
4481 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4488 /* no protocol means plain filename */
4489 av_strlcpy(path, url, path_size);
4493 /* separate path from hostname */
4494 ls = strchr(p, '/');
4495 ls2 = strchr(p, '?');
4499 ls = FFMIN(ls, ls2);
4501 av_strlcpy(path, ls, path_size);
4503 ls = &p[strlen(p)]; // XXX
4505 /* the rest is hostname, use that to parse auth/port */
4507 /* authorization (user[:pass]@hostname) */
4509 while ((at = strchr(p, '@')) && at < ls) {
4510 av_strlcpy(authorization, at2,
4511 FFMIN(authorization_size, at + 1 - at2));
4512 p = at + 1; /* skip '@' */
4515 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4517 av_strlcpy(hostname, p + 1,
4518 FFMIN(hostname_size, brk - p));
4519 if (brk[1] == ':' && port_ptr)
4520 *port_ptr = atoi(brk + 2);
4521 } else if ((col = strchr(p, ':')) && col < ls) {
4522 av_strlcpy(hostname, p,
4523 FFMIN(col + 1 - p, hostname_size));
4525 *port_ptr = atoi(col + 1);
4527 av_strlcpy(hostname, p,
4528 FFMIN(ls + 1 - p, hostname_size));
4532 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4535 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4538 'C', 'D', 'E', 'F' };
4539 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4542 'c', 'd', 'e', 'f' };
4543 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4545 for (i = 0; i < s; i++) {
4546 buff[i * 2] = hex_table[src[i] >> 4];
4547 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4553 int ff_hex_to_data(uint8_t *data, const char *p)
4560 p += strspn(p, SPACE_CHARS);
4563 c = av_toupper((unsigned char) *p++);
4564 if (c >= '0' && c <= '9')
4566 else if (c >= 'A' && c <= 'F')
4581 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4582 unsigned int pts_num, unsigned int pts_den)
4585 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
4586 if (new_tb.num != pts_num)
4587 av_log(NULL, AV_LOG_DEBUG,
4588 "st:%d removing common factor %d from timebase\n",
4589 s->index, pts_num / new_tb.num);
4591 av_log(NULL, AV_LOG_WARNING,
4592 "st:%d has too large timebase, reducing\n", s->index);
4594 if (new_tb.num <= 0 || new_tb.den <= 0) {
4595 av_log(NULL, AV_LOG_ERROR,
4596 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4597 new_tb.num, new_tb.den,
4601 s->time_base = new_tb;
4602 #if FF_API_LAVF_AVCTX
4603 FF_DISABLE_DEPRECATION_WARNINGS
4604 av_codec_set_pkt_timebase(s->codec, new_tb);
4605 FF_ENABLE_DEPRECATION_WARNINGS
4607 av_codec_set_pkt_timebase(s->internal->avctx, new_tb);
4608 s->pts_wrap_bits = pts_wrap_bits;
4611 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4614 const char *ptr = str;
4616 /* Parse key=value pairs. */
4619 char *dest = NULL, *dest_end;
4620 int key_len, dest_len = 0;
4622 /* Skip whitespace and potential commas. */
4623 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4630 if (!(ptr = strchr(key, '=')))
4633 key_len = ptr - key;
4635 callback_get_buf(context, key, key_len, &dest, &dest_len);
4636 dest_end = dest + dest_len - 1;
4640 while (*ptr && *ptr != '\"') {
4644 if (dest && dest < dest_end)
4648 if (dest && dest < dest_end)
4656 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
4657 if (dest && dest < dest_end)
4665 int ff_find_stream_index(AVFormatContext *s, int id)
4668 for (i = 0; i < s->nb_streams; i++)
4669 if (s->streams[i]->id == id)
4674 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
4678 unsigned int codec_tag;
4679 if (ofmt->query_codec)
4680 return ofmt->query_codec(codec_id, std_compliance);
4681 else if (ofmt->codec_tag)
4682 return !!av_codec_get_tag2(ofmt->codec_tag, codec_id, &codec_tag);
4683 else if (codec_id == ofmt->video_codec ||
4684 codec_id == ofmt->audio_codec ||
4685 codec_id == ofmt->subtitle_codec ||
4686 codec_id == ofmt->data_codec)
4689 return AVERROR_PATCHWELCOME;
4692 int avformat_network_init(void)
4696 ff_network_inited_globally = 1;
4697 if ((ret = ff_network_init()) < 0)
4699 if ((ret = ff_tls_init()) < 0)
4705 int avformat_network_deinit(void)
4710 ff_network_inited_globally = 0;
4715 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4716 uint64_t channel_layout, int32_t sample_rate,
4717 int32_t width, int32_t height)
4723 return AVERROR(EINVAL);
4726 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4728 if (channel_layout) {
4730 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4734 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4736 if (width || height) {
4738 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4740 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4742 return AVERROR(ENOMEM);
4743 bytestream_put_le32(&data, flags);
4745 bytestream_put_le32(&data, channels);
4747 bytestream_put_le64(&data, channel_layout);
4749 bytestream_put_le32(&data, sample_rate);
4750 if (width || height) {
4751 bytestream_put_le32(&data, width);
4752 bytestream_put_le32(&data, height);
4757 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
4759 AVRational undef = {0, 1};
4760 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
4761 AVRational codec_sample_aspect_ratio = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
4762 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
4764 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
4765 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
4766 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
4767 stream_sample_aspect_ratio = undef;
4769 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
4770 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
4771 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
4772 frame_sample_aspect_ratio = undef;
4774 if (stream_sample_aspect_ratio.num)
4775 return stream_sample_aspect_ratio;
4777 return frame_sample_aspect_ratio;
4780 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
4782 AVRational fr = st->r_frame_rate;
4783 AVRational codec_fr = st->internal->avctx->framerate;
4784 AVRational avg_fr = st->avg_frame_rate;
4786 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
4787 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
4792 if (st->internal->avctx->ticks_per_frame > 1) {
4793 if ( codec_fr.num > 0 && codec_fr.den > 0 &&
4794 (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))
4801 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
4804 if (*spec <= '9' && *spec >= '0') /* opt:index */
4805 return strtol(spec, NULL, 0) == st->index;
4806 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
4807 *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
4808 enum AVMediaType type;
4812 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
4813 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
4814 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
4815 case 'd': type = AVMEDIA_TYPE_DATA; break;
4816 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
4817 case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
4818 default: av_assert0(0);
4820 #if FF_API_LAVF_AVCTX
4821 FF_DISABLE_DEPRECATION_WARNINGS
4822 if (type != st->codecpar->codec_type
4823 && (st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN || st->codec->codec_type != type))
4825 FF_ENABLE_DEPRECATION_WARNINGS
4827 if (type != st->codecpar->codec_type)
4830 if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
4832 if (*spec++ == ':') { /* possibly followed by :index */
4833 int i, index = strtol(spec, NULL, 0);
4834 for (i = 0; i < s->nb_streams; i++) {
4835 #if FF_API_LAVF_AVCTX
4836 FF_DISABLE_DEPRECATION_WARNINGS
4837 if ((s->streams[i]->codecpar->codec_type == type
4838 || s->streams[i]->codec->codec_type == type
4840 !(nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) &&
4842 return i == st->index;
4843 FF_ENABLE_DEPRECATION_WARNINGS
4845 if ((s->streams[i]->codecpar->codec_type == type) &&
4846 !(nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) &&
4848 return i == st->index;
4854 } else if (*spec == 'p' && *(spec + 1) == ':') {
4858 prog_id = strtol(spec, &endptr, 0);
4859 for (i = 0; i < s->nb_programs; i++) {
4860 if (s->programs[i]->id != prog_id)
4863 if (*endptr++ == ':') {
4864 int stream_idx = strtol(endptr, NULL, 0);
4865 return stream_idx >= 0 &&
4866 stream_idx < s->programs[i]->nb_stream_indexes &&
4867 st->index == s->programs[i]->stream_index[stream_idx];
4870 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
4871 if (st->index == s->programs[i]->stream_index[j])
4875 } else if (*spec == '#' ||
4876 (*spec == 'i' && *(spec + 1) == ':')) {
4879 spec += 1 + (*spec == 'i');
4880 stream_id = strtol(spec, &endptr, 0);
4882 return stream_id == st->id;
4883 } else if (*spec == 'm' && *(spec + 1) == ':') {
4884 AVDictionaryEntry *tag;
4889 val = strchr(spec, ':');
4891 key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
4893 return AVERROR(ENOMEM);
4895 tag = av_dict_get(st->metadata, key, NULL, 0);
4897 if (!val || !strcmp(tag->value, val + 1))
4906 } else if (*spec == 'u') {
4907 AVCodecParameters *par = st->codecpar;
4908 #if FF_API_LAVF_AVCTX
4909 FF_DISABLE_DEPRECATION_WARNINGS
4910 AVCodecContext *codec = st->codec;
4911 FF_ENABLE_DEPRECATION_WARNINGS
4914 switch (par->codec_type) {
4915 case AVMEDIA_TYPE_AUDIO:
4916 val = par->sample_rate && par->channels;
4917 #if FF_API_LAVF_AVCTX
4918 val = val || (codec->sample_rate && codec->channels);
4920 if (par->format == AV_SAMPLE_FMT_NONE
4921 #if FF_API_LAVF_AVCTX
4922 && codec->sample_fmt == AV_SAMPLE_FMT_NONE
4927 case AVMEDIA_TYPE_VIDEO:
4928 val = par->width && par->height;
4929 #if FF_API_LAVF_AVCTX
4930 val = val || (codec->width && codec->height);
4932 if (par->format == AV_PIX_FMT_NONE
4933 #if FF_API_LAVF_AVCTX
4934 && codec->pix_fmt == AV_PIX_FMT_NONE
4939 case AVMEDIA_TYPE_UNKNOWN:
4946 #if FF_API_LAVF_AVCTX
4947 return (par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0;
4949 return par->codec_id != AV_CODEC_ID_NONE && val != 0;
4951 } else if (!*spec) /* empty specifier, matches everything */
4954 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
4955 return AVERROR(EINVAL);
4958 int ff_generate_avci_extradata(AVStream *st)
4960 static const uint8_t avci100_1080p_extradata[] = {
4962 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4963 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4964 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4965 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
4966 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
4967 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
4968 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
4969 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
4970 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4972 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4975 static const uint8_t avci100_1080i_extradata[] = {
4977 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4978 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4979 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4980 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
4981 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
4982 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
4983 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
4984 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
4985 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
4986 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
4987 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
4989 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4992 static const uint8_t avci50_1080p_extradata[] = {
4994 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4995 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4996 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4997 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
4998 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
4999 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
5000 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
5001 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
5002 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
5004 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5007 static const uint8_t avci50_1080i_extradata[] = {
5009 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5010 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5011 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5012 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
5013 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
5014 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
5015 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
5016 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
5017 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
5018 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
5019 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
5021 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5024 static const uint8_t avci100_720p_extradata[] = {
5026 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5027 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
5028 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
5029 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
5030 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
5031 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
5032 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
5033 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
5034 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
5035 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
5037 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
5040 static const uint8_t avci50_720p_extradata[] = {
5042 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
5043 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5044 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5045 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5046 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5047 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
5048 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
5049 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
5050 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
5052 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5056 const uint8_t *data = NULL;
5059 if (st->codecpar->width == 1920) {
5060 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5061 data = avci100_1080p_extradata;
5062 size = sizeof(avci100_1080p_extradata);
5064 data = avci100_1080i_extradata;
5065 size = sizeof(avci100_1080i_extradata);
5067 } else if (st->codecpar->width == 1440) {
5068 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5069 data = avci50_1080p_extradata;
5070 size = sizeof(avci50_1080p_extradata);
5072 data = avci50_1080i_extradata;
5073 size = sizeof(avci50_1080i_extradata);
5075 } else if (st->codecpar->width == 1280) {
5076 data = avci100_720p_extradata;
5077 size = sizeof(avci100_720p_extradata);
5078 } else if (st->codecpar->width == 960) {
5079 data = avci50_720p_extradata;
5080 size = sizeof(avci50_720p_extradata);
5086 av_freep(&st->codecpar->extradata);
5087 if (ff_alloc_extradata(st->codecpar, size))
5088 return AVERROR(ENOMEM);
5089 memcpy(st->codecpar->extradata, data, size);
5094 #if FF_API_NOCONST_GET_SIDE_DATA
5095 uint8_t *av_stream_get_side_data(AVStream *st,
5096 enum AVPacketSideDataType type, int *size)
5098 uint8_t *av_stream_get_side_data(const AVStream *st,
5099 enum AVPacketSideDataType type, int *size)
5104 for (i = 0; i < st->nb_side_data; i++) {
5105 if (st->side_data[i].type == type) {
5107 *size = st->side_data[i].size;
5108 return st->side_data[i].data;
5114 int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
5115 uint8_t *data, size_t size)
5117 AVPacketSideData *sd, *tmp;
5120 for (i = 0; i < st->nb_side_data; i++) {
5121 sd = &st->side_data[i];
5123 if (sd->type == type) {
5124 av_freep(&sd->data);
5131 if ((unsigned)st->nb_side_data + 1 >= INT_MAX / sizeof(*st->side_data))
5132 return AVERROR(ERANGE);
5134 tmp = av_realloc(st->side_data, (st->nb_side_data + 1) * sizeof(*tmp));
5136 return AVERROR(ENOMEM);
5139 st->side_data = tmp;
5142 sd = &st->side_data[st->nb_side_data - 1];
5150 uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
5154 uint8_t *data = av_malloc(size);
5159 ret = av_stream_add_side_data(st, type, data, size);
5168 int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
5171 const AVBitStreamFilter *bsf;
5173 AVCodecParameters *in_par;
5175 if (!(bsf = av_bsf_get_by_name(name))) {
5176 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter '%s'\n", name);
5177 return AVERROR_BSF_NOT_FOUND;
5180 if ((ret = av_bsf_alloc(bsf, &bsfc)) < 0)
5183 if (st->internal->nb_bsfcs) {
5184 in_par = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->par_out;
5185 bsfc->time_base_in = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->time_base_out;
5187 in_par = st->codecpar;
5188 bsfc->time_base_in = st->time_base;
5191 if ((ret = avcodec_parameters_copy(bsfc->par_in, in_par)) < 0) {
5196 if (args && bsfc->filter->priv_class) {
5197 const AVOption *opt = av_opt_next(bsfc->priv_data, NULL);
5198 const char * shorthand[2] = {NULL};
5201 shorthand[0] = opt->name;
5203 if ((ret = av_opt_set_from_string(bsfc->priv_data, args, shorthand, "=", ":")) < 0) {
5209 if ((ret = av_bsf_init(bsfc)) < 0) {
5214 if ((ret = av_dynarray_add_nofree(&st->internal->bsfcs, &st->internal->nb_bsfcs, bsfc))) {
5219 av_log(NULL, AV_LOG_VERBOSE,
5220 "Automatically inserted bitstream filter '%s'; args='%s'\n",
5221 name, args ? args : "");
5226 FF_DISABLE_DEPRECATION_WARNINGS
5227 int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt,
5228 AVBitStreamFilterContext *bsfc)
5232 AVPacket new_pkt = *pkt;
5233 int a = av_bitstream_filter_filter(bsfc, codec, NULL,
5234 &new_pkt.data, &new_pkt.size,
5235 pkt->data, pkt->size,
5236 pkt->flags & AV_PKT_FLAG_KEY);
5237 if (a == 0 && new_pkt.size == 0 && new_pkt.side_data_elems == 0) {
5238 av_packet_unref(pkt);
5239 memset(pkt, 0, sizeof(*pkt));
5242 if(a == 0 && new_pkt.data != pkt->data) {
5243 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
5245 memcpy(t, new_pkt.data, new_pkt.size);
5246 memset(t + new_pkt.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
5251 a = AVERROR(ENOMEM);
5255 new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
5256 av_buffer_default_free, NULL, 0);
5258 pkt->side_data = NULL;
5259 pkt->side_data_elems = 0;
5260 av_packet_unref(pkt);
5262 av_freep(&new_pkt.data);
5263 a = AVERROR(ENOMEM);
5267 av_log(codec, AV_LOG_ERROR,
5268 "Failed to open bitstream filter %s for stream %d with codec %s",
5269 bsfc->filter->name, pkt->stream_index,
5270 codec->codec ? codec->codec->name : "copy");
5280 FF_ENABLE_DEPRECATION_WARNINGS
5283 int ff_format_output_open(AVFormatContext *s, const char *url, AVDictionary **options)
5286 return AVERROR(EINVAL);
5288 if (!(s->oformat->flags & AVFMT_NOFILE))
5289 return s->io_open(s, &s->pb, url, AVIO_FLAG_WRITE, options);
5293 void ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
5296 s->io_close(s, *pb);
5300 int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
5302 AVDictionaryEntry *entry;
5303 int64_t parsed_timestamp;
5305 if ((entry = av_dict_get(s->metadata, "creation_time", NULL, 0))) {
5306 if ((ret = av_parse_time(&parsed_timestamp, entry->value, 0)) >= 0) {
5307 *timestamp = return_seconds ? parsed_timestamp / 1000000 : parsed_timestamp;
5310 av_log(s, AV_LOG_WARNING, "Failed to parse creation_time %s\n", entry->value);
5317 int ff_standardize_creation_time(AVFormatContext *s)
5320 int ret = ff_parse_creation_time_metadata(s, ×tamp, 0);
5322 return avpriv_dict_set_timestamp(&s->metadata, "creation_time", timestamp);
5326 int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette)
5331 side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &size);
5333 if (size != AVPALETTE_SIZE) {
5334 av_log(s, AV_LOG_ERROR, "Invalid palette side data\n");
5335 return AVERROR_INVALIDDATA;
5337 memcpy(palette, side_data, AVPALETTE_SIZE);
5341 if (ret == CONTAINS_PAL) {
5343 for (i = 0; i < AVPALETTE_COUNT; i++)
5344 palette[i] = AV_RL32(pkt->data + pkt->size - AVPALETTE_SIZE + i*4);
5351 int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf)
5356 ret = av_bprint_finalize(buf, &str);
5359 if (!av_bprint_is_complete(buf)) {
5361 return AVERROR(ENOMEM);
5364 par->extradata = str;
5365 /* Note: the string is NUL terminated (so extradata can be read as a
5366 * string), but the ending character is not accounted in the size (in
5367 * binary formats you are likely not supposed to mux that character). When
5368 * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE
5370 par->extradata_size = buf->len;
5374 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
5375 AVStream *ost, const AVStream *ist,
5376 enum AVTimebaseSource copy_tb)
5378 //TODO: use [io]st->internal->avctx
5379 const AVCodecContext *dec_ctx = ist->codec;
5380 AVCodecContext *enc_ctx = ost->codec;
5382 enc_ctx->time_base = ist->time_base;
5384 * Avi is a special case here because it supports variable fps but
5385 * having the fps and timebase differe significantly adds quite some
5388 if (!strcmp(ofmt->name, "avi")) {
5389 #if FF_API_R_FRAME_RATE
5390 if (copy_tb == AVFMT_TBCF_AUTO && ist->r_frame_rate.num
5391 && av_q2d(ist->r_frame_rate) >= av_q2d(ist->avg_frame_rate)
5392 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(ist->time_base)
5393 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx->time_base)
5394 && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx->time_base) < 1.0/500
5395 || copy_tb == AVFMT_TBCF_R_FRAMERATE) {
5396 enc_ctx->time_base.num = ist->r_frame_rate.den;
5397 enc_ctx->time_base.den = 2*ist->r_frame_rate.num;
5398 enc_ctx->ticks_per_frame = 2;
5401 if (copy_tb == AVFMT_TBCF_AUTO && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > 2*av_q2d(ist->time_base)
5402 && av_q2d(ist->time_base) < 1.0/500
5403 || copy_tb == AVFMT_TBCF_DECODER) {
5404 enc_ctx->time_base = dec_ctx->time_base;
5405 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5406 enc_ctx->time_base.den *= 2;
5407 enc_ctx->ticks_per_frame = 2;
5409 } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS)
5410 && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
5411 if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx->time_base.den
5412 && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > av_q2d(ist->time_base)
5413 && av_q2d(ist->time_base) < 1.0/500
5414 || copy_tb == AVFMT_TBCF_DECODER) {
5415 enc_ctx->time_base = dec_ctx->time_base;
5416 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5420 if ((enc_ctx->codec_tag == AV_RL32("tmcd") || ost->codecpar->codec_tag == AV_RL32("tmcd"))
5421 && dec_ctx->time_base.num < dec_ctx->time_base.den
5422 && dec_ctx->time_base.num > 0
5423 && 121LL*dec_ctx->time_base.num > dec_ctx->time_base.den) {
5424 enc_ctx->time_base = dec_ctx->time_base;
5427 if (ost->avg_frame_rate.num)
5428 enc_ctx->time_base = av_inv_q(ost->avg_frame_rate);
5430 av_reduce(&enc_ctx->time_base.num, &enc_ctx->time_base.den,
5431 enc_ctx->time_base.num, enc_ctx->time_base.den, INT_MAX);
5436 AVRational av_stream_get_codec_timebase(const AVStream *st)
5438 // See avformat_transfer_internal_stream_timing_info() TODO.
5439 #if FF_API_LAVF_AVCTX
5440 FF_DISABLE_DEPRECATION_WARNINGS
5441 return st->codec->time_base;
5442 FF_ENABLE_DEPRECATION_WARNINGS
5444 return st->internal->avctx->time_base;