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 int orig_size = pkt->size;
275 int prev_size = pkt->size;
278 /* When the caller requests a lot of data, limit it to the amount
279 * left in file or SANE_CHUNK_SIZE when it is not known. */
281 if (read_size > SANE_CHUNK_SIZE/10) {
282 read_size = ffio_limit(s, read_size);
283 // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
285 read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
288 ret = av_grow_packet(pkt, read_size);
292 ret = avio_read(s, pkt->data + prev_size, read_size);
293 if (ret != read_size) {
294 av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
301 pkt->flags |= AV_PKT_FLAG_CORRUPT;
304 av_packet_unref(pkt);
305 return pkt->size > orig_size ? pkt->size - orig_size : ret;
308 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
313 pkt->pos = avio_tell(s);
315 return append_packet_chunked(s, pkt, size);
318 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
321 return av_get_packet(s, pkt, size);
322 return append_packet_chunked(s, pkt, size);
325 int av_filename_number_test(const char *filename)
329 (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0);
332 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
335 static const struct {
338 enum AVMediaType type;
340 { "aac", AV_CODEC_ID_AAC, AVMEDIA_TYPE_AUDIO },
341 { "ac3", AV_CODEC_ID_AC3, AVMEDIA_TYPE_AUDIO },
342 { "aptx", AV_CODEC_ID_APTX, AVMEDIA_TYPE_AUDIO },
343 { "dts", AV_CODEC_ID_DTS, AVMEDIA_TYPE_AUDIO },
344 { "dvbsub", AV_CODEC_ID_DVB_SUBTITLE,AVMEDIA_TYPE_SUBTITLE },
345 { "dvbtxt", AV_CODEC_ID_DVB_TELETEXT,AVMEDIA_TYPE_SUBTITLE },
346 { "eac3", AV_CODEC_ID_EAC3, AVMEDIA_TYPE_AUDIO },
347 { "h264", AV_CODEC_ID_H264, AVMEDIA_TYPE_VIDEO },
348 { "hevc", AV_CODEC_ID_HEVC, AVMEDIA_TYPE_VIDEO },
349 { "loas", AV_CODEC_ID_AAC_LATM, AVMEDIA_TYPE_AUDIO },
350 { "m4v", AV_CODEC_ID_MPEG4, AVMEDIA_TYPE_VIDEO },
351 { "mjpeg_2000",AV_CODEC_ID_JPEG2000, AVMEDIA_TYPE_VIDEO },
352 { "mp3", AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO },
353 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
354 { "truehd", AV_CODEC_ID_TRUEHD, AVMEDIA_TYPE_AUDIO },
358 const AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
362 av_log(s, AV_LOG_DEBUG,
363 "Probe with size=%d, packets=%d detected %s with score=%d\n",
364 pd->buf_size, s->max_probe_packets - st->probe_packets,
366 for (i = 0; fmt_id_type[i].name; i++) {
367 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
368 if (fmt_id_type[i].type != AVMEDIA_TYPE_AUDIO &&
369 st->codecpar->sample_rate)
371 if (st->request_probe > score &&
372 st->codecpar->codec_id != fmt_id_type[i].id)
374 st->codecpar->codec_id = fmt_id_type[i].id;
375 st->codecpar->codec_type = fmt_id_type[i].type;
376 st->internal->need_context_update = 1;
377 #if FF_API_LAVF_AVCTX
378 FF_DISABLE_DEPRECATION_WARNINGS
379 st->codec->codec_type = st->codecpar->codec_type;
380 st->codec->codec_id = st->codecpar->codec_id;
381 FF_ENABLE_DEPRECATION_WARNINGS
390 /************************************************************/
391 /* input media file */
393 int av_demuxer_open(AVFormatContext *ic) {
396 if (ic->format_whitelist && av_match_list(ic->iformat->name, ic->format_whitelist, ',') <= 0) {
397 av_log(ic, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", ic->format_whitelist);
398 return AVERROR(EINVAL);
401 if (ic->iformat->read_header) {
402 err = ic->iformat->read_header(ic);
407 if (ic->pb && !ic->internal->data_offset)
408 ic->internal->data_offset = avio_tell(ic->pb);
413 /* Open input file and probe the format if necessary. */
414 static int init_input(AVFormatContext *s, const char *filename,
415 AVDictionary **options)
418 AVProbeData pd = { filename, NULL, 0 };
419 int score = AVPROBE_SCORE_RETRY;
422 s->flags |= AVFMT_FLAG_CUSTOM_IO;
424 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
425 s, 0, s->format_probesize);
426 else if (s->iformat->flags & AVFMT_NOFILE)
427 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
428 "will be ignored with AVFMT_NOFILE format.\n");
432 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
433 (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
436 if ((ret = s->io_open(s, &s->pb, filename, AVIO_FLAG_READ | s->avio_flags, options)) < 0)
441 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
442 s, 0, s->format_probesize);
445 int ff_packet_list_put(AVPacketList **packet_buffer,
446 AVPacketList **plast_pktl,
447 AVPacket *pkt, int flags)
449 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
453 return AVERROR(ENOMEM);
455 if (flags & FF_PACKETLIST_FLAG_REF_PACKET) {
456 if ((ret = av_packet_ref(&pktl->pkt, pkt)) < 0) {
461 ret = av_packet_make_refcounted(pkt);
466 av_packet_move_ref(&pktl->pkt, pkt);
470 (*plast_pktl)->next = pktl;
472 *packet_buffer = pktl;
474 /* Add the packet in the buffered packet list. */
479 int avformat_queue_attached_pictures(AVFormatContext *s)
482 for (i = 0; i < s->nb_streams; i++)
483 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
484 s->streams[i]->discard < AVDISCARD_ALL) {
485 if (s->streams[i]->attached_pic.size <= 0) {
486 av_log(s, AV_LOG_WARNING,
487 "Attached picture on stream %d has invalid size, "
492 ret = ff_packet_list_put(&s->internal->raw_packet_buffer,
493 &s->internal->raw_packet_buffer_end,
494 &s->streams[i]->attached_pic,
495 FF_PACKETLIST_FLAG_REF_PACKET);
502 static int update_stream_avctx(AVFormatContext *s)
505 for (i = 0; i < s->nb_streams; i++) {
506 AVStream *st = s->streams[i];
508 if (!st->internal->need_context_update)
511 /* close parser, because it depends on the codec */
512 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
513 av_parser_close(st->parser);
517 /* update internal codec context, for the parser */
518 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
522 #if FF_API_LAVF_AVCTX
523 FF_DISABLE_DEPRECATION_WARNINGS
524 /* update deprecated public codec context */
525 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
528 FF_ENABLE_DEPRECATION_WARNINGS
531 st->internal->need_context_update = 0;
537 int avformat_open_input(AVFormatContext **ps, const char *filename,
538 ff_const59 AVInputFormat *fmt, AVDictionary **options)
540 AVFormatContext *s = *ps;
542 AVDictionary *tmp = NULL;
543 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
545 if (!s && !(s = avformat_alloc_context()))
546 return AVERROR(ENOMEM);
548 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
549 return AVERROR(EINVAL);
555 av_dict_copy(&tmp, *options, 0);
557 if (s->pb) // must be before any goto fail
558 s->flags |= AVFMT_FLAG_CUSTOM_IO;
560 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
563 if (!(s->url = av_strdup(filename ? filename : ""))) {
564 ret = AVERROR(ENOMEM);
568 #if FF_API_FORMAT_FILENAME
569 FF_DISABLE_DEPRECATION_WARNINGS
570 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
571 FF_ENABLE_DEPRECATION_WARNINGS
573 if ((ret = init_input(s, filename, &tmp)) < 0)
575 s->probe_score = ret;
577 if (!s->protocol_whitelist && s->pb && s->pb->protocol_whitelist) {
578 s->protocol_whitelist = av_strdup(s->pb->protocol_whitelist);
579 if (!s->protocol_whitelist) {
580 ret = AVERROR(ENOMEM);
585 if (!s->protocol_blacklist && s->pb && s->pb->protocol_blacklist) {
586 s->protocol_blacklist = av_strdup(s->pb->protocol_blacklist);
587 if (!s->protocol_blacklist) {
588 ret = AVERROR(ENOMEM);
593 if (s->format_whitelist && av_match_list(s->iformat->name, s->format_whitelist, ',') <= 0) {
594 av_log(s, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", s->format_whitelist);
595 ret = AVERROR(EINVAL);
599 avio_skip(s->pb, s->skip_initial_bytes);
601 /* Check filename in case an image number is expected. */
602 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
603 if (!av_filename_number_test(filename)) {
604 ret = AVERROR(EINVAL);
609 s->duration = s->start_time = AV_NOPTS_VALUE;
611 /* Allocate private data. */
612 if (s->iformat->priv_data_size > 0) {
613 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
614 ret = AVERROR(ENOMEM);
617 if (s->iformat->priv_class) {
618 *(const AVClass **) s->priv_data = s->iformat->priv_class;
619 av_opt_set_defaults(s->priv_data);
620 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
625 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
627 ff_id3v2_read_dict(s->pb, &s->internal->id3v2_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
630 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
631 if ((ret = s->iformat->read_header(s)) < 0)
635 s->metadata = s->internal->id3v2_meta;
636 s->internal->id3v2_meta = NULL;
637 } else if (s->internal->id3v2_meta) {
638 int level = AV_LOG_WARNING;
639 if (s->error_recognition & AV_EF_COMPLIANT)
640 level = AV_LOG_ERROR;
641 av_log(s, level, "Discarding ID3 tags because more suitable tags were found.\n");
642 av_dict_free(&s->internal->id3v2_meta);
643 if (s->error_recognition & AV_EF_EXPLODE)
644 return AVERROR_INVALIDDATA;
647 if (id3v2_extra_meta) {
648 if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
649 !strcmp(s->iformat->name, "tta") || !strcmp(s->iformat->name, "wav")) {
650 if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
652 if ((ret = ff_id3v2_parse_chapters(s, &id3v2_extra_meta)) < 0)
654 if ((ret = ff_id3v2_parse_priv(s, &id3v2_extra_meta)) < 0)
657 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
659 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
661 if ((ret = avformat_queue_attached_pictures(s)) < 0)
664 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
665 s->internal->data_offset = avio_tell(s->pb);
667 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
669 update_stream_avctx(s);
671 for (i = 0; i < s->nb_streams; i++)
672 s->streams[i]->internal->orig_codec_id = s->streams[i]->codecpar->codec_id;
675 av_dict_free(options);
682 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
684 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
686 avformat_free_context(s);
691 /*******************************************************/
693 static void force_codec_ids(AVFormatContext *s, AVStream *st)
695 switch (st->codecpar->codec_type) {
696 case AVMEDIA_TYPE_VIDEO:
697 if (s->video_codec_id)
698 st->codecpar->codec_id = s->video_codec_id;
700 case AVMEDIA_TYPE_AUDIO:
701 if (s->audio_codec_id)
702 st->codecpar->codec_id = s->audio_codec_id;
704 case AVMEDIA_TYPE_SUBTITLE:
705 if (s->subtitle_codec_id)
706 st->codecpar->codec_id = s->subtitle_codec_id;
708 case AVMEDIA_TYPE_DATA:
709 if (s->data_codec_id)
710 st->codecpar->codec_id = s->data_codec_id;
715 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
717 if (st->request_probe>0) {
718 AVProbeData *pd = &st->probe_data;
720 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
724 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
726 av_log(s, AV_LOG_WARNING,
727 "Failed to reallocate probe buffer for stream %d\n",
732 memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
733 pd->buf_size += pkt->size;
734 memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
737 st->probe_packets = 0;
739 av_log(s, AV_LOG_WARNING,
740 "nothing to probe for stream %d\n", st->index);
744 end= s->internal->raw_packet_buffer_remaining_size <= 0
745 || st->probe_packets<= 0;
747 if (end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
748 int score = set_codec_from_probe_data(s, st, pd);
749 if ( (st->codecpar->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
753 st->request_probe = -1;
754 if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
755 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
757 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
759 force_codec_ids(s, st);
765 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
767 int64_t ref = pkt->dts;
768 int i, pts_wrap_behavior;
769 int64_t pts_wrap_reference;
770 AVProgram *first_program;
772 if (ref == AV_NOPTS_VALUE)
774 if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
776 ref &= (1LL << st->pts_wrap_bits)-1;
778 // reference time stamp should be 60 s before first time stamp
779 pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
780 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
781 pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
782 (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
783 AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
785 first_program = av_find_program_from_stream(s, NULL, stream_index);
787 if (!first_program) {
788 int default_stream_index = av_find_default_stream_index(s);
789 if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
790 for (i = 0; i < s->nb_streams; i++) {
791 if (av_find_program_from_stream(s, NULL, i))
793 s->streams[i]->pts_wrap_reference = pts_wrap_reference;
794 s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
798 st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
799 st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
803 AVProgram *program = first_program;
805 if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
806 pts_wrap_reference = program->pts_wrap_reference;
807 pts_wrap_behavior = program->pts_wrap_behavior;
810 program = av_find_program_from_stream(s, program, stream_index);
813 // update every program with differing pts_wrap_reference
814 program = first_program;
816 if (program->pts_wrap_reference != pts_wrap_reference) {
817 for (i = 0; i<program->nb_stream_indexes; i++) {
818 s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
819 s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
822 program->pts_wrap_reference = pts_wrap_reference;
823 program->pts_wrap_behavior = pts_wrap_behavior;
825 program = av_find_program_from_stream(s, program, stream_index);
831 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
841 AVPacketList *pktl = s->internal->raw_packet_buffer;
842 const AVPacket *pkt1;
845 st = s->streams[pktl->pkt.stream_index];
846 if (s->internal->raw_packet_buffer_remaining_size <= 0)
847 if ((err = probe_codec(s, st, NULL)) < 0)
849 if (st->request_probe <= 0) {
850 ff_packet_list_get(&s->internal->raw_packet_buffer,
851 &s->internal->raw_packet_buffer_end, pkt);
852 s->internal->raw_packet_buffer_remaining_size += pkt->size;
857 ret = s->iformat->read_packet(s, pkt);
859 av_packet_unref(pkt);
861 /* Some demuxers return FFERROR_REDO when they consume
862 data and discard it (ignored streams, junk, extradata).
863 We must re-call the demuxer to get the real packet. */
864 if (ret == FFERROR_REDO)
866 if (!pktl || ret == AVERROR(EAGAIN))
868 for (i = 0; i < s->nb_streams; i++) {
870 if (st->probe_packets || st->request_probe > 0)
871 if ((err = probe_codec(s, st, NULL)) < 0)
873 av_assert0(st->request_probe <= 0);
878 err = av_packet_make_refcounted(pkt);
880 av_packet_unref(pkt);
884 if (pkt->flags & AV_PKT_FLAG_CORRUPT) {
885 av_log(s, AV_LOG_WARNING,
886 "Packet corrupt (stream = %d, dts = %s)",
887 pkt->stream_index, av_ts2str(pkt->dts));
888 if (s->flags & AVFMT_FLAG_DISCARD_CORRUPT) {
889 av_log(s, AV_LOG_WARNING, ", dropping it.\n");
890 av_packet_unref(pkt);
893 av_log(s, AV_LOG_WARNING, ".\n");
896 av_assert0(pkt->stream_index < (unsigned)s->nb_streams &&
897 "Invalid stream index.\n");
899 st = s->streams[pkt->stream_index];
901 if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
902 // correct first time stamps to negative values
903 if (!is_relative(st->first_dts))
904 st->first_dts = wrap_timestamp(st, st->first_dts);
905 if (!is_relative(st->start_time))
906 st->start_time = wrap_timestamp(st, st->start_time);
907 if (!is_relative(st->cur_dts))
908 st->cur_dts = wrap_timestamp(st, st->cur_dts);
911 pkt->dts = wrap_timestamp(st, pkt->dts);
912 pkt->pts = wrap_timestamp(st, pkt->pts);
914 force_codec_ids(s, st);
916 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
917 if (s->use_wallclock_as_timestamps)
918 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
920 if (!pktl && st->request_probe <= 0)
923 err = ff_packet_list_put(&s->internal->raw_packet_buffer,
924 &s->internal->raw_packet_buffer_end,
927 av_packet_unref(pkt);
930 pkt1 = &s->internal->raw_packet_buffer_end->pkt;
931 s->internal->raw_packet_buffer_remaining_size -= pkt1->size;
933 if ((err = probe_codec(s, st, pkt1)) < 0)
939 /**********************************************************/
941 static int determinable_frame_size(AVCodecContext *avctx)
943 switch(avctx->codec_id) {
944 case AV_CODEC_ID_MP1:
945 case AV_CODEC_ID_MP2:
946 case AV_CODEC_ID_MP3:
947 case AV_CODEC_ID_CODEC2:
955 * Return the frame duration in seconds. Return 0 if not available.
957 void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
958 AVCodecParserContext *pc, AVPacket *pkt)
960 AVRational codec_framerate = s->iformat ? st->internal->avctx->framerate :
961 av_mul_q(av_inv_q(st->internal->avctx->time_base), (AVRational){1, st->internal->avctx->ticks_per_frame});
962 int frame_size, sample_rate;
964 #if FF_API_LAVF_AVCTX
965 FF_DISABLE_DEPRECATION_WARNINGS
966 if ((!codec_framerate.den || !codec_framerate.num) && st->codec->time_base.den && st->codec->time_base.num)
967 codec_framerate = av_mul_q(av_inv_q(st->codec->time_base), (AVRational){1, st->codec->ticks_per_frame});
968 FF_ENABLE_DEPRECATION_WARNINGS
973 switch (st->codecpar->codec_type) {
974 case AVMEDIA_TYPE_VIDEO:
975 if (st->r_frame_rate.num && !pc && s->iformat) {
976 *pnum = st->r_frame_rate.den;
977 *pden = st->r_frame_rate.num;
978 } else if (st->time_base.num * 1000LL > st->time_base.den) {
979 *pnum = st->time_base.num;
980 *pden = st->time_base.den;
981 } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
982 av_assert0(st->internal->avctx->ticks_per_frame);
983 av_reduce(pnum, pden,
985 codec_framerate.num * (int64_t)st->internal->avctx->ticks_per_frame,
988 if (pc && pc->repeat_pict) {
989 av_assert0(s->iformat); // this may be wrong for interlaced encoding but its not used for that case
990 av_reduce(pnum, pden,
991 (*pnum) * (1LL + pc->repeat_pict),
995 /* If this codec can be interlaced or progressive then we need
996 * a parser to compute duration of a packet. Thus if we have
997 * no parser in such case leave duration undefined. */
998 if (st->internal->avctx->ticks_per_frame > 1 && !pc)
1002 case AVMEDIA_TYPE_AUDIO:
1003 if (st->internal->avctx_inited) {
1004 frame_size = av_get_audio_frame_duration(st->internal->avctx, pkt->size);
1005 sample_rate = st->internal->avctx->sample_rate;
1007 frame_size = av_get_audio_frame_duration2(st->codecpar, pkt->size);
1008 sample_rate = st->codecpar->sample_rate;
1010 if (frame_size <= 0 || sample_rate <= 0)
1013 *pden = sample_rate;
1020 static int is_intra_only(enum AVCodecID id)
1022 const AVCodecDescriptor *d = avcodec_descriptor_get(id);
1025 if ((d->type == AVMEDIA_TYPE_VIDEO || d->type == AVMEDIA_TYPE_AUDIO) &&
1026 !(d->props & AV_CODEC_PROP_INTRA_ONLY))
1031 static int has_decode_delay_been_guessed(AVStream *st)
1033 if (st->codecpar->codec_id != AV_CODEC_ID_H264) return 1;
1034 if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
1036 #if CONFIG_H264_DECODER
1037 if (st->internal->avctx->has_b_frames &&
1038 avpriv_h264_has_num_reorder_frames(st->internal->avctx) == st->internal->avctx->has_b_frames)
1041 if (st->internal->avctx->has_b_frames<3)
1042 return st->nb_decoded_frames >= 7;
1043 else if (st->internal->avctx->has_b_frames<4)
1044 return st->nb_decoded_frames >= 18;
1046 return st->nb_decoded_frames >= 20;
1049 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
1053 if (pktl == s->internal->packet_buffer_end)
1054 return s->internal->parse_queue;
1058 static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
1059 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1060 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1063 int delay = st->internal->avctx->has_b_frames;
1066 if (dts == AV_NOPTS_VALUE) {
1067 int64_t best_score = INT64_MAX;
1068 for (i = 0; i<delay; i++) {
1069 if (st->pts_reorder_error_count[i]) {
1070 int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
1071 if (score < best_score) {
1073 dts = pts_buffer[i];
1078 for (i = 0; i<delay; i++) {
1079 if (pts_buffer[i] != AV_NOPTS_VALUE) {
1080 int64_t diff = FFABS(pts_buffer[i] - dts)
1081 + (uint64_t)st->pts_reorder_error[i];
1082 diff = FFMAX(diff, st->pts_reorder_error[i]);
1083 st->pts_reorder_error[i] = diff;
1084 st->pts_reorder_error_count[i]++;
1085 if (st->pts_reorder_error_count[i] > 250) {
1086 st->pts_reorder_error[i] >>= 1;
1087 st->pts_reorder_error_count[i] >>= 1;
1094 if (dts == AV_NOPTS_VALUE)
1095 dts = pts_buffer[0];
1101 * Updates the dts of packets of a stream in pkt_buffer, by re-ordering the pts
1102 * of the packets in a window.
1104 static void update_dts_from_pts(AVFormatContext *s, int stream_index,
1105 AVPacketList *pkt_buffer)
1107 AVStream *st = s->streams[stream_index];
1108 int delay = st->internal->avctx->has_b_frames;
1111 int64_t pts_buffer[MAX_REORDER_DELAY+1];
1113 for (i = 0; i<MAX_REORDER_DELAY+1; i++)
1114 pts_buffer[i] = AV_NOPTS_VALUE;
1116 for (; pkt_buffer; pkt_buffer = get_next_pkt(s, st, pkt_buffer)) {
1117 if (pkt_buffer->pkt.stream_index != stream_index)
1120 if (pkt_buffer->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1121 pts_buffer[0] = pkt_buffer->pkt.pts;
1122 for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
1123 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
1125 pkt_buffer->pkt.dts = select_from_pts_buffer(st, pts_buffer, pkt_buffer->pkt.dts);
1130 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
1131 int64_t dts, int64_t pts, AVPacket *pkt)
1133 AVStream *st = s->streams[stream_index];
1134 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1135 AVPacketList *pktl_it;
1139 if (st->first_dts != AV_NOPTS_VALUE ||
1140 dts == AV_NOPTS_VALUE ||
1141 st->cur_dts == AV_NOPTS_VALUE ||
1142 st->cur_dts < INT_MIN + RELATIVE_TS_BASE ||
1146 st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
1148 shift = (uint64_t)st->first_dts - RELATIVE_TS_BASE;
1150 if (is_relative(pts))
1153 for (pktl_it = pktl; pktl_it; pktl_it = get_next_pkt(s, st, pktl_it)) {
1154 if (pktl_it->pkt.stream_index != stream_index)
1156 if (is_relative(pktl_it->pkt.pts))
1157 pktl_it->pkt.pts += shift;
1159 if (is_relative(pktl_it->pkt.dts))
1160 pktl_it->pkt.dts += shift;
1162 if (st->start_time == AV_NOPTS_VALUE && pktl_it->pkt.pts != AV_NOPTS_VALUE) {
1163 st->start_time = pktl_it->pkt.pts;
1164 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1165 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1169 if (has_decode_delay_been_guessed(st)) {
1170 update_dts_from_pts(s, stream_index, pktl);
1173 if (st->start_time == AV_NOPTS_VALUE) {
1174 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO || !(pkt->flags & AV_PKT_FLAG_DISCARD)) {
1175 st->start_time = pts;
1177 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1178 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1182 static void update_initial_durations(AVFormatContext *s, AVStream *st,
1183 int stream_index, int duration)
1185 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1186 int64_t cur_dts = RELATIVE_TS_BASE;
1188 if (st->first_dts != AV_NOPTS_VALUE) {
1189 if (st->update_initial_durations_done)
1191 st->update_initial_durations_done = 1;
1192 cur_dts = st->first_dts;
1193 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1194 if (pktl->pkt.stream_index == stream_index) {
1195 if (pktl->pkt.pts != pktl->pkt.dts ||
1196 pktl->pkt.dts != AV_NOPTS_VALUE ||
1199 cur_dts -= duration;
1202 if (pktl && pktl->pkt.dts != st->first_dts) {
1203 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %"PRId64") in the queue\n",
1204 av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
1208 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
1211 pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1212 st->first_dts = cur_dts;
1213 } else if (st->cur_dts != RELATIVE_TS_BASE)
1216 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1217 if (pktl->pkt.stream_index != stream_index)
1219 if ((pktl->pkt.pts == pktl->pkt.dts ||
1220 pktl->pkt.pts == AV_NOPTS_VALUE) &&
1221 (pktl->pkt.dts == AV_NOPTS_VALUE ||
1222 pktl->pkt.dts == st->first_dts ||
1223 pktl->pkt.dts == RELATIVE_TS_BASE) &&
1224 !pktl->pkt.duration) {
1225 pktl->pkt.dts = cur_dts;
1226 if (!st->internal->avctx->has_b_frames)
1227 pktl->pkt.pts = cur_dts;
1228 // if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
1229 pktl->pkt.duration = duration;
1232 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
1235 st->cur_dts = cur_dts;
1238 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1239 AVCodecParserContext *pc, AVPacket *pkt,
1240 int64_t next_dts, int64_t next_pts)
1242 int num, den, presentation_delayed, delay, i;
1244 AVRational duration;
1245 int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1246 st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1248 if (s->flags & AVFMT_FLAG_NOFILLIN)
1251 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
1252 if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
1253 if (st->last_dts_for_order_check <= pkt->dts) {
1256 av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
1257 "DTS %"PRIi64" < %"PRIi64" out of order\n",
1259 st->last_dts_for_order_check);
1260 st->dts_misordered++;
1262 if (st->dts_ordered + st->dts_misordered > 250) {
1263 st->dts_ordered >>= 1;
1264 st->dts_misordered >>= 1;
1268 st->last_dts_for_order_check = pkt->dts;
1269 if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
1270 pkt->dts = AV_NOPTS_VALUE;
1273 if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1274 pkt->dts = AV_NOPTS_VALUE;
1276 if (pc && pc->pict_type == AV_PICTURE_TYPE_B
1277 && !st->internal->avctx->has_b_frames)
1278 //FIXME Set low_delay = 0 when has_b_frames = 1
1279 st->internal->avctx->has_b_frames = 1;
1281 /* do we have a video B-frame ? */
1282 delay = st->internal->avctx->has_b_frames;
1283 presentation_delayed = 0;
1285 /* XXX: need has_b_frame, but cannot get it if the codec is
1286 * not initialized */
1288 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1289 presentation_delayed = 1;
1291 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
1292 st->pts_wrap_bits < 63 &&
1293 pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
1294 if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
1295 pkt->dts -= 1LL << st->pts_wrap_bits;
1297 pkt->pts += 1LL << st->pts_wrap_bits;
1300 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1301 * We take the conservative approach and discard both.
1302 * Note: If this is misbehaving for an H.264 file, then possibly
1303 * presentation_delayed is not set correctly. */
1304 if (delay == 1 && pkt->dts == pkt->pts &&
1305 pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
1306 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1307 if ( strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
1308 && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1309 pkt->dts = AV_NOPTS_VALUE;
1312 duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
1313 if (pkt->duration <= 0) {
1314 ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
1316 duration = (AVRational) {num, den};
1317 pkt->duration = av_rescale_rnd(1,
1318 num * (int64_t) st->time_base.den,
1319 den * (int64_t) st->time_base.num,
1324 if (pkt->duration > 0 && (s->internal->packet_buffer || s->internal->parse_queue))
1325 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1327 /* Correct timestamps with byte offset if demuxers only have timestamps
1328 * on packet boundaries */
1329 if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
1330 /* this will estimate bitrate based on this frame's duration and size */
1331 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1332 if (pkt->pts != AV_NOPTS_VALUE)
1334 if (pkt->dts != AV_NOPTS_VALUE)
1338 /* This may be redundant, but it should not hurt. */
1339 if (pkt->dts != AV_NOPTS_VALUE &&
1340 pkt->pts != AV_NOPTS_VALUE &&
1341 pkt->pts > pkt->dts)
1342 presentation_delayed = 1;
1344 if (s->debug & FF_FDEBUG_TS)
1345 av_log(s, AV_LOG_DEBUG,
1346 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%"PRId64" delay:%d onein_oneout:%d\n",
1347 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
1348 pkt->stream_index, pc, pkt->duration, delay, onein_oneout);
1350 /* Interpolate PTS and DTS if they are not present. We skip H264
1351 * currently because delay and has_b_frames are not reliably set. */
1352 if ((delay == 0 || (delay == 1 && pc)) &&
1354 if (presentation_delayed) {
1355 /* DTS = decompression timestamp */
1356 /* PTS = presentation timestamp */
1357 if (pkt->dts == AV_NOPTS_VALUE)
1358 pkt->dts = st->last_IP_pts;
1359 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1360 if (pkt->dts == AV_NOPTS_VALUE)
1361 pkt->dts = st->cur_dts;
1363 /* This is tricky: the dts must be incremented by the duration
1364 * of the frame we are displaying, i.e. the last I- or P-frame. */
1365 if (st->last_IP_duration == 0 && (uint64_t)pkt->duration <= INT32_MAX)
1366 st->last_IP_duration = pkt->duration;
1367 if (pkt->dts != AV_NOPTS_VALUE)
1368 st->cur_dts = pkt->dts + st->last_IP_duration;
1369 if (pkt->dts != AV_NOPTS_VALUE &&
1370 pkt->pts == AV_NOPTS_VALUE &&
1371 st->last_IP_duration > 0 &&
1372 ((uint64_t)st->cur_dts - (uint64_t)next_dts + 1) <= 2 &&
1373 next_dts != next_pts &&
1374 next_pts != AV_NOPTS_VALUE)
1375 pkt->pts = next_dts;
1377 if ((uint64_t)pkt->duration <= INT32_MAX)
1378 st->last_IP_duration = pkt->duration;
1379 st->last_IP_pts = pkt->pts;
1380 /* Cannot compute PTS if not present (we can compute it only
1381 * by knowing the future. */
1382 } else if (pkt->pts != AV_NOPTS_VALUE ||
1383 pkt->dts != AV_NOPTS_VALUE ||
1384 pkt->duration > 0 ) {
1386 /* presentation is not delayed : PTS and DTS are the same */
1387 if (pkt->pts == AV_NOPTS_VALUE)
1388 pkt->pts = pkt->dts;
1389 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1391 if (pkt->pts == AV_NOPTS_VALUE)
1392 pkt->pts = st->cur_dts;
1393 pkt->dts = pkt->pts;
1394 if (pkt->pts != AV_NOPTS_VALUE && duration.num >= 0)
1395 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
1399 if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1400 st->pts_buffer[0] = pkt->pts;
1401 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
1402 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
1404 if(has_decode_delay_been_guessed(st))
1405 pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
1407 // We skipped it above so we try here.
1409 // This should happen on the first packet
1410 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1411 if (pkt->dts > st->cur_dts)
1412 st->cur_dts = pkt->dts;
1414 if (s->debug & FF_FDEBUG_TS)
1415 av_log(s, AV_LOG_DEBUG, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s st:%d (%d)\n",
1416 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), st->index, st->id);
1419 if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA || is_intra_only(st->codecpar->codec_id))
1420 pkt->flags |= AV_PKT_FLAG_KEY;
1421 #if FF_API_CONVERGENCE_DURATION
1422 FF_DISABLE_DEPRECATION_WARNINGS
1424 pkt->convergence_duration = pc->convergence_duration;
1425 FF_ENABLE_DEPRECATION_WARNINGS
1429 void ff_packet_list_free(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1431 AVPacketList *tmp = *pkt_buf;
1434 AVPacketList *pktl = tmp;
1436 av_packet_unref(&pktl->pkt);
1440 *pkt_buf_end = NULL;
1444 * Parse a packet, add all split parts to parse_queue.
1446 * @param pkt Packet to parse; must not be NULL.
1447 * @param flush Indicates whether to flush. If set, pkt must be blank.
1449 static int parse_packet(AVFormatContext *s, AVPacket *pkt,
1450 int stream_index, int flush)
1453 AVStream *st = s->streams[stream_index];
1454 uint8_t *data = pkt->data;
1455 int size = pkt->size;
1456 int ret = 0, got_output = flush;
1458 if (size || flush) {
1459 av_init_packet(&out_pkt);
1460 } else if (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 || (flush && 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 */
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, i, got_packet = 0;
1582 AVDictionary *metadata = NULL;
1584 while (!got_packet && !s->internal->parse_queue) {
1587 /* read next packet */
1588 ret = ff_read_packet(s, pkt);
1590 if (ret == AVERROR(EAGAIN))
1592 /* flush the parsers */
1593 for (i = 0; i < s->nb_streams; i++) {
1595 if (st->parser && st->need_parsing)
1596 parse_packet(s, pkt, st->index, 1);
1598 /* all remaining packets are now in parse_queue =>
1599 * really terminate parsing */
1603 st = s->streams[pkt->stream_index];
1605 /* update context if required */
1606 if (st->internal->need_context_update) {
1607 if (avcodec_is_open(st->internal->avctx)) {
1608 av_log(s, AV_LOG_DEBUG, "Demuxer context update while decoder is open, closing and trying to re-open\n");
1609 avcodec_close(st->internal->avctx);
1610 st->info->found_decoder = 0;
1613 /* close parser, because it depends on the codec */
1614 if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
1615 av_parser_close(st->parser);
1619 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
1621 av_packet_unref(pkt);
1625 #if FF_API_LAVF_AVCTX
1626 FF_DISABLE_DEPRECATION_WARNINGS
1627 /* update deprecated public codec context */
1628 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
1630 av_packet_unref(pkt);
1633 FF_ENABLE_DEPRECATION_WARNINGS
1636 st->internal->need_context_update = 0;
1639 if (pkt->pts != AV_NOPTS_VALUE &&
1640 pkt->dts != AV_NOPTS_VALUE &&
1641 pkt->pts < pkt->dts) {
1642 av_log(s, AV_LOG_WARNING,
1643 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1645 av_ts2str(pkt->pts),
1646 av_ts2str(pkt->dts),
1649 if (s->debug & FF_FDEBUG_TS)
1650 av_log(s, AV_LOG_DEBUG,
1651 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"PRId64", flags=%d\n",
1653 av_ts2str(pkt->pts),
1654 av_ts2str(pkt->dts),
1655 pkt->size, pkt->duration, pkt->flags);
1657 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1658 st->parser = av_parser_init(st->codecpar->codec_id);
1660 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1661 "%s, packets or times may be invalid.\n",
1662 avcodec_get_name(st->codecpar->codec_id));
1663 /* no parser available: just output the raw packets */
1664 st->need_parsing = AVSTREAM_PARSE_NONE;
1665 } else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1666 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1667 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1668 st->parser->flags |= PARSER_FLAG_ONCE;
1669 else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1670 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1673 if (!st->need_parsing || !st->parser) {
1674 /* no parsing needed: we just output the packet as is */
1675 compute_pkt_fields(s, st, NULL, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1676 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1677 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1678 ff_reduce_index(s, st->index);
1679 av_add_index_entry(st, pkt->pos, pkt->dts,
1680 0, 0, AVINDEX_KEYFRAME);
1683 } else if (st->discard < AVDISCARD_ALL) {
1684 if ((ret = parse_packet(s, pkt, pkt->stream_index, 0)) < 0)
1686 st->codecpar->sample_rate = st->internal->avctx->sample_rate;
1687 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
1688 st->codecpar->channels = st->internal->avctx->channels;
1689 st->codecpar->channel_layout = st->internal->avctx->channel_layout;
1690 st->codecpar->codec_id = st->internal->avctx->codec_id;
1693 av_packet_unref(pkt);
1695 if (pkt->flags & AV_PKT_FLAG_KEY)
1696 st->skip_to_keyframe = 0;
1697 if (st->skip_to_keyframe) {
1698 av_packet_unref(pkt);
1703 if (!got_packet && s->internal->parse_queue)
1704 ret = ff_packet_list_get(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt);
1707 AVStream *st = s->streams[pkt->stream_index];
1708 int discard_padding = 0;
1709 if (st->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
1710 int64_t pts = pkt->pts - (is_relative(pkt->pts) ? RELATIVE_TS_BASE : 0);
1711 int64_t sample = ts_to_samples(st, pts);
1712 int duration = ts_to_samples(st, pkt->duration);
1713 int64_t end_sample = sample + duration;
1714 if (duration > 0 && end_sample >= st->first_discard_sample &&
1715 sample < st->last_discard_sample)
1716 discard_padding = FFMIN(end_sample - st->first_discard_sample, duration);
1718 if (st->start_skip_samples && (pkt->pts == 0 || pkt->pts == RELATIVE_TS_BASE))
1719 st->skip_samples = st->start_skip_samples;
1720 if (st->skip_samples || discard_padding) {
1721 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1723 AV_WL32(p, st->skip_samples);
1724 AV_WL32(p + 4, discard_padding);
1725 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d / discard %d\n", st->skip_samples, discard_padding);
1727 st->skip_samples = 0;
1730 if (st->inject_global_side_data) {
1731 for (i = 0; i < st->nb_side_data; i++) {
1732 AVPacketSideData *src_sd = &st->side_data[i];
1735 if (av_packet_get_side_data(pkt, src_sd->type, NULL))
1738 dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
1740 av_log(s, AV_LOG_WARNING, "Could not inject global side data\n");
1744 memcpy(dst_data, src_sd->data, src_sd->size);
1746 st->inject_global_side_data = 0;
1750 av_opt_get_dict_val(s, "metadata", AV_OPT_SEARCH_CHILDREN, &metadata);
1752 s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
1753 av_dict_copy(&s->metadata, metadata, 0);
1754 av_dict_free(&metadata);
1755 av_opt_set_dict_val(s, "metadata", NULL, AV_OPT_SEARCH_CHILDREN);
1758 #if FF_API_LAVF_AVCTX
1759 update_stream_avctx(s);
1762 if (s->debug & FF_FDEBUG_TS)
1763 av_log(s, AV_LOG_DEBUG,
1764 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1765 "size=%d, duration=%"PRId64", flags=%d\n",
1767 av_ts2str(pkt->pts),
1768 av_ts2str(pkt->dts),
1769 pkt->size, pkt->duration, pkt->flags);
1771 /* A demuxer might have returned EOF because of an IO error, let's
1772 * propagate this back to the user. */
1773 if (ret == AVERROR_EOF && s->pb && s->pb->error < 0 && s->pb->error != AVERROR(EAGAIN))
1779 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1781 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1787 ret = s->internal->packet_buffer
1788 ? ff_packet_list_get(&s->internal->packet_buffer,
1789 &s->internal->packet_buffer_end, pkt)
1790 : read_frame_internal(s, pkt);
1797 AVPacketList *pktl = s->internal->packet_buffer;
1800 AVPacket *next_pkt = &pktl->pkt;
1802 if (next_pkt->dts != AV_NOPTS_VALUE) {
1803 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1804 // last dts seen for this stream. if any of packets following
1805 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1806 int64_t last_dts = next_pkt->dts;
1807 av_assert2(wrap_bits <= 64);
1808 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1809 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1810 av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2ULL << (wrap_bits - 1)) < 0) {
1811 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2ULL << (wrap_bits - 1))) {
1813 next_pkt->pts = pktl->pkt.dts;
1815 if (last_dts != AV_NOPTS_VALUE) {
1816 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1817 last_dts = pktl->pkt.dts;
1822 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1823 // Fixing the last reference frame had none pts issue (For MXF etc).
1824 // We only do this when
1826 // 2. we are not able to resolve a pts value for current packet.
1827 // 3. the packets for this stream at the end of the files had valid dts.
1828 next_pkt->pts = last_dts + next_pkt->duration;
1830 pktl = s->internal->packet_buffer;
1833 /* read packet from packet buffer, if there is data */
1834 st = s->streams[next_pkt->stream_index];
1835 if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
1836 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1837 ret = ff_packet_list_get(&s->internal->packet_buffer,
1838 &s->internal->packet_buffer_end, pkt);
1843 ret = read_frame_internal(s, pkt);
1845 if (pktl && ret != AVERROR(EAGAIN)) {
1852 ret = ff_packet_list_put(&s->internal->packet_buffer,
1853 &s->internal->packet_buffer_end,
1856 av_packet_unref(pkt);
1863 st = s->streams[pkt->stream_index];
1864 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1865 ff_reduce_index(s, st->index);
1866 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1869 if (is_relative(pkt->dts))
1870 pkt->dts -= RELATIVE_TS_BASE;
1871 if (is_relative(pkt->pts))
1872 pkt->pts -= RELATIVE_TS_BASE;
1877 /* XXX: suppress the packet queue */
1878 static void flush_packet_queue(AVFormatContext *s)
1882 ff_packet_list_free(&s->internal->parse_queue, &s->internal->parse_queue_end);
1883 ff_packet_list_free(&s->internal->packet_buffer, &s->internal->packet_buffer_end);
1884 ff_packet_list_free(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
1886 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1889 /*******************************************************/
1892 int av_find_default_stream_index(AVFormatContext *s)
1896 int best_stream = 0;
1897 int best_score = INT_MIN;
1899 if (s->nb_streams <= 0)
1901 for (i = 0; i < s->nb_streams; i++) {
1904 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1905 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
1907 if (st->codecpar->width && st->codecpar->height)
1911 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1912 if (st->codecpar->sample_rate)
1915 if (st->codec_info_nb_frames)
1918 if (st->discard != AVDISCARD_ALL)
1921 if (score > best_score) {
1929 /** Flush the frame reader. */
1930 void ff_read_frame_flush(AVFormatContext *s)
1935 flush_packet_queue(s);
1937 /* Reset read state for each stream. */
1938 for (i = 0; i < s->nb_streams; i++) {
1942 av_parser_close(st->parser);
1945 st->last_IP_pts = AV_NOPTS_VALUE;
1946 st->last_dts_for_order_check = AV_NOPTS_VALUE;
1947 if (st->first_dts == AV_NOPTS_VALUE)
1948 st->cur_dts = RELATIVE_TS_BASE;
1950 /* We set the current DTS to an unspecified origin. */
1951 st->cur_dts = AV_NOPTS_VALUE;
1953 st->probe_packets = s->max_probe_packets;
1955 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1956 st->pts_buffer[j] = AV_NOPTS_VALUE;
1958 if (s->internal->inject_global_side_data)
1959 st->inject_global_side_data = 1;
1961 st->skip_samples = 0;
1965 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1969 for (i = 0; i < s->nb_streams; i++) {
1970 AVStream *st = s->streams[i];
1973 av_rescale(timestamp,
1974 st->time_base.den * (int64_t) ref_st->time_base.num,
1975 st->time_base.num * (int64_t) ref_st->time_base.den);
1979 void ff_reduce_index(AVFormatContext *s, int stream_index)
1981 AVStream *st = s->streams[stream_index];
1982 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1984 if ((unsigned) st->nb_index_entries >= max_entries) {
1986 for (i = 0; 2 * i < st->nb_index_entries; i++)
1987 st->index_entries[i] = st->index_entries[2 * i];
1988 st->nb_index_entries = i;
1992 int ff_add_index_entry(AVIndexEntry **index_entries,
1993 int *nb_index_entries,
1994 unsigned int *index_entries_allocated_size,
1995 int64_t pos, int64_t timestamp,
1996 int size, int distance, int flags)
1998 AVIndexEntry *entries, *ie;
2001 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
2004 if (timestamp == AV_NOPTS_VALUE)
2005 return AVERROR(EINVAL);
2007 if (size < 0 || size > 0x3FFFFFFF)
2008 return AVERROR(EINVAL);
2010 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
2011 timestamp -= RELATIVE_TS_BASE;
2013 entries = av_fast_realloc(*index_entries,
2014 index_entries_allocated_size,
2015 (*nb_index_entries + 1) *
2016 sizeof(AVIndexEntry));
2020 *index_entries = entries;
2022 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
2023 timestamp, AVSEEK_FLAG_ANY);
2026 index = (*nb_index_entries)++;
2027 ie = &entries[index];
2028 av_assert0(index == 0 || ie[-1].timestamp < timestamp);
2030 ie = &entries[index];
2031 if (ie->timestamp != timestamp) {
2032 if (ie->timestamp <= timestamp)
2034 memmove(entries + index + 1, entries + index,
2035 sizeof(AVIndexEntry) * (*nb_index_entries - index));
2036 (*nb_index_entries)++;
2037 } else if (ie->pos == pos && distance < ie->min_distance)
2038 // do not reduce the distance
2039 distance = ie->min_distance;
2043 ie->timestamp = timestamp;
2044 ie->min_distance = distance;
2051 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
2052 int size, int distance, int flags)
2054 timestamp = wrap_timestamp(st, timestamp);
2055 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
2056 &st->index_entries_allocated_size, pos,
2057 timestamp, size, distance, flags);
2060 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
2061 int64_t wanted_timestamp, int flags)
2069 // Optimize appending index entries at the end.
2070 if (b && entries[b - 1].timestamp < wanted_timestamp)
2076 // Search for the next non-discarded packet.
2077 while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b && m < nb_entries - 1) {
2079 if (m == b && entries[m].timestamp >= wanted_timestamp) {
2085 timestamp = entries[m].timestamp;
2086 if (timestamp >= wanted_timestamp)
2088 if (timestamp <= wanted_timestamp)
2091 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
2093 if (!(flags & AVSEEK_FLAG_ANY))
2094 while (m >= 0 && m < nb_entries &&
2095 !(entries[m].flags & AVINDEX_KEYFRAME))
2096 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
2098 if (m == nb_entries)
2103 void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
2106 int64_t pos_delta = 0;
2108 //We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
2109 const char *proto = avio_find_protocol_name(s->url);
2111 av_assert0(time_tolerance >= 0);
2114 av_log(s, AV_LOG_INFO,
2115 "Protocol name not provided, cannot determine if input is local or "
2116 "a network protocol, buffers and access patterns cannot be configured "
2117 "optimally without knowing the protocol\n");
2120 if (proto && !(strcmp(proto, "file") && strcmp(proto, "pipe") && strcmp(proto, "cache")))
2123 for (ist1 = 0; ist1 < s->nb_streams; ist1++) {
2124 AVStream *st1 = s->streams[ist1];
2125 for (ist2 = 0; ist2 < s->nb_streams; ist2++) {
2126 AVStream *st2 = s->streams[ist2];
2132 for (i1 = i2 = 0; i1 < st1->nb_index_entries; i1++) {
2133 AVIndexEntry *e1 = &st1->index_entries[i1];
2134 int64_t e1_pts = av_rescale_q(e1->timestamp, st1->time_base, AV_TIME_BASE_Q);
2136 skip = FFMAX(skip, e1->size);
2137 for (; i2 < st2->nb_index_entries; i2++) {
2138 AVIndexEntry *e2 = &st2->index_entries[i2];
2139 int64_t e2_pts = av_rescale_q(e2->timestamp, st2->time_base, AV_TIME_BASE_Q);
2140 if (e2_pts < e1_pts || e2_pts - (uint64_t)e1_pts < time_tolerance)
2142 pos_delta = FFMAX(pos_delta, e1->pos - e2->pos);
2150 /* XXX This could be adjusted depending on protocol*/
2151 if (s->pb->buffer_size < pos_delta && pos_delta < (1<<24)) {
2152 av_log(s, AV_LOG_VERBOSE, "Reconfiguring buffers to size %"PRId64"\n", pos_delta);
2154 /* realloc the buffer and the original data will be retained */
2155 if (ffio_realloc_buf(s->pb, pos_delta)) {
2156 av_log(s, AV_LOG_ERROR, "Realloc buffer fail.\n");
2160 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, pos_delta/2);
2163 if (skip < (1<<23)) {
2164 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, skip);
2168 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
2170 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
2171 wanted_timestamp, flags);
2174 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
2175 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2177 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
2178 if (stream_index >= 0)
2179 ts = wrap_timestamp(s->streams[stream_index], ts);
2183 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
2184 int64_t target_ts, int flags)
2186 const AVInputFormat *avif = s->iformat;
2187 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
2188 int64_t ts_min, ts_max, ts;
2193 if (stream_index < 0)
2196 av_log(s, AV_LOG_TRACE, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2199 ts_min = AV_NOPTS_VALUE;
2200 pos_limit = -1; // GCC falsely says it may be uninitialized.
2202 st = s->streams[stream_index];
2203 if (st->index_entries) {
2206 /* FIXME: Whole function must be checked for non-keyframe entries in
2207 * index case, especially read_timestamp(). */
2208 index = av_index_search_timestamp(st, target_ts,
2209 flags | AVSEEK_FLAG_BACKWARD);
2210 index = FFMAX(index, 0);
2211 e = &st->index_entries[index];
2213 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
2215 ts_min = e->timestamp;
2216 av_log(s, AV_LOG_TRACE, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
2217 pos_min, av_ts2str(ts_min));
2219 av_assert1(index == 0);
2222 index = av_index_search_timestamp(st, target_ts,
2223 flags & ~AVSEEK_FLAG_BACKWARD);
2224 av_assert0(index < st->nb_index_entries);
2226 e = &st->index_entries[index];
2227 av_assert1(e->timestamp >= target_ts);
2229 ts_max = e->timestamp;
2230 pos_limit = pos_max - e->min_distance;
2231 av_log(s, AV_LOG_TRACE, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
2232 " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
2236 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
2237 ts_min, ts_max, flags, &ts, avif->read_timestamp);
2242 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
2245 ff_read_frame_flush(s);
2246 ff_update_cur_dts(s, st, ts);
2251 int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
2252 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2254 int64_t step = 1024;
2255 int64_t limit, ts_max;
2256 int64_t filesize = avio_size(s->pb);
2257 int64_t pos_max = filesize - 1;
2260 pos_max = FFMAX(0, (pos_max) - step);
2261 ts_max = ff_read_timestamp(s, stream_index,
2262 &pos_max, limit, read_timestamp);
2264 } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
2265 if (ts_max == AV_NOPTS_VALUE)
2269 int64_t tmp_pos = pos_max + 1;
2270 int64_t tmp_ts = ff_read_timestamp(s, stream_index,
2271 &tmp_pos, INT64_MAX, read_timestamp);
2272 if (tmp_ts == AV_NOPTS_VALUE)
2274 av_assert0(tmp_pos > pos_max);
2277 if (tmp_pos >= filesize)
2289 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
2290 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
2291 int64_t ts_min, int64_t ts_max,
2292 int flags, int64_t *ts_ret,
2293 int64_t (*read_timestamp)(struct AVFormatContext *, int,
2294 int64_t *, int64_t))
2301 av_log(s, AV_LOG_TRACE, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2303 if (ts_min == AV_NOPTS_VALUE) {
2304 pos_min = s->internal->data_offset;
2305 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2306 if (ts_min == AV_NOPTS_VALUE)
2310 if (ts_min >= target_ts) {
2315 if (ts_max == AV_NOPTS_VALUE) {
2316 if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
2318 pos_limit = pos_max;
2321 if (ts_max <= target_ts) {
2326 av_assert0(ts_min < ts_max);
2329 while (pos_min < pos_limit) {
2330 av_log(s, AV_LOG_TRACE,
2331 "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
2332 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
2333 av_assert0(pos_limit <= pos_max);
2335 if (no_change == 0) {
2336 int64_t approximate_keyframe_distance = pos_max - pos_limit;
2337 // interpolate position (better than dichotomy)
2338 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
2340 pos_min - approximate_keyframe_distance;
2341 } else if (no_change == 1) {
2342 // bisection if interpolation did not change min / max pos last time
2343 pos = (pos_min + pos_limit) >> 1;
2345 /* linear search if bisection failed, can only happen if there
2346 * are very few or no keyframes between min/max */
2351 else if (pos > pos_limit)
2355 // May pass pos_limit instead of -1.
2356 ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
2361 av_log(s, AV_LOG_TRACE, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
2362 " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
2363 pos_min, pos, pos_max,
2364 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
2365 pos_limit, start_pos, no_change);
2366 if (ts == AV_NOPTS_VALUE) {
2367 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
2370 if (target_ts <= ts) {
2371 pos_limit = start_pos - 1;
2375 if (target_ts >= ts) {
2381 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
2382 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
2385 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2387 ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2388 av_log(s, AV_LOG_TRACE, "pos=0x%"PRIx64" %s<=%s<=%s\n",
2389 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
2395 static int seek_frame_byte(AVFormatContext *s, int stream_index,
2396 int64_t pos, int flags)
2398 int64_t pos_min, pos_max;
2400 pos_min = s->internal->data_offset;
2401 pos_max = avio_size(s->pb) - 1;
2405 else if (pos > pos_max)
2408 avio_seek(s->pb, pos, SEEK_SET);
2410 s->io_repositioned = 1;
2415 static int seek_frame_generic(AVFormatContext *s, int stream_index,
2416 int64_t timestamp, int flags)
2423 st = s->streams[stream_index];
2425 index = av_index_search_timestamp(st, timestamp, flags);
2427 if (index < 0 && st->nb_index_entries &&
2428 timestamp < st->index_entries[0].timestamp)
2431 if (index < 0 || index == st->nb_index_entries - 1) {
2435 if (st->nb_index_entries) {
2436 av_assert0(st->index_entries);
2437 ie = &st->index_entries[st->nb_index_entries - 1];
2438 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2440 ff_update_cur_dts(s, st, ie->timestamp);
2442 if ((ret = avio_seek(s->pb, s->internal->data_offset, SEEK_SET)) < 0)
2448 read_status = av_read_frame(s, &pkt);
2449 } while (read_status == AVERROR(EAGAIN));
2450 if (read_status < 0)
2452 if (stream_index == pkt.stream_index && pkt.dts > timestamp) {
2453 if (pkt.flags & AV_PKT_FLAG_KEY) {
2454 av_packet_unref(&pkt);
2457 if (nonkey++ > 1000 && st->codecpar->codec_id != AV_CODEC_ID_CDGRAPHICS) {
2458 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);
2459 av_packet_unref(&pkt);
2463 av_packet_unref(&pkt);
2465 index = av_index_search_timestamp(st, timestamp, flags);
2470 ff_read_frame_flush(s);
2471 if (s->iformat->read_seek)
2472 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2474 ie = &st->index_entries[index];
2475 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2477 ff_update_cur_dts(s, st, ie->timestamp);
2482 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2483 int64_t timestamp, int flags)
2488 if (flags & AVSEEK_FLAG_BYTE) {
2489 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2491 ff_read_frame_flush(s);
2492 return seek_frame_byte(s, stream_index, timestamp, flags);
2495 if (stream_index < 0) {
2496 stream_index = av_find_default_stream_index(s);
2497 if (stream_index < 0)
2500 st = s->streams[stream_index];
2501 /* timestamp for default must be expressed in AV_TIME_BASE units */
2502 timestamp = av_rescale(timestamp, st->time_base.den,
2503 AV_TIME_BASE * (int64_t) st->time_base.num);
2506 /* first, we try the format specific seek */
2507 if (s->iformat->read_seek) {
2508 ff_read_frame_flush(s);
2509 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2515 if (s->iformat->read_timestamp &&
2516 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2517 ff_read_frame_flush(s);
2518 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2519 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2520 ff_read_frame_flush(s);
2521 return seek_frame_generic(s, stream_index, timestamp, flags);
2526 int av_seek_frame(AVFormatContext *s, int stream_index,
2527 int64_t timestamp, int flags)
2531 if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2532 int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2533 if ((flags & AVSEEK_FLAG_BACKWARD))
2537 return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2538 flags & ~AVSEEK_FLAG_BACKWARD);
2541 ret = seek_frame_internal(s, stream_index, timestamp, flags);
2544 ret = avformat_queue_attached_pictures(s);
2549 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
2550 int64_t ts, int64_t max_ts, int flags)
2552 if (min_ts > ts || max_ts < ts)
2554 if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2555 return AVERROR(EINVAL);
2558 flags |= AVSEEK_FLAG_ANY;
2559 flags &= ~AVSEEK_FLAG_BACKWARD;
2561 if (s->iformat->read_seek2) {
2563 ff_read_frame_flush(s);
2565 if (stream_index == -1 && s->nb_streams == 1) {
2566 AVRational time_base = s->streams[0]->time_base;
2567 ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2568 min_ts = av_rescale_rnd(min_ts, time_base.den,
2569 time_base.num * (int64_t)AV_TIME_BASE,
2570 AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
2571 max_ts = av_rescale_rnd(max_ts, time_base.den,
2572 time_base.num * (int64_t)AV_TIME_BASE,
2573 AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
2577 ret = s->iformat->read_seek2(s, stream_index, min_ts,
2581 ret = avformat_queue_attached_pictures(s);
2585 if (s->iformat->read_timestamp) {
2586 // try to seek via read_timestamp()
2589 // Fall back on old API if new is not implemented but old is.
2590 // Note the old API has somewhat different semantics.
2591 if (s->iformat->read_seek || 1) {
2592 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2593 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2594 if (ret<0 && ts != min_ts && max_ts != ts) {
2595 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2597 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2602 // try some generic seek like seek_frame_generic() but with new ts semantics
2603 return -1; //unreachable
2606 int avformat_flush(AVFormatContext *s)
2608 ff_read_frame_flush(s);
2612 /*******************************************************/
2615 * Return TRUE if the stream has accurate duration in any stream.
2617 * @return TRUE if the stream has accurate duration for at least one component.
2619 static int has_duration(AVFormatContext *ic)
2624 for (i = 0; i < ic->nb_streams; i++) {
2625 st = ic->streams[i];
2626 if (st->duration != AV_NOPTS_VALUE)
2629 if (ic->duration != AV_NOPTS_VALUE)
2635 * Estimate the stream timings from the one of each components.
2637 * Also computes the global bitrate if possible.
2639 static void update_stream_timings(AVFormatContext *ic)
2641 int64_t start_time, start_time1, start_time_text, end_time, end_time1, end_time_text;
2642 int64_t duration, duration1, duration_text, filesize;
2646 start_time = INT64_MAX;
2647 start_time_text = INT64_MAX;
2648 end_time = INT64_MIN;
2649 end_time_text = INT64_MIN;
2650 duration = INT64_MIN;
2651 duration_text = INT64_MIN;
2653 for (i = 0; i < ic->nb_streams; i++) {
2654 AVStream *st = ic->streams[i];
2655 int is_text = st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE ||
2656 st->codecpar->codec_type == AVMEDIA_TYPE_DATA;
2657 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2658 start_time1 = av_rescale_q(st->start_time, st->time_base,
2661 start_time_text = FFMIN(start_time_text, start_time1);
2663 start_time = FFMIN(start_time, start_time1);
2664 end_time1 = av_rescale_q_rnd(st->duration, st->time_base,
2666 AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
2667 if (end_time1 != AV_NOPTS_VALUE && (end_time1 > 0 ? start_time1 <= INT64_MAX - end_time1 : start_time1 >= INT64_MIN - end_time1)) {
2668 end_time1 += start_time1;
2670 end_time_text = FFMAX(end_time_text, end_time1);
2672 end_time = FFMAX(end_time, end_time1);
2674 for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
2675 if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2676 p->start_time = start_time1;
2677 if (p->end_time < end_time1)
2678 p->end_time = end_time1;
2681 if (st->duration != AV_NOPTS_VALUE) {
2682 duration1 = av_rescale_q(st->duration, st->time_base,
2685 duration_text = FFMAX(duration_text, duration1);
2687 duration = FFMAX(duration, duration1);
2690 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - (uint64_t)start_time_text < AV_TIME_BASE))
2691 start_time = start_time_text;
2692 else if (start_time > start_time_text)
2693 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2695 if (end_time == INT64_MIN || (end_time < end_time_text && end_time_text - (uint64_t)end_time < AV_TIME_BASE))
2696 end_time = end_time_text;
2697 else if (end_time < end_time_text)
2698 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream endtime %f\n", end_time_text / (float)AV_TIME_BASE);
2700 if (duration == INT64_MIN || (duration < duration_text && duration_text - duration < AV_TIME_BASE))
2701 duration = duration_text;
2702 else if (duration < duration_text)
2703 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream duration %f\n", duration_text / (float)AV_TIME_BASE);
2705 if (start_time != INT64_MAX) {
2706 ic->start_time = start_time;
2707 if (end_time != INT64_MIN) {
2708 if (ic->nb_programs > 1) {
2709 for (i = 0; i < ic->nb_programs; i++) {
2710 p = ic->programs[i];
2711 if (p->start_time != AV_NOPTS_VALUE &&
2712 p->end_time > p->start_time &&
2713 p->end_time - (uint64_t)p->start_time <= INT64_MAX)
2714 duration = FFMAX(duration, p->end_time - p->start_time);
2716 } else if (end_time >= start_time && end_time - (uint64_t)start_time <= INT64_MAX) {
2717 duration = FFMAX(duration, end_time - start_time);
2721 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2722 ic->duration = duration;
2724 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration > 0) {
2725 /* compute the bitrate */
2726 double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2727 (double) ic->duration;
2728 if (bitrate >= 0 && bitrate <= INT64_MAX)
2729 ic->bit_rate = bitrate;
2733 static void fill_all_stream_timings(AVFormatContext *ic)
2738 update_stream_timings(ic);
2739 for (i = 0; i < ic->nb_streams; i++) {
2740 st = ic->streams[i];
2741 if (st->start_time == AV_NOPTS_VALUE) {
2742 if (ic->start_time != AV_NOPTS_VALUE)
2743 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
2745 if (ic->duration != AV_NOPTS_VALUE)
2746 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
2752 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2754 int64_t filesize, duration;
2755 int i, show_warning = 0;
2758 /* if bit_rate is already set, we believe it */
2759 if (ic->bit_rate <= 0) {
2760 int64_t bit_rate = 0;
2761 for (i = 0; i < ic->nb_streams; i++) {
2762 st = ic->streams[i];
2763 if (st->codecpar->bit_rate <= 0 && st->internal->avctx->bit_rate > 0)
2764 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
2765 if (st->codecpar->bit_rate > 0) {
2766 if (INT64_MAX - st->codecpar->bit_rate < bit_rate) {
2770 bit_rate += st->codecpar->bit_rate;
2771 } else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && st->codec_info_nb_frames > 1) {
2772 // If we have a videostream with packets but without a bitrate
2773 // then consider the sum not known
2778 ic->bit_rate = bit_rate;
2781 /* if duration is already set, we believe it */
2782 if (ic->duration == AV_NOPTS_VALUE &&
2783 ic->bit_rate != 0) {
2784 filesize = ic->pb ? avio_size(ic->pb) : 0;
2785 if (filesize > ic->internal->data_offset) {
2786 filesize -= ic->internal->data_offset;
2787 for (i = 0; i < ic->nb_streams; i++) {
2788 st = ic->streams[i];
2789 if ( st->time_base.num <= INT64_MAX / ic->bit_rate
2790 && st->duration == AV_NOPTS_VALUE) {
2791 duration = av_rescale(8 * filesize, st->time_base.den,
2793 (int64_t) st->time_base.num);
2794 st->duration = duration;
2801 av_log(ic, AV_LOG_WARNING,
2802 "Estimating duration from bitrate, this may be inaccurate\n");
2805 #define DURATION_MAX_READ_SIZE 250000LL
2806 #define DURATION_MAX_RETRY 6
2808 /* only usable for MPEG-PS streams */
2809 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2811 AVPacket pkt1, *pkt = &pkt1;
2813 int num, den, read_size, i, ret;
2814 int found_duration = 0;
2816 int64_t filesize, offset, duration;
2819 /* flush packet queue */
2820 flush_packet_queue(ic);
2822 for (i = 0; i < ic->nb_streams; i++) {
2823 st = ic->streams[i];
2824 if (st->start_time == AV_NOPTS_VALUE &&
2825 st->first_dts == AV_NOPTS_VALUE &&
2826 st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN)
2827 av_log(ic, AV_LOG_WARNING,
2828 "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2831 av_parser_close(st->parser);
2836 if (ic->skip_estimate_duration_from_pts) {
2837 av_log(ic, AV_LOG_INFO, "Skipping duration calculation in estimate_timings_from_pts\n");
2838 goto skip_duration_calc;
2841 av_opt_set(ic, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN);
2842 /* estimate the end time (duration) */
2843 /* XXX: may need to support wrapping */
2844 filesize = ic->pb ? avio_size(ic->pb) : 0;
2846 is_end = found_duration;
2847 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
2851 avio_seek(ic->pb, offset, SEEK_SET);
2854 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
2858 ret = ff_read_packet(ic, pkt);
2859 } while (ret == AVERROR(EAGAIN));
2862 read_size += pkt->size;
2863 st = ic->streams[pkt->stream_index];
2864 if (pkt->pts != AV_NOPTS_VALUE &&
2865 (st->start_time != AV_NOPTS_VALUE ||
2866 st->first_dts != AV_NOPTS_VALUE)) {
2867 if (pkt->duration == 0) {
2868 ff_compute_frame_duration(ic, &num, &den, st, st->parser, pkt);
2870 pkt->duration = av_rescale_rnd(1,
2871 num * (int64_t) st->time_base.den,
2872 den * (int64_t) st->time_base.num,
2876 duration = pkt->pts + pkt->duration;
2878 if (st->start_time != AV_NOPTS_VALUE)
2879 duration -= st->start_time;
2881 duration -= st->first_dts;
2883 if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
2884 (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2885 st->duration = duration;
2886 st->info->last_duration = duration;
2889 av_packet_unref(pkt);
2892 /* check if all audio/video streams have valid duration */
2895 for (i = 0; i < ic->nb_streams; i++) {
2896 st = ic->streams[i];
2897 switch (st->codecpar->codec_type) {
2898 case AVMEDIA_TYPE_VIDEO:
2899 case AVMEDIA_TYPE_AUDIO:
2900 if (st->duration == AV_NOPTS_VALUE)
2907 ++retry <= DURATION_MAX_RETRY);
2909 av_opt_set(ic, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN);
2911 /* warn about audio/video streams which duration could not be estimated */
2912 for (i = 0; i < ic->nb_streams; i++) {
2913 st = ic->streams[i];
2914 if (st->duration == AV_NOPTS_VALUE) {
2915 switch (st->codecpar->codec_type) {
2916 case AVMEDIA_TYPE_VIDEO:
2917 case AVMEDIA_TYPE_AUDIO:
2918 if (st->start_time != AV_NOPTS_VALUE || st->first_dts != AV_NOPTS_VALUE) {
2919 av_log(ic, AV_LOG_WARNING, "stream %d : no PTS found at end of file, duration not set\n", i);
2921 av_log(ic, AV_LOG_WARNING, "stream %d : no TS found at start of file, duration not set\n", i);
2926 fill_all_stream_timings(ic);
2928 avio_seek(ic->pb, old_offset, SEEK_SET);
2929 for (i = 0; i < ic->nb_streams; i++) {
2932 st = ic->streams[i];
2933 st->cur_dts = st->first_dts;
2934 st->last_IP_pts = AV_NOPTS_VALUE;
2935 st->last_dts_for_order_check = AV_NOPTS_VALUE;
2936 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
2937 st->pts_buffer[j] = AV_NOPTS_VALUE;
2941 /* 1:1 map to AVDurationEstimationMethod */
2942 static const char *duration_name[] = {
2943 [AVFMT_DURATION_FROM_PTS] = "pts",
2944 [AVFMT_DURATION_FROM_STREAM] = "stream",
2945 [AVFMT_DURATION_FROM_BITRATE] = "bit rate",
2948 static const char *duration_estimate_name(enum AVDurationEstimationMethod method)
2950 return duration_name[method];
2953 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2957 /* get the file size, if possible */
2958 if (ic->iformat->flags & AVFMT_NOFILE) {
2961 file_size = avio_size(ic->pb);
2962 file_size = FFMAX(0, file_size);
2965 if ((!strcmp(ic->iformat->name, "mpeg") ||
2966 !strcmp(ic->iformat->name, "mpegts")) &&
2967 file_size && (ic->pb->seekable & AVIO_SEEKABLE_NORMAL)) {
2968 /* get accurate estimate from the PTSes */
2969 estimate_timings_from_pts(ic, old_offset);
2970 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2971 } else if (has_duration(ic)) {
2972 /* at least one component has timings - we use them for all
2974 fill_all_stream_timings(ic);
2975 /* nut demuxer estimate the duration from PTS */
2976 if(!strcmp(ic->iformat->name, "nut"))
2977 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2979 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2981 /* less precise: use bitrate info */
2982 estimate_timings_from_bit_rate(ic);
2983 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2985 update_stream_timings(ic);
2989 AVStream av_unused *st;
2990 for (i = 0; i < ic->nb_streams; i++) {
2991 st = ic->streams[i];
2992 if (st->time_base.den)
2993 av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %0.3f duration: %0.3f\n", i,
2994 (double) st->start_time * av_q2d(st->time_base),
2995 (double) st->duration * av_q2d(st->time_base));
2997 av_log(ic, AV_LOG_TRACE,
2998 "format: start_time: %0.3f duration: %0.3f (estimate from %s) bitrate=%"PRId64" kb/s\n",
2999 (double) ic->start_time / AV_TIME_BASE,
3000 (double) ic->duration / AV_TIME_BASE,
3001 duration_estimate_name(ic->duration_estimation_method),
3002 (int64_t)ic->bit_rate / 1000);
3006 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
3008 AVCodecContext *avctx = st->internal->avctx;
3010 #define FAIL(errmsg) do { \
3012 *errmsg_ptr = errmsg; \
3016 if ( avctx->codec_id == AV_CODEC_ID_NONE
3017 && avctx->codec_type != AVMEDIA_TYPE_DATA)
3018 FAIL("unknown codec");
3019 switch (avctx->codec_type) {
3020 case AVMEDIA_TYPE_AUDIO:
3021 if (!avctx->frame_size && determinable_frame_size(avctx))
3022 FAIL("unspecified frame size");
3023 if (st->info->found_decoder >= 0 &&
3024 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
3025 FAIL("unspecified sample format");
3026 if (!avctx->sample_rate)
3027 FAIL("unspecified sample rate");
3028 if (!avctx->channels)
3029 FAIL("unspecified number of channels");
3030 if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
3031 FAIL("no decodable DTS frames");
3033 case AVMEDIA_TYPE_VIDEO:
3035 FAIL("unspecified size");
3036 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
3037 FAIL("unspecified pixel format");
3038 if (st->codecpar->codec_id == AV_CODEC_ID_RV30 || st->codecpar->codec_id == AV_CODEC_ID_RV40)
3039 if (!st->sample_aspect_ratio.num && !st->codecpar->sample_aspect_ratio.num && !st->codec_info_nb_frames)
3040 FAIL("no frame in rv30/40 and no sar");
3042 case AVMEDIA_TYPE_SUBTITLE:
3043 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
3044 FAIL("unspecified size");
3046 case AVMEDIA_TYPE_DATA:
3047 if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
3053 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
3054 static int try_decode_frame(AVFormatContext *s, AVStream *st,
3055 const AVPacket *avpkt, AVDictionary **options)
3057 AVCodecContext *avctx = st->internal->avctx;
3058 const AVCodec *codec;
3059 int got_picture = 1, ret = 0;
3060 AVFrame *frame = av_frame_alloc();
3061 AVSubtitle subtitle;
3062 AVPacket pkt = *avpkt;
3063 int do_skip_frame = 0;
3064 enum AVDiscard skip_frame;
3067 return AVERROR(ENOMEM);
3069 if (!avcodec_is_open(avctx) &&
3070 st->info->found_decoder <= 0 &&
3071 (st->codecpar->codec_id != -st->info->found_decoder || !st->codecpar->codec_id)) {
3072 AVDictionary *thread_opt = NULL;
3074 codec = find_probe_decoder(s, st, st->codecpar->codec_id);
3077 st->info->found_decoder = -st->codecpar->codec_id;
3082 /* Force thread count to 1 since the H.264 decoder will not extract
3083 * SPS and PPS to extradata during multi-threaded decoding. */
3084 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
3085 if (s->codec_whitelist)
3086 av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
3087 ret = avcodec_open2(avctx, codec, options ? options : &thread_opt);
3089 av_dict_free(&thread_opt);
3091 st->info->found_decoder = -avctx->codec_id;
3094 st->info->found_decoder = 1;
3095 } else if (!st->info->found_decoder)
3096 st->info->found_decoder = 1;
3098 if (st->info->found_decoder < 0) {
3103 if (avpriv_codec_get_cap_skip_frame_fill_param(avctx->codec)) {
3105 skip_frame = avctx->skip_frame;
3106 avctx->skip_frame = AVDISCARD_ALL;
3109 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
3111 (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
3112 (!st->codec_info_nb_frames &&
3113 (avctx->codec->capabilities & AV_CODEC_CAP_CHANNEL_CONF)))) {
3115 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
3116 avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
3117 ret = avcodec_send_packet(avctx, &pkt);
3118 if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3122 ret = avcodec_receive_frame(avctx, frame);
3125 if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
3127 } else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3128 ret = avcodec_decode_subtitle2(avctx, &subtitle,
3129 &got_picture, &pkt);
3135 st->nb_decoded_frames++;
3140 if (!pkt.data && !got_picture)
3144 if (do_skip_frame) {
3145 avctx->skip_frame = skip_frame;
3148 av_frame_free(&frame);
3152 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
3154 while (tags->id != AV_CODEC_ID_NONE) {
3162 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
3165 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3166 if (tag == tags[i].tag)
3168 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3169 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
3171 return AV_CODEC_ID_NONE;
3174 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
3176 if (bps <= 0 || bps > 64)
3177 return AV_CODEC_ID_NONE;
3182 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
3184 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
3186 return AV_CODEC_ID_NONE;
3191 if (sflags & (1 << (bps - 1))) {
3194 return AV_CODEC_ID_PCM_S8;
3196 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
3198 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
3200 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
3202 return be ? AV_CODEC_ID_PCM_S64BE : AV_CODEC_ID_PCM_S64LE;
3204 return AV_CODEC_ID_NONE;
3209 return AV_CODEC_ID_PCM_U8;
3211 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
3213 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
3215 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
3217 return AV_CODEC_ID_NONE;
3223 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
3226 if (!av_codec_get_tag2(tags, id, &tag))
3231 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
3235 for (i = 0; tags && tags[i]; i++) {
3236 const AVCodecTag *codec_tags = tags[i];
3237 while (codec_tags->id != AV_CODEC_ID_NONE) {
3238 if (codec_tags->id == id) {
3239 *tag = codec_tags->tag;
3248 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
3251 for (i = 0; tags && tags[i]; i++) {
3252 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
3253 if (id != AV_CODEC_ID_NONE)
3256 return AV_CODEC_ID_NONE;
3259 static void compute_chapters_end(AVFormatContext *s)
3262 int64_t max_time = 0;
3264 if (s->duration > 0 && s->start_time < INT64_MAX - s->duration)
3265 max_time = s->duration +
3266 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
3268 for (i = 0; i < s->nb_chapters; i++)
3269 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
3270 AVChapter *ch = s->chapters[i];
3271 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
3275 for (j = 0; j < s->nb_chapters; j++) {
3276 AVChapter *ch1 = s->chapters[j];
3277 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
3279 if (j != i && next_start > ch->start && next_start < end)
3282 ch->end = (end == INT64_MAX || end < ch->start) ? ch->start : end;
3286 static int get_std_framerate(int i)
3289 return (i + 1) * 1001;
3293 return (i + 31) * 1001 * 12;
3297 return ((const int[]) { 80, 120, 240})[i] * 1001 * 12;
3301 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
3304 /* Is the time base unreliable?
3305 * This is a heuristic to balance between quick acceptance of the values in
3306 * the headers vs. some extra checks.
3307 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
3308 * MPEG-2 commonly misuses field repeat flags to store different framerates.
3309 * And there are "variable" fps files this needs to detect as well. */
3310 static int tb_unreliable(AVCodecContext *c)
3312 if (c->time_base.den >= 101LL * c->time_base.num ||
3313 c->time_base.den < 5LL * c->time_base.num ||
3314 // c->codec_tag == AV_RL32("DIVX") ||
3315 // c->codec_tag == AV_RL32("XVID") ||
3316 c->codec_tag == AV_RL32("mp4v") ||
3317 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
3318 c->codec_id == AV_CODEC_ID_GIF ||
3319 c->codec_id == AV_CODEC_ID_HEVC ||
3320 c->codec_id == AV_CODEC_ID_H264)
3325 int ff_alloc_extradata(AVCodecParameters *par, int size)
3327 av_freep(&par->extradata);
3328 par->extradata_size = 0;
3330 if (size < 0 || size >= INT32_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
3331 return AVERROR(EINVAL);
3333 par->extradata = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
3334 if (!par->extradata)
3335 return AVERROR(ENOMEM);
3337 memset(par->extradata + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3338 par->extradata_size = size;
3343 int ff_get_extradata(AVFormatContext *s, AVCodecParameters *par, AVIOContext *pb, int size)
3345 int ret = ff_alloc_extradata(par, size);
3348 ret = avio_read(pb, par->extradata, size);
3350 av_freep(&par->extradata);
3351 par->extradata_size = 0;
3352 av_log(s, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
3353 return ret < 0 ? ret : AVERROR_INVALIDDATA;
3359 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
3362 int64_t last = st->info->last_dts;
3364 if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
3365 && ts - (uint64_t)last < INT64_MAX) {
3366 double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
3367 int64_t duration = ts - last;
3369 if (!st->info->duration_error)
3370 st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
3371 if (!st->info->duration_error)
3372 return AVERROR(ENOMEM);
3374 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3375 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
3376 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3377 if (st->info->duration_error[0][1][i] < 1e10) {
3378 int framerate = get_std_framerate(i);
3379 double sdts = dts*framerate/(1001*12);
3380 for (j= 0; j<2; j++) {
3381 int64_t ticks = llrint(sdts+j*0.5);
3382 double error= sdts - ticks + j*0.5;
3383 st->info->duration_error[j][0][i] += error;
3384 st->info->duration_error[j][1][i] += error*error;
3388 if (st->info->rfps_duration_sum <= INT64_MAX - duration) {
3389 st->info->duration_count++;
3390 st->info->rfps_duration_sum += duration;
3393 if (st->info->duration_count % 10 == 0) {
3394 int n = st->info->duration_count;
3395 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3396 if (st->info->duration_error[0][1][i] < 1e10) {
3397 double a0 = st->info->duration_error[0][0][i] / n;
3398 double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
3399 double a1 = st->info->duration_error[1][0][i] / n;
3400 double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
3401 if (error0 > 0.04 && error1 > 0.04) {
3402 st->info->duration_error[0][1][i] = 2e10;
3403 st->info->duration_error[1][1][i] = 2e10;
3409 // ignore the first 4 values, they might have some random jitter
3410 if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
3411 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
3413 if (ts != AV_NOPTS_VALUE)
3414 st->info->last_dts = ts;
3419 void ff_rfps_calculate(AVFormatContext *ic)
3423 for (i = 0; i < ic->nb_streams; i++) {
3424 AVStream *st = ic->streams[i];
3426 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
3428 // the check for tb_unreliable() is not completely correct, since this is not about handling
3429 // an unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3430 // ipmovie.c produces.
3431 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)
3432 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);
3433 if (st->info->duration_count>1 && !st->r_frame_rate.num
3434 && tb_unreliable(st->internal->avctx)) {
3436 double best_error= 0.01;
3437 AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
3439 for (j= 0; j<MAX_STD_TIMEBASES; j++) {
3442 if (st->info->codec_info_duration &&
3443 st->info->codec_info_duration*av_q2d(st->time_base) < (1001*11.5)/get_std_framerate(j))
3445 if (!st->info->codec_info_duration && get_std_framerate(j) < 1001*12)
3448 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
3451 for (k= 0; k<2; k++) {
3452 int n = st->info->duration_count;
3453 double a= st->info->duration_error[k][0][j] / n;
3454 double error= st->info->duration_error[k][1][j]/n - a*a;
3456 if (error < best_error && best_error> 0.000000001) {
3458 num = get_std_framerate(j);
3461 av_log(ic, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
3464 // do not increase frame rate by more than 1 % in order to match a standard rate.
3465 if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
3466 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
3468 if ( !st->avg_frame_rate.num
3469 && st->r_frame_rate.num && st->info->rfps_duration_sum
3470 && st->info->codec_info_duration <= 0
3471 && st->info->duration_count > 2
3472 && 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
3474 av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
3475 st->avg_frame_rate = st->r_frame_rate;
3478 av_freep(&st->info->duration_error);
3479 st->info->last_dts = AV_NOPTS_VALUE;
3480 st->info->duration_count = 0;
3481 st->info->rfps_duration_sum = 0;
3485 static int extract_extradata_check(AVStream *st)
3487 const AVBitStreamFilter *f;
3489 f = av_bsf_get_by_name("extract_extradata");
3494 const enum AVCodecID *ids;
3495 for (ids = f->codec_ids; *ids != AV_CODEC_ID_NONE; ids++)
3496 if (*ids == st->codecpar->codec_id)
3503 static int extract_extradata_init(AVStream *st)
3505 AVStreamInternal *sti = st->internal;
3506 const AVBitStreamFilter *f;
3509 f = av_bsf_get_by_name("extract_extradata");
3513 /* check that the codec id is supported */
3514 ret = extract_extradata_check(st);
3518 sti->extract_extradata.pkt = av_packet_alloc();
3519 if (!sti->extract_extradata.pkt)
3520 return AVERROR(ENOMEM);
3522 ret = av_bsf_alloc(f, &sti->extract_extradata.bsf);
3526 ret = avcodec_parameters_copy(sti->extract_extradata.bsf->par_in,
3531 sti->extract_extradata.bsf->time_base_in = st->time_base;
3533 ret = av_bsf_init(sti->extract_extradata.bsf);
3538 sti->extract_extradata.inited = 1;
3542 av_bsf_free(&sti->extract_extradata.bsf);
3543 av_packet_free(&sti->extract_extradata.pkt);
3547 static int extract_extradata(AVStream *st, const AVPacket *pkt)
3549 AVStreamInternal *sti = st->internal;
3553 if (!sti->extract_extradata.inited) {
3554 ret = extract_extradata_init(st);
3559 if (sti->extract_extradata.inited && !sti->extract_extradata.bsf)
3562 pkt_ref = sti->extract_extradata.pkt;
3563 ret = av_packet_ref(pkt_ref, pkt);
3567 ret = av_bsf_send_packet(sti->extract_extradata.bsf, pkt_ref);
3569 av_packet_unref(pkt_ref);
3573 while (ret >= 0 && !sti->avctx->extradata) {
3577 ret = av_bsf_receive_packet(sti->extract_extradata.bsf, pkt_ref);
3579 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3584 extradata = av_packet_get_side_data(pkt_ref, AV_PKT_DATA_NEW_EXTRADATA,
3588 av_assert0(!sti->avctx->extradata);
3589 if ((unsigned)extradata_size < FF_MAX_EXTRADATA_SIZE)
3590 sti->avctx->extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
3591 if (!sti->avctx->extradata) {
3592 av_packet_unref(pkt_ref);
3593 return AVERROR(ENOMEM);
3595 memcpy(sti->avctx->extradata, extradata, extradata_size);
3596 sti->avctx->extradata_size = extradata_size;
3598 av_packet_unref(pkt_ref);
3604 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3606 int i, count = 0, ret = 0, j;
3609 AVCodecContext *avctx;
3611 int64_t old_offset = avio_tell(ic->pb);
3612 // new streams might appear, no options for those
3613 int orig_nb_streams = ic->nb_streams;
3615 int64_t max_analyze_duration = ic->max_analyze_duration;
3616 int64_t max_stream_analyze_duration;
3617 int64_t max_subtitle_analyze_duration;
3618 int64_t probesize = ic->probesize;
3619 int eof_reached = 0;
3620 int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
3622 flush_codecs = probesize > 0;
3624 av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3626 max_stream_analyze_duration = max_analyze_duration;
3627 max_subtitle_analyze_duration = max_analyze_duration;
3628 if (!max_analyze_duration) {
3629 max_stream_analyze_duration =
3630 max_analyze_duration = 5*AV_TIME_BASE;
3631 max_subtitle_analyze_duration = 30*AV_TIME_BASE;
3632 if (!strcmp(ic->iformat->name, "flv"))
3633 max_stream_analyze_duration = 90*AV_TIME_BASE;
3634 if (!strcmp(ic->iformat->name, "mpeg") || !strcmp(ic->iformat->name, "mpegts"))
3635 max_stream_analyze_duration = 7*AV_TIME_BASE;
3639 av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d nb_streams:%d\n",
3640 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, ic->nb_streams);
3642 for (i = 0; i < ic->nb_streams; i++) {
3643 const AVCodec *codec;
3644 AVDictionary *thread_opt = NULL;
3645 st = ic->streams[i];
3646 avctx = st->internal->avctx;
3648 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3649 st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3650 /* if (!st->time_base.num)
3652 if (!avctx->time_base.num)
3653 avctx->time_base = st->time_base;
3656 /* check if the caller has overridden the codec id */
3657 #if FF_API_LAVF_AVCTX
3658 FF_DISABLE_DEPRECATION_WARNINGS
3659 if (st->codec->codec_id != st->internal->orig_codec_id) {
3660 st->codecpar->codec_id = st->codec->codec_id;
3661 st->codecpar->codec_type = st->codec->codec_type;
3662 st->internal->orig_codec_id = st->codec->codec_id;
3664 FF_ENABLE_DEPRECATION_WARNINGS
3666 // only for the split stuff
3667 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->request_probe <= 0) {
3668 st->parser = av_parser_init(st->codecpar->codec_id);
3670 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3671 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3672 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3673 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3675 } else if (st->need_parsing) {
3676 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3677 "%s, packets or times may be invalid.\n",
3678 avcodec_get_name(st->codecpar->codec_id));
3682 if (st->codecpar->codec_id != st->internal->orig_codec_id)
3683 st->internal->orig_codec_id = st->codecpar->codec_id;
3685 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3687 goto find_stream_info_err;
3688 if (st->request_probe <= 0)
3689 st->internal->avctx_inited = 1;
3691 codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3693 /* Force thread count to 1 since the H.264 decoder will not extract
3694 * SPS and PPS to extradata during multi-threaded decoding. */
3695 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3697 if (ic->codec_whitelist)
3698 av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3700 /* Ensure that subtitle_header is properly set. */
3701 if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE
3702 && codec && !avctx->codec) {
3703 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3704 av_log(ic, AV_LOG_WARNING,
3705 "Failed to open codec in %s\n",__FUNCTION__);
3708 // Try to just open decoders, in case this is enough to get parameters.
3709 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3710 if (codec && !avctx->codec)
3711 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3712 av_log(ic, AV_LOG_WARNING,
3713 "Failed to open codec in %s\n",__FUNCTION__);
3716 av_dict_free(&thread_opt);
3719 for (i = 0; i < ic->nb_streams; i++) {
3720 #if FF_API_R_FRAME_RATE
3721 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3723 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3724 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
3729 const AVPacket *pkt;
3730 int analyzed_all_streams;
3731 if (ff_check_interrupt(&ic->interrupt_callback)) {
3733 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3737 /* check if one codec still needs to be handled */
3738 for (i = 0; i < ic->nb_streams; i++) {
3739 int fps_analyze_framecount = 20;
3742 st = ic->streams[i];
3743 if (!has_codec_parameters(st, NULL))
3745 /* If the timebase is coarse (like the usual millisecond precision
3746 * of mkv), we need to analyze more frames to reliably arrive at
3747 * the correct fps. */
3748 if (av_q2d(st->time_base) > 0.0005)
3749 fps_analyze_framecount *= 2;
3750 if (!tb_unreliable(st->internal->avctx))
3751 fps_analyze_framecount = 0;
3752 if (ic->fps_probe_size >= 0)
3753 fps_analyze_framecount = ic->fps_probe_size;
3754 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3755 fps_analyze_framecount = 0;
3756 /* variable fps and no guess at the real fps */
3757 count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
3758 st->info->codec_info_duration_fields/2 :
3759 st->info->duration_count;
3760 if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3761 st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3762 if (count < fps_analyze_framecount)
3765 // Look at the first 3 frames if there is evidence of frame delay
3766 // but the decoder delay is not set.
3767 if (st->info->frame_delay_evidence && count < 2 && st->internal->avctx->has_b_frames == 0)
3769 if (!st->internal->avctx->extradata &&
3770 (!st->internal->extract_extradata.inited ||
3771 st->internal->extract_extradata.bsf) &&
3772 extract_extradata_check(st))
3774 if (st->first_dts == AV_NOPTS_VALUE &&
3775 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3776 st->codec_info_nb_frames < ((st->disposition & AV_DISPOSITION_ATTACHED_PIC) ? 1 : ic->max_ts_probe) &&
3777 (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3778 st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))
3781 analyzed_all_streams = 0;
3782 if (!missing_streams || !*missing_streams)
3783 if (i == ic->nb_streams) {
3784 analyzed_all_streams = 1;
3785 /* NOTE: If the format has no header, then we need to read some
3786 * packets to get most of the streams, so we cannot stop here. */
3787 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3788 /* If we found the info for all the codecs, we can stop. */
3790 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3795 /* We did not get all the codec info, but we read too much data. */
3796 if (read_size >= probesize) {
3798 av_log(ic, AV_LOG_DEBUG,
3799 "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3800 for (i = 0; i < ic->nb_streams; i++)
3801 if (!ic->streams[i]->r_frame_rate.num &&
3802 ic->streams[i]->info->duration_count <= 1 &&
3803 ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
3804 strcmp(ic->iformat->name, "image2"))
3805 av_log(ic, AV_LOG_WARNING,
3806 "Stream #%d: not enough frames to estimate rate; "
3807 "consider increasing probesize\n", i);
3811 /* NOTE: A new stream can be added there if no header in file
3812 * (AVFMTCTX_NOHEADER). */
3813 ret = read_frame_internal(ic, &pkt1);
3814 if (ret == AVERROR(EAGAIN))
3823 if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
3824 ret = ff_packet_list_put(&ic->internal->packet_buffer,
3825 &ic->internal->packet_buffer_end,
3828 goto unref_then_goto_end;
3830 pkt = &ic->internal->packet_buffer_end->pkt;
3835 st = ic->streams[pkt->stream_index];
3836 if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3837 read_size += pkt->size;
3839 avctx = st->internal->avctx;
3840 if (!st->internal->avctx_inited) {
3841 ret = avcodec_parameters_to_context(avctx, st->codecpar);
3843 goto unref_then_goto_end;
3844 st->internal->avctx_inited = 1;
3847 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3848 /* check for non-increasing dts */
3849 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3850 st->info->fps_last_dts >= pkt->dts) {
3851 av_log(ic, AV_LOG_DEBUG,
3852 "Non-increasing DTS in stream %d: packet %d with DTS "
3853 "%"PRId64", packet %d with DTS %"PRId64"\n",
3854 st->index, st->info->fps_last_dts_idx,
3855 st->info->fps_last_dts, st->codec_info_nb_frames,
3857 st->info->fps_first_dts =
3858 st->info->fps_last_dts = AV_NOPTS_VALUE;
3860 /* Check for a discontinuity in dts. If the difference in dts
3861 * is more than 1000 times the average packet duration in the
3862 * sequence, we treat it as a discontinuity. */
3863 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3864 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3865 (pkt->dts - (uint64_t)st->info->fps_last_dts) / 1000 >
3866 (st->info->fps_last_dts - (uint64_t)st->info->fps_first_dts) /
3867 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3868 av_log(ic, AV_LOG_WARNING,
3869 "DTS discontinuity in stream %d: packet %d with DTS "
3870 "%"PRId64", packet %d with DTS %"PRId64"\n",
3871 st->index, st->info->fps_last_dts_idx,
3872 st->info->fps_last_dts, st->codec_info_nb_frames,
3874 st->info->fps_first_dts =
3875 st->info->fps_last_dts = AV_NOPTS_VALUE;
3878 /* update stored dts values */
3879 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3880 st->info->fps_first_dts = pkt->dts;
3881 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3883 st->info->fps_last_dts = pkt->dts;
3884 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3886 if (st->codec_info_nb_frames>1) {
3890 if (st->time_base.den > 0)
3891 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3892 if (st->avg_frame_rate.num > 0)
3893 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3896 && st->codec_info_nb_frames>30
3897 && st->info->fps_first_dts != AV_NOPTS_VALUE
3898 && st->info->fps_last_dts != AV_NOPTS_VALUE)
3899 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3901 if (analyzed_all_streams) limit = max_analyze_duration;
3902 else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) limit = max_subtitle_analyze_duration;
3903 else limit = max_stream_analyze_duration;
3906 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds st:%d\n",
3908 t, pkt->stream_index);
3909 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3910 av_packet_unref(&pkt1);
3913 if (pkt->duration) {
3914 if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE && pkt->pts != AV_NOPTS_VALUE && st->start_time != AV_NOPTS_VALUE && pkt->pts >= st->start_time) {
3915 st->info->codec_info_duration = FFMIN(pkt->pts - st->start_time, st->info->codec_info_duration + pkt->duration);
3917 st->info->codec_info_duration += pkt->duration;
3918 st->info->codec_info_duration_fields += st->parser && st->need_parsing && avctx->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3921 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3922 #if FF_API_R_FRAME_RATE
3923 ff_rfps_add_frame(ic, st, pkt->dts);
3925 if (pkt->dts != pkt->pts && pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE)
3926 st->info->frame_delay_evidence = 1;
3928 if (!st->internal->avctx->extradata) {
3929 ret = extract_extradata(st, pkt);
3931 goto unref_then_goto_end;
3934 /* If still no information, we try to open the codec and to
3935 * decompress the frame. We try to avoid that in most cases as
3936 * it takes longer and uses more memory. For MPEG-4, we need to
3937 * decompress for QuickTime.
3939 * If AV_CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3940 * least one frame of codec data, this makes sure the codec initializes
3941 * the channel configuration and does not only trust the values from
3943 try_decode_frame(ic, st, pkt,
3944 (options && i < orig_nb_streams) ? &options[i] : NULL);
3946 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3947 av_packet_unref(&pkt1);
3949 st->codec_info_nb_frames++;
3955 for (stream_index = 0; stream_index < ic->nb_streams; stream_index++) {
3956 st = ic->streams[stream_index];
3957 avctx = st->internal->avctx;
3958 if (!has_codec_parameters(st, NULL)) {
3959 const AVCodec *codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3960 if (codec && !avctx->codec) {
3961 AVDictionary *opts = NULL;
3962 if (ic->codec_whitelist)
3963 av_dict_set(&opts, "codec_whitelist", ic->codec_whitelist, 0);
3964 if (avcodec_open2(avctx, codec, (options && stream_index < orig_nb_streams) ? &options[stream_index] : &opts) < 0)
3965 av_log(ic, AV_LOG_WARNING,
3966 "Failed to open codec in %s\n",__FUNCTION__);
3967 av_dict_free(&opts);
3971 // EOF already reached while reading the stream above.
3972 // So continue with reoordering DTS with whatever delay we have.
3973 if (ic->internal->packet_buffer && !has_decode_delay_been_guessed(st)) {
3974 update_dts_from_pts(ic, stream_index, ic->internal->packet_buffer);
3980 AVPacket empty_pkt = { 0 };
3982 av_init_packet(&empty_pkt);
3984 for (i = 0; i < ic->nb_streams; i++) {
3986 st = ic->streams[i];
3988 /* flush the decoders */
3989 if (st->info->found_decoder == 1) {
3991 err = try_decode_frame(ic, st, &empty_pkt,
3992 (options && i < orig_nb_streams)
3993 ? &options[i] : NULL);
3994 } while (err > 0 && !has_codec_parameters(st, NULL));
3997 av_log(ic, AV_LOG_INFO,
3998 "decoding for stream %d failed\n", st->index);
4004 ff_rfps_calculate(ic);
4006 for (i = 0; i < ic->nb_streams; i++) {
4007 st = ic->streams[i];
4008 avctx = st->internal->avctx;
4009 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
4010 if (avctx->codec_id == AV_CODEC_ID_RAWVIDEO && !avctx->codec_tag && !avctx->bits_per_coded_sample) {
4011 uint32_t tag= avcodec_pix_fmt_to_codec_tag(avctx->pix_fmt);
4012 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == avctx->pix_fmt)
4013 avctx->codec_tag= tag;
4016 /* estimate average framerate if not set by demuxer */
4017 if (st->info->codec_info_duration_fields &&
4018 !st->avg_frame_rate.num &&
4019 st->info->codec_info_duration) {
4021 double best_error = 0.01;
4022 AVRational codec_frame_rate = avctx->framerate;
4024 if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
4025 st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
4026 st->info->codec_info_duration < 0)
4028 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
4029 st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
4030 st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
4032 /* Round guessed framerate to a "standard" framerate if it's
4033 * within 1% of the original estimate. */
4034 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
4035 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
4036 double error = fabs(av_q2d(st->avg_frame_rate) /
4037 av_q2d(std_fps) - 1);
4039 if (error < best_error) {
4041 best_fps = std_fps.num;
4044 if (ic->internal->prefer_codec_framerate && codec_frame_rate.num > 0 && codec_frame_rate.den > 0) {
4045 error = fabs(av_q2d(codec_frame_rate) /
4046 av_q2d(std_fps) - 1);
4047 if (error < best_error) {
4049 best_fps = std_fps.num;
4054 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
4055 best_fps, 12 * 1001, INT_MAX);
4058 if (!st->r_frame_rate.num) {
4059 if ( avctx->time_base.den * (int64_t) st->time_base.num
4060 <= avctx->time_base.num * avctx->ticks_per_frame * (int64_t) st->time_base.den) {
4061 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den,
4062 avctx->time_base.den, (int64_t)avctx->time_base.num * avctx->ticks_per_frame, INT_MAX);
4064 st->r_frame_rate.num = st->time_base.den;
4065 st->r_frame_rate.den = st->time_base.num;
4068 if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
4069 AVRational hw_ratio = { avctx->height, avctx->width };
4070 st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
4073 } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
4074 if (!avctx->bits_per_coded_sample)
4075 avctx->bits_per_coded_sample =
4076 av_get_bits_per_sample(avctx->codec_id);
4077 // set stream disposition based on audio service type
4078 switch (avctx->audio_service_type) {
4079 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
4080 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
4082 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
4083 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
4085 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
4086 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
4088 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
4089 st->disposition = AV_DISPOSITION_COMMENT;
4091 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
4092 st->disposition = AV_DISPOSITION_KARAOKE;
4099 estimate_timings(ic, old_offset);
4101 av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
4103 if (ret >= 0 && ic->nb_streams)
4104 /* We could not have all the codec parameters before EOF. */
4106 for (i = 0; i < ic->nb_streams; i++) {
4108 st = ic->streams[i];
4110 /* if no packet was ever seen, update context now for has_codec_parameters */
4111 if (!st->internal->avctx_inited) {
4112 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
4113 st->codecpar->format == AV_SAMPLE_FMT_NONE)
4114 st->codecpar->format = st->internal->avctx->sample_fmt;
4115 ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
4117 goto find_stream_info_err;
4119 if (!has_codec_parameters(st, &errmsg)) {
4121 avcodec_string(buf, sizeof(buf), st->internal->avctx, 0);
4122 av_log(ic, AV_LOG_WARNING,
4123 "Could not find codec parameters for stream %d (%s): %s\n"
4124 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
4131 compute_chapters_end(ic);
4133 /* update the stream parameters from the internal codec contexts */
4134 for (i = 0; i < ic->nb_streams; i++) {
4135 st = ic->streams[i];
4137 if (st->internal->avctx_inited) {
4138 int orig_w = st->codecpar->width;
4139 int orig_h = st->codecpar->height;
4140 ret = avcodec_parameters_from_context(st->codecpar, st->internal->avctx);
4142 goto find_stream_info_err;
4144 // The decoder might reduce the video size by the lowres factor.
4145 if (st->internal->avctx->lowres && orig_w) {
4146 st->codecpar->width = orig_w;
4147 st->codecpar->height = orig_h;
4152 #if FF_API_LAVF_AVCTX
4153 FF_DISABLE_DEPRECATION_WARNINGS
4154 ret = avcodec_parameters_to_context(st->codec, st->codecpar);
4156 goto find_stream_info_err;
4159 // The old API (AVStream.codec) "requires" the resolution to be adjusted
4160 // by the lowres factor.
4161 if (st->internal->avctx->lowres && st->internal->avctx->width) {
4162 st->codec->lowres = st->internal->avctx->lowres;
4163 st->codec->width = st->internal->avctx->width;
4164 st->codec->height = st->internal->avctx->height;
4168 if (st->codec->codec_tag != MKTAG('t','m','c','d')) {
4169 st->codec->time_base = st->internal->avctx->time_base;
4170 st->codec->ticks_per_frame = st->internal->avctx->ticks_per_frame;
4172 st->codec->framerate = st->avg_frame_rate;
4174 if (st->internal->avctx->subtitle_header) {
4175 st->codec->subtitle_header = av_malloc(st->internal->avctx->subtitle_header_size);
4176 if (!st->codec->subtitle_header)
4177 goto find_stream_info_err;
4178 st->codec->subtitle_header_size = st->internal->avctx->subtitle_header_size;
4179 memcpy(st->codec->subtitle_header, st->internal->avctx->subtitle_header,
4180 st->codec->subtitle_header_size);
4183 // Fields unavailable in AVCodecParameters
4184 st->codec->coded_width = st->internal->avctx->coded_width;
4185 st->codec->coded_height = st->internal->avctx->coded_height;
4186 st->codec->properties = st->internal->avctx->properties;
4187 FF_ENABLE_DEPRECATION_WARNINGS
4190 st->internal->avctx_inited = 0;
4193 find_stream_info_err:
4194 for (i = 0; i < ic->nb_streams; i++) {
4195 st = ic->streams[i];
4197 av_freep(&st->info->duration_error);
4198 avcodec_close(ic->streams[i]->internal->avctx);
4199 av_freep(&ic->streams[i]->info);
4200 av_bsf_free(&ic->streams[i]->internal->extract_extradata.bsf);
4201 av_packet_free(&ic->streams[i]->internal->extract_extradata.pkt);
4204 av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
4205 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
4208 unref_then_goto_end:
4209 av_packet_unref(&pkt1);
4210 goto find_stream_info_err;
4213 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
4217 for (i = 0; i < ic->nb_programs; i++) {
4218 if (ic->programs[i] == last) {
4222 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
4223 if (ic->programs[i]->stream_index[j] == s)
4224 return ic->programs[i];
4230 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
4231 int wanted_stream_nb, int related_stream,
4232 AVCodec **decoder_ret, int flags)
4234 int i, nb_streams = ic->nb_streams;
4235 int ret = AVERROR_STREAM_NOT_FOUND;
4236 int best_count = -1, best_multiframe = -1, best_disposition = -1;
4237 int count, multiframe, disposition;
4238 int64_t best_bitrate = -1;
4240 unsigned *program = NULL;
4241 const AVCodec *decoder = NULL, *best_decoder = NULL;
4243 if (related_stream >= 0 && wanted_stream_nb < 0) {
4244 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
4246 program = p->stream_index;
4247 nb_streams = p->nb_stream_indexes;
4250 for (i = 0; i < nb_streams; i++) {
4251 int real_stream_index = program ? program[i] : i;
4252 AVStream *st = ic->streams[real_stream_index];
4253 AVCodecParameters *par = st->codecpar;
4254 if (par->codec_type != type)
4256 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
4258 if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate))
4261 decoder = find_decoder(ic, st, par->codec_id);
4264 ret = AVERROR_DECODER_NOT_FOUND;
4268 disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED))
4269 + !! (st->disposition & AV_DISPOSITION_DEFAULT);
4270 count = st->codec_info_nb_frames;
4271 bitrate = par->bit_rate;
4272 multiframe = FFMIN(5, count);
4273 if ((best_disposition > disposition) ||
4274 (best_disposition == disposition && best_multiframe > multiframe) ||
4275 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate > bitrate) ||
4276 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
4278 best_disposition = disposition;
4280 best_bitrate = bitrate;
4281 best_multiframe = multiframe;
4282 ret = real_stream_index;
4283 best_decoder = decoder;
4284 if (program && i == nb_streams - 1 && ret < 0) {
4286 nb_streams = ic->nb_streams;
4287 /* no related stream found, try again with everything */
4292 *decoder_ret = (AVCodec*)best_decoder;
4296 /*******************************************************/
4298 int av_read_play(AVFormatContext *s)
4300 if (s->iformat->read_play)
4301 return s->iformat->read_play(s);
4303 return avio_pause(s->pb, 0);
4304 return AVERROR(ENOSYS);
4307 int av_read_pause(AVFormatContext *s)
4309 if (s->iformat->read_pause)
4310 return s->iformat->read_pause(s);
4312 return avio_pause(s->pb, 1);
4313 return AVERROR(ENOSYS);
4316 int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src)
4321 dst->time_base = src->time_base;
4322 dst->nb_frames = src->nb_frames;
4323 dst->disposition = src->disposition;
4324 dst->sample_aspect_ratio = src->sample_aspect_ratio;
4325 dst->avg_frame_rate = src->avg_frame_rate;
4326 dst->r_frame_rate = src->r_frame_rate;
4328 av_dict_free(&dst->metadata);
4329 ret = av_dict_copy(&dst->metadata, src->metadata, 0);
4333 ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
4337 /* Free existing side data*/
4338 for (i = 0; i < dst->nb_side_data; i++)
4339 av_free(dst->side_data[i].data);
4340 av_freep(&dst->side_data);
4341 dst->nb_side_data = 0;
4343 /* Copy side data if present */
4344 if (src->nb_side_data) {
4345 dst->side_data = av_mallocz_array(src->nb_side_data,
4346 sizeof(AVPacketSideData));
4347 if (!dst->side_data)
4348 return AVERROR(ENOMEM);
4349 dst->nb_side_data = src->nb_side_data;
4351 for (i = 0; i < src->nb_side_data; i++) {
4352 uint8_t *data = av_memdup(src->side_data[i].data,
4353 src->side_data[i].size);
4355 return AVERROR(ENOMEM);
4356 dst->side_data[i].type = src->side_data[i].type;
4357 dst->side_data[i].size = src->side_data[i].size;
4358 dst->side_data[i].data = data;
4362 #if FF_API_LAVF_FFSERVER
4363 FF_DISABLE_DEPRECATION_WARNINGS
4364 av_freep(&dst->recommended_encoder_configuration);
4365 if (src->recommended_encoder_configuration) {
4366 const char *conf_str = src->recommended_encoder_configuration;
4367 dst->recommended_encoder_configuration = av_strdup(conf_str);
4368 if (!dst->recommended_encoder_configuration)
4369 return AVERROR(ENOMEM);
4371 FF_ENABLE_DEPRECATION_WARNINGS
4377 static void free_stream(AVStream **pst)
4379 AVStream *st = *pst;
4385 for (i = 0; i < st->nb_side_data; i++)
4386 av_freep(&st->side_data[i].data);
4387 av_freep(&st->side_data);
4390 av_parser_close(st->parser);
4392 if (st->attached_pic.data)
4393 av_packet_unref(&st->attached_pic);
4396 avcodec_free_context(&st->internal->avctx);
4397 for (i = 0; i < st->internal->nb_bsfcs; i++) {
4398 av_bsf_free(&st->internal->bsfcs[i]);
4399 av_freep(&st->internal->bsfcs);
4401 av_freep(&st->internal->priv_pts);
4402 av_bsf_free(&st->internal->extract_extradata.bsf);
4403 av_packet_free(&st->internal->extract_extradata.pkt);
4405 av_freep(&st->internal);
4407 av_dict_free(&st->metadata);
4408 avcodec_parameters_free(&st->codecpar);
4409 av_freep(&st->probe_data.buf);
4410 av_freep(&st->index_entries);
4411 #if FF_API_LAVF_AVCTX
4412 FF_DISABLE_DEPRECATION_WARNINGS
4413 avcodec_free_context(&st->codec);
4414 FF_ENABLE_DEPRECATION_WARNINGS
4416 av_freep(&st->priv_data);
4418 av_freep(&st->info->duration_error);
4419 av_freep(&st->info);
4420 #if FF_API_LAVF_FFSERVER
4421 FF_DISABLE_DEPRECATION_WARNINGS
4422 av_freep(&st->recommended_encoder_configuration);
4423 FF_ENABLE_DEPRECATION_WARNINGS
4429 void ff_free_stream(AVFormatContext *s, AVStream *st)
4431 av_assert0(s->nb_streams>0);
4432 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
4434 free_stream(&s->streams[ --s->nb_streams ]);
4437 void avformat_free_context(AVFormatContext *s)
4444 if (s->oformat && s->oformat->deinit && s->internal->initialized)
4445 s->oformat->deinit(s);
4448 if (s->iformat && s->iformat->priv_class && s->priv_data)
4449 av_opt_free(s->priv_data);
4450 if (s->oformat && s->oformat->priv_class && s->priv_data)
4451 av_opt_free(s->priv_data);
4453 for (i = s->nb_streams - 1; i >= 0; i--)
4454 ff_free_stream(s, s->streams[i]);
4457 for (i = s->nb_programs - 1; i >= 0; i--) {
4458 av_dict_free(&s->programs[i]->metadata);
4459 av_freep(&s->programs[i]->stream_index);
4460 av_freep(&s->programs[i]);
4462 av_freep(&s->programs);
4463 av_freep(&s->priv_data);
4464 while (s->nb_chapters--) {
4465 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
4466 av_freep(&s->chapters[s->nb_chapters]);
4468 av_freep(&s->chapters);
4469 av_dict_free(&s->metadata);
4470 av_dict_free(&s->internal->id3v2_meta);
4471 av_freep(&s->streams);
4472 flush_packet_queue(s);
4473 av_freep(&s->internal);
4478 void avformat_close_input(AVFormatContext **ps)
4489 if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
4490 (s->flags & AVFMT_FLAG_CUSTOM_IO))
4493 flush_packet_queue(s);
4496 if (s->iformat->read_close)
4497 s->iformat->read_close(s);
4499 avformat_free_context(s);
4506 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
4512 if (s->nb_streams >= FFMIN(s->max_streams, INT_MAX/sizeof(*streams))) {
4513 if (s->max_streams < INT_MAX/sizeof(*streams))
4514 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);
4517 streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
4520 s->streams = streams;
4522 st = av_mallocz(sizeof(AVStream));
4525 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
4529 st->info->last_dts = AV_NOPTS_VALUE;
4531 #if FF_API_LAVF_AVCTX
4532 FF_DISABLE_DEPRECATION_WARNINGS
4533 st->codec = avcodec_alloc_context3(c);
4539 FF_ENABLE_DEPRECATION_WARNINGS
4542 st->internal = av_mallocz(sizeof(*st->internal));
4546 st->codecpar = avcodec_parameters_alloc();
4550 st->internal->avctx = avcodec_alloc_context3(NULL);
4551 if (!st->internal->avctx)
4555 #if FF_API_LAVF_AVCTX
4556 FF_DISABLE_DEPRECATION_WARNINGS
4557 /* no default bitrate if decoding */
4558 st->codec->bit_rate = 0;
4559 FF_ENABLE_DEPRECATION_WARNINGS
4562 /* default pts setting is MPEG-like */
4563 avpriv_set_pts_info(st, 33, 1, 90000);
4564 /* we set the current DTS to 0 so that formats without any timestamps
4565 * but durations get some timestamps, formats with some unknown
4566 * timestamps have their first few packets buffered and the
4567 * timestamps corrected before they are returned to the user */
4568 st->cur_dts = RELATIVE_TS_BASE;
4570 st->cur_dts = AV_NOPTS_VALUE;
4573 st->index = s->nb_streams;
4574 st->start_time = AV_NOPTS_VALUE;
4575 st->duration = AV_NOPTS_VALUE;
4576 st->first_dts = AV_NOPTS_VALUE;
4577 st->probe_packets = s->max_probe_packets;
4578 st->pts_wrap_reference = AV_NOPTS_VALUE;
4579 st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4581 st->last_IP_pts = AV_NOPTS_VALUE;
4582 st->last_dts_for_order_check = AV_NOPTS_VALUE;
4583 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
4584 st->pts_buffer[i] = AV_NOPTS_VALUE;
4586 st->sample_aspect_ratio = (AVRational) { 0, 1 };
4588 #if FF_API_R_FRAME_RATE
4589 st->info->last_dts = AV_NOPTS_VALUE;
4591 st->info->fps_first_dts = AV_NOPTS_VALUE;
4592 st->info->fps_last_dts = AV_NOPTS_VALUE;
4594 st->inject_global_side_data = s->internal->inject_global_side_data;
4596 st->internal->need_context_update = 1;
4598 s->streams[s->nb_streams++] = st;
4605 AVProgram *av_new_program(AVFormatContext *ac, int id)
4607 AVProgram *program = NULL;
4610 av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
4612 for (i = 0; i < ac->nb_programs; i++)
4613 if (ac->programs[i]->id == id)
4614 program = ac->programs[i];
4617 program = av_mallocz(sizeof(AVProgram));
4620 dynarray_add(&ac->programs, &ac->nb_programs, program);
4621 program->discard = AVDISCARD_NONE;
4622 program->pmt_version = -1;
4625 program->pts_wrap_reference = AV_NOPTS_VALUE;
4626 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4628 program->start_time =
4629 program->end_time = AV_NOPTS_VALUE;
4634 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
4635 int64_t start, int64_t end, const char *title)
4637 AVChapter *chapter = NULL;
4640 if (end != AV_NOPTS_VALUE && start > end) {
4641 av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
4645 for (i = 0; i < s->nb_chapters; i++)
4646 if (s->chapters[i]->id == id)
4647 chapter = s->chapters[i];
4650 chapter = av_mallocz(sizeof(AVChapter));
4653 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
4655 av_dict_set(&chapter->metadata, "title", title, 0);
4657 chapter->time_base = time_base;
4658 chapter->start = start;
4664 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
4667 AVProgram *program = NULL;
4670 if (idx >= ac->nb_streams) {
4671 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
4675 for (i = 0; i < ac->nb_programs; i++) {
4676 if (ac->programs[i]->id != progid)
4678 program = ac->programs[i];
4679 for (j = 0; j < program->nb_stream_indexes; j++)
4680 if (program->stream_index[j] == idx)
4683 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
4686 program->stream_index = tmp;
4687 program->stream_index[program->nb_stream_indexes++] = idx;
4692 uint64_t ff_ntp_time(void)
4694 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
4697 uint64_t ff_get_formatted_ntp_time(uint64_t ntp_time_us)
4699 uint64_t ntp_ts, frac_part, sec;
4702 //current ntp time in seconds and micro seconds
4703 sec = ntp_time_us / 1000000;
4704 usec = ntp_time_us % 1000000;
4706 //encoding in ntp timestamp format
4707 frac_part = usec * 0xFFFFFFFFULL;
4708 frac_part /= 1000000;
4710 if (sec > 0xFFFFFFFFULL)
4711 av_log(NULL, AV_LOG_WARNING, "NTP time format roll over detected\n");
4714 ntp_ts |= frac_part;
4719 int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags)
4722 char *q, buf1[20], c;
4723 int nd, len, percentd_found;
4735 while (av_isdigit(*p))
4736 nd = nd * 10 + *p++ - '0';
4738 } while (av_isdigit(c));
4744 if (!(flags & AV_FRAME_FILENAME_FLAGS_MULTIPLE) && percentd_found)
4749 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
4751 if ((q - buf + len) > buf_size - 1)
4753 memcpy(q, buf1, len);
4761 if ((q - buf) < buf_size - 1)
4765 if (!percentd_found)
4774 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
4776 return av_get_frame_filename2(buf, buf_size, path, number, 0);
4779 void av_url_split(char *proto, int proto_size,
4780 char *authorization, int authorization_size,
4781 char *hostname, int hostname_size,
4782 int *port_ptr, char *path, int path_size, const char *url)
4784 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
4790 if (authorization_size > 0)
4791 authorization[0] = 0;
4792 if (hostname_size > 0)
4797 /* parse protocol */
4798 if ((p = strchr(url, ':'))) {
4799 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4806 /* no protocol means plain filename */
4807 av_strlcpy(path, url, path_size);
4811 /* separate path from hostname */
4812 ls = strchr(p, '/');
4813 ls2 = strchr(p, '?');
4817 ls = FFMIN(ls, ls2);
4819 av_strlcpy(path, ls, path_size);
4821 ls = &p[strlen(p)]; // XXX
4823 /* the rest is hostname, use that to parse auth/port */
4825 /* authorization (user[:pass]@hostname) */
4827 while ((at = strchr(p, '@')) && at < ls) {
4828 av_strlcpy(authorization, at2,
4829 FFMIN(authorization_size, at + 1 - at2));
4830 p = at + 1; /* skip '@' */
4833 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4835 av_strlcpy(hostname, p + 1,
4836 FFMIN(hostname_size, brk - p));
4837 if (brk[1] == ':' && port_ptr)
4838 *port_ptr = atoi(brk + 2);
4839 } else if ((col = strchr(p, ':')) && col < ls) {
4840 av_strlcpy(hostname, p,
4841 FFMIN(col + 1 - p, hostname_size));
4843 *port_ptr = atoi(col + 1);
4845 av_strlcpy(hostname, p,
4846 FFMIN(ls + 1 - p, hostname_size));
4850 int ff_mkdir_p(const char *path)
4853 char *temp = av_strdup(path);
4857 if (!path || !temp) {
4861 if (!av_strncasecmp(temp, "/", 1) || !av_strncasecmp(temp, "\\", 1)) {
4863 } else if (!av_strncasecmp(temp, "./", 2) || !av_strncasecmp(temp, ".\\", 2)) {
4867 for ( ; *pos != '\0'; ++pos) {
4868 if (*pos == '/' || *pos == '\\') {
4871 ret = mkdir(temp, 0755);
4876 if ((*(pos - 1) != '/') || (*(pos - 1) != '\\')) {
4877 ret = mkdir(temp, 0755);
4884 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4887 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4890 'C', 'D', 'E', 'F' };
4891 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4894 'c', 'd', 'e', 'f' };
4895 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4897 for (i = 0; i < s; i++) {
4898 buff[i * 2] = hex_table[src[i] >> 4];
4899 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4905 int ff_hex_to_data(uint8_t *data, const char *p)
4912 p += strspn(p, SPACE_CHARS);
4915 c = av_toupper((unsigned char) *p++);
4916 if (c >= '0' && c <= '9')
4918 else if (c >= 'A' && c <= 'F')
4933 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4934 unsigned int pts_num, unsigned int pts_den)
4937 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
4938 if (new_tb.num != pts_num)
4939 av_log(NULL, AV_LOG_DEBUG,
4940 "st:%d removing common factor %d from timebase\n",
4941 s->index, pts_num / new_tb.num);
4943 av_log(NULL, AV_LOG_WARNING,
4944 "st:%d has too large timebase, reducing\n", s->index);
4946 if (new_tb.num <= 0 || new_tb.den <= 0) {
4947 av_log(NULL, AV_LOG_ERROR,
4948 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4949 new_tb.num, new_tb.den,
4953 s->time_base = new_tb;
4954 #if FF_API_LAVF_AVCTX
4955 FF_DISABLE_DEPRECATION_WARNINGS
4956 s->codec->pkt_timebase = new_tb;
4957 FF_ENABLE_DEPRECATION_WARNINGS
4959 s->internal->avctx->pkt_timebase = new_tb;
4960 s->pts_wrap_bits = pts_wrap_bits;
4963 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4966 const char *ptr = str;
4968 /* Parse key=value pairs. */
4971 char *dest = NULL, *dest_end;
4972 int key_len, dest_len = 0;
4974 /* Skip whitespace and potential commas. */
4975 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4982 if (!(ptr = strchr(key, '=')))
4985 key_len = ptr - key;
4987 callback_get_buf(context, key, key_len, &dest, &dest_len);
4988 dest_end = dest + dest_len - 1;
4992 while (*ptr && *ptr != '\"') {
4996 if (dest && dest < dest_end)
5000 if (dest && dest < dest_end)
5008 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
5009 if (dest && dest < dest_end)
5017 int ff_find_stream_index(AVFormatContext *s, int id)
5020 for (i = 0; i < s->nb_streams; i++)
5021 if (s->streams[i]->id == id)
5026 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
5030 unsigned int codec_tag;
5031 if (ofmt->query_codec)
5032 return ofmt->query_codec(codec_id, std_compliance);
5033 else if (ofmt->codec_tag)
5034 return !!av_codec_get_tag2(ofmt->codec_tag, codec_id, &codec_tag);
5035 else if (codec_id == ofmt->video_codec ||
5036 codec_id == ofmt->audio_codec ||
5037 codec_id == ofmt->subtitle_codec ||
5038 codec_id == ofmt->data_codec)
5041 return AVERROR_PATCHWELCOME;
5044 int avformat_network_init(void)
5048 if ((ret = ff_network_init()) < 0)
5050 if ((ret = ff_tls_init()) < 0)
5056 int avformat_network_deinit(void)
5065 int ff_add_param_change(AVPacket *pkt, int32_t channels,
5066 uint64_t channel_layout, int32_t sample_rate,
5067 int32_t width, int32_t height)
5073 return AVERROR(EINVAL);
5076 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
5078 if (channel_layout) {
5080 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
5084 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
5086 if (width || height) {
5088 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
5090 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
5092 return AVERROR(ENOMEM);
5093 bytestream_put_le32(&data, flags);
5095 bytestream_put_le32(&data, channels);
5097 bytestream_put_le64(&data, channel_layout);
5099 bytestream_put_le32(&data, sample_rate);
5100 if (width || height) {
5101 bytestream_put_le32(&data, width);
5102 bytestream_put_le32(&data, height);
5107 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
5109 AVRational undef = {0, 1};
5110 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
5111 AVRational codec_sample_aspect_ratio = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
5112 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
5114 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
5115 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
5116 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
5117 stream_sample_aspect_ratio = undef;
5119 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
5120 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
5121 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
5122 frame_sample_aspect_ratio = undef;
5124 if (stream_sample_aspect_ratio.num)
5125 return stream_sample_aspect_ratio;
5127 return frame_sample_aspect_ratio;
5130 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
5132 AVRational fr = st->r_frame_rate;
5133 AVRational codec_fr = st->internal->avctx->framerate;
5134 AVRational avg_fr = st->avg_frame_rate;
5136 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
5137 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
5142 if (st->internal->avctx->ticks_per_frame > 1) {
5143 if ( codec_fr.num > 0 && codec_fr.den > 0 &&
5144 (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))
5152 * Matches a stream specifier (but ignores requested index).
5154 * @param indexptr set to point to the requested stream index if there is one
5156 * @return <0 on error
5157 * 0 if st is NOT a matching stream
5158 * >0 if st is a matching stream
5160 static int match_stream_specifier(AVFormatContext *s, AVStream *st,
5161 const char *spec, const char **indexptr, AVProgram **p)
5163 int match = 1; /* Stores if the specifier matches so far. */
5165 if (*spec <= '9' && *spec >= '0') { /* opt:index */
5169 } else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
5170 *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
5171 enum AVMediaType type;
5175 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
5176 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
5177 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
5178 case 'd': type = AVMEDIA_TYPE_DATA; break;
5179 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
5180 case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
5181 default: av_assert0(0);
5183 if (*spec && *spec++ != ':') /* If we are not at the end, then another specifier must follow. */
5184 return AVERROR(EINVAL);
5186 #if FF_API_LAVF_AVCTX
5187 FF_DISABLE_DEPRECATION_WARNINGS
5188 if (type != st->codecpar->codec_type
5189 && (st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN || st->codec->codec_type != type))
5191 FF_ENABLE_DEPRECATION_WARNINGS
5193 if (type != st->codecpar->codec_type)
5196 if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
5198 } else if (*spec == 'p' && *(spec + 1) == ':') {
5203 prog_id = strtol(spec, &endptr, 0);
5204 /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
5205 if (spec == endptr || (*endptr && *endptr++ != ':'))
5206 return AVERROR(EINVAL);
5209 for (i = 0; i < s->nb_programs; i++) {
5210 if (s->programs[i]->id != prog_id)
5213 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++) {
5214 if (st->index == s->programs[i]->stream_index[j]) {
5217 *p = s->programs[i];
5226 } else if (*spec == '#' ||
5227 (*spec == 'i' && *(spec + 1) == ':')) {
5230 spec += 1 + (*spec == 'i');
5231 stream_id = strtol(spec, &endptr, 0);
5232 if (spec == endptr || *endptr) /* Disallow empty id and make sure we are at the end. */
5233 return AVERROR(EINVAL);
5234 return match && (stream_id == st->id);
5235 } else if (*spec == 'm' && *(spec + 1) == ':') {
5236 AVDictionaryEntry *tag;
5242 val = strchr(spec, ':');
5244 key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
5246 return AVERROR(ENOMEM);
5248 tag = av_dict_get(st->metadata, key, NULL, 0);
5250 if (!val || !strcmp(tag->value, val + 1))
5259 return match && ret;
5260 } else if (*spec == 'u' && *(spec + 1) == '\0') {
5261 AVCodecParameters *par = st->codecpar;
5262 #if FF_API_LAVF_AVCTX
5263 FF_DISABLE_DEPRECATION_WARNINGS
5264 AVCodecContext *codec = st->codec;
5265 FF_ENABLE_DEPRECATION_WARNINGS
5268 switch (par->codec_type) {
5269 case AVMEDIA_TYPE_AUDIO:
5270 val = par->sample_rate && par->channels;
5271 #if FF_API_LAVF_AVCTX
5272 val = val || (codec->sample_rate && codec->channels);
5274 if (par->format == AV_SAMPLE_FMT_NONE
5275 #if FF_API_LAVF_AVCTX
5276 && codec->sample_fmt == AV_SAMPLE_FMT_NONE
5281 case AVMEDIA_TYPE_VIDEO:
5282 val = par->width && par->height;
5283 #if FF_API_LAVF_AVCTX
5284 val = val || (codec->width && codec->height);
5286 if (par->format == AV_PIX_FMT_NONE
5287 #if FF_API_LAVF_AVCTX
5288 && codec->pix_fmt == AV_PIX_FMT_NONE
5293 case AVMEDIA_TYPE_UNKNOWN:
5300 #if FF_API_LAVF_AVCTX
5301 return match && ((par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0);
5303 return match && (par->codec_id != AV_CODEC_ID_NONE && val != 0);
5306 return AVERROR(EINVAL);
5314 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
5319 const char *indexptr = NULL;
5320 AVProgram *p = NULL;
5323 ret = match_stream_specifier(s, st, spec, &indexptr, &p);
5330 index = strtol(indexptr, &endptr, 0);
5331 if (*endptr) { /* We can't have anything after the requested index. */
5332 ret = AVERROR(EINVAL);
5336 /* This is not really needed but saves us a loop for simple stream index specifiers. */
5337 if (spec == indexptr)
5338 return (index == st->index);
5340 /* If we requested a matching stream index, we have to ensure st is that. */
5341 nb_streams = p ? p->nb_stream_indexes : s->nb_streams;
5342 for (int i = 0; i < nb_streams && index >= 0; i++) {
5343 AVStream *candidate = p ? s->streams[p->stream_index[i]] : s->streams[i];
5344 ret = match_stream_specifier(s, candidate, spec, NULL, NULL);
5347 if (ret > 0 && index-- == 0 && st == candidate)
5353 if (ret == AVERROR(EINVAL))
5354 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
5358 int ff_generate_avci_extradata(AVStream *st)
5360 static const uint8_t avci100_1080p_extradata[] = {
5362 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5363 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5364 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5365 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
5366 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
5367 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
5368 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
5369 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
5370 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5372 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5375 static const uint8_t avci100_1080i_extradata[] = {
5377 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5378 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5379 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5380 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
5381 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
5382 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
5383 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
5384 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
5385 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
5386 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
5387 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
5389 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5392 static const uint8_t avci50_1080p_extradata[] = {
5394 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5395 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5396 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5397 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5398 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5399 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
5400 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
5401 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
5402 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
5404 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5407 static const uint8_t avci50_1080i_extradata[] = {
5409 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5410 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5411 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5412 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
5413 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
5414 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
5415 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
5416 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
5417 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
5418 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
5419 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
5421 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5424 static const uint8_t avci100_720p_extradata[] = {
5426 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5427 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
5428 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
5429 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
5430 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
5431 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
5432 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
5433 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
5434 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
5435 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
5437 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
5440 static const uint8_t avci50_720p_extradata[] = {
5442 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
5443 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5444 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5445 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5446 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5447 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
5448 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
5449 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
5450 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
5452 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5456 const uint8_t *data = NULL;
5459 if (st->codecpar->width == 1920) {
5460 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5461 data = avci100_1080p_extradata;
5462 size = sizeof(avci100_1080p_extradata);
5464 data = avci100_1080i_extradata;
5465 size = sizeof(avci100_1080i_extradata);
5467 } else if (st->codecpar->width == 1440) {
5468 if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5469 data = avci50_1080p_extradata;
5470 size = sizeof(avci50_1080p_extradata);
5472 data = avci50_1080i_extradata;
5473 size = sizeof(avci50_1080i_extradata);
5475 } else if (st->codecpar->width == 1280) {
5476 data = avci100_720p_extradata;
5477 size = sizeof(avci100_720p_extradata);
5478 } else if (st->codecpar->width == 960) {
5479 data = avci50_720p_extradata;
5480 size = sizeof(avci50_720p_extradata);
5486 if ((ret = ff_alloc_extradata(st->codecpar, size)) < 0)
5488 memcpy(st->codecpar->extradata, data, size);
5493 uint8_t *av_stream_get_side_data(const AVStream *st,
5494 enum AVPacketSideDataType type, int *size)
5498 for (i = 0; i < st->nb_side_data; i++) {
5499 if (st->side_data[i].type == type) {
5501 *size = st->side_data[i].size;
5502 return st->side_data[i].data;
5508 int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
5509 uint8_t *data, size_t size)
5511 AVPacketSideData *sd, *tmp;
5514 for (i = 0; i < st->nb_side_data; i++) {
5515 sd = &st->side_data[i];
5517 if (sd->type == type) {
5518 av_freep(&sd->data);
5525 if ((unsigned)st->nb_side_data + 1 >= INT_MAX / sizeof(*st->side_data))
5526 return AVERROR(ERANGE);
5528 tmp = av_realloc(st->side_data, (st->nb_side_data + 1) * sizeof(*tmp));
5530 return AVERROR(ENOMEM);
5533 st->side_data = tmp;
5536 sd = &st->side_data[st->nb_side_data - 1];
5544 uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
5548 uint8_t *data = av_malloc(size);
5553 ret = av_stream_add_side_data(st, type, data, size);
5562 int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
5565 const AVBitStreamFilter *bsf;
5567 AVCodecParameters *in_par;
5569 if (!(bsf = av_bsf_get_by_name(name))) {
5570 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter '%s'\n", name);
5571 return AVERROR_BSF_NOT_FOUND;
5574 if ((ret = av_bsf_alloc(bsf, &bsfc)) < 0)
5577 if (st->internal->nb_bsfcs) {
5578 in_par = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->par_out;
5579 bsfc->time_base_in = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->time_base_out;
5581 in_par = st->codecpar;
5582 bsfc->time_base_in = st->time_base;
5585 if ((ret = avcodec_parameters_copy(bsfc->par_in, in_par)) < 0) {
5590 if (args && bsfc->filter->priv_class) {
5591 const AVOption *opt = av_opt_next(bsfc->priv_data, NULL);
5592 const char * shorthand[2] = {NULL};
5595 shorthand[0] = opt->name;
5597 if ((ret = av_opt_set_from_string(bsfc->priv_data, args, shorthand, "=", ":")) < 0) {
5603 if ((ret = av_bsf_init(bsfc)) < 0) {
5608 if ((ret = av_dynarray_add_nofree(&st->internal->bsfcs, &st->internal->nb_bsfcs, bsfc))) {
5613 av_log(NULL, AV_LOG_VERBOSE,
5614 "Automatically inserted bitstream filter '%s'; args='%s'\n",
5615 name, args ? args : "");
5620 FF_DISABLE_DEPRECATION_WARNINGS
5621 int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt,
5622 AVBitStreamFilterContext *bsfc)
5626 AVPacket new_pkt = *pkt;
5627 int a = av_bitstream_filter_filter(bsfc, codec, NULL,
5628 &new_pkt.data, &new_pkt.size,
5629 pkt->data, pkt->size,
5630 pkt->flags & AV_PKT_FLAG_KEY);
5631 if (a == 0 && new_pkt.size == 0 && new_pkt.side_data_elems == 0) {
5632 av_packet_unref(pkt);
5633 memset(pkt, 0, sizeof(*pkt));
5636 if(a == 0 && new_pkt.data != pkt->data) {
5637 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
5639 memcpy(t, new_pkt.data, new_pkt.size);
5640 memset(t + new_pkt.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
5645 a = AVERROR(ENOMEM);
5649 new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
5650 av_buffer_default_free, NULL, 0);
5652 pkt->side_data = NULL;
5653 pkt->side_data_elems = 0;
5654 av_packet_unref(pkt);
5656 av_freep(&new_pkt.data);
5657 a = AVERROR(ENOMEM);
5661 av_log(codec, AV_LOG_ERROR,
5662 "Failed to open bitstream filter %s for stream %d with codec %s",
5663 bsfc->filter->name, pkt->stream_index,
5664 codec->codec ? codec->codec->name : "copy");
5674 FF_ENABLE_DEPRECATION_WARNINGS
5677 int ff_format_output_open(AVFormatContext *s, const char *url, AVDictionary **options)
5680 return AVERROR(EINVAL);
5682 if (!(s->oformat->flags & AVFMT_NOFILE))
5683 return s->io_open(s, &s->pb, url, AVIO_FLAG_WRITE, options);
5687 void ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
5690 s->io_close(s, *pb);
5694 int ff_is_http_proto(char *filename) {
5695 const char *proto = avio_find_protocol_name(filename);
5696 return proto ? (!av_strcasecmp(proto, "http") || !av_strcasecmp(proto, "https")) : 0;
5699 int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
5701 AVDictionaryEntry *entry;
5702 int64_t parsed_timestamp;
5704 if ((entry = av_dict_get(s->metadata, "creation_time", NULL, 0))) {
5705 if ((ret = av_parse_time(&parsed_timestamp, entry->value, 0)) >= 0) {
5706 *timestamp = return_seconds ? parsed_timestamp / 1000000 : parsed_timestamp;
5709 av_log(s, AV_LOG_WARNING, "Failed to parse creation_time %s\n", entry->value);
5716 int ff_standardize_creation_time(AVFormatContext *s)
5719 int ret = ff_parse_creation_time_metadata(s, ×tamp, 0);
5721 return avpriv_dict_set_timestamp(&s->metadata, "creation_time", timestamp);
5725 int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette)
5730 side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &size);
5732 if (size != AVPALETTE_SIZE) {
5733 av_log(s, AV_LOG_ERROR, "Invalid palette side data\n");
5734 return AVERROR_INVALIDDATA;
5736 memcpy(palette, side_data, AVPALETTE_SIZE);
5740 if (ret == CONTAINS_PAL) {
5742 for (i = 0; i < AVPALETTE_COUNT; i++)
5743 palette[i] = AV_RL32(pkt->data + pkt->size - AVPALETTE_SIZE + i*4);
5750 int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf)
5755 ret = av_bprint_finalize(buf, &str);
5758 if (!av_bprint_is_complete(buf)) {
5760 return AVERROR(ENOMEM);
5763 par->extradata = str;
5764 /* Note: the string is NUL terminated (so extradata can be read as a
5765 * string), but the ending character is not accounted in the size (in
5766 * binary formats you are likely not supposed to mux that character). When
5767 * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE
5769 par->extradata_size = buf->len;
5773 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
5774 AVStream *ost, const AVStream *ist,
5775 enum AVTimebaseSource copy_tb)
5777 //TODO: use [io]st->internal->avctx
5778 const AVCodecContext *dec_ctx = ist->codec;
5779 AVCodecContext *enc_ctx = ost->codec;
5781 enc_ctx->time_base = ist->time_base;
5783 * Avi is a special case here because it supports variable fps but
5784 * having the fps and timebase differe significantly adds quite some
5787 if (!strcmp(ofmt->name, "avi")) {
5788 #if FF_API_R_FRAME_RATE
5789 if (copy_tb == AVFMT_TBCF_AUTO && ist->r_frame_rate.num
5790 && av_q2d(ist->r_frame_rate) >= av_q2d(ist->avg_frame_rate)
5791 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(ist->time_base)
5792 && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx->time_base)
5793 && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx->time_base) < 1.0/500
5794 || copy_tb == AVFMT_TBCF_R_FRAMERATE) {
5795 enc_ctx->time_base.num = ist->r_frame_rate.den;
5796 enc_ctx->time_base.den = 2*ist->r_frame_rate.num;
5797 enc_ctx->ticks_per_frame = 2;
5800 if (copy_tb == AVFMT_TBCF_AUTO && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > 2*av_q2d(ist->time_base)
5801 && av_q2d(ist->time_base) < 1.0/500
5802 || copy_tb == AVFMT_TBCF_DECODER) {
5803 enc_ctx->time_base = dec_ctx->time_base;
5804 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5805 enc_ctx->time_base.den *= 2;
5806 enc_ctx->ticks_per_frame = 2;
5808 } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS)
5809 && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
5810 if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx->time_base.den
5811 && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > av_q2d(ist->time_base)
5812 && av_q2d(ist->time_base) < 1.0/500
5813 || copy_tb == AVFMT_TBCF_DECODER) {
5814 enc_ctx->time_base = dec_ctx->time_base;
5815 enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5819 if ((enc_ctx->codec_tag == AV_RL32("tmcd") || ost->codecpar->codec_tag == AV_RL32("tmcd"))
5820 && dec_ctx->time_base.num < dec_ctx->time_base.den
5821 && dec_ctx->time_base.num > 0
5822 && 121LL*dec_ctx->time_base.num > dec_ctx->time_base.den) {
5823 enc_ctx->time_base = dec_ctx->time_base;
5826 if (ost->avg_frame_rate.num)
5827 enc_ctx->time_base = av_inv_q(ost->avg_frame_rate);
5829 av_reduce(&enc_ctx->time_base.num, &enc_ctx->time_base.den,
5830 enc_ctx->time_base.num, enc_ctx->time_base.den, INT_MAX);
5835 AVRational av_stream_get_codec_timebase(const AVStream *st)
5837 // See avformat_transfer_internal_stream_timing_info() TODO.
5838 #if FF_API_LAVF_AVCTX
5839 FF_DISABLE_DEPRECATION_WARNINGS
5840 return st->codec->time_base;
5841 FF_ENABLE_DEPRECATION_WARNINGS
5843 return st->internal->avctx->time_base;
5847 void ff_format_set_url(AVFormatContext *s, char *url)
5852 #if FF_API_FORMAT_FILENAME
5853 FF_DISABLE_DEPRECATION_WARNINGS
5854 av_strlcpy(s->filename, url, sizeof(s->filename));
5855 FF_ENABLE_DEPRECATION_WARNINGS