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 /* update internal codec context, for the parser */
484 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
488 #if FF_API_LAVF_AVCTX
489 FF_DISABLE_DEPRECATION_WARNINGS
490 /* update deprecated public codec context */
491 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
494 FF_ENABLE_DEPRECATION_WARNINGS
497 st->internal->need_context_update = 0;
503 int avformat_open_input(AVFormatContext **ps, const char *filename,
504 AVInputFormat *fmt, AVDictionary **options)
506 AVFormatContext *s = *ps;
508 AVDictionary *tmp = NULL;
509 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
511 if (!s && !(s = avformat_alloc_context()))
512 return AVERROR(ENOMEM);
514 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
515 return AVERROR(EINVAL);
521 av_dict_copy(&tmp, *options, 0);
523 if (s->pb) // must be before any goto fail
524 s->flags |= AVFMT_FLAG_CUSTOM_IO;
526 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
529 if ((ret = init_input(s, filename, &tmp)) < 0)
531 s->probe_score = ret;
533 if (!s->protocol_whitelist && s->pb && s->pb->protocol_whitelist) {
534 s->protocol_whitelist = av_strdup(s->pb->protocol_whitelist);
535 if (!s->protocol_whitelist) {
536 ret = AVERROR(ENOMEM);
541 if (!s->protocol_blacklist && s->pb && s->pb->protocol_blacklist) {
542 s->protocol_blacklist = av_strdup(s->pb->protocol_blacklist);
543 if (!s->protocol_blacklist) {
544 ret = AVERROR(ENOMEM);
549 if (s->format_whitelist && av_match_list(s->iformat->name, s->format_whitelist, ',') <= 0) {
550 av_log(s, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", s->format_whitelist);
551 ret = AVERROR(EINVAL);
555 avio_skip(s->pb, s->skip_initial_bytes);
557 /* Check filename in case an image number is expected. */
558 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
559 if (!av_filename_number_test(filename)) {
560 ret = AVERROR(EINVAL);
565 s->duration = s->start_time = AV_NOPTS_VALUE;
566 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
568 /* Allocate private data. */
569 if (s->iformat->priv_data_size > 0) {
570 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
571 ret = AVERROR(ENOMEM);
574 if (s->iformat->priv_class) {
575 *(const AVClass **) s->priv_data = s->iformat->priv_class;
576 av_opt_set_defaults(s->priv_data);
577 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
582 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
584 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, 0);
586 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
587 if ((ret = s->iformat->read_header(s)) < 0)
590 if (id3v2_extra_meta) {
591 if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
592 !strcmp(s->iformat->name, "tta")) {
593 if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
596 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
598 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
600 if ((ret = avformat_queue_attached_pictures(s)) < 0)
603 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
604 s->internal->data_offset = avio_tell(s->pb);
606 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
608 update_stream_avctx(s);
610 for (i = 0; i < s->nb_streams; i++)
611 s->streams[i]->internal->orig_codec_id = s->streams[i]->codecpar->codec_id;
614 av_dict_free(options);
621 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
623 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
625 avformat_free_context(s);
630 /*******************************************************/
632 static void force_codec_ids(AVFormatContext *s, AVStream *st)
634 switch (st->codecpar->codec_type) {
635 case AVMEDIA_TYPE_VIDEO:
636 if (s->video_codec_id)
637 st->codecpar->codec_id = s->video_codec_id;
639 case AVMEDIA_TYPE_AUDIO:
640 if (s->audio_codec_id)
641 st->codecpar->codec_id = s->audio_codec_id;
643 case AVMEDIA_TYPE_SUBTITLE:
644 if (s->subtitle_codec_id)
645 st->codecpar->codec_id = s->subtitle_codec_id;
647 case AVMEDIA_TYPE_DATA:
648 if (s->data_codec_id)
649 st->codecpar->codec_id = s->data_codec_id;
654 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
656 if (st->request_probe>0) {
657 AVProbeData *pd = &st->probe_data;
659 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
663 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
665 av_log(s, AV_LOG_WARNING,
666 "Failed to reallocate probe buffer for stream %d\n",
671 memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
672 pd->buf_size += pkt->size;
673 memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
676 st->probe_packets = 0;
678 av_log(s, AV_LOG_WARNING,
679 "nothing to probe for stream %d\n", st->index);
683 end= s->internal->raw_packet_buffer_remaining_size <= 0
684 || st->probe_packets<= 0;
686 if (end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
687 int score = set_codec_from_probe_data(s, st, pd);
688 if ( (st->codecpar->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
692 st->request_probe = -1;
693 if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
694 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
696 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
698 force_codec_ids(s, st);
704 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
706 int64_t ref = pkt->dts;
707 int i, pts_wrap_behavior;
708 int64_t pts_wrap_reference;
709 AVProgram *first_program;
711 if (ref == AV_NOPTS_VALUE)
713 if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
715 ref &= (1LL << st->pts_wrap_bits)-1;
717 // reference time stamp should be 60 s before first time stamp
718 pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
719 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
720 pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
721 (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
722 AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
724 first_program = av_find_program_from_stream(s, NULL, stream_index);
726 if (!first_program) {
727 int default_stream_index = av_find_default_stream_index(s);
728 if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
729 for (i = 0; i < s->nb_streams; i++) {
730 if (av_find_program_from_stream(s, NULL, i))
732 s->streams[i]->pts_wrap_reference = pts_wrap_reference;
733 s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
737 st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
738 st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
742 AVProgram *program = first_program;
744 if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
745 pts_wrap_reference = program->pts_wrap_reference;
746 pts_wrap_behavior = program->pts_wrap_behavior;
749 program = av_find_program_from_stream(s, program, stream_index);
752 // update every program with differing pts_wrap_reference
753 program = first_program;
755 if (program->pts_wrap_reference != pts_wrap_reference) {
756 for (i = 0; i<program->nb_stream_indexes; i++) {
757 s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
758 s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
761 program->pts_wrap_reference = pts_wrap_reference;
762 program->pts_wrap_behavior = pts_wrap_behavior;
764 program = av_find_program_from_stream(s, program, stream_index);
770 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
776 AVPacketList *pktl = s->internal->raw_packet_buffer;
780 st = s->streams[pkt->stream_index];
781 if (s->internal->raw_packet_buffer_remaining_size <= 0)
782 if ((err = probe_codec(s, st, NULL)) < 0)
784 if (st->request_probe <= 0) {
785 s->internal->raw_packet_buffer = pktl->next;
786 s->internal->raw_packet_buffer_remaining_size += pkt->size;
795 ret = s->iformat->read_packet(s, pkt);
797 /* Some demuxers return FFERROR_REDO when they consume
798 data and discard it (ignored streams, junk, extradata).
799 We must re-call the demuxer to get the real packet. */
800 if (ret == FFERROR_REDO)
802 if (!pktl || ret == AVERROR(EAGAIN))
804 for (i = 0; i < s->nb_streams; i++) {
806 if (st->probe_packets)
807 if ((err = probe_codec(s, st, NULL)) < 0)
809 av_assert0(st->request_probe <= 0);
815 AVPacket tmp = { 0 };
816 ret = av_packet_ref(&tmp, pkt);
822 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
823 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
824 av_log(s, AV_LOG_WARNING,
825 "Dropped corrupted packet (stream = %d)\n",
827 av_packet_unref(pkt);
831 if (pkt->stream_index >= (unsigned)s->nb_streams) {
832 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
836 st = s->streams[pkt->stream_index];
838 if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
839 // correct first time stamps to negative values
840 if (!is_relative(st->first_dts))
841 st->first_dts = wrap_timestamp(st, st->first_dts);
842 if (!is_relative(st->start_time))
843 st->start_time = wrap_timestamp(st, st->start_time);
844 if (!is_relative(st->cur_dts))
845 st->cur_dts = wrap_timestamp(st, st->cur_dts);
848 pkt->dts = wrap_timestamp(st, pkt->dts);
849 pkt->pts = wrap_timestamp(st, pkt->pts);
851 force_codec_ids(s, st);
853 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
854 if (s->use_wallclock_as_timestamps)
855 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
857 if (!pktl && st->request_probe <= 0)
860 err = add_to_pktbuf(&s->internal->raw_packet_buffer, pkt,
861 &s->internal->raw_packet_buffer_end, 0);
864 s->internal->raw_packet_buffer_remaining_size -= pkt->size;
866 if ((err = probe_codec(s, st, pkt)) < 0)
872 /**********************************************************/
874 static int determinable_frame_size(AVCodecContext *avctx)
876 if (/*avctx->codec_id == AV_CODEC_ID_AAC ||*/
877 avctx->codec_id == AV_CODEC_ID_MP1 ||
878 avctx->codec_id == AV_CODEC_ID_MP2 ||
879 avctx->codec_id == AV_CODEC_ID_MP3/* ||
880 avctx->codec_id == AV_CODEC_ID_CELT*/)
886 * Return the frame duration in seconds. Return 0 if not available.
888 void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
889 AVCodecParserContext *pc, AVPacket *pkt)
891 AVRational codec_framerate = s->iformat ? st->internal->avctx->framerate :
892 av_mul_q(av_inv_q(st->internal->avctx->time_base), (AVRational){1, st->internal->avctx->ticks_per_frame});
893 int frame_size, sample_rate;
895 #if FF_API_LAVF_AVCTX
896 FF_DISABLE_DEPRECATION_WARNINGS
897 if ((!codec_framerate.den || !codec_framerate.num) && st->codec->time_base.den && st->codec->time_base.num)
898 codec_framerate = av_mul_q(av_inv_q(st->codec->time_base), (AVRational){1, st->codec->ticks_per_frame});
899 FF_ENABLE_DEPRECATION_WARNINGS
904 switch (st->codecpar->codec_type) {
905 case AVMEDIA_TYPE_VIDEO:
906 if (st->r_frame_rate.num && !pc && s->iformat) {
907 *pnum = st->r_frame_rate.den;
908 *pden = st->r_frame_rate.num;
909 } else if (st->time_base.num * 1000LL > st->time_base.den) {
910 *pnum = st->time_base.num;
911 *pden = st->time_base.den;
912 } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
913 av_assert0(st->internal->avctx->ticks_per_frame);
914 av_reduce(pnum, pden,
916 codec_framerate.num * (int64_t)st->internal->avctx->ticks_per_frame,
919 if (pc && pc->repeat_pict) {
920 av_assert0(s->iformat); // this may be wrong for interlaced encoding but its not used for that case
921 av_reduce(pnum, pden,
922 (*pnum) * (1LL + pc->repeat_pict),
926 /* If this codec can be interlaced or progressive then we need
927 * a parser to compute duration of a packet. Thus if we have
928 * no parser in such case leave duration undefined. */
929 if (st->internal->avctx->ticks_per_frame > 1 && !pc)
933 case AVMEDIA_TYPE_AUDIO:
934 if (st->internal->avctx_inited) {
935 frame_size = av_get_audio_frame_duration(st->internal->avctx, pkt->size);
936 sample_rate = st->internal->avctx->sample_rate;
938 frame_size = av_get_audio_frame_duration2(st->codecpar, pkt->size);
939 sample_rate = st->codecpar->sample_rate;
941 if (frame_size <= 0 || sample_rate <= 0)
951 static int is_intra_only(enum AVCodecID id)
953 const AVCodecDescriptor *d = avcodec_descriptor_get(id);
956 if (d->type == AVMEDIA_TYPE_VIDEO && !(d->props & AV_CODEC_PROP_INTRA_ONLY))
961 static int has_decode_delay_been_guessed(AVStream *st)
963 if (st->codecpar->codec_id != AV_CODEC_ID_H264) return 1;
964 if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
966 #if CONFIG_H264_DECODER
967 if (st->internal->avctx->has_b_frames &&
968 avpriv_h264_has_num_reorder_frames(st->internal->avctx) == st->internal->avctx->has_b_frames)
971 if (st->internal->avctx->has_b_frames<3)
972 return st->nb_decoded_frames >= 7;
973 else if (st->internal->avctx->has_b_frames<4)
974 return st->nb_decoded_frames >= 18;
976 return st->nb_decoded_frames >= 20;
979 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
983 if (pktl == s->internal->packet_buffer_end)
984 return s->internal->parse_queue;
988 static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
989 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
990 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
993 int delay = st->internal->avctx->has_b_frames;
996 if (dts == AV_NOPTS_VALUE) {
997 int64_t best_score = INT64_MAX;
998 for (i = 0; i<delay; i++) {
999 if (st->pts_reorder_error_count[i]) {
1000 int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
1001 if (score < best_score) {
1003 dts = pts_buffer[i];
1008 for (i = 0; i<delay; i++) {
1009 if (pts_buffer[i] != AV_NOPTS_VALUE) {
1010 int64_t diff = FFABS(pts_buffer[i] - dts)
1011 + (uint64_t)st->pts_reorder_error[i];
1012 diff = FFMAX(diff, st->pts_reorder_error[i]);
1013 st->pts_reorder_error[i] = diff;
1014 st->pts_reorder_error_count[i]++;
1015 if (st->pts_reorder_error_count[i] > 250) {
1016 st->pts_reorder_error[i] >>= 1;
1017 st->pts_reorder_error_count[i] >>= 1;
1024 if (dts == AV_NOPTS_VALUE)
1025 dts = pts_buffer[0];
1031 * Updates the dts of packets of a stream in pkt_buffer, by re-ordering the pts
1032 * of the packets in a window.
1034 static void update_dts_from_pts(AVFormatContext *s, int stream_index,
1035 AVPacketList *pkt_buffer)
1037 AVStream *st = s->streams[stream_index];
1038 int delay = st->internal->avctx->has_b_frames;
1041 int64_t pts_buffer[MAX_REORDER_DELAY+1];
1043 for (i = 0; i<MAX_REORDER_DELAY+1; i++)
1044 pts_buffer[i] = AV_NOPTS_VALUE;
1046 for (; pkt_buffer; pkt_buffer = get_next_pkt(s, st, pkt_buffer)) {
1047 if (pkt_buffer->pkt.stream_index != stream_index)
1050 if (pkt_buffer->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1051 pts_buffer[0] = pkt_buffer->pkt.pts;
1052 for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
1053 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
1055 pkt_buffer->pkt.dts = select_from_pts_buffer(st, pts_buffer, pkt_buffer->pkt.dts);
1060 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
1061 int64_t dts, int64_t pts, AVPacket *pkt)
1063 AVStream *st = s->streams[stream_index];
1064 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1065 AVPacketList *pktl_it;
1069 if (st->first_dts != AV_NOPTS_VALUE ||
1070 dts == AV_NOPTS_VALUE ||
1071 st->cur_dts == AV_NOPTS_VALUE ||
1075 st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
1077 shift = (uint64_t)st->first_dts - RELATIVE_TS_BASE;
1079 if (is_relative(pts))
1082 for (pktl_it = pktl; pktl_it; pktl_it = get_next_pkt(s, st, pktl_it)) {
1083 if (pktl_it->pkt.stream_index != stream_index)
1085 if (is_relative(pktl_it->pkt.pts))
1086 pktl_it->pkt.pts += shift;
1088 if (is_relative(pktl_it->pkt.dts))
1089 pktl_it->pkt.dts += shift;
1091 if (st->start_time == AV_NOPTS_VALUE && pktl_it->pkt.pts != AV_NOPTS_VALUE) {
1092 st->start_time = pktl_it->pkt.pts;
1093 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1094 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1098 if (has_decode_delay_been_guessed(st)) {
1099 update_dts_from_pts(s, stream_index, pktl);
1102 if (st->start_time == AV_NOPTS_VALUE) {
1103 st->start_time = pts;
1104 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1105 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1109 static void update_initial_durations(AVFormatContext *s, AVStream *st,
1110 int stream_index, int duration)
1112 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1113 int64_t cur_dts = RELATIVE_TS_BASE;
1115 if (st->first_dts != AV_NOPTS_VALUE) {
1116 if (st->update_initial_durations_done)
1118 st->update_initial_durations_done = 1;
1119 cur_dts = st->first_dts;
1120 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1121 if (pktl->pkt.stream_index == stream_index) {
1122 if (pktl->pkt.pts != pktl->pkt.dts ||
1123 pktl->pkt.dts != AV_NOPTS_VALUE ||
1126 cur_dts -= duration;
1129 if (pktl && pktl->pkt.dts != st->first_dts) {
1130 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %"PRId64") in the queue\n",
1131 av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
1135 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
1138 pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1139 st->first_dts = cur_dts;
1140 } else if (st->cur_dts != RELATIVE_TS_BASE)
1143 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1144 if (pktl->pkt.stream_index != stream_index)
1146 if (pktl->pkt.pts == pktl->pkt.dts &&
1147 (pktl->pkt.dts == AV_NOPTS_VALUE || pktl->pkt.dts == st->first_dts) &&
1148 !pktl->pkt.duration) {
1149 pktl->pkt.dts = cur_dts;
1150 if (!st->internal->avctx->has_b_frames)
1151 pktl->pkt.pts = cur_dts;
1152 // if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
1153 pktl->pkt.duration = duration;
1156 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
1159 st->cur_dts = cur_dts;
1162 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1163 AVCodecParserContext *pc, AVPacket *pkt,
1164 int64_t next_dts, int64_t next_pts)
1166 int num, den, presentation_delayed, delay, i;
1168 AVRational duration;
1169 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1170 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1172 if (s->flags & AVFMT_FLAG_NOFILLIN)
1175 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
1176 if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
1177 if (st->last_dts_for_order_check <= pkt->dts) {
1180 av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
1181 "DTS %"PRIi64" < %"PRIi64" out of order\n",
1183 st->last_dts_for_order_check);
1184 st->dts_misordered++;
1186 if (st->dts_ordered + st->dts_misordered > 250) {
1187 st->dts_ordered >>= 1;
1188 st->dts_misordered >>= 1;
1192 st->last_dts_for_order_check = pkt->dts;
1193 if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
1194 pkt->dts = AV_NOPTS_VALUE;
1197 if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1198 pkt->dts = AV_NOPTS_VALUE;
1200 if (pc && pc->pict_type == AV_PICTURE_TYPE_B
1201 && !st->internal->avctx->has_b_frames)
1202 //FIXME Set low_delay = 0 when has_b_frames = 1
1203 st->internal->avctx->has_b_frames = 1;
1205 /* do we have a video B-frame ? */
1206 delay = st->internal->avctx->has_b_frames;
1207 presentation_delayed = 0;
1209 /* XXX: need has_b_frame, but cannot get it if the codec is
1210 * not initialized */
1212 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1213 presentation_delayed = 1;
1215 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
1216 st->pts_wrap_bits < 63 &&
1217 pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
1218 if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
1219 pkt->dts -= 1LL << st->pts_wrap_bits;
1221 pkt->pts += 1LL << st->pts_wrap_bits;
1224 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1225 * We take the conservative approach and discard both.
1226 * Note: If this is misbehaving for an H.264 file, then possibly
1227 * presentation_delayed is not set correctly. */
1228 if (delay == 1 && pkt->dts == pkt->pts &&
1229 pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
1230 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1231 if ( strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
1232 && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1233 pkt->dts = AV_NOPTS_VALUE;
1236 duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
1237 if (pkt->duration == 0) {
1238 ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
1240 duration = (AVRational) {num, den};
1241 pkt->duration = av_rescale_rnd(1,
1242 num * (int64_t) st->time_base.den,
1243 den * (int64_t) st->time_base.num,
1248 if (pkt->duration != 0 && (s->internal->packet_buffer || s->internal->parse_queue))
1249 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1251 /* Correct timestamps with byte offset if demuxers only have timestamps
1252 * on packet boundaries */
1253 if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
1254 /* this will estimate bitrate based on this frame's duration and size */
1255 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1256 if (pkt->pts != AV_NOPTS_VALUE)
1258 if (pkt->dts != AV_NOPTS_VALUE)
1262 /* This may be redundant, but it should not hurt. */
1263 if (pkt->dts != AV_NOPTS_VALUE &&
1264 pkt->pts != AV_NOPTS_VALUE &&
1265 pkt->pts > pkt->dts)
1266 presentation_delayed = 1;
1268 if (s->debug & FF_FDEBUG_TS)
1269 av_log(s, AV_LOG_TRACE,
1270 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%"PRId64" delay:%d onein_oneout:%d\n",
1271 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
1272 pkt->stream_index, pc, pkt->duration, delay, onein_oneout);
1274 /* Interpolate PTS and DTS if they are not present. We skip H264
1275 * currently because delay and has_b_frames are not reliably set. */
1276 if ((delay == 0 || (delay == 1 && pc)) &&
1278 if (presentation_delayed) {
1279 /* DTS = decompression timestamp */
1280 /* PTS = presentation timestamp */
1281 if (pkt->dts == AV_NOPTS_VALUE)
1282 pkt->dts = st->last_IP_pts;
1283 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1284 if (pkt->dts == AV_NOPTS_VALUE)
1285 pkt->dts = st->cur_dts;
1287 /* This is tricky: the dts must be incremented by the duration
1288 * of the frame we are displaying, i.e. the last I- or P-frame. */
1289 if (st->last_IP_duration == 0)
1290 st->last_IP_duration = pkt->duration;
1291 if (pkt->dts != AV_NOPTS_VALUE)
1292 st->cur_dts = pkt->dts + st->last_IP_duration;
1293 if (pkt->dts != AV_NOPTS_VALUE &&
1294 pkt->pts == AV_NOPTS_VALUE &&
1295 st->last_IP_duration > 0 &&
1296 ((uint64_t)st->cur_dts - (uint64_t)next_dts + 1) <= 2 &&
1297 next_dts != next_pts &&
1298 next_pts != AV_NOPTS_VALUE)
1299 pkt->pts = next_dts;
1301 st->last_IP_duration = pkt->duration;
1302 st->last_IP_pts = pkt->pts;
1303 /* Cannot compute PTS if not present (we can compute it only
1304 * by knowing the future. */
1305 } else if (pkt->pts != AV_NOPTS_VALUE ||
1306 pkt->dts != AV_NOPTS_VALUE ||
1309 /* presentation is not delayed : PTS and DTS are the same */
1310 if (pkt->pts == AV_NOPTS_VALUE)
1311 pkt->pts = pkt->dts;
1312 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1314 if (pkt->pts == AV_NOPTS_VALUE)
1315 pkt->pts = st->cur_dts;
1316 pkt->dts = pkt->pts;
1317 if (pkt->pts != AV_NOPTS_VALUE)
1318 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
1322 if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1323 st->pts_buffer[0] = pkt->pts;
1324 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
1325 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
1327 if(has_decode_delay_been_guessed(st))
1328 pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
1330 // We skipped it above so we try here.
1332 // This should happen on the first packet
1333 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1334 if (pkt->dts > st->cur_dts)
1335 st->cur_dts = pkt->dts;
1337 if (s->debug & FF_FDEBUG_TS)
1338 av_log(s, AV_LOG_TRACE, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1339 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
1342 if (is_intra_only(st->codecpar->codec_id))
1343 pkt->flags |= AV_PKT_FLAG_KEY;
1344 #if FF_API_CONVERGENCE_DURATION
1345 FF_DISABLE_DEPRECATION_WARNINGS
1347 pkt->convergence_duration = pc->convergence_duration;
1348 FF_ENABLE_DEPRECATION_WARNINGS
1352 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1355 AVPacketList *pktl = *pkt_buf;
1356 *pkt_buf = pktl->next;
1357 av_packet_unref(&pktl->pkt);
1360 *pkt_buf_end = NULL;
1364 * Parse a packet, add all split parts to parse_queue.
1366 * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
1368 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1370 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1371 AVStream *st = s->streams[stream_index];
1372 uint8_t *data = pkt ? pkt->data : NULL;
1373 int size = pkt ? pkt->size : 0;
1374 int ret = 0, got_output = 0;
1377 av_init_packet(&flush_pkt);
1380 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1381 // preserve 0-size sync packets
1382 compute_pkt_fields(s, st, st->parser, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1385 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1387 int64_t next_pts = pkt->pts;
1388 int64_t next_dts = pkt->dts;
1390 av_init_packet(&out_pkt);
1391 len = av_parser_parse2(st->parser, st->internal->avctx,
1392 &out_pkt.data, &out_pkt.size, data, size,
1393 pkt->pts, pkt->dts, pkt->pos);
1395 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1397 /* increment read pointer */
1401 got_output = !!out_pkt.size;
1406 if (pkt->side_data) {
1407 out_pkt.side_data = pkt->side_data;
1408 out_pkt.side_data_elems = pkt->side_data_elems;
1409 pkt->side_data = NULL;
1410 pkt->side_data_elems = 0;
1413 /* set the duration */
1414 out_pkt.duration = (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->duration : 0;
1415 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1416 if (st->internal->avctx->sample_rate > 0) {
1418 av_rescale_q_rnd(st->parser->duration,
1419 (AVRational) { 1, st->internal->avctx->sample_rate },
1425 out_pkt.stream_index = st->index;
1426 out_pkt.pts = st->parser->pts;
1427 out_pkt.dts = st->parser->dts;
1428 out_pkt.pos = st->parser->pos;
1430 if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1431 out_pkt.pos = st->parser->frame_offset;
1433 if (st->parser->key_frame == 1 ||
1434 (st->parser->key_frame == -1 &&
1435 st->parser->pict_type == AV_PICTURE_TYPE_I))
1436 out_pkt.flags |= AV_PKT_FLAG_KEY;
1438 if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1439 out_pkt.flags |= AV_PKT_FLAG_KEY;
1441 compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts);
1443 ret = add_to_pktbuf(&s->internal->parse_queue, &out_pkt,
1444 &s->internal->parse_queue_end, 1);
1445 av_packet_unref(&out_pkt);
1450 /* end of the stream => close and free the parser */
1451 if (pkt == &flush_pkt) {
1452 av_parser_close(st->parser);
1457 av_packet_unref(pkt);
1461 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1462 AVPacketList **pkt_buffer_end,
1466 av_assert0(*pkt_buffer);
1469 *pkt_buffer = pktl->next;
1471 *pkt_buffer_end = NULL;
1476 static int64_t ts_to_samples(AVStream *st, int64_t ts)
1478 return av_rescale(ts, st->time_base.num * st->codecpar->sample_rate, st->time_base.den);
1481 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1483 int ret = 0, i, got_packet = 0;
1484 AVDictionary *metadata = NULL;
1486 av_init_packet(pkt);
1488 while (!got_packet && !s->internal->parse_queue) {
1492 /* read next packet */
1493 ret = ff_read_packet(s, &cur_pkt);
1495 if (ret == AVERROR(EAGAIN))
1497 /* flush the parsers */
1498 for (i = 0; i < s->nb_streams; i++) {
1500 if (st->parser && st->need_parsing)
1501 parse_packet(s, NULL, st->index);
1503 /* all remaining packets are now in parse_queue =>
1504 * really terminate parsing */
1508 st = s->streams[cur_pkt.stream_index];
1510 /* update context if required */
1511 if (st->internal->need_context_update) {
1512 if (avcodec_is_open(st->internal->avctx)) {
1513 av_log(s, AV_LOG_DEBUG, "Demuxer context update while decoder is open, closing and trying to re-open\n");
1514 avcodec_close(st->internal->avctx);
1515 st->info->found_decoder = 0;
1518 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
1522 #if FF_API_LAVF_AVCTX
1523 FF_DISABLE_DEPRECATION_WARNINGS
1524 /* update deprecated public codec context */
1525 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
1528 FF_ENABLE_DEPRECATION_WARNINGS
1531 st->internal->need_context_update = 0;
1534 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1535 cur_pkt.dts != AV_NOPTS_VALUE &&
1536 cur_pkt.pts < cur_pkt.dts) {
1537 av_log(s, AV_LOG_WARNING,
1538 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1539 cur_pkt.stream_index,
1540 av_ts2str(cur_pkt.pts),
1541 av_ts2str(cur_pkt.dts),
1544 if (s->debug & FF_FDEBUG_TS)
1545 av_log(s, AV_LOG_DEBUG,
1546 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"PRId64", flags=%d\n",
1547 cur_pkt.stream_index,
1548 av_ts2str(cur_pkt.pts),
1549 av_ts2str(cur_pkt.dts),
1550 cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
1552 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1553 st->parser = av_parser_init(st->codecpar->codec_id);
1555 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1556 "%s, packets or times may be invalid.\n",
1557 avcodec_get_name(st->codecpar->codec_id));
1558 /* no parser available: just output the raw packets */
1559 st->need_parsing = AVSTREAM_PARSE_NONE;
1560 } else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1561 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1562 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1563 st->parser->flags |= PARSER_FLAG_ONCE;
1564 else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1565 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1568 if (!st->need_parsing || !st->parser) {
1569 /* no parsing needed: we just output the packet as is */
1571 compute_pkt_fields(s, st, NULL, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1572 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1573 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1574 ff_reduce_index(s, st->index);
1575 av_add_index_entry(st, pkt->pos, pkt->dts,
1576 0, 0, AVINDEX_KEYFRAME);
1579 } else if (st->discard < AVDISCARD_ALL) {
1580 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1582 st->codecpar->sample_rate = st->internal->avctx->sample_rate;
1583 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
1584 st->codecpar->channels = st->internal->avctx->channels;
1585 st->codecpar->channel_layout = st->internal->avctx->channel_layout;
1586 st->codecpar->codec_id = st->internal->avctx->codec_id;
1589 av_packet_unref(&cur_pkt);
1591 if (pkt->flags & AV_PKT_FLAG_KEY)
1592 st->skip_to_keyframe = 0;
1593 if (st->skip_to_keyframe) {
1594 av_packet_unref(&cur_pkt);
1602 if (!got_packet && s->internal->parse_queue)
1603 ret = read_from_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt);
1606 AVStream *st = s->streams[pkt->stream_index];
1607 int discard_padding = 0;
1608 if (st->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
1609 int64_t pts = pkt->pts - (is_relative(pkt->pts) ? RELATIVE_TS_BASE : 0);
1610 int64_t sample = ts_to_samples(st, pts);
1611 int duration = ts_to_samples(st, pkt->duration);
1612 int64_t end_sample = sample + duration;
1613 if (duration > 0 && end_sample >= st->first_discard_sample &&
1614 sample < st->last_discard_sample)
1615 discard_padding = FFMIN(end_sample - st->first_discard_sample, duration);
1617 if (st->start_skip_samples && (pkt->pts == 0 || pkt->pts == RELATIVE_TS_BASE))
1618 st->skip_samples = st->start_skip_samples;
1619 if (st->skip_samples || discard_padding) {
1620 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1622 AV_WL32(p, st->skip_samples);
1623 AV_WL32(p + 4, discard_padding);
1624 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d / discard %d\n", st->skip_samples, discard_padding);
1626 st->skip_samples = 0;
1629 if (st->inject_global_side_data) {
1630 for (i = 0; i < st->nb_side_data; i++) {
1631 AVPacketSideData *src_sd = &st->side_data[i];
1634 if (av_packet_get_side_data(pkt, src_sd->type, NULL))
1637 dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
1639 av_log(s, AV_LOG_WARNING, "Could not inject global side data\n");
1643 memcpy(dst_data, src_sd->data, src_sd->size);
1645 st->inject_global_side_data = 0;
1648 if (!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
1649 av_packet_merge_side_data(pkt);
1652 av_opt_get_dict_val(s, "metadata", AV_OPT_SEARCH_CHILDREN, &metadata);
1654 s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
1655 av_dict_copy(&s->metadata, metadata, 0);
1656 av_dict_free(&metadata);
1657 av_opt_set_dict_val(s, "metadata", NULL, AV_OPT_SEARCH_CHILDREN);
1660 #if FF_API_LAVF_AVCTX
1661 update_stream_avctx(s);
1664 if (s->debug & FF_FDEBUG_TS)
1665 av_log(s, AV_LOG_DEBUG,
1666 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1667 "size=%d, duration=%"PRId64", flags=%d\n",
1669 av_ts2str(pkt->pts),
1670 av_ts2str(pkt->dts),
1671 pkt->size, pkt->duration, pkt->flags);
1676 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1678 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1684 ret = s->internal->packet_buffer
1685 ? read_from_packet_buffer(&s->internal->packet_buffer,
1686 &s->internal->packet_buffer_end, pkt)
1687 : read_frame_internal(s, pkt);
1694 AVPacketList *pktl = s->internal->packet_buffer;
1697 AVPacket *next_pkt = &pktl->pkt;
1699 if (next_pkt->dts != AV_NOPTS_VALUE) {
1700 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1701 // last dts seen for this stream. if any of packets following
1702 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1703 int64_t last_dts = next_pkt->dts;
1704 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1705 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1706 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0)) {
1707 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) {
1709 next_pkt->pts = pktl->pkt.dts;
1711 if (last_dts != AV_NOPTS_VALUE) {
1712 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1713 last_dts = pktl->pkt.dts;
1718 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1719 // Fixing the last reference frame had none pts issue (For MXF etc).
1720 // We only do this when
1722 // 2. we are not able to resolve a pts value for current packet.
1723 // 3. the packets for this stream at the end of the files had valid dts.
1724 next_pkt->pts = last_dts + next_pkt->duration;
1726 pktl = s->internal->packet_buffer;
1729 /* read packet from packet buffer, if there is data */
1730 st = s->streams[next_pkt->stream_index];
1731 if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
1732 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1733 ret = read_from_packet_buffer(&s->internal->packet_buffer,
1734 &s->internal->packet_buffer_end, pkt);
1739 ret = read_frame_internal(s, pkt);
1741 if (pktl && ret != AVERROR(EAGAIN)) {
1748 ret = add_to_pktbuf(&s->internal->packet_buffer, pkt,
1749 &s->internal->packet_buffer_end, 1);
1750 av_packet_unref(pkt);
1757 st = s->streams[pkt->stream_index];
1758 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1759 ff_reduce_index(s, st->index);
1760 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1763 if (is_relative(pkt->dts))
1764 pkt->dts -= RELATIVE_TS_BASE;
1765 if (is_relative(pkt->pts))
1766 pkt->pts -= RELATIVE_TS_BASE;
1771 /* XXX: suppress the packet queue */
1772 static void flush_packet_queue(AVFormatContext *s)
1776 free_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end);
1777 free_packet_buffer(&s->internal->packet_buffer, &s->internal->packet_buffer_end);
1778 free_packet_buffer(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
1780 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1783 /*******************************************************/
1786 int av_find_default_stream_index(AVFormatContext *s)
1790 int best_stream = 0;
1791 int best_score = INT_MIN;
1793 if (s->nb_streams <= 0)
1795 for (i = 0; i < s->nb_streams; i++) {
1798 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1799 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
1801 if (st->codecpar->width && st->codecpar->height)
1805 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1806 if (st->codecpar->sample_rate)
1809 if (st->codec_info_nb_frames)
1812 if (st->discard != AVDISCARD_ALL)
1815 if (score > best_score) {
1823 /** Flush the frame reader. */
1824 void ff_read_frame_flush(AVFormatContext *s)
1829 flush_packet_queue(s);
1831 /* Reset read state for each stream. */
1832 for (i = 0; i < s->nb_streams; i++) {
1836 av_parser_close(st->parser);
1839 st->last_IP_pts = AV_NOPTS_VALUE;
1840 st->last_dts_for_order_check = AV_NOPTS_VALUE;
1841 if (st->first_dts == AV_NOPTS_VALUE)
1842 st->cur_dts = RELATIVE_TS_BASE;
1844 /* We set the current DTS to an unspecified origin. */
1845 st->cur_dts = AV_NOPTS_VALUE;
1847 st->probe_packets = MAX_PROBE_PACKETS;
1849 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1850 st->pts_buffer[j] = AV_NOPTS_VALUE;
1852 if (s->internal->inject_global_side_data)
1853 st->inject_global_side_data = 1;
1855 st->skip_samples = 0;
1859 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1863 for (i = 0; i < s->nb_streams; i++) {
1864 AVStream *st = s->streams[i];
1867 av_rescale(timestamp,
1868 st->time_base.den * (int64_t) ref_st->time_base.num,
1869 st->time_base.num * (int64_t) ref_st->time_base.den);
1873 void ff_reduce_index(AVFormatContext *s, int stream_index)
1875 AVStream *st = s->streams[stream_index];
1876 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1878 if ((unsigned) st->nb_index_entries >= max_entries) {
1880 for (i = 0; 2 * i < st->nb_index_entries; i++)
1881 st->index_entries[i] = st->index_entries[2 * i];
1882 st->nb_index_entries = i;
1886 int ff_add_index_entry(AVIndexEntry **index_entries,
1887 int *nb_index_entries,
1888 unsigned int *index_entries_allocated_size,
1889 int64_t pos, int64_t timestamp,
1890 int size, int distance, int flags)
1892 AVIndexEntry *entries, *ie;
1895 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1898 if (timestamp == AV_NOPTS_VALUE)
1899 return AVERROR(EINVAL);
1901 if (size < 0 || size > 0x3FFFFFFF)
1902 return AVERROR(EINVAL);
1904 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1905 timestamp -= RELATIVE_TS_BASE;
1907 entries = av_fast_realloc(*index_entries,
1908 index_entries_allocated_size,
1909 (*nb_index_entries + 1) *
1910 sizeof(AVIndexEntry));
1914 *index_entries = entries;
1916 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
1917 timestamp, AVSEEK_FLAG_ANY);
1920 index = (*nb_index_entries)++;
1921 ie = &entries[index];
1922 av_assert0(index == 0 || ie[-1].timestamp < timestamp);
1924 ie = &entries[index];
1925 if (ie->timestamp != timestamp) {
1926 if (ie->timestamp <= timestamp)
1928 memmove(entries + index + 1, entries + index,
1929 sizeof(AVIndexEntry) * (*nb_index_entries - index));
1930 (*nb_index_entries)++;
1931 } else if (ie->pos == pos && distance < ie->min_distance)
1932 // do not reduce the distance
1933 distance = ie->min_distance;
1937 ie->timestamp = timestamp;
1938 ie->min_distance = distance;
1945 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
1946 int size, int distance, int flags)
1948 timestamp = wrap_timestamp(st, timestamp);
1949 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1950 &st->index_entries_allocated_size, pos,
1951 timestamp, size, distance, flags);
1954 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1955 int64_t wanted_timestamp, int flags)
1963 // Optimize appending index entries at the end.
1964 if (b && entries[b - 1].timestamp < wanted_timestamp)
1970 // Search for the next non-discarded packet.
1971 while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b) {
1973 if (m == b && entries[m].timestamp >= wanted_timestamp) {
1979 timestamp = entries[m].timestamp;
1980 if (timestamp >= wanted_timestamp)
1982 if (timestamp <= wanted_timestamp)
1985 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1987 if (!(flags & AVSEEK_FLAG_ANY))
1988 while (m >= 0 && m < nb_entries &&
1989 !(entries[m].flags & AVINDEX_KEYFRAME))
1990 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1992 if (m == nb_entries)
1997 void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
2000 int64_t pos_delta = 0;
2002 //We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
2003 const char *proto = avio_find_protocol_name(s->filename);
2006 av_log(s, AV_LOG_INFO,
2007 "Protocol name not provided, cannot determine if input is local or "
2008 "a network protocol, buffers and access patterns cannot be configured "
2009 "optimally without knowing the protocol\n");
2012 if (proto && !(strcmp(proto, "file") && strcmp(proto, "pipe") && strcmp(proto, "cache")))
2015 for (ist1 = 0; ist1 < s->nb_streams; ist1++) {
2016 AVStream *st1 = s->streams[ist1];
2017 for (ist2 = 0; ist2 < s->nb_streams; ist2++) {
2018 AVStream *st2 = s->streams[ist2];
2024 for (i1 = i2 = 0; i1 < st1->nb_index_entries; i1++) {
2025 AVIndexEntry *e1 = &st1->index_entries[i1];
2026 int64_t e1_pts = av_rescale_q(e1->timestamp, st1->time_base, AV_TIME_BASE_Q);
2028 skip = FFMAX(skip, e1->size);
2029 for (; i2 < st2->nb_index_entries; i2++) {
2030 AVIndexEntry *e2 = &st2->index_entries[i2];
2031 int64_t e2_pts = av_rescale_q(e2->timestamp, st2->time_base, AV_TIME_BASE_Q);
2032 if (e2_pts - e1_pts < time_tolerance)
2034 pos_delta = FFMAX(pos_delta, e1->pos - e2->pos);
2042 /* XXX This could be adjusted depending on protocol*/
2043 if (s->pb->buffer_size < pos_delta && pos_delta < (1<<24)) {
2044 av_log(s, AV_LOG_VERBOSE, "Reconfiguring buffers to size %"PRId64"\n", pos_delta);
2045 ffio_set_buf_size(s->pb, pos_delta);
2046 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, pos_delta/2);
2049 if (skip < (1<<23)) {
2050 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, skip);
2054 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
2056 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
2057 wanted_timestamp, flags);
2060 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
2061 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2063 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
2064 if (stream_index >= 0)
2065 ts = wrap_timestamp(s->streams[stream_index], ts);
2069 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
2070 int64_t target_ts, int flags)
2072 AVInputFormat *avif = s->iformat;
2073 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
2074 int64_t ts_min, ts_max, ts;
2079 if (stream_index < 0)
2082 av_log(s, AV_LOG_TRACE, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2085 ts_min = AV_NOPTS_VALUE;
2086 pos_limit = -1; // GCC falsely says it may be uninitialized.
2088 st = s->streams[stream_index];
2089 if (st->index_entries) {
2092 /* FIXME: Whole function must be checked for non-keyframe entries in
2093 * index case, especially read_timestamp(). */
2094 index = av_index_search_timestamp(st, target_ts,
2095 flags | AVSEEK_FLAG_BACKWARD);
2096 index = FFMAX(index, 0);
2097 e = &st->index_entries[index];
2099 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
2101 ts_min = e->timestamp;
2102 av_log(s, AV_LOG_TRACE, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
2103 pos_min, av_ts2str(ts_min));
2105 av_assert1(index == 0);
2108 index = av_index_search_timestamp(st, target_ts,
2109 flags & ~AVSEEK_FLAG_BACKWARD);
2110 av_assert0(index < st->nb_index_entries);
2112 e = &st->index_entries[index];
2113 av_assert1(e->timestamp >= target_ts);
2115 ts_max = e->timestamp;
2116 pos_limit = pos_max - e->min_distance;
2117 av_log(s, AV_LOG_TRACE, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
2118 " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
2122 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
2123 ts_min, ts_max, flags, &ts, avif->read_timestamp);
2128 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
2131 ff_read_frame_flush(s);
2132 ff_update_cur_dts(s, st, ts);
2137 int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
2138 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2140 int64_t step = 1024;
2141 int64_t limit, ts_max;
2142 int64_t filesize = avio_size(s->pb);
2143 int64_t pos_max = filesize - 1;
2146 pos_max = FFMAX(0, (pos_max) - step);
2147 ts_max = ff_read_timestamp(s, stream_index,
2148 &pos_max, limit, read_timestamp);
2150 } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
2151 if (ts_max == AV_NOPTS_VALUE)
2155 int64_t tmp_pos = pos_max + 1;
2156 int64_t tmp_ts = ff_read_timestamp(s, stream_index,
2157 &tmp_pos, INT64_MAX, read_timestamp);
2158 if (tmp_ts == AV_NOPTS_VALUE)
2160 av_assert0(tmp_pos > pos_max);
2163 if (tmp_pos >= filesize)
2175 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
2176 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
2177 int64_t ts_min, int64_t ts_max,
2178 int flags, int64_t *ts_ret,
2179 int64_t (*read_timestamp)(struct AVFormatContext *, int,
2180 int64_t *, int64_t))
2187 av_log(s, AV_LOG_TRACE, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2189 if (ts_min == AV_NOPTS_VALUE) {
2190 pos_min = s->internal->data_offset;
2191 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2192 if (ts_min == AV_NOPTS_VALUE)
2196 if (ts_min >= target_ts) {
2201 if (ts_max == AV_NOPTS_VALUE) {
2202 if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
2204 pos_limit = pos_max;
2207 if (ts_max <= target_ts) {
2212 av_assert0(ts_min < ts_max);
2215 while (pos_min < pos_limit) {
2216 av_log(s, AV_LOG_TRACE,
2217 "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
2218 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
2219 av_assert0(pos_limit <= pos_max);
2221 if (no_change == 0) {
2222 int64_t approximate_keyframe_distance = pos_max - pos_limit;
2223 // interpolate position (better than dichotomy)
2224 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
2226 pos_min - approximate_keyframe_distance;
2227 } else if (no_change == 1) {
2228 // bisection if interpolation did not change min / max pos last time
2229 pos = (pos_min + pos_limit) >> 1;
2231 /* linear search if bisection failed, can only happen if there
2232 * are very few or no keyframes between min/max */
2237 else if (pos > pos_limit)
2241 // May pass pos_limit instead of -1.
2242 ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
2247 av_log(s, AV_LOG_TRACE, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
2248 " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
2249 pos_min, pos, pos_max,
2250 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
2251 pos_limit, start_pos, no_change);
2252 if (ts == AV_NOPTS_VALUE) {
2253 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
2256 if (target_ts <= ts) {
2257 pos_limit = start_pos - 1;
2261 if (target_ts >= ts) {
2267 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
2268 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
2271 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2273 ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2274 av_log(s, AV_LOG_TRACE, "pos=0x%"PRIx64" %s<=%s<=%s\n",
2275 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
2281 static int seek_frame_byte(AVFormatContext *s, int stream_index,
2282 int64_t pos, int flags)
2284 int64_t pos_min, pos_max;
2286 pos_min = s->internal->data_offset;
2287 pos_max = avio_size(s->pb) - 1;
2291 else if (pos > pos_max)
2294 avio_seek(s->pb, pos, SEEK_SET);
2296 s->io_repositioned = 1;
2301 static int seek_frame_generic(AVFormatContext *s, int stream_index,
2302 int64_t timestamp, int flags)
2309 st = s->streams[stream_index];
2311 index = av_index_search_timestamp(st, timestamp, flags);
2313 if (index < 0 && st->nb_index_entries &&
2314 timestamp < st->index_entries[0].timestamp)
2317 if (index < 0 || index == st->nb_index_entries - 1) {
2321 if (st->nb_index_entries) {
2322 av_assert0(st->index_entries);
2323 ie = &st->index_entries[st->nb_index_entries - 1];
2324 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2326 ff_update_cur_dts(s, st, ie->timestamp);
2328 if ((ret = avio_seek(s->pb, s->internal->data_offset, SEEK_SET)) < 0)
2334 read_status = av_read_frame(s, &pkt);
2335 } while (read_status == AVERROR(EAGAIN));
2336 if (read_status < 0)
2338 if (stream_index == pkt.stream_index && pkt.dts > timestamp) {
2339 if (pkt.flags & AV_PKT_FLAG_KEY) {
2340 av_packet_unref(&pkt);
2343 if (nonkey++ > 1000 && st->codecpar->codec_id != AV_CODEC_ID_CDGRAPHICS) {
2344 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);
2345 av_packet_unref(&pkt);
2349 av_packet_unref(&pkt);
2351 index = av_index_search_timestamp(st, timestamp, flags);
2356 ff_read_frame_flush(s);
2357 if (s->iformat->read_seek)
2358 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2360 ie = &st->index_entries[index];
2361 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2363 ff_update_cur_dts(s, st, ie->timestamp);
2368 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2369 int64_t timestamp, int flags)
2374 if (flags & AVSEEK_FLAG_BYTE) {
2375 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2377 ff_read_frame_flush(s);
2378 return seek_frame_byte(s, stream_index, timestamp, flags);
2381 if (stream_index < 0) {
2382 stream_index = av_find_default_stream_index(s);
2383 if (stream_index < 0)
2386 st = s->streams[stream_index];
2387 /* timestamp for default must be expressed in AV_TIME_BASE units */
2388 timestamp = av_rescale(timestamp, st->time_base.den,
2389 AV_TIME_BASE * (int64_t) st->time_base.num);
2392 /* first, we try the format specific seek */
2393 if (s->iformat->read_seek) {
2394 ff_read_frame_flush(s);
2395 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2401 if (s->iformat->read_timestamp &&
2402 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2403 ff_read_frame_flush(s);
2404 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2405 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2406 ff_read_frame_flush(s);
2407 return seek_frame_generic(s, stream_index, timestamp, flags);
2412 int av_seek_frame(AVFormatContext *s, int stream_index,
2413 int64_t timestamp, int flags)
2417 if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2418 int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2419 if ((flags & AVSEEK_FLAG_BACKWARD))
2423 return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2424 flags & ~AVSEEK_FLAG_BACKWARD);
2427 ret = seek_frame_internal(s, stream_index, timestamp, flags);
2430 ret = avformat_queue_attached_pictures(s);
2435 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
2436 int64_t ts, int64_t max_ts, int flags)
2438 if (min_ts > ts || max_ts < ts)
2440 if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2441 return AVERROR(EINVAL);
2444 flags |= AVSEEK_FLAG_ANY;
2445 flags &= ~AVSEEK_FLAG_BACKWARD;
2447 if (s->iformat->read_seek2) {
2449 ff_read_frame_flush(s);
2451 if (stream_index == -1 && s->nb_streams == 1) {
2452 AVRational time_base = s->streams[0]->time_base;
2453 ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2454 min_ts = av_rescale_rnd(min_ts, time_base.den,
2455 time_base.num * (int64_t)AV_TIME_BASE,
2456 AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
2457 max_ts = av_rescale_rnd(max_ts, time_base.den,
2458 time_base.num * (int64_t)AV_TIME_BASE,
2459 AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
2463 ret = s->iformat->read_seek2(s, stream_index, min_ts,
2467 ret = avformat_queue_attached_pictures(s);
2471 if (s->iformat->read_timestamp) {
2472 // try to seek via read_timestamp()
2475 // Fall back on old API if new is not implemented but old is.
2476 // Note the old API has somewhat different semantics.
2477 if (s->iformat->read_seek || 1) {
2478 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2479 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2480 if (ret<0 && ts != min_ts && max_ts != ts) {
2481 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2483 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2488 // try some generic seek like seek_frame_generic() but with new ts semantics
2489 return -1; //unreachable
2492 int avformat_flush(AVFormatContext *s)
2494 ff_read_frame_flush(s);
2498 /*******************************************************/
2501 * Return TRUE if the stream has accurate duration in any stream.
2503 * @return TRUE if the stream has accurate duration for at least one component.
2505 static int has_duration(AVFormatContext *ic)
2510 for (i = 0; i < ic->nb_streams; i++) {
2511 st = ic->streams[i];
2512 if (st->duration != AV_NOPTS_VALUE)
2515 if (ic->duration != AV_NOPTS_VALUE)
2521 * Estimate the stream timings from the one of each components.
2523 * Also computes the global bitrate if possible.
2525 static void update_stream_timings(AVFormatContext *ic)
2527 int64_t start_time, start_time1, start_time_text, end_time, end_time1, end_time_text;
2528 int64_t duration, duration1, filesize;
2533 start_time = INT64_MAX;
2534 start_time_text = INT64_MAX;
2535 end_time = INT64_MIN;
2536 end_time_text = INT64_MIN;
2537 duration = INT64_MIN;
2538 for (i = 0; i < ic->nb_streams; i++) {
2539 st = ic->streams[i];
2540 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2541 start_time1 = av_rescale_q(st->start_time, st->time_base,
2543 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
2544 if (start_time1 < start_time_text)
2545 start_time_text = start_time1;
2547 start_time = FFMIN(start_time, start_time1);
2548 end_time1 = av_rescale_q_rnd(st->duration, st->time_base,
2550 AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
2551 if (end_time1 != AV_NOPTS_VALUE && (end_time1 > 0 ? start_time1 <= INT64_MAX - end_time1 : start_time1 >= INT64_MIN - end_time1)) {
2552 end_time1 += start_time1;
2553 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
2554 end_time_text = FFMAX(end_time_text, end_time1);
2556 end_time = FFMAX(end_time, end_time1);
2558 for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
2559 if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2560 p->start_time = start_time1;
2561 if (p->end_time < end_time1)
2562 p->end_time = end_time1;
2565 if (st->duration != AV_NOPTS_VALUE) {
2566 duration1 = av_rescale_q(st->duration, st->time_base,
2568 duration = FFMAX(duration, duration1);
2571 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2572 start_time = start_time_text;
2573 else if (start_time > start_time_text)
2574 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2576 if (end_time == INT64_MIN || (end_time < end_time_text && end_time_text - end_time < AV_TIME_BASE)) {
2577 end_time = end_time_text;
2578 } else if (end_time < end_time_text) {
2579 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream endtime %f\n", end_time_text / (float)AV_TIME_BASE);
2582 if (start_time != INT64_MAX) {
2583 ic->start_time = start_time;
2584 if (end_time != INT64_MIN) {
2585 if (ic->nb_programs > 1) {
2586 for (i = 0; i < ic->nb_programs; i++) {
2587 p = ic->programs[i];
2588 if (p->start_time != AV_NOPTS_VALUE && p->end_time > p->start_time)
2589 duration = FFMAX(duration, p->end_time - p->start_time);
2592 duration = FFMAX(duration, end_time - start_time);
2595 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2596 ic->duration = duration;
2598 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration > 0) {
2599 /* compute the bitrate */
2600 double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2601 (double) ic->duration;
2602 if (bitrate >= 0 && bitrate <= INT64_MAX)
2603 ic->bit_rate = bitrate;
2607 static void fill_all_stream_timings(AVFormatContext *ic)
2612 update_stream_timings(ic);
2613 for (i = 0; i < ic->nb_streams; i++) {
2614 st = ic->streams[i];
2615 if (st->start_time == AV_NOPTS_VALUE) {
2616 if (ic->start_time != AV_NOPTS_VALUE)
2617 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
2619 if (ic->duration != AV_NOPTS_VALUE)
2620 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
2626 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2628 int64_t filesize, duration;
2629 int i, show_warning = 0;
2632 /* if bit_rate is already set, we believe it */
2633 if (ic->bit_rate <= 0) {
2634 int64_t bit_rate = 0;
2635 for (i = 0; i < ic->nb_streams; i++) {
2636 st = ic->streams[i];
2637 if (st->codecpar->bit_rate <= 0 && st->internal->avctx->bit_rate > 0)
2638 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
2639 if (st->codecpar->bit_rate > 0) {
2640 if (INT64_MAX - st->codecpar->bit_rate < bit_rate) {
2644 bit_rate += st->codecpar->bit_rate;
2645 } else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && st->codec_info_nb_frames > 1) {
2646 // If we have a videostream with packets but without a bitrate
2647 // then consider the sum not known
2652 ic->bit_rate = bit_rate;
2655 /* if duration is already set, we believe it */
2656 if (ic->duration == AV_NOPTS_VALUE &&
2657 ic->bit_rate != 0) {
2658 filesize = ic->pb ? avio_size(ic->pb) : 0;
2659 if (filesize > ic->internal->data_offset) {
2660 filesize -= ic->internal->data_offset;
2661 for (i = 0; i < ic->nb_streams; i++) {
2662 st = ic->streams[i];
2663 if ( st->time_base.num <= INT64_MAX / ic->bit_rate
2664 && st->duration == AV_NOPTS_VALUE) {
2665 duration = av_rescale(8 * filesize, st->time_base.den,
2667 (int64_t) st->time_base.num);
2668 st->duration = duration;
2675 av_log(ic, AV_LOG_WARNING,
2676 "Estimating duration from bitrate, this may be inaccurate\n");
2679 #define DURATION_MAX_READ_SIZE 250000LL
2680 #define DURATION_MAX_RETRY 6
2682 /* only usable for MPEG-PS streams */
2683 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2685 AVPacket pkt1, *pkt = &pkt1;
2687 int num, den, read_size, i, ret;
2688 int found_duration = 0;
2690 int64_t filesize, offset, duration;
2693 /* flush packet queue */
2694 flush_packet_queue(ic);
2696 for (i = 0; i < ic->nb_streams; i++) {
2697 st = ic->streams[i];
2698 if (st->start_time == AV_NOPTS_VALUE &&
2699 st->first_dts == AV_NOPTS_VALUE &&
2700 st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN)
2701 av_log(ic, AV_LOG_WARNING,
2702 "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2705 av_parser_close(st->parser);
2710 av_opt_set(ic, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN);
2711 /* estimate the end time (duration) */
2712 /* XXX: may need to support wrapping */
2713 filesize = ic->pb ? avio_size(ic->pb) : 0;
2715 is_end = found_duration;
2716 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
2720 avio_seek(ic->pb, offset, SEEK_SET);
2723 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
2727 ret = ff_read_packet(ic, pkt);
2728 } while (ret == AVERROR(EAGAIN));
2731 read_size += pkt->size;
2732 st = ic->streams[pkt->stream_index];
2733 if (pkt->pts != AV_NOPTS_VALUE &&
2734 (st->start_time != AV_NOPTS_VALUE ||
2735 st->first_dts != AV_NOPTS_VALUE)) {
2736 if (pkt->duration == 0) {
2737 ff_compute_frame_duration(ic, &num, &den, st, st->parser, pkt);
2739 pkt->duration = av_rescale_rnd(1,
2740 num * (int64_t) st->time_base.den,
2741 den * (int64_t) st->time_base.num,
2745 duration = pkt->pts + pkt->duration;
2747 if (st->start_time != AV_NOPTS_VALUE)
2748 duration -= st->start_time;
2750 duration -= st->first_dts;
2752 if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
2753 (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2754 st->duration = duration;
2755 st->info->last_duration = duration;
2758 av_packet_unref(pkt);
2761 /* check if all audio/video streams have valid duration */
2764 for (i = 0; i < ic->nb_streams; i++) {
2765 st = ic->streams[i];
2766 switch (st->codecpar->codec_type) {
2767 case AVMEDIA_TYPE_VIDEO:
2768 case AVMEDIA_TYPE_AUDIO:
2769 if (st->duration == AV_NOPTS_VALUE)
2776 ++retry <= DURATION_MAX_RETRY);
2778 av_opt_set(ic, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN);
2780 /* warn about audio/video streams which duration could not be estimated */
2781 for (i = 0; i < ic->nb_streams; i++) {
2782 st = ic->streams[i];
2783 if (st->duration == AV_NOPTS_VALUE) {
2784 switch (st->codecpar->codec_type) {
2785 case AVMEDIA_TYPE_VIDEO:
2786 case AVMEDIA_TYPE_AUDIO:
2787 if (st->start_time != AV_NOPTS_VALUE || st->first_dts != AV_NOPTS_VALUE) {
2788 av_log(ic, AV_LOG_DEBUG, "stream %d : no PTS found at end of file, duration not set\n", i);
2790 av_log(ic, AV_LOG_DEBUG, "stream %d : no TS found at start of file, duration not set\n", i);
2794 fill_all_stream_timings(ic);
2796 avio_seek(ic->pb, old_offset, SEEK_SET);
2797 for (i = 0; i < ic->nb_streams; i++) {
2800 st = ic->streams[i];
2801 st->cur_dts = st->first_dts;
2802 st->last_IP_pts = AV_NOPTS_VALUE;
2803 st->last_dts_for_order_check = AV_NOPTS_VALUE;
2804 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
2805 st->pts_buffer[j] = AV_NOPTS_VALUE;
2809 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2813 /* get the file size, if possible */
2814 if (ic->iformat->flags & AVFMT_NOFILE) {
2817 file_size = avio_size(ic->pb);
2818 file_size = FFMAX(0, file_size);
2821 if ((!strcmp(ic->iformat->name, "mpeg") ||
2822 !strcmp(ic->iformat->name, "mpegts")) &&
2823 file_size && ic->pb->seekable) {
2824 /* get accurate estimate from the PTSes */
2825 estimate_timings_from_pts(ic, old_offset);
2826 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2827 } else if (has_duration(ic)) {
2828 /* at least one component has timings - we use them for all
2830 fill_all_stream_timings(ic);
2831 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2833 /* less precise: use bitrate info */
2834 estimate_timings_from_bit_rate(ic);
2835 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2837 update_stream_timings(ic);
2841 AVStream av_unused *st;
2842 for (i = 0; i < ic->nb_streams; i++) {
2843 st = ic->streams[i];
2844 av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %0.3f duration: %0.3f\n", i,
2845 (double) st->start_time * av_q2d(st->time_base),
2846 (double) st->duration * av_q2d(st->time_base));
2848 av_log(ic, AV_LOG_TRACE,
2849 "format: start_time: %0.3f duration: %0.3f bitrate=%"PRId64" kb/s\n",
2850 (double) ic->start_time / AV_TIME_BASE,
2851 (double) ic->duration / AV_TIME_BASE,
2852 (int64_t)ic->bit_rate / 1000);
2856 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2858 AVCodecContext *avctx = st->internal->avctx;
2860 #define FAIL(errmsg) do { \
2862 *errmsg_ptr = errmsg; \
2866 if ( avctx->codec_id == AV_CODEC_ID_NONE
2867 && avctx->codec_type != AVMEDIA_TYPE_DATA)
2868 FAIL("unknown codec");
2869 switch (avctx->codec_type) {
2870 case AVMEDIA_TYPE_AUDIO:
2871 if (!avctx->frame_size && determinable_frame_size(avctx))
2872 FAIL("unspecified frame size");
2873 if (st->info->found_decoder >= 0 &&
2874 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2875 FAIL("unspecified sample format");
2876 if (!avctx->sample_rate)
2877 FAIL("unspecified sample rate");
2878 if (!avctx->channels)
2879 FAIL("unspecified number of channels");
2880 if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
2881 FAIL("no decodable DTS frames");
2883 case AVMEDIA_TYPE_VIDEO:
2885 FAIL("unspecified size");
2886 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
2887 FAIL("unspecified pixel format");
2888 if (st->codecpar->codec_id == AV_CODEC_ID_RV30 || st->codecpar->codec_id == AV_CODEC_ID_RV40)
2889 if (!st->sample_aspect_ratio.num && !st->codecpar->sample_aspect_ratio.num && !st->codec_info_nb_frames)
2890 FAIL("no frame in rv30/40 and no sar");
2892 case AVMEDIA_TYPE_SUBTITLE:
2893 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
2894 FAIL("unspecified size");
2896 case AVMEDIA_TYPE_DATA:
2897 if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
2903 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2904 static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
2905 AVDictionary **options)
2907 AVCodecContext *avctx = st->internal->avctx;
2908 const AVCodec *codec;
2909 int got_picture = 1, ret = 0;
2910 AVFrame *frame = av_frame_alloc();
2911 AVSubtitle subtitle;
2912 AVPacket pkt = *avpkt;
2913 int do_skip_frame = 0;
2914 enum AVDiscard skip_frame;
2917 return AVERROR(ENOMEM);
2919 if (!avcodec_is_open(avctx) &&
2920 st->info->found_decoder <= 0 &&
2921 (st->codecpar->codec_id != -st->info->found_decoder || !st->codecpar->codec_id)) {
2922 AVDictionary *thread_opt = NULL;
2924 codec = find_probe_decoder(s, st, st->codecpar->codec_id);
2927 st->info->found_decoder = -st->codecpar->codec_id;
2932 /* Force thread count to 1 since the H.264 decoder will not extract
2933 * SPS and PPS to extradata during multi-threaded decoding. */
2934 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2935 if (s->codec_whitelist)
2936 av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
2937 ret = avcodec_open2(avctx, codec, options ? options : &thread_opt);
2939 av_dict_free(&thread_opt);
2941 st->info->found_decoder = -avctx->codec_id;
2944 st->info->found_decoder = 1;
2945 } else if (!st->info->found_decoder)
2946 st->info->found_decoder = 1;
2948 if (st->info->found_decoder < 0) {
2953 if (avpriv_codec_get_cap_skip_frame_fill_param(avctx->codec)) {
2955 skip_frame = avctx->skip_frame;
2956 avctx->skip_frame = AVDISCARD_ALL;
2959 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2961 (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
2962 (!st->codec_info_nb_frames &&
2963 (avctx->codec->capabilities & AV_CODEC_CAP_CHANNEL_CONF)))) {
2965 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
2966 avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
2967 ret = avcodec_send_packet(avctx, &pkt);
2968 if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
2972 ret = avcodec_receive_frame(avctx, frame);
2975 if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
2977 } else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2978 ret = avcodec_decode_subtitle2(avctx, &subtitle,
2979 &got_picture, &pkt);
2985 st->nb_decoded_frames++;
2990 if (!pkt.data && !got_picture)
2994 if (do_skip_frame) {
2995 avctx->skip_frame = skip_frame;
2998 av_frame_free(&frame);
3002 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
3004 while (tags->id != AV_CODEC_ID_NONE) {
3012 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
3015 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3016 if (tag == tags[i].tag)
3018 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3019 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
3021 return AV_CODEC_ID_NONE;
3024 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
3026 if (bps <= 0 || bps > 64)
3027 return AV_CODEC_ID_NONE;
3032 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
3034 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
3036 return AV_CODEC_ID_NONE;
3041 if (sflags & (1 << (bps - 1))) {
3044 return AV_CODEC_ID_PCM_S8;
3046 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
3048 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
3050 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
3052 return be ? AV_CODEC_ID_PCM_S64BE : AV_CODEC_ID_PCM_S64LE;
3054 return AV_CODEC_ID_NONE;
3059 return AV_CODEC_ID_PCM_U8;
3061 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
3063 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
3065 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
3067 return AV_CODEC_ID_NONE;
3073 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
3076 if (!av_codec_get_tag2(tags, id, &tag))
3081 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
3085 for (i = 0; tags && tags[i]; i++) {
3086 const AVCodecTag *codec_tags = tags[i];
3087 while (codec_tags->id != AV_CODEC_ID_NONE) {
3088 if (codec_tags->id == id) {
3089 *tag = codec_tags->tag;
3098 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
3101 for (i = 0; tags && tags[i]; i++) {
3102 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
3103 if (id != AV_CODEC_ID_NONE)
3106 return AV_CODEC_ID_NONE;
3109 static void compute_chapters_end(AVFormatContext *s)
3112 int64_t max_time = 0;
3114 if (s->duration > 0 && s->start_time < INT64_MAX - s->duration)
3115 max_time = s->duration +
3116 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
3118 for (i = 0; i < s->nb_chapters; i++)
3119 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
3120 AVChapter *ch = s->chapters[i];
3121 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
3125 for (j = 0; j < s->nb_chapters; j++) {
3126 AVChapter *ch1 = s->chapters[j];
3127 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
3129 if (j != i && next_start > ch->start && next_start < end)
3132 ch->end = (end == INT64_MAX) ? ch->start : end;
3136 static int get_std_framerate(int i)
3139 return (i + 1) * 1001;
3143 return (i + 31) * 1001 * 12;
3147 return ((const int[]) { 80, 120, 240})[i] * 1001 * 12;
3151 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
3154 /* Is the time base unreliable?
3155 * This is a heuristic to balance between quick acceptance of the values in
3156 * the headers vs. some extra checks.
3157 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
3158 * MPEG-2 commonly misuses field repeat flags to store different framerates.
3159 * And there are "variable" fps files this needs to detect as well. */
3160 static int tb_unreliable(AVCodecContext *c)
3162 if (c->time_base.den >= 101LL * c->time_base.num ||
3163 c->time_base.den < 5LL * c->time_base.num ||
3164 // c->codec_tag == AV_RL32("DIVX") ||
3165 // c->codec_tag == AV_RL32("XVID") ||
3166 c->codec_tag == AV_RL32("mp4v") ||
3167 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
3168 c->codec_id == AV_CODEC_ID_GIF ||
3169 c->codec_id == AV_CODEC_ID_HEVC ||
3170 c->codec_id == AV_CODEC_ID_H264)
3175 int ff_alloc_extradata(AVCodecParameters *par, int size)
3179 if (size < 0 || size >= INT32_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
3180 par->extradata = NULL;
3181 par->extradata_size = 0;
3182 return AVERROR(EINVAL);
3184 par->extradata = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
3185 if (par->extradata) {
3186 memset(par->extradata + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3187 par->extradata_size = size;
3190 par->extradata_size = 0;
3191 ret = AVERROR(ENOMEM);
3196 int ff_get_extradata(AVFormatContext *s, AVCodecParameters *par, AVIOContext *pb, int size)
3198 int ret = ff_alloc_extradata(par, size);
3201 ret = avio_read(pb, par->extradata, size);
3203 av_freep(&par->extradata);
3204 par->extradata_size = 0;
3205 av_log(s, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
3206 return ret < 0 ? ret : AVERROR_INVALIDDATA;
3212 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
3215 int64_t last = st->info->last_dts;
3217 if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
3218 && ts - (uint64_t)last < INT64_MAX) {
3219 double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
3220 int64_t duration = ts - last;
3222 if (!st->info->duration_error)
3223 st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
3224 if (!st->info->duration_error)
3225 return AVERROR(ENOMEM);
3227 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3228 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
3229 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3230 if (st->info->duration_error[0][1][i] < 1e10) {
3231 int framerate = get_std_framerate(i);
3232 double sdts = dts*framerate/(1001*12);
3233 for (j= 0; j<2; j++) {
3234 int64_t ticks = llrint(sdts+j*0.5);
3235 double error= sdts - ticks + j*0.5;
3236 st->info->duration_error[j][0][i] += error;
3237 st->info->duration_error[j][1][i] += error*error;
3241 st->info->duration_count++;
3242 st->info->rfps_duration_sum += duration;
3244 if (st->info->duration_count % 10 == 0) {
3245 int n = st->info->duration_count;
3246 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3247 if (st->info->duration_error[0][1][i] < 1e10) {
3248 double a0 = st->info->duration_error[0][0][i] / n;
3249 double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
3250 double a1 = st->info->duration_error[1][0][i] / n;
3251 double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
3252 if (error0 > 0.04 && error1 > 0.04) {
3253 st->info->duration_error[0][1][i] = 2e10;
3254 st->info->duration_error[1][1][i] = 2e10;
3260 // ignore the first 4 values, they might have some random jitter
3261 if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
3262 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
3264 if (ts != AV_NOPTS_VALUE)
3265 st->info->last_dts = ts;
3270 void ff_rfps_calculate(AVFormatContext *ic)
3274 for (i = 0; i < ic->nb_streams; i++) {
3275 AVStream *st = ic->streams[i];
3277 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
3279 // the check for tb_unreliable() is not completely correct, since this is not about handling
3280 // an unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3281 // ipmovie.c produces.
3282 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)
3283 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);
3284 if (st->info->duration_count>1 && !st->r_frame_rate.num
3285 && tb_unreliable(st->internal->avctx)) {
3287 double best_error= 0.01;
3288 AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
3290 for (j= 0; j<MAX_STD_TIMEBASES; j++) {
3293 if (st->info->codec_info_duration &&
3294 st->info->codec_info_duration*av_q2d(st->time_base) < (1001*11.5)/get_std_framerate(j))
3296 if (!st->info->codec_info_duration && get_std_framerate(j) < 1001*12)
3299 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
3302 for (k= 0; k<2; k++) {
3303 int n = st->info->duration_count;
3304 double a= st->info->duration_error[k][0][j] / n;
3305 double error= st->info->duration_error[k][1][j]/n - a*a;
3307 if (error < best_error && best_error> 0.000000001) {
3309 num = get_std_framerate(j);
3312 av_log(ic, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
3315 // do not increase frame rate by more than 1 % in order to match a standard rate.
3316 if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
3317 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
3319 if ( !st->avg_frame_rate.num
3320 && st->r_frame_rate.num && st->info->rfps_duration_sum
3321 && st->info->codec_info_duration <= 0
3322 && st->info->duration_count > 2
3323 && 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
3325 av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
3326 st->avg_frame_rate = st->r_frame_rate;
3329 av_freep(&st->info->duration_error);
3330 st->info->last_dts = AV_NOPTS_VALUE;
3331 st->info->duration_count = 0;
3332 st->info->rfps_duration_sum = 0;
3336 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3338 int i, count = 0, ret = 0, j;
3341 AVCodecContext *avctx;
3342 AVPacket pkt1, *pkt;
3343 int64_t old_offset = avio_tell(ic->pb);
3344 // new streams might appear, no options for those
3345 int orig_nb_streams = ic->nb_streams;
3347 int64_t max_analyze_duration = ic->max_analyze_duration;
3348 int64_t max_stream_analyze_duration;
3349 int64_t max_subtitle_analyze_duration;
3350 int64_t probesize = ic->probesize;
3351 int eof_reached = 0;
3353 flush_codecs = probesize > 0;
3355 av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3357 max_stream_analyze_duration = max_analyze_duration;
3358 max_subtitle_analyze_duration = max_analyze_duration;
3359 if (!max_analyze_duration) {
3360 max_stream_analyze_duration =
3361 max_analyze_duration = 5*AV_TIME_BASE;
3362 max_subtitle_analyze_duration = 30*AV_TIME_BASE;
3363 if (!strcmp(ic->iformat->name, "flv"))
3364 max_stream_analyze_duration = 90*AV_TIME_BASE;
3365 if (!strcmp(ic->iformat->name, "mpeg") || !strcmp(ic->iformat->name, "mpegts"))
3366 max_stream_analyze_duration = 7*AV_TIME_BASE;
3370 av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d nb_streams:%d\n",
3371 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, ic->nb_streams);
3373 for (i = 0; i < ic->nb_streams; i++) {
3374 const AVCodec *codec;
3375 AVDictionary *thread_opt = NULL;
3376 st = ic->streams[i];
3377 avctx = st->internal->avctx;
3379 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3380 st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3381 /* if (!st->time_base.num)
3383 if (!avctx->time_base.num)
3384 avctx->time_base = st->time_base;
3386 // only for the split stuff
3387 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->request_probe <= 0) {
3388 st->parser = av_parser_init(st->codecpar->codec_id);
3390 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3391 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3392 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3393 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3395 } else if (st->need_parsing) {
3396 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3397 "%s, packets or times may be invalid.\n",
3398 avcodec_get_name(st->codecpar->codec_id));
3402 /* check if the caller has overridden the codec id */
3403 #if FF_API_LAVF_AVCTX
3404 FF_DISABLE_DEPRECATION_WARNINGS
3405 if (st->codec->codec_id != st->internal->orig_codec_id) {
3406 st->codecpar->codec_id = st->codec->codec_id;
3407 st->codecpar->codec_type = st->codec->codec_type;
3408 st->internal->orig_codec_id = st->codec->codec_id;
3410 FF_ENABLE_DEPRECATION_WARNINGS
3412 if (st->codecpar->codec_id != st->internal->orig_codec_id)
3413 st->internal->orig_codec_id = st->codecpar->codec_id;
3415 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3417 goto find_stream_info_err;
3418 if (st->request_probe <= 0)
3419 st->internal->avctx_inited = 1;
3421 codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3423 /* Force thread count to 1 since the H.264 decoder will not extract
3424 * SPS and PPS to extradata during multi-threaded decoding. */
3425 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3427 if (ic->codec_whitelist)
3428 av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3430 /* Ensure that subtitle_header is properly set. */
3431 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE
3432 && codec && !avctx->codec) {
3433 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3434 av_log(ic, AV_LOG_WARNING,
3435 "Failed to open codec in av_find_stream_info\n");
3438 // Try to just open decoders, in case this is enough to get parameters.
3439 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3440 if (codec && !avctx->codec)
3441 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3442 av_log(ic, AV_LOG_WARNING,
3443 "Failed to open codec in av_find_stream_info\n");
3446 av_dict_free(&thread_opt);
3449 for (i = 0; i < ic->nb_streams; i++) {
3450 #if FF_API_R_FRAME_RATE
3451 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3453 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3454 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
3459 int analyzed_all_streams;
3460 if (ff_check_interrupt(&ic->interrupt_callback)) {
3462 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3466 /* check if one codec still needs to be handled */
3467 for (i = 0; i < ic->nb_streams; i++) {
3468 int fps_analyze_framecount = 20;
3470 st = ic->streams[i];
3471 if (!has_codec_parameters(st, NULL))
3473 /* If the timebase is coarse (like the usual millisecond precision
3474 * of mkv), we need to analyze more frames to reliably arrive at
3475 * the correct fps. */
3476 if (av_q2d(st->time_base) > 0.0005)
3477 fps_analyze_framecount *= 2;
3478 if (!tb_unreliable(st->internal->avctx))
3479 fps_analyze_framecount = 0;
3480 if (ic->fps_probe_size >= 0)
3481 fps_analyze_framecount = ic->fps_probe_size;
3482 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3483 fps_analyze_framecount = 0;
3484 /* variable fps and no guess at the real fps */
3485 if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3486 st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3487 int count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
3488 st->info->codec_info_duration_fields/2 :
3489 st->info->duration_count;
3490 if (count < fps_analyze_framecount)
3493 if (st->parser && st->parser->parser->split &&
3494 !st->internal->avctx->extradata)
3496 if (st->first_dts == AV_NOPTS_VALUE &&
3497 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3498 st->codec_info_nb_frames < ((st->disposition & AV_DISPOSITION_ATTACHED_PIC) ? 1 : ic->max_ts_probe) &&
3499 (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3500 st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))
3503 analyzed_all_streams = 0;
3504 if (i == ic->nb_streams) {
3505 analyzed_all_streams = 1;
3506 /* NOTE: If the format has no header, then we need to read some
3507 * packets to get most of the streams, so we cannot stop here. */
3508 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3509 /* If we found the info for all the codecs, we can stop. */
3511 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3516 /* We did not get all the codec info, but we read too much data. */
3517 if (read_size >= probesize) {
3519 av_log(ic, AV_LOG_DEBUG,
3520 "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3521 for (i = 0; i < ic->nb_streams; i++)
3522 if (!ic->streams[i]->r_frame_rate.num &&
3523 ic->streams[i]->info->duration_count <= 1 &&
3524 ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
3525 strcmp(ic->iformat->name, "image2"))
3526 av_log(ic, AV_LOG_WARNING,
3527 "Stream #%d: not enough frames to estimate rate; "
3528 "consider increasing probesize\n", i);
3532 /* NOTE: A new stream can be added there if no header in file
3533 * (AVFMTCTX_NOHEADER). */
3534 ret = read_frame_internal(ic, &pkt1);
3535 if (ret == AVERROR(EAGAIN))
3546 if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
3547 ret = add_to_pktbuf(&ic->internal->packet_buffer, pkt,
3548 &ic->internal->packet_buffer_end, 0);
3550 goto find_stream_info_err;
3553 st = ic->streams[pkt->stream_index];
3554 if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3555 read_size += pkt->size;
3557 avctx = st->internal->avctx;
3558 if (!st->internal->avctx_inited) {
3559 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3561 goto find_stream_info_err;
3562 st->internal->avctx_inited = 1;
3565 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3566 /* check for non-increasing dts */
3567 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3568 st->info->fps_last_dts >= pkt->dts) {
3569 av_log(ic, AV_LOG_DEBUG,
3570 "Non-increasing DTS in stream %d: packet %d with DTS "
3571 "%"PRId64", packet %d with DTS %"PRId64"\n",
3572 st->index, st->info->fps_last_dts_idx,
3573 st->info->fps_last_dts, st->codec_info_nb_frames,
3575 st->info->fps_first_dts =
3576 st->info->fps_last_dts = AV_NOPTS_VALUE;
3578 /* Check for a discontinuity in dts. If the difference in dts
3579 * is more than 1000 times the average packet duration in the
3580 * sequence, we treat it as a discontinuity. */
3581 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3582 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3583 (pkt->dts - st->info->fps_last_dts) / 1000 >
3584 (st->info->fps_last_dts - st->info->fps_first_dts) /
3585 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3586 av_log(ic, AV_LOG_WARNING,
3587 "DTS discontinuity in stream %d: packet %d with DTS "
3588 "%"PRId64", packet %d with DTS %"PRId64"\n",
3589 st->index, st->info->fps_last_dts_idx,
3590 st->info->fps_last_dts, st->codec_info_nb_frames,
3592 st->info->fps_first_dts =
3593 st->info->fps_last_dts = AV_NOPTS_VALUE;
3596 /* update stored dts values */
3597 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3598 st->info->fps_first_dts = pkt->dts;
3599 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3601 st->info->fps_last_dts = pkt->dts;
3602 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3604 if (st->codec_info_nb_frames>1) {
3608 if (st->time_base.den > 0)
3609 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3610 if (st->avg_frame_rate.num > 0)
3611 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3614 && st->codec_info_nb_frames>30
3615 && st->info->fps_first_dts != AV_NOPTS_VALUE
3616 && st->info->fps_last_dts != AV_NOPTS_VALUE)
3617 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3619 if (analyzed_all_streams) limit = max_analyze_duration;
3620 else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) limit = max_subtitle_analyze_duration;
3621 else limit = max_stream_analyze_duration;
3624 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds st:%d\n",
3626 t, pkt->stream_index);
3627 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3628 av_packet_unref(pkt);
3631 if (pkt->duration) {
3632 if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE && pkt->pts != AV_NOPTS_VALUE && pkt->pts >= st->start_time) {
3633 st->info->codec_info_duration = FFMIN(pkt->pts - st->start_time, st->info->codec_info_duration + pkt->duration);
3635 st->info->codec_info_duration += pkt->duration;
3636 st->info->codec_info_duration_fields += st->parser && st->need_parsing && avctx->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3639 #if FF_API_R_FRAME_RATE
3640 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
3641 ff_rfps_add_frame(ic, st, pkt->dts);
3643 if (st->parser && st->parser->parser->split && !avctx->extradata) {
3644 int i = st->parser->parser->split(avctx, pkt->data, pkt->size);
3645 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
3646 avctx->extradata_size = i;
3647 avctx->extradata = av_mallocz(avctx->extradata_size +
3648 AV_INPUT_BUFFER_PADDING_SIZE);
3649 if (!avctx->extradata)
3650 return AVERROR(ENOMEM);
3651 memcpy(avctx->extradata, pkt->data,
3652 avctx->extradata_size);
3656 /* If still no information, we try to open the codec and to
3657 * decompress the frame. We try to avoid that in most cases as
3658 * it takes longer and uses more memory. For MPEG-4, we need to
3659 * decompress for QuickTime.
3661 * If AV_CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3662 * least one frame of codec data, this makes sure the codec initializes
3663 * the channel configuration and does not only trust the values from
3665 try_decode_frame(ic, st, pkt,
3666 (options && i < orig_nb_streams) ? &options[i] : NULL);
3668 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3669 av_packet_unref(pkt);
3671 st->codec_info_nb_frames++;
3677 for (stream_index = 0; stream_index < ic->nb_streams; stream_index++) {
3678 st = ic->streams[stream_index];
3679 avctx = st->internal->avctx;
3680 if (!has_codec_parameters(st, NULL)) {
3681 const AVCodec *codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3682 if (codec && !avctx->codec) {
3683 if (avcodec_open2(avctx, codec, (options && stream_index < orig_nb_streams) ? &options[stream_index] : NULL) < 0)
3684 av_log(ic, AV_LOG_WARNING,
3685 "Failed to open codec in av_find_stream_info\n");
3689 // EOF already reached while reading the stream above.
3690 // So continue with reoordering DTS with whatever delay we have.
3691 if (ic->internal->packet_buffer && !has_decode_delay_been_guessed(st)) {
3692 update_dts_from_pts(ic, stream_index, ic->internal->packet_buffer);
3698 AVPacket empty_pkt = { 0 };
3700 av_init_packet(&empty_pkt);
3702 for (i = 0; i < ic->nb_streams; i++) {
3704 st = ic->streams[i];
3706 /* flush the decoders */
3707 if (st->info->found_decoder == 1) {
3709 err = try_decode_frame(ic, st, &empty_pkt,
3710 (options && i < orig_nb_streams)
3711 ? &options[i] : NULL);
3712 } while (err > 0 && !has_codec_parameters(st, NULL));
3715 av_log(ic, AV_LOG_INFO,
3716 "decoding for stream %d failed\n", st->index);
3722 // close codecs which were opened in try_decode_frame()
3723 for (i = 0; i < ic->nb_streams; i++) {
3724 st = ic->streams[i];
3725 avcodec_close(st->internal->avctx);
3728 ff_rfps_calculate(ic);
3730 for (i = 0; i < ic->nb_streams; i++) {
3731 st = ic->streams[i];
3732 avctx = st->internal->avctx;
3733 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
3734 if (avctx->codec_id == AV_CODEC_ID_RAWVIDEO && !avctx->codec_tag && !avctx->bits_per_coded_sample) {
3735 uint32_t tag= avcodec_pix_fmt_to_codec_tag(avctx->pix_fmt);
3736 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == avctx->pix_fmt)
3737 avctx->codec_tag= tag;
3740 /* estimate average framerate if not set by demuxer */
3741 if (st->info->codec_info_duration_fields &&
3742 !st->avg_frame_rate.num &&
3743 st->info->codec_info_duration) {
3745 double best_error = 0.01;
3747 if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
3748 st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
3749 st->info->codec_info_duration < 0)
3751 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3752 st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
3753 st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
3755 /* Round guessed framerate to a "standard" framerate if it's
3756 * within 1% of the original estimate. */
3757 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
3758 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
3759 double error = fabs(av_q2d(st->avg_frame_rate) /
3760 av_q2d(std_fps) - 1);
3762 if (error < best_error) {
3764 best_fps = std_fps.num;
3768 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3769 best_fps, 12 * 1001, INT_MAX);
3772 if (!st->r_frame_rate.num) {
3773 if ( avctx->time_base.den * (int64_t) st->time_base.num
3774 <= avctx->time_base.num * avctx->ticks_per_frame * (int64_t) st->time_base.den) {
3775 st->r_frame_rate.num = avctx->time_base.den;
3776 st->r_frame_rate.den = avctx->time_base.num * avctx->ticks_per_frame;
3778 st->r_frame_rate.num = st->time_base.den;
3779 st->r_frame_rate.den = st->time_base.num;
3782 if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
3783 AVRational hw_ratio = { avctx->height, avctx->width };
3784 st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
3787 } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
3788 if (!avctx->bits_per_coded_sample)
3789 avctx->bits_per_coded_sample =
3790 av_get_bits_per_sample(avctx->codec_id);
3791 // set stream disposition based on audio service type
3792 switch (avctx->audio_service_type) {
3793 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
3794 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
3796 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
3797 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
3799 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
3800 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
3802 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
3803 st->disposition = AV_DISPOSITION_COMMENT;
3805 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
3806 st->disposition = AV_DISPOSITION_KARAOKE;
3813 estimate_timings(ic, old_offset);
3815 av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
3817 if (ret >= 0 && ic->nb_streams)
3818 /* We could not have all the codec parameters before EOF. */
3820 for (i = 0; i < ic->nb_streams; i++) {
3822 st = ic->streams[i];
3824 /* if no packet was ever seen, update context now for has_codec_parameters */
3825 if (!st->internal->avctx_inited) {
3826 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
3827 st->codecpar->format == AV_SAMPLE_FMT_NONE)
3828 st->codecpar->format = st->internal->avctx->sample_fmt;
3829 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
3831 goto find_stream_info_err;
3833 if (!has_codec_parameters(st, &errmsg)) {
3835 avcodec_string(buf, sizeof(buf), st->internal->avctx, 0);
3836 av_log(ic, AV_LOG_WARNING,
3837 "Could not find codec parameters for stream %d (%s): %s\n"
3838 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
3845 compute_chapters_end(ic);
3847 /* update the stream parameters from the internal codec contexts */
3848 for (i = 0; i < ic->nb_streams; i++) {
3849 st = ic->streams[i];
3851 if (st->internal->avctx_inited) {
3852 int orig_w = st->codecpar->width;
3853 int orig_h = st->codecpar->height;
3854 ret = avcodec_parameters_from_context(st->codecpar, st->internal->avctx);
3856 goto find_stream_info_err;
3857 // The decoder might reduce the video size by the lowres factor.
3858 if (av_codec_get_lowres(st->internal->avctx) && orig_w) {
3859 st->codecpar->width = orig_w;
3860 st->codecpar->height = orig_h;
3864 #if FF_API_LAVF_AVCTX
3865 FF_DISABLE_DEPRECATION_WARNINGS
3866 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
3868 goto find_stream_info_err;
3870 // The old API (AVStream.codec) "requires" the resolution to be adjusted
3871 // by the lowres factor.
3872 if (av_codec_get_lowres(st->internal->avctx) && st->internal->avctx->width) {
3873 av_codec_set_lowres(st->codec, av_codec_get_lowres(st->internal->avctx));
3874 st->codec->width = st->internal->avctx->width;
3875 st->codec->height = st->internal->avctx->height;
3878 if (st->codec->codec_tag != MKTAG('t','m','c','d')) {
3879 st->codec->time_base = st->internal->avctx->time_base;
3880 st->codec->ticks_per_frame = st->internal->avctx->ticks_per_frame;
3882 st->codec->framerate = st->avg_frame_rate;
3884 if (st->internal->avctx->subtitle_header) {
3885 st->codec->subtitle_header = av_malloc(st->internal->avctx->subtitle_header_size);
3886 if (!st->codec->subtitle_header)
3887 goto find_stream_info_err;
3888 st->codec->subtitle_header_size = st->internal->avctx->subtitle_header_size;
3889 memcpy(st->codec->subtitle_header, st->internal->avctx->subtitle_header,
3890 st->codec->subtitle_header_size);
3893 // Fields unavailable in AVCodecParameters
3894 st->codec->coded_width = st->internal->avctx->coded_width;
3895 st->codec->coded_height = st->internal->avctx->coded_height;
3896 st->codec->properties = st->internal->avctx->properties;
3897 FF_ENABLE_DEPRECATION_WARNINGS
3900 st->internal->avctx_inited = 0;
3903 find_stream_info_err:
3904 for (i = 0; i < ic->nb_streams; i++) {
3905 st = ic->streams[i];
3907 av_freep(&st->info->duration_error);
3908 av_freep(&ic->streams[i]->info);
3911 av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
3912 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
3916 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
3920 for (i = 0; i < ic->nb_programs; i++) {
3921 if (ic->programs[i] == last) {
3925 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
3926 if (ic->programs[i]->stream_index[j] == s)
3927 return ic->programs[i];
3933 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
3934 int wanted_stream_nb, int related_stream,
3935 AVCodec **decoder_ret, int flags)
3937 int i, nb_streams = ic->nb_streams;
3938 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe;
3939 unsigned *program = NULL;
3940 const AVCodec *decoder = NULL, *best_decoder = NULL;
3942 if (related_stream >= 0 && wanted_stream_nb < 0) {
3943 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
3945 program = p->stream_index;
3946 nb_streams = p->nb_stream_indexes;
3949 for (i = 0; i < nb_streams; i++) {
3950 int real_stream_index = program ? program[i] : i;
3951 AVStream *st = ic->streams[real_stream_index];
3952 AVCodecParameters *par = st->codecpar;
3953 if (par->codec_type != type)
3955 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
3957 if (wanted_stream_nb != real_stream_index &&
3958 st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED |
3959 AV_DISPOSITION_VISUAL_IMPAIRED))
3961 if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate))
3964 decoder = find_decoder(ic, st, par->codec_id);
3967 ret = AVERROR_DECODER_NOT_FOUND;
3971 count = st->codec_info_nb_frames;
3972 bitrate = par->bit_rate;
3973 multiframe = FFMIN(5, count);
3974 if ((best_multiframe > multiframe) ||
3975 (best_multiframe == multiframe && best_bitrate > bitrate) ||
3976 (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
3979 best_bitrate = bitrate;
3980 best_multiframe = multiframe;
3981 ret = real_stream_index;
3982 best_decoder = decoder;
3983 if (program && i == nb_streams - 1 && ret < 0) {
3985 nb_streams = ic->nb_streams;
3986 /* no related stream found, try again with everything */
3991 *decoder_ret = (AVCodec*)best_decoder;
3995 /*******************************************************/
3997 int av_read_play(AVFormatContext *s)
3999 if (s->iformat->read_play)
4000 return s->iformat->read_play(s);
4002 return avio_pause(s->pb, 0);
4003 return AVERROR(ENOSYS);
4006 int av_read_pause(AVFormatContext *s)
4008 if (s->iformat->read_pause)
4009 return s->iformat->read_pause(s);
4011 return avio_pause(s->pb, 1);
4012 return AVERROR(ENOSYS);
4015 int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src)
4020 dst->time_base = src->time_base;
4021 dst->nb_frames = src->nb_frames;
4022 dst->disposition = src->disposition;
4023 dst->sample_aspect_ratio = src->sample_aspect_ratio;
4024 dst->avg_frame_rate = src->avg_frame_rate;
4025 dst->r_frame_rate = src->r_frame_rate;
4027 av_dict_free(&dst->metadata);
4028 ret = av_dict_copy(&dst->metadata, src->metadata, 0);
4032 ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
4036 /* Free existing side data*/
4037 for (i = 0; i < dst->nb_side_data; i++)
4038 av_free(dst->side_data[i].data);
4039 av_freep(&dst->side_data);
4040 dst->nb_side_data = 0;
4042 /* Copy side data if present */
4043 if (src->nb_side_data) {
4044 dst->side_data = av_mallocz_array(src->nb_side_data,
4045 sizeof(AVPacketSideData));
4046 if (!dst->side_data)
4047 return AVERROR(ENOMEM);
4048 dst->nb_side_data = src->nb_side_data;
4050 for (i = 0; i < src->nb_side_data; i++) {
4051 uint8_t *data = av_memdup(src->side_data[i].data,
4052 src->side_data[i].size);
4054 return AVERROR(ENOMEM);
4055 dst->side_data[i].type = src->side_data[i].type;
4056 dst->side_data[i].size = src->side_data[i].size;
4057 dst->side_data[i].data = data;
4061 av_freep(&dst->recommended_encoder_configuration);
4062 if (src->recommended_encoder_configuration) {
4063 const char *conf_str = src->recommended_encoder_configuration;
4064 dst->recommended_encoder_configuration = av_strdup(conf_str);
4065 if (!dst->recommended_encoder_configuration)
4066 return AVERROR(ENOMEM);
4072 static void free_stream(AVStream **pst)
4074 AVStream *st = *pst;
4080 for (i = 0; i < st->nb_side_data; i++)
4081 av_freep(&st->side_data[i].data);
4082 av_freep(&st->side_data);
4085 av_parser_close(st->parser);
4087 if (st->attached_pic.data)
4088 av_packet_unref(&st->attached_pic);
4091 avcodec_free_context(&st->internal->avctx);
4092 for (i = 0; i < st->internal->nb_bsfcs; i++) {
4093 av_bsf_free(&st->internal->bsfcs[i]);
4094 av_freep(&st->internal->bsfcs);
4097 av_freep(&st->internal);
4099 av_dict_free(&st->metadata);
4100 avcodec_parameters_free(&st->codecpar);
4101 av_freep(&st->probe_data.buf);
4102 av_freep(&st->index_entries);
4103 #if FF_API_LAVF_AVCTX
4104 FF_DISABLE_DEPRECATION_WARNINGS
4105 av_freep(&st->codec->extradata);
4106 av_freep(&st->codec->subtitle_header);
4107 av_freep(&st->codec);
4108 FF_ENABLE_DEPRECATION_WARNINGS
4110 av_freep(&st->priv_data);
4112 av_freep(&st->info->duration_error);
4113 av_freep(&st->info);
4114 av_freep(&st->recommended_encoder_configuration);
4115 av_freep(&st->priv_pts);
4120 void ff_free_stream(AVFormatContext *s, AVStream *st)
4122 av_assert0(s->nb_streams>0);
4123 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
4125 free_stream(&s->streams[ --s->nb_streams ]);
4128 void avformat_free_context(AVFormatContext *s)
4136 if (s->iformat && s->iformat->priv_class && s->priv_data)
4137 av_opt_free(s->priv_data);
4138 if (s->oformat && s->oformat->priv_class && s->priv_data)
4139 av_opt_free(s->priv_data);
4141 for (i = s->nb_streams - 1; i >= 0; i--)
4142 ff_free_stream(s, s->streams[i]);
4145 for (i = s->nb_programs - 1; i >= 0; i--) {
4146 av_dict_free(&s->programs[i]->metadata);
4147 av_freep(&s->programs[i]->stream_index);
4148 av_freep(&s->programs[i]);
4150 av_freep(&s->programs);
4151 av_freep(&s->priv_data);
4152 while (s->nb_chapters--) {
4153 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
4154 av_freep(&s->chapters[s->nb_chapters]);
4156 av_freep(&s->chapters);
4157 av_dict_free(&s->metadata);
4158 av_freep(&s->streams);
4159 av_freep(&s->internal);
4160 flush_packet_queue(s);
4164 void avformat_close_input(AVFormatContext **ps)
4175 if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
4176 (s->flags & AVFMT_FLAG_CUSTOM_IO))
4179 flush_packet_queue(s);
4182 if (s->iformat->read_close)
4183 s->iformat->read_close(s);
4185 avformat_free_context(s);
4192 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
4198 if (s->nb_streams >= INT_MAX/sizeof(*streams))
4200 streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
4203 s->streams = streams;
4205 st = av_mallocz(sizeof(AVStream));
4208 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
4212 st->info->last_dts = AV_NOPTS_VALUE;
4214 #if FF_API_LAVF_AVCTX
4215 FF_DISABLE_DEPRECATION_WARNINGS
4216 st->codec = avcodec_alloc_context3(c);
4222 FF_ENABLE_DEPRECATION_WARNINGS
4225 st->internal = av_mallocz(sizeof(*st->internal));
4229 st->codecpar = avcodec_parameters_alloc();
4233 st->internal->avctx = avcodec_alloc_context3(NULL);
4234 if (!st->internal->avctx)
4238 #if FF_API_LAVF_AVCTX
4239 FF_DISABLE_DEPRECATION_WARNINGS
4240 /* no default bitrate if decoding */
4241 st->codec->bit_rate = 0;
4242 FF_ENABLE_DEPRECATION_WARNINGS
4245 /* default pts setting is MPEG-like */
4246 avpriv_set_pts_info(st, 33, 1, 90000);
4247 /* we set the current DTS to 0 so that formats without any timestamps
4248 * but durations get some timestamps, formats with some unknown
4249 * timestamps have their first few packets buffered and the
4250 * timestamps corrected before they are returned to the user */
4251 st->cur_dts = RELATIVE_TS_BASE;
4253 st->cur_dts = AV_NOPTS_VALUE;
4256 st->index = s->nb_streams;
4257 st->start_time = AV_NOPTS_VALUE;
4258 st->duration = AV_NOPTS_VALUE;
4259 st->first_dts = AV_NOPTS_VALUE;
4260 st->probe_packets = MAX_PROBE_PACKETS;
4261 st->pts_wrap_reference = AV_NOPTS_VALUE;
4262 st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4264 st->last_IP_pts = AV_NOPTS_VALUE;
4265 st->last_dts_for_order_check = AV_NOPTS_VALUE;
4266 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
4267 st->pts_buffer[i] = AV_NOPTS_VALUE;
4269 st->sample_aspect_ratio = (AVRational) { 0, 1 };
4271 #if FF_API_R_FRAME_RATE
4272 st->info->last_dts = AV_NOPTS_VALUE;
4274 st->info->fps_first_dts = AV_NOPTS_VALUE;
4275 st->info->fps_last_dts = AV_NOPTS_VALUE;
4277 st->inject_global_side_data = s->internal->inject_global_side_data;
4279 st->internal->need_context_update = 1;
4281 s->streams[s->nb_streams++] = st;
4288 AVProgram *av_new_program(AVFormatContext *ac, int id)
4290 AVProgram *program = NULL;
4293 av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
4295 for (i = 0; i < ac->nb_programs; i++)
4296 if (ac->programs[i]->id == id)
4297 program = ac->programs[i];
4300 program = av_mallocz(sizeof(AVProgram));
4303 dynarray_add(&ac->programs, &ac->nb_programs, program);
4304 program->discard = AVDISCARD_NONE;
4307 program->pts_wrap_reference = AV_NOPTS_VALUE;
4308 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4310 program->start_time =
4311 program->end_time = AV_NOPTS_VALUE;
4316 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
4317 int64_t start, int64_t end, const char *title)
4319 AVChapter *chapter = NULL;
4322 if (end != AV_NOPTS_VALUE && start > end) {
4323 av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
4327 for (i = 0; i < s->nb_chapters; i++)
4328 if (s->chapters[i]->id == id)
4329 chapter = s->chapters[i];
4332 chapter = av_mallocz(sizeof(AVChapter));
4335 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
4337 av_dict_set(&chapter->metadata, "title", title, 0);
4339 chapter->time_base = time_base;
4340 chapter->start = start;
4346 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
4349 AVProgram *program = NULL;
4352 if (idx >= ac->nb_streams) {
4353 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
4357 for (i = 0; i < ac->nb_programs; i++) {
4358 if (ac->programs[i]->id != progid)
4360 program = ac->programs[i];
4361 for (j = 0; j < program->nb_stream_indexes; j++)
4362 if (program->stream_index[j] == idx)
4365 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
4368 program->stream_index = tmp;
4369 program->stream_index[program->nb_stream_indexes++] = idx;
4374 uint64_t ff_ntp_time(void)
4376 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
4379 int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags)
4382 char *q, buf1[20], c;
4383 int nd, len, percentd_found;
4395 while (av_isdigit(*p))
4396 nd = nd * 10 + *p++ - '0';
4398 } while (av_isdigit(c));
4404 if (!(flags & AV_FRAME_FILENAME_FLAGS_MULTIPLE) && percentd_found)
4409 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
4411 if ((q - buf + len) > buf_size - 1)
4413 memcpy(q, buf1, len);
4421 if ((q - buf) < buf_size - 1)
4425 if (!percentd_found)
4434 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
4436 return av_get_frame_filename2(buf, buf_size, path, number, 0);
4439 void av_url_split(char *proto, int proto_size,
4440 char *authorization, int authorization_size,
4441 char *hostname, int hostname_size,
4442 int *port_ptr, char *path, int path_size, const char *url)
4444 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
4450 if (authorization_size > 0)
4451 authorization[0] = 0;
4452 if (hostname_size > 0)
4457 /* parse protocol */
4458 if ((p = strchr(url, ':'))) {
4459 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4466 /* no protocol means plain filename */
4467 av_strlcpy(path, url, path_size);
4471 /* separate path from hostname */
4472 ls = strchr(p, '/');
4473 ls2 = strchr(p, '?');
4477 ls = FFMIN(ls, ls2);
4479 av_strlcpy(path, ls, path_size);
4481 ls = &p[strlen(p)]; // XXX
4483 /* the rest is hostname, use that to parse auth/port */
4485 /* authorization (user[:pass]@hostname) */
4487 while ((at = strchr(p, '@')) && at < ls) {
4488 av_strlcpy(authorization, at2,
4489 FFMIN(authorization_size, at + 1 - at2));
4490 p = at + 1; /* skip '@' */
4493 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4495 av_strlcpy(hostname, p + 1,
4496 FFMIN(hostname_size, brk - p));
4497 if (brk[1] == ':' && port_ptr)
4498 *port_ptr = atoi(brk + 2);
4499 } else if ((col = strchr(p, ':')) && col < ls) {
4500 av_strlcpy(hostname, p,
4501 FFMIN(col + 1 - p, hostname_size));
4503 *port_ptr = atoi(col + 1);
4505 av_strlcpy(hostname, p,
4506 FFMIN(ls + 1 - p, hostname_size));
4510 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4513 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4516 'C', 'D', 'E', 'F' };
4517 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4520 'c', 'd', 'e', 'f' };
4521 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4523 for (i = 0; i < s; i++) {
4524 buff[i * 2] = hex_table[src[i] >> 4];
4525 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4531 int ff_hex_to_data(uint8_t *data, const char *p)
4538 p += strspn(p, SPACE_CHARS);
4541 c = av_toupper((unsigned char) *p++);
4542 if (c >= '0' && c <= '9')
4544 else if (c >= 'A' && c <= 'F')
4559 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4560 unsigned int pts_num, unsigned int pts_den)
4563 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
4564 if (new_tb.num != pts_num)
4565 av_log(NULL, AV_LOG_DEBUG,
4566 "st:%d removing common factor %d from timebase\n",
4567 s->index, pts_num / new_tb.num);
4569 av_log(NULL, AV_LOG_WARNING,
4570 "st:%d has too large timebase, reducing\n", s->index);
4572 if (new_tb.num <= 0 || new_tb.den <= 0) {
4573 av_log(NULL, AV_LOG_ERROR,
4574 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4575 new_tb.num, new_tb.den,
4579 s->time_base = new_tb;
4580 #if FF_API_LAVF_AVCTX
4581 FF_DISABLE_DEPRECATION_WARNINGS
4582 av_codec_set_pkt_timebase(s->codec, new_tb);
4583 FF_ENABLE_DEPRECATION_WARNINGS
4585 av_codec_set_pkt_timebase(s->internal->avctx, new_tb);
4586 s->pts_wrap_bits = pts_wrap_bits;
4589 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4592 const char *ptr = str;
4594 /* Parse key=value pairs. */
4597 char *dest = NULL, *dest_end;
4598 int key_len, dest_len = 0;
4600 /* Skip whitespace and potential commas. */
4601 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4608 if (!(ptr = strchr(key, '=')))
4611 key_len = ptr - key;
4613 callback_get_buf(context, key, key_len, &dest, &dest_len);
4614 dest_end = dest + dest_len - 1;
4618 while (*ptr && *ptr != '\"') {
4622 if (dest && dest < dest_end)
4626 if (dest && dest < dest_end)
4634 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
4635 if (dest && dest < dest_end)
4643 int ff_find_stream_index(AVFormatContext *s, int id)
4646 for (i = 0; i < s->nb_streams; i++)
4647 if (s->streams[i]->id == id)
4652 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
4656 unsigned int codec_tag;
4657 if (ofmt->query_codec)
4658 return ofmt->query_codec(codec_id, std_compliance);
4659 else if (ofmt->codec_tag)
4660 return !!av_codec_get_tag2(ofmt->codec_tag, codec_id, &codec_tag);
4661 else if (codec_id == ofmt->video_codec ||
4662 codec_id == ofmt->audio_codec ||
4663 codec_id == ofmt->subtitle_codec ||
4664 codec_id == ofmt->data_codec)
4667 return AVERROR_PATCHWELCOME;
4670 int avformat_network_init(void)
4674 ff_network_inited_globally = 1;
4675 if ((ret = ff_network_init()) < 0)
4677 if ((ret = ff_tls_init()) < 0)
4683 int avformat_network_deinit(void)
4688 ff_network_inited_globally = 0;
4693 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4694 uint64_t channel_layout, int32_t sample_rate,
4695 int32_t width, int32_t height)
4701 return AVERROR(EINVAL);
4704 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4706 if (channel_layout) {
4708 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4712 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4714 if (width || height) {
4716 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4718 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4720 return AVERROR(ENOMEM);
4721 bytestream_put_le32(&data, flags);
4723 bytestream_put_le32(&data, channels);
4725 bytestream_put_le64(&data, channel_layout);
4727 bytestream_put_le32(&data, sample_rate);
4728 if (width || height) {
4729 bytestream_put_le32(&data, width);
4730 bytestream_put_le32(&data, height);
4735 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
4737 AVRational undef = {0, 1};
4738 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
4739 AVRational codec_sample_aspect_ratio = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
4740 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
4742 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
4743 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
4744 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
4745 stream_sample_aspect_ratio = undef;
4747 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
4748 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
4749 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
4750 frame_sample_aspect_ratio = undef;
4752 if (stream_sample_aspect_ratio.num)
4753 return stream_sample_aspect_ratio;
4755 return frame_sample_aspect_ratio;
4758 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
4760 AVRational fr = st->r_frame_rate;
4761 AVRational codec_fr = st->internal->avctx->framerate;
4762 AVRational avg_fr = st->avg_frame_rate;
4764 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
4765 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
4770 if (st->internal->avctx->ticks_per_frame > 1) {
4771 if ( codec_fr.num > 0 && codec_fr.den > 0 &&
4772 (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))
4779 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
4782 if (*spec <= '9' && *spec >= '0') /* opt:index */
4783 return strtol(spec, NULL, 0) == st->index;
4784 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
4785 *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
4786 enum AVMediaType type;
4790 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
4791 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
4792 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
4793 case 'd': type = AVMEDIA_TYPE_DATA; break;
4794 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
4795 case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
4796 default: av_assert0(0);
4798 #if FF_API_LAVF_AVCTX
4799 FF_DISABLE_DEPRECATION_WARNINGS
4800 if (type != st->codecpar->codec_type
4801 && (st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN || st->codec->codec_type != type))
4803 FF_ENABLE_DEPRECATION_WARNINGS
4805 if (type != st->codecpar->codec_type)
4808 if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
4810 if (*spec++ == ':') { /* possibly followed by :index */
4811 int i, index = strtol(spec, NULL, 0);
4812 for (i = 0; i < s->nb_streams; i++) {
4813 #if FF_API_LAVF_AVCTX
4814 FF_DISABLE_DEPRECATION_WARNINGS
4815 if ((s->streams[i]->codecpar->codec_type == type
4816 || s->streams[i]->codec->codec_type == type
4818 !(nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) &&
4820 return i == st->index;
4821 FF_ENABLE_DEPRECATION_WARNINGS
4823 if ((s->streams[i]->codecpar->codec_type == type) &&
4824 !(nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) &&
4826 return i == st->index;
4832 } else if (*spec == 'p' && *(spec + 1) == ':') {
4836 prog_id = strtol(spec, &endptr, 0);
4837 for (i = 0; i < s->nb_programs; i++) {
4838 if (s->programs[i]->id != prog_id)
4841 if (*endptr++ == ':') {
4842 int stream_idx = strtol(endptr, NULL, 0);
4843 return stream_idx >= 0 &&
4844 stream_idx < s->programs[i]->nb_stream_indexes &&
4845 st->index == s->programs[i]->stream_index[stream_idx];
4848 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
4849 if (st->index == s->programs[i]->stream_index[j])
4853 } else if (*spec == '#' ||
4854 (*spec == 'i' && *(spec + 1) == ':')) {
4857 spec += 1 + (*spec == 'i');
4858 stream_id = strtol(spec, &endptr, 0);
4860 return stream_id == st->id;
4861 } else if (*spec == 'm' && *(spec + 1) == ':') {
4862 AVDictionaryEntry *tag;
4867 val = strchr(spec, ':');
4869 key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
4871 return AVERROR(ENOMEM);
4873 tag = av_dict_get(st->metadata, key, NULL, 0);
4875 if (!val || !strcmp(tag->value, val + 1))
4884 } else if (*spec == 'u') {
4885 AVCodecParameters *par = st->codecpar;
4886 #if FF_API_LAVF_AVCTX
4887 FF_DISABLE_DEPRECATION_WARNINGS
4888 AVCodecContext *codec = st->codec;
4889 FF_ENABLE_DEPRECATION_WARNINGS
4892 switch (par->codec_type) {
4893 case AVMEDIA_TYPE_AUDIO:
4894 val = par->sample_rate && par->channels;
4895 #if FF_API_LAVF_AVCTX
4896 val = val || (codec->sample_rate && codec->channels);
4898 if (par->format == AV_SAMPLE_FMT_NONE
4899 #if FF_API_LAVF_AVCTX
4900 && codec->sample_fmt == AV_SAMPLE_FMT_NONE
4905 case AVMEDIA_TYPE_VIDEO:
4906 val = par->width && par->height;
4907 #if FF_API_LAVF_AVCTX
4908 val = val || (codec->width && codec->height);
4910 if (par->format == AV_PIX_FMT_NONE
4911 #if FF_API_LAVF_AVCTX
4912 && codec->pix_fmt == AV_PIX_FMT_NONE
4917 case AVMEDIA_TYPE_UNKNOWN:
4924 #if FF_API_LAVF_AVCTX
4925 return (par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0;
4927 return par->codec_id != AV_CODEC_ID_NONE && val != 0;
4929 } else if (!*spec) /* empty specifier, matches everything */
4932 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
4933 return AVERROR(EINVAL);
4936 int ff_generate_avci_extradata(AVStream *st)
4938 static const uint8_t avci100_1080p_extradata[] = {
4940 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4941 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4942 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4943 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
4944 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
4945 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
4946 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
4947 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
4948 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4950 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4953 static const uint8_t avci100_1080i_extradata[] = {
4955 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4956 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4957 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4958 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
4959 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
4960 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
4961 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
4962 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
4963 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
4964 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
4965 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
4967 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4970 static const uint8_t avci50_1080p_extradata[] = {
4972 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4973 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4974 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4975 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
4976 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
4977 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
4978 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
4979 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
4980 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
4982 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4985 static const uint8_t avci50_1080i_extradata[] = {
4987 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4988 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4989 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4990 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
4991 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
4992 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
4993 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
4994 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
4995 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
4996 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
4997 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
4999 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5002 static const uint8_t avci100_720p_extradata[] = {
5004 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5005 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
5006 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
5007 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
5008 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
5009 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
5010 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
5011 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
5012 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
5013 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
5015 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
5018 static const uint8_t avci50_720p_extradata[] = {
5020 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
5021 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5022 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5023 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5024 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5025 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
5026 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
5027 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
5028 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
5030 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5034 const uint8_t *data = NULL;
5037 if (st->codecpar->width == 1920) {
5038 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5039 data = avci100_1080p_extradata;
5040 size = sizeof(avci100_1080p_extradata);
5042 data = avci100_1080i_extradata;
5043 size = sizeof(avci100_1080i_extradata);
5045 } else if (st->codecpar->width == 1440) {
5046 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5047 data = avci50_1080p_extradata;
5048 size = sizeof(avci50_1080p_extradata);
5050 data = avci50_1080i_extradata;
5051 size = sizeof(avci50_1080i_extradata);
5053 } else if (st->codecpar->width == 1280) {
5054 data = avci100_720p_extradata;
5055 size = sizeof(avci100_720p_extradata);
5056 } else if (st->codecpar->width == 960) {
5057 data = avci50_720p_extradata;
5058 size = sizeof(avci50_720p_extradata);
5064 av_freep(&st->codecpar->extradata);
5065 if (ff_alloc_extradata(st->codecpar, size))
5066 return AVERROR(ENOMEM);
5067 memcpy(st->codecpar->extradata, data, size);
5072 #if FF_API_NOCONST_GET_SIDE_DATA
5073 uint8_t *av_stream_get_side_data(AVStream *st,
5074 enum AVPacketSideDataType type, int *size)
5076 uint8_t *av_stream_get_side_data(const AVStream *st,
5077 enum AVPacketSideDataType type, int *size)
5082 for (i = 0; i < st->nb_side_data; i++) {
5083 if (st->side_data[i].type == type) {
5085 *size = st->side_data[i].size;
5086 return st->side_data[i].data;
5092 uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
5095 AVPacketSideData *sd, *tmp;
5097 uint8_t *data = av_malloc(size);
5102 for (i = 0; i < st->nb_side_data; i++) {
5103 sd = &st->side_data[i];
5105 if (sd->type == type) {
5106 av_freep(&sd->data);
5113 tmp = av_realloc_array(st->side_data, st->nb_side_data + 1, sizeof(*tmp));
5119 st->side_data = tmp;
5122 sd = &st->side_data[st->nb_side_data - 1];
5129 int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
5132 const AVBitStreamFilter *bsf;
5134 AVCodecParameters *in_par;
5136 if (!(bsf = av_bsf_get_by_name(name))) {
5137 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter '%s'\n", name);
5138 return AVERROR_BSF_NOT_FOUND;
5141 if ((ret = av_bsf_alloc(bsf, &bsfc)) < 0)
5144 if (st->internal->nb_bsfcs) {
5145 in_par = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->par_out;
5146 bsfc->time_base_in = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->time_base_out;
5148 in_par = st->codecpar;
5149 bsfc->time_base_in = st->time_base;
5152 if ((ret = avcodec_parameters_copy(bsfc->par_in, in_par)) < 0) {
5157 if (args && bsfc->filter->priv_class) {
5158 const AVOption *opt = av_opt_next(bsfc->priv_data, NULL);
5159 const char * shorthand[2] = {NULL};
5162 shorthand[0] = opt->name;
5164 if ((ret = av_opt_set_from_string(bsfc->priv_data, args, shorthand, "=", ":")) < 0) {
5170 if ((ret = av_bsf_init(bsfc)) < 0) {
5175 if ((ret = av_dynarray_add_nofree(&st->internal->bsfcs, &st->internal->nb_bsfcs, bsfc))) {
5180 av_log(NULL, AV_LOG_VERBOSE,
5181 "Automatically inserted bitstream filter '%s'; args='%s'\n",
5182 name, args ? args : "");
5187 FF_DISABLE_DEPRECATION_WARNINGS
5188 int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt,
5189 AVBitStreamFilterContext *bsfc)
5193 AVPacket new_pkt = *pkt;
5194 int a = av_bitstream_filter_filter(bsfc, codec, NULL,
5195 &new_pkt.data, &new_pkt.size,
5196 pkt->data, pkt->size,
5197 pkt->flags & AV_PKT_FLAG_KEY);
5198 if (a == 0 && new_pkt.size == 0 && new_pkt.side_data_elems == 0) {
5199 av_packet_unref(pkt);
5200 memset(pkt, 0, sizeof(*pkt));
5203 if(a == 0 && new_pkt.data != pkt->data) {
5204 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
5206 memcpy(t, new_pkt.data, new_pkt.size);
5207 memset(t + new_pkt.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
5212 a = AVERROR(ENOMEM);
5216 new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
5217 av_buffer_default_free, NULL, 0);
5219 pkt->side_data = NULL;
5220 pkt->side_data_elems = 0;
5221 av_packet_unref(pkt);
5223 av_freep(&new_pkt.data);
5224 a = AVERROR(ENOMEM);
5228 av_log(codec, AV_LOG_ERROR,
5229 "Failed to open bitstream filter %s for stream %d with codec %s",
5230 bsfc->filter->name, pkt->stream_index,
5231 codec->codec ? codec->codec->name : "copy");
5241 FF_ENABLE_DEPRECATION_WARNINGS
5244 int ff_format_output_open(AVFormatContext *s, const char *url, AVDictionary **options)
5247 return AVERROR(EINVAL);
5249 if (!(s->oformat->flags & AVFMT_NOFILE))
5250 return s->io_open(s, &s->pb, url, AVIO_FLAG_WRITE, options);
5254 void ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
5257 s->io_close(s, *pb);
5261 int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
5263 AVDictionaryEntry *entry;
5264 int64_t parsed_timestamp;
5266 if ((entry = av_dict_get(s->metadata, "creation_time", NULL, 0))) {
5267 if ((ret = av_parse_time(&parsed_timestamp, entry->value, 0)) >= 0) {
5268 *timestamp = return_seconds ? parsed_timestamp / 1000000 : parsed_timestamp;
5271 av_log(s, AV_LOG_WARNING, "Failed to parse creation_time %s\n", entry->value);
5278 int ff_standardize_creation_time(AVFormatContext *s)
5281 int ret = ff_parse_creation_time_metadata(s, ×tamp, 0);
5283 return avpriv_dict_set_timestamp(&s->metadata, "creation_time", timestamp);
5287 int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette)
5292 side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &size);
5294 if (size != AVPALETTE_SIZE) {
5295 av_log(s, AV_LOG_ERROR, "Invalid palette side data\n");
5296 return AVERROR_INVALIDDATA;
5298 memcpy(palette, side_data, AVPALETTE_SIZE);
5302 if (ret == CONTAINS_PAL) {
5304 for (i = 0; i < AVPALETTE_COUNT; i++)
5305 palette[i] = AV_RL32(pkt->data + pkt->size - AVPALETTE_SIZE + i*4);
5312 int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf)
5317 ret = av_bprint_finalize(buf, &str);
5320 if (!av_bprint_is_complete(buf)) {
5322 return AVERROR(ENOMEM);
5325 par->extradata = str;
5326 /* Note: the string is NUL terminated (so extradata can be read as a
5327 * string), but the ending character is not accounted in the size (in
5328 * binary formats you are likely not supposed to mux that character). When
5329 * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE
5331 par->extradata_size = buf->len;
5335 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
5336 AVStream *ost, const AVStream *ist,
5337 enum AVTimebaseSource copy_tb)
5339 //TODO: use [io]st->internal->avctx
5340 const AVCodecContext *dec_ctx = ist->codec;
5341 AVCodecContext *enc_ctx = ost->codec;
5343 enc_ctx->time_base = ist->time_base;
5345 * Avi is a special case here because it supports variable fps but
5346 * having the fps and timebase differe significantly adds quite some
5349 if (!strcmp(ofmt->name, "avi")) {
5350 #if FF_API_R_FRAME_RATE
5351 if (copy_tb == AVFMT_TBCF_AUTO && ist->r_frame_rate.num
5352 && av_q2d(ist->r_frame_rate) >= av_q2d(ist->avg_frame_rate)
5353 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(ist->time_base)
5354 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx->time_base)
5355 && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx->time_base) < 1.0/500
5356 || copy_tb == AVFMT_TBCF_R_FRAMERATE) {
5357 enc_ctx->time_base.num = ist->r_frame_rate.den;
5358 enc_ctx->time_base.den = 2*ist->r_frame_rate.num;
5359 enc_ctx->ticks_per_frame = 2;
5362 if (copy_tb == AVFMT_TBCF_AUTO && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > 2*av_q2d(ist->time_base)
5363 && av_q2d(ist->time_base) < 1.0/500
5364 || copy_tb == AVFMT_TBCF_DECODER) {
5365 enc_ctx->time_base = dec_ctx->time_base;
5366 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5367 enc_ctx->time_base.den *= 2;
5368 enc_ctx->ticks_per_frame = 2;
5370 } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS)
5371 && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
5372 if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx->time_base.den
5373 && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > av_q2d(ist->time_base)
5374 && av_q2d(ist->time_base) < 1.0/500
5375 || copy_tb == AVFMT_TBCF_DECODER) {
5376 enc_ctx->time_base = dec_ctx->time_base;
5377 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5381 if ((enc_ctx->codec_tag == AV_RL32("tmcd") || ost->codecpar->codec_tag == AV_RL32("tmcd"))
5382 && dec_ctx->time_base.num < dec_ctx->time_base.den
5383 && dec_ctx->time_base.num > 0
5384 && 121LL*dec_ctx->time_base.num > dec_ctx->time_base.den) {
5385 enc_ctx->time_base = dec_ctx->time_base;
5388 if (ost->avg_frame_rate.num)
5389 enc_ctx->time_base = av_inv_q(ost->avg_frame_rate);
5391 av_reduce(&enc_ctx->time_base.num, &enc_ctx->time_base.den,
5392 enc_ctx->time_base.num, enc_ctx->time_base.den, INT_MAX);
5397 AVRational av_stream_get_codec_timebase(const AVStream *st)
5399 // See avformat_transfer_internal_stream_timing_info() TODO.
5400 #if FF_API_LAVF_AVCTX
5401 FF_DISABLE_DEPRECATION_WARNINGS
5402 return st->codec->time_base;
5403 FF_ENABLE_DEPRECATION_WARNINGS
5405 return st->internal->avctx->time_base;