2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 #include "libavutil/avassert.h"
28 #include "libavutil/avstring.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/internal.h"
31 #include "libavutil/mathematics.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/parseutils.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/time.h"
36 #include "libavutil/timestamp.h"
38 #include "libavcodec/bytestream.h"
39 #include "libavcodec/internal.h"
40 #include "libavcodec/raw.h"
42 #include "audiointerleave.h"
44 #include "avio_internal.h"
54 #include "libavutil/ffversion.h"
55 const char av_format_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
59 * various utility functions for use within FFmpeg
62 unsigned avformat_version(void)
64 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
65 return LIBAVFORMAT_VERSION_INT;
68 const char *avformat_configuration(void)
70 return FFMPEG_CONFIGURATION;
73 const char *avformat_license(void)
75 #define LICENSE_PREFIX "libavformat license: "
76 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
79 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
81 static int is_relative(int64_t ts) {
82 return ts > (RELATIVE_TS_BASE - (1LL<<48));
86 * Wrap a given time stamp, if there is an indication for an overflow
89 * @param timestamp the time stamp to wrap
90 * @return resulting time stamp
92 static int64_t wrap_timestamp(AVStream *st, int64_t timestamp)
94 if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&
95 st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
96 if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
97 timestamp < st->pts_wrap_reference)
98 return timestamp + (1ULL << st->pts_wrap_bits);
99 else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
100 timestamp >= st->pts_wrap_reference)
101 return timestamp - (1ULL << st->pts_wrap_bits);
106 MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
107 MAKE_ACCESSORS(AVStream, stream, char *, recommended_encoder_configuration)
108 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, video_codec)
109 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, audio_codec)
110 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
111 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, data_codec)
112 MAKE_ACCESSORS(AVFormatContext, format, int, metadata_header_padding)
113 MAKE_ACCESSORS(AVFormatContext, format, void *, opaque)
114 MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb)
115 #if FF_API_OLD_OPEN_CALLBACKS
116 FF_DISABLE_DEPRECATION_WARNINGS
117 MAKE_ACCESSORS(AVFormatContext, format, AVOpenCallback, open_cb)
118 FF_ENABLE_DEPRECATION_WARNINGS
121 int64_t av_stream_get_end_pts(const AVStream *st)
124 return st->priv_pts->val;
126 return AV_NOPTS_VALUE;
129 struct AVCodecParserContext *av_stream_get_parser(const AVStream *st)
134 void av_format_inject_global_side_data(AVFormatContext *s)
137 s->internal->inject_global_side_data = 1;
138 for (i = 0; i < s->nb_streams; i++) {
139 AVStream *st = s->streams[i];
140 st->inject_global_side_data = 1;
144 int ff_copy_whitelists(AVFormatContext *dst, AVFormatContext *src)
146 av_assert0(!dst->codec_whitelist &&
147 !dst->format_whitelist &&
148 !dst->protocol_whitelist);
149 dst-> codec_whitelist = av_strdup(src->codec_whitelist);
150 dst->format_whitelist = av_strdup(src->format_whitelist);
151 dst->protocol_whitelist = av_strdup(src->protocol_whitelist);
152 if ( (src-> codec_whitelist && !dst-> codec_whitelist)
153 || (src-> format_whitelist && !dst-> format_whitelist)
154 || (src->protocol_whitelist && !dst->protocol_whitelist)) {
155 av_log(dst, AV_LOG_ERROR, "Failed to duplicate whitelist\n");
156 return AVERROR(ENOMEM);
161 static const AVCodec *find_decoder(AVFormatContext *s, AVStream *st, enum AVCodecID codec_id)
163 if (st->codec->codec)
164 return st->codec->codec;
166 switch (st->codec->codec_type) {
167 case AVMEDIA_TYPE_VIDEO:
168 if (s->video_codec) return s->video_codec;
170 case AVMEDIA_TYPE_AUDIO:
171 if (s->audio_codec) return s->audio_codec;
173 case AVMEDIA_TYPE_SUBTITLE:
174 if (s->subtitle_codec) return s->subtitle_codec;
178 return avcodec_find_decoder(codec_id);
181 int av_format_get_probe_score(const AVFormatContext *s)
183 return s->probe_score;
186 /* an arbitrarily chosen "sane" max packet size -- 50M */
187 #define SANE_CHUNK_SIZE (50000000)
189 int ffio_limit(AVIOContext *s, int size)
191 if (s->maxsize>= 0) {
192 int64_t remaining= s->maxsize - avio_tell(s);
193 if (remaining < size) {
194 int64_t newsize = avio_size(s);
195 if (!s->maxsize || s->maxsize<newsize)
196 s->maxsize = newsize - !newsize;
197 remaining= s->maxsize - avio_tell(s);
198 remaining= FFMAX(remaining, 0);
201 if (s->maxsize>= 0 && remaining+1 < size) {
202 av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
209 /* Read the data in sane-sized chunks and append to pkt.
210 * Return the number of bytes read or an error. */
211 static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
213 int64_t orig_pos = pkt->pos; // av_grow_packet might reset pos
214 int orig_size = pkt->size;
218 int prev_size = pkt->size;
221 /* When the caller requests a lot of data, limit it to the amount
222 * left in file or SANE_CHUNK_SIZE when it is not known. */
224 if (read_size > SANE_CHUNK_SIZE/10) {
225 read_size = ffio_limit(s, read_size);
226 // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
228 read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
231 ret = av_grow_packet(pkt, read_size);
235 ret = avio_read(s, pkt->data + prev_size, read_size);
236 if (ret != read_size) {
237 av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
244 pkt->flags |= AV_PKT_FLAG_CORRUPT;
248 av_packet_unref(pkt);
249 return pkt->size > orig_size ? pkt->size - orig_size : ret;
252 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
257 pkt->pos = avio_tell(s);
259 return append_packet_chunked(s, pkt, size);
262 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
265 return av_get_packet(s, pkt, size);
266 return append_packet_chunked(s, pkt, size);
269 int av_filename_number_test(const char *filename)
273 (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0);
276 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
279 static const struct {
282 enum AVMediaType type;
284 { "aac", AV_CODEC_ID_AAC, AVMEDIA_TYPE_AUDIO },
285 { "ac3", AV_CODEC_ID_AC3, AVMEDIA_TYPE_AUDIO },
286 { "dts", AV_CODEC_ID_DTS, AVMEDIA_TYPE_AUDIO },
287 { "dvbsub", AV_CODEC_ID_DVB_SUBTITLE,AVMEDIA_TYPE_SUBTITLE },
288 { "dvbtxt", AV_CODEC_ID_DVB_TELETEXT,AVMEDIA_TYPE_SUBTITLE },
289 { "eac3", AV_CODEC_ID_EAC3, AVMEDIA_TYPE_AUDIO },
290 { "h264", AV_CODEC_ID_H264, AVMEDIA_TYPE_VIDEO },
291 { "hevc", AV_CODEC_ID_HEVC, AVMEDIA_TYPE_VIDEO },
292 { "loas", AV_CODEC_ID_AAC_LATM, AVMEDIA_TYPE_AUDIO },
293 { "m4v", AV_CODEC_ID_MPEG4, AVMEDIA_TYPE_VIDEO },
294 { "mp3", AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO },
295 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
299 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
301 if (fmt && st->request_probe <= score) {
303 av_log(s, AV_LOG_DEBUG,
304 "Probe with size=%d, packets=%d detected %s with score=%d\n",
305 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets,
307 for (i = 0; fmt_id_type[i].name; i++) {
308 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
309 st->codec->codec_id = fmt_id_type[i].id;
310 st->codec->codec_type = fmt_id_type[i].type;
318 /************************************************************/
319 /* input media file */
321 int av_demuxer_open(AVFormatContext *ic) {
324 if (ic->format_whitelist && av_match_list(ic->iformat->name, ic->format_whitelist, ',') <= 0) {
325 av_log(ic, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", ic->format_whitelist);
326 return AVERROR(EINVAL);
329 if (ic->iformat->read_header) {
330 err = ic->iformat->read_header(ic);
335 if (ic->pb && !ic->internal->data_offset)
336 ic->internal->data_offset = avio_tell(ic->pb);
341 /* Open input file and probe the format if necessary. */
342 static int init_input(AVFormatContext *s, const char *filename,
343 AVDictionary **options)
346 AVProbeData pd = { filename, NULL, 0 };
347 int score = AVPROBE_SCORE_RETRY;
350 s->flags |= AVFMT_FLAG_CUSTOM_IO;
352 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
353 s, 0, s->format_probesize);
354 else if (s->iformat->flags & AVFMT_NOFILE)
355 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
356 "will be ignored with AVFMT_NOFILE format.\n");
360 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
361 (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
364 if ((ret = s->io_open(s, &s->pb, filename, AVIO_FLAG_READ | s->avio_flags, options)) < 0)
369 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
370 s, 0, s->format_probesize);
373 static int add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
374 AVPacketList **plast_pktl, int ref)
376 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
380 return AVERROR(ENOMEM);
383 if ((ret = av_packet_ref(&pktl->pkt, pkt)) < 0) {
392 (*plast_pktl)->next = pktl;
394 *packet_buffer = pktl;
396 /* Add the packet in the buffered packet list. */
401 int avformat_queue_attached_pictures(AVFormatContext *s)
404 for (i = 0; i < s->nb_streams; i++)
405 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
406 s->streams[i]->discard < AVDISCARD_ALL) {
407 if (s->streams[i]->attached_pic.size <= 0) {
408 av_log(s, AV_LOG_WARNING,
409 "Attached picture on stream %d has invalid size, "
414 ret = add_to_pktbuf(&s->internal->raw_packet_buffer,
415 &s->streams[i]->attached_pic,
416 &s->internal->raw_packet_buffer_end, 1);
423 int avformat_open_input(AVFormatContext **ps, const char *filename,
424 AVInputFormat *fmt, AVDictionary **options)
426 AVFormatContext *s = *ps;
428 AVDictionary *tmp = NULL;
429 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
431 if (!s && !(s = avformat_alloc_context()))
432 return AVERROR(ENOMEM);
434 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
435 return AVERROR(EINVAL);
441 av_dict_copy(&tmp, *options, 0);
443 if (s->pb) // must be before any goto fail
444 s->flags |= AVFMT_FLAG_CUSTOM_IO;
446 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
449 if ((ret = init_input(s, filename, &tmp)) < 0)
451 s->probe_score = ret;
453 if (!s->protocol_whitelist && s->pb && s->pb->protocol_whitelist) {
454 s->protocol_whitelist = av_strdup(s->pb->protocol_whitelist);
455 if (!s->protocol_whitelist) {
456 ret = AVERROR(ENOMEM);
461 if (s->format_whitelist && av_match_list(s->iformat->name, s->format_whitelist, ',') <= 0) {
462 av_log(s, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", s->format_whitelist);
463 ret = AVERROR(EINVAL);
467 avio_skip(s->pb, s->skip_initial_bytes);
469 /* Check filename in case an image number is expected. */
470 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
471 if (!av_filename_number_test(filename)) {
472 ret = AVERROR(EINVAL);
477 s->duration = s->start_time = AV_NOPTS_VALUE;
478 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
480 /* Allocate private data. */
481 if (s->iformat->priv_data_size > 0) {
482 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
483 ret = AVERROR(ENOMEM);
486 if (s->iformat->priv_class) {
487 *(const AVClass **) s->priv_data = s->iformat->priv_class;
488 av_opt_set_defaults(s->priv_data);
489 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
494 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
496 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, 0);
498 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
499 if ((ret = s->iformat->read_header(s)) < 0)
502 if (id3v2_extra_meta) {
503 if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
504 !strcmp(s->iformat->name, "tta")) {
505 if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
508 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
510 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
512 if ((ret = avformat_queue_attached_pictures(s)) < 0)
515 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
516 s->internal->data_offset = avio_tell(s->pb);
518 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
521 av_dict_free(options);
528 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
530 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
532 avformat_free_context(s);
537 /*******************************************************/
539 static void force_codec_ids(AVFormatContext *s, AVStream *st)
541 switch (st->codec->codec_type) {
542 case AVMEDIA_TYPE_VIDEO:
543 if (s->video_codec_id)
544 st->codec->codec_id = s->video_codec_id;
546 case AVMEDIA_TYPE_AUDIO:
547 if (s->audio_codec_id)
548 st->codec->codec_id = s->audio_codec_id;
550 case AVMEDIA_TYPE_SUBTITLE:
551 if (s->subtitle_codec_id)
552 st->codec->codec_id = s->subtitle_codec_id;
557 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
559 if (st->request_probe>0) {
560 AVProbeData *pd = &st->probe_data;
562 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
566 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
568 av_log(s, AV_LOG_WARNING,
569 "Failed to reallocate probe buffer for stream %d\n",
574 memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
575 pd->buf_size += pkt->size;
576 memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
579 st->probe_packets = 0;
581 av_log(s, AV_LOG_WARNING,
582 "nothing to probe for stream %d\n", st->index);
586 end= s->internal->raw_packet_buffer_remaining_size <= 0
587 || st->probe_packets<= 0;
589 if (end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
590 int score = set_codec_from_probe_data(s, st, pd);
591 if ( (st->codec->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
595 st->request_probe = -1;
596 if (st->codec->codec_id != AV_CODEC_ID_NONE) {
597 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
599 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
601 force_codec_ids(s, st);
607 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
609 int64_t ref = pkt->dts;
610 int i, pts_wrap_behavior;
611 int64_t pts_wrap_reference;
612 AVProgram *first_program;
614 if (ref == AV_NOPTS_VALUE)
616 if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
618 ref &= (1LL << st->pts_wrap_bits)-1;
620 // reference time stamp should be 60 s before first time stamp
621 pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
622 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
623 pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
624 (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
625 AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
627 first_program = av_find_program_from_stream(s, NULL, stream_index);
629 if (!first_program) {
630 int default_stream_index = av_find_default_stream_index(s);
631 if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
632 for (i = 0; i < s->nb_streams; i++) {
633 if (av_find_program_from_stream(s, NULL, i))
635 s->streams[i]->pts_wrap_reference = pts_wrap_reference;
636 s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
640 st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
641 st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
645 AVProgram *program = first_program;
647 if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
648 pts_wrap_reference = program->pts_wrap_reference;
649 pts_wrap_behavior = program->pts_wrap_behavior;
652 program = av_find_program_from_stream(s, program, stream_index);
655 // update every program with differing pts_wrap_reference
656 program = first_program;
658 if (program->pts_wrap_reference != pts_wrap_reference) {
659 for (i = 0; i<program->nb_stream_indexes; i++) {
660 s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
661 s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
664 program->pts_wrap_reference = pts_wrap_reference;
665 program->pts_wrap_behavior = pts_wrap_behavior;
667 program = av_find_program_from_stream(s, program, stream_index);
673 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
679 AVPacketList *pktl = s->internal->raw_packet_buffer;
683 st = s->streams[pkt->stream_index];
684 if (s->internal->raw_packet_buffer_remaining_size <= 0)
685 if ((err = probe_codec(s, st, NULL)) < 0)
687 if (st->request_probe <= 0) {
688 s->internal->raw_packet_buffer = pktl->next;
689 s->internal->raw_packet_buffer_remaining_size += pkt->size;
698 ret = s->iformat->read_packet(s, pkt);
700 /* Some demuxers return FFERROR_REDO when they consume
701 data and discard it (ignored streams, junk, extradata).
702 We must re-call the demuxer to get the real packet. */
703 if (ret == FFERROR_REDO)
705 if (!pktl || ret == AVERROR(EAGAIN))
707 for (i = 0; i < s->nb_streams; i++) {
709 if (st->probe_packets)
710 if ((err = probe_codec(s, st, NULL)) < 0)
712 av_assert0(st->request_probe <= 0);
718 AVPacket tmp = { 0 };
719 ret = av_packet_ref(&tmp, pkt);
725 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
726 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
727 av_log(s, AV_LOG_WARNING,
728 "Dropped corrupted packet (stream = %d)\n",
730 av_packet_unref(pkt);
734 if (pkt->stream_index >= (unsigned)s->nb_streams) {
735 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
739 st = s->streams[pkt->stream_index];
741 if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
742 // correct first time stamps to negative values
743 if (!is_relative(st->first_dts))
744 st->first_dts = wrap_timestamp(st, st->first_dts);
745 if (!is_relative(st->start_time))
746 st->start_time = wrap_timestamp(st, st->start_time);
747 if (!is_relative(st->cur_dts))
748 st->cur_dts = wrap_timestamp(st, st->cur_dts);
751 pkt->dts = wrap_timestamp(st, pkt->dts);
752 pkt->pts = wrap_timestamp(st, pkt->pts);
754 force_codec_ids(s, st);
756 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
757 if (s->use_wallclock_as_timestamps)
758 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
760 if (!pktl && st->request_probe <= 0)
763 err = add_to_pktbuf(&s->internal->raw_packet_buffer, pkt,
764 &s->internal->raw_packet_buffer_end, 0);
767 s->internal->raw_packet_buffer_remaining_size -= pkt->size;
769 if ((err = probe_codec(s, st, pkt)) < 0)
775 /**********************************************************/
777 static int determinable_frame_size(AVCodecContext *avctx)
779 if (/*avctx->codec_id == AV_CODEC_ID_AAC ||*/
780 avctx->codec_id == AV_CODEC_ID_MP1 ||
781 avctx->codec_id == AV_CODEC_ID_MP2 ||
782 avctx->codec_id == AV_CODEC_ID_MP3/* ||
783 avctx->codec_id == AV_CODEC_ID_CELT*/)
789 * Return the frame duration in seconds. Return 0 if not available.
791 void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
792 AVCodecParserContext *pc, AVPacket *pkt)
794 AVRational codec_framerate = s->iformat ? st->codec->framerate :
795 av_mul_q(av_inv_q(st->codec->time_base), (AVRational){1, st->codec->ticks_per_frame});
800 switch (st->codec->codec_type) {
801 case AVMEDIA_TYPE_VIDEO:
802 if (st->r_frame_rate.num && !pc && s->iformat) {
803 *pnum = st->r_frame_rate.den;
804 *pden = st->r_frame_rate.num;
805 } else if (st->time_base.num * 1000LL > st->time_base.den) {
806 *pnum = st->time_base.num;
807 *pden = st->time_base.den;
808 } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
809 av_assert0(st->codec->ticks_per_frame);
810 av_reduce(pnum, pden,
812 codec_framerate.num * (int64_t)st->codec->ticks_per_frame,
815 if (pc && pc->repeat_pict) {
816 av_assert0(s->iformat); // this may be wrong for interlaced encoding but its not used for that case
817 av_reduce(pnum, pden,
818 (*pnum) * (1LL + pc->repeat_pict),
822 /* If this codec can be interlaced or progressive then we need
823 * a parser to compute duration of a packet. Thus if we have
824 * no parser in such case leave duration undefined. */
825 if (st->codec->ticks_per_frame > 1 && !pc)
829 case AVMEDIA_TYPE_AUDIO:
830 frame_size = av_get_audio_frame_duration(st->codec, pkt->size);
831 if (frame_size <= 0 || st->codec->sample_rate <= 0)
834 *pden = st->codec->sample_rate;
841 static int is_intra_only(AVCodecContext *enc) {
842 const AVCodecDescriptor *desc;
844 if (enc->codec_type != AVMEDIA_TYPE_VIDEO)
847 desc = av_codec_get_codec_descriptor(enc);
849 desc = avcodec_descriptor_get(enc->codec_id);
850 av_codec_set_codec_descriptor(enc, desc);
853 return !!(desc->props & AV_CODEC_PROP_INTRA_ONLY);
857 static int has_decode_delay_been_guessed(AVStream *st)
859 if (st->codec->codec_id != AV_CODEC_ID_H264) return 1;
860 if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
862 #if CONFIG_H264_DECODER
863 if (st->codec->has_b_frames &&
864 avpriv_h264_has_num_reorder_frames(st->codec) == st->codec->has_b_frames)
867 if (st->codec->has_b_frames<3)
868 return st->nb_decoded_frames >= 7;
869 else if (st->codec->has_b_frames<4)
870 return st->nb_decoded_frames >= 18;
872 return st->nb_decoded_frames >= 20;
875 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
879 if (pktl == s->internal->packet_buffer_end)
880 return s->internal->parse_queue;
884 static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
885 int onein_oneout = st->codec->codec_id != AV_CODEC_ID_H264 &&
886 st->codec->codec_id != AV_CODEC_ID_HEVC;
889 int delay = st->codec->has_b_frames;
892 if (dts == AV_NOPTS_VALUE) {
893 int64_t best_score = INT64_MAX;
894 for (i = 0; i<delay; i++) {
895 if (st->pts_reorder_error_count[i]) {
896 int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
897 if (score < best_score) {
904 for (i = 0; i<delay; i++) {
905 if (pts_buffer[i] != AV_NOPTS_VALUE) {
906 int64_t diff = FFABS(pts_buffer[i] - dts)
907 + (uint64_t)st->pts_reorder_error[i];
908 diff = FFMAX(diff, st->pts_reorder_error[i]);
909 st->pts_reorder_error[i] = diff;
910 st->pts_reorder_error_count[i]++;
911 if (st->pts_reorder_error_count[i] > 250) {
912 st->pts_reorder_error[i] >>= 1;
913 st->pts_reorder_error_count[i] >>= 1;
920 if (dts == AV_NOPTS_VALUE)
926 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
927 int64_t dts, int64_t pts, AVPacket *pkt)
929 AVStream *st = s->streams[stream_index];
930 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
931 int64_t pts_buffer[MAX_REORDER_DELAY+1];
935 if (st->first_dts != AV_NOPTS_VALUE ||
936 dts == AV_NOPTS_VALUE ||
937 st->cur_dts == AV_NOPTS_VALUE ||
941 delay = st->codec->has_b_frames;
942 st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
944 shift = (uint64_t)st->first_dts - RELATIVE_TS_BASE;
946 for (i = 0; i<MAX_REORDER_DELAY+1; i++)
947 pts_buffer[i] = AV_NOPTS_VALUE;
949 if (is_relative(pts))
952 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
953 if (pktl->pkt.stream_index != stream_index)
955 if (is_relative(pktl->pkt.pts))
956 pktl->pkt.pts += shift;
958 if (is_relative(pktl->pkt.dts))
959 pktl->pkt.dts += shift;
961 if (st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
962 st->start_time = pktl->pkt.pts;
964 if (pktl->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)) {
965 pts_buffer[0] = pktl->pkt.pts;
966 for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
967 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
969 pktl->pkt.dts = select_from_pts_buffer(st, pts_buffer, pktl->pkt.dts);
973 if (st->start_time == AV_NOPTS_VALUE)
974 st->start_time = pts;
977 static void update_initial_durations(AVFormatContext *s, AVStream *st,
978 int stream_index, int duration)
980 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
981 int64_t cur_dts = RELATIVE_TS_BASE;
983 if (st->first_dts != AV_NOPTS_VALUE) {
984 if (st->update_initial_durations_done)
986 st->update_initial_durations_done = 1;
987 cur_dts = st->first_dts;
988 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
989 if (pktl->pkt.stream_index == stream_index) {
990 if (pktl->pkt.pts != pktl->pkt.dts ||
991 pktl->pkt.dts != AV_NOPTS_VALUE ||
997 if (pktl && pktl->pkt.dts != st->first_dts) {
998 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %"PRId64") in the queue\n",
999 av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
1003 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
1006 pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1007 st->first_dts = cur_dts;
1008 } else if (st->cur_dts != RELATIVE_TS_BASE)
1011 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1012 if (pktl->pkt.stream_index != stream_index)
1014 if (pktl->pkt.pts == pktl->pkt.dts &&
1015 (pktl->pkt.dts == AV_NOPTS_VALUE || pktl->pkt.dts == st->first_dts) &&
1016 !pktl->pkt.duration) {
1017 pktl->pkt.dts = cur_dts;
1018 if (!st->codec->has_b_frames)
1019 pktl->pkt.pts = cur_dts;
1020 // if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
1021 pktl->pkt.duration = duration;
1024 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
1027 st->cur_dts = cur_dts;
1030 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1031 AVCodecParserContext *pc, AVPacket *pkt,
1032 int64_t next_dts, int64_t next_pts)
1034 int num, den, presentation_delayed, delay, i;
1036 AVRational duration;
1037 int onein_oneout = st->codec->codec_id != AV_CODEC_ID_H264 &&
1038 st->codec->codec_id != AV_CODEC_ID_HEVC;
1040 if (s->flags & AVFMT_FLAG_NOFILLIN)
1043 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
1044 if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
1045 if (st->last_dts_for_order_check <= pkt->dts) {
1048 av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
1049 "DTS %"PRIi64" < %"PRIi64" out of order\n",
1051 st->last_dts_for_order_check);
1052 st->dts_misordered++;
1054 if (st->dts_ordered + st->dts_misordered > 250) {
1055 st->dts_ordered >>= 1;
1056 st->dts_misordered >>= 1;
1060 st->last_dts_for_order_check = pkt->dts;
1061 if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
1062 pkt->dts = AV_NOPTS_VALUE;
1065 if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1066 pkt->dts = AV_NOPTS_VALUE;
1068 if (pc && pc->pict_type == AV_PICTURE_TYPE_B
1069 && !st->codec->has_b_frames)
1070 //FIXME Set low_delay = 0 when has_b_frames = 1
1071 st->codec->has_b_frames = 1;
1073 /* do we have a video B-frame ? */
1074 delay = st->codec->has_b_frames;
1075 presentation_delayed = 0;
1077 /* XXX: need has_b_frame, but cannot get it if the codec is
1078 * not initialized */
1080 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1081 presentation_delayed = 1;
1083 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
1084 st->pts_wrap_bits < 63 &&
1085 pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
1086 if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
1087 pkt->dts -= 1LL << st->pts_wrap_bits;
1089 pkt->pts += 1LL << st->pts_wrap_bits;
1092 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1093 * We take the conservative approach and discard both.
1094 * Note: If this is misbehaving for an H.264 file, then possibly
1095 * presentation_delayed is not set correctly. */
1096 if (delay == 1 && pkt->dts == pkt->pts &&
1097 pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
1098 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1099 if ( strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
1100 && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1101 pkt->dts = AV_NOPTS_VALUE;
1104 duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
1105 if (pkt->duration == 0) {
1106 ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
1108 duration = (AVRational) {num, den};
1109 pkt->duration = av_rescale_rnd(1,
1110 num * (int64_t) st->time_base.den,
1111 den * (int64_t) st->time_base.num,
1116 if (pkt->duration != 0 && (s->internal->packet_buffer || s->internal->parse_queue))
1117 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1119 /* Correct timestamps with byte offset if demuxers only have timestamps
1120 * on packet boundaries */
1121 if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
1122 /* this will estimate bitrate based on this frame's duration and size */
1123 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1124 if (pkt->pts != AV_NOPTS_VALUE)
1126 if (pkt->dts != AV_NOPTS_VALUE)
1130 /* This may be redundant, but it should not hurt. */
1131 if (pkt->dts != AV_NOPTS_VALUE &&
1132 pkt->pts != AV_NOPTS_VALUE &&
1133 pkt->pts > pkt->dts)
1134 presentation_delayed = 1;
1136 if (s->debug & FF_FDEBUG_TS)
1137 av_log(s, AV_LOG_TRACE,
1138 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%"PRId64" delay:%d onein_oneout:%d\n",
1139 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
1140 pkt->stream_index, pc, pkt->duration, delay, onein_oneout);
1142 /* Interpolate PTS and DTS if they are not present. We skip H264
1143 * currently because delay and has_b_frames are not reliably set. */
1144 if ((delay == 0 || (delay == 1 && pc)) &&
1146 if (presentation_delayed) {
1147 /* DTS = decompression timestamp */
1148 /* PTS = presentation timestamp */
1149 if (pkt->dts == AV_NOPTS_VALUE)
1150 pkt->dts = st->last_IP_pts;
1151 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1152 if (pkt->dts == AV_NOPTS_VALUE)
1153 pkt->dts = st->cur_dts;
1155 /* This is tricky: the dts must be incremented by the duration
1156 * of the frame we are displaying, i.e. the last I- or P-frame. */
1157 if (st->last_IP_duration == 0)
1158 st->last_IP_duration = pkt->duration;
1159 if (pkt->dts != AV_NOPTS_VALUE)
1160 st->cur_dts = pkt->dts + st->last_IP_duration;
1161 if (pkt->dts != AV_NOPTS_VALUE &&
1162 pkt->pts == AV_NOPTS_VALUE &&
1163 st->last_IP_duration > 0 &&
1164 ((uint64_t)st->cur_dts - (uint64_t)next_dts + 1) <= 2 &&
1165 next_dts != next_pts &&
1166 next_pts != AV_NOPTS_VALUE)
1167 pkt->pts = next_dts;
1169 st->last_IP_duration = pkt->duration;
1170 st->last_IP_pts = pkt->pts;
1171 /* Cannot compute PTS if not present (we can compute it only
1172 * by knowing the future. */
1173 } else if (pkt->pts != AV_NOPTS_VALUE ||
1174 pkt->dts != AV_NOPTS_VALUE ||
1177 /* presentation is not delayed : PTS and DTS are the same */
1178 if (pkt->pts == AV_NOPTS_VALUE)
1179 pkt->pts = pkt->dts;
1180 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1182 if (pkt->pts == AV_NOPTS_VALUE)
1183 pkt->pts = st->cur_dts;
1184 pkt->dts = pkt->pts;
1185 if (pkt->pts != AV_NOPTS_VALUE)
1186 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
1190 if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)) {
1191 st->pts_buffer[0] = pkt->pts;
1192 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
1193 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
1195 pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
1197 // We skipped it above so we try here.
1199 // This should happen on the first packet
1200 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1201 if (pkt->dts > st->cur_dts)
1202 st->cur_dts = pkt->dts;
1204 if (s->debug & FF_FDEBUG_TS)
1205 av_log(s, AV_LOG_TRACE, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1206 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
1209 if (is_intra_only(st->codec))
1210 pkt->flags |= AV_PKT_FLAG_KEY;
1211 #if FF_API_CONVERGENCE_DURATION
1212 FF_DISABLE_DEPRECATION_WARNINGS
1214 pkt->convergence_duration = pc->convergence_duration;
1215 FF_ENABLE_DEPRECATION_WARNINGS
1219 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1222 AVPacketList *pktl = *pkt_buf;
1223 *pkt_buf = pktl->next;
1224 av_packet_unref(&pktl->pkt);
1227 *pkt_buf_end = NULL;
1231 * Parse a packet, add all split parts to parse_queue.
1233 * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
1235 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1237 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1238 AVStream *st = s->streams[stream_index];
1239 uint8_t *data = pkt ? pkt->data : NULL;
1240 int size = pkt ? pkt->size : 0;
1241 int ret = 0, got_output = 0;
1244 av_init_packet(&flush_pkt);
1247 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1248 // preserve 0-size sync packets
1249 compute_pkt_fields(s, st, st->parser, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1252 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1254 int64_t next_pts = pkt->pts;
1255 int64_t next_dts = pkt->dts;
1257 av_init_packet(&out_pkt);
1258 len = av_parser_parse2(st->parser, st->codec,
1259 &out_pkt.data, &out_pkt.size, data, size,
1260 pkt->pts, pkt->dts, pkt->pos);
1262 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1264 /* increment read pointer */
1268 got_output = !!out_pkt.size;
1273 if (pkt->side_data) {
1274 out_pkt.side_data = pkt->side_data;
1275 out_pkt.side_data_elems = pkt->side_data_elems;
1276 pkt->side_data = NULL;
1277 pkt->side_data_elems = 0;
1280 /* set the duration */
1281 out_pkt.duration = (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->duration : 0;
1282 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1283 if (st->codec->sample_rate > 0) {
1285 av_rescale_q_rnd(st->parser->duration,
1286 (AVRational) { 1, st->codec->sample_rate },
1292 out_pkt.stream_index = st->index;
1293 out_pkt.pts = st->parser->pts;
1294 out_pkt.dts = st->parser->dts;
1295 out_pkt.pos = st->parser->pos;
1297 if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1298 out_pkt.pos = st->parser->frame_offset;
1300 if (st->parser->key_frame == 1 ||
1301 (st->parser->key_frame == -1 &&
1302 st->parser->pict_type == AV_PICTURE_TYPE_I))
1303 out_pkt.flags |= AV_PKT_FLAG_KEY;
1305 if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1306 out_pkt.flags |= AV_PKT_FLAG_KEY;
1308 compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts);
1310 ret = add_to_pktbuf(&s->internal->parse_queue, &out_pkt,
1311 &s->internal->parse_queue_end, 1);
1312 av_packet_unref(&out_pkt);
1317 /* end of the stream => close and free the parser */
1318 if (pkt == &flush_pkt) {
1319 av_parser_close(st->parser);
1324 av_packet_unref(pkt);
1328 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1329 AVPacketList **pkt_buffer_end,
1333 av_assert0(*pkt_buffer);
1336 *pkt_buffer = pktl->next;
1338 *pkt_buffer_end = NULL;
1343 static int64_t ts_to_samples(AVStream *st, int64_t ts)
1345 return av_rescale(ts, st->time_base.num * st->codec->sample_rate, st->time_base.den);
1348 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1350 int ret = 0, i, got_packet = 0;
1351 AVDictionary *metadata = NULL;
1353 av_init_packet(pkt);
1355 while (!got_packet && !s->internal->parse_queue) {
1359 /* read next packet */
1360 ret = ff_read_packet(s, &cur_pkt);
1362 if (ret == AVERROR(EAGAIN))
1364 /* flush the parsers */
1365 for (i = 0; i < s->nb_streams; i++) {
1367 if (st->parser && st->need_parsing)
1368 parse_packet(s, NULL, st->index);
1370 /* all remaining packets are now in parse_queue =>
1371 * really terminate parsing */
1375 st = s->streams[cur_pkt.stream_index];
1377 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1378 cur_pkt.dts != AV_NOPTS_VALUE &&
1379 cur_pkt.pts < cur_pkt.dts) {
1380 av_log(s, AV_LOG_WARNING,
1381 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1382 cur_pkt.stream_index,
1383 av_ts2str(cur_pkt.pts),
1384 av_ts2str(cur_pkt.dts),
1387 if (s->debug & FF_FDEBUG_TS)
1388 av_log(s, AV_LOG_DEBUG,
1389 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"PRId64", flags=%d\n",
1390 cur_pkt.stream_index,
1391 av_ts2str(cur_pkt.pts),
1392 av_ts2str(cur_pkt.dts),
1393 cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
1395 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1396 st->parser = av_parser_init(st->codec->codec_id);
1398 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1399 "%s, packets or times may be invalid.\n",
1400 avcodec_get_name(st->codec->codec_id));
1401 /* no parser available: just output the raw packets */
1402 st->need_parsing = AVSTREAM_PARSE_NONE;
1403 } else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1404 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1405 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1406 st->parser->flags |= PARSER_FLAG_ONCE;
1407 else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1408 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1411 if (!st->need_parsing || !st->parser) {
1412 /* no parsing needed: we just output the packet as is */
1414 compute_pkt_fields(s, st, NULL, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1415 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1416 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1417 ff_reduce_index(s, st->index);
1418 av_add_index_entry(st, pkt->pos, pkt->dts,
1419 0, 0, AVINDEX_KEYFRAME);
1422 } else if (st->discard < AVDISCARD_ALL) {
1423 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1427 av_packet_unref(&cur_pkt);
1429 if (pkt->flags & AV_PKT_FLAG_KEY)
1430 st->skip_to_keyframe = 0;
1431 if (st->skip_to_keyframe) {
1432 av_packet_unref(&cur_pkt);
1440 if (!got_packet && s->internal->parse_queue)
1441 ret = read_from_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt);
1444 AVStream *st = s->streams[pkt->stream_index];
1445 int discard_padding = 0;
1446 if (st->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
1447 int64_t pts = pkt->pts - (is_relative(pkt->pts) ? RELATIVE_TS_BASE : 0);
1448 int64_t sample = ts_to_samples(st, pts);
1449 int duration = ts_to_samples(st, pkt->duration);
1450 int64_t end_sample = sample + duration;
1451 if (duration > 0 && end_sample >= st->first_discard_sample &&
1452 sample < st->last_discard_sample)
1453 discard_padding = FFMIN(end_sample - st->first_discard_sample, duration);
1455 if (st->start_skip_samples && (pkt->pts == 0 || pkt->pts == RELATIVE_TS_BASE))
1456 st->skip_samples = st->start_skip_samples;
1457 if (st->skip_samples || discard_padding) {
1458 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1460 AV_WL32(p, st->skip_samples);
1461 AV_WL32(p + 4, discard_padding);
1462 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d / discard %d\n", st->skip_samples, discard_padding);
1464 st->skip_samples = 0;
1467 if (st->inject_global_side_data) {
1468 for (i = 0; i < st->nb_side_data; i++) {
1469 AVPacketSideData *src_sd = &st->side_data[i];
1472 if (av_packet_get_side_data(pkt, src_sd->type, NULL))
1475 dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
1477 av_log(s, AV_LOG_WARNING, "Could not inject global side data\n");
1481 memcpy(dst_data, src_sd->data, src_sd->size);
1483 st->inject_global_side_data = 0;
1486 if (!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
1487 av_packet_merge_side_data(pkt);
1490 av_opt_get_dict_val(s, "metadata", AV_OPT_SEARCH_CHILDREN, &metadata);
1492 s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
1493 av_dict_copy(&s->metadata, metadata, 0);
1494 av_dict_free(&metadata);
1495 av_opt_set_dict_val(s, "metadata", NULL, AV_OPT_SEARCH_CHILDREN);
1498 if (s->debug & FF_FDEBUG_TS)
1499 av_log(s, AV_LOG_DEBUG,
1500 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1501 "size=%d, duration=%"PRId64", flags=%d\n",
1503 av_ts2str(pkt->pts),
1504 av_ts2str(pkt->dts),
1505 pkt->size, pkt->duration, pkt->flags);
1510 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1512 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1518 ret = s->internal->packet_buffer
1519 ? read_from_packet_buffer(&s->internal->packet_buffer,
1520 &s->internal->packet_buffer_end, pkt)
1521 : read_frame_internal(s, pkt);
1528 AVPacketList *pktl = s->internal->packet_buffer;
1531 AVPacket *next_pkt = &pktl->pkt;
1533 if (next_pkt->dts != AV_NOPTS_VALUE) {
1534 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1535 // last dts seen for this stream. if any of packets following
1536 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1537 int64_t last_dts = next_pkt->dts;
1538 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1539 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1540 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0)) {
1541 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) {
1543 next_pkt->pts = pktl->pkt.dts;
1545 if (last_dts != AV_NOPTS_VALUE) {
1546 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1547 last_dts = pktl->pkt.dts;
1552 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1553 // Fixing the last reference frame had none pts issue (For MXF etc).
1554 // We only do this when
1556 // 2. we are not able to resolve a pts value for current packet.
1557 // 3. the packets for this stream at the end of the files had valid dts.
1558 next_pkt->pts = last_dts + next_pkt->duration;
1560 pktl = s->internal->packet_buffer;
1563 /* read packet from packet buffer, if there is data */
1564 st = s->streams[next_pkt->stream_index];
1565 if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
1566 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1567 ret = read_from_packet_buffer(&s->internal->packet_buffer,
1568 &s->internal->packet_buffer_end, pkt);
1573 ret = read_frame_internal(s, pkt);
1575 if (pktl && ret != AVERROR(EAGAIN)) {
1582 ret = add_to_pktbuf(&s->internal->packet_buffer, pkt,
1583 &s->internal->packet_buffer_end, 1);
1584 av_packet_unref(pkt);
1591 st = s->streams[pkt->stream_index];
1592 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1593 ff_reduce_index(s, st->index);
1594 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1597 if (is_relative(pkt->dts))
1598 pkt->dts -= RELATIVE_TS_BASE;
1599 if (is_relative(pkt->pts))
1600 pkt->pts -= RELATIVE_TS_BASE;
1605 /* XXX: suppress the packet queue */
1606 static void flush_packet_queue(AVFormatContext *s)
1610 free_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end);
1611 free_packet_buffer(&s->internal->packet_buffer, &s->internal->packet_buffer_end);
1612 free_packet_buffer(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
1614 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1617 /*******************************************************/
1620 int av_find_default_stream_index(AVFormatContext *s)
1624 int best_stream = 0;
1625 int best_score = INT_MIN;
1627 if (s->nb_streams <= 0)
1629 for (i = 0; i < s->nb_streams; i++) {
1632 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1633 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
1635 if (st->codec->width && st->codec->height)
1639 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1640 if (st->codec->sample_rate)
1643 if (st->codec_info_nb_frames)
1646 if (st->discard != AVDISCARD_ALL)
1649 if (score > best_score) {
1657 /** Flush the frame reader. */
1658 void ff_read_frame_flush(AVFormatContext *s)
1663 flush_packet_queue(s);
1665 /* Reset read state for each stream. */
1666 for (i = 0; i < s->nb_streams; i++) {
1670 av_parser_close(st->parser);
1673 st->last_IP_pts = AV_NOPTS_VALUE;
1674 st->last_dts_for_order_check = AV_NOPTS_VALUE;
1675 if (st->first_dts == AV_NOPTS_VALUE)
1676 st->cur_dts = RELATIVE_TS_BASE;
1678 /* We set the current DTS to an unspecified origin. */
1679 st->cur_dts = AV_NOPTS_VALUE;
1681 st->probe_packets = MAX_PROBE_PACKETS;
1683 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1684 st->pts_buffer[j] = AV_NOPTS_VALUE;
1686 if (s->internal->inject_global_side_data)
1687 st->inject_global_side_data = 1;
1689 st->skip_samples = 0;
1693 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1697 for (i = 0; i < s->nb_streams; i++) {
1698 AVStream *st = s->streams[i];
1701 av_rescale(timestamp,
1702 st->time_base.den * (int64_t) ref_st->time_base.num,
1703 st->time_base.num * (int64_t) ref_st->time_base.den);
1707 void ff_reduce_index(AVFormatContext *s, int stream_index)
1709 AVStream *st = s->streams[stream_index];
1710 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1712 if ((unsigned) st->nb_index_entries >= max_entries) {
1714 for (i = 0; 2 * i < st->nb_index_entries; i++)
1715 st->index_entries[i] = st->index_entries[2 * i];
1716 st->nb_index_entries = i;
1720 int ff_add_index_entry(AVIndexEntry **index_entries,
1721 int *nb_index_entries,
1722 unsigned int *index_entries_allocated_size,
1723 int64_t pos, int64_t timestamp,
1724 int size, int distance, int flags)
1726 AVIndexEntry *entries, *ie;
1729 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1732 if (timestamp == AV_NOPTS_VALUE)
1733 return AVERROR(EINVAL);
1735 if (size < 0 || size > 0x3FFFFFFF)
1736 return AVERROR(EINVAL);
1738 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1739 timestamp -= RELATIVE_TS_BASE;
1741 entries = av_fast_realloc(*index_entries,
1742 index_entries_allocated_size,
1743 (*nb_index_entries + 1) *
1744 sizeof(AVIndexEntry));
1748 *index_entries = entries;
1750 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
1751 timestamp, AVSEEK_FLAG_ANY);
1754 index = (*nb_index_entries)++;
1755 ie = &entries[index];
1756 av_assert0(index == 0 || ie[-1].timestamp < timestamp);
1758 ie = &entries[index];
1759 if (ie->timestamp != timestamp) {
1760 if (ie->timestamp <= timestamp)
1762 memmove(entries + index + 1, entries + index,
1763 sizeof(AVIndexEntry) * (*nb_index_entries - index));
1764 (*nb_index_entries)++;
1765 } else if (ie->pos == pos && distance < ie->min_distance)
1766 // do not reduce the distance
1767 distance = ie->min_distance;
1771 ie->timestamp = timestamp;
1772 ie->min_distance = distance;
1779 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
1780 int size, int distance, int flags)
1782 timestamp = wrap_timestamp(st, timestamp);
1783 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1784 &st->index_entries_allocated_size, pos,
1785 timestamp, size, distance, flags);
1788 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1789 int64_t wanted_timestamp, int flags)
1797 // Optimize appending index entries at the end.
1798 if (b && entries[b - 1].timestamp < wanted_timestamp)
1803 timestamp = entries[m].timestamp;
1804 if (timestamp >= wanted_timestamp)
1806 if (timestamp <= wanted_timestamp)
1809 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1811 if (!(flags & AVSEEK_FLAG_ANY))
1812 while (m >= 0 && m < nb_entries &&
1813 !(entries[m].flags & AVINDEX_KEYFRAME))
1814 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1816 if (m == nb_entries)
1821 void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
1824 int64_t pos_delta = 0;
1826 //We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
1827 const char *proto = avio_find_protocol_name(s->filename);
1830 av_log(s, AV_LOG_INFO,
1831 "Protocol name not provided, cannot determine if input is local or "
1832 "a network protocol, buffers and access patterns cannot be configured "
1833 "optimally without knowing the protocol\n");
1836 if (proto && !(strcmp(proto, "file") && strcmp(proto, "pipe") && strcmp(proto, "cache")))
1839 for (ist1 = 0; ist1 < s->nb_streams; ist1++) {
1840 AVStream *st1 = s->streams[ist1];
1841 for (ist2 = 0; ist2 < s->nb_streams; ist2++) {
1842 AVStream *st2 = s->streams[ist2];
1848 for (i1 = i2 = 0; i1 < st1->nb_index_entries; i1++) {
1849 AVIndexEntry *e1 = &st1->index_entries[i1];
1850 int64_t e1_pts = av_rescale_q(e1->timestamp, st1->time_base, AV_TIME_BASE_Q);
1852 skip = FFMAX(skip, e1->size);
1853 for (; i2 < st2->nb_index_entries; i2++) {
1854 AVIndexEntry *e2 = &st2->index_entries[i2];
1855 int64_t e2_pts = av_rescale_q(e2->timestamp, st2->time_base, AV_TIME_BASE_Q);
1856 if (e2_pts - e1_pts < time_tolerance)
1858 pos_delta = FFMAX(pos_delta, e1->pos - e2->pos);
1866 /* XXX This could be adjusted depending on protocol*/
1867 if (s->pb->buffer_size < pos_delta && pos_delta < (1<<24)) {
1868 av_log(s, AV_LOG_VERBOSE, "Reconfiguring buffers to size %"PRId64"\n", pos_delta);
1869 ffio_set_buf_size(s->pb, pos_delta);
1870 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, pos_delta/2);
1873 if (skip < (1<<23)) {
1874 s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, skip);
1878 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
1880 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1881 wanted_timestamp, flags);
1884 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
1885 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1887 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
1888 if (stream_index >= 0)
1889 ts = wrap_timestamp(s->streams[stream_index], ts);
1893 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
1894 int64_t target_ts, int flags)
1896 AVInputFormat *avif = s->iformat;
1897 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1898 int64_t ts_min, ts_max, ts;
1903 if (stream_index < 0)
1906 av_log(s, AV_LOG_TRACE, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1909 ts_min = AV_NOPTS_VALUE;
1910 pos_limit = -1; // GCC falsely says it may be uninitialized.
1912 st = s->streams[stream_index];
1913 if (st->index_entries) {
1916 /* FIXME: Whole function must be checked for non-keyframe entries in
1917 * index case, especially read_timestamp(). */
1918 index = av_index_search_timestamp(st, target_ts,
1919 flags | AVSEEK_FLAG_BACKWARD);
1920 index = FFMAX(index, 0);
1921 e = &st->index_entries[index];
1923 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
1925 ts_min = e->timestamp;
1926 av_log(s, AV_LOG_TRACE, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
1927 pos_min, av_ts2str(ts_min));
1929 av_assert1(index == 0);
1932 index = av_index_search_timestamp(st, target_ts,
1933 flags & ~AVSEEK_FLAG_BACKWARD);
1934 av_assert0(index < st->nb_index_entries);
1936 e = &st->index_entries[index];
1937 av_assert1(e->timestamp >= target_ts);
1939 ts_max = e->timestamp;
1940 pos_limit = pos_max - e->min_distance;
1941 av_log(s, AV_LOG_TRACE, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
1942 " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
1946 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
1947 ts_min, ts_max, flags, &ts, avif->read_timestamp);
1952 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1955 ff_read_frame_flush(s);
1956 ff_update_cur_dts(s, st, ts);
1961 int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
1962 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1964 int64_t step = 1024;
1965 int64_t limit, ts_max;
1966 int64_t filesize = avio_size(s->pb);
1967 int64_t pos_max = filesize - 1;
1970 pos_max = FFMAX(0, (pos_max) - step);
1971 ts_max = ff_read_timestamp(s, stream_index,
1972 &pos_max, limit, read_timestamp);
1974 } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
1975 if (ts_max == AV_NOPTS_VALUE)
1979 int64_t tmp_pos = pos_max + 1;
1980 int64_t tmp_ts = ff_read_timestamp(s, stream_index,
1981 &tmp_pos, INT64_MAX, read_timestamp);
1982 if (tmp_ts == AV_NOPTS_VALUE)
1984 av_assert0(tmp_pos > pos_max);
1987 if (tmp_pos >= filesize)
1999 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
2000 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
2001 int64_t ts_min, int64_t ts_max,
2002 int flags, int64_t *ts_ret,
2003 int64_t (*read_timestamp)(struct AVFormatContext *, int,
2004 int64_t *, int64_t))
2011 av_log(s, AV_LOG_TRACE, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2013 if (ts_min == AV_NOPTS_VALUE) {
2014 pos_min = s->internal->data_offset;
2015 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2016 if (ts_min == AV_NOPTS_VALUE)
2020 if (ts_min >= target_ts) {
2025 if (ts_max == AV_NOPTS_VALUE) {
2026 if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
2028 pos_limit = pos_max;
2031 if (ts_max <= target_ts) {
2036 av_assert0(ts_min < ts_max);
2039 while (pos_min < pos_limit) {
2040 av_log(s, AV_LOG_TRACE,
2041 "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
2042 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
2043 av_assert0(pos_limit <= pos_max);
2045 if (no_change == 0) {
2046 int64_t approximate_keyframe_distance = pos_max - pos_limit;
2047 // interpolate position (better than dichotomy)
2048 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
2050 pos_min - approximate_keyframe_distance;
2051 } else if (no_change == 1) {
2052 // bisection if interpolation did not change min / max pos last time
2053 pos = (pos_min + pos_limit) >> 1;
2055 /* linear search if bisection failed, can only happen if there
2056 * are very few or no keyframes between min/max */
2061 else if (pos > pos_limit)
2065 // May pass pos_limit instead of -1.
2066 ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
2071 av_log(s, AV_LOG_TRACE, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
2072 " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
2073 pos_min, pos, pos_max,
2074 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
2075 pos_limit, start_pos, no_change);
2076 if (ts == AV_NOPTS_VALUE) {
2077 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
2080 if (target_ts <= ts) {
2081 pos_limit = start_pos - 1;
2085 if (target_ts >= ts) {
2091 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
2092 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
2095 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2097 ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2098 av_log(s, AV_LOG_TRACE, "pos=0x%"PRIx64" %s<=%s<=%s\n",
2099 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
2105 static int seek_frame_byte(AVFormatContext *s, int stream_index,
2106 int64_t pos, int flags)
2108 int64_t pos_min, pos_max;
2110 pos_min = s->internal->data_offset;
2111 pos_max = avio_size(s->pb) - 1;
2115 else if (pos > pos_max)
2118 avio_seek(s->pb, pos, SEEK_SET);
2120 s->io_repositioned = 1;
2125 static int seek_frame_generic(AVFormatContext *s, int stream_index,
2126 int64_t timestamp, int flags)
2133 st = s->streams[stream_index];
2135 index = av_index_search_timestamp(st, timestamp, flags);
2137 if (index < 0 && st->nb_index_entries &&
2138 timestamp < st->index_entries[0].timestamp)
2141 if (index < 0 || index == st->nb_index_entries - 1) {
2145 if (st->nb_index_entries) {
2146 av_assert0(st->index_entries);
2147 ie = &st->index_entries[st->nb_index_entries - 1];
2148 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2150 ff_update_cur_dts(s, st, ie->timestamp);
2152 if ((ret = avio_seek(s->pb, s->internal->data_offset, SEEK_SET)) < 0)
2158 read_status = av_read_frame(s, &pkt);
2159 } while (read_status == AVERROR(EAGAIN));
2160 if (read_status < 0)
2162 if (stream_index == pkt.stream_index && pkt.dts > timestamp) {
2163 if (pkt.flags & AV_PKT_FLAG_KEY) {
2164 av_packet_unref(&pkt);
2167 if (nonkey++ > 1000 && st->codec->codec_id != AV_CODEC_ID_CDGRAPHICS) {
2168 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);
2169 av_packet_unref(&pkt);
2173 av_packet_unref(&pkt);
2175 index = av_index_search_timestamp(st, timestamp, flags);
2180 ff_read_frame_flush(s);
2181 if (s->iformat->read_seek)
2182 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2184 ie = &st->index_entries[index];
2185 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2187 ff_update_cur_dts(s, st, ie->timestamp);
2192 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2193 int64_t timestamp, int flags)
2198 if (flags & AVSEEK_FLAG_BYTE) {
2199 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2201 ff_read_frame_flush(s);
2202 return seek_frame_byte(s, stream_index, timestamp, flags);
2205 if (stream_index < 0) {
2206 stream_index = av_find_default_stream_index(s);
2207 if (stream_index < 0)
2210 st = s->streams[stream_index];
2211 /* timestamp for default must be expressed in AV_TIME_BASE units */
2212 timestamp = av_rescale(timestamp, st->time_base.den,
2213 AV_TIME_BASE * (int64_t) st->time_base.num);
2216 /* first, we try the format specific seek */
2217 if (s->iformat->read_seek) {
2218 ff_read_frame_flush(s);
2219 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2225 if (s->iformat->read_timestamp &&
2226 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2227 ff_read_frame_flush(s);
2228 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2229 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2230 ff_read_frame_flush(s);
2231 return seek_frame_generic(s, stream_index, timestamp, flags);
2236 int av_seek_frame(AVFormatContext *s, int stream_index,
2237 int64_t timestamp, int flags)
2241 if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2242 int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2243 if ((flags & AVSEEK_FLAG_BACKWARD))
2247 return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2248 flags & ~AVSEEK_FLAG_BACKWARD);
2251 ret = seek_frame_internal(s, stream_index, timestamp, flags);
2254 ret = avformat_queue_attached_pictures(s);
2259 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
2260 int64_t ts, int64_t max_ts, int flags)
2262 if (min_ts > ts || max_ts < ts)
2264 if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2265 return AVERROR(EINVAL);
2268 flags |= AVSEEK_FLAG_ANY;
2269 flags &= ~AVSEEK_FLAG_BACKWARD;
2271 if (s->iformat->read_seek2) {
2273 ff_read_frame_flush(s);
2275 if (stream_index == -1 && s->nb_streams == 1) {
2276 AVRational time_base = s->streams[0]->time_base;
2277 ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2278 min_ts = av_rescale_rnd(min_ts, time_base.den,
2279 time_base.num * (int64_t)AV_TIME_BASE,
2280 AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
2281 max_ts = av_rescale_rnd(max_ts, time_base.den,
2282 time_base.num * (int64_t)AV_TIME_BASE,
2283 AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
2286 ret = s->iformat->read_seek2(s, stream_index, min_ts,
2290 ret = avformat_queue_attached_pictures(s);
2294 if (s->iformat->read_timestamp) {
2295 // try to seek via read_timestamp()
2298 // Fall back on old API if new is not implemented but old is.
2299 // Note the old API has somewhat different semantics.
2300 if (s->iformat->read_seek || 1) {
2301 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2302 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2303 if (ret<0 && ts != min_ts && max_ts != ts) {
2304 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2306 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2311 // try some generic seek like seek_frame_generic() but with new ts semantics
2312 return -1; //unreachable
2315 int avformat_flush(AVFormatContext *s)
2317 ff_read_frame_flush(s);
2321 /*******************************************************/
2324 * Return TRUE if the stream has accurate duration in any stream.
2326 * @return TRUE if the stream has accurate duration for at least one component.
2328 static int has_duration(AVFormatContext *ic)
2333 for (i = 0; i < ic->nb_streams; i++) {
2334 st = ic->streams[i];
2335 if (st->duration != AV_NOPTS_VALUE)
2338 if (ic->duration != AV_NOPTS_VALUE)
2344 * Estimate the stream timings from the one of each components.
2346 * Also computes the global bitrate if possible.
2348 static void update_stream_timings(AVFormatContext *ic)
2350 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
2351 int64_t duration, duration1, filesize;
2356 start_time = INT64_MAX;
2357 start_time_text = INT64_MAX;
2358 end_time = INT64_MIN;
2359 duration = INT64_MIN;
2360 for (i = 0; i < ic->nb_streams; i++) {
2361 st = ic->streams[i];
2362 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2363 start_time1 = av_rescale_q(st->start_time, st->time_base,
2365 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codec->codec_type == AVMEDIA_TYPE_DATA) {
2366 if (start_time1 < start_time_text)
2367 start_time_text = start_time1;
2369 start_time = FFMIN(start_time, start_time1);
2370 end_time1 = av_rescale_q_rnd(st->duration, st->time_base,
2372 AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
2373 if (end_time1 != AV_NOPTS_VALUE) {
2374 end_time1 += start_time1;
2375 end_time = FFMAX(end_time, end_time1);
2377 for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
2378 if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2379 p->start_time = start_time1;
2380 if (p->end_time < end_time1)
2381 p->end_time = end_time1;
2384 if (st->duration != AV_NOPTS_VALUE) {
2385 duration1 = av_rescale_q(st->duration, st->time_base,
2387 duration = FFMAX(duration, duration1);
2390 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2391 start_time = start_time_text;
2392 else if (start_time > start_time_text)
2393 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2395 if (start_time != INT64_MAX) {
2396 ic->start_time = start_time;
2397 if (end_time != INT64_MIN) {
2398 if (ic->nb_programs) {
2399 for (i = 0; i < ic->nb_programs; i++) {
2400 p = ic->programs[i];
2401 if (p->start_time != AV_NOPTS_VALUE && p->end_time > p->start_time)
2402 duration = FFMAX(duration, p->end_time - p->start_time);
2405 duration = FFMAX(duration, end_time - start_time);
2408 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2409 ic->duration = duration;
2411 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
2412 /* compute the bitrate */
2413 double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2414 (double) ic->duration;
2415 if (bitrate >= 0 && bitrate <= INT64_MAX)
2416 ic->bit_rate = bitrate;
2420 static void fill_all_stream_timings(AVFormatContext *ic)
2425 update_stream_timings(ic);
2426 for (i = 0; i < ic->nb_streams; i++) {
2427 st = ic->streams[i];
2428 if (st->start_time == AV_NOPTS_VALUE) {
2429 if (ic->start_time != AV_NOPTS_VALUE)
2430 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
2432 if (ic->duration != AV_NOPTS_VALUE)
2433 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
2439 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2441 int64_t filesize, duration;
2442 int i, show_warning = 0;
2445 /* if bit_rate is already set, we believe it */
2446 if (ic->bit_rate <= 0) {
2448 for (i = 0; i < ic->nb_streams; i++) {
2449 st = ic->streams[i];
2450 if (st->codec->bit_rate > 0) {
2451 if (INT_MAX - st->codec->bit_rate < bit_rate) {
2455 bit_rate += st->codec->bit_rate;
2456 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && st->codec_info_nb_frames > 1) {
2457 // If we have a videostream with packets but without a bitrate
2458 // then consider the sum not known
2463 ic->bit_rate = bit_rate;
2466 /* if duration is already set, we believe it */
2467 if (ic->duration == AV_NOPTS_VALUE &&
2468 ic->bit_rate != 0) {
2469 filesize = ic->pb ? avio_size(ic->pb) : 0;
2470 if (filesize > ic->internal->data_offset) {
2471 filesize -= ic->internal->data_offset;
2472 for (i = 0; i < ic->nb_streams; i++) {
2473 st = ic->streams[i];
2474 if ( st->time_base.num <= INT64_MAX / ic->bit_rate
2475 && st->duration == AV_NOPTS_VALUE) {
2476 duration = av_rescale(8 * filesize, st->time_base.den,
2478 (int64_t) st->time_base.num);
2479 st->duration = duration;
2486 av_log(ic, AV_LOG_WARNING,
2487 "Estimating duration from bitrate, this may be inaccurate\n");
2490 #define DURATION_MAX_READ_SIZE 250000LL
2491 #define DURATION_MAX_RETRY 6
2493 /* only usable for MPEG-PS streams */
2494 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2496 AVPacket pkt1, *pkt = &pkt1;
2498 int num, den, read_size, i, ret;
2499 int found_duration = 0;
2501 int64_t filesize, offset, duration;
2504 /* flush packet queue */
2505 flush_packet_queue(ic);
2507 for (i = 0; i < ic->nb_streams; i++) {
2508 st = ic->streams[i];
2509 if (st->start_time == AV_NOPTS_VALUE &&
2510 st->first_dts == AV_NOPTS_VALUE &&
2511 st->codec->codec_type != AVMEDIA_TYPE_UNKNOWN)
2512 av_log(st->codec, AV_LOG_WARNING,
2513 "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2516 av_parser_close(st->parser);
2521 av_opt_set(ic, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN);
2522 /* estimate the end time (duration) */
2523 /* XXX: may need to support wrapping */
2524 filesize = ic->pb ? avio_size(ic->pb) : 0;
2526 is_end = found_duration;
2527 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
2531 avio_seek(ic->pb, offset, SEEK_SET);
2534 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
2538 ret = ff_read_packet(ic, pkt);
2539 } while (ret == AVERROR(EAGAIN));
2542 read_size += pkt->size;
2543 st = ic->streams[pkt->stream_index];
2544 if (pkt->pts != AV_NOPTS_VALUE &&
2545 (st->start_time != AV_NOPTS_VALUE ||
2546 st->first_dts != AV_NOPTS_VALUE)) {
2547 if (pkt->duration == 0) {
2548 ff_compute_frame_duration(ic, &num, &den, st, st->parser, pkt);
2550 pkt->duration = av_rescale_rnd(1,
2551 num * (int64_t) st->time_base.den,
2552 den * (int64_t) st->time_base.num,
2556 duration = pkt->pts + pkt->duration;
2558 if (st->start_time != AV_NOPTS_VALUE)
2559 duration -= st->start_time;
2561 duration -= st->first_dts;
2563 if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
2564 (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2565 st->duration = duration;
2566 st->info->last_duration = duration;
2569 av_packet_unref(pkt);
2572 /* check if all audio/video streams have valid duration */
2575 for (i = 0; i < ic->nb_streams; i++) {
2576 st = ic->streams[i];
2577 switch (st->codec->codec_type) {
2578 case AVMEDIA_TYPE_VIDEO:
2579 case AVMEDIA_TYPE_AUDIO:
2580 if (st->duration == AV_NOPTS_VALUE)
2587 ++retry <= DURATION_MAX_RETRY);
2589 av_opt_set(ic, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN);
2591 /* warn about audio/video streams which duration could not be estimated */
2592 for (i = 0; i < ic->nb_streams; i++) {
2593 st = ic->streams[i];
2594 if (st->duration == AV_NOPTS_VALUE) {
2595 switch (st->codec->codec_type) {
2596 case AVMEDIA_TYPE_VIDEO:
2597 case AVMEDIA_TYPE_AUDIO:
2598 if (st->start_time != AV_NOPTS_VALUE || st->first_dts != AV_NOPTS_VALUE) {
2599 av_log(ic, AV_LOG_DEBUG, "stream %d : no PTS found at end of file, duration not set\n", i);
2601 av_log(ic, AV_LOG_DEBUG, "stream %d : no TS found at start of file, duration not set\n", i);
2605 fill_all_stream_timings(ic);
2607 avio_seek(ic->pb, old_offset, SEEK_SET);
2608 for (i = 0; i < ic->nb_streams; i++) {
2611 st = ic->streams[i];
2612 st->cur_dts = st->first_dts;
2613 st->last_IP_pts = AV_NOPTS_VALUE;
2614 st->last_dts_for_order_check = AV_NOPTS_VALUE;
2615 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
2616 st->pts_buffer[j] = AV_NOPTS_VALUE;
2620 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2624 /* get the file size, if possible */
2625 if (ic->iformat->flags & AVFMT_NOFILE) {
2628 file_size = avio_size(ic->pb);
2629 file_size = FFMAX(0, file_size);
2632 if ((!strcmp(ic->iformat->name, "mpeg") ||
2633 !strcmp(ic->iformat->name, "mpegts")) &&
2634 file_size && ic->pb->seekable) {
2635 /* get accurate estimate from the PTSes */
2636 estimate_timings_from_pts(ic, old_offset);
2637 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2638 } else if (has_duration(ic)) {
2639 /* at least one component has timings - we use them for all
2641 fill_all_stream_timings(ic);
2642 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2644 /* less precise: use bitrate info */
2645 estimate_timings_from_bit_rate(ic);
2646 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2648 update_stream_timings(ic);
2652 AVStream av_unused *st;
2653 for (i = 0; i < ic->nb_streams; i++) {
2654 st = ic->streams[i];
2655 av_log(ic, AV_LOG_TRACE, "%d: start_time: %0.3f duration: %0.3f\n", i,
2656 (double) st->start_time / AV_TIME_BASE,
2657 (double) st->duration / AV_TIME_BASE);
2659 av_log(ic, AV_LOG_TRACE,
2660 "stream: start_time: %0.3f duration: %0.3f bitrate=%"PRId64" kb/s\n",
2661 (double) ic->start_time / AV_TIME_BASE,
2662 (double) ic->duration / AV_TIME_BASE,
2663 (int64_t)ic->bit_rate / 1000);
2667 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2669 AVCodecContext *avctx = st->codec;
2671 #define FAIL(errmsg) do { \
2673 *errmsg_ptr = errmsg; \
2677 if ( avctx->codec_id == AV_CODEC_ID_NONE
2678 && avctx->codec_type != AVMEDIA_TYPE_DATA)
2679 FAIL("unknown codec");
2680 switch (avctx->codec_type) {
2681 case AVMEDIA_TYPE_AUDIO:
2682 if (!avctx->frame_size && determinable_frame_size(avctx))
2683 FAIL("unspecified frame size");
2684 if (st->info->found_decoder >= 0 &&
2685 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2686 FAIL("unspecified sample format");
2687 if (!avctx->sample_rate)
2688 FAIL("unspecified sample rate");
2689 if (!avctx->channels)
2690 FAIL("unspecified number of channels");
2691 if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
2692 FAIL("no decodable DTS frames");
2694 case AVMEDIA_TYPE_VIDEO:
2696 FAIL("unspecified size");
2697 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
2698 FAIL("unspecified pixel format");
2699 if (st->codec->codec_id == AV_CODEC_ID_RV30 || st->codec->codec_id == AV_CODEC_ID_RV40)
2700 if (!st->sample_aspect_ratio.num && !st->codec->sample_aspect_ratio.num && !st->codec_info_nb_frames)
2701 FAIL("no frame in rv30/40 and no sar");
2703 case AVMEDIA_TYPE_SUBTITLE:
2704 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
2705 FAIL("unspecified size");
2707 case AVMEDIA_TYPE_DATA:
2708 if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
2714 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2715 static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
2716 AVDictionary **options)
2718 const AVCodec *codec;
2719 int got_picture = 1, ret = 0;
2720 AVFrame *frame = av_frame_alloc();
2721 AVSubtitle subtitle;
2722 AVPacket pkt = *avpkt;
2723 int do_skip_frame = 0;
2724 enum AVDiscard skip_frame;
2727 return AVERROR(ENOMEM);
2729 if (!avcodec_is_open(st->codec) &&
2730 st->info->found_decoder <= 0 &&
2731 (st->codec->codec_id != -st->info->found_decoder || !st->codec->codec_id)) {
2732 AVDictionary *thread_opt = NULL;
2734 codec = find_decoder(s, st, st->codec->codec_id);
2737 st->info->found_decoder = -st->codec->codec_id;
2742 /* Force thread count to 1 since the H.264 decoder will not extract
2743 * SPS and PPS to extradata during multi-threaded decoding. */
2744 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2745 if (s->codec_whitelist)
2746 av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
2747 ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
2749 av_dict_free(&thread_opt);
2751 st->info->found_decoder = -st->codec->codec_id;
2754 st->info->found_decoder = 1;
2755 } else if (!st->info->found_decoder)
2756 st->info->found_decoder = 1;
2758 if (st->info->found_decoder < 0) {
2763 if (st->codec->codec->caps_internal & FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM) {
2765 skip_frame = st->codec->skip_frame;
2766 st->codec->skip_frame = AVDISCARD_ALL;
2769 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2771 (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
2772 (!st->codec_info_nb_frames &&
2773 (st->codec->codec->capabilities & AV_CODEC_CAP_CHANNEL_CONF)))) {
2775 switch (st->codec->codec_type) {
2776 case AVMEDIA_TYPE_VIDEO:
2777 ret = avcodec_decode_video2(st->codec, frame,
2778 &got_picture, &pkt);
2780 case AVMEDIA_TYPE_AUDIO:
2781 ret = avcodec_decode_audio4(st->codec, frame, &got_picture, &pkt);
2783 case AVMEDIA_TYPE_SUBTITLE:
2784 ret = avcodec_decode_subtitle2(st->codec, &subtitle,
2785 &got_picture, &pkt);
2793 st->nb_decoded_frames++;
2800 if (!pkt.data && !got_picture)
2804 if (do_skip_frame) {
2805 st->codec->skip_frame = skip_frame;
2808 av_frame_free(&frame);
2812 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
2814 while (tags->id != AV_CODEC_ID_NONE) {
2822 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2825 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
2826 if (tag == tags[i].tag)
2828 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
2829 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2831 return AV_CODEC_ID_NONE;
2834 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
2839 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
2841 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
2843 return AV_CODEC_ID_NONE;
2848 if (sflags & (1 << (bps - 1))) {
2851 return AV_CODEC_ID_PCM_S8;
2853 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
2855 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
2857 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
2859 return AV_CODEC_ID_NONE;
2864 return AV_CODEC_ID_PCM_U8;
2866 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
2868 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
2870 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
2872 return AV_CODEC_ID_NONE;
2878 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
2881 if (!av_codec_get_tag2(tags, id, &tag))
2886 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
2890 for (i = 0; tags && tags[i]; i++) {
2891 const AVCodecTag *codec_tags = tags[i];
2892 while (codec_tags->id != AV_CODEC_ID_NONE) {
2893 if (codec_tags->id == id) {
2894 *tag = codec_tags->tag;
2903 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
2906 for (i = 0; tags && tags[i]; i++) {
2907 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
2908 if (id != AV_CODEC_ID_NONE)
2911 return AV_CODEC_ID_NONE;
2914 static void compute_chapters_end(AVFormatContext *s)
2917 int64_t max_time = 0;
2919 if (s->duration > 0)
2920 max_time = s->duration +
2921 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2923 for (i = 0; i < s->nb_chapters; i++)
2924 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2925 AVChapter *ch = s->chapters[i];
2926 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
2930 for (j = 0; j < s->nb_chapters; j++) {
2931 AVChapter *ch1 = s->chapters[j];
2932 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
2934 if (j != i && next_start > ch->start && next_start < end)
2937 ch->end = (end == INT64_MAX) ? ch->start : end;
2941 static int get_std_framerate(int i)
2944 return (i + 1) * 1001;
2948 return (i + 31) * 1001 * 12;
2952 return ((const int[]) { 80, 120, 240})[i] * 1001 * 12;
2956 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
2959 /* Is the time base unreliable?
2960 * This is a heuristic to balance between quick acceptance of the values in
2961 * the headers vs. some extra checks.
2962 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2963 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2964 * And there are "variable" fps files this needs to detect as well. */
2965 static int tb_unreliable(AVCodecContext *c)
2967 if (c->time_base.den >= 101LL * c->time_base.num ||
2968 c->time_base.den < 5LL * c->time_base.num ||
2969 // c->codec_tag == AV_RL32("DIVX") ||
2970 // c->codec_tag == AV_RL32("XVID") ||
2971 c->codec_tag == AV_RL32("mp4v") ||
2972 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
2973 c->codec_id == AV_CODEC_ID_GIF ||
2974 c->codec_id == AV_CODEC_ID_HEVC ||
2975 c->codec_id == AV_CODEC_ID_H264)
2980 int ff_alloc_extradata(AVCodecContext *avctx, int size)
2984 if (size < 0 || size >= INT32_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
2985 avctx->extradata = NULL;
2986 avctx->extradata_size = 0;
2987 return AVERROR(EINVAL);
2989 avctx->extradata = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
2990 if (avctx->extradata) {
2991 memset(avctx->extradata + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
2992 avctx->extradata_size = size;
2995 avctx->extradata_size = 0;
2996 ret = AVERROR(ENOMEM);
3001 int ff_get_extradata(AVCodecContext *avctx, AVIOContext *pb, int size)
3003 int ret = ff_alloc_extradata(avctx, size);
3006 ret = avio_read(pb, avctx->extradata, size);
3008 av_freep(&avctx->extradata);
3009 avctx->extradata_size = 0;
3010 av_log(avctx, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
3011 return ret < 0 ? ret : AVERROR_INVALIDDATA;
3017 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
3020 int64_t last = st->info->last_dts;
3022 if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
3023 && ts - (uint64_t)last < INT64_MAX) {
3024 double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
3025 int64_t duration = ts - last;
3027 if (!st->info->duration_error)
3028 st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
3029 if (!st->info->duration_error)
3030 return AVERROR(ENOMEM);
3032 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3033 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
3034 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3035 if (st->info->duration_error[0][1][i] < 1e10) {
3036 int framerate = get_std_framerate(i);
3037 double sdts = dts*framerate/(1001*12);
3038 for (j= 0; j<2; j++) {
3039 int64_t ticks = llrint(sdts+j*0.5);
3040 double error= sdts - ticks + j*0.5;
3041 st->info->duration_error[j][0][i] += error;
3042 st->info->duration_error[j][1][i] += error*error;
3046 st->info->duration_count++;
3047 st->info->rfps_duration_sum += duration;
3049 if (st->info->duration_count % 10 == 0) {
3050 int n = st->info->duration_count;
3051 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3052 if (st->info->duration_error[0][1][i] < 1e10) {
3053 double a0 = st->info->duration_error[0][0][i] / n;
3054 double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
3055 double a1 = st->info->duration_error[1][0][i] / n;
3056 double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
3057 if (error0 > 0.04 && error1 > 0.04) {
3058 st->info->duration_error[0][1][i] = 2e10;
3059 st->info->duration_error[1][1][i] = 2e10;
3065 // ignore the first 4 values, they might have some random jitter
3066 if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
3067 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
3069 if (ts != AV_NOPTS_VALUE)
3070 st->info->last_dts = ts;
3075 void ff_rfps_calculate(AVFormatContext *ic)
3079 for (i = 0; i < ic->nb_streams; i++) {
3080 AVStream *st = ic->streams[i];
3082 if (st->codec->codec_type != AVMEDIA_TYPE_VIDEO)
3084 // the check for tb_unreliable() is not completely correct, since this is not about handling
3085 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3086 // ipmovie.c produces.
3087 if (tb_unreliable(st->codec) && 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)
3088 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);
3089 if (st->info->duration_count>1 && !st->r_frame_rate.num
3090 && tb_unreliable(st->codec)) {
3092 double best_error= 0.01;
3093 AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
3095 for (j= 0; j<MAX_STD_TIMEBASES; j++) {
3098 if (st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
3100 if (!st->info->codec_info_duration && get_std_framerate(j) < 1001*12)
3103 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
3106 for (k= 0; k<2; k++) {
3107 int n = st->info->duration_count;
3108 double a= st->info->duration_error[k][0][j] / n;
3109 double error= st->info->duration_error[k][1][j]/n - a*a;
3111 if (error < best_error && best_error> 0.000000001) {
3113 num = get_std_framerate(j);
3116 av_log(ic, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
3119 // do not increase frame rate by more than 1 % in order to match a standard rate.
3120 if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
3121 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
3123 if ( !st->avg_frame_rate.num
3124 && st->r_frame_rate.num && st->info->rfps_duration_sum
3125 && st->info->codec_info_duration <= 0
3126 && st->info->duration_count > 2
3127 && 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
3129 av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
3130 st->avg_frame_rate = st->r_frame_rate;
3133 av_freep(&st->info->duration_error);
3134 st->info->last_dts = AV_NOPTS_VALUE;
3135 st->info->duration_count = 0;
3136 st->info->rfps_duration_sum = 0;
3140 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3142 int i, count, ret = 0, j;
3145 AVPacket pkt1, *pkt;
3146 int64_t old_offset = avio_tell(ic->pb);
3147 // new streams might appear, no options for those
3148 int orig_nb_streams = ic->nb_streams;
3150 int64_t max_analyze_duration = ic->max_analyze_duration;
3151 int64_t max_stream_analyze_duration;
3152 int64_t max_subtitle_analyze_duration;
3153 int64_t probesize = ic->probesize;
3155 flush_codecs = probesize > 0;
3157 av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3159 max_stream_analyze_duration = max_analyze_duration;
3160 max_subtitle_analyze_duration = max_analyze_duration;
3161 if (!max_analyze_duration) {
3162 max_stream_analyze_duration =
3163 max_analyze_duration = 5*AV_TIME_BASE;
3164 max_subtitle_analyze_duration = 30*AV_TIME_BASE;
3165 if (!strcmp(ic->iformat->name, "flv"))
3166 max_stream_analyze_duration = 90*AV_TIME_BASE;
3170 av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d\n",
3171 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count);
3173 for (i = 0; i < ic->nb_streams; i++) {
3174 const AVCodec *codec;
3175 AVDictionary *thread_opt = NULL;
3176 st = ic->streams[i];
3178 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3179 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3180 /* if (!st->time_base.num)
3182 if (!st->codec->time_base.num)
3183 st->codec->time_base = st->time_base;
3185 // only for the split stuff
3186 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->request_probe <= 0) {
3187 st->parser = av_parser_init(st->codec->codec_id);
3189 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3190 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3191 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3192 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3194 } else if (st->need_parsing) {
3195 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3196 "%s, packets or times may be invalid.\n",
3197 avcodec_get_name(st->codec->codec_id));
3200 codec = find_decoder(ic, st, st->codec->codec_id);
3202 /* Force thread count to 1 since the H.264 decoder will not extract
3203 * SPS and PPS to extradata during multi-threaded decoding. */
3204 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3206 if (ic->codec_whitelist)
3207 av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3209 /* Ensure that subtitle_header is properly set. */
3210 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
3211 && codec && !st->codec->codec) {
3212 if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
3213 av_log(ic, AV_LOG_WARNING,
3214 "Failed to open codec in av_find_stream_info\n");
3217 // Try to just open decoders, in case this is enough to get parameters.
3218 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3219 if (codec && !st->codec->codec)
3220 if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
3221 av_log(ic, AV_LOG_WARNING,
3222 "Failed to open codec in av_find_stream_info\n");
3225 av_dict_free(&thread_opt);
3228 for (i = 0; i < ic->nb_streams; i++) {
3229 #if FF_API_R_FRAME_RATE
3230 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3232 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3233 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
3239 int analyzed_all_streams;
3240 if (ff_check_interrupt(&ic->interrupt_callback)) {
3242 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3246 /* check if one codec still needs to be handled */
3247 for (i = 0; i < ic->nb_streams; i++) {
3248 int fps_analyze_framecount = 20;
3250 st = ic->streams[i];
3251 if (!has_codec_parameters(st, NULL))
3253 /* If the timebase is coarse (like the usual millisecond precision
3254 * of mkv), we need to analyze more frames to reliably arrive at
3255 * the correct fps. */
3256 if (av_q2d(st->time_base) > 0.0005)
3257 fps_analyze_framecount *= 2;
3258 if (!tb_unreliable(st->codec))
3259 fps_analyze_framecount = 0;
3260 if (ic->fps_probe_size >= 0)
3261 fps_analyze_framecount = ic->fps_probe_size;
3262 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3263 fps_analyze_framecount = 0;
3264 /* variable fps and no guess at the real fps */
3265 if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3266 st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3267 int count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
3268 st->info->codec_info_duration_fields/2 :
3269 st->info->duration_count;
3270 if (count < fps_analyze_framecount)
3273 if (st->parser && st->parser->parser->split &&
3274 !st->codec->extradata)
3276 if (st->first_dts == AV_NOPTS_VALUE &&
3277 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3278 st->codec_info_nb_frames < ic->max_ts_probe &&
3279 (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3280 st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
3283 analyzed_all_streams = 0;
3284 if (i == ic->nb_streams) {
3285 analyzed_all_streams = 1;
3286 /* NOTE: If the format has no header, then we need to read some
3287 * packets to get most of the streams, so we cannot stop here. */
3288 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3289 /* If we found the info for all the codecs, we can stop. */
3291 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3296 /* We did not get all the codec info, but we read too much data. */
3297 if (read_size >= probesize) {
3299 av_log(ic, AV_LOG_DEBUG,
3300 "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3301 for (i = 0; i < ic->nb_streams; i++)
3302 if (!ic->streams[i]->r_frame_rate.num &&
3303 ic->streams[i]->info->duration_count <= 1 &&
3304 ic->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3305 strcmp(ic->iformat->name, "image2"))
3306 av_log(ic, AV_LOG_WARNING,
3307 "Stream #%d: not enough frames to estimate rate; "
3308 "consider increasing probesize\n", i);
3312 /* NOTE: A new stream can be added there if no header in file
3313 * (AVFMTCTX_NOHEADER). */
3314 ret = read_frame_internal(ic, &pkt1);
3315 if (ret == AVERROR(EAGAIN))
3325 if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
3326 ret = add_to_pktbuf(&ic->internal->packet_buffer, pkt,
3327 &ic->internal->packet_buffer_end, 0);
3329 goto find_stream_info_err;
3332 st = ic->streams[pkt->stream_index];
3333 if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3334 read_size += pkt->size;
3336 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3337 /* check for non-increasing dts */
3338 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3339 st->info->fps_last_dts >= pkt->dts) {
3340 av_log(ic, AV_LOG_DEBUG,
3341 "Non-increasing DTS in stream %d: packet %d with DTS "
3342 "%"PRId64", packet %d with DTS %"PRId64"\n",
3343 st->index, st->info->fps_last_dts_idx,
3344 st->info->fps_last_dts, st->codec_info_nb_frames,
3346 st->info->fps_first_dts =
3347 st->info->fps_last_dts = AV_NOPTS_VALUE;
3349 /* Check for a discontinuity in dts. If the difference in dts
3350 * is more than 1000 times the average packet duration in the
3351 * sequence, we treat it as a discontinuity. */
3352 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3353 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3354 (pkt->dts - st->info->fps_last_dts) / 1000 >
3355 (st->info->fps_last_dts - st->info->fps_first_dts) /
3356 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3357 av_log(ic, AV_LOG_WARNING,
3358 "DTS discontinuity in stream %d: packet %d with DTS "
3359 "%"PRId64", packet %d with DTS %"PRId64"\n",
3360 st->index, st->info->fps_last_dts_idx,
3361 st->info->fps_last_dts, st->codec_info_nb_frames,
3363 st->info->fps_first_dts =
3364 st->info->fps_last_dts = AV_NOPTS_VALUE;
3367 /* update stored dts values */
3368 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3369 st->info->fps_first_dts = pkt->dts;
3370 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3372 st->info->fps_last_dts = pkt->dts;
3373 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3375 if (st->codec_info_nb_frames>1) {
3379 if (st->time_base.den > 0)
3380 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3381 if (st->avg_frame_rate.num > 0)
3382 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3385 && st->codec_info_nb_frames>30
3386 && st->info->fps_first_dts != AV_NOPTS_VALUE
3387 && st->info->fps_last_dts != AV_NOPTS_VALUE)
3388 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3390 if (analyzed_all_streams) limit = max_analyze_duration;
3391 else if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) limit = max_subtitle_analyze_duration;
3392 else limit = max_stream_analyze_duration;
3395 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds st:%d\n",
3397 t, pkt->stream_index);
3398 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3399 av_packet_unref(pkt);
3402 if (pkt->duration) {
3403 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE && pkt->pts != AV_NOPTS_VALUE && pkt->pts >= st->start_time) {
3404 st->info->codec_info_duration = FFMIN(pkt->pts - st->start_time, st->info->codec_info_duration + pkt->duration);
3406 st->info->codec_info_duration += pkt->duration;
3407 st->info->codec_info_duration_fields += st->parser && st->need_parsing && st->codec->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3410 #if FF_API_R_FRAME_RATE
3411 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3412 ff_rfps_add_frame(ic, st, pkt->dts);
3414 if (st->parser && st->parser->parser->split && !st->codec->extradata) {
3415 int i = st->parser->parser->split(st->codec, pkt->data, pkt->size);
3416 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
3417 if (ff_alloc_extradata(st->codec, i))
3418 return AVERROR(ENOMEM);
3419 memcpy(st->codec->extradata, pkt->data,
3420 st->codec->extradata_size);
3424 /* If still no information, we try to open the codec and to
3425 * decompress the frame. We try to avoid that in most cases as
3426 * it takes longer and uses more memory. For MPEG-4, we need to
3427 * decompress for QuickTime.
3429 * If AV_CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3430 * least one frame of codec data, this makes sure the codec initializes
3431 * the channel configuration and does not only trust the values from
3433 try_decode_frame(ic, st, pkt,
3434 (options && i < orig_nb_streams) ? &options[i] : NULL);
3436 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3437 av_packet_unref(pkt);
3439 st->codec_info_nb_frames++;
3444 AVPacket empty_pkt = { 0 };
3446 av_init_packet(&empty_pkt);
3448 for (i = 0; i < ic->nb_streams; i++) {
3450 st = ic->streams[i];
3452 /* flush the decoders */
3453 if (st->info->found_decoder == 1) {
3455 err = try_decode_frame(ic, st, &empty_pkt,
3456 (options && i < orig_nb_streams)
3457 ? &options[i] : NULL);
3458 } while (err > 0 && !has_codec_parameters(st, NULL));
3461 av_log(ic, AV_LOG_INFO,
3462 "decoding for stream %d failed\n", st->index);
3468 // close codecs which were opened in try_decode_frame()
3469 for (i = 0; i < ic->nb_streams; i++) {
3470 st = ic->streams[i];
3471 avcodec_close(st->codec);
3474 ff_rfps_calculate(ic);
3476 for (i = 0; i < ic->nb_streams; i++) {
3477 st = ic->streams[i];
3478 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3479 if (st->codec->codec_id == AV_CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample) {
3480 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
3481 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == st->codec->pix_fmt)
3482 st->codec->codec_tag= tag;
3485 /* estimate average framerate if not set by demuxer */
3486 if (st->info->codec_info_duration_fields &&
3487 !st->avg_frame_rate.num &&
3488 st->info->codec_info_duration) {
3490 double best_error = 0.01;
3492 if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
3493 st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
3494 st->info->codec_info_duration < 0)
3496 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3497 st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
3498 st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
3500 /* Round guessed framerate to a "standard" framerate if it's
3501 * within 1% of the original estimate. */
3502 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
3503 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
3504 double error = fabs(av_q2d(st->avg_frame_rate) /
3505 av_q2d(std_fps) - 1);
3507 if (error < best_error) {
3509 best_fps = std_fps.num;
3513 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3514 best_fps, 12 * 1001, INT_MAX);
3517 if (!st->r_frame_rate.num) {
3518 if ( st->codec->time_base.den * (int64_t) st->time_base.num
3519 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t) st->time_base.den) {
3520 st->r_frame_rate.num = st->codec->time_base.den;
3521 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
3523 st->r_frame_rate.num = st->time_base.den;
3524 st->r_frame_rate.den = st->time_base.num;
3527 if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
3528 AVRational hw_ratio = { st->codec->height, st->codec->width };
3529 st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
3532 } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
3533 if (!st->codec->bits_per_coded_sample)
3534 st->codec->bits_per_coded_sample =
3535 av_get_bits_per_sample(st->codec->codec_id);
3536 // set stream disposition based on audio service type
3537 switch (st->codec->audio_service_type) {
3538 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
3539 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
3541 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
3542 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
3544 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
3545 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
3547 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
3548 st->disposition = AV_DISPOSITION_COMMENT;
3550 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
3551 st->disposition = AV_DISPOSITION_KARAOKE;
3558 estimate_timings(ic, old_offset);
3560 av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
3562 if (ret >= 0 && ic->nb_streams)
3563 /* We could not have all the codec parameters before EOF. */
3565 for (i = 0; i < ic->nb_streams; i++) {
3567 st = ic->streams[i];
3568 if (!has_codec_parameters(st, &errmsg)) {
3570 avcodec_string(buf, sizeof(buf), st->codec, 0);
3571 av_log(ic, AV_LOG_WARNING,
3572 "Could not find codec parameters for stream %d (%s): %s\n"
3573 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
3580 compute_chapters_end(ic);
3582 find_stream_info_err:
3583 for (i = 0; i < ic->nb_streams; i++) {
3584 st = ic->streams[i];
3585 if (ic->streams[i]->codec->codec_type != AVMEDIA_TYPE_AUDIO)
3586 ic->streams[i]->codec->thread_count = 0;
3588 av_freep(&st->info->duration_error);
3589 av_freep(&ic->streams[i]->info);
3592 av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
3593 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
3597 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
3601 for (i = 0; i < ic->nb_programs; i++) {
3602 if (ic->programs[i] == last) {
3606 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
3607 if (ic->programs[i]->stream_index[j] == s)
3608 return ic->programs[i];
3614 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
3615 int wanted_stream_nb, int related_stream,
3616 AVCodec **decoder_ret, int flags)
3618 int i, nb_streams = ic->nb_streams;
3619 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe;
3620 unsigned *program = NULL;
3621 const AVCodec *decoder = NULL, *best_decoder = NULL;
3623 if (related_stream >= 0 && wanted_stream_nb < 0) {
3624 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
3626 program = p->stream_index;
3627 nb_streams = p->nb_stream_indexes;
3630 for (i = 0; i < nb_streams; i++) {
3631 int real_stream_index = program ? program[i] : i;
3632 AVStream *st = ic->streams[real_stream_index];
3633 AVCodecContext *avctx = st->codec;
3634 if (avctx->codec_type != type)
3636 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
3638 if (wanted_stream_nb != real_stream_index &&
3639 st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED |
3640 AV_DISPOSITION_VISUAL_IMPAIRED))
3642 if (type == AVMEDIA_TYPE_AUDIO && !(avctx->channels && avctx->sample_rate))
3645 decoder = find_decoder(ic, st, st->codec->codec_id);
3648 ret = AVERROR_DECODER_NOT_FOUND;
3652 count = st->codec_info_nb_frames;
3653 bitrate = avctx->bit_rate;
3655 bitrate = avctx->rc_max_rate;
3656 multiframe = FFMIN(5, count);
3657 if ((best_multiframe > multiframe) ||
3658 (best_multiframe == multiframe && best_bitrate > bitrate) ||
3659 (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
3662 best_bitrate = bitrate;
3663 best_multiframe = multiframe;
3664 ret = real_stream_index;
3665 best_decoder = decoder;
3666 if (program && i == nb_streams - 1 && ret < 0) {
3668 nb_streams = ic->nb_streams;
3669 /* no related stream found, try again with everything */
3674 *decoder_ret = (AVCodec*)best_decoder;
3678 /*******************************************************/
3680 int av_read_play(AVFormatContext *s)
3682 if (s->iformat->read_play)
3683 return s->iformat->read_play(s);
3685 return avio_pause(s->pb, 0);
3686 return AVERROR(ENOSYS);
3689 int av_read_pause(AVFormatContext *s)
3691 if (s->iformat->read_pause)
3692 return s->iformat->read_pause(s);
3694 return avio_pause(s->pb, 1);
3695 return AVERROR(ENOSYS);
3698 static void free_stream(AVStream **pst)
3700 AVStream *st = *pst;
3706 for (i = 0; i < st->nb_side_data; i++)
3707 av_freep(&st->side_data[i].data);
3708 av_freep(&st->side_data);
3711 av_parser_close(st->parser);
3713 if (st->attached_pic.data)
3714 av_packet_unref(&st->attached_pic);
3716 av_freep(&st->internal);
3718 av_dict_free(&st->metadata);
3719 av_freep(&st->probe_data.buf);
3720 av_freep(&st->index_entries);
3721 av_freep(&st->codec->extradata);
3722 av_freep(&st->codec->subtitle_header);
3723 av_freep(&st->codec);
3724 av_freep(&st->priv_data);
3726 av_freep(&st->info->duration_error);
3727 av_freep(&st->info);
3728 av_freep(&st->recommended_encoder_configuration);
3729 av_freep(&st->priv_pts);
3734 void ff_free_stream(AVFormatContext *s, AVStream *st)
3736 av_assert0(s->nb_streams>0);
3737 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
3739 free_stream(&s->streams[ --s->nb_streams ]);
3742 void avformat_free_context(AVFormatContext *s)
3750 if (s->iformat && s->iformat->priv_class && s->priv_data)
3751 av_opt_free(s->priv_data);
3752 if (s->oformat && s->oformat->priv_class && s->priv_data)
3753 av_opt_free(s->priv_data);
3755 for (i = s->nb_streams - 1; i >= 0; i--)
3756 ff_free_stream(s, s->streams[i]);
3759 for (i = s->nb_programs - 1; i >= 0; i--) {
3760 av_dict_free(&s->programs[i]->metadata);
3761 av_freep(&s->programs[i]->stream_index);
3762 av_freep(&s->programs[i]);
3764 av_freep(&s->programs);
3765 av_freep(&s->priv_data);
3766 while (s->nb_chapters--) {
3767 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
3768 av_freep(&s->chapters[s->nb_chapters]);
3770 av_freep(&s->chapters);
3771 av_dict_free(&s->metadata);
3772 av_freep(&s->streams);
3773 av_freep(&s->internal);
3774 flush_packet_queue(s);
3778 void avformat_close_input(AVFormatContext **ps)
3789 if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
3790 (s->flags & AVFMT_FLAG_CUSTOM_IO))
3793 flush_packet_queue(s);
3796 if (s->iformat->read_close)
3797 s->iformat->read_close(s);
3799 avformat_free_context(s);
3806 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
3812 if (s->nb_streams >= INT_MAX/sizeof(*streams))
3814 streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
3817 s->streams = streams;
3819 st = av_mallocz(sizeof(AVStream));
3822 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
3826 st->info->last_dts = AV_NOPTS_VALUE;
3828 st->codec = avcodec_alloc_context3(c);
3835 st->internal = av_mallocz(sizeof(*st->internal));
3840 /* no default bitrate if decoding */
3841 st->codec->bit_rate = 0;
3843 /* default pts setting is MPEG-like */
3844 avpriv_set_pts_info(st, 33, 1, 90000);
3845 /* we set the current DTS to 0 so that formats without any timestamps
3846 * but durations get some timestamps, formats with some unknown
3847 * timestamps have their first few packets buffered and the
3848 * timestamps corrected before they are returned to the user */
3849 st->cur_dts = RELATIVE_TS_BASE;
3851 st->cur_dts = AV_NOPTS_VALUE;
3854 st->index = s->nb_streams;
3855 st->start_time = AV_NOPTS_VALUE;
3856 st->duration = AV_NOPTS_VALUE;
3857 st->first_dts = AV_NOPTS_VALUE;
3858 st->probe_packets = MAX_PROBE_PACKETS;
3859 st->pts_wrap_reference = AV_NOPTS_VALUE;
3860 st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
3862 st->last_IP_pts = AV_NOPTS_VALUE;
3863 st->last_dts_for_order_check = AV_NOPTS_VALUE;
3864 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
3865 st->pts_buffer[i] = AV_NOPTS_VALUE;
3867 st->sample_aspect_ratio = (AVRational) { 0, 1 };
3869 #if FF_API_R_FRAME_RATE
3870 st->info->last_dts = AV_NOPTS_VALUE;
3872 st->info->fps_first_dts = AV_NOPTS_VALUE;
3873 st->info->fps_last_dts = AV_NOPTS_VALUE;
3875 st->inject_global_side_data = s->internal->inject_global_side_data;
3877 s->streams[s->nb_streams++] = st;
3884 AVProgram *av_new_program(AVFormatContext *ac, int id)
3886 AVProgram *program = NULL;
3889 av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
3891 for (i = 0; i < ac->nb_programs; i++)
3892 if (ac->programs[i]->id == id)
3893 program = ac->programs[i];
3896 program = av_mallocz(sizeof(AVProgram));
3899 dynarray_add(&ac->programs, &ac->nb_programs, program);
3900 program->discard = AVDISCARD_NONE;
3903 program->pts_wrap_reference = AV_NOPTS_VALUE;
3904 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
3906 program->start_time =
3907 program->end_time = AV_NOPTS_VALUE;
3912 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
3913 int64_t start, int64_t end, const char *title)
3915 AVChapter *chapter = NULL;
3918 if (end != AV_NOPTS_VALUE && start > end) {
3919 av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
3923 for (i = 0; i < s->nb_chapters; i++)
3924 if (s->chapters[i]->id == id)
3925 chapter = s->chapters[i];
3928 chapter = av_mallocz(sizeof(AVChapter));
3931 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
3933 av_dict_set(&chapter->metadata, "title", title, 0);
3935 chapter->time_base = time_base;
3936 chapter->start = start;
3942 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
3945 AVProgram *program = NULL;
3948 if (idx >= ac->nb_streams) {
3949 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3953 for (i = 0; i < ac->nb_programs; i++) {
3954 if (ac->programs[i]->id != progid)
3956 program = ac->programs[i];
3957 for (j = 0; j < program->nb_stream_indexes; j++)
3958 if (program->stream_index[j] == idx)
3961 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
3964 program->stream_index = tmp;
3965 program->stream_index[program->nb_stream_indexes++] = idx;
3970 uint64_t ff_ntp_time(void)
3972 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3975 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
3978 char *q, buf1[20], c;
3979 int nd, len, percentd_found;
3991 while (av_isdigit(*p))
3992 nd = nd * 10 + *p++ - '0';
3994 } while (av_isdigit(c));
4005 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
4007 if ((q - buf + len) > buf_size - 1)
4009 memcpy(q, buf1, len);
4017 if ((q - buf) < buf_size - 1)
4021 if (!percentd_found)
4030 void av_url_split(char *proto, int proto_size,
4031 char *authorization, int authorization_size,
4032 char *hostname, int hostname_size,
4033 int *port_ptr, char *path, int path_size, const char *url)
4035 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
4041 if (authorization_size > 0)
4042 authorization[0] = 0;
4043 if (hostname_size > 0)
4048 /* parse protocol */
4049 if ((p = strchr(url, ':'))) {
4050 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4057 /* no protocol means plain filename */
4058 av_strlcpy(path, url, path_size);
4062 /* separate path from hostname */
4063 ls = strchr(p, '/');
4064 ls2 = strchr(p, '?');
4068 ls = FFMIN(ls, ls2);
4070 av_strlcpy(path, ls, path_size);
4072 ls = &p[strlen(p)]; // XXX
4074 /* the rest is hostname, use that to parse auth/port */
4076 /* authorization (user[:pass]@hostname) */
4078 while ((at = strchr(p, '@')) && at < ls) {
4079 av_strlcpy(authorization, at2,
4080 FFMIN(authorization_size, at + 1 - at2));
4081 p = at + 1; /* skip '@' */
4084 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4086 av_strlcpy(hostname, p + 1,
4087 FFMIN(hostname_size, brk - p));
4088 if (brk[1] == ':' && port_ptr)
4089 *port_ptr = atoi(brk + 2);
4090 } else if ((col = strchr(p, ':')) && col < ls) {
4091 av_strlcpy(hostname, p,
4092 FFMIN(col + 1 - p, hostname_size));
4094 *port_ptr = atoi(col + 1);
4096 av_strlcpy(hostname, p,
4097 FFMIN(ls + 1 - p, hostname_size));
4101 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4104 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4107 'C', 'D', 'E', 'F' };
4108 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4111 'c', 'd', 'e', 'f' };
4112 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4114 for (i = 0; i < s; i++) {
4115 buff[i * 2] = hex_table[src[i] >> 4];
4116 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4122 int ff_hex_to_data(uint8_t *data, const char *p)
4129 p += strspn(p, SPACE_CHARS);
4132 c = av_toupper((unsigned char) *p++);
4133 if (c >= '0' && c <= '9')
4135 else if (c >= 'A' && c <= 'F')
4150 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4151 unsigned int pts_num, unsigned int pts_den)
4154 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
4155 if (new_tb.num != pts_num)
4156 av_log(NULL, AV_LOG_DEBUG,
4157 "st:%d removing common factor %d from timebase\n",
4158 s->index, pts_num / new_tb.num);
4160 av_log(NULL, AV_LOG_WARNING,
4161 "st:%d has too large timebase, reducing\n", s->index);
4163 if (new_tb.num <= 0 || new_tb.den <= 0) {
4164 av_log(NULL, AV_LOG_ERROR,
4165 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4166 new_tb.num, new_tb.den,
4170 s->time_base = new_tb;
4171 av_codec_set_pkt_timebase(s->codec, new_tb);
4172 s->pts_wrap_bits = pts_wrap_bits;
4175 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4178 const char *ptr = str;
4180 /* Parse key=value pairs. */
4183 char *dest = NULL, *dest_end;
4184 int key_len, dest_len = 0;
4186 /* Skip whitespace and potential commas. */
4187 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4194 if (!(ptr = strchr(key, '=')))
4197 key_len = ptr - key;
4199 callback_get_buf(context, key, key_len, &dest, &dest_len);
4200 dest_end = dest + dest_len - 1;
4204 while (*ptr && *ptr != '\"') {
4208 if (dest && dest < dest_end)
4212 if (dest && dest < dest_end)
4220 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
4221 if (dest && dest < dest_end)
4229 int ff_find_stream_index(AVFormatContext *s, int id)
4232 for (i = 0; i < s->nb_streams; i++)
4233 if (s->streams[i]->id == id)
4238 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
4242 unsigned int codec_tag;
4243 if (ofmt->query_codec)
4244 return ofmt->query_codec(codec_id, std_compliance);
4245 else if (ofmt->codec_tag)
4246 return !!av_codec_get_tag2(ofmt->codec_tag, codec_id, &codec_tag);
4247 else if (codec_id == ofmt->video_codec ||
4248 codec_id == ofmt->audio_codec ||
4249 codec_id == ofmt->subtitle_codec)
4252 return AVERROR_PATCHWELCOME;
4255 int avformat_network_init(void)
4259 ff_network_inited_globally = 1;
4260 if ((ret = ff_network_init()) < 0)
4262 if ((ret = ff_tls_init()) < 0)
4268 int avformat_network_deinit(void)
4273 ff_network_inited_globally = 0;
4278 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4279 uint64_t channel_layout, int32_t sample_rate,
4280 int32_t width, int32_t height)
4286 return AVERROR(EINVAL);
4289 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4291 if (channel_layout) {
4293 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4297 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4299 if (width || height) {
4301 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4303 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4305 return AVERROR(ENOMEM);
4306 bytestream_put_le32(&data, flags);
4308 bytestream_put_le32(&data, channels);
4310 bytestream_put_le64(&data, channel_layout);
4312 bytestream_put_le32(&data, sample_rate);
4313 if (width || height) {
4314 bytestream_put_le32(&data, width);
4315 bytestream_put_le32(&data, height);
4320 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
4322 AVRational undef = {0, 1};
4323 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
4324 AVRational codec_sample_aspect_ratio = stream && stream->codec ? stream->codec->sample_aspect_ratio : undef;
4325 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
4327 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
4328 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
4329 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
4330 stream_sample_aspect_ratio = undef;
4332 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
4333 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
4334 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
4335 frame_sample_aspect_ratio = undef;
4337 if (stream_sample_aspect_ratio.num)
4338 return stream_sample_aspect_ratio;
4340 return frame_sample_aspect_ratio;
4343 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
4345 AVRational fr = st->r_frame_rate;
4346 AVRational codec_fr = st->codec->framerate;
4347 AVRational avg_fr = st->avg_frame_rate;
4349 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
4350 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
4355 if (st->codec->ticks_per_frame > 1) {
4356 if ( codec_fr.num > 0 && codec_fr.den > 0 &&
4357 (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))
4364 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
4367 if (*spec <= '9' && *spec >= '0') /* opt:index */
4368 return strtol(spec, NULL, 0) == st->index;
4369 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
4370 *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
4371 enum AVMediaType type;
4375 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
4376 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
4377 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
4378 case 'd': type = AVMEDIA_TYPE_DATA; break;
4379 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
4380 case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
4381 default: av_assert0(0);
4383 if (type != st->codec->codec_type)
4385 if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
4387 if (*spec++ == ':') { /* possibly followed by :index */
4388 int i, index = strtol(spec, NULL, 0);
4389 for (i = 0; i < s->nb_streams; i++)
4390 if (s->streams[i]->codec->codec_type == type &&
4391 !(nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) &&
4393 return i == st->index;
4397 } else if (*spec == 'p' && *(spec + 1) == ':') {
4401 prog_id = strtol(spec, &endptr, 0);
4402 for (i = 0; i < s->nb_programs; i++) {
4403 if (s->programs[i]->id != prog_id)
4406 if (*endptr++ == ':') {
4407 int stream_idx = strtol(endptr, NULL, 0);
4408 return stream_idx >= 0 &&
4409 stream_idx < s->programs[i]->nb_stream_indexes &&
4410 st->index == s->programs[i]->stream_index[stream_idx];
4413 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
4414 if (st->index == s->programs[i]->stream_index[j])
4418 } else if (*spec == '#' ||
4419 (*spec == 'i' && *(spec + 1) == ':')) {
4422 spec += 1 + (*spec == 'i');
4423 stream_id = strtol(spec, &endptr, 0);
4425 return stream_id == st->id;
4426 } else if (*spec == 'm' && *(spec + 1) == ':') {
4427 AVDictionaryEntry *tag;
4432 val = strchr(spec, ':');
4434 key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
4436 return AVERROR(ENOMEM);
4438 tag = av_dict_get(st->metadata, key, NULL, 0);
4440 if (!val || !strcmp(tag->value, val + 1))
4449 } else if (*spec == 'u') {
4450 AVCodecContext *avctx = st->codec;
4452 switch (avctx->codec_type) {
4453 case AVMEDIA_TYPE_AUDIO:
4454 val = avctx->sample_rate && avctx->channels;
4455 if (avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
4458 case AVMEDIA_TYPE_VIDEO:
4459 val = avctx->width && avctx->height;
4460 if (avctx->pix_fmt == AV_PIX_FMT_NONE)
4463 case AVMEDIA_TYPE_UNKNOWN:
4470 return avctx->codec_id != AV_CODEC_ID_NONE && val != 0;
4471 } else if (!*spec) /* empty specifier, matches everything */
4474 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
4475 return AVERROR(EINVAL);
4478 int ff_generate_avci_extradata(AVStream *st)
4480 static const uint8_t avci100_1080p_extradata[] = {
4482 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4483 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4484 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4485 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
4486 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
4487 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
4488 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
4489 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
4490 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4492 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4495 static const uint8_t avci100_1080i_extradata[] = {
4497 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4498 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4499 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4500 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
4501 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
4502 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
4503 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
4504 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
4505 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
4506 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
4507 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
4509 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4512 static const uint8_t avci50_1080p_extradata[] = {
4514 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4515 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4516 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4517 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
4518 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
4519 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
4520 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
4521 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
4522 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
4524 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4527 static const uint8_t avci50_1080i_extradata[] = {
4529 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4530 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4531 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4532 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
4533 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
4534 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
4535 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
4536 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
4537 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
4538 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
4539 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
4541 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4544 static const uint8_t avci100_720p_extradata[] = {
4546 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4547 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
4548 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
4549 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
4550 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
4551 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
4552 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
4553 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
4554 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
4555 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
4557 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
4560 static const uint8_t avci50_720p_extradata[] = {
4562 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
4563 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4564 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4565 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
4566 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
4567 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
4568 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
4569 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
4570 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
4572 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4576 const uint8_t *data = NULL;
4579 if (st->codec->width == 1920) {
4580 if (st->codec->field_order == AV_FIELD_PROGRESSIVE) {
4581 data = avci100_1080p_extradata;
4582 size = sizeof(avci100_1080p_extradata);
4584 data = avci100_1080i_extradata;
4585 size = sizeof(avci100_1080i_extradata);
4587 } else if (st->codec->width == 1440) {
4588 if (st->codec->field_order == AV_FIELD_PROGRESSIVE) {
4589 data = avci50_1080p_extradata;
4590 size = sizeof(avci50_1080p_extradata);
4592 data = avci50_1080i_extradata;
4593 size = sizeof(avci50_1080i_extradata);
4595 } else if (st->codec->width == 1280) {
4596 data = avci100_720p_extradata;
4597 size = sizeof(avci100_720p_extradata);
4598 } else if (st->codec->width == 960) {
4599 data = avci50_720p_extradata;
4600 size = sizeof(avci50_720p_extradata);
4606 av_freep(&st->codec->extradata);
4607 if (ff_alloc_extradata(st->codec, size))
4608 return AVERROR(ENOMEM);
4609 memcpy(st->codec->extradata, data, size);
4614 uint8_t *av_stream_get_side_data(AVStream *st, enum AVPacketSideDataType type,
4619 for (i = 0; i < st->nb_side_data; i++) {
4620 if (st->side_data[i].type == type) {
4622 *size = st->side_data[i].size;
4623 return st->side_data[i].data;
4629 uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
4632 AVPacketSideData *sd, *tmp;
4634 uint8_t *data = av_malloc(size);
4639 for (i = 0; i < st->nb_side_data; i++) {
4640 sd = &st->side_data[i];
4642 if (sd->type == type) {
4643 av_freep(&sd->data);
4650 tmp = av_realloc_array(st->side_data, st->nb_side_data + 1, sizeof(*tmp));
4656 st->side_data = tmp;
4659 sd = &st->side_data[st->nb_side_data - 1];
4666 int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
4668 AVBitStreamFilterContext *bsfc = NULL;
4669 AVBitStreamFilterContext **dest = &st->internal->bsfc;
4670 while (*dest && (*dest)->next)
4671 dest = &(*dest)->next;
4673 if (!(bsfc = av_bitstream_filter_init(name))) {
4674 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter '%s'\n", name);
4675 return AVERROR(EINVAL);
4677 if (args && !(bsfc->args = av_strdup(args))) {
4678 av_bitstream_filter_close(bsfc);
4679 return AVERROR(ENOMEM);
4681 av_log(st->codec, AV_LOG_VERBOSE,
4682 "Automatically inserted bitstream filter '%s'; args='%s'\n",
4683 name, args ? args : "");
4688 int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt,
4689 AVBitStreamFilterContext *bsfc)
4693 AVPacket new_pkt = *pkt;
4694 int a = av_bitstream_filter_filter(bsfc, codec, NULL,
4695 &new_pkt.data, &new_pkt.size,
4696 pkt->data, pkt->size,
4697 pkt->flags & AV_PKT_FLAG_KEY);
4698 if(a == 0 && new_pkt.data != pkt->data) {
4699 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
4701 memcpy(t, new_pkt.data, new_pkt.size);
4702 memset(t + new_pkt.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
4707 a = AVERROR(ENOMEM);
4711 new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
4712 av_buffer_default_free, NULL, 0);
4714 pkt->side_data = NULL;
4715 pkt->side_data_elems = 0;
4716 av_packet_unref(pkt);
4718 av_freep(&new_pkt.data);
4719 a = AVERROR(ENOMEM);
4723 av_log(codec, AV_LOG_ERROR,
4724 "Failed to open bitstream filter %s for stream %d with codec %s",
4725 bsfc->filter->name, pkt->stream_index,
4726 codec->codec ? codec->codec->name : "copy");
4737 void ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
4740 s->io_close(s, *pb);
4744 int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
4746 AVDictionaryEntry *entry;
4747 int64_t parsed_timestamp;
4749 if ((entry = av_dict_get(s->metadata, "creation_time", NULL, 0))) {
4750 if ((ret = av_parse_time(&parsed_timestamp, entry->value, 0)) >= 0) {
4751 *timestamp = return_seconds ? parsed_timestamp / 1000000 : parsed_timestamp;
4754 av_log(s, AV_LOG_WARNING, "Failed to parse creation_time %s\n", entry->value);