2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 #include "libavutil/avassert.h"
28 #include "libavutil/avstring.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/internal.h"
31 #include "libavutil/mathematics.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/parseutils.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/thread.h"
36 #include "libavutil/time.h"
37 #include "libavutil/time_internal.h"
38 #include "libavutil/timestamp.h"
40 #include "libavcodec/bytestream.h"
41 #include "libavcodec/internal.h"
42 #include "libavcodec/raw.h"
44 #include "audiointerleave.h"
46 #include "avio_internal.h"
56 #include "libavutil/ffversion.h"
57 const char av_format_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
59 static AVMutex avformat_mutex = AV_MUTEX_INITIALIZER;
63 * various utility functions for use within FFmpeg
66 unsigned avformat_version(void)
68 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
69 return LIBAVFORMAT_VERSION_INT;
72 const char *avformat_configuration(void)
74 return FFMPEG_CONFIGURATION;
77 const char *avformat_license(void)
79 #define LICENSE_PREFIX "libavformat license: "
80 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
83 int ff_lock_avformat(void)
85 return ff_mutex_lock(&avformat_mutex) ? -1 : 0;
88 int ff_unlock_avformat(void)
90 return ff_mutex_unlock(&avformat_mutex) ? -1 : 0;
93 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
95 static int is_relative(int64_t ts) {
96 return ts > (RELATIVE_TS_BASE - (1LL<<48));
100 * Wrap a given time stamp, if there is an indication for an overflow
103 * @param timestamp the time stamp to wrap
104 * @return resulting time stamp
106 static int64_t wrap_timestamp(const AVStream *st, int64_t timestamp)
108 if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&
109 st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
110 if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
111 timestamp < st->pts_wrap_reference)
112 return timestamp + (1ULL << st->pts_wrap_bits);
113 else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
114 timestamp >= st->pts_wrap_reference)
115 return timestamp - (1ULL << st->pts_wrap_bits);
120 #if FF_API_FORMAT_GET_SET
121 MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
122 #if FF_API_LAVF_FFSERVER
123 FF_DISABLE_DEPRECATION_WARNINGS
124 MAKE_ACCESSORS(AVStream, stream, char *, recommended_encoder_configuration)
125 FF_ENABLE_DEPRECATION_WARNINGS
127 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, video_codec)
128 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, audio_codec)
129 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
130 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, data_codec)
131 MAKE_ACCESSORS(AVFormatContext, format, int, metadata_header_padding)
132 MAKE_ACCESSORS(AVFormatContext, format, void *, opaque)
133 MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb)
134 #if FF_API_OLD_OPEN_CALLBACKS
135 FF_DISABLE_DEPRECATION_WARNINGS
136 MAKE_ACCESSORS(AVFormatContext, format, AVOpenCallback, open_cb)
137 FF_ENABLE_DEPRECATION_WARNINGS
141 int64_t av_stream_get_end_pts(const AVStream *st)
143 if (st->internal->priv_pts) {
144 return st->internal->priv_pts->val;
146 return AV_NOPTS_VALUE;
149 struct AVCodecParserContext *av_stream_get_parser(const AVStream *st)
154 void av_format_inject_global_side_data(AVFormatContext *s)
157 s->internal->inject_global_side_data = 1;
158 for (i = 0; i < s->nb_streams; i++) {
159 AVStream *st = s->streams[i];
160 st->inject_global_side_data = 1;
164 int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
166 av_assert0(!dst->codec_whitelist &&
167 !dst->format_whitelist &&
168 !dst->protocol_whitelist &&
169 !dst->protocol_blacklist);
170 dst-> codec_whitelist = av_strdup(src->codec_whitelist);
171 dst->format_whitelist = av_strdup(src->format_whitelist);
172 dst->protocol_whitelist = av_strdup(src->protocol_whitelist);
173 dst->protocol_blacklist = av_strdup(src->protocol_blacklist);
174 if ( (src-> codec_whitelist && !dst-> codec_whitelist)
175 || (src-> format_whitelist && !dst-> format_whitelist)
176 || (src->protocol_whitelist && !dst->protocol_whitelist)
177 || (src->protocol_blacklist && !dst->protocol_blacklist)) {
178 av_log(dst, AV_LOG_ERROR, "Failed to duplicate black/whitelist\n");
179 return AVERROR(ENOMEM);
184 static const AVCodec *find_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
186 #if FF_API_LAVF_AVCTX
187 FF_DISABLE_DEPRECATION_WARNINGS
188 if (st->codec->codec)
189 return st->codec->codec;
190 FF_ENABLE_DEPRECATION_WARNINGS
193 switch (st->codecpar->codec_type) {
194 case AVMEDIA_TYPE_VIDEO:
195 if (s->video_codec) return s->video_codec;
197 case AVMEDIA_TYPE_AUDIO:
198 if (s->audio_codec) return s->audio_codec;
200 case AVMEDIA_TYPE_SUBTITLE:
201 if (s->subtitle_codec) return s->subtitle_codec;
205 return avcodec_find_decoder(codec_id);
208 static const AVCodec *find_probe_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
210 const AVCodec *codec;
212 #if CONFIG_H264_DECODER
213 /* Other parts of the code assume this decoder to be used for h264,
214 * so force it if possible. */
215 if (codec_id == AV_CODEC_ID_H264)
216 return avcodec_find_decoder_by_name("h264");
219 codec = find_decoder(s, st, codec_id);
223 if (codec->capabilities & AV_CODEC_CAP_AVOID_PROBING) {
224 const AVCodec *probe_codec = NULL;
225 while (probe_codec = av_codec_next(probe_codec)) {
226 if (probe_codec->id == codec_id &&
227 av_codec_is_decoder(probe_codec) &&
228 !(probe_codec->capabilities & (AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_EXPERIMENTAL))) {
237 #if FF_API_FORMAT_GET_SET
238 int av_format_get_probe_score(const AVFormatContext *s)
240 return s->probe_score;
244 /* an arbitrarily chosen "sane" max packet size -- 50M */
245 #define SANE_CHUNK_SIZE (50000000)
247 int ffio_limit(AVIOContext *s, int size)
249 if (s->maxsize>= 0) {
250 int64_t remaining= s->maxsize - avio_tell(s);
251 if (remaining < size) {
252 int64_t newsize = avio_size(s);
253 if (!s->maxsize || s->maxsize<newsize)
254 s->maxsize = newsize - !newsize;
255 remaining= s->maxsize - avio_tell(s);
256 remaining= FFMAX(remaining, 0);
259 if (s->maxsize>= 0 && remaining+1 < size) {
260 av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
267 /* Read the data in sane-sized chunks and append to pkt.
268 * Return the number of bytes read or an error. */
269 static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
271 int64_t orig_pos = pkt->pos; // av_grow_packet might reset pos
272 int orig_size = pkt->size;
276 int prev_size = pkt->size;
279 /* When the caller requests a lot of data, limit it to the amount
280 * left in file or SANE_CHUNK_SIZE when it is not known. */
282 if (read_size > SANE_CHUNK_SIZE/10) {
283 read_size = ffio_limit(s, read_size);
284 // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
286 read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
289 ret = av_grow_packet(pkt, read_size);
293 ret = avio_read(s, pkt->data + prev_size, read_size);
294 if (ret != read_size) {
295 av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
302 pkt->flags |= AV_PKT_FLAG_CORRUPT;
306 av_packet_unref(pkt);
307 return pkt->size > orig_size ? pkt->size - orig_size : ret;
310 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
315 pkt->pos = avio_tell(s);
317 return append_packet_chunked(s, pkt, size);
320 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
323 return av_get_packet(s, pkt, size);
324 return append_packet_chunked(s, pkt, size);
327 int av_filename_number_test(const char *filename)
331 (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0);
334 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
337 static const struct {
340 enum AVMediaType type;
342 { "aac", AV_CODEC_ID_AAC, AVMEDIA_TYPE_AUDIO },
343 { "ac3", AV_CODEC_ID_AC3, AVMEDIA_TYPE_AUDIO },
344 { "aptx", AV_CODEC_ID_APTX, AVMEDIA_TYPE_AUDIO },
345 { "dts", AV_CODEC_ID_DTS, AVMEDIA_TYPE_AUDIO },
346 { "dvbsub", AV_CODEC_ID_DVB_SUBTITLE,AVMEDIA_TYPE_SUBTITLE },
347 { "dvbtxt", AV_CODEC_ID_DVB_TELETEXT,AVMEDIA_TYPE_SUBTITLE },
348 { "eac3", AV_CODEC_ID_EAC3, AVMEDIA_TYPE_AUDIO },
349 { "h264", AV_CODEC_ID_H264, AVMEDIA_TYPE_VIDEO },
350 { "hevc", AV_CODEC_ID_HEVC, AVMEDIA_TYPE_VIDEO },
351 { "loas", AV_CODEC_ID_AAC_LATM, AVMEDIA_TYPE_AUDIO },
352 { "m4v", AV_CODEC_ID_MPEG4, AVMEDIA_TYPE_VIDEO },
353 { "mjpeg_2000",AV_CODEC_ID_JPEG2000, AVMEDIA_TYPE_VIDEO },
354 { "mp3", AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO },
355 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
356 { "truehd", AV_CODEC_ID_TRUEHD, AVMEDIA_TYPE_AUDIO },
360 const AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
364 av_log(s, AV_LOG_DEBUG,
365 "Probe with size=%d, packets=%d detected %s with score=%d\n",
366 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets,
368 for (i = 0; fmt_id_type[i].name; i++) {
369 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
370 if (fmt_id_type[i].type != AVMEDIA_TYPE_AUDIO &&
371 st->codecpar->sample_rate)
373 if (st->request_probe > score &&
374 st->codecpar->codec_id != fmt_id_type[i].id)
376 st->codecpar->codec_id = fmt_id_type[i].id;
377 st->codecpar->codec_type = fmt_id_type[i].type;
378 st->internal->need_context_update = 1;
379 #if FF_API_LAVF_AVCTX
380 FF_DISABLE_DEPRECATION_WARNINGS
381 st->codec->codec_type = st->codecpar->codec_type;
382 st->codec->codec_id = st->codecpar->codec_id;
383 FF_ENABLE_DEPRECATION_WARNINGS
392 /************************************************************/
393 /* input media file */
395 int av_demuxer_open(AVFormatContext *ic) {
398 if (ic->format_whitelist && av_match_list(ic->iformat->name, ic->format_whitelist, ',') <= 0) {
399 av_log(ic, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", ic->format_whitelist);
400 return AVERROR(EINVAL);
403 if (ic->iformat->read_header) {
404 err = ic->iformat->read_header(ic);
409 if (ic->pb && !ic->internal->data_offset)
410 ic->internal->data_offset = avio_tell(ic->pb);
415 /* Open input file and probe the format if necessary. */
416 static int init_input(AVFormatContext *s, const char *filename,
417 AVDictionary **options)
420 AVProbeData pd = { filename, NULL, 0 };
421 int score = AVPROBE_SCORE_RETRY;
424 s->flags |= AVFMT_FLAG_CUSTOM_IO;
426 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
427 s, 0, s->format_probesize);
428 else if (s->iformat->flags & AVFMT_NOFILE)
429 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
430 "will be ignored with AVFMT_NOFILE format.\n");
434 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
435 (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
438 if ((ret = s->io_open(s, &s->pb, filename, AVIO_FLAG_READ | s->avio_flags, options)) < 0)
443 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
444 s, 0, s->format_probesize);
447 int ff_packet_list_put(AVPacketList **packet_buffer,
448 AVPacketList **plast_pktl,
449 AVPacket *pkt, int flags)
451 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
455 return AVERROR(ENOMEM);
457 if (flags & FF_PACKETLIST_FLAG_REF_PACKET) {
458 if ((ret = av_packet_ref(&pktl->pkt, pkt)) < 0) {
463 ret = av_packet_make_refcounted(pkt);
468 av_packet_move_ref(&pktl->pkt, pkt);
472 (*plast_pktl)->next = pktl;
474 *packet_buffer = pktl;
476 /* Add the packet in the buffered packet list. */
481 int avformat_queue_attached_pictures(AVFormatContext *s)
484 for (i = 0; i < s->nb_streams; i++)
485 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
486 s->streams[i]->discard < AVDISCARD_ALL) {
487 if (s->streams[i]->attached_pic.size <= 0) {
488 av_log(s, AV_LOG_WARNING,
489 "Attached picture on stream %d has invalid size, "
494 ret = ff_packet_list_put(&s->internal->raw_packet_buffer,
495 &s->internal->raw_packet_buffer_end,
496 &s->streams[i]->attached_pic,
497 FF_PACKETLIST_FLAG_REF_PACKET);
504 static int update_stream_avctx(AVFormatContext *s)
507 for (i = 0; i < s->nb_streams; i++) {
508 AVStream *st = s->streams[i];
510 if (!st->internal->need_context_update)
513 /* close parser, because it depends on the codec */
514 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
515 av_parser_close(st->parser);
519 /* update internal codec context, for the parser */
520 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
524 #if FF_API_LAVF_AVCTX
525 FF_DISABLE_DEPRECATION_WARNINGS
526 /* update deprecated public codec context */
527 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
530 FF_ENABLE_DEPRECATION_WARNINGS
533 st->internal->need_context_update = 0;
539 int avformat_open_input(AVFormatContext **ps, const char *filename,
540 ff_const59 AVInputFormat *fmt, AVDictionary **options)
542 AVFormatContext *s = *ps;
544 AVDictionary *tmp = NULL;
545 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
547 if (!s && !(s = avformat_alloc_context()))
548 return AVERROR(ENOMEM);
550 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
551 return AVERROR(EINVAL);
557 av_dict_copy(&tmp, *options, 0);
559 if (s->pb) // must be before any goto fail
560 s->flags |= AVFMT_FLAG_CUSTOM_IO;
562 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
565 if (!(s->url = av_strdup(filename ? filename : ""))) {
566 ret = AVERROR(ENOMEM);
570 #if FF_API_FORMAT_FILENAME
571 FF_DISABLE_DEPRECATION_WARNINGS
572 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
573 FF_ENABLE_DEPRECATION_WARNINGS
575 if ((ret = init_input(s, filename, &tmp)) < 0)
577 s->probe_score = ret;
579 if (!s->protocol_whitelist && s->pb && s->pb->protocol_whitelist) {
580 s->protocol_whitelist = av_strdup(s->pb->protocol_whitelist);
581 if (!s->protocol_whitelist) {
582 ret = AVERROR(ENOMEM);
587 if (!s->protocol_blacklist && s->pb && s->pb->protocol_blacklist) {
588 s->protocol_blacklist = av_strdup(s->pb->protocol_blacklist);
589 if (!s->protocol_blacklist) {
590 ret = AVERROR(ENOMEM);
595 if (s->format_whitelist && av_match_list(s->iformat->name, s->format_whitelist, ',') <= 0) {
596 av_log(s, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", s->format_whitelist);
597 ret = AVERROR(EINVAL);
601 avio_skip(s->pb, s->skip_initial_bytes);
603 /* Check filename in case an image number is expected. */
604 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
605 if (!av_filename_number_test(filename)) {
606 ret = AVERROR(EINVAL);
611 s->duration = s->start_time = AV_NOPTS_VALUE;
613 /* Allocate private data. */
614 if (s->iformat->priv_data_size > 0) {
615 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
616 ret = AVERROR(ENOMEM);
619 if (s->iformat->priv_class) {
620 *(const AVClass **) s->priv_data = s->iformat->priv_class;
621 av_opt_set_defaults(s->priv_data);
622 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
627 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
629 ff_id3v2_read_dict(s->pb, &s->internal->id3v2_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
632 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
633 if ((ret = s->iformat->read_header(s)) < 0)
637 s->metadata = s->internal->id3v2_meta;
638 s->internal->id3v2_meta = NULL;
639 } else if (s->internal->id3v2_meta) {
640 int level = AV_LOG_WARNING;
641 if (s->error_recognition & AV_EF_COMPLIANT)
642 level = AV_LOG_ERROR;
643 av_log(s, level, "Discarding ID3 tags because more suitable tags were found.\n");
644 av_dict_free(&s->internal->id3v2_meta);
645 if (s->error_recognition & AV_EF_EXPLODE)
646 return AVERROR_INVALIDDATA;
649 if (id3v2_extra_meta) {
650 if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
651 !strcmp(s->iformat->name, "tta") || !strcmp(s->iformat->name, "wav")) {
652 if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
654 if ((ret = ff_id3v2_parse_chapters(s, &id3v2_extra_meta)) < 0)
656 if ((ret = ff_id3v2_parse_priv(s, &id3v2_extra_meta)) < 0)
659 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
661 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
663 if ((ret = avformat_queue_attached_pictures(s)) < 0)
666 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
667 s->internal->data_offset = avio_tell(s->pb);
669 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
671 update_stream_avctx(s);
673 for (i = 0; i < s->nb_streams; i++)
674 s->streams[i]->internal->orig_codec_id = s->streams[i]->codecpar->codec_id;
677 av_dict_free(options);
684 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
686 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
688 avformat_free_context(s);
693 /*******************************************************/
695 static void force_codec_ids(AVFormatContext *s, AVStream *st)
697 switch (st->codecpar->codec_type) {
698 case AVMEDIA_TYPE_VIDEO:
699 if (s->video_codec_id)
700 st->codecpar->codec_id = s->video_codec_id;
702 case AVMEDIA_TYPE_AUDIO:
703 if (s->audio_codec_id)
704 st->codecpar->codec_id = s->audio_codec_id;
706 case AVMEDIA_TYPE_SUBTITLE:
707 if (s->subtitle_codec_id)
708 st->codecpar->codec_id = s->subtitle_codec_id;
710 case AVMEDIA_TYPE_DATA:
711 if (s->data_codec_id)
712 st->codecpar->codec_id = s->data_codec_id;
717 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
719 if (st->request_probe>0) {
720 AVProbeData *pd = &st->probe_data;
722 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
726 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
728 av_log(s, AV_LOG_WARNING,
729 "Failed to reallocate probe buffer for stream %d\n",
734 memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
735 pd->buf_size += pkt->size;
736 memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
739 st->probe_packets = 0;
741 av_log(s, AV_LOG_WARNING,
742 "nothing to probe for stream %d\n", st->index);
746 end= s->internal->raw_packet_buffer_remaining_size <= 0
747 || st->probe_packets<= 0;
749 if (end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
750 int score = set_codec_from_probe_data(s, st, pd);
751 if ( (st->codecpar->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
755 st->request_probe = -1;
756 if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
757 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
759 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
761 force_codec_ids(s, st);
767 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
769 int64_t ref = pkt->dts;
770 int i, pts_wrap_behavior;
771 int64_t pts_wrap_reference;
772 AVProgram *first_program;
774 if (ref == AV_NOPTS_VALUE)
776 if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
778 ref &= (1LL << st->pts_wrap_bits)-1;
780 // reference time stamp should be 60 s before first time stamp
781 pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
782 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
783 pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
784 (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
785 AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
787 first_program = av_find_program_from_stream(s, NULL, stream_index);
789 if (!first_program) {
790 int default_stream_index = av_find_default_stream_index(s);
791 if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
792 for (i = 0; i < s->nb_streams; i++) {
793 if (av_find_program_from_stream(s, NULL, i))
795 s->streams[i]->pts_wrap_reference = pts_wrap_reference;
796 s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
800 st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
801 st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
805 AVProgram *program = first_program;
807 if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
808 pts_wrap_reference = program->pts_wrap_reference;
809 pts_wrap_behavior = program->pts_wrap_behavior;
812 program = av_find_program_from_stream(s, program, stream_index);
815 // update every program with differing pts_wrap_reference
816 program = first_program;
818 if (program->pts_wrap_reference != pts_wrap_reference) {
819 for (i = 0; i<program->nb_stream_indexes; i++) {
820 s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
821 s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
824 program->pts_wrap_reference = pts_wrap_reference;
825 program->pts_wrap_behavior = pts_wrap_behavior;
827 program = av_find_program_from_stream(s, program, stream_index);
833 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
843 AVPacketList *pktl = s->internal->raw_packet_buffer;
844 const AVPacket *pkt1;
847 st = s->streams[pktl->pkt.stream_index];
848 if (s->internal->raw_packet_buffer_remaining_size <= 0)
849 if ((err = probe_codec(s, st, NULL)) < 0)
851 if (st->request_probe <= 0) {
852 ff_packet_list_get(&s->internal->raw_packet_buffer,
853 &s->internal->raw_packet_buffer_end, pkt);
854 s->internal->raw_packet_buffer_remaining_size += pkt->size;
859 ret = s->iformat->read_packet(s, pkt);
861 av_packet_unref(pkt);
863 /* Some demuxers return FFERROR_REDO when they consume
864 data and discard it (ignored streams, junk, extradata).
865 We must re-call the demuxer to get the real packet. */
866 if (ret == FFERROR_REDO)
868 if (!pktl || ret == AVERROR(EAGAIN))
870 for (i = 0; i < s->nb_streams; i++) {
872 if (st->probe_packets || st->request_probe > 0)
873 if ((err = probe_codec(s, st, NULL)) < 0)
875 av_assert0(st->request_probe <= 0);
880 err = av_packet_make_refcounted(pkt);
882 av_packet_unref(pkt);
886 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
887 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
888 av_log(s, AV_LOG_WARNING,
889 "Dropped corrupted packet (stream = %d)\n",
891 av_packet_unref(pkt);
895 av_assert0(pkt->stream_index < (unsigned)s->nb_streams &&
896 "Invalid stream index.\n");
898 st = s->streams[pkt->stream_index];
900 if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
901 // correct first time stamps to negative values
902 if (!is_relative(st->first_dts))
903 st->first_dts = wrap_timestamp(st, st->first_dts);
904 if (!is_relative(st->start_time))
905 st->start_time = wrap_timestamp(st, st->start_time);
906 if (!is_relative(st->cur_dts))
907 st->cur_dts = wrap_timestamp(st, st->cur_dts);
910 pkt->dts = wrap_timestamp(st, pkt->dts);
911 pkt->pts = wrap_timestamp(st, pkt->pts);
913 force_codec_ids(s, st);
915 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
916 if (s->use_wallclock_as_timestamps)
917 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
919 if (!pktl && st->request_probe <= 0)
922 err = ff_packet_list_put(&s->internal->raw_packet_buffer,
923 &s->internal->raw_packet_buffer_end,
926 av_packet_unref(pkt);
929 pkt1 = &s->internal->raw_packet_buffer_end->pkt;
930 s->internal->raw_packet_buffer_remaining_size -= pkt1->size;
932 if ((err = probe_codec(s, st, pkt1)) < 0)
938 /**********************************************************/
940 static int determinable_frame_size(AVCodecContext *avctx)
942 switch(avctx->codec_id) {
943 case AV_CODEC_ID_MP1:
944 case AV_CODEC_ID_MP2:
945 case AV_CODEC_ID_MP3:
946 case AV_CODEC_ID_CODEC2:
954 * Return the frame duration in seconds. Return 0 if not available.
956 void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
957 AVCodecParserContext *pc, AVPacket *pkt)
959 AVRational codec_framerate = s->iformat ? st->internal->avctx->framerate :
960 av_mul_q(av_inv_q(st->internal->avctx->time_base), (AVRational){1, st->internal->avctx->ticks_per_frame});
961 int frame_size, sample_rate;
963 #if FF_API_LAVF_AVCTX
964 FF_DISABLE_DEPRECATION_WARNINGS
965 if ((!codec_framerate.den || !codec_framerate.num) && st->codec->time_base.den && st->codec->time_base.num)
966 codec_framerate = av_mul_q(av_inv_q(st->codec->time_base), (AVRational){1, st->codec->ticks_per_frame});
967 FF_ENABLE_DEPRECATION_WARNINGS
972 switch (st->codecpar->codec_type) {
973 case AVMEDIA_TYPE_VIDEO:
974 if (st->r_frame_rate.num && !pc && s->iformat) {
975 *pnum = st->r_frame_rate.den;
976 *pden = st->r_frame_rate.num;
977 } else if (st->time_base.num * 1000LL > st->time_base.den) {
978 *pnum = st->time_base.num;
979 *pden = st->time_base.den;
980 } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
981 av_assert0(st->internal->avctx->ticks_per_frame);
982 av_reduce(pnum, pden,
984 codec_framerate.num * (int64_t)st->internal->avctx->ticks_per_frame,
987 if (pc && pc->repeat_pict) {
988 av_assert0(s->iformat); // this may be wrong for interlaced encoding but its not used for that case
989 av_reduce(pnum, pden,
990 (*pnum) * (1LL + pc->repeat_pict),
994 /* If this codec can be interlaced or progressive then we need
995 * a parser to compute duration of a packet. Thus if we have
996 * no parser in such case leave duration undefined. */
997 if (st->internal->avctx->ticks_per_frame > 1 && !pc)
1001 case AVMEDIA_TYPE_AUDIO:
1002 if (st->internal->avctx_inited) {
1003 frame_size = av_get_audio_frame_duration(st->internal->avctx, pkt->size);
1004 sample_rate = st->internal->avctx->sample_rate;
1006 frame_size = av_get_audio_frame_duration2(st->codecpar, pkt->size);
1007 sample_rate = st->codecpar->sample_rate;
1009 if (frame_size <= 0 || sample_rate <= 0)
1012 *pden = sample_rate;
1019 static int is_intra_only(enum AVCodecID id)
1021 const AVCodecDescriptor *d = avcodec_descriptor_get(id);
1024 if (d->type == AVMEDIA_TYPE_VIDEO && !(d->props & AV_CODEC_PROP_INTRA_ONLY))
1029 static int has_decode_delay_been_guessed(AVStream *st)
1031 if (st->codecpar->codec_id != AV_CODEC_ID_H264) return 1;
1032 if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
1034 #if CONFIG_H264_DECODER
1035 if (st->internal->avctx->has_b_frames &&
1036 avpriv_h264_has_num_reorder_frames(st->internal->avctx) == st->internal->avctx->has_b_frames)
1039 if (st->internal->avctx->has_b_frames<3)
1040 return st->nb_decoded_frames >= 7;
1041 else if (st->internal->avctx->has_b_frames<4)
1042 return st->nb_decoded_frames >= 18;
1044 return st->nb_decoded_frames >= 20;
1047 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
1051 if (pktl == s->internal->packet_buffer_end)
1052 return s->internal->parse_queue;
1056 static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
1057 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1058 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1061 int delay = st->internal->avctx->has_b_frames;
1064 if (dts == AV_NOPTS_VALUE) {
1065 int64_t best_score = INT64_MAX;
1066 for (i = 0; i<delay; i++) {
1067 if (st->pts_reorder_error_count[i]) {
1068 int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
1069 if (score < best_score) {
1071 dts = pts_buffer[i];
1076 for (i = 0; i<delay; i++) {
1077 if (pts_buffer[i] != AV_NOPTS_VALUE) {
1078 int64_t diff = FFABS(pts_buffer[i] - dts)
1079 + (uint64_t)st->pts_reorder_error[i];
1080 diff = FFMAX(diff, st->pts_reorder_error[i]);
1081 st->pts_reorder_error[i] = diff;
1082 st->pts_reorder_error_count[i]++;
1083 if (st->pts_reorder_error_count[i] > 250) {
1084 st->pts_reorder_error[i] >>= 1;
1085 st->pts_reorder_error_count[i] >>= 1;
1092 if (dts == AV_NOPTS_VALUE)
1093 dts = pts_buffer[0];
1099 * Updates the dts of packets of a stream in pkt_buffer, by re-ordering the pts
1100 * of the packets in a window.
1102 static void update_dts_from_pts(AVFormatContext *s, int stream_index,
1103 AVPacketList *pkt_buffer)
1105 AVStream *st = s->streams[stream_index];
1106 int delay = st->internal->avctx->has_b_frames;
1109 int64_t pts_buffer[MAX_REORDER_DELAY+1];
1111 for (i = 0; i<MAX_REORDER_DELAY+1; i++)
1112 pts_buffer[i] = AV_NOPTS_VALUE;
1114 for (; pkt_buffer; pkt_buffer = get_next_pkt(s, st, pkt_buffer)) {
1115 if (pkt_buffer->pkt.stream_index != stream_index)
1118 if (pkt_buffer->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1119 pts_buffer[0] = pkt_buffer->pkt.pts;
1120 for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
1121 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
1123 pkt_buffer->pkt.dts = select_from_pts_buffer(st, pts_buffer, pkt_buffer->pkt.dts);
1128 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
1129 int64_t dts, int64_t pts, AVPacket *pkt)
1131 AVStream *st = s->streams[stream_index];
1132 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1133 AVPacketList *pktl_it;
1137 if (st->first_dts != AV_NOPTS_VALUE ||
1138 dts == AV_NOPTS_VALUE ||
1139 st->cur_dts == AV_NOPTS_VALUE ||
1140 st->cur_dts < INT_MIN + RELATIVE_TS_BASE ||
1144 st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
1146 shift = (uint64_t)st->first_dts - RELATIVE_TS_BASE;
1148 if (is_relative(pts))
1151 for (pktl_it = pktl; pktl_it; pktl_it = get_next_pkt(s, st, pktl_it)) {
1152 if (pktl_it->pkt.stream_index != stream_index)
1154 if (is_relative(pktl_it->pkt.pts))
1155 pktl_it->pkt.pts += shift;
1157 if (is_relative(pktl_it->pkt.dts))
1158 pktl_it->pkt.dts += shift;
1160 if (st->start_time == AV_NOPTS_VALUE && pktl_it->pkt.pts != AV_NOPTS_VALUE) {
1161 st->start_time = pktl_it->pkt.pts;
1162 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1163 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1167 if (has_decode_delay_been_guessed(st)) {
1168 update_dts_from_pts(s, stream_index, pktl);
1171 if (st->start_time == AV_NOPTS_VALUE) {
1172 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO || !(pkt->flags & AV_PKT_FLAG_DISCARD)) {
1173 st->start_time = pts;
1175 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1176 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1180 static void update_initial_durations(AVFormatContext *s, AVStream *st,
1181 int stream_index, int duration)
1183 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1184 int64_t cur_dts = RELATIVE_TS_BASE;
1186 if (st->first_dts != AV_NOPTS_VALUE) {
1187 if (st->update_initial_durations_done)
1189 st->update_initial_durations_done = 1;
1190 cur_dts = st->first_dts;
1191 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1192 if (pktl->pkt.stream_index == stream_index) {
1193 if (pktl->pkt.pts != pktl->pkt.dts ||
1194 pktl->pkt.dts != AV_NOPTS_VALUE ||
1197 cur_dts -= duration;
1200 if (pktl && pktl->pkt.dts != st->first_dts) {
1201 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %"PRId64") in the queue\n",
1202 av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
1206 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
1209 pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1210 st->first_dts = cur_dts;
1211 } else if (st->cur_dts != RELATIVE_TS_BASE)
1214 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1215 if (pktl->pkt.stream_index != stream_index)
1217 if ((pktl->pkt.pts == pktl->pkt.dts ||
1218 pktl->pkt.pts == AV_NOPTS_VALUE) &&
1219 (pktl->pkt.dts == AV_NOPTS_VALUE ||
1220 pktl->pkt.dts == st->first_dts ||
1221 pktl->pkt.dts == RELATIVE_TS_BASE) &&
1222 !pktl->pkt.duration) {
1223 pktl->pkt.dts = cur_dts;
1224 if (!st->internal->avctx->has_b_frames)
1225 pktl->pkt.pts = cur_dts;
1226 // if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
1227 pktl->pkt.duration = duration;
1230 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
1233 st->cur_dts = cur_dts;
1236 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1237 AVCodecParserContext *pc, AVPacket *pkt,
1238 int64_t next_dts, int64_t next_pts)
1240 int num, den, presentation_delayed, delay, i;
1242 AVRational duration;
1243 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1244 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1246 if (s->flags & AVFMT_FLAG_NOFILLIN)
1249 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
1250 if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
1251 if (st->last_dts_for_order_check <= pkt->dts) {
1254 av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
1255 "DTS %"PRIi64" < %"PRIi64" out of order\n",
1257 st->last_dts_for_order_check);
1258 st->dts_misordered++;
1260 if (st->dts_ordered + st->dts_misordered > 250) {
1261 st->dts_ordered >>= 1;
1262 st->dts_misordered >>= 1;
1266 st->last_dts_for_order_check = pkt->dts;
1267 if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
1268 pkt->dts = AV_NOPTS_VALUE;
1271 if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1272 pkt->dts = AV_NOPTS_VALUE;
1274 if (pc && pc->pict_type == AV_PICTURE_TYPE_B
1275 && !st->internal->avctx->has_b_frames)
1276 //FIXME Set low_delay = 0 when has_b_frames = 1
1277 st->internal->avctx->has_b_frames = 1;
1279 /* do we have a video B-frame ? */
1280 delay = st->internal->avctx->has_b_frames;
1281 presentation_delayed = 0;
1283 /* XXX: need has_b_frame, but cannot get it if the codec is
1284 * not initialized */
1286 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1287 presentation_delayed = 1;
1289 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
1290 st->pts_wrap_bits < 63 &&
1291 pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
1292 if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
1293 pkt->dts -= 1LL << st->pts_wrap_bits;
1295 pkt->pts += 1LL << st->pts_wrap_bits;
1298 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1299 * We take the conservative approach and discard both.
1300 * Note: If this is misbehaving for an H.264 file, then possibly
1301 * presentation_delayed is not set correctly. */
1302 if (delay == 1 && pkt->dts == pkt->pts &&
1303 pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
1304 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1305 if ( strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
1306 && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1307 pkt->dts = AV_NOPTS_VALUE;
1310 duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
1311 if (pkt->duration <= 0) {
1312 ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
1314 duration = (AVRational) {num, den};
1315 pkt->duration = av_rescale_rnd(1,
1316 num * (int64_t) st->time_base.den,
1317 den * (int64_t) st->time_base.num,
1322 if (pkt->duration > 0 && (s->internal->packet_buffer || s->internal->parse_queue))
1323 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1325 /* Correct timestamps with byte offset if demuxers only have timestamps
1326 * on packet boundaries */
1327 if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
1328 /* this will estimate bitrate based on this frame's duration and size */
1329 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1330 if (pkt->pts != AV_NOPTS_VALUE)
1332 if (pkt->dts != AV_NOPTS_VALUE)
1336 /* This may be redundant, but it should not hurt. */
1337 if (pkt->dts != AV_NOPTS_VALUE &&
1338 pkt->pts != AV_NOPTS_VALUE &&
1339 pkt->pts > pkt->dts)
1340 presentation_delayed = 1;
1342 if (s->debug & FF_FDEBUG_TS)
1343 av_log(s, AV_LOG_DEBUG,
1344 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%"PRId64" delay:%d onein_oneout:%d\n",
1345 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
1346 pkt->stream_index, pc, pkt->duration, delay, onein_oneout);
1348 /* Interpolate PTS and DTS if they are not present. We skip H264
1349 * currently because delay and has_b_frames are not reliably set. */
1350 if ((delay == 0 || (delay == 1 && pc)) &&
1352 if (presentation_delayed) {
1353 /* DTS = decompression timestamp */
1354 /* PTS = presentation timestamp */
1355 if (pkt->dts == AV_NOPTS_VALUE)
1356 pkt->dts = st->last_IP_pts;
1357 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1358 if (pkt->dts == AV_NOPTS_VALUE)
1359 pkt->dts = st->cur_dts;
1361 /* This is tricky: the dts must be incremented by the duration
1362 * of the frame we are displaying, i.e. the last I- or P-frame. */
1363 if (st->last_IP_duration == 0 && (uint64_t)pkt->duration <= INT32_MAX)
1364 st->last_IP_duration = pkt->duration;
1365 if (pkt->dts != AV_NOPTS_VALUE)
1366 st->cur_dts = pkt->dts + st->last_IP_duration;
1367 if (pkt->dts != AV_NOPTS_VALUE &&
1368 pkt->pts == AV_NOPTS_VALUE &&
1369 st->last_IP_duration > 0 &&
1370 ((uint64_t)st->cur_dts - (uint64_t)next_dts + 1) <= 2 &&
1371 next_dts != next_pts &&
1372 next_pts != AV_NOPTS_VALUE)
1373 pkt->pts = next_dts;
1375 if ((uint64_t)pkt->duration <= INT32_MAX)
1376 st->last_IP_duration = pkt->duration;
1377 st->last_IP_pts = pkt->pts;
1378 /* Cannot compute PTS if not present (we can compute it only
1379 * by knowing the future. */
1380 } else if (pkt->pts != AV_NOPTS_VALUE ||
1381 pkt->dts != AV_NOPTS_VALUE ||
1382 pkt->duration > 0 ) {
1384 /* presentation is not delayed : PTS and DTS are the same */
1385 if (pkt->pts == AV_NOPTS_VALUE)
1386 pkt->pts = pkt->dts;
1387 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1389 if (pkt->pts == AV_NOPTS_VALUE)
1390 pkt->pts = st->cur_dts;
1391 pkt->dts = pkt->pts;
1392 if (pkt->pts != AV_NOPTS_VALUE && duration.num >= 0)
1393 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
1397 if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1398 st->pts_buffer[0] = pkt->pts;
1399 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
1400 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
1402 if(has_decode_delay_been_guessed(st))
1403 pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
1405 // We skipped it above so we try here.
1407 // This should happen on the first packet
1408 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1409 if (pkt->dts > st->cur_dts)
1410 st->cur_dts = pkt->dts;
1412 if (s->debug & FF_FDEBUG_TS)
1413 av_log(s, AV_LOG_DEBUG, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s st:%d (%d)\n",
1414 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), st->index, st->id);
1417 if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA || is_intra_only(st->codecpar->codec_id))
1418 pkt->flags |= AV_PKT_FLAG_KEY;
1419 #if FF_API_CONVERGENCE_DURATION
1420 FF_DISABLE_DEPRECATION_WARNINGS
1422 pkt->convergence_duration = pc->convergence_duration;
1423 FF_ENABLE_DEPRECATION_WARNINGS
1427 void ff_packet_list_free(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1429 AVPacketList *tmp = *pkt_buf;
1432 AVPacketList *pktl = tmp;
1434 av_packet_unref(&pktl->pkt);
1438 *pkt_buf_end = NULL;
1442 * Parse a packet, add all split parts to parse_queue.
1444 * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
1446 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1448 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1449 AVStream *st = s->streams[stream_index];
1450 uint8_t *data = pkt ? pkt->data : NULL;
1451 int size = pkt ? pkt->size : 0;
1452 int ret = 0, got_output = 0;
1454 av_init_packet(&out_pkt);
1457 av_init_packet(&flush_pkt);
1460 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1461 // preserve 0-size sync packets
1462 compute_pkt_fields(s, st, st->parser, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1465 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1467 int64_t next_pts = pkt->pts;
1468 int64_t next_dts = pkt->dts;
1470 len = av_parser_parse2(st->parser, st->internal->avctx,
1471 &out_pkt.data, &out_pkt.size, data, size,
1472 pkt->pts, pkt->dts, pkt->pos);
1474 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1476 /* increment read pointer */
1480 got_output = !!out_pkt.size;
1485 if (pkt->buf && out_pkt.data == pkt->data) {
1486 /* reference pkt->buf only when out_pkt.data is guaranteed to point
1487 * to data in it and not in the parser's internal buffer. */
1488 /* XXX: Ensure this is the case with all parsers when st->parser->flags
1489 * is PARSER_FLAG_COMPLETE_FRAMES and check for that instead? */
1490 out_pkt.buf = av_buffer_ref(pkt->buf);
1492 ret = AVERROR(ENOMEM);
1496 ret = av_packet_make_refcounted(&out_pkt);
1501 if (pkt->side_data) {
1502 out_pkt.side_data = pkt->side_data;
1503 out_pkt.side_data_elems = pkt->side_data_elems;
1504 pkt->side_data = NULL;
1505 pkt->side_data_elems = 0;
1508 /* set the duration */
1509 out_pkt.duration = (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->duration : 0;
1510 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1511 if (st->internal->avctx->sample_rate > 0) {
1513 av_rescale_q_rnd(st->parser->duration,
1514 (AVRational) { 1, st->internal->avctx->sample_rate },
1520 out_pkt.stream_index = st->index;
1521 out_pkt.pts = st->parser->pts;
1522 out_pkt.dts = st->parser->dts;
1523 out_pkt.pos = st->parser->pos;
1524 out_pkt.flags |= pkt->flags & AV_PKT_FLAG_DISCARD;
1526 if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1527 out_pkt.pos = st->parser->frame_offset;
1529 if (st->parser->key_frame == 1 ||
1530 (st->parser->key_frame == -1 &&
1531 st->parser->pict_type == AV_PICTURE_TYPE_I))
1532 out_pkt.flags |= AV_PKT_FLAG_KEY;
1534 if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1535 out_pkt.flags |= AV_PKT_FLAG_KEY;
1537 compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts);
1539 ret = ff_packet_list_put(&s->internal->parse_queue,
1540 &s->internal->parse_queue_end,
1543 av_packet_unref(&out_pkt);
1548 /* end of the stream => close and free the parser */
1549 if (pkt == &flush_pkt) {
1550 av_parser_close(st->parser);
1555 av_packet_unref(pkt);
1559 int ff_packet_list_get(AVPacketList **pkt_buffer,
1560 AVPacketList **pkt_buffer_end,
1564 av_assert0(*pkt_buffer);
1567 *pkt_buffer = pktl->next;
1569 *pkt_buffer_end = NULL;
1574 static int64_t ts_to_samples(AVStream *st, int64_t ts)
1576 return av_rescale(ts, st->time_base.num * st->codecpar->sample_rate, st->time_base.den);
1579 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1581 int ret = 0, i, got_packet = 0;
1582 AVDictionary *metadata = NULL;
1584 av_init_packet(pkt);
1586 while (!got_packet && !s->internal->parse_queue) {
1590 /* read next packet */
1591 ret = ff_read_packet(s, &cur_pkt);
1593 if (ret == AVERROR(EAGAIN))
1595 /* flush the parsers */
1596 for (i = 0; i < s->nb_streams; i++) {
1598 if (st->parser && st->need_parsing)
1599 parse_packet(s, NULL, st->index);
1601 /* all remaining packets are now in parse_queue =>
1602 * really terminate parsing */
1606 st = s->streams[cur_pkt.stream_index];
1608 /* update context if required */
1609 if (st->internal->need_context_update) {
1610 if (avcodec_is_open(st->internal->avctx)) {
1611 av_log(s, AV_LOG_DEBUG, "Demuxer context update while decoder is open, closing and trying to re-open\n");
1612 avcodec_close(st->internal->avctx);
1613 st->info->found_decoder = 0;
1616 /* close parser, because it depends on the codec */
1617 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
1618 av_parser_close(st->parser);
1622 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
1624 av_packet_unref(&cur_pkt);
1628 #if FF_API_LAVF_AVCTX
1629 FF_DISABLE_DEPRECATION_WARNINGS
1630 /* update deprecated public codec context */
1631 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
1633 av_packet_unref(&cur_pkt);
1636 FF_ENABLE_DEPRECATION_WARNINGS
1639 st->internal->need_context_update = 0;
1642 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1643 cur_pkt.dts != AV_NOPTS_VALUE &&
1644 cur_pkt.pts < cur_pkt.dts) {
1645 av_log(s, AV_LOG_WARNING,
1646 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1647 cur_pkt.stream_index,
1648 av_ts2str(cur_pkt.pts),
1649 av_ts2str(cur_pkt.dts),
1652 if (s->debug & FF_FDEBUG_TS)
1653 av_log(s, AV_LOG_DEBUG,
1654 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"PRId64", flags=%d\n",
1655 cur_pkt.stream_index,
1656 av_ts2str(cur_pkt.pts),
1657 av_ts2str(cur_pkt.dts),
1658 cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
1660 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1661 st->parser = av_parser_init(st->codecpar->codec_id);
1663 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1664 "%s, packets or times may be invalid.\n",
1665 avcodec_get_name(st->codecpar->codec_id));
1666 /* no parser available: just output the raw packets */
1667 st->need_parsing = AVSTREAM_PARSE_NONE;
1668 } else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1669 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1670 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1671 st->parser->flags |= PARSER_FLAG_ONCE;
1672 else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1673 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1676 if (!st->need_parsing || !st->parser) {
1677 /* no parsing needed: we just output the packet as is */
1679 compute_pkt_fields(s, st, NULL, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1680 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1681 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1682 ff_reduce_index(s, st->index);
1683 av_add_index_entry(st, pkt->pos, pkt->dts,
1684 0, 0, AVINDEX_KEYFRAME);
1687 } else if (st->discard < AVDISCARD_ALL) {
1688 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1690 st->codecpar->sample_rate = st->internal->avctx->sample_rate;
1691 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
1692 st->codecpar->channels = st->internal->avctx->channels;
1693 st->codecpar->channel_layout = st->internal->avctx->channel_layout;
1694 st->codecpar->codec_id = st->internal->avctx->codec_id;
1697 av_packet_unref(&cur_pkt);
1699 if (pkt->flags & AV_PKT_FLAG_KEY)
1700 st->skip_to_keyframe = 0;
1701 if (st->skip_to_keyframe) {
1702 av_packet_unref(&cur_pkt);
1710 if (!got_packet && s->internal->parse_queue)
1711 ret = ff_packet_list_get(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt);
1714 AVStream *st = s->streams[pkt->stream_index];
1715 int discard_padding = 0;
1716 if (st->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
1717 int64_t pts = pkt->pts - (is_relative(pkt->pts) ? RELATIVE_TS_BASE : 0);
1718 int64_t sample = ts_to_samples(st, pts);
1719 int duration = ts_to_samples(st, pkt->duration);
1720 int64_t end_sample = sample + duration;
1721 if (duration > 0 && end_sample >= st->first_discard_sample &&
1722 sample < st->last_discard_sample)
1723 discard_padding = FFMIN(end_sample - st->first_discard_sample, duration);
1725 if (st->start_skip_samples && (pkt->pts == 0 || pkt->pts == RELATIVE_TS_BASE))
1726 st->skip_samples = st->start_skip_samples;
1727 if (st->skip_samples || discard_padding) {
1728 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1730 AV_WL32(p, st->skip_samples);
1731 AV_WL32(p + 4, discard_padding);
1732 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d / discard %d\n", st->skip_samples, discard_padding);
1734 st->skip_samples = 0;
1737 if (st->inject_global_side_data) {
1738 for (i = 0; i < st->nb_side_data; i++) {
1739 AVPacketSideData *src_sd = &st->side_data[i];
1742 if (av_packet_get_side_data(pkt, src_sd->type, NULL))
1745 dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
1747 av_log(s, AV_LOG_WARNING, "Could not inject global side data\n");
1751 memcpy(dst_data, src_sd->data, src_sd->size);
1753 st->inject_global_side_data = 0;
1757 av_opt_get_dict_val(s, "metadata", AV_OPT_SEARCH_CHILDREN, &metadata);
1759 s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
1760 av_dict_copy(&s->metadata, metadata, 0);
1761 av_dict_free(&metadata);
1762 av_opt_set_dict_val(s, "metadata", NULL, AV_OPT_SEARCH_CHILDREN);
1765 #if FF_API_LAVF_AVCTX
1766 update_stream_avctx(s);
1769 if (s->debug & FF_FDEBUG_TS)
1770 av_log(s, AV_LOG_DEBUG,
1771 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1772 "size=%d, duration=%"PRId64", flags=%d\n",
1774 av_ts2str(pkt->pts),
1775 av_ts2str(pkt->dts),
1776 pkt->size, pkt->duration, pkt->flags);
1778 /* A demuxer might have returned EOF because of an IO error, let's
1779 * propagate this back to the user. */
1780 if (ret == AVERROR_EOF && s->pb && s->pb->error < 0 && s->pb->error != AVERROR(EAGAIN))
1786 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1788 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1794 ret = s->internal->packet_buffer
1795 ? ff_packet_list_get(&s->internal->packet_buffer,
1796 &s->internal->packet_buffer_end, pkt)
1797 : read_frame_internal(s, pkt);
1804 AVPacketList *pktl = s->internal->packet_buffer;
1807 AVPacket *next_pkt = &pktl->pkt;
1809 if (next_pkt->dts != AV_NOPTS_VALUE) {
1810 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1811 // last dts seen for this stream. if any of packets following
1812 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1813 int64_t last_dts = next_pkt->dts;
1814 av_assert2(wrap_bits <= 64);
1815 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1816 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1817 av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2ULL << (wrap_bits - 1)) < 0) {
1818 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2ULL << (wrap_bits - 1))) {
1820 next_pkt->pts = pktl->pkt.dts;
1822 if (last_dts != AV_NOPTS_VALUE) {
1823 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1824 last_dts = pktl->pkt.dts;
1829 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1830 // Fixing the last reference frame had none pts issue (For MXF etc).
1831 // We only do this when
1833 // 2. we are not able to resolve a pts value for current packet.
1834 // 3. the packets for this stream at the end of the files had valid dts.
1835 next_pkt->pts = last_dts + next_pkt->duration;
1837 pktl = s->internal->packet_buffer;
1840 /* read packet from packet buffer, if there is data */
1841 st = s->streams[next_pkt->stream_index];
1842 if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
1843 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1844 ret = ff_packet_list_get(&s->internal->packet_buffer,
1845 &s->internal->packet_buffer_end, pkt);
1850 ret = read_frame_internal(s, pkt);
1852 if (pktl && ret != AVERROR(EAGAIN)) {
1859 ret = ff_packet_list_put(&s->internal->packet_buffer,
1860 &s->internal->packet_buffer_end,
1861 pkt, FF_PACKETLIST_FLAG_REF_PACKET);
1862 av_packet_unref(pkt);
1869 st = s->streams[pkt->stream_index];
1870 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1871 ff_reduce_index(s, st->index);
1872 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1875 if (is_relative(pkt->dts))
1876 pkt->dts -= RELATIVE_TS_BASE;
1877 if (is_relative(pkt->pts))
1878 pkt->pts -= RELATIVE_TS_BASE;
1883 /* XXX: suppress the packet queue */
1884 static void flush_packet_queue(AVFormatContext *s)
1888 ff_packet_list_free(&s->internal->parse_queue, &s->internal->parse_queue_end);
1889 ff_packet_list_free(&s->internal->packet_buffer, &s->internal->packet_buffer_end);
1890 ff_packet_list_free(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
1892 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1895 /*******************************************************/
1898 int av_find_default_stream_index(AVFormatContext *s)
1902 int best_stream = 0;
1903 int best_score = INT_MIN;
1905 if (s->nb_streams <= 0)
1907 for (i = 0; i < s->nb_streams; i++) {
1910 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1911 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
1913 if (st->codecpar->width && st->codecpar->height)
1917 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1918 if (st->codecpar->sample_rate)
1921 if (st->codec_info_nb_frames)
1924 if (st->discard != AVDISCARD_ALL)
1927 if (score > best_score) {
1935 /** Flush the frame reader. */
1936 void ff_read_frame_flush(AVFormatContext *s)
1941 flush_packet_queue(s);
1943 /* Reset read state for each stream. */
1944 for (i = 0; i < s->nb_streams; i++) {
1948 av_parser_close(st->parser);
1951 st->last_IP_pts = AV_NOPTS_VALUE;
1952 st->last_dts_for_order_check = AV_NOPTS_VALUE;
1953 if (st->first_dts == AV_NOPTS_VALUE)
1954 st->cur_dts = RELATIVE_TS_BASE;
1956 /* We set the current DTS to an unspecified origin. */
1957 st->cur_dts = AV_NOPTS_VALUE;
1959 st->probe_packets = MAX_PROBE_PACKETS;
1961 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1962 st->pts_buffer[j] = AV_NOPTS_VALUE;
1964 if (s->internal->inject_global_side_data)
1965 st->inject_global_side_data = 1;
1967 st->skip_samples = 0;
1971 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1975 for (i = 0; i < s->nb_streams; i++) {
1976 AVStream *st = s->streams[i];
1979 av_rescale(timestamp,
1980 st->time_base.den * (int64_t) ref_st->time_base.num,
1981 st->time_base.num * (int64_t) ref_st->time_base.den);
1985 void ff_reduce_index(AVFormatContext *s, int stream_index)
1987 AVStream *st = s->streams[stream_index];
1988 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1990 if ((unsigned) st->nb_index_entries >= max_entries) {
1992 for (i = 0; 2 * i < st->nb_index_entries; i++)
1993 st->index_entries[i] = st->index_entries[2 * i];
1994 st->nb_index_entries = i;
1998 int ff_add_index_entry(AVIndexEntry **index_entries,
1999 int *nb_index_entries,
2000 unsigned int *index_entries_allocated_size,
2001 int64_t pos, int64_t timestamp,
2002 int size, int distance, int flags)
2004 AVIndexEntry *entries, *ie;
2007 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
2010 if (timestamp == AV_NOPTS_VALUE)
2011 return AVERROR(EINVAL);
2013 if (size < 0 || size > 0x3FFFFFFF)
2014 return AVERROR(EINVAL);
2016 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
2017 timestamp -= RELATIVE_TS_BASE;
2019 entries = av_fast_realloc(*index_entries,
2020 index_entries_allocated_size,
2021 (*nb_index_entries + 1) *
2022 sizeof(AVIndexEntry));
2026 *index_entries = entries;
2028 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
2029 timestamp, AVSEEK_FLAG_ANY);
2032 index = (*nb_index_entries)++;
2033 ie = &entries[index];
2034 av_assert0(index == 0 || ie[-1].timestamp < timestamp);
2036 ie = &entries[index];
2037 if (ie->timestamp != timestamp) {
2038 if (ie->timestamp <= timestamp)
2040 memmove(entries + index + 1, entries + index,
2041 sizeof(AVIndexEntry) * (*nb_index_entries - index));
2042 (*nb_index_entries)++;
2043 } else if (ie->pos == pos && distance < ie->min_distance)
2044 // do not reduce the distance
2045 distance = ie->min_distance;
2049 ie->timestamp = timestamp;
2050 ie->min_distance = distance;
2057 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
2058 int size, int distance, int flags)
2060 timestamp = wrap_timestamp(st, timestamp);
2061 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
2062 &st->index_entries_allocated_size, pos,
2063 timestamp, size, distance, flags);
2066 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
2067 int64_t wanted_timestamp, int flags)
2075 // Optimize appending index entries at the end.
2076 if (b && entries[b - 1].timestamp < wanted_timestamp)
2082 // Search for the next non-discarded packet.
2083 while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b && m < nb_entries - 1) {
2085 if (m == b && entries[m].timestamp >= wanted_timestamp) {
2091 timestamp = entries[m].timestamp;
2092 if (timestamp >= wanted_timestamp)
2094 if (timestamp <= wanted_timestamp)
2097 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
2099 if (!(flags & AVSEEK_FLAG_ANY))
2100 while (m >= 0 && m < nb_entries &&
2101 !(entries[m].flags & AVINDEX_KEYFRAME))
2102 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
2104 if (m == nb_entries)
2109 void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
2112 int64_t pos_delta = 0;
2114 //We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
2115 const char *proto = avio_find_protocol_name(s->url);
2118 av_log(s, AV_LOG_INFO,
2119 "Protocol name not provided, cannot determine if input is local or "
2120 "a network protocol, buffers and access patterns cannot be configured "
2121 "optimally without knowing the protocol\n");
2124 if (proto && !(strcmp(proto, "file") && strcmp(proto, "pipe") && strcmp(proto, "cache")))
2127 for (ist1 = 0; ist1 < s->nb_streams; ist1++) {
2128 AVStream *st1 = s->streams[ist1];
2129 for (ist2 = 0; ist2 < s->nb_streams; ist2++) {
2130 AVStream *st2 = s->streams[ist2];
2136 for (i1 = i2 = 0; i1 < st1->nb_index_entries; i1++) {
2137 AVIndexEntry *e1 = &st1->index_entries[i1];
2138 int64_t e1_pts = av_rescale_q(e1->timestamp, st1->time_base, AV_TIME_BASE_Q);
2140 skip = FFMAX(skip, e1->size);
2141 for (; i2 < st2->nb_index_entries; i2++) {
2142 AVIndexEntry *e2 = &st2->index_entries[i2];
2143 int64_t e2_pts = av_rescale_q(e2->timestamp, st2->time_base, AV_TIME_BASE_Q);
2144 if (e2_pts - e1_pts < time_tolerance)
2146 pos_delta = FFMAX(pos_delta, e1->pos - e2->pos);
2154 /* XXX This could be adjusted depending on protocol*/
2155 if (s->pb->buffer_size < pos_delta && pos_delta < (1<<24)) {
2156 av_log(s, AV_LOG_VERBOSE, "Reconfiguring buffers to size %"PRId64"\n", pos_delta);
2158 /* realloc the buffer and the original data will be retained */
2159 if (ffio_realloc_buf(s->pb, pos_delta)) {
2160 av_log(s, AV_LOG_ERROR, "Realloc buffer fail.\n");
2164 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, pos_delta/2);
2167 if (skip < (1<<23)) {
2168 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, skip);
2172 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
2174 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
2175 wanted_timestamp, flags);
2178 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
2179 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2181 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
2182 if (stream_index >= 0)
2183 ts = wrap_timestamp(s->streams[stream_index], ts);
2187 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
2188 int64_t target_ts, int flags)
2190 const AVInputFormat *avif = s->iformat;
2191 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
2192 int64_t ts_min, ts_max, ts;
2197 if (stream_index < 0)
2200 av_log(s, AV_LOG_TRACE, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2203 ts_min = AV_NOPTS_VALUE;
2204 pos_limit = -1; // GCC falsely says it may be uninitialized.
2206 st = s->streams[stream_index];
2207 if (st->index_entries) {
2210 /* FIXME: Whole function must be checked for non-keyframe entries in
2211 * index case, especially read_timestamp(). */
2212 index = av_index_search_timestamp(st, target_ts,
2213 flags | AVSEEK_FLAG_BACKWARD);
2214 index = FFMAX(index, 0);
2215 e = &st->index_entries[index];
2217 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
2219 ts_min = e->timestamp;
2220 av_log(s, AV_LOG_TRACE, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
2221 pos_min, av_ts2str(ts_min));
2223 av_assert1(index == 0);
2226 index = av_index_search_timestamp(st, target_ts,
2227 flags & ~AVSEEK_FLAG_BACKWARD);
2228 av_assert0(index < st->nb_index_entries);
2230 e = &st->index_entries[index];
2231 av_assert1(e->timestamp >= target_ts);
2233 ts_max = e->timestamp;
2234 pos_limit = pos_max - e->min_distance;
2235 av_log(s, AV_LOG_TRACE, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
2236 " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
2240 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
2241 ts_min, ts_max, flags, &ts, avif->read_timestamp);
2246 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
2249 ff_read_frame_flush(s);
2250 ff_update_cur_dts(s, st, ts);
2255 int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
2256 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2258 int64_t step = 1024;
2259 int64_t limit, ts_max;
2260 int64_t filesize = avio_size(s->pb);
2261 int64_t pos_max = filesize - 1;
2264 pos_max = FFMAX(0, (pos_max) - step);
2265 ts_max = ff_read_timestamp(s, stream_index,
2266 &pos_max, limit, read_timestamp);
2268 } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
2269 if (ts_max == AV_NOPTS_VALUE)
2273 int64_t tmp_pos = pos_max + 1;
2274 int64_t tmp_ts = ff_read_timestamp(s, stream_index,
2275 &tmp_pos, INT64_MAX, read_timestamp);
2276 if (tmp_ts == AV_NOPTS_VALUE)
2278 av_assert0(tmp_pos > pos_max);
2281 if (tmp_pos >= filesize)
2293 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
2294 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
2295 int64_t ts_min, int64_t ts_max,
2296 int flags, int64_t *ts_ret,
2297 int64_t (*read_timestamp)(struct AVFormatContext *, int,
2298 int64_t *, int64_t))
2305 av_log(s, AV_LOG_TRACE, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2307 if (ts_min == AV_NOPTS_VALUE) {
2308 pos_min = s->internal->data_offset;
2309 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2310 if (ts_min == AV_NOPTS_VALUE)
2314 if (ts_min >= target_ts) {
2319 if (ts_max == AV_NOPTS_VALUE) {
2320 if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
2322 pos_limit = pos_max;
2325 if (ts_max <= target_ts) {
2330 av_assert0(ts_min < ts_max);
2333 while (pos_min < pos_limit) {
2334 av_log(s, AV_LOG_TRACE,
2335 "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
2336 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
2337 av_assert0(pos_limit <= pos_max);
2339 if (no_change == 0) {
2340 int64_t approximate_keyframe_distance = pos_max - pos_limit;
2341 // interpolate position (better than dichotomy)
2342 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
2344 pos_min - approximate_keyframe_distance;
2345 } else if (no_change == 1) {
2346 // bisection if interpolation did not change min / max pos last time
2347 pos = (pos_min + pos_limit) >> 1;
2349 /* linear search if bisection failed, can only happen if there
2350 * are very few or no keyframes between min/max */
2355 else if (pos > pos_limit)
2359 // May pass pos_limit instead of -1.
2360 ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
2365 av_log(s, AV_LOG_TRACE, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
2366 " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
2367 pos_min, pos, pos_max,
2368 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
2369 pos_limit, start_pos, no_change);
2370 if (ts == AV_NOPTS_VALUE) {
2371 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
2374 if (target_ts <= ts) {
2375 pos_limit = start_pos - 1;
2379 if (target_ts >= ts) {
2385 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
2386 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
2389 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2391 ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2392 av_log(s, AV_LOG_TRACE, "pos=0x%"PRIx64" %s<=%s<=%s\n",
2393 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
2399 static int seek_frame_byte(AVFormatContext *s, int stream_index,
2400 int64_t pos, int flags)
2402 int64_t pos_min, pos_max;
2404 pos_min = s->internal->data_offset;
2405 pos_max = avio_size(s->pb) - 1;
2409 else if (pos > pos_max)
2412 avio_seek(s->pb, pos, SEEK_SET);
2414 s->io_repositioned = 1;
2419 static int seek_frame_generic(AVFormatContext *s, int stream_index,
2420 int64_t timestamp, int flags)
2427 st = s->streams[stream_index];
2429 index = av_index_search_timestamp(st, timestamp, flags);
2431 if (index < 0 && st->nb_index_entries &&
2432 timestamp < st->index_entries[0].timestamp)
2435 if (index < 0 || index == st->nb_index_entries - 1) {
2439 if (st->nb_index_entries) {
2440 av_assert0(st->index_entries);
2441 ie = &st->index_entries[st->nb_index_entries - 1];
2442 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2444 ff_update_cur_dts(s, st, ie->timestamp);
2446 if ((ret = avio_seek(s->pb, s->internal->data_offset, SEEK_SET)) < 0)
2452 read_status = av_read_frame(s, &pkt);
2453 } while (read_status == AVERROR(EAGAIN));
2454 if (read_status < 0)
2456 if (stream_index == pkt.stream_index && pkt.dts > timestamp) {
2457 if (pkt.flags & AV_PKT_FLAG_KEY) {
2458 av_packet_unref(&pkt);
2461 if (nonkey++ > 1000 && st->codecpar->codec_id != AV_CODEC_ID_CDGRAPHICS) {
2462 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);
2463 av_packet_unref(&pkt);
2467 av_packet_unref(&pkt);
2469 index = av_index_search_timestamp(st, timestamp, flags);
2474 ff_read_frame_flush(s);
2475 if (s->iformat->read_seek)
2476 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2478 ie = &st->index_entries[index];
2479 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2481 ff_update_cur_dts(s, st, ie->timestamp);
2486 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2487 int64_t timestamp, int flags)
2492 if (flags & AVSEEK_FLAG_BYTE) {
2493 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2495 ff_read_frame_flush(s);
2496 return seek_frame_byte(s, stream_index, timestamp, flags);
2499 if (stream_index < 0) {
2500 stream_index = av_find_default_stream_index(s);
2501 if (stream_index < 0)
2504 st = s->streams[stream_index];
2505 /* timestamp for default must be expressed in AV_TIME_BASE units */
2506 timestamp = av_rescale(timestamp, st->time_base.den,
2507 AV_TIME_BASE * (int64_t) st->time_base.num);
2510 /* first, we try the format specific seek */
2511 if (s->iformat->read_seek) {
2512 ff_read_frame_flush(s);
2513 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2519 if (s->iformat->read_timestamp &&
2520 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2521 ff_read_frame_flush(s);
2522 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2523 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2524 ff_read_frame_flush(s);
2525 return seek_frame_generic(s, stream_index, timestamp, flags);
2530 int av_seek_frame(AVFormatContext *s, int stream_index,
2531 int64_t timestamp, int flags)
2535 if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2536 int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2537 if ((flags & AVSEEK_FLAG_BACKWARD))
2541 return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2542 flags & ~AVSEEK_FLAG_BACKWARD);
2545 ret = seek_frame_internal(s, stream_index, timestamp, flags);
2548 ret = avformat_queue_attached_pictures(s);
2553 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
2554 int64_t ts, int64_t max_ts, int flags)
2556 if (min_ts > ts || max_ts < ts)
2558 if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2559 return AVERROR(EINVAL);
2562 flags |= AVSEEK_FLAG_ANY;
2563 flags &= ~AVSEEK_FLAG_BACKWARD;
2565 if (s->iformat->read_seek2) {
2567 ff_read_frame_flush(s);
2569 if (stream_index == -1 && s->nb_streams == 1) {
2570 AVRational time_base = s->streams[0]->time_base;
2571 ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2572 min_ts = av_rescale_rnd(min_ts, time_base.den,
2573 time_base.num * (int64_t)AV_TIME_BASE,
2574 AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
2575 max_ts = av_rescale_rnd(max_ts, time_base.den,
2576 time_base.num * (int64_t)AV_TIME_BASE,
2577 AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
2581 ret = s->iformat->read_seek2(s, stream_index, min_ts,
2585 ret = avformat_queue_attached_pictures(s);
2589 if (s->iformat->read_timestamp) {
2590 // try to seek via read_timestamp()
2593 // Fall back on old API if new is not implemented but old is.
2594 // Note the old API has somewhat different semantics.
2595 if (s->iformat->read_seek || 1) {
2596 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2597 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2598 if (ret<0 && ts != min_ts && max_ts != ts) {
2599 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2601 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2606 // try some generic seek like seek_frame_generic() but with new ts semantics
2607 return -1; //unreachable
2610 int avformat_flush(AVFormatContext *s)
2612 ff_read_frame_flush(s);
2616 /*******************************************************/
2619 * Return TRUE if the stream has accurate duration in any stream.
2621 * @return TRUE if the stream has accurate duration for at least one component.
2623 static int has_duration(AVFormatContext *ic)
2628 for (i = 0; i < ic->nb_streams; i++) {
2629 st = ic->streams[i];
2630 if (st->duration != AV_NOPTS_VALUE)
2633 if (ic->duration != AV_NOPTS_VALUE)
2639 * Estimate the stream timings from the one of each components.
2641 * Also computes the global bitrate if possible.
2643 static void update_stream_timings(AVFormatContext *ic)
2645 int64_t start_time, start_time1, start_time_text, end_time, end_time1, end_time_text;
2646 int64_t duration, duration1, duration_text, filesize;
2650 start_time = INT64_MAX;
2651 start_time_text = INT64_MAX;
2652 end_time = INT64_MIN;
2653 end_time_text = INT64_MIN;
2654 duration = INT64_MIN;
2655 duration_text = INT64_MIN;
2657 for (i = 0; i < ic->nb_streams; i++) {
2658 AVStream *st = ic->streams[i];
2659 int is_text = st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE ||
2660 st->codecpar->codec_type == AVMEDIA_TYPE_DATA;
2661 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2662 start_time1 = av_rescale_q(st->start_time, st->time_base,
2665 start_time_text = FFMIN(start_time_text, start_time1);
2667 start_time = FFMIN(start_time, start_time1);
2668 end_time1 = av_rescale_q_rnd(st->duration, st->time_base,
2670 AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
2671 if (end_time1 != AV_NOPTS_VALUE && (end_time1 > 0 ? start_time1 <= INT64_MAX - end_time1 : start_time1 >= INT64_MIN - end_time1)) {
2672 end_time1 += start_time1;
2674 end_time_text = FFMAX(end_time_text, end_time1);
2676 end_time = FFMAX(end_time, end_time1);
2678 for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
2679 if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2680 p->start_time = start_time1;
2681 if (p->end_time < end_time1)
2682 p->end_time = end_time1;
2685 if (st->duration != AV_NOPTS_VALUE) {
2686 duration1 = av_rescale_q(st->duration, st->time_base,
2689 duration_text = FFMAX(duration_text, duration1);
2691 duration = FFMAX(duration, duration1);
2694 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - (uint64_t)start_time_text < AV_TIME_BASE))
2695 start_time = start_time_text;
2696 else if (start_time > start_time_text)
2697 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2699 if (end_time == INT64_MIN || (end_time < end_time_text && end_time_text - (uint64_t)end_time < AV_TIME_BASE))
2700 end_time = end_time_text;
2701 else if (end_time < end_time_text)
2702 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream endtime %f\n", end_time_text / (float)AV_TIME_BASE);
2704 if (duration == INT64_MIN || (duration < duration_text && duration_text - duration < AV_TIME_BASE))
2705 duration = duration_text;
2706 else if (duration < duration_text)
2707 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream duration %f\n", duration_text / (float)AV_TIME_BASE);
2709 if (start_time != INT64_MAX) {
2710 ic->start_time = start_time;
2711 if (end_time != INT64_MIN) {
2712 if (ic->nb_programs > 1) {
2713 for (i = 0; i < ic->nb_programs; i++) {
2714 p = ic->programs[i];
2715 if (p->start_time != AV_NOPTS_VALUE &&
2716 p->end_time > p->start_time &&
2717 p->end_time - (uint64_t)p->start_time <= INT64_MAX)
2718 duration = FFMAX(duration, p->end_time - p->start_time);
2720 } else if (end_time >= start_time && end_time - (uint64_t)start_time <= INT64_MAX) {
2721 duration = FFMAX(duration, end_time - start_time);
2725 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2726 ic->duration = duration;
2728 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration > 0) {
2729 /* compute the bitrate */
2730 double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2731 (double) ic->duration;
2732 if (bitrate >= 0 && bitrate <= INT64_MAX)
2733 ic->bit_rate = bitrate;
2737 static void fill_all_stream_timings(AVFormatContext *ic)
2742 update_stream_timings(ic);
2743 for (i = 0; i < ic->nb_streams; i++) {
2744 st = ic->streams[i];
2745 if (st->start_time == AV_NOPTS_VALUE) {
2746 if (ic->start_time != AV_NOPTS_VALUE)
2747 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
2749 if (ic->duration != AV_NOPTS_VALUE)
2750 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
2756 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2758 int64_t filesize, duration;
2759 int i, show_warning = 0;
2762 /* if bit_rate is already set, we believe it */
2763 if (ic->bit_rate <= 0) {
2764 int64_t bit_rate = 0;
2765 for (i = 0; i < ic->nb_streams; i++) {
2766 st = ic->streams[i];
2767 if (st->codecpar->bit_rate <= 0 && st->internal->avctx->bit_rate > 0)
2768 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
2769 if (st->codecpar->bit_rate > 0) {
2770 if (INT64_MAX - st->codecpar->bit_rate < bit_rate) {
2774 bit_rate += st->codecpar->bit_rate;
2775 } else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && st->codec_info_nb_frames > 1) {
2776 // If we have a videostream with packets but without a bitrate
2777 // then consider the sum not known
2782 ic->bit_rate = bit_rate;
2785 /* if duration is already set, we believe it */
2786 if (ic->duration == AV_NOPTS_VALUE &&
2787 ic->bit_rate != 0) {
2788 filesize = ic->pb ? avio_size(ic->pb) : 0;
2789 if (filesize > ic->internal->data_offset) {
2790 filesize -= ic->internal->data_offset;
2791 for (i = 0; i < ic->nb_streams; i++) {
2792 st = ic->streams[i];
2793 if ( st->time_base.num <= INT64_MAX / ic->bit_rate
2794 && st->duration == AV_NOPTS_VALUE) {
2795 duration = av_rescale(8 * filesize, st->time_base.den,
2797 (int64_t) st->time_base.num);
2798 st->duration = duration;
2805 av_log(ic, AV_LOG_WARNING,
2806 "Estimating duration from bitrate, this may be inaccurate\n");
2809 #define DURATION_MAX_READ_SIZE 250000LL
2810 #define DURATION_MAX_RETRY 6
2812 /* only usable for MPEG-PS streams */
2813 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2815 AVPacket pkt1, *pkt = &pkt1;
2817 int num, den, read_size, i, ret;
2818 int found_duration = 0;
2820 int64_t filesize, offset, duration;
2823 /* flush packet queue */
2824 flush_packet_queue(ic);
2826 for (i = 0; i < ic->nb_streams; i++) {
2827 st = ic->streams[i];
2828 if (st->start_time == AV_NOPTS_VALUE &&
2829 st->first_dts == AV_NOPTS_VALUE &&
2830 st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN)
2831 av_log(ic, AV_LOG_WARNING,
2832 "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2835 av_parser_close(st->parser);
2840 if (ic->skip_estimate_duration_from_pts) {
2841 av_log(ic, AV_LOG_INFO, "Skipping duration calculation in estimate_timings_from_pts\n");
2842 goto skip_duration_calc;
2845 av_opt_set(ic, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN);
2846 /* estimate the end time (duration) */
2847 /* XXX: may need to support wrapping */
2848 filesize = ic->pb ? avio_size(ic->pb) : 0;
2850 is_end = found_duration;
2851 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
2855 avio_seek(ic->pb, offset, SEEK_SET);
2858 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
2862 ret = ff_read_packet(ic, pkt);
2863 } while (ret == AVERROR(EAGAIN));
2866 read_size += pkt->size;
2867 st = ic->streams[pkt->stream_index];
2868 if (pkt->pts != AV_NOPTS_VALUE &&
2869 (st->start_time != AV_NOPTS_VALUE ||
2870 st->first_dts != AV_NOPTS_VALUE)) {
2871 if (pkt->duration == 0) {
2872 ff_compute_frame_duration(ic, &num, &den, st, st->parser, pkt);
2874 pkt->duration = av_rescale_rnd(1,
2875 num * (int64_t) st->time_base.den,
2876 den * (int64_t) st->time_base.num,
2880 duration = pkt->pts + pkt->duration;
2882 if (st->start_time != AV_NOPTS_VALUE)
2883 duration -= st->start_time;
2885 duration -= st->first_dts;
2887 if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
2888 (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2889 st->duration = duration;
2890 st->info->last_duration = duration;
2893 av_packet_unref(pkt);
2896 /* check if all audio/video streams have valid duration */
2899 for (i = 0; i < ic->nb_streams; i++) {
2900 st = ic->streams[i];
2901 switch (st->codecpar->codec_type) {
2902 case AVMEDIA_TYPE_VIDEO:
2903 case AVMEDIA_TYPE_AUDIO:
2904 if (st->duration == AV_NOPTS_VALUE)
2911 ++retry <= DURATION_MAX_RETRY);
2913 av_opt_set(ic, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN);
2915 /* warn about audio/video streams which duration could not be estimated */
2916 for (i = 0; i < ic->nb_streams; i++) {
2917 st = ic->streams[i];
2918 if (st->duration == AV_NOPTS_VALUE) {
2919 switch (st->codecpar->codec_type) {
2920 case AVMEDIA_TYPE_VIDEO:
2921 case AVMEDIA_TYPE_AUDIO:
2922 if (st->start_time != AV_NOPTS_VALUE || st->first_dts != AV_NOPTS_VALUE) {
2923 av_log(ic, AV_LOG_DEBUG, "stream %d : no PTS found at end of file, duration not set\n", i);
2925 av_log(ic, AV_LOG_DEBUG, "stream %d : no TS found at start of file, duration not set\n", i);
2930 fill_all_stream_timings(ic);
2932 avio_seek(ic->pb, old_offset, SEEK_SET);
2933 for (i = 0; i < ic->nb_streams; i++) {
2936 st = ic->streams[i];
2937 st->cur_dts = st->first_dts;
2938 st->last_IP_pts = AV_NOPTS_VALUE;
2939 st->last_dts_for_order_check = AV_NOPTS_VALUE;
2940 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
2941 st->pts_buffer[j] = AV_NOPTS_VALUE;
2945 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2949 /* get the file size, if possible */
2950 if (ic->iformat->flags & AVFMT_NOFILE) {
2953 file_size = avio_size(ic->pb);
2954 file_size = FFMAX(0, file_size);
2957 if ((!strcmp(ic->iformat->name, "mpeg") ||
2958 !strcmp(ic->iformat->name, "mpegts")) &&
2959 file_size && (ic->pb->seekable & AVIO_SEEKABLE_NORMAL)) {
2960 /* get accurate estimate from the PTSes */
2961 estimate_timings_from_pts(ic, old_offset);
2962 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2963 } else if (has_duration(ic)) {
2964 /* at least one component has timings - we use them for all
2966 fill_all_stream_timings(ic);
2967 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2969 /* less precise: use bitrate info */
2970 estimate_timings_from_bit_rate(ic);
2971 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2973 update_stream_timings(ic);
2977 AVStream av_unused *st;
2978 for (i = 0; i < ic->nb_streams; i++) {
2979 st = ic->streams[i];
2980 if (st->time_base.den)
2981 av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %0.3f duration: %0.3f\n", i,
2982 (double) st->start_time * av_q2d(st->time_base),
2983 (double) st->duration * av_q2d(st->time_base));
2985 av_log(ic, AV_LOG_TRACE,
2986 "format: start_time: %0.3f duration: %0.3f bitrate=%"PRId64" kb/s\n",
2987 (double) ic->start_time / AV_TIME_BASE,
2988 (double) ic->duration / AV_TIME_BASE,
2989 (int64_t)ic->bit_rate / 1000);
2993 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2995 AVCodecContext *avctx = st->internal->avctx;
2997 #define FAIL(errmsg) do { \
2999 *errmsg_ptr = errmsg; \
3003 if ( avctx->codec_id == AV_CODEC_ID_NONE
3004 && avctx->codec_type != AVMEDIA_TYPE_DATA)
3005 FAIL("unknown codec");
3006 switch (avctx->codec_type) {
3007 case AVMEDIA_TYPE_AUDIO:
3008 if (!avctx->frame_size && determinable_frame_size(avctx))
3009 FAIL("unspecified frame size");
3010 if (st->info->found_decoder >= 0 &&
3011 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
3012 FAIL("unspecified sample format");
3013 if (!avctx->sample_rate)
3014 FAIL("unspecified sample rate");
3015 if (!avctx->channels)
3016 FAIL("unspecified number of channels");
3017 if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
3018 FAIL("no decodable DTS frames");
3020 case AVMEDIA_TYPE_VIDEO:
3022 FAIL("unspecified size");
3023 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
3024 FAIL("unspecified pixel format");
3025 if (st->codecpar->codec_id == AV_CODEC_ID_RV30 || st->codecpar->codec_id == AV_CODEC_ID_RV40)
3026 if (!st->sample_aspect_ratio.num && !st->codecpar->sample_aspect_ratio.num && !st->codec_info_nb_frames)
3027 FAIL("no frame in rv30/40 and no sar");
3029 case AVMEDIA_TYPE_SUBTITLE:
3030 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
3031 FAIL("unspecified size");
3033 case AVMEDIA_TYPE_DATA:
3034 if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
3040 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
3041 static int try_decode_frame(AVFormatContext *s, AVStream *st,
3042 const AVPacket *avpkt, AVDictionary **options)
3044 AVCodecContext *avctx = st->internal->avctx;
3045 const AVCodec *codec;
3046 int got_picture = 1, ret = 0;
3047 AVFrame *frame = av_frame_alloc();
3048 AVSubtitle subtitle;
3049 AVPacket pkt = *avpkt;
3050 int do_skip_frame = 0;
3051 enum AVDiscard skip_frame;
3054 return AVERROR(ENOMEM);
3056 if (!avcodec_is_open(avctx) &&
3057 st->info->found_decoder <= 0 &&
3058 (st->codecpar->codec_id != -st->info->found_decoder || !st->codecpar->codec_id)) {
3059 AVDictionary *thread_opt = NULL;
3061 codec = find_probe_decoder(s, st, st->codecpar->codec_id);
3064 st->info->found_decoder = -st->codecpar->codec_id;
3069 /* Force thread count to 1 since the H.264 decoder will not extract
3070 * SPS and PPS to extradata during multi-threaded decoding. */
3071 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
3072 if (s->codec_whitelist)
3073 av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
3074 ret = avcodec_open2(avctx, codec, options ? options : &thread_opt);
3076 av_dict_free(&thread_opt);
3078 st->info->found_decoder = -avctx->codec_id;
3081 st->info->found_decoder = 1;
3082 } else if (!st->info->found_decoder)
3083 st->info->found_decoder = 1;
3085 if (st->info->found_decoder < 0) {
3090 if (avpriv_codec_get_cap_skip_frame_fill_param(avctx->codec)) {
3092 skip_frame = avctx->skip_frame;
3093 avctx->skip_frame = AVDISCARD_ALL;
3096 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
3098 (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
3099 (!st->codec_info_nb_frames &&
3100 (avctx->codec->capabilities & AV_CODEC_CAP_CHANNEL_CONF)))) {
3102 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
3103 avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
3104 ret = avcodec_send_packet(avctx, &pkt);
3105 if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3109 ret = avcodec_receive_frame(avctx, frame);
3112 if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
3114 } else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3115 ret = avcodec_decode_subtitle2(avctx, &subtitle,
3116 &got_picture, &pkt);
3122 st->nb_decoded_frames++;
3127 if (!pkt.data && !got_picture)
3131 if (do_skip_frame) {
3132 avctx->skip_frame = skip_frame;
3135 av_frame_free(&frame);
3139 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
3141 while (tags->id != AV_CODEC_ID_NONE) {
3149 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
3152 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3153 if (tag == tags[i].tag)
3155 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3156 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
3158 return AV_CODEC_ID_NONE;
3161 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
3163 if (bps <= 0 || bps > 64)
3164 return AV_CODEC_ID_NONE;
3169 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
3171 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
3173 return AV_CODEC_ID_NONE;
3178 if (sflags & (1 << (bps - 1))) {
3181 return AV_CODEC_ID_PCM_S8;
3183 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
3185 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
3187 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
3189 return be ? AV_CODEC_ID_PCM_S64BE : AV_CODEC_ID_PCM_S64LE;
3191 return AV_CODEC_ID_NONE;
3196 return AV_CODEC_ID_PCM_U8;
3198 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
3200 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
3202 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
3204 return AV_CODEC_ID_NONE;
3210 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
3213 if (!av_codec_get_tag2(tags, id, &tag))
3218 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
3222 for (i = 0; tags && tags[i]; i++) {
3223 const AVCodecTag *codec_tags = tags[i];
3224 while (codec_tags->id != AV_CODEC_ID_NONE) {
3225 if (codec_tags->id == id) {
3226 *tag = codec_tags->tag;
3235 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
3238 for (i = 0; tags && tags[i]; i++) {
3239 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
3240 if (id != AV_CODEC_ID_NONE)
3243 return AV_CODEC_ID_NONE;
3246 static void compute_chapters_end(AVFormatContext *s)
3249 int64_t max_time = 0;
3251 if (s->duration > 0 && s->start_time < INT64_MAX - s->duration)
3252 max_time = s->duration +
3253 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
3255 for (i = 0; i < s->nb_chapters; i++)
3256 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
3257 AVChapter *ch = s->chapters[i];
3258 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
3262 for (j = 0; j < s->nb_chapters; j++) {
3263 AVChapter *ch1 = s->chapters[j];
3264 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
3266 if (j != i && next_start > ch->start && next_start < end)
3269 ch->end = (end == INT64_MAX || end < ch->start) ? ch->start : end;
3273 static int get_std_framerate(int i)
3276 return (i + 1) * 1001;
3280 return (i + 31) * 1001 * 12;
3284 return ((const int[]) { 80, 120, 240})[i] * 1001 * 12;
3288 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
3291 /* Is the time base unreliable?
3292 * This is a heuristic to balance between quick acceptance of the values in
3293 * the headers vs. some extra checks.
3294 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
3295 * MPEG-2 commonly misuses field repeat flags to store different framerates.
3296 * And there are "variable" fps files this needs to detect as well. */
3297 static int tb_unreliable(AVCodecContext *c)
3299 if (c->time_base.den >= 101LL * c->time_base.num ||
3300 c->time_base.den < 5LL * c->time_base.num ||
3301 // c->codec_tag == AV_RL32("DIVX") ||
3302 // c->codec_tag == AV_RL32("XVID") ||
3303 c->codec_tag == AV_RL32("mp4v") ||
3304 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
3305 c->codec_id == AV_CODEC_ID_GIF ||
3306 c->codec_id == AV_CODEC_ID_HEVC ||
3307 c->codec_id == AV_CODEC_ID_H264)
3312 int ff_alloc_extradata(AVCodecParameters *par, int size)
3314 av_freep(&par->extradata);
3315 par->extradata_size = 0;
3317 if (size < 0 || size >= INT32_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
3318 return AVERROR(EINVAL);
3320 par->extradata = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
3321 if (!par->extradata)
3322 return AVERROR(ENOMEM);
3324 memset(par->extradata + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3325 par->extradata_size = size;
3330 int ff_get_extradata(AVFormatContext *s, AVCodecParameters *par, AVIOContext *pb, int size)
3332 int ret = ff_alloc_extradata(par, size);
3335 ret = avio_read(pb, par->extradata, size);
3337 av_freep(&par->extradata);
3338 par->extradata_size = 0;
3339 av_log(s, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
3340 return ret < 0 ? ret : AVERROR_INVALIDDATA;
3346 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
3349 int64_t last = st->info->last_dts;
3351 if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
3352 && ts - (uint64_t)last < INT64_MAX) {
3353 double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
3354 int64_t duration = ts - last;
3356 if (!st->info->duration_error)
3357 st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
3358 if (!st->info->duration_error)
3359 return AVERROR(ENOMEM);
3361 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3362 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
3363 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3364 if (st->info->duration_error[0][1][i] < 1e10) {
3365 int framerate = get_std_framerate(i);
3366 double sdts = dts*framerate/(1001*12);
3367 for (j= 0; j<2; j++) {
3368 int64_t ticks = llrint(sdts+j*0.5);
3369 double error= sdts - ticks + j*0.5;
3370 st->info->duration_error[j][0][i] += error;
3371 st->info->duration_error[j][1][i] += error*error;
3375 if (st->info->rfps_duration_sum <= INT64_MAX - duration) {
3376 st->info->duration_count++;
3377 st->info->rfps_duration_sum += duration;
3380 if (st->info->duration_count % 10 == 0) {
3381 int n = st->info->duration_count;
3382 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3383 if (st->info->duration_error[0][1][i] < 1e10) {
3384 double a0 = st->info->duration_error[0][0][i] / n;
3385 double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
3386 double a1 = st->info->duration_error[1][0][i] / n;
3387 double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
3388 if (error0 > 0.04 && error1 > 0.04) {
3389 st->info->duration_error[0][1][i] = 2e10;
3390 st->info->duration_error[1][1][i] = 2e10;
3396 // ignore the first 4 values, they might have some random jitter
3397 if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
3398 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
3400 if (ts != AV_NOPTS_VALUE)
3401 st->info->last_dts = ts;
3406 void ff_rfps_calculate(AVFormatContext *ic)
3410 for (i = 0; i < ic->nb_streams; i++) {
3411 AVStream *st = ic->streams[i];
3413 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
3415 // the check for tb_unreliable() is not completely correct, since this is not about handling
3416 // an unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3417 // ipmovie.c produces.
3418 if (tb_unreliable(st->internal->avctx) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
3419 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->info->duration_gcd, INT_MAX);
3420 if (st->info->duration_count>1 && !st->r_frame_rate.num
3421 && tb_unreliable(st->internal->avctx)) {
3423 double best_error= 0.01;
3424 AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
3426 for (j= 0; j<MAX_STD_TIMEBASES; j++) {
3429 if (st->info->codec_info_duration &&
3430 st->info->codec_info_duration*av_q2d(st->time_base) < (1001*11.5)/get_std_framerate(j))
3432 if (!st->info->codec_info_duration && get_std_framerate(j) < 1001*12)
3435 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
3438 for (k= 0; k<2; k++) {
3439 int n = st->info->duration_count;
3440 double a= st->info->duration_error[k][0][j] / n;
3441 double error= st->info->duration_error[k][1][j]/n - a*a;
3443 if (error < best_error && best_error> 0.000000001) {
3445 num = get_std_framerate(j);
3448 av_log(ic, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
3451 // do not increase frame rate by more than 1 % in order to match a standard rate.
3452 if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
3453 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
3455 if ( !st->avg_frame_rate.num
3456 && st->r_frame_rate.num && st->info->rfps_duration_sum
3457 && st->info->codec_info_duration <= 0
3458 && st->info->duration_count > 2
3459 && 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
3461 av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
3462 st->avg_frame_rate = st->r_frame_rate;
3465 av_freep(&st->info->duration_error);
3466 st->info->last_dts = AV_NOPTS_VALUE;
3467 st->info->duration_count = 0;
3468 st->info->rfps_duration_sum = 0;
3472 static int extract_extradata_check(AVStream *st)
3474 const AVBitStreamFilter *f;
3476 f = av_bsf_get_by_name("extract_extradata");
3481 const enum AVCodecID *ids;
3482 for (ids = f->codec_ids; *ids != AV_CODEC_ID_NONE; ids++)
3483 if (*ids == st->codecpar->codec_id)
3490 static int extract_extradata_init(AVStream *st)
3492 AVStreamInternal *sti = st->internal;
3493 const AVBitStreamFilter *f;
3496 f = av_bsf_get_by_name("extract_extradata");
3500 /* check that the codec id is supported */
3501 ret = extract_extradata_check(st);
3505 sti->extract_extradata.pkt = av_packet_alloc();
3506 if (!sti->extract_extradata.pkt)
3507 return AVERROR(ENOMEM);
3509 ret = av_bsf_alloc(f, &sti->extract_extradata.bsf);
3513 ret = avcodec_parameters_copy(sti->extract_extradata.bsf->par_in,
3518 sti->extract_extradata.bsf->time_base_in = st->time_base;
3520 ret = av_bsf_init(sti->extract_extradata.bsf);
3525 sti->extract_extradata.inited = 1;
3529 av_bsf_free(&sti->extract_extradata.bsf);
3530 av_packet_free(&sti->extract_extradata.pkt);
3534 static int extract_extradata(AVStream *st, const AVPacket *pkt)
3536 AVStreamInternal *sti = st->internal;
3540 if (!sti->extract_extradata.inited) {
3541 ret = extract_extradata_init(st);
3546 if (sti->extract_extradata.inited && !sti->extract_extradata.bsf)
3549 pkt_ref = sti->extract_extradata.pkt;
3550 ret = av_packet_ref(pkt_ref, pkt);
3554 ret = av_bsf_send_packet(sti->extract_extradata.bsf, pkt_ref);
3556 av_packet_unref(pkt_ref);
3560 while (ret >= 0 && !sti->avctx->extradata) {
3564 ret = av_bsf_receive_packet(sti->extract_extradata.bsf, pkt_ref);
3566 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3571 extradata = av_packet_get_side_data(pkt_ref, AV_PKT_DATA_NEW_EXTRADATA,
3575 av_assert0(!sti->avctx->extradata);
3576 if ((unsigned)extradata_size < FF_MAX_EXTRADATA_SIZE)
3577 sti->avctx->extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
3578 if (!sti->avctx->extradata) {
3579 av_packet_unref(pkt_ref);
3580 return AVERROR(ENOMEM);
3582 memcpy(sti->avctx->extradata, extradata, extradata_size);
3583 sti->avctx->extradata_size = extradata_size;
3585 av_packet_unref(pkt_ref);
3591 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3593 int i, count = 0, ret = 0, j;
3596 AVCodecContext *avctx;
3598 int64_t old_offset = avio_tell(ic->pb);
3599 // new streams might appear, no options for those
3600 int orig_nb_streams = ic->nb_streams;
3602 int64_t max_analyze_duration = ic->max_analyze_duration;
3603 int64_t max_stream_analyze_duration;
3604 int64_t max_subtitle_analyze_duration;
3605 int64_t probesize = ic->probesize;
3606 int eof_reached = 0;
3607 int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
3609 flush_codecs = probesize > 0;
3611 av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3613 max_stream_analyze_duration = max_analyze_duration;
3614 max_subtitle_analyze_duration = max_analyze_duration;
3615 if (!max_analyze_duration) {
3616 max_stream_analyze_duration =
3617 max_analyze_duration = 5*AV_TIME_BASE;
3618 max_subtitle_analyze_duration = 30*AV_TIME_BASE;
3619 if (!strcmp(ic->iformat->name, "flv"))
3620 max_stream_analyze_duration = 90*AV_TIME_BASE;
3621 if (!strcmp(ic->iformat->name, "mpeg") || !strcmp(ic->iformat->name, "mpegts"))
3622 max_stream_analyze_duration = 7*AV_TIME_BASE;
3626 av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d nb_streams:%d\n",
3627 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, ic->nb_streams);
3629 for (i = 0; i < ic->nb_streams; i++) {
3630 const AVCodec *codec;
3631 AVDictionary *thread_opt = NULL;
3632 st = ic->streams[i];
3633 avctx = st->internal->avctx;
3635 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3636 st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3637 /* if (!st->time_base.num)
3639 if (!avctx->time_base.num)
3640 avctx->time_base = st->time_base;
3643 /* check if the caller has overridden the codec id */
3644 #if FF_API_LAVF_AVCTX
3645 FF_DISABLE_DEPRECATION_WARNINGS
3646 if (st->codec->codec_id != st->internal->orig_codec_id) {
3647 st->codecpar->codec_id = st->codec->codec_id;
3648 st->codecpar->codec_type = st->codec->codec_type;
3649 st->internal->orig_codec_id = st->codec->codec_id;
3651 FF_ENABLE_DEPRECATION_WARNINGS
3653 // only for the split stuff
3654 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->request_probe <= 0) {
3655 st->parser = av_parser_init(st->codecpar->codec_id);
3657 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3658 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3659 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3660 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3662 } else if (st->need_parsing) {
3663 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3664 "%s, packets or times may be invalid.\n",
3665 avcodec_get_name(st->codecpar->codec_id));
3669 if (st->codecpar->codec_id != st->internal->orig_codec_id)
3670 st->internal->orig_codec_id = st->codecpar->codec_id;
3672 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3674 goto find_stream_info_err;
3675 if (st->request_probe <= 0)
3676 st->internal->avctx_inited = 1;
3678 codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3680 /* Force thread count to 1 since the H.264 decoder will not extract
3681 * SPS and PPS to extradata during multi-threaded decoding. */
3682 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3684 if (ic->codec_whitelist)
3685 av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3687 /* Ensure that subtitle_header is properly set. */
3688 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE
3689 && codec && !avctx->codec) {
3690 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3691 av_log(ic, AV_LOG_WARNING,
3692 "Failed to open codec in %s\n",__FUNCTION__);
3695 // Try to just open decoders, in case this is enough to get parameters.
3696 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3697 if (codec && !avctx->codec)
3698 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3699 av_log(ic, AV_LOG_WARNING,
3700 "Failed to open codec in %s\n",__FUNCTION__);
3703 av_dict_free(&thread_opt);
3706 for (i = 0; i < ic->nb_streams; i++) {
3707 #if FF_API_R_FRAME_RATE
3708 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3710 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3711 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
3716 const AVPacket *pkt;
3717 int analyzed_all_streams;
3718 if (ff_check_interrupt(&ic->interrupt_callback)) {
3720 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3724 /* check if one codec still needs to be handled */
3725 for (i = 0; i < ic->nb_streams; i++) {
3726 int fps_analyze_framecount = 20;
3729 st = ic->streams[i];
3730 if (!has_codec_parameters(st, NULL))
3732 /* If the timebase is coarse (like the usual millisecond precision
3733 * of mkv), we need to analyze more frames to reliably arrive at
3734 * the correct fps. */
3735 if (av_q2d(st->time_base) > 0.0005)
3736 fps_analyze_framecount *= 2;
3737 if (!tb_unreliable(st->internal->avctx))
3738 fps_analyze_framecount = 0;
3739 if (ic->fps_probe_size >= 0)
3740 fps_analyze_framecount = ic->fps_probe_size;
3741 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3742 fps_analyze_framecount = 0;
3743 /* variable fps and no guess at the real fps */
3744 count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
3745 st->info->codec_info_duration_fields/2 :
3746 st->info->duration_count;
3747 if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3748 st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3749 if (count < fps_analyze_framecount)
3752 // Look at the first 3 frames if there is evidence of frame delay
3753 // but the decoder delay is not set.
3754 if (st->info->frame_delay_evidence && count < 2 && st->internal->avctx->has_b_frames == 0)
3756 if (!st->internal->avctx->extradata &&
3757 (!st->internal->extract_extradata.inited ||
3758 st->internal->extract_extradata.bsf) &&
3759 extract_extradata_check(st))
3761 if (st->first_dts == AV_NOPTS_VALUE &&
3762 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3763 st->codec_info_nb_frames < ((st->disposition & AV_DISPOSITION_ATTACHED_PIC) ? 1 : ic->max_ts_probe) &&
3764 (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3765 st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))
3768 analyzed_all_streams = 0;
3769 if (!missing_streams || !*missing_streams)
3770 if (i == ic->nb_streams) {
3771 analyzed_all_streams = 1;
3772 /* NOTE: If the format has no header, then we need to read some
3773 * packets to get most of the streams, so we cannot stop here. */
3774 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3775 /* If we found the info for all the codecs, we can stop. */
3777 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3782 /* We did not get all the codec info, but we read too much data. */
3783 if (read_size >= probesize) {
3785 av_log(ic, AV_LOG_DEBUG,
3786 "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3787 for (i = 0; i < ic->nb_streams; i++)
3788 if (!ic->streams[i]->r_frame_rate.num &&
3789 ic->streams[i]->info->duration_count <= 1 &&
3790 ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
3791 strcmp(ic->iformat->name, "image2"))
3792 av_log(ic, AV_LOG_WARNING,
3793 "Stream #%d: not enough frames to estimate rate; "
3794 "consider increasing probesize\n", i);
3798 /* NOTE: A new stream can be added there if no header in file
3799 * (AVFMTCTX_NOHEADER). */
3800 ret = read_frame_internal(ic, &pkt1);
3801 if (ret == AVERROR(EAGAIN))
3810 if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
3811 ret = ff_packet_list_put(&ic->internal->packet_buffer,
3812 &ic->internal->packet_buffer_end,
3815 goto unref_then_goto_end;
3817 pkt = &ic->internal->packet_buffer_end->pkt;
3822 st = ic->streams[pkt->stream_index];
3823 if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3824 read_size += pkt->size;
3826 avctx = st->internal->avctx;
3827 if (!st->internal->avctx_inited) {
3828 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3830 goto unref_then_goto_end;
3831 st->internal->avctx_inited = 1;
3834 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3835 /* check for non-increasing dts */
3836 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3837 st->info->fps_last_dts >= pkt->dts) {
3838 av_log(ic, AV_LOG_DEBUG,
3839 "Non-increasing DTS in stream %d: packet %d with DTS "
3840 "%"PRId64", packet %d with DTS %"PRId64"\n",
3841 st->index, st->info->fps_last_dts_idx,
3842 st->info->fps_last_dts, st->codec_info_nb_frames,
3844 st->info->fps_first_dts =
3845 st->info->fps_last_dts = AV_NOPTS_VALUE;
3847 /* Check for a discontinuity in dts. If the difference in dts
3848 * is more than 1000 times the average packet duration in the
3849 * sequence, we treat it as a discontinuity. */
3850 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3851 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3852 (pkt->dts - (uint64_t)st->info->fps_last_dts) / 1000 >
3853 (st->info->fps_last_dts - (uint64_t)st->info->fps_first_dts) /
3854 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3855 av_log(ic, AV_LOG_WARNING,
3856 "DTS discontinuity in stream %d: packet %d with DTS "
3857 "%"PRId64", packet %d with DTS %"PRId64"\n",
3858 st->index, st->info->fps_last_dts_idx,
3859 st->info->fps_last_dts, st->codec_info_nb_frames,
3861 st->info->fps_first_dts =
3862 st->info->fps_last_dts = AV_NOPTS_VALUE;
3865 /* update stored dts values */
3866 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3867 st->info->fps_first_dts = pkt->dts;
3868 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3870 st->info->fps_last_dts = pkt->dts;
3871 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3873 if (st->codec_info_nb_frames>1) {
3877 if (st->time_base.den > 0)
3878 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3879 if (st->avg_frame_rate.num > 0)
3880 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3883 && st->codec_info_nb_frames>30
3884 && st->info->fps_first_dts != AV_NOPTS_VALUE
3885 && st->info->fps_last_dts != AV_NOPTS_VALUE)
3886 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3888 if (analyzed_all_streams) limit = max_analyze_duration;
3889 else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) limit = max_subtitle_analyze_duration;
3890 else limit = max_stream_analyze_duration;
3893 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds st:%d\n",
3895 t, pkt->stream_index);
3896 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3897 av_packet_unref(&pkt1);
3900 if (pkt->duration) {
3901 if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE && pkt->pts != AV_NOPTS_VALUE && st->start_time != AV_NOPTS_VALUE && pkt->pts >= st->start_time) {
3902 st->info->codec_info_duration = FFMIN(pkt->pts - st->start_time, st->info->codec_info_duration + pkt->duration);
3904 st->info->codec_info_duration += pkt->duration;
3905 st->info->codec_info_duration_fields += st->parser && st->need_parsing && avctx->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3908 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3909 #if FF_API_R_FRAME_RATE
3910 ff_rfps_add_frame(ic, st, pkt->dts);
3912 if (pkt->dts != pkt->pts && pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE)
3913 st->info->frame_delay_evidence = 1;
3915 if (!st->internal->avctx->extradata) {
3916 ret = extract_extradata(st, pkt);
3918 goto unref_then_goto_end;
3921 /* If still no information, we try to open the codec and to
3922 * decompress the frame. We try to avoid that in most cases as
3923 * it takes longer and uses more memory. For MPEG-4, we need to
3924 * decompress for QuickTime.
3926 * If AV_CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3927 * least one frame of codec data, this makes sure the codec initializes
3928 * the channel configuration and does not only trust the values from
3930 try_decode_frame(ic, st, pkt,
3931 (options && i < orig_nb_streams) ? &options[i] : NULL);
3933 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3934 av_packet_unref(&pkt1);
3936 st->codec_info_nb_frames++;
3942 for (stream_index = 0; stream_index < ic->nb_streams; stream_index++) {
3943 st = ic->streams[stream_index];
3944 avctx = st->internal->avctx;
3945 if (!has_codec_parameters(st, NULL)) {
3946 const AVCodec *codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3947 if (codec && !avctx->codec) {
3948 AVDictionary *opts = NULL;
3949 if (ic->codec_whitelist)
3950 av_dict_set(&opts, "codec_whitelist", ic->codec_whitelist, 0);
3951 if (avcodec_open2(avctx, codec, (options && stream_index < orig_nb_streams) ? &options[stream_index] : &opts) < 0)
3952 av_log(ic, AV_LOG_WARNING,
3953 "Failed to open codec in %s\n",__FUNCTION__);
3954 av_dict_free(&opts);
3958 // EOF already reached while reading the stream above.
3959 // So continue with reoordering DTS with whatever delay we have.
3960 if (ic->internal->packet_buffer && !has_decode_delay_been_guessed(st)) {
3961 update_dts_from_pts(ic, stream_index, ic->internal->packet_buffer);
3967 AVPacket empty_pkt = { 0 };
3969 av_init_packet(&empty_pkt);
3971 for (i = 0; i < ic->nb_streams; i++) {
3973 st = ic->streams[i];
3975 /* flush the decoders */
3976 if (st->info->found_decoder == 1) {
3978 err = try_decode_frame(ic, st, &empty_pkt,
3979 (options && i < orig_nb_streams)
3980 ? &options[i] : NULL);
3981 } while (err > 0 && !has_codec_parameters(st, NULL));
3984 av_log(ic, AV_LOG_INFO,
3985 "decoding for stream %d failed\n", st->index);
3991 ff_rfps_calculate(ic);
3993 for (i = 0; i < ic->nb_streams; i++) {
3994 st = ic->streams[i];
3995 avctx = st->internal->avctx;
3996 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
3997 if (avctx->codec_id == AV_CODEC_ID_RAWVIDEO && !avctx->codec_tag && !avctx->bits_per_coded_sample) {
3998 uint32_t tag= avcodec_pix_fmt_to_codec_tag(avctx->pix_fmt);
3999 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == avctx->pix_fmt)
4000 avctx->codec_tag= tag;
4003 /* estimate average framerate if not set by demuxer */
4004 if (st->info->codec_info_duration_fields &&
4005 !st->avg_frame_rate.num &&
4006 st->info->codec_info_duration) {
4008 double best_error = 0.01;
4009 AVRational codec_frame_rate = avctx->framerate;
4011 if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
4012 st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
4013 st->info->codec_info_duration < 0)
4015 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
4016 st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
4017 st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
4019 /* Round guessed framerate to a "standard" framerate if it's
4020 * within 1% of the original estimate. */
4021 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
4022 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
4023 double error = fabs(av_q2d(st->avg_frame_rate) /
4024 av_q2d(std_fps) - 1);
4026 if (error < best_error) {
4028 best_fps = std_fps.num;
4031 if (ic->internal->prefer_codec_framerate && codec_frame_rate.num > 0 && codec_frame_rate.den > 0) {
4032 error = fabs(av_q2d(codec_frame_rate) /
4033 av_q2d(std_fps) - 1);
4034 if (error < best_error) {
4036 best_fps = std_fps.num;
4041 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
4042 best_fps, 12 * 1001, INT_MAX);
4045 if (!st->r_frame_rate.num) {
4046 if ( avctx->time_base.den * (int64_t) st->time_base.num
4047 <= avctx->time_base.num * avctx->ticks_per_frame * (int64_t) st->time_base.den) {
4048 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den,
4049 avctx->time_base.den, (int64_t)avctx->time_base.num * avctx->ticks_per_frame, INT_MAX);
4051 st->r_frame_rate.num = st->time_base.den;
4052 st->r_frame_rate.den = st->time_base.num;
4055 if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
4056 AVRational hw_ratio = { avctx->height, avctx->width };
4057 st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
4060 } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
4061 if (!avctx->bits_per_coded_sample)
4062 avctx->bits_per_coded_sample =
4063 av_get_bits_per_sample(avctx->codec_id);
4064 // set stream disposition based on audio service type
4065 switch (avctx->audio_service_type) {
4066 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
4067 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
4069 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
4070 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
4072 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
4073 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
4075 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
4076 st->disposition = AV_DISPOSITION_COMMENT;
4078 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
4079 st->disposition = AV_DISPOSITION_KARAOKE;
4086 estimate_timings(ic, old_offset);
4088 av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
4090 if (ret >= 0 && ic->nb_streams)
4091 /* We could not have all the codec parameters before EOF. */
4093 for (i = 0; i < ic->nb_streams; i++) {
4095 st = ic->streams[i];
4097 /* if no packet was ever seen, update context now for has_codec_parameters */
4098 if (!st->internal->avctx_inited) {
4099 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
4100 st->codecpar->format == AV_SAMPLE_FMT_NONE)
4101 st->codecpar->format = st->internal->avctx->sample_fmt;
4102 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
4104 goto find_stream_info_err;
4106 if (!has_codec_parameters(st, &errmsg)) {
4108 avcodec_string(buf, sizeof(buf), st->internal->avctx, 0);
4109 av_log(ic, AV_LOG_WARNING,
4110 "Could not find codec parameters for stream %d (%s): %s\n"
4111 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
4118 compute_chapters_end(ic);
4120 /* update the stream parameters from the internal codec contexts */
4121 for (i = 0; i < ic->nb_streams; i++) {
4122 st = ic->streams[i];
4124 if (st->internal->avctx_inited) {
4125 int orig_w = st->codecpar->width;
4126 int orig_h = st->codecpar->height;
4127 ret = avcodec_parameters_from_context(st->codecpar, st->internal->avctx);
4129 goto find_stream_info_err;
4131 // The decoder might reduce the video size by the lowres factor.
4132 if (st->internal->avctx->lowres && orig_w) {
4133 st->codecpar->width = orig_w;
4134 st->codecpar->height = orig_h;
4139 #if FF_API_LAVF_AVCTX
4140 FF_DISABLE_DEPRECATION_WARNINGS
4141 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
4143 goto find_stream_info_err;
4146 // The old API (AVStream.codec) "requires" the resolution to be adjusted
4147 // by the lowres factor.
4148 if (st->internal->avctx->lowres && st->internal->avctx->width) {
4149 st->codec->lowres = st->internal->avctx->lowres;
4150 st->codec->width = st->internal->avctx->width;
4151 st->codec->height = st->internal->avctx->height;
4155 if (st->codec->codec_tag != MKTAG('t','m','c','d')) {
4156 st->codec->time_base = st->internal->avctx->time_base;
4157 st->codec->ticks_per_frame = st->internal->avctx->ticks_per_frame;
4159 st->codec->framerate = st->avg_frame_rate;
4161 if (st->internal->avctx->subtitle_header) {
4162 st->codec->subtitle_header = av_malloc(st->internal->avctx->subtitle_header_size);
4163 if (!st->codec->subtitle_header)
4164 goto find_stream_info_err;
4165 st->codec->subtitle_header_size = st->internal->avctx->subtitle_header_size;
4166 memcpy(st->codec->subtitle_header, st->internal->avctx->subtitle_header,
4167 st->codec->subtitle_header_size);
4170 // Fields unavailable in AVCodecParameters
4171 st->codec->coded_width = st->internal->avctx->coded_width;
4172 st->codec->coded_height = st->internal->avctx->coded_height;
4173 st->codec->properties = st->internal->avctx->properties;
4174 FF_ENABLE_DEPRECATION_WARNINGS
4177 st->internal->avctx_inited = 0;
4180 find_stream_info_err:
4181 for (i = 0; i < ic->nb_streams; i++) {
4182 st = ic->streams[i];
4184 av_freep(&st->info->duration_error);
4185 avcodec_close(ic->streams[i]->internal->avctx);
4186 av_freep(&ic->streams[i]->info);
4187 av_bsf_free(&ic->streams[i]->internal->extract_extradata.bsf);
4188 av_packet_free(&ic->streams[i]->internal->extract_extradata.pkt);
4191 av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
4192 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
4195 unref_then_goto_end:
4196 av_packet_unref(&pkt1);
4197 goto find_stream_info_err;
4200 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
4204 for (i = 0; i < ic->nb_programs; i++) {
4205 if (ic->programs[i] == last) {
4209 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
4210 if (ic->programs[i]->stream_index[j] == s)
4211 return ic->programs[i];
4217 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
4218 int wanted_stream_nb, int related_stream,
4219 AVCodec **decoder_ret, int flags)
4221 int i, nb_streams = ic->nb_streams;
4222 int ret = AVERROR_STREAM_NOT_FOUND;
4223 int best_count = -1, best_multiframe = -1, best_disposition = -1;
4224 int count, multiframe, disposition;
4225 int64_t best_bitrate = -1;
4227 unsigned *program = NULL;
4228 const AVCodec *decoder = NULL, *best_decoder = NULL;
4230 if (related_stream >= 0 && wanted_stream_nb < 0) {
4231 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
4233 program = p->stream_index;
4234 nb_streams = p->nb_stream_indexes;
4237 for (i = 0; i < nb_streams; i++) {
4238 int real_stream_index = program ? program[i] : i;
4239 AVStream *st = ic->streams[real_stream_index];
4240 AVCodecParameters *par = st->codecpar;
4241 if (par->codec_type != type)
4243 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
4245 if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate))
4248 decoder = find_decoder(ic, st, par->codec_id);
4251 ret = AVERROR_DECODER_NOT_FOUND;
4255 disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED))
4256 + !! (st->disposition & AV_DISPOSITION_DEFAULT);
4257 count = st->codec_info_nb_frames;
4258 bitrate = par->bit_rate;
4259 multiframe = FFMIN(5, count);
4260 if ((best_disposition > disposition) ||
4261 (best_disposition == disposition && best_multiframe > multiframe) ||
4262 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate > bitrate) ||
4263 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
4265 best_disposition = disposition;
4267 best_bitrate = bitrate;
4268 best_multiframe = multiframe;
4269 ret = real_stream_index;
4270 best_decoder = decoder;
4271 if (program && i == nb_streams - 1 && ret < 0) {
4273 nb_streams = ic->nb_streams;
4274 /* no related stream found, try again with everything */
4279 *decoder_ret = (AVCodec*)best_decoder;
4283 /*******************************************************/
4285 int av_read_play(AVFormatContext *s)
4287 if (s->iformat->read_play)
4288 return s->iformat->read_play(s);
4290 return avio_pause(s->pb, 0);
4291 return AVERROR(ENOSYS);
4294 int av_read_pause(AVFormatContext *s)
4296 if (s->iformat->read_pause)
4297 return s->iformat->read_pause(s);
4299 return avio_pause(s->pb, 1);
4300 return AVERROR(ENOSYS);
4303 int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src)
4308 dst->time_base = src->time_base;
4309 dst->nb_frames = src->nb_frames;
4310 dst->disposition = src->disposition;
4311 dst->sample_aspect_ratio = src->sample_aspect_ratio;
4312 dst->avg_frame_rate = src->avg_frame_rate;
4313 dst->r_frame_rate = src->r_frame_rate;
4315 av_dict_free(&dst->metadata);
4316 ret = av_dict_copy(&dst->metadata, src->metadata, 0);
4320 ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
4324 /* Free existing side data*/
4325 for (i = 0; i < dst->nb_side_data; i++)
4326 av_free(dst->side_data[i].data);
4327 av_freep(&dst->side_data);
4328 dst->nb_side_data = 0;
4330 /* Copy side data if present */
4331 if (src->nb_side_data) {
4332 dst->side_data = av_mallocz_array(src->nb_side_data,
4333 sizeof(AVPacketSideData));
4334 if (!dst->side_data)
4335 return AVERROR(ENOMEM);
4336 dst->nb_side_data = src->nb_side_data;
4338 for (i = 0; i < src->nb_side_data; i++) {
4339 uint8_t *data = av_memdup(src->side_data[i].data,
4340 src->side_data[i].size);
4342 return AVERROR(ENOMEM);
4343 dst->side_data[i].type = src->side_data[i].type;
4344 dst->side_data[i].size = src->side_data[i].size;
4345 dst->side_data[i].data = data;
4349 #if FF_API_LAVF_FFSERVER
4350 FF_DISABLE_DEPRECATION_WARNINGS
4351 av_freep(&dst->recommended_encoder_configuration);
4352 if (src->recommended_encoder_configuration) {
4353 const char *conf_str = src->recommended_encoder_configuration;
4354 dst->recommended_encoder_configuration = av_strdup(conf_str);
4355 if (!dst->recommended_encoder_configuration)
4356 return AVERROR(ENOMEM);
4358 FF_ENABLE_DEPRECATION_WARNINGS
4364 static void free_stream(AVStream **pst)
4366 AVStream *st = *pst;
4372 for (i = 0; i < st->nb_side_data; i++)
4373 av_freep(&st->side_data[i].data);
4374 av_freep(&st->side_data);
4377 av_parser_close(st->parser);
4379 if (st->attached_pic.data)
4380 av_packet_unref(&st->attached_pic);
4383 avcodec_free_context(&st->internal->avctx);
4384 for (i = 0; i < st->internal->nb_bsfcs; i++) {
4385 av_bsf_free(&st->internal->bsfcs[i]);
4386 av_freep(&st->internal->bsfcs);
4388 av_freep(&st->internal->priv_pts);
4389 av_bsf_free(&st->internal->extract_extradata.bsf);
4390 av_packet_free(&st->internal->extract_extradata.pkt);
4392 av_freep(&st->internal);
4394 av_dict_free(&st->metadata);
4395 avcodec_parameters_free(&st->codecpar);
4396 av_freep(&st->probe_data.buf);
4397 av_freep(&st->index_entries);
4398 #if FF_API_LAVF_AVCTX
4399 FF_DISABLE_DEPRECATION_WARNINGS
4400 avcodec_free_context(&st->codec);
4401 FF_ENABLE_DEPRECATION_WARNINGS
4403 av_freep(&st->priv_data);
4405 av_freep(&st->info->duration_error);
4406 av_freep(&st->info);
4407 #if FF_API_LAVF_FFSERVER
4408 FF_DISABLE_DEPRECATION_WARNINGS
4409 av_freep(&st->recommended_encoder_configuration);
4410 FF_ENABLE_DEPRECATION_WARNINGS
4416 void ff_free_stream(AVFormatContext *s, AVStream *st)
4418 av_assert0(s->nb_streams>0);
4419 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
4421 free_stream(&s->streams[ --s->nb_streams ]);
4424 void avformat_free_context(AVFormatContext *s)
4432 if (s->iformat && s->iformat->priv_class && s->priv_data)
4433 av_opt_free(s->priv_data);
4434 if (s->oformat && s->oformat->priv_class && s->priv_data)
4435 av_opt_free(s->priv_data);
4437 for (i = s->nb_streams - 1; i >= 0; i--)
4438 ff_free_stream(s, s->streams[i]);
4441 for (i = s->nb_programs - 1; i >= 0; i--) {
4442 av_dict_free(&s->programs[i]->metadata);
4443 av_freep(&s->programs[i]->stream_index);
4444 av_freep(&s->programs[i]);
4446 av_freep(&s->programs);
4447 av_freep(&s->priv_data);
4448 while (s->nb_chapters--) {
4449 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
4450 av_freep(&s->chapters[s->nb_chapters]);
4452 av_freep(&s->chapters);
4453 av_dict_free(&s->metadata);
4454 av_dict_free(&s->internal->id3v2_meta);
4455 av_freep(&s->streams);
4456 flush_packet_queue(s);
4457 av_freep(&s->internal);
4462 void avformat_close_input(AVFormatContext **ps)
4473 if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
4474 (s->flags & AVFMT_FLAG_CUSTOM_IO))
4477 flush_packet_queue(s);
4480 if (s->iformat->read_close)
4481 s->iformat->read_close(s);
4483 avformat_free_context(s);
4490 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
4496 if (s->nb_streams >= FFMIN(s->max_streams, INT_MAX/sizeof(*streams))) {
4497 if (s->max_streams < INT_MAX/sizeof(*streams))
4498 av_log(s, AV_LOG_ERROR, "Number of streams exceeds max_streams parameter (%d), see the documentation if you wish to increase it\n", s->max_streams);
4501 streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
4504 s->streams = streams;
4506 st = av_mallocz(sizeof(AVStream));
4509 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
4513 st->info->last_dts = AV_NOPTS_VALUE;
4515 #if FF_API_LAVF_AVCTX
4516 FF_DISABLE_DEPRECATION_WARNINGS
4517 st->codec = avcodec_alloc_context3(c);
4523 FF_ENABLE_DEPRECATION_WARNINGS
4526 st->internal = av_mallocz(sizeof(*st->internal));
4530 st->codecpar = avcodec_parameters_alloc();
4534 st->internal->avctx = avcodec_alloc_context3(NULL);
4535 if (!st->internal->avctx)
4539 #if FF_API_LAVF_AVCTX
4540 FF_DISABLE_DEPRECATION_WARNINGS
4541 /* no default bitrate if decoding */
4542 st->codec->bit_rate = 0;
4543 FF_ENABLE_DEPRECATION_WARNINGS
4546 /* default pts setting is MPEG-like */
4547 avpriv_set_pts_info(st, 33, 1, 90000);
4548 /* we set the current DTS to 0 so that formats without any timestamps
4549 * but durations get some timestamps, formats with some unknown
4550 * timestamps have their first few packets buffered and the
4551 * timestamps corrected before they are returned to the user */
4552 st->cur_dts = RELATIVE_TS_BASE;
4554 st->cur_dts = AV_NOPTS_VALUE;
4557 st->index = s->nb_streams;
4558 st->start_time = AV_NOPTS_VALUE;
4559 st->duration = AV_NOPTS_VALUE;
4560 st->first_dts = AV_NOPTS_VALUE;
4561 st->probe_packets = MAX_PROBE_PACKETS;
4562 st->pts_wrap_reference = AV_NOPTS_VALUE;
4563 st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4565 st->last_IP_pts = AV_NOPTS_VALUE;
4566 st->last_dts_for_order_check = AV_NOPTS_VALUE;
4567 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
4568 st->pts_buffer[i] = AV_NOPTS_VALUE;
4570 st->sample_aspect_ratio = (AVRational) { 0, 1 };
4572 #if FF_API_R_FRAME_RATE
4573 st->info->last_dts = AV_NOPTS_VALUE;
4575 st->info->fps_first_dts = AV_NOPTS_VALUE;
4576 st->info->fps_last_dts = AV_NOPTS_VALUE;
4578 st->inject_global_side_data = s->internal->inject_global_side_data;
4580 st->internal->need_context_update = 1;
4582 s->streams[s->nb_streams++] = st;
4589 AVProgram *av_new_program(AVFormatContext *ac, int id)
4591 AVProgram *program = NULL;
4594 av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
4596 for (i = 0; i < ac->nb_programs; i++)
4597 if (ac->programs[i]->id == id)
4598 program = ac->programs[i];
4601 program = av_mallocz(sizeof(AVProgram));
4604 dynarray_add(&ac->programs, &ac->nb_programs, program);
4605 program->discard = AVDISCARD_NONE;
4606 program->pmt_version = -1;
4609 program->pts_wrap_reference = AV_NOPTS_VALUE;
4610 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4612 program->start_time =
4613 program->end_time = AV_NOPTS_VALUE;
4618 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
4619 int64_t start, int64_t end, const char *title)
4621 AVChapter *chapter = NULL;
4624 if (end != AV_NOPTS_VALUE && start > end) {
4625 av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
4629 for (i = 0; i < s->nb_chapters; i++)
4630 if (s->chapters[i]->id == id)
4631 chapter = s->chapters[i];
4634 chapter = av_mallocz(sizeof(AVChapter));
4637 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
4639 av_dict_set(&chapter->metadata, "title", title, 0);
4641 chapter->time_base = time_base;
4642 chapter->start = start;
4648 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
4651 AVProgram *program = NULL;
4654 if (idx >= ac->nb_streams) {
4655 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
4659 for (i = 0; i < ac->nb_programs; i++) {
4660 if (ac->programs[i]->id != progid)
4662 program = ac->programs[i];
4663 for (j = 0; j < program->nb_stream_indexes; j++)
4664 if (program->stream_index[j] == idx)
4667 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
4670 program->stream_index = tmp;
4671 program->stream_index[program->nb_stream_indexes++] = idx;
4676 uint64_t ff_ntp_time(void)
4678 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
4681 uint64_t ff_get_formatted_ntp_time(uint64_t ntp_time_us)
4683 uint64_t ntp_ts, frac_part, sec;
4686 //current ntp time in seconds and micro seconds
4687 sec = ntp_time_us / 1000000;
4688 usec = ntp_time_us % 1000000;
4690 //encoding in ntp timestamp format
4691 frac_part = usec * 0xFFFFFFFFULL;
4692 frac_part /= 1000000;
4694 if (sec > 0xFFFFFFFFULL)
4695 av_log(NULL, AV_LOG_WARNING, "NTP time format roll over detected\n");
4698 ntp_ts |= frac_part;
4703 int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags)
4706 char *q, buf1[20], c;
4707 int nd, len, percentd_found;
4719 while (av_isdigit(*p))
4720 nd = nd * 10 + *p++ - '0';
4722 } while (av_isdigit(c));
4728 if (!(flags & AV_FRAME_FILENAME_FLAGS_MULTIPLE) && percentd_found)
4733 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
4735 if ((q - buf + len) > buf_size - 1)
4737 memcpy(q, buf1, len);
4745 if ((q - buf) < buf_size - 1)
4749 if (!percentd_found)
4758 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
4760 return av_get_frame_filename2(buf, buf_size, path, number, 0);
4763 void av_url_split(char *proto, int proto_size,
4764 char *authorization, int authorization_size,
4765 char *hostname, int hostname_size,
4766 int *port_ptr, char *path, int path_size, const char *url)
4768 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
4774 if (authorization_size > 0)
4775 authorization[0] = 0;
4776 if (hostname_size > 0)
4781 /* parse protocol */
4782 if ((p = strchr(url, ':'))) {
4783 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4790 /* no protocol means plain filename */
4791 av_strlcpy(path, url, path_size);
4795 /* separate path from hostname */
4796 ls = strchr(p, '/');
4797 ls2 = strchr(p, '?');
4801 ls = FFMIN(ls, ls2);
4803 av_strlcpy(path, ls, path_size);
4805 ls = &p[strlen(p)]; // XXX
4807 /* the rest is hostname, use that to parse auth/port */
4809 /* authorization (user[:pass]@hostname) */
4811 while ((at = strchr(p, '@')) && at < ls) {
4812 av_strlcpy(authorization, at2,
4813 FFMIN(authorization_size, at + 1 - at2));
4814 p = at + 1; /* skip '@' */
4817 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4819 av_strlcpy(hostname, p + 1,
4820 FFMIN(hostname_size, brk - p));
4821 if (brk[1] == ':' && port_ptr)
4822 *port_ptr = atoi(brk + 2);
4823 } else if ((col = strchr(p, ':')) && col < ls) {
4824 av_strlcpy(hostname, p,
4825 FFMIN(col + 1 - p, hostname_size));
4827 *port_ptr = atoi(col + 1);
4829 av_strlcpy(hostname, p,
4830 FFMIN(ls + 1 - p, hostname_size));
4834 int ff_mkdir_p(const char *path)
4837 char *temp = av_strdup(path);
4841 if (!path || !temp) {
4845 if (!av_strncasecmp(temp, "/", 1) || !av_strncasecmp(temp, "\\", 1)) {
4847 } else if (!av_strncasecmp(temp, "./", 2) || !av_strncasecmp(temp, ".\\", 2)) {
4851 for ( ; *pos != '\0'; ++pos) {
4852 if (*pos == '/' || *pos == '\\') {
4855 ret = mkdir(temp, 0755);
4860 if ((*(pos - 1) != '/') || (*(pos - 1) != '\\')) {
4861 ret = mkdir(temp, 0755);
4868 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4871 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4874 'C', 'D', 'E', 'F' };
4875 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4878 'c', 'd', 'e', 'f' };
4879 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4881 for (i = 0; i < s; i++) {
4882 buff[i * 2] = hex_table[src[i] >> 4];
4883 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4889 int ff_hex_to_data(uint8_t *data, const char *p)
4896 p += strspn(p, SPACE_CHARS);
4899 c = av_toupper((unsigned char) *p++);
4900 if (c >= '0' && c <= '9')
4902 else if (c >= 'A' && c <= 'F')
4917 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4918 unsigned int pts_num, unsigned int pts_den)
4921 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
4922 if (new_tb.num != pts_num)
4923 av_log(NULL, AV_LOG_DEBUG,
4924 "st:%d removing common factor %d from timebase\n",
4925 s->index, pts_num / new_tb.num);
4927 av_log(NULL, AV_LOG_WARNING,
4928 "st:%d has too large timebase, reducing\n", s->index);
4930 if (new_tb.num <= 0 || new_tb.den <= 0) {
4931 av_log(NULL, AV_LOG_ERROR,
4932 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4933 new_tb.num, new_tb.den,
4937 s->time_base = new_tb;
4938 #if FF_API_LAVF_AVCTX
4939 FF_DISABLE_DEPRECATION_WARNINGS
4940 s->codec->pkt_timebase = new_tb;
4941 FF_ENABLE_DEPRECATION_WARNINGS
4943 s->internal->avctx->pkt_timebase = new_tb;
4944 s->pts_wrap_bits = pts_wrap_bits;
4947 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4950 const char *ptr = str;
4952 /* Parse key=value pairs. */
4955 char *dest = NULL, *dest_end;
4956 int key_len, dest_len = 0;
4958 /* Skip whitespace and potential commas. */
4959 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4966 if (!(ptr = strchr(key, '=')))
4969 key_len = ptr - key;
4971 callback_get_buf(context, key, key_len, &dest, &dest_len);
4972 dest_end = dest + dest_len - 1;
4976 while (*ptr && *ptr != '\"') {
4980 if (dest && dest < dest_end)
4984 if (dest && dest < dest_end)
4992 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
4993 if (dest && dest < dest_end)
5001 int ff_find_stream_index(AVFormatContext *s, int id)
5004 for (i = 0; i < s->nb_streams; i++)
5005 if (s->streams[i]->id == id)
5010 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
5014 unsigned int codec_tag;
5015 if (ofmt->query_codec)
5016 return ofmt->query_codec(codec_id, std_compliance);
5017 else if (ofmt->codec_tag)
5018 return !!av_codec_get_tag2(ofmt->codec_tag, codec_id, &codec_tag);
5019 else if (codec_id == ofmt->video_codec ||
5020 codec_id == ofmt->audio_codec ||
5021 codec_id == ofmt->subtitle_codec ||
5022 codec_id == ofmt->data_codec)
5025 return AVERROR_PATCHWELCOME;
5028 int avformat_network_init(void)
5032 if ((ret = ff_network_init()) < 0)
5034 if ((ret = ff_tls_init()) < 0)
5040 int avformat_network_deinit(void)
5049 int ff_add_param_change(AVPacket *pkt, int32_t channels,
5050 uint64_t channel_layout, int32_t sample_rate,
5051 int32_t width, int32_t height)
5057 return AVERROR(EINVAL);
5060 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
5062 if (channel_layout) {
5064 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
5068 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
5070 if (width || height) {
5072 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
5074 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
5076 return AVERROR(ENOMEM);
5077 bytestream_put_le32(&data, flags);
5079 bytestream_put_le32(&data, channels);
5081 bytestream_put_le64(&data, channel_layout);
5083 bytestream_put_le32(&data, sample_rate);
5084 if (width || height) {
5085 bytestream_put_le32(&data, width);
5086 bytestream_put_le32(&data, height);
5091 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
5093 AVRational undef = {0, 1};
5094 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
5095 AVRational codec_sample_aspect_ratio = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
5096 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
5098 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
5099 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
5100 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
5101 stream_sample_aspect_ratio = undef;
5103 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
5104 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
5105 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
5106 frame_sample_aspect_ratio = undef;
5108 if (stream_sample_aspect_ratio.num)
5109 return stream_sample_aspect_ratio;
5111 return frame_sample_aspect_ratio;
5114 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
5116 AVRational fr = st->r_frame_rate;
5117 AVRational codec_fr = st->internal->avctx->framerate;
5118 AVRational avg_fr = st->avg_frame_rate;
5120 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
5121 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
5126 if (st->internal->avctx->ticks_per_frame > 1) {
5127 if ( codec_fr.num > 0 && codec_fr.den > 0 &&
5128 (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))
5136 * Matches a stream specifier (but ignores requested index).
5138 * @param indexptr set to point to the requested stream index if there is one
5140 * @return <0 on error
5141 * 0 if st is NOT a matching stream
5142 * >0 if st is a matching stream
5144 static int match_stream_specifier(AVFormatContext *s, AVStream *st,
5145 const char *spec, const char **indexptr, AVProgram **p)
5147 int match = 1; /* Stores if the specifier matches so far. */
5149 if (*spec <= '9' && *spec >= '0') { /* opt:index */
5153 } else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
5154 *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
5155 enum AVMediaType type;
5159 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
5160 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
5161 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
5162 case 'd': type = AVMEDIA_TYPE_DATA; break;
5163 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
5164 case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
5165 default: av_assert0(0);
5167 if (*spec && *spec++ != ':') /* If we are not at the end, then another specifier must follow. */
5168 return AVERROR(EINVAL);
5170 #if FF_API_LAVF_AVCTX
5171 FF_DISABLE_DEPRECATION_WARNINGS
5172 if (type != st->codecpar->codec_type
5173 && (st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN || st->codec->codec_type != type))
5175 FF_ENABLE_DEPRECATION_WARNINGS
5177 if (type != st->codecpar->codec_type)
5180 if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
5182 } else if (*spec == 'p' && *(spec + 1) == ':') {
5187 prog_id = strtol(spec, &endptr, 0);
5188 /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
5189 if (spec == endptr || (*endptr && *endptr++ != ':'))
5190 return AVERROR(EINVAL);
5193 for (i = 0; i < s->nb_programs; i++) {
5194 if (s->programs[i]->id != prog_id)
5197 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++) {
5198 if (st->index == s->programs[i]->stream_index[j]) {
5201 *p = s->programs[i];
5210 } else if (*spec == '#' ||
5211 (*spec == 'i' && *(spec + 1) == ':')) {
5214 spec += 1 + (*spec == 'i');
5215 stream_id = strtol(spec, &endptr, 0);
5216 if (spec == endptr || *endptr) /* Disallow empty id and make sure we are at the end. */
5217 return AVERROR(EINVAL);
5218 return match && (stream_id == st->id);
5219 } else if (*spec == 'm' && *(spec + 1) == ':') {
5220 AVDictionaryEntry *tag;
5226 val = strchr(spec, ':');
5228 key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
5230 return AVERROR(ENOMEM);
5232 tag = av_dict_get(st->metadata, key, NULL, 0);
5234 if (!val || !strcmp(tag->value, val + 1))
5243 return match && ret;
5244 } else if (*spec == 'u' && *(spec + 1) == '\0') {
5245 AVCodecParameters *par = st->codecpar;
5246 #if FF_API_LAVF_AVCTX
5247 FF_DISABLE_DEPRECATION_WARNINGS
5248 AVCodecContext *codec = st->codec;
5249 FF_ENABLE_DEPRECATION_WARNINGS
5252 switch (par->codec_type) {
5253 case AVMEDIA_TYPE_AUDIO:
5254 val = par->sample_rate && par->channels;
5255 #if FF_API_LAVF_AVCTX
5256 val = val || (codec->sample_rate && codec->channels);
5258 if (par->format == AV_SAMPLE_FMT_NONE
5259 #if FF_API_LAVF_AVCTX
5260 && codec->sample_fmt == AV_SAMPLE_FMT_NONE
5265 case AVMEDIA_TYPE_VIDEO:
5266 val = par->width && par->height;
5267 #if FF_API_LAVF_AVCTX
5268 val = val || (codec->width && codec->height);
5270 if (par->format == AV_PIX_FMT_NONE
5271 #if FF_API_LAVF_AVCTX
5272 && codec->pix_fmt == AV_PIX_FMT_NONE
5277 case AVMEDIA_TYPE_UNKNOWN:
5284 #if FF_API_LAVF_AVCTX
5285 return match && ((par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0);
5287 return match && (par->codec_id != AV_CODEC_ID_NONE && val != 0);
5290 return AVERROR(EINVAL);
5298 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
5303 const char *indexptr = NULL;
5304 AVProgram *p = NULL;
5307 ret = match_stream_specifier(s, st, spec, &indexptr, &p);
5314 index = strtol(indexptr, &endptr, 0);
5315 if (*endptr) { /* We can't have anything after the requested index. */
5316 ret = AVERROR(EINVAL);
5320 /* This is not really needed but saves us a loop for simple stream index specifiers. */
5321 if (spec == indexptr)
5322 return (index == st->index);
5324 /* If we requested a matching stream index, we have to ensure st is that. */
5325 nb_streams = p ? p->nb_stream_indexes : s->nb_streams;
5326 for (int i = 0; i < nb_streams && index >= 0; i++) {
5327 AVStream *candidate = p ? s->streams[p->stream_index[i]] : s->streams[i];
5328 ret = match_stream_specifier(s, candidate, spec, NULL, NULL);
5331 if (ret > 0 && index-- == 0 && st == candidate)
5337 if (ret == AVERROR(EINVAL))
5338 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
5342 int ff_generate_avci_extradata(AVStream *st)
5344 static const uint8_t avci100_1080p_extradata[] = {
5346 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5347 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5348 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5349 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
5350 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
5351 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
5352 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
5353 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
5354 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5356 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5359 static const uint8_t avci100_1080i_extradata[] = {
5361 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5362 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5363 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5364 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
5365 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
5366 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
5367 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
5368 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
5369 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
5370 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
5371 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
5373 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5376 static const uint8_t avci50_1080p_extradata[] = {
5378 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5379 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5380 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5381 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5382 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5383 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
5384 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
5385 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
5386 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
5388 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5391 static const uint8_t avci50_1080i_extradata[] = {
5393 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5394 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5395 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5396 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
5397 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
5398 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
5399 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
5400 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
5401 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
5402 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
5403 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
5405 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5408 static const uint8_t avci100_720p_extradata[] = {
5410 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5411 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
5412 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
5413 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
5414 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
5415 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
5416 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
5417 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
5418 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
5419 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
5421 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
5424 static const uint8_t avci50_720p_extradata[] = {
5426 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
5427 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5428 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5429 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5430 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5431 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
5432 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
5433 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
5434 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
5436 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5440 const uint8_t *data = NULL;
5443 if (st->codecpar->width == 1920) {
5444 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5445 data = avci100_1080p_extradata;
5446 size = sizeof(avci100_1080p_extradata);
5448 data = avci100_1080i_extradata;
5449 size = sizeof(avci100_1080i_extradata);
5451 } else if (st->codecpar->width == 1440) {
5452 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5453 data = avci50_1080p_extradata;
5454 size = sizeof(avci50_1080p_extradata);
5456 data = avci50_1080i_extradata;
5457 size = sizeof(avci50_1080i_extradata);
5459 } else if (st->codecpar->width == 1280) {
5460 data = avci100_720p_extradata;
5461 size = sizeof(avci100_720p_extradata);
5462 } else if (st->codecpar->width == 960) {
5463 data = avci50_720p_extradata;
5464 size = sizeof(avci50_720p_extradata);
5470 av_freep(&st->codecpar->extradata);
5471 if (ff_alloc_extradata(st->codecpar, size))
5472 return AVERROR(ENOMEM);
5473 memcpy(st->codecpar->extradata, data, size);
5478 uint8_t *av_stream_get_side_data(const AVStream *st,
5479 enum AVPacketSideDataType type, int *size)
5483 for (i = 0; i < st->nb_side_data; i++) {
5484 if (st->side_data[i].type == type) {
5486 *size = st->side_data[i].size;
5487 return st->side_data[i].data;
5493 int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
5494 uint8_t *data, size_t size)
5496 AVPacketSideData *sd, *tmp;
5499 for (i = 0; i < st->nb_side_data; i++) {
5500 sd = &st->side_data[i];
5502 if (sd->type == type) {
5503 av_freep(&sd->data);
5510 if ((unsigned)st->nb_side_data + 1 >= INT_MAX / sizeof(*st->side_data))
5511 return AVERROR(ERANGE);
5513 tmp = av_realloc(st->side_data, (st->nb_side_data + 1) * sizeof(*tmp));
5515 return AVERROR(ENOMEM);
5518 st->side_data = tmp;
5521 sd = &st->side_data[st->nb_side_data - 1];
5529 uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
5533 uint8_t *data = av_malloc(size);
5538 ret = av_stream_add_side_data(st, type, data, size);
5547 int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
5550 const AVBitStreamFilter *bsf;
5552 AVCodecParameters *in_par;
5554 if (!(bsf = av_bsf_get_by_name(name))) {
5555 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter '%s'\n", name);
5556 return AVERROR_BSF_NOT_FOUND;
5559 if ((ret = av_bsf_alloc(bsf, &bsfc)) < 0)
5562 if (st->internal->nb_bsfcs) {
5563 in_par = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->par_out;
5564 bsfc->time_base_in = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->time_base_out;
5566 in_par = st->codecpar;
5567 bsfc->time_base_in = st->time_base;
5570 if ((ret = avcodec_parameters_copy(bsfc->par_in, in_par)) < 0) {
5575 if (args && bsfc->filter->priv_class) {
5576 const AVOption *opt = av_opt_next(bsfc->priv_data, NULL);
5577 const char * shorthand[2] = {NULL};
5580 shorthand[0] = opt->name;
5582 if ((ret = av_opt_set_from_string(bsfc->priv_data, args, shorthand, "=", ":")) < 0) {
5588 if ((ret = av_bsf_init(bsfc)) < 0) {
5593 if ((ret = av_dynarray_add_nofree(&st->internal->bsfcs, &st->internal->nb_bsfcs, bsfc))) {
5598 av_log(NULL, AV_LOG_VERBOSE,
5599 "Automatically inserted bitstream filter '%s'; args='%s'\n",
5600 name, args ? args : "");
5605 FF_DISABLE_DEPRECATION_WARNINGS
5606 int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt,
5607 AVBitStreamFilterContext *bsfc)
5611 AVPacket new_pkt = *pkt;
5612 int a = av_bitstream_filter_filter(bsfc, codec, NULL,
5613 &new_pkt.data, &new_pkt.size,
5614 pkt->data, pkt->size,
5615 pkt->flags & AV_PKT_FLAG_KEY);
5616 if (a == 0 && new_pkt.size == 0 && new_pkt.side_data_elems == 0) {
5617 av_packet_unref(pkt);
5618 memset(pkt, 0, sizeof(*pkt));
5621 if(a == 0 && new_pkt.data != pkt->data) {
5622 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
5624 memcpy(t, new_pkt.data, new_pkt.size);
5625 memset(t + new_pkt.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
5630 a = AVERROR(ENOMEM);
5634 new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
5635 av_buffer_default_free, NULL, 0);
5637 pkt->side_data = NULL;
5638 pkt->side_data_elems = 0;
5639 av_packet_unref(pkt);
5641 av_freep(&new_pkt.data);
5642 a = AVERROR(ENOMEM);
5646 av_log(codec, AV_LOG_ERROR,
5647 "Failed to open bitstream filter %s for stream %d with codec %s",
5648 bsfc->filter->name, pkt->stream_index,
5649 codec->codec ? codec->codec->name : "copy");
5659 FF_ENABLE_DEPRECATION_WARNINGS
5662 int ff_format_output_open(AVFormatContext *s, const char *url, AVDictionary **options)
5665 return AVERROR(EINVAL);
5667 if (!(s->oformat->flags & AVFMT_NOFILE))
5668 return s->io_open(s, &s->pb, url, AVIO_FLAG_WRITE, options);
5672 void ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
5675 s->io_close(s, *pb);
5679 int ff_is_http_proto(char *filename) {
5680 const char *proto = avio_find_protocol_name(filename);
5681 return proto ? (!av_strcasecmp(proto, "http") || !av_strcasecmp(proto, "https")) : 0;
5684 int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
5686 AVDictionaryEntry *entry;
5687 int64_t parsed_timestamp;
5689 if ((entry = av_dict_get(s->metadata, "creation_time", NULL, 0))) {
5690 if ((ret = av_parse_time(&parsed_timestamp, entry->value, 0)) >= 0) {
5691 *timestamp = return_seconds ? parsed_timestamp / 1000000 : parsed_timestamp;
5694 av_log(s, AV_LOG_WARNING, "Failed to parse creation_time %s\n", entry->value);
5701 int ff_standardize_creation_time(AVFormatContext *s)
5704 int ret = ff_parse_creation_time_metadata(s, ×tamp, 0);
5706 return avpriv_dict_set_timestamp(&s->metadata, "creation_time", timestamp);
5710 int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette)
5715 side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &size);
5717 if (size != AVPALETTE_SIZE) {
5718 av_log(s, AV_LOG_ERROR, "Invalid palette side data\n");
5719 return AVERROR_INVALIDDATA;
5721 memcpy(palette, side_data, AVPALETTE_SIZE);
5725 if (ret == CONTAINS_PAL) {
5727 for (i = 0; i < AVPALETTE_COUNT; i++)
5728 palette[i] = AV_RL32(pkt->data + pkt->size - AVPALETTE_SIZE + i*4);
5735 int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf)
5740 ret = av_bprint_finalize(buf, &str);
5743 if (!av_bprint_is_complete(buf)) {
5745 return AVERROR(ENOMEM);
5748 par->extradata = str;
5749 /* Note: the string is NUL terminated (so extradata can be read as a
5750 * string), but the ending character is not accounted in the size (in
5751 * binary formats you are likely not supposed to mux that character). When
5752 * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE
5754 par->extradata_size = buf->len;
5758 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
5759 AVStream *ost, const AVStream *ist,
5760 enum AVTimebaseSource copy_tb)
5762 //TODO: use [io]st->internal->avctx
5763 const AVCodecContext *dec_ctx = ist->codec;
5764 AVCodecContext *enc_ctx = ost->codec;
5766 enc_ctx->time_base = ist->time_base;
5768 * Avi is a special case here because it supports variable fps but
5769 * having the fps and timebase differe significantly adds quite some
5772 if (!strcmp(ofmt->name, "avi")) {
5773 #if FF_API_R_FRAME_RATE
5774 if (copy_tb == AVFMT_TBCF_AUTO && ist->r_frame_rate.num
5775 && av_q2d(ist->r_frame_rate) >= av_q2d(ist->avg_frame_rate)
5776 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(ist->time_base)
5777 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx->time_base)
5778 && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx->time_base) < 1.0/500
5779 || copy_tb == AVFMT_TBCF_R_FRAMERATE) {
5780 enc_ctx->time_base.num = ist->r_frame_rate.den;
5781 enc_ctx->time_base.den = 2*ist->r_frame_rate.num;
5782 enc_ctx->ticks_per_frame = 2;
5785 if (copy_tb == AVFMT_TBCF_AUTO && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > 2*av_q2d(ist->time_base)
5786 && av_q2d(ist->time_base) < 1.0/500
5787 || copy_tb == AVFMT_TBCF_DECODER) {
5788 enc_ctx->time_base = dec_ctx->time_base;
5789 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5790 enc_ctx->time_base.den *= 2;
5791 enc_ctx->ticks_per_frame = 2;
5793 } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS)
5794 && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
5795 if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx->time_base.den
5796 && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > av_q2d(ist->time_base)
5797 && av_q2d(ist->time_base) < 1.0/500
5798 || copy_tb == AVFMT_TBCF_DECODER) {
5799 enc_ctx->time_base = dec_ctx->time_base;
5800 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5804 if ((enc_ctx->codec_tag == AV_RL32("tmcd") || ost->codecpar->codec_tag == AV_RL32("tmcd"))
5805 && dec_ctx->time_base.num < dec_ctx->time_base.den
5806 && dec_ctx->time_base.num > 0
5807 && 121LL*dec_ctx->time_base.num > dec_ctx->time_base.den) {
5808 enc_ctx->time_base = dec_ctx->time_base;
5811 if (ost->avg_frame_rate.num)
5812 enc_ctx->time_base = av_inv_q(ost->avg_frame_rate);
5814 av_reduce(&enc_ctx->time_base.num, &enc_ctx->time_base.den,
5815 enc_ctx->time_base.num, enc_ctx->time_base.den, INT_MAX);
5820 AVRational av_stream_get_codec_timebase(const AVStream *st)
5822 // See avformat_transfer_internal_stream_timing_info() TODO.
5823 #if FF_API_LAVF_AVCTX
5824 FF_DISABLE_DEPRECATION_WARNINGS
5825 return st->codec->time_base;
5826 FF_ENABLE_DEPRECATION_WARNINGS
5828 return st->internal->avctx->time_base;
5832 void ff_format_set_url(AVFormatContext *s, char *url)
5837 #if FF_API_FORMAT_FILENAME
5838 FF_DISABLE_DEPRECATION_WARNINGS
5839 av_strlcpy(s->filename, url, sizeof(s->filename));
5840 FF_ENABLE_DEPRECATION_WARNINGS