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
29 #include "libavutil/avassert.h"
30 #include "libavutil/avstring.h"
31 #include "libavutil/dict.h"
32 #include "libavutil/internal.h"
33 #include "libavutil/mathematics.h"
34 #include "libavutil/opt.h"
35 #include "libavutil/parseutils.h"
36 #include "libavutil/pixdesc.h"
37 #include "libavutil/time.h"
38 #include "libavutil/timestamp.h"
40 #include "libavcodec/bytestream.h"
41 #include "libavcodec/internal.h"
42 #include "libavcodec/raw.h"
44 #include "audiointerleave.h"
46 #include "avio_internal.h"
58 * various utility functions for use within FFmpeg
61 unsigned avformat_version(void)
63 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
64 return LIBAVFORMAT_VERSION_INT;
67 const char *avformat_configuration(void)
69 return FFMPEG_CONFIGURATION;
72 const char *avformat_license(void)
74 #define LICENSE_PREFIX "libavformat license: "
75 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
78 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
80 static int is_relative(int64_t ts) {
81 return ts > (RELATIVE_TS_BASE - (1LL<<48));
85 * Wrap a given time stamp, if there is an indication for an overflow
88 * @param timestamp the time stamp to wrap
89 * @return resulting time stamp
91 static int64_t wrap_timestamp(AVStream *st, int64_t timestamp)
93 if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&
94 st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
95 if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
96 timestamp < st->pts_wrap_reference)
97 return timestamp + (1ULL << st->pts_wrap_bits);
98 else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
99 timestamp >= st->pts_wrap_reference)
100 return timestamp - (1ULL << st->pts_wrap_bits);
105 MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
106 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, video_codec)
107 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, audio_codec)
108 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
109 MAKE_ACCESSORS(AVFormatContext, format, int, metadata_header_padding)
110 MAKE_ACCESSORS(AVFormatContext, format, void *, opaque)
111 MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb)
113 void av_format_inject_global_side_data(AVFormatContext *s)
116 s->internal->inject_global_side_data = 1;
117 for (i = 0; i < s->nb_streams; i++) {
118 AVStream *st = s->streams[i];
119 st->inject_global_side_data = 1;
123 static const AVCodec *find_decoder(AVFormatContext *s, AVStream *st, enum AVCodecID codec_id)
125 if (st->codec->codec)
126 return st->codec->codec;
128 switch (st->codec->codec_type) {
129 case AVMEDIA_TYPE_VIDEO:
130 if (s->video_codec) return s->video_codec;
132 case AVMEDIA_TYPE_AUDIO:
133 if (s->audio_codec) return s->audio_codec;
135 case AVMEDIA_TYPE_SUBTITLE:
136 if (s->subtitle_codec) return s->subtitle_codec;
140 return avcodec_find_decoder(codec_id);
143 int av_format_get_probe_score(const AVFormatContext *s)
145 return s->probe_score;
148 /* an arbitrarily chosen "sane" max packet size -- 50M */
149 #define SANE_CHUNK_SIZE (50000000)
151 int ffio_limit(AVIOContext *s, int size)
153 if (s->maxsize>= 0) {
154 int64_t remaining= s->maxsize - avio_tell(s);
155 if (remaining < size) {
156 int64_t newsize = avio_size(s);
157 if (!s->maxsize || s->maxsize<newsize)
158 s->maxsize = newsize - !newsize;
159 remaining= s->maxsize - avio_tell(s);
160 remaining= FFMAX(remaining, 0);
163 if (s->maxsize>= 0 && remaining+1 < size) {
164 av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
171 /* Read the data in sane-sized chunks and append to pkt.
172 * Return the number of bytes read or an error. */
173 static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
175 int64_t orig_pos = pkt->pos; // av_grow_packet might reset pos
176 int orig_size = pkt->size;
180 int prev_size = pkt->size;
183 /* When the caller requests a lot of data, limit it to the amount
184 * left in file or SANE_CHUNK_SIZE when it is not known. */
186 if (read_size > SANE_CHUNK_SIZE/10) {
187 read_size = ffio_limit(s, read_size);
188 // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
190 read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
193 ret = av_grow_packet(pkt, read_size);
197 ret = avio_read(s, pkt->data + prev_size, read_size);
198 if (ret != read_size) {
199 av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
206 pkt->flags |= AV_PKT_FLAG_CORRUPT;
211 return pkt->size > orig_size ? pkt->size - orig_size : ret;
214 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
219 pkt->pos = avio_tell(s);
221 return append_packet_chunked(s, pkt, size);
224 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
227 return av_get_packet(s, pkt, size);
228 return append_packet_chunked(s, pkt, size);
231 int av_filename_number_test(const char *filename)
235 (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0);
238 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened,
241 AVProbeData lpd = *pd;
242 AVInputFormat *fmt1 = NULL, *fmt;
243 int score, nodat = 0, score_max = 0;
244 const static uint8_t zerobuffer[AVPROBE_PADDING_SIZE];
247 lpd.buf = zerobuffer;
249 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
250 int id3len = ff_id3v2_tag_len(lpd.buf);
251 if (lpd.buf_size > id3len + 16) {
253 lpd.buf_size -= id3len;
254 } else if (id3len >= PROBE_BUF_MAX) {
261 while ((fmt1 = av_iformat_next(fmt1))) {
262 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
265 if (fmt1->read_probe) {
266 score = fmt1->read_probe(&lpd);
267 if (fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions)) {
268 if (nodat == 0) score = FFMAX(score, 1);
269 else if (nodat == 1) score = FFMAX(score, AVPROBE_SCORE_EXTENSION / 2 - 1);
270 else score = FFMAX(score, AVPROBE_SCORE_EXTENSION);
272 } else if (fmt1->extensions) {
273 if (av_match_ext(lpd.filename, fmt1->extensions))
274 score = AVPROBE_SCORE_EXTENSION;
276 if (score > score_max) {
279 } else if (score == score_max)
283 score_max = FFMIN(AVPROBE_SCORE_EXTENSION / 2 - 1, score_max);
284 *score_ret = score_max;
289 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
292 AVInputFormat *fmt = av_probe_input_format3(pd, is_opened, &score_ret);
293 if (score_ret > *score_max) {
294 *score_max = score_ret;
300 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)
303 return av_probe_input_format2(pd, is_opened, &score);
306 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
309 static const struct {
312 enum AVMediaType type;
314 { "aac", AV_CODEC_ID_AAC, AVMEDIA_TYPE_AUDIO },
315 { "ac3", AV_CODEC_ID_AC3, AVMEDIA_TYPE_AUDIO },
316 { "dts", AV_CODEC_ID_DTS, AVMEDIA_TYPE_AUDIO },
317 { "eac3", AV_CODEC_ID_EAC3, AVMEDIA_TYPE_AUDIO },
318 { "h264", AV_CODEC_ID_H264, AVMEDIA_TYPE_VIDEO },
319 { "hevc", AV_CODEC_ID_HEVC, AVMEDIA_TYPE_VIDEO },
320 { "loas", AV_CODEC_ID_AAC_LATM, AVMEDIA_TYPE_AUDIO },
321 { "m4v", AV_CODEC_ID_MPEG4, AVMEDIA_TYPE_VIDEO },
322 { "mp3", AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO },
323 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
327 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
329 if (fmt && st->request_probe <= score) {
331 av_log(s, AV_LOG_DEBUG,
332 "Probe with size=%d, packets=%d detected %s with score=%d\n",
333 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets,
335 for (i = 0; fmt_id_type[i].name; i++) {
336 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
337 st->codec->codec_id = fmt_id_type[i].id;
338 st->codec->codec_type = fmt_id_type[i].type;
346 /************************************************************/
347 /* input media file */
349 int av_demuxer_open(AVFormatContext *ic) {
352 if (ic->iformat->read_header) {
353 err = ic->iformat->read_header(ic);
358 if (ic->pb && !ic->data_offset)
359 ic->data_offset = avio_tell(ic->pb);
365 int av_probe_input_buffer2(AVIOContext *pb, AVInputFormat **fmt,
366 const char *filename, void *logctx,
367 unsigned int offset, unsigned int max_probe_size)
369 AVProbeData pd = { filename ? filename : "" };
372 int ret = 0, probe_size, buf_offset = 0;
376 max_probe_size = PROBE_BUF_MAX;
377 else if (max_probe_size > PROBE_BUF_MAX)
378 max_probe_size = PROBE_BUF_MAX;
379 else if (max_probe_size < PROBE_BUF_MIN) {
380 av_log(logctx, AV_LOG_ERROR,
381 "Specified probe size value %u cannot be < %u\n", max_probe_size, PROBE_BUF_MIN);
382 return AVERROR(EINVAL);
385 if (offset >= max_probe_size)
386 return AVERROR(EINVAL);
388 if (!*fmt && pb->av_class && av_opt_get(pb, "mime_type", AV_OPT_SEARCH_CHILDREN, &mime_type) >= 0 && mime_type) {
389 if (!av_strcasecmp(mime_type, "audio/aacp")) {
390 *fmt = av_find_input_format("aac");
392 av_freep(&mime_type);
395 for (probe_size = PROBE_BUF_MIN; probe_size <= max_probe_size && !*fmt;
396 probe_size = FFMIN(probe_size << 1,
397 FFMAX(max_probe_size, probe_size + 1))) {
398 score = probe_size < max_probe_size ? AVPROBE_SCORE_RETRY : 0;
400 /* Read probe data. */
401 if ((ret = av_reallocp(&buf, probe_size + AVPROBE_PADDING_SIZE)) < 0)
403 if ((ret = avio_read(pb, buf + buf_offset,
404 probe_size - buf_offset)) < 0) {
405 /* Fail if error was not end of file, otherwise, lower score. */
406 if (ret != AVERROR_EOF) {
411 ret = 0; /* error was end of file, nothing read */
414 if (buf_offset < offset)
416 pd.buf_size = buf_offset - offset;
417 pd.buf = &buf[offset];
419 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
421 /* Guess file format. */
422 *fmt = av_probe_input_format2(&pd, 1, &score);
424 /* This can only be true in the last iteration. */
425 if (score <= AVPROBE_SCORE_RETRY) {
426 av_log(logctx, AV_LOG_WARNING,
427 "Format %s detected only with low score of %d, "
428 "misdetection possible!\n", (*fmt)->name, score);
430 av_log(logctx, AV_LOG_DEBUG,
431 "Format %s probed with size=%d and score=%d\n",
432 (*fmt)->name, probe_size, score);
434 FILE *f = fopen("probestat.tmp", "ab");
435 fprintf(f, "probe_size:%d format:%s score:%d filename:%s\n", probe_size, (*fmt)->name, score, filename);
443 return AVERROR_INVALIDDATA;
446 /* Rewind. Reuse probe buffer to avoid seeking. */
447 ret = ffio_rewind_with_probe_data(pb, &buf, buf_offset);
449 return ret < 0 ? ret : score;
452 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
453 const char *filename, void *logctx,
454 unsigned int offset, unsigned int max_probe_size)
456 int ret = av_probe_input_buffer2(pb, fmt, filename, logctx, offset, max_probe_size);
457 return ret < 0 ? ret : 0;
460 /* Open input file and probe the format if necessary. */
461 static int init_input(AVFormatContext *s, const char *filename,
462 AVDictionary **options)
465 AVProbeData pd = { filename, NULL, 0 };
466 int score = AVPROBE_SCORE_RETRY;
469 s->flags |= AVFMT_FLAG_CUSTOM_IO;
471 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
473 else if (s->iformat->flags & AVFMT_NOFILE)
474 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
475 "will be ignored with AVFMT_NOFILE format.\n");
479 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
480 (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
483 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ | s->avio_flags,
484 &s->interrupt_callback, options)) < 0)
488 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
492 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
493 AVPacketList **plast_pktl)
495 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
500 (*plast_pktl)->next = pktl;
502 *packet_buffer = pktl;
504 /* Add the packet in the buffered packet list. */
510 int avformat_queue_attached_pictures(AVFormatContext *s)
513 for (i = 0; i < s->nb_streams; i++)
514 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
515 s->streams[i]->discard < AVDISCARD_ALL) {
516 AVPacket copy = s->streams[i]->attached_pic;
517 copy.buf = av_buffer_ref(copy.buf);
519 return AVERROR(ENOMEM);
521 add_to_pktbuf(&s->raw_packet_buffer, ©,
522 &s->raw_packet_buffer_end);
527 int avformat_open_input(AVFormatContext **ps, const char *filename,
528 AVInputFormat *fmt, AVDictionary **options)
530 AVFormatContext *s = *ps;
532 AVDictionary *tmp = NULL;
533 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
535 if (!s && !(s = avformat_alloc_context()))
536 return AVERROR(ENOMEM);
538 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
539 return AVERROR(EINVAL);
545 av_dict_copy(&tmp, *options, 0);
547 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
550 if ((ret = init_input(s, filename, &tmp)) < 0)
552 s->probe_score = ret;
553 avio_skip(s->pb, s->skip_initial_bytes);
555 /* Check filename in case an image number is expected. */
556 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
557 if (!av_filename_number_test(filename)) {
558 ret = AVERROR(EINVAL);
563 s->duration = s->start_time = AV_NOPTS_VALUE;
564 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
566 /* Allocate private data. */
567 if (s->iformat->priv_data_size > 0) {
568 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
569 ret = AVERROR(ENOMEM);
572 if (s->iformat->priv_class) {
573 *(const AVClass **) s->priv_data = s->iformat->priv_class;
574 av_opt_set_defaults(s->priv_data);
575 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
580 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
582 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, 0);
584 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
585 if ((ret = s->iformat->read_header(s)) < 0)
588 if (id3v2_extra_meta) {
589 if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
590 !strcmp(s->iformat->name, "tta")) {
591 if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
594 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
596 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
598 if ((ret = avformat_queue_attached_pictures(s)) < 0)
601 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
602 s->data_offset = avio_tell(s->pb);
604 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
607 av_dict_free(options);
614 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
616 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
618 avformat_free_context(s);
623 /*******************************************************/
625 static void force_codec_ids(AVFormatContext *s, AVStream *st)
627 switch (st->codec->codec_type) {
628 case AVMEDIA_TYPE_VIDEO:
629 if (s->video_codec_id)
630 st->codec->codec_id = s->video_codec_id;
632 case AVMEDIA_TYPE_AUDIO:
633 if (s->audio_codec_id)
634 st->codec->codec_id = s->audio_codec_id;
636 case AVMEDIA_TYPE_SUBTITLE:
637 if (s->subtitle_codec_id)
638 st->codec->codec_id = s->subtitle_codec_id;
643 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
645 if (st->request_probe>0) {
646 AVProbeData *pd = &st->probe_data;
648 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
652 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
654 av_log(s, AV_LOG_WARNING,
655 "Failed to reallocate probe buffer for stream %d\n",
660 memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
661 pd->buf_size += pkt->size;
662 memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
665 st->probe_packets = 0;
667 av_log(s, AV_LOG_WARNING,
668 "nothing to probe for stream %d\n", st->index);
672 end= s->raw_packet_buffer_remaining_size <= 0
673 || st->probe_packets<= 0;
675 if (end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
676 int score = set_codec_from_probe_data(s, st, pd);
677 if ( (st->codec->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
681 st->request_probe = -1;
682 if (st->codec->codec_id != AV_CODEC_ID_NONE) {
683 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
685 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
687 force_codec_ids(s, st);
693 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
695 int64_t ref = pkt->dts;
696 int i, pts_wrap_behavior;
697 int64_t pts_wrap_reference;
698 AVProgram *first_program;
700 if (ref == AV_NOPTS_VALUE)
702 if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
704 ref &= (1LL << st->pts_wrap_bits)-1;
706 // reference time stamp should be 60 s before first time stamp
707 pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
708 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
709 pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
710 (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
711 AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
713 first_program = av_find_program_from_stream(s, NULL, stream_index);
715 if (!first_program) {
716 int default_stream_index = av_find_default_stream_index(s);
717 if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
718 for (i = 0; i < s->nb_streams; i++) {
719 s->streams[i]->pts_wrap_reference = pts_wrap_reference;
720 s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
724 st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
725 st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
729 AVProgram *program = first_program;
731 if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
732 pts_wrap_reference = program->pts_wrap_reference;
733 pts_wrap_behavior = program->pts_wrap_behavior;
736 program = av_find_program_from_stream(s, program, stream_index);
739 // update every program with differing pts_wrap_reference
740 program = first_program;
742 if (program->pts_wrap_reference != pts_wrap_reference) {
743 for (i = 0; i<program->nb_stream_indexes; i++) {
744 s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
745 s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
748 program->pts_wrap_reference = pts_wrap_reference;
749 program->pts_wrap_behavior = pts_wrap_behavior;
751 program = av_find_program_from_stream(s, program, stream_index);
757 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
763 AVPacketList *pktl = s->raw_packet_buffer;
767 st = s->streams[pkt->stream_index];
768 if (s->raw_packet_buffer_remaining_size <= 0)
769 if ((err = probe_codec(s, st, NULL)) < 0)
771 if (st->request_probe <= 0) {
772 s->raw_packet_buffer = pktl->next;
773 s->raw_packet_buffer_remaining_size += pkt->size;
782 ret = s->iformat->read_packet(s, pkt);
784 if (!pktl || ret == AVERROR(EAGAIN))
786 for (i = 0; i < s->nb_streams; i++) {
788 if (st->probe_packets)
789 if ((err = probe_codec(s, st, NULL)) < 0)
791 av_assert0(st->request_probe <= 0);
796 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
797 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
798 av_log(s, AV_LOG_WARNING,
799 "Dropped corrupted packet (stream = %d)\n",
805 if (pkt->stream_index >= (unsigned)s->nb_streams) {
806 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
810 st = s->streams[pkt->stream_index];
812 if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
813 // correct first time stamps to negative values
814 if (!is_relative(st->first_dts))
815 st->first_dts = wrap_timestamp(st, st->first_dts);
816 if (!is_relative(st->start_time))
817 st->start_time = wrap_timestamp(st, st->start_time);
818 if (!is_relative(st->cur_dts))
819 st->cur_dts = wrap_timestamp(st, st->cur_dts);
822 pkt->dts = wrap_timestamp(st, pkt->dts);
823 pkt->pts = wrap_timestamp(st, pkt->pts);
825 force_codec_ids(s, st);
827 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
828 if (s->use_wallclock_as_timestamps)
829 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
831 if (!pktl && st->request_probe <= 0)
834 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
835 s->raw_packet_buffer_remaining_size -= pkt->size;
837 if ((err = probe_codec(s, st, pkt)) < 0)
842 #if FF_API_READ_PACKET
843 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
845 return ff_read_packet(s, pkt);
850 /**********************************************************/
852 static int determinable_frame_size(AVCodecContext *avctx)
854 if (/*avctx->codec_id == AV_CODEC_ID_AAC ||*/
855 avctx->codec_id == AV_CODEC_ID_MP1 ||
856 avctx->codec_id == AV_CODEC_ID_MP2 ||
857 avctx->codec_id == AV_CODEC_ID_MP3/* ||
858 avctx->codec_id == AV_CODEC_ID_CELT*/)
864 * Get the number of samples of an audio frame. Return -1 on error.
866 int ff_get_audio_frame_size(AVCodecContext *enc, int size, int mux)
870 /* give frame_size priority if demuxing */
871 if (!mux && enc->frame_size > 1)
872 return enc->frame_size;
874 if ((frame_size = av_get_audio_frame_duration(enc, size)) > 0)
877 /* Fall back on using frame_size if muxing. */
878 if (enc->frame_size > 1)
879 return enc->frame_size;
881 //For WMA we currently have no other means to calculate duration thus we
882 //do it here by assuming CBR, which is true for all known cases.
883 if (!mux && enc->bit_rate>0 && size>0 && enc->sample_rate>0 && enc->block_align>1) {
884 if (enc->codec_id == AV_CODEC_ID_WMAV1 || enc->codec_id == AV_CODEC_ID_WMAV2)
885 return ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
892 * Return the frame duration in seconds. Return 0 if not available.
894 void ff_compute_frame_duration(int *pnum, int *pden, AVStream *st,
895 AVCodecParserContext *pc, AVPacket *pkt)
901 switch (st->codec->codec_type) {
902 case AVMEDIA_TYPE_VIDEO:
903 if (st->r_frame_rate.num && !pc) {
904 *pnum = st->r_frame_rate.den;
905 *pden = st->r_frame_rate.num;
906 } else if (st->time_base.num * 1000LL > st->time_base.den) {
907 *pnum = st->time_base.num;
908 *pden = st->time_base.den;
909 } else if (st->codec->time_base.num * 1000LL > st->codec->time_base.den) {
910 *pnum = st->codec->time_base.num;
911 *pden = st->codec->time_base.den;
912 if (pc && pc->repeat_pict) {
913 if (*pnum > INT_MAX / (1 + pc->repeat_pict))
914 *pden /= 1 + pc->repeat_pict;
916 *pnum *= 1 + pc->repeat_pict;
918 /* If this codec can be interlaced or progressive then we need
919 * a parser to compute duration of a packet. Thus if we have
920 * no parser in such case leave duration undefined. */
921 if (st->codec->ticks_per_frame > 1 && !pc)
925 case AVMEDIA_TYPE_AUDIO:
926 frame_size = ff_get_audio_frame_size(st->codec, pkt->size, 0);
927 if (frame_size <= 0 || st->codec->sample_rate <= 0)
930 *pden = st->codec->sample_rate;
937 static int is_intra_only(AVCodecContext *enc) {
938 const AVCodecDescriptor *desc;
940 if (enc->codec_type != AVMEDIA_TYPE_VIDEO)
943 desc = av_codec_get_codec_descriptor(enc);
945 desc = avcodec_descriptor_get(enc->codec_id);
946 av_codec_set_codec_descriptor(enc, desc);
949 return !!(desc->props & AV_CODEC_PROP_INTRA_ONLY);
953 static int has_decode_delay_been_guessed(AVStream *st)
955 if (st->codec->codec_id != AV_CODEC_ID_H264) return 1;
956 if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
958 #if CONFIG_H264_DECODER
959 if (st->codec->has_b_frames &&
960 avpriv_h264_has_num_reorder_frames(st->codec) == st->codec->has_b_frames)
963 if (st->codec->has_b_frames<3)
964 return st->nb_decoded_frames >= 7;
965 else if (st->codec->has_b_frames<4)
966 return st->nb_decoded_frames >= 18;
968 return st->nb_decoded_frames >= 20;
971 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
975 if (pktl == s->packet_buffer_end)
976 return s->parse_queue;
980 static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
981 int onein_oneout = st->codec->codec_id != AV_CODEC_ID_H264 &&
982 st->codec->codec_id != AV_CODEC_ID_HEVC;
985 int delay = st->codec->has_b_frames;
988 if (dts == AV_NOPTS_VALUE) {
989 int64_t best_score = INT64_MAX;
990 for (i = 0; i<delay; i++) {
991 if (st->pts_reorder_error_count[i]) {
992 int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
993 if (score < best_score) {
1000 for (i = 0; i<delay; i++) {
1001 if (pts_buffer[i] != AV_NOPTS_VALUE) {
1002 int64_t diff = FFABS(pts_buffer[i] - dts)
1003 + (uint64_t)st->pts_reorder_error[i];
1004 diff = FFMAX(diff, st->pts_reorder_error[i]);
1005 st->pts_reorder_error[i] = diff;
1006 st->pts_reorder_error_count[i]++;
1007 if (st->pts_reorder_error_count[i] > 250) {
1008 st->pts_reorder_error[i] >>= 1;
1009 st->pts_reorder_error_count[i] >>= 1;
1016 if (dts == AV_NOPTS_VALUE)
1017 dts = pts_buffer[0];
1022 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
1023 int64_t dts, int64_t pts, AVPacket *pkt)
1025 AVStream *st = s->streams[stream_index];
1026 AVPacketList *pktl = s->packet_buffer ? s->packet_buffer : s->parse_queue;
1027 int64_t pts_buffer[MAX_REORDER_DELAY+1];
1031 if (st->first_dts != AV_NOPTS_VALUE ||
1032 dts == AV_NOPTS_VALUE ||
1033 st->cur_dts == AV_NOPTS_VALUE ||
1037 delay = st->codec->has_b_frames;
1038 st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
1040 shift = st->first_dts - RELATIVE_TS_BASE;
1042 for (i = 0; i<MAX_REORDER_DELAY+1; i++)
1043 pts_buffer[i] = AV_NOPTS_VALUE;
1045 if (is_relative(pts))
1048 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1049 if (pktl->pkt.stream_index != stream_index)
1051 if (is_relative(pktl->pkt.pts))
1052 pktl->pkt.pts += shift;
1054 if (is_relative(pktl->pkt.dts))
1055 pktl->pkt.dts += shift;
1057 if (st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
1058 st->start_time = pktl->pkt.pts;
1060 if (pktl->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)) {
1061 pts_buffer[0] = pktl->pkt.pts;
1062 for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
1063 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
1065 pktl->pkt.dts = select_from_pts_buffer(st, pts_buffer, pktl->pkt.dts);
1069 if (st->start_time == AV_NOPTS_VALUE)
1070 st->start_time = pts;
1073 static void update_initial_durations(AVFormatContext *s, AVStream *st,
1074 int stream_index, int duration)
1076 AVPacketList *pktl = s->packet_buffer ? s->packet_buffer : s->parse_queue;
1077 int64_t cur_dts = RELATIVE_TS_BASE;
1079 if (st->first_dts != AV_NOPTS_VALUE) {
1080 if (st->update_initial_durations_done)
1082 st->update_initial_durations_done = 1;
1083 cur_dts = st->first_dts;
1084 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1085 if (pktl->pkt.stream_index == stream_index) {
1086 if (pktl->pkt.pts != pktl->pkt.dts ||
1087 pktl->pkt.dts != AV_NOPTS_VALUE ||
1090 cur_dts -= duration;
1093 if (pktl && pktl->pkt.dts != st->first_dts) {
1094 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %d) in the queue\n",
1095 av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
1099 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
1102 pktl = s->packet_buffer ? s->packet_buffer : s->parse_queue;
1103 st->first_dts = cur_dts;
1104 } else if (st->cur_dts != RELATIVE_TS_BASE)
1107 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1108 if (pktl->pkt.stream_index != stream_index)
1110 if (pktl->pkt.pts == pktl->pkt.dts &&
1111 (pktl->pkt.dts == AV_NOPTS_VALUE || pktl->pkt.dts == st->first_dts) &&
1112 !pktl->pkt.duration) {
1113 pktl->pkt.dts = cur_dts;
1114 if (!st->codec->has_b_frames)
1115 pktl->pkt.pts = cur_dts;
1116 // if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
1117 pktl->pkt.duration = duration;
1120 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
1123 st->cur_dts = cur_dts;
1126 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1127 AVCodecParserContext *pc, AVPacket *pkt)
1129 int num, den, presentation_delayed, delay, i;
1131 AVRational duration;
1132 int onein_oneout = st->codec->codec_id != AV_CODEC_ID_H264 &&
1133 st->codec->codec_id != AV_CODEC_ID_HEVC;
1135 if (s->flags & AVFMT_FLAG_NOFILLIN)
1138 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
1139 if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
1140 if (st->last_dts_for_order_check <= pkt->dts) {
1143 av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
1144 "DTS %"PRIi64" < %"PRIi64" out of order\n",
1146 st->last_dts_for_order_check);
1147 st->dts_misordered++;
1149 if (st->dts_ordered + st->dts_misordered > 250) {
1150 st->dts_ordered >>= 1;
1151 st->dts_misordered >>= 1;
1155 st->last_dts_for_order_check = pkt->dts;
1156 if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
1157 pkt->dts = AV_NOPTS_VALUE;
1160 if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1161 pkt->dts = AV_NOPTS_VALUE;
1163 if (pc && pc->pict_type == AV_PICTURE_TYPE_B
1164 && !st->codec->has_b_frames)
1165 //FIXME Set low_delay = 0 when has_b_frames = 1
1166 st->codec->has_b_frames = 1;
1168 /* do we have a video B-frame ? */
1169 delay = st->codec->has_b_frames;
1170 presentation_delayed = 0;
1172 /* XXX: need has_b_frame, but cannot get it if the codec is
1173 * not initialized */
1175 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1176 presentation_delayed = 1;
1178 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
1179 st->pts_wrap_bits < 63 &&
1180 pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
1181 if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
1182 pkt->dts -= 1LL << st->pts_wrap_bits;
1184 pkt->pts += 1LL << st->pts_wrap_bits;
1187 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1188 * We take the conservative approach and discard both.
1189 * Note: If this is misbehaving for an H.264 file, then possibly
1190 * presentation_delayed is not set correctly. */
1191 if (delay == 1 && pkt->dts == pkt->pts &&
1192 pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
1193 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1194 if ( strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
1195 && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1196 pkt->dts = AV_NOPTS_VALUE;
1199 duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
1200 if (pkt->duration == 0) {
1201 ff_compute_frame_duration(&num, &den, st, pc, pkt);
1203 duration = (AVRational) {num, den};
1204 pkt->duration = av_rescale_rnd(1,
1205 num * (int64_t) st->time_base.den,
1206 den * (int64_t) st->time_base.num,
1211 if (pkt->duration != 0 && (s->packet_buffer || s->parse_queue))
1212 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1214 /* Correct timestamps with byte offset if demuxers only have timestamps
1215 * on packet boundaries */
1216 if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
1217 /* this will estimate bitrate based on this frame's duration and size */
1218 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1219 if (pkt->pts != AV_NOPTS_VALUE)
1221 if (pkt->dts != AV_NOPTS_VALUE)
1225 /* This may be redundant, but it should not hurt. */
1226 if (pkt->dts != AV_NOPTS_VALUE &&
1227 pkt->pts != AV_NOPTS_VALUE &&
1228 pkt->pts > pkt->dts)
1229 presentation_delayed = 1;
1232 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%d\n",
1233 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
1234 pkt->stream_index, pc, pkt->duration);
1235 /* Interpolate PTS and DTS if they are not present. We skip H264
1236 * currently because delay and has_b_frames are not reliably set. */
1237 if ((delay == 0 || (delay == 1 && pc)) &&
1239 if (presentation_delayed) {
1240 /* DTS = decompression timestamp */
1241 /* PTS = presentation timestamp */
1242 if (pkt->dts == AV_NOPTS_VALUE)
1243 pkt->dts = st->last_IP_pts;
1244 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1245 if (pkt->dts == AV_NOPTS_VALUE)
1246 pkt->dts = st->cur_dts;
1248 /* This is tricky: the dts must be incremented by the duration
1249 * of the frame we are displaying, i.e. the last I- or P-frame. */
1250 if (st->last_IP_duration == 0)
1251 st->last_IP_duration = pkt->duration;
1252 if (pkt->dts != AV_NOPTS_VALUE)
1253 st->cur_dts = pkt->dts + st->last_IP_duration;
1254 st->last_IP_duration = pkt->duration;
1255 st->last_IP_pts = pkt->pts;
1256 /* Cannot compute PTS if not present (we can compute it only
1257 * by knowing the future. */
1258 } else if (pkt->pts != AV_NOPTS_VALUE ||
1259 pkt->dts != AV_NOPTS_VALUE ||
1262 /* presentation is not delayed : PTS and DTS are the same */
1263 if (pkt->pts == AV_NOPTS_VALUE)
1264 pkt->pts = pkt->dts;
1265 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1267 if (pkt->pts == AV_NOPTS_VALUE)
1268 pkt->pts = st->cur_dts;
1269 pkt->dts = pkt->pts;
1270 if (pkt->pts != AV_NOPTS_VALUE)
1271 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
1275 if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)) {
1276 st->pts_buffer[0] = pkt->pts;
1277 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
1278 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
1280 pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
1282 // We skipped it above so we try here.
1284 // This should happen on the first packet
1285 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1286 if (pkt->dts > st->cur_dts)
1287 st->cur_dts = pkt->dts;
1289 av_dlog(NULL, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1290 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
1293 if (is_intra_only(st->codec))
1294 pkt->flags |= AV_PKT_FLAG_KEY;
1296 pkt->convergence_duration = pc->convergence_duration;
1299 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1302 AVPacketList *pktl = *pkt_buf;
1303 *pkt_buf = pktl->next;
1304 av_free_packet(&pktl->pkt);
1307 *pkt_buf_end = NULL;
1311 * Parse a packet, add all split parts to parse_queue.
1313 * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
1315 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1317 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1318 AVStream *st = s->streams[stream_index];
1319 uint8_t *data = pkt ? pkt->data : NULL;
1320 int size = pkt ? pkt->size : 0;
1321 int ret = 0, got_output = 0;
1324 av_init_packet(&flush_pkt);
1327 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1328 // preserve 0-size sync packets
1329 compute_pkt_fields(s, st, st->parser, pkt);
1332 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1335 av_init_packet(&out_pkt);
1336 len = av_parser_parse2(st->parser, st->codec,
1337 &out_pkt.data, &out_pkt.size, data, size,
1338 pkt->pts, pkt->dts, pkt->pos);
1340 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1342 /* increment read pointer */
1346 got_output = !!out_pkt.size;
1351 if (pkt->side_data) {
1352 out_pkt.side_data = pkt->side_data;
1353 out_pkt.side_data_elems = pkt->side_data_elems;
1354 pkt->side_data = NULL;
1355 pkt->side_data_elems = 0;
1358 /* set the duration */
1359 out_pkt.duration = 0;
1360 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1361 if (st->codec->sample_rate > 0) {
1363 av_rescale_q_rnd(st->parser->duration,
1364 (AVRational) { 1, st->codec->sample_rate },
1370 out_pkt.stream_index = st->index;
1371 out_pkt.pts = st->parser->pts;
1372 out_pkt.dts = st->parser->dts;
1373 out_pkt.pos = st->parser->pos;
1375 if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1376 out_pkt.pos = st->parser->frame_offset;
1378 if (st->parser->key_frame == 1 ||
1379 (st->parser->key_frame == -1 &&
1380 st->parser->pict_type == AV_PICTURE_TYPE_I))
1381 out_pkt.flags |= AV_PKT_FLAG_KEY;
1383 if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1384 out_pkt.flags |= AV_PKT_FLAG_KEY;
1386 compute_pkt_fields(s, st, st->parser, &out_pkt);
1388 if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
1389 out_pkt.buf = pkt->buf;
1391 #if FF_API_DESTRUCT_PACKET
1392 FF_DISABLE_DEPRECATION_WARNINGS
1393 out_pkt.destruct = pkt->destruct;
1394 pkt->destruct = NULL;
1395 FF_ENABLE_DEPRECATION_WARNINGS
1398 if ((ret = av_dup_packet(&out_pkt)) < 0)
1401 if (!add_to_pktbuf(&s->parse_queue, &out_pkt, &s->parse_queue_end)) {
1402 av_free_packet(&out_pkt);
1403 ret = AVERROR(ENOMEM);
1408 /* end of the stream => close and free the parser */
1409 if (pkt == &flush_pkt) {
1410 av_parser_close(st->parser);
1415 av_free_packet(pkt);
1419 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1420 AVPacketList **pkt_buffer_end,
1424 av_assert0(*pkt_buffer);
1427 *pkt_buffer = pktl->next;
1429 *pkt_buffer_end = NULL;
1434 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1436 int ret = 0, i, got_packet = 0;
1438 av_init_packet(pkt);
1440 while (!got_packet && !s->parse_queue) {
1444 /* read next packet */
1445 ret = ff_read_packet(s, &cur_pkt);
1447 if (ret == AVERROR(EAGAIN))
1449 /* flush the parsers */
1450 for (i = 0; i < s->nb_streams; i++) {
1452 if (st->parser && st->need_parsing)
1453 parse_packet(s, NULL, st->index);
1455 /* all remaining packets are now in parse_queue =>
1456 * really terminate parsing */
1460 st = s->streams[cur_pkt.stream_index];
1462 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1463 cur_pkt.dts != AV_NOPTS_VALUE &&
1464 cur_pkt.pts < cur_pkt.dts) {
1465 av_log(s, AV_LOG_WARNING,
1466 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1467 cur_pkt.stream_index,
1468 av_ts2str(cur_pkt.pts),
1469 av_ts2str(cur_pkt.dts),
1472 if (s->debug & FF_FDEBUG_TS)
1473 av_log(s, AV_LOG_DEBUG,
1474 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
1475 cur_pkt.stream_index,
1476 av_ts2str(cur_pkt.pts),
1477 av_ts2str(cur_pkt.dts),
1478 cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
1480 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1481 st->parser = av_parser_init(st->codec->codec_id);
1483 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1484 "%s, packets or times may be invalid.\n",
1485 avcodec_get_name(st->codec->codec_id));
1486 /* no parser available: just output the raw packets */
1487 st->need_parsing = AVSTREAM_PARSE_NONE;
1488 } else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1489 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1490 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1491 st->parser->flags |= PARSER_FLAG_ONCE;
1492 else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1493 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1496 if (!st->need_parsing || !st->parser) {
1497 /* no parsing needed: we just output the packet as is */
1499 compute_pkt_fields(s, st, NULL, pkt);
1500 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1501 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1502 ff_reduce_index(s, st->index);
1503 av_add_index_entry(st, pkt->pos, pkt->dts,
1504 0, 0, AVINDEX_KEYFRAME);
1507 } else if (st->discard < AVDISCARD_ALL) {
1508 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1512 av_free_packet(&cur_pkt);
1514 if (pkt->flags & AV_PKT_FLAG_KEY)
1515 st->skip_to_keyframe = 0;
1516 if (st->skip_to_keyframe) {
1517 av_free_packet(&cur_pkt);
1525 if (!got_packet && s->parse_queue)
1526 ret = read_from_packet_buffer(&s->parse_queue, &s->parse_queue_end, pkt);
1529 AVStream *st = s->streams[pkt->stream_index];
1530 if (st->skip_samples) {
1531 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1533 AV_WL32(p, st->skip_samples);
1534 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d\n", st->skip_samples);
1536 st->skip_samples = 0;
1539 if (st->inject_global_side_data) {
1540 for (i = 0; i < st->nb_side_data; i++) {
1541 AVPacketSideData *src_sd = &st->side_data[i];
1544 if (av_packet_get_side_data(pkt, src_sd->type, NULL))
1547 dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
1549 av_log(s, AV_LOG_WARNING, "Could not inject global side data\n");
1553 memcpy(dst_data, src_sd->data, src_sd->size);
1555 st->inject_global_side_data = 0;
1558 if (!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
1559 av_packet_merge_side_data(pkt);
1562 if (s->debug & FF_FDEBUG_TS)
1563 av_log(s, AV_LOG_DEBUG,
1564 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1565 "size=%d, duration=%d, flags=%d\n",
1567 av_ts2str(pkt->pts),
1568 av_ts2str(pkt->dts),
1569 pkt->size, pkt->duration, pkt->flags);
1574 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1576 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1582 ret = s->packet_buffer
1583 ? read_from_packet_buffer(&s->packet_buffer,
1584 &s->packet_buffer_end, pkt)
1585 : read_frame_internal(s, pkt);
1592 AVPacketList *pktl = s->packet_buffer;
1595 AVPacket *next_pkt = &pktl->pkt;
1597 if (next_pkt->dts != AV_NOPTS_VALUE) {
1598 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1599 // last dts seen for this stream. if any of packets following
1600 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1601 int64_t last_dts = next_pkt->dts;
1602 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1603 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1604 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0)) {
1605 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) {
1607 next_pkt->pts = pktl->pkt.dts;
1609 if (last_dts != AV_NOPTS_VALUE) {
1610 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1611 last_dts = pktl->pkt.dts;
1616 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1617 // Fixing the last reference frame had none pts issue (For MXF etc).
1618 // We only do this when
1620 // 2. we are not able to resolve a pts value for current packet.
1621 // 3. the packets for this stream at the end of the files had valid dts.
1622 next_pkt->pts = last_dts + next_pkt->duration;
1624 pktl = s->packet_buffer;
1627 /* read packet from packet buffer, if there is data */
1628 if (!(next_pkt->pts == AV_NOPTS_VALUE &&
1629 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1630 ret = read_from_packet_buffer(&s->packet_buffer,
1631 &s->packet_buffer_end, pkt);
1636 ret = read_frame_internal(s, pkt);
1638 if (pktl && ret != AVERROR(EAGAIN)) {
1645 if (av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1646 &s->packet_buffer_end)) < 0)
1647 return AVERROR(ENOMEM);
1652 st = s->streams[pkt->stream_index];
1653 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1654 ff_reduce_index(s, st->index);
1655 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1658 if (is_relative(pkt->dts))
1659 pkt->dts -= RELATIVE_TS_BASE;
1660 if (is_relative(pkt->pts))
1661 pkt->pts -= RELATIVE_TS_BASE;
1666 /* XXX: suppress the packet queue */
1667 static void flush_packet_queue(AVFormatContext *s)
1669 free_packet_buffer(&s->parse_queue, &s->parse_queue_end);
1670 free_packet_buffer(&s->packet_buffer, &s->packet_buffer_end);
1671 free_packet_buffer(&s->raw_packet_buffer, &s->raw_packet_buffer_end);
1673 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1676 /*******************************************************/
1679 int av_find_default_stream_index(AVFormatContext *s)
1681 int first_audio_index = -1;
1685 if (s->nb_streams <= 0)
1687 for (i = 0; i < s->nb_streams; i++) {
1689 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1690 !(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
1693 if (first_audio_index < 0 &&
1694 st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1695 first_audio_index = i;
1697 return first_audio_index >= 0 ? first_audio_index : 0;
1700 /** Flush the frame reader. */
1701 void ff_read_frame_flush(AVFormatContext *s)
1706 flush_packet_queue(s);
1708 /* Reset read state for each stream. */
1709 for (i = 0; i < s->nb_streams; i++) {
1713 av_parser_close(st->parser);
1716 st->last_IP_pts = AV_NOPTS_VALUE;
1717 st->last_dts_for_order_check = AV_NOPTS_VALUE;
1718 if (st->first_dts == AV_NOPTS_VALUE)
1719 st->cur_dts = RELATIVE_TS_BASE;
1721 /* We set the current DTS to an unspecified origin. */
1722 st->cur_dts = AV_NOPTS_VALUE;
1724 st->probe_packets = MAX_PROBE_PACKETS;
1726 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1727 st->pts_buffer[j] = AV_NOPTS_VALUE;
1729 if (s->internal->inject_global_side_data)
1730 st->inject_global_side_data = 1;
1734 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1738 for (i = 0; i < s->nb_streams; i++) {
1739 AVStream *st = s->streams[i];
1742 av_rescale(timestamp,
1743 st->time_base.den * (int64_t) ref_st->time_base.num,
1744 st->time_base.num * (int64_t) ref_st->time_base.den);
1748 void ff_reduce_index(AVFormatContext *s, int stream_index)
1750 AVStream *st = s->streams[stream_index];
1751 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1753 if ((unsigned) st->nb_index_entries >= max_entries) {
1755 for (i = 0; 2 * i < st->nb_index_entries; i++)
1756 st->index_entries[i] = st->index_entries[2 * i];
1757 st->nb_index_entries = i;
1761 int ff_add_index_entry(AVIndexEntry **index_entries,
1762 int *nb_index_entries,
1763 unsigned int *index_entries_allocated_size,
1764 int64_t pos, int64_t timestamp,
1765 int size, int distance, int flags)
1767 AVIndexEntry *entries, *ie;
1770 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1773 if (timestamp == AV_NOPTS_VALUE)
1774 return AVERROR(EINVAL);
1776 if (size < 0 || size > 0x3FFFFFFF)
1777 return AVERROR(EINVAL);
1779 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1780 timestamp -= RELATIVE_TS_BASE;
1782 entries = av_fast_realloc(*index_entries,
1783 index_entries_allocated_size,
1784 (*nb_index_entries + 1) *
1785 sizeof(AVIndexEntry));
1789 *index_entries = entries;
1791 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
1792 timestamp, AVSEEK_FLAG_ANY);
1795 index = (*nb_index_entries)++;
1796 ie = &entries[index];
1797 av_assert0(index == 0 || ie[-1].timestamp < timestamp);
1799 ie = &entries[index];
1800 if (ie->timestamp != timestamp) {
1801 if (ie->timestamp <= timestamp)
1803 memmove(entries + index + 1, entries + index,
1804 sizeof(AVIndexEntry) * (*nb_index_entries - index));
1805 (*nb_index_entries)++;
1806 } else if (ie->pos == pos && distance < ie->min_distance)
1807 // do not reduce the distance
1808 distance = ie->min_distance;
1812 ie->timestamp = timestamp;
1813 ie->min_distance = distance;
1820 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
1821 int size, int distance, int flags)
1823 timestamp = wrap_timestamp(st, timestamp);
1824 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1825 &st->index_entries_allocated_size, pos,
1826 timestamp, size, distance, flags);
1829 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1830 int64_t wanted_timestamp, int flags)
1838 // Optimize appending index entries at the end.
1839 if (b && entries[b - 1].timestamp < wanted_timestamp)
1844 timestamp = entries[m].timestamp;
1845 if (timestamp >= wanted_timestamp)
1847 if (timestamp <= wanted_timestamp)
1850 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1852 if (!(flags & AVSEEK_FLAG_ANY))
1853 while (m >= 0 && m < nb_entries &&
1854 !(entries[m].flags & AVINDEX_KEYFRAME))
1855 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1857 if (m == nb_entries)
1862 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
1864 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1865 wanted_timestamp, flags);
1868 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
1869 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1871 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
1872 if (stream_index >= 0)
1873 ts = wrap_timestamp(s->streams[stream_index], ts);
1877 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
1878 int64_t target_ts, int flags)
1880 AVInputFormat *avif = s->iformat;
1881 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1882 int64_t ts_min, ts_max, ts;
1887 if (stream_index < 0)
1890 av_dlog(s, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1893 ts_min = AV_NOPTS_VALUE;
1894 pos_limit = -1; // GCC falsely says it may be uninitialized.
1896 st = s->streams[stream_index];
1897 if (st->index_entries) {
1900 /* FIXME: Whole function must be checked for non-keyframe entries in
1901 * index case, especially read_timestamp(). */
1902 index = av_index_search_timestamp(st, target_ts,
1903 flags | AVSEEK_FLAG_BACKWARD);
1904 index = FFMAX(index, 0);
1905 e = &st->index_entries[index];
1907 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
1909 ts_min = e->timestamp;
1910 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
1911 pos_min, av_ts2str(ts_min));
1913 av_assert1(index == 0);
1916 index = av_index_search_timestamp(st, target_ts,
1917 flags & ~AVSEEK_FLAG_BACKWARD);
1918 av_assert0(index < st->nb_index_entries);
1920 e = &st->index_entries[index];
1921 av_assert1(e->timestamp >= target_ts);
1923 ts_max = e->timestamp;
1924 pos_limit = pos_max - e->min_distance;
1925 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
1926 " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
1930 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
1931 ts_min, ts_max, flags, &ts, avif->read_timestamp);
1936 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1939 ff_read_frame_flush(s);
1940 ff_update_cur_dts(s, st, ts);
1945 int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
1946 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1948 int64_t step = 1024;
1949 int64_t limit, ts_max;
1950 int64_t filesize = avio_size(s->pb);
1951 int64_t pos_max = filesize - 1;
1954 pos_max = FFMAX(0, (pos_max) - step);
1955 ts_max = ff_read_timestamp(s, stream_index,
1956 &pos_max, limit, read_timestamp);
1958 } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
1959 if (ts_max == AV_NOPTS_VALUE)
1963 int64_t tmp_pos = pos_max + 1;
1964 int64_t tmp_ts = ff_read_timestamp(s, stream_index,
1965 &tmp_pos, INT64_MAX, read_timestamp);
1966 if (tmp_ts == AV_NOPTS_VALUE)
1968 av_assert0(tmp_pos > pos_max);
1971 if (tmp_pos >= filesize)
1983 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1984 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1985 int64_t ts_min, int64_t ts_max,
1986 int flags, int64_t *ts_ret,
1987 int64_t (*read_timestamp)(struct AVFormatContext *, int,
1988 int64_t *, int64_t))
1995 av_dlog(s, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1997 if (ts_min == AV_NOPTS_VALUE) {
1998 pos_min = s->data_offset;
1999 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2000 if (ts_min == AV_NOPTS_VALUE)
2004 if (ts_min >= target_ts) {
2009 if (ts_max == AV_NOPTS_VALUE) {
2010 if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
2012 pos_limit = pos_max;
2015 if (ts_max <= target_ts) {
2020 if (ts_min > ts_max)
2022 else if (ts_min == ts_max)
2023 pos_limit = pos_min;
2026 while (pos_min < pos_limit) {
2028 "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
2029 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
2030 assert(pos_limit <= pos_max);
2032 if (no_change == 0) {
2033 int64_t approximate_keyframe_distance = pos_max - pos_limit;
2034 // interpolate position (better than dichotomy)
2035 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
2037 pos_min - approximate_keyframe_distance;
2038 } else if (no_change == 1) {
2039 // bisection if interpolation did not change min / max pos last time
2040 pos = (pos_min + pos_limit) >> 1;
2042 /* linear search if bisection failed, can only happen if there
2043 * are very few or no keyframes between min/max */
2048 else if (pos > pos_limit)
2052 // May pass pos_limit instead of -1.
2053 ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
2058 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
2059 " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
2060 pos_min, pos, pos_max,
2061 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
2062 pos_limit, start_pos, no_change);
2063 if (ts == AV_NOPTS_VALUE) {
2064 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
2067 assert(ts != AV_NOPTS_VALUE);
2068 if (target_ts <= ts) {
2069 pos_limit = start_pos - 1;
2073 if (target_ts >= ts) {
2079 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
2080 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
2083 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2085 ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2086 av_dlog(s, "pos=0x%"PRIx64" %s<=%s<=%s\n",
2087 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
2093 static int seek_frame_byte(AVFormatContext *s, int stream_index,
2094 int64_t pos, int flags)
2096 int64_t pos_min, pos_max;
2098 pos_min = s->data_offset;
2099 pos_max = avio_size(s->pb) - 1;
2103 else if (pos > pos_max)
2106 avio_seek(s->pb, pos, SEEK_SET);
2108 s->io_repositioned = 1;
2113 static int seek_frame_generic(AVFormatContext *s, int stream_index,
2114 int64_t timestamp, int flags)
2121 st = s->streams[stream_index];
2123 index = av_index_search_timestamp(st, timestamp, flags);
2125 if (index < 0 && st->nb_index_entries &&
2126 timestamp < st->index_entries[0].timestamp)
2129 if (index < 0 || index == st->nb_index_entries - 1) {
2133 if (st->nb_index_entries) {
2134 av_assert0(st->index_entries);
2135 ie = &st->index_entries[st->nb_index_entries - 1];
2136 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2138 ff_update_cur_dts(s, st, ie->timestamp);
2140 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
2146 read_status = av_read_frame(s, &pkt);
2147 } while (read_status == AVERROR(EAGAIN));
2148 if (read_status < 0)
2150 av_free_packet(&pkt);
2151 if (stream_index == pkt.stream_index && pkt.dts > timestamp) {
2152 if (pkt.flags & AV_PKT_FLAG_KEY)
2154 if (nonkey++ > 1000 && st->codec->codec_id != AV_CODEC_ID_CDGRAPHICS) {
2155 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);
2160 index = av_index_search_timestamp(st, timestamp, flags);
2165 ff_read_frame_flush(s);
2166 if (s->iformat->read_seek)
2167 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2169 ie = &st->index_entries[index];
2170 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2172 ff_update_cur_dts(s, st, ie->timestamp);
2177 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2178 int64_t timestamp, int flags)
2183 if (flags & AVSEEK_FLAG_BYTE) {
2184 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2186 ff_read_frame_flush(s);
2187 return seek_frame_byte(s, stream_index, timestamp, flags);
2190 if (stream_index < 0) {
2191 stream_index = av_find_default_stream_index(s);
2192 if (stream_index < 0)
2195 st = s->streams[stream_index];
2196 /* timestamp for default must be expressed in AV_TIME_BASE units */
2197 timestamp = av_rescale(timestamp, st->time_base.den,
2198 AV_TIME_BASE * (int64_t) st->time_base.num);
2201 /* first, we try the format specific seek */
2202 if (s->iformat->read_seek) {
2203 ff_read_frame_flush(s);
2204 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2210 if (s->iformat->read_timestamp &&
2211 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2212 ff_read_frame_flush(s);
2213 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2214 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2215 ff_read_frame_flush(s);
2216 return seek_frame_generic(s, stream_index, timestamp, flags);
2221 int av_seek_frame(AVFormatContext *s, int stream_index,
2222 int64_t timestamp, int flags)
2226 if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2227 int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2228 if ((flags & AVSEEK_FLAG_BACKWARD))
2232 return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2233 flags & ~AVSEEK_FLAG_BACKWARD);
2236 ret = seek_frame_internal(s, stream_index, timestamp, flags);
2239 ret = avformat_queue_attached_pictures(s);
2244 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
2245 int64_t ts, int64_t max_ts, int flags)
2247 if (min_ts > ts || max_ts < ts)
2249 if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2250 return AVERROR(EINVAL);
2253 flags |= AVSEEK_FLAG_ANY;
2254 flags &= ~AVSEEK_FLAG_BACKWARD;
2256 if (s->iformat->read_seek2) {
2258 ff_read_frame_flush(s);
2260 if (stream_index == -1 && s->nb_streams == 1) {
2261 AVRational time_base = s->streams[0]->time_base;
2262 ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2263 min_ts = av_rescale_rnd(min_ts, time_base.den,
2264 time_base.num * (int64_t)AV_TIME_BASE,
2265 AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
2266 max_ts = av_rescale_rnd(max_ts, time_base.den,
2267 time_base.num * (int64_t)AV_TIME_BASE,
2268 AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
2271 ret = s->iformat->read_seek2(s, stream_index, min_ts,
2275 ret = avformat_queue_attached_pictures(s);
2279 if (s->iformat->read_timestamp) {
2280 // try to seek via read_timestamp()
2283 // Fall back on old API if new is not implemented but old is.
2284 // Note the old API has somewhat different semantics.
2285 if (s->iformat->read_seek || 1) {
2286 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2287 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2288 if (ret<0 && ts != min_ts && max_ts != ts) {
2289 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2291 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2296 // try some generic seek like seek_frame_generic() but with new ts semantics
2297 return -1; //unreachable
2300 /*******************************************************/
2303 * Return TRUE if the stream has accurate duration in any stream.
2305 * @return TRUE if the stream has accurate duration for at least one component.
2307 static int has_duration(AVFormatContext *ic)
2312 for (i = 0; i < ic->nb_streams; i++) {
2313 st = ic->streams[i];
2314 if (st->duration != AV_NOPTS_VALUE)
2317 if (ic->duration != AV_NOPTS_VALUE)
2323 * Estimate the stream timings from the one of each components.
2325 * Also computes the global bitrate if possible.
2327 static void update_stream_timings(AVFormatContext *ic)
2329 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
2330 int64_t duration, duration1, filesize;
2335 start_time = INT64_MAX;
2336 start_time_text = INT64_MAX;
2337 end_time = INT64_MIN;
2338 duration = INT64_MIN;
2339 for (i = 0; i < ic->nb_streams; i++) {
2340 st = ic->streams[i];
2341 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2342 start_time1 = av_rescale_q(st->start_time, st->time_base,
2344 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codec->codec_type == AVMEDIA_TYPE_DATA) {
2345 if (start_time1 < start_time_text)
2346 start_time_text = start_time1;
2348 start_time = FFMIN(start_time, start_time1);
2349 end_time1 = AV_NOPTS_VALUE;
2350 if (st->duration != AV_NOPTS_VALUE) {
2351 end_time1 = start_time1 +
2352 av_rescale_q(st->duration, st->time_base,
2354 end_time = FFMAX(end_time, end_time1);
2356 for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
2357 if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2358 p->start_time = start_time1;
2359 if (p->end_time < end_time1)
2360 p->end_time = end_time1;
2363 if (st->duration != AV_NOPTS_VALUE) {
2364 duration1 = av_rescale_q(st->duration, st->time_base,
2366 duration = FFMAX(duration, duration1);
2369 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2370 start_time = start_time_text;
2371 else if (start_time > start_time_text)
2372 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2374 if (start_time != INT64_MAX) {
2375 ic->start_time = start_time;
2376 if (end_time != INT64_MIN) {
2377 if (ic->nb_programs) {
2378 for (i = 0; i < ic->nb_programs; i++) {
2379 p = ic->programs[i];
2380 if (p->start_time != AV_NOPTS_VALUE && p->end_time > p->start_time)
2381 duration = FFMAX(duration, p->end_time - p->start_time);
2384 duration = FFMAX(duration, end_time - start_time);
2387 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2388 ic->duration = duration;
2390 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
2391 /* compute the bitrate */
2392 double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2393 (double) ic->duration;
2394 if (bitrate >= 0 && bitrate <= INT_MAX)
2395 ic->bit_rate = bitrate;
2399 static void fill_all_stream_timings(AVFormatContext *ic)
2404 update_stream_timings(ic);
2405 for (i = 0; i < ic->nb_streams; i++) {
2406 st = ic->streams[i];
2407 if (st->start_time == AV_NOPTS_VALUE) {
2408 if (ic->start_time != AV_NOPTS_VALUE)
2409 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
2411 if (ic->duration != AV_NOPTS_VALUE)
2412 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
2418 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2420 int64_t filesize, duration;
2421 int i, show_warning = 0;
2424 /* if bit_rate is already set, we believe it */
2425 if (ic->bit_rate <= 0) {
2427 for (i = 0; i < ic->nb_streams; i++) {
2428 st = ic->streams[i];
2429 if (st->codec->bit_rate > 0) {
2430 if (INT_MAX - st->codec->bit_rate < bit_rate) {
2434 bit_rate += st->codec->bit_rate;
2437 ic->bit_rate = bit_rate;
2440 /* if duration is already set, we believe it */
2441 if (ic->duration == AV_NOPTS_VALUE &&
2442 ic->bit_rate != 0) {
2443 filesize = ic->pb ? avio_size(ic->pb) : 0;
2445 for (i = 0; i < ic->nb_streams; i++) {
2446 st = ic->streams[i];
2447 if ( st->time_base.num <= INT64_MAX / ic->bit_rate
2448 && st->duration == AV_NOPTS_VALUE) {
2449 duration = av_rescale(8 * filesize, st->time_base.den,
2451 (int64_t) st->time_base.num);
2452 st->duration = duration;
2459 av_log(ic, AV_LOG_WARNING,
2460 "Estimating duration from bitrate, this may be inaccurate\n");
2463 #define DURATION_MAX_READ_SIZE 250000LL
2464 #define DURATION_MAX_RETRY 4
2466 /* only usable for MPEG-PS streams */
2467 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2469 AVPacket pkt1, *pkt = &pkt1;
2471 int read_size, i, ret;
2473 int64_t filesize, offset, duration;
2476 /* flush packet queue */
2477 flush_packet_queue(ic);
2479 for (i = 0; i < ic->nb_streams; i++) {
2480 st = ic->streams[i];
2481 if (st->start_time == AV_NOPTS_VALUE &&
2482 st->first_dts == AV_NOPTS_VALUE &&
2483 st->codec->codec_type != AVMEDIA_TYPE_UNKNOWN)
2484 av_log(st->codec, AV_LOG_WARNING,
2485 "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2488 av_parser_close(st->parser);
2493 /* estimate the end time (duration) */
2494 /* XXX: may need to support wrapping */
2495 filesize = ic->pb ? avio_size(ic->pb) : 0;
2496 end_time = AV_NOPTS_VALUE;
2498 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
2502 avio_seek(ic->pb, offset, SEEK_SET);
2505 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
2509 ret = ff_read_packet(ic, pkt);
2510 } while (ret == AVERROR(EAGAIN));
2513 read_size += pkt->size;
2514 st = ic->streams[pkt->stream_index];
2515 if (pkt->pts != AV_NOPTS_VALUE &&
2516 (st->start_time != AV_NOPTS_VALUE ||
2517 st->first_dts != AV_NOPTS_VALUE)) {
2518 duration = end_time = pkt->pts;
2519 if (st->start_time != AV_NOPTS_VALUE)
2520 duration -= st->start_time;
2522 duration -= st->first_dts;
2524 if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
2525 (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2526 st->duration = duration;
2527 st->info->last_duration = duration;
2530 av_free_packet(pkt);
2532 } while (end_time == AV_NOPTS_VALUE &&
2533 filesize > (DURATION_MAX_READ_SIZE << retry) &&
2534 ++retry <= DURATION_MAX_RETRY);
2536 fill_all_stream_timings(ic);
2538 avio_seek(ic->pb, old_offset, SEEK_SET);
2539 for (i = 0; i < ic->nb_streams; i++) {
2542 st = ic->streams[i];
2543 st->cur_dts = st->first_dts;
2544 st->last_IP_pts = AV_NOPTS_VALUE;
2545 st->last_dts_for_order_check = AV_NOPTS_VALUE;
2546 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
2547 st->pts_buffer[j] = AV_NOPTS_VALUE;
2551 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2555 /* get the file size, if possible */
2556 if (ic->iformat->flags & AVFMT_NOFILE) {
2559 file_size = avio_size(ic->pb);
2560 file_size = FFMAX(0, file_size);
2563 if ((!strcmp(ic->iformat->name, "mpeg") ||
2564 !strcmp(ic->iformat->name, "mpegts")) &&
2565 file_size && ic->pb->seekable) {
2566 /* get accurate estimate from the PTSes */
2567 estimate_timings_from_pts(ic, old_offset);
2568 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2569 } else if (has_duration(ic)) {
2570 /* at least one component has timings - we use them for all
2572 fill_all_stream_timings(ic);
2573 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2575 /* less precise: use bitrate info */
2576 estimate_timings_from_bit_rate(ic);
2577 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2579 update_stream_timings(ic);
2583 AVStream av_unused *st;
2584 for (i = 0; i < ic->nb_streams; i++) {
2585 st = ic->streams[i];
2586 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2587 (double) st->start_time / AV_TIME_BASE,
2588 (double) st->duration / AV_TIME_BASE);
2591 "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2592 (double) ic->start_time / AV_TIME_BASE,
2593 (double) ic->duration / AV_TIME_BASE,
2594 ic->bit_rate / 1000);
2598 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2600 AVCodecContext *avctx = st->codec;
2602 #define FAIL(errmsg) do { \
2604 *errmsg_ptr = errmsg; \
2608 switch (avctx->codec_type) {
2609 case AVMEDIA_TYPE_AUDIO:
2610 if (!avctx->frame_size && determinable_frame_size(avctx))
2611 FAIL("unspecified frame size");
2612 if (st->info->found_decoder >= 0 &&
2613 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2614 FAIL("unspecified sample format");
2615 if (!avctx->sample_rate)
2616 FAIL("unspecified sample rate");
2617 if (!avctx->channels)
2618 FAIL("unspecified number of channels");
2619 if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
2620 FAIL("no decodable DTS frames");
2622 case AVMEDIA_TYPE_VIDEO:
2624 FAIL("unspecified size");
2625 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
2626 FAIL("unspecified pixel format");
2627 if (st->codec->codec_id == AV_CODEC_ID_RV30 || st->codec->codec_id == AV_CODEC_ID_RV40)
2628 if (!st->sample_aspect_ratio.num && !st->codec->sample_aspect_ratio.num && !st->codec_info_nb_frames)
2629 FAIL("no frame in rv30/40 and no sar");
2631 case AVMEDIA_TYPE_SUBTITLE:
2632 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
2633 FAIL("unspecified size");
2635 case AVMEDIA_TYPE_DATA:
2636 if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
2639 if (avctx->codec_id == AV_CODEC_ID_NONE)
2640 FAIL("unknown codec");
2644 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2645 static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
2646 AVDictionary **options)
2648 const AVCodec *codec;
2649 int got_picture = 1, ret = 0;
2650 AVFrame *frame = av_frame_alloc();
2651 AVSubtitle subtitle;
2652 AVPacket pkt = *avpkt;
2655 return AVERROR(ENOMEM);
2657 if (!avcodec_is_open(st->codec) &&
2658 st->info->found_decoder <= 0 &&
2659 (st->codec->codec_id != -st->info->found_decoder || !st->codec->codec_id)) {
2660 AVDictionary *thread_opt = NULL;
2662 codec = find_decoder(s, st, st->codec->codec_id);
2665 st->info->found_decoder = -st->codec->codec_id;
2670 /* Force thread count to 1 since the H.264 decoder will not extract
2671 * SPS and PPS to extradata during multi-threaded decoding. */
2672 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2673 ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
2675 av_dict_free(&thread_opt);
2677 st->info->found_decoder = -st->codec->codec_id;
2680 st->info->found_decoder = 1;
2681 } else if (!st->info->found_decoder)
2682 st->info->found_decoder = 1;
2684 if (st->info->found_decoder < 0) {
2689 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2691 (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
2692 (!st->codec_info_nb_frames &&
2693 st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2695 switch (st->codec->codec_type) {
2696 case AVMEDIA_TYPE_VIDEO:
2697 ret = avcodec_decode_video2(st->codec, frame,
2698 &got_picture, &pkt);
2700 case AVMEDIA_TYPE_AUDIO:
2701 ret = avcodec_decode_audio4(st->codec, frame, &got_picture, &pkt);
2703 case AVMEDIA_TYPE_SUBTITLE:
2704 ret = avcodec_decode_subtitle2(st->codec, &subtitle,
2705 &got_picture, &pkt);
2713 st->nb_decoded_frames++;
2720 if (!pkt.data && !got_picture)
2724 av_frame_free(&frame);
2728 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
2730 while (tags->id != AV_CODEC_ID_NONE) {
2738 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2741 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
2742 if (tag == tags[i].tag)
2744 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
2745 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2747 return AV_CODEC_ID_NONE;
2750 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
2755 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
2757 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
2759 return AV_CODEC_ID_NONE;
2764 if (sflags & (1 << (bps - 1))) {
2767 return AV_CODEC_ID_PCM_S8;
2769 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
2771 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
2773 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
2775 return AV_CODEC_ID_NONE;
2780 return AV_CODEC_ID_PCM_U8;
2782 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
2784 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
2786 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
2788 return AV_CODEC_ID_NONE;
2794 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
2797 if (!av_codec_get_tag2(tags, id, &tag))
2802 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
2806 for (i = 0; tags && tags[i]; i++) {
2807 const AVCodecTag *codec_tags = tags[i];
2808 while (codec_tags->id != AV_CODEC_ID_NONE) {
2809 if (codec_tags->id == id) {
2810 *tag = codec_tags->tag;
2819 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
2822 for (i = 0; tags && tags[i]; i++) {
2823 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
2824 if (id != AV_CODEC_ID_NONE)
2827 return AV_CODEC_ID_NONE;
2830 static void compute_chapters_end(AVFormatContext *s)
2833 int64_t max_time = s->duration +
2834 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2836 for (i = 0; i < s->nb_chapters; i++)
2837 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2838 AVChapter *ch = s->chapters[i];
2839 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
2843 for (j = 0; j < s->nb_chapters; j++) {
2844 AVChapter *ch1 = s->chapters[j];
2845 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
2847 if (j != i && next_start > ch->start && next_start < end)
2850 ch->end = (end == INT64_MAX) ? ch->start : end;
2854 static int get_std_framerate(int i)
2857 return (i + 1) * 1001;
2859 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i - 60 * 12] * 1000 * 12;
2862 /* Is the time base unreliable?
2863 * This is a heuristic to balance between quick acceptance of the values in
2864 * the headers vs. some extra checks.
2865 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2866 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2867 * And there are "variable" fps files this needs to detect as well. */
2868 static int tb_unreliable(AVCodecContext *c)
2870 if (c->time_base.den >= 101L * c->time_base.num ||
2871 c->time_base.den < 5L * c->time_base.num ||
2872 // c->codec_tag == AV_RL32("DIVX") ||
2873 // c->codec_tag == AV_RL32("XVID") ||
2874 c->codec_tag == AV_RL32("mp4v") ||
2875 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
2876 c->codec_id == AV_CODEC_ID_GIF ||
2877 c->codec_id == AV_CODEC_ID_H264)
2882 #if FF_API_FORMAT_PARAMETERS
2883 int av_find_stream_info(AVFormatContext *ic)
2885 return avformat_find_stream_info(ic, NULL);
2889 int ff_alloc_extradata(AVCodecContext *avctx, int size)
2893 if (size < 0 || size >= INT32_MAX - FF_INPUT_BUFFER_PADDING_SIZE) {
2894 avctx->extradata_size = 0;
2895 return AVERROR(EINVAL);
2897 avctx->extradata = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
2898 if (avctx->extradata) {
2899 memset(avctx->extradata + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2900 avctx->extradata_size = size;
2903 avctx->extradata_size = 0;
2904 ret = AVERROR(ENOMEM);
2909 int ff_get_extradata(AVCodecContext *avctx, AVIOContext *pb, int size)
2911 int ret = ff_alloc_extradata(avctx, size);
2914 ret = avio_read(pb, avctx->extradata, size);
2916 av_freep(&avctx->extradata);
2917 avctx->extradata_size = 0;
2918 av_log(avctx, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
2919 return ret < 0 ? ret : AVERROR_INVALIDDATA;
2925 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
2928 int64_t last = st->info->last_dts;
2930 if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
2931 && ts - (uint64_t)last < INT64_MAX) {
2932 double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
2933 int64_t duration = ts - last;
2935 if (!st->info->duration_error)
2936 st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
2937 if (!st->info->duration_error)
2938 return AVERROR(ENOMEM);
2940 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2941 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
2942 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
2943 if (st->info->duration_error[0][1][i] < 1e10) {
2944 int framerate = get_std_framerate(i);
2945 double sdts = dts*framerate/(1001*12);
2946 for (j= 0; j<2; j++) {
2947 int64_t ticks = llrint(sdts+j*0.5);
2948 double error= sdts - ticks + j*0.5;
2949 st->info->duration_error[j][0][i] += error;
2950 st->info->duration_error[j][1][i] += error*error;
2954 st->info->duration_count++;
2955 st->info->rfps_duration_sum += duration;
2957 if (st->info->duration_count % 10 == 0) {
2958 int n = st->info->duration_count;
2959 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
2960 if (st->info->duration_error[0][1][i] < 1e10) {
2961 double a0 = st->info->duration_error[0][0][i] / n;
2962 double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
2963 double a1 = st->info->duration_error[1][0][i] / n;
2964 double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
2965 if (error0 > 0.04 && error1 > 0.04) {
2966 st->info->duration_error[0][1][i] = 2e10;
2967 st->info->duration_error[1][1][i] = 2e10;
2973 // ignore the first 4 values, they might have some random jitter
2974 if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
2975 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2977 if (ts != AV_NOPTS_VALUE)
2978 st->info->last_dts = ts;
2983 void ff_rfps_calculate(AVFormatContext *ic)
2987 for (i = 0; i < ic->nb_streams; i++) {
2988 AVStream *st = ic->streams[i];
2990 if (st->codec->codec_type != AVMEDIA_TYPE_VIDEO)
2992 // the check for tb_unreliable() is not completely correct, since this is not about handling
2993 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2994 // ipmovie.c produces.
2995 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)
2996 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);
2997 if (st->info->duration_count>1 && !st->r_frame_rate.num
2998 && tb_unreliable(st->codec)) {
3000 double best_error= 0.01;
3001 AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
3003 for (j= 0; j<MAX_STD_TIMEBASES; j++) {
3006 if (st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
3008 if (!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
3011 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
3014 for (k= 0; k<2; k++) {
3015 int n = st->info->duration_count;
3016 double a= st->info->duration_error[k][0][j] / n;
3017 double error= st->info->duration_error[k][1][j]/n - a*a;
3019 if (error < best_error && best_error> 0.000000001) {
3021 num = get_std_framerate(j);
3024 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
3027 // do not increase frame rate by more than 1 % in order to match a standard rate.
3028 if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
3029 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
3031 if ( !st->avg_frame_rate.num
3032 && st->r_frame_rate.num && st->info->rfps_duration_sum
3033 && st->info->codec_info_duration <= 0
3034 && st->info->duration_count > 2
3035 && 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
3037 av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
3038 st->avg_frame_rate = st->r_frame_rate;
3041 av_freep(&st->info->duration_error);
3042 st->info->last_dts = AV_NOPTS_VALUE;
3043 st->info->duration_count = 0;
3044 st->info->rfps_duration_sum = 0;
3048 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3050 int i, count, ret = 0, j;
3053 AVPacket pkt1, *pkt;
3054 int64_t old_offset = avio_tell(ic->pb);
3055 // new streams might appear, no options for those
3056 int orig_nb_streams = ic->nb_streams;
3057 int flush_codecs = ic->probesize > 0;
3060 av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d\n",
3061 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count);
3063 for (i = 0; i < ic->nb_streams; i++) {
3064 const AVCodec *codec;
3065 AVDictionary *thread_opt = NULL;
3066 st = ic->streams[i];
3068 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3069 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3070 /* if (!st->time_base.num)
3072 if (!st->codec->time_base.num)
3073 st->codec->time_base = st->time_base;
3075 // only for the split stuff
3076 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
3077 st->parser = av_parser_init(st->codec->codec_id);
3079 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3080 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3081 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3082 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3084 } else if (st->need_parsing) {
3085 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3086 "%s, packets or times may be invalid.\n",
3087 avcodec_get_name(st->codec->codec_id));
3090 codec = find_decoder(ic, st, st->codec->codec_id);
3092 /* Force thread count to 1 since the H.264 decoder will not extract
3093 * SPS and PPS to extradata during multi-threaded decoding. */
3094 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3096 /* Ensure that subtitle_header is properly set. */
3097 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
3098 && codec && !st->codec->codec) {
3099 if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
3100 av_log(ic, AV_LOG_WARNING,
3101 "Failed to open codec in av_find_stream_info\n");
3104 // Try to just open decoders, in case this is enough to get parameters.
3105 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3106 if (codec && !st->codec->codec)
3107 if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
3108 av_log(ic, AV_LOG_WARNING,
3109 "Failed to open codec in av_find_stream_info\n");
3112 av_dict_free(&thread_opt);
3115 for (i = 0; i < ic->nb_streams; i++) {
3116 #if FF_API_R_FRAME_RATE
3117 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3119 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3120 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
3126 if (ff_check_interrupt(&ic->interrupt_callback)) {
3128 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3132 /* check if one codec still needs to be handled */
3133 for (i = 0; i < ic->nb_streams; i++) {
3134 int fps_analyze_framecount = 20;
3136 st = ic->streams[i];
3137 if (!has_codec_parameters(st, NULL))
3139 /* If the timebase is coarse (like the usual millisecond precision
3140 * of mkv), we need to analyze more frames to reliably arrive at
3141 * the correct fps. */
3142 if (av_q2d(st->time_base) > 0.0005)
3143 fps_analyze_framecount *= 2;
3144 if (!tb_unreliable(st->codec))
3145 fps_analyze_framecount = 0;
3146 if (ic->fps_probe_size >= 0)
3147 fps_analyze_framecount = ic->fps_probe_size;
3148 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3149 fps_analyze_framecount = 0;
3150 /* variable fps and no guess at the real fps */
3151 if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3152 st->info->duration_count < fps_analyze_framecount &&
3153 st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3155 if (st->parser && st->parser->parser->split &&
3156 !st->codec->extradata)
3158 if (st->first_dts == AV_NOPTS_VALUE &&
3159 (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3160 st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
3163 if (i == ic->nb_streams) {
3164 /* NOTE: If the format has no header, then we need to read some
3165 * packets to get most of the streams, so we cannot stop here. */
3166 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3167 /* If we found the info for all the codecs, we can stop. */
3169 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3174 /* We did not get all the codec info, but we read too much data. */
3175 if (read_size >= ic->probesize) {
3177 av_log(ic, AV_LOG_DEBUG,
3178 "Probe buffer size limit of %d bytes reached\n", ic->probesize);
3179 for (i = 0; i < ic->nb_streams; i++)
3180 if (!ic->streams[i]->r_frame_rate.num &&
3181 ic->streams[i]->info->duration_count <= 1 &&
3182 ic->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3183 strcmp(ic->iformat->name, "image2"))
3184 av_log(ic, AV_LOG_WARNING,
3185 "Stream #%d: not enough frames to estimate rate; "
3186 "consider increasing probesize\n", i);
3190 /* NOTE: A new stream can be added there if no header in file
3191 * (AVFMTCTX_NOHEADER). */
3192 ret = read_frame_internal(ic, &pkt1);
3193 if (ret == AVERROR(EAGAIN))
3201 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3202 free_packet_buffer(&ic->packet_buffer, &ic->packet_buffer_end);
3204 pkt = add_to_pktbuf(&ic->packet_buffer, &pkt1,
3205 &ic->packet_buffer_end);
3207 ret = AVERROR(ENOMEM);
3208 goto find_stream_info_err;
3210 if ((ret = av_dup_packet(pkt)) < 0)
3211 goto find_stream_info_err;
3214 st = ic->streams[pkt->stream_index];
3215 if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3216 read_size += pkt->size;
3218 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3219 /* check for non-increasing dts */
3220 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3221 st->info->fps_last_dts >= pkt->dts) {
3222 av_log(ic, AV_LOG_DEBUG,
3223 "Non-increasing DTS in stream %d: packet %d with DTS "
3224 "%"PRId64", packet %d with DTS %"PRId64"\n",
3225 st->index, st->info->fps_last_dts_idx,
3226 st->info->fps_last_dts, st->codec_info_nb_frames,
3228 st->info->fps_first_dts =
3229 st->info->fps_last_dts = AV_NOPTS_VALUE;
3231 /* Check for a discontinuity in dts. If the difference in dts
3232 * is more than 1000 times the average packet duration in the
3233 * sequence, we treat it as a discontinuity. */
3234 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3235 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3236 (pkt->dts - st->info->fps_last_dts) / 1000 >
3237 (st->info->fps_last_dts - st->info->fps_first_dts) /
3238 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3239 av_log(ic, AV_LOG_WARNING,
3240 "DTS discontinuity in stream %d: packet %d with DTS "
3241 "%"PRId64", packet %d with DTS %"PRId64"\n",
3242 st->index, st->info->fps_last_dts_idx,
3243 st->info->fps_last_dts, st->codec_info_nb_frames,
3245 st->info->fps_first_dts =
3246 st->info->fps_last_dts = AV_NOPTS_VALUE;
3249 /* update stored dts values */
3250 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3251 st->info->fps_first_dts = pkt->dts;
3252 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3254 st->info->fps_last_dts = pkt->dts;
3255 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3257 if (st->codec_info_nb_frames>1) {
3259 if (st->time_base.den > 0)
3260 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3261 if (st->avg_frame_rate.num > 0)
3262 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3265 && st->codec_info_nb_frames>30
3266 && st->info->fps_first_dts != AV_NOPTS_VALUE
3267 && st->info->fps_last_dts != AV_NOPTS_VALUE)
3268 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3270 if (t >= ic->max_analyze_duration) {
3271 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %d reached at %"PRId64" microseconds\n",
3272 ic->max_analyze_duration,
3276 if (pkt->duration) {
3277 st->info->codec_info_duration += pkt->duration;
3278 st->info->codec_info_duration_fields += st->parser && st->need_parsing && st->codec->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3281 #if FF_API_R_FRAME_RATE
3282 ff_rfps_add_frame(ic, st, pkt->dts);
3284 if (st->parser && st->parser->parser->split && !st->codec->extradata) {
3285 int i = st->parser->parser->split(st->codec, pkt->data, pkt->size);
3286 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
3287 if (ff_alloc_extradata(st->codec, i))
3288 return AVERROR(ENOMEM);
3289 memcpy(st->codec->extradata, pkt->data,
3290 st->codec->extradata_size);
3294 /* If still no information, we try to open the codec and to
3295 * decompress the frame. We try to avoid that in most cases as
3296 * it takes longer and uses more memory. For MPEG-4, we need to
3297 * decompress for QuickTime.
3299 * If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3300 * least one frame of codec data, this makes sure the codec initializes
3301 * the channel configuration and does not only trust the values from
3303 try_decode_frame(ic, st, pkt,
3304 (options && i < orig_nb_streams) ? &options[i] : NULL);
3306 st->codec_info_nb_frames++;
3311 AVPacket empty_pkt = { 0 };
3313 av_init_packet(&empty_pkt);
3315 for (i = 0; i < ic->nb_streams; i++) {
3317 st = ic->streams[i];
3319 /* flush the decoders */
3320 if (st->info->found_decoder == 1) {
3322 err = try_decode_frame(ic, st, &empty_pkt,
3323 (options && i < orig_nb_streams)
3324 ? &options[i] : NULL);
3325 } while (err > 0 && !has_codec_parameters(st, NULL));
3328 av_log(ic, AV_LOG_INFO,
3329 "decoding for stream %d failed\n", st->index);
3335 // close codecs which were opened in try_decode_frame()
3336 for (i = 0; i < ic->nb_streams; i++) {
3337 st = ic->streams[i];
3338 avcodec_close(st->codec);
3341 ff_rfps_calculate(ic);
3343 for (i = 0; i < ic->nb_streams; i++) {
3344 st = ic->streams[i];
3345 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3346 if (st->codec->codec_id == AV_CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample) {
3347 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
3348 if (avpriv_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
3349 st->codec->codec_tag= tag;
3352 /* estimate average framerate if not set by demuxer */
3353 if (st->info->codec_info_duration_fields &&
3354 !st->avg_frame_rate.num &&
3355 st->info->codec_info_duration) {
3357 double best_error = 0.01;
3359 if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
3360 st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
3361 st->info->codec_info_duration < 0)
3363 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3364 st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
3365 st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
3367 /* Round guessed framerate to a "standard" framerate if it's
3368 * within 1% of the original estimate. */
3369 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
3370 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
3371 double error = fabs(av_q2d(st->avg_frame_rate) /
3372 av_q2d(std_fps) - 1);
3374 if (error < best_error) {
3376 best_fps = std_fps.num;
3380 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3381 best_fps, 12 * 1001, INT_MAX);
3384 if (!st->r_frame_rate.num) {
3385 if ( st->codec->time_base.den * (int64_t) st->time_base.num
3386 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t) st->time_base.den) {
3387 st->r_frame_rate.num = st->codec->time_base.den;
3388 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
3390 st->r_frame_rate.num = st->time_base.den;
3391 st->r_frame_rate.den = st->time_base.num;
3394 } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
3395 if (!st->codec->bits_per_coded_sample)
3396 st->codec->bits_per_coded_sample =
3397 av_get_bits_per_sample(st->codec->codec_id);
3398 // set stream disposition based on audio service type
3399 switch (st->codec->audio_service_type) {
3400 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
3401 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
3403 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
3404 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
3406 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
3407 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
3409 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
3410 st->disposition = AV_DISPOSITION_COMMENT;
3412 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
3413 st->disposition = AV_DISPOSITION_KARAOKE;
3420 estimate_timings(ic, old_offset);
3422 if (ret >= 0 && ic->nb_streams)
3423 /* We could not have all the codec parameters before EOF. */
3425 for (i = 0; i < ic->nb_streams; i++) {
3427 st = ic->streams[i];
3428 if (!has_codec_parameters(st, &errmsg)) {
3430 avcodec_string(buf, sizeof(buf), st->codec, 0);
3431 av_log(ic, AV_LOG_WARNING,
3432 "Could not find codec parameters for stream %d (%s): %s\n"
3433 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
3440 compute_chapters_end(ic);
3442 find_stream_info_err:
3443 for (i = 0; i < ic->nb_streams; i++) {
3444 st = ic->streams[i];
3445 if (ic->streams[i]->codec->codec_type != AVMEDIA_TYPE_AUDIO)
3446 ic->streams[i]->codec->thread_count = 0;
3448 av_freep(&st->info->duration_error);
3449 av_freep(&ic->streams[i]->info);
3452 av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
3453 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
3457 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
3461 for (i = 0; i < ic->nb_programs; i++) {
3462 if (ic->programs[i] == last) {
3466 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
3467 if (ic->programs[i]->stream_index[j] == s)
3468 return ic->programs[i];
3474 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
3475 int wanted_stream_nb, int related_stream,
3476 AVCodec **decoder_ret, int flags)
3478 int i, nb_streams = ic->nb_streams;
3479 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe;
3480 unsigned *program = NULL;
3481 const AVCodec *decoder = NULL, *best_decoder = NULL;
3483 if (related_stream >= 0 && wanted_stream_nb < 0) {
3484 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
3486 program = p->stream_index;
3487 nb_streams = p->nb_stream_indexes;
3490 for (i = 0; i < nb_streams; i++) {
3491 int real_stream_index = program ? program[i] : i;
3492 AVStream *st = ic->streams[real_stream_index];
3493 AVCodecContext *avctx = st->codec;
3494 if (avctx->codec_type != type)
3496 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
3498 if (wanted_stream_nb != real_stream_index &&
3499 st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED |
3500 AV_DISPOSITION_VISUAL_IMPAIRED))
3502 if (type == AVMEDIA_TYPE_AUDIO && !avctx->channels)
3505 decoder = find_decoder(ic, st, st->codec->codec_id);
3508 ret = AVERROR_DECODER_NOT_FOUND;
3512 count = st->codec_info_nb_frames;
3513 bitrate = avctx->bit_rate;
3514 multiframe = FFMIN(5, count);
3515 if ((best_multiframe > multiframe) ||
3516 (best_multiframe == multiframe && best_bitrate > bitrate) ||
3517 (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
3520 best_bitrate = bitrate;
3521 best_multiframe = multiframe;
3522 ret = real_stream_index;
3523 best_decoder = decoder;
3524 if (program && i == nb_streams - 1 && ret < 0) {
3526 nb_streams = ic->nb_streams;
3527 /* no related stream found, try again with everything */
3532 *decoder_ret = (AVCodec*)best_decoder;
3536 /*******************************************************/
3538 int av_read_play(AVFormatContext *s)
3540 if (s->iformat->read_play)
3541 return s->iformat->read_play(s);
3543 return avio_pause(s->pb, 0);
3544 return AVERROR(ENOSYS);
3547 int av_read_pause(AVFormatContext *s)
3549 if (s->iformat->read_pause)
3550 return s->iformat->read_pause(s);
3552 return avio_pause(s->pb, 1);
3553 return AVERROR(ENOSYS);
3556 void ff_free_stream(AVFormatContext *s, AVStream *st) {
3558 av_assert0(s->nb_streams>0);
3559 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
3561 for (j = 0; j < st->nb_side_data; j++)
3562 av_freep(&st->side_data[j].data);
3563 av_freep(&st->side_data);
3564 st->nb_side_data = 0;
3567 av_parser_close(st->parser);
3569 if (st->attached_pic.data)
3570 av_free_packet(&st->attached_pic);
3571 av_dict_free(&st->metadata);
3572 av_freep(&st->probe_data.buf);
3573 av_freep(&st->index_entries);
3574 av_freep(&st->codec->extradata);
3575 av_freep(&st->codec->subtitle_header);
3576 av_freep(&st->codec);
3577 av_freep(&st->priv_data);
3579 av_freep(&st->info->duration_error);
3580 av_freep(&st->info);
3581 av_freep(&s->streams[ --s->nb_streams ]);
3584 void avformat_free_context(AVFormatContext *s)
3592 if (s->iformat && s->iformat->priv_class && s->priv_data)
3593 av_opt_free(s->priv_data);
3594 if (s->oformat && s->oformat->priv_class && s->priv_data)
3595 av_opt_free(s->priv_data);
3597 for (i = s->nb_streams - 1; i >= 0; i--) {
3598 ff_free_stream(s, s->streams[i]);
3600 for (i = s->nb_programs - 1; i >= 0; i--) {
3601 av_dict_free(&s->programs[i]->metadata);
3602 av_freep(&s->programs[i]->stream_index);
3603 av_freep(&s->programs[i]);
3605 av_freep(&s->programs);
3606 av_freep(&s->priv_data);
3607 while (s->nb_chapters--) {
3608 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
3609 av_freep(&s->chapters[s->nb_chapters]);
3611 av_freep(&s->chapters);
3612 av_dict_free(&s->metadata);
3613 av_freep(&s->streams);
3614 av_freep(&s->internal);
3618 #if FF_API_CLOSE_INPUT_FILE
3619 void av_close_input_file(AVFormatContext *s)
3621 avformat_close_input(&s);
3625 void avformat_close_input(AVFormatContext **ps)
3636 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
3637 (s->flags & AVFMT_FLAG_CUSTOM_IO))
3640 flush_packet_queue(s);
3643 if (s->iformat->read_close)
3644 s->iformat->read_close(s);
3646 avformat_free_context(s);
3653 #if FF_API_NEW_STREAM
3654 AVStream *av_new_stream(AVFormatContext *s, int id)
3656 AVStream *st = avformat_new_stream(s, NULL);
3663 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
3669 if (s->nb_streams >= INT_MAX/sizeof(*streams))
3671 streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
3674 s->streams = streams;
3676 st = av_mallocz(sizeof(AVStream));
3679 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
3683 st->info->last_dts = AV_NOPTS_VALUE;
3685 st->codec = avcodec_alloc_context3(c);
3687 /* no default bitrate if decoding */
3688 st->codec->bit_rate = 0;
3689 st->index = s->nb_streams;
3690 st->start_time = AV_NOPTS_VALUE;
3691 st->duration = AV_NOPTS_VALUE;
3692 /* we set the current DTS to 0 so that formats without any timestamps
3693 * but durations get some timestamps, formats with some unknown
3694 * timestamps have their first few packets buffered and the
3695 * timestamps corrected before they are returned to the user */
3696 st->cur_dts = s->iformat ? RELATIVE_TS_BASE : 0;
3697 st->first_dts = AV_NOPTS_VALUE;
3698 st->probe_packets = MAX_PROBE_PACKETS;
3699 st->pts_wrap_reference = AV_NOPTS_VALUE;
3700 st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
3702 /* default pts setting is MPEG-like */
3703 avpriv_set_pts_info(st, 33, 1, 90000);
3704 st->last_IP_pts = AV_NOPTS_VALUE;
3705 st->last_dts_for_order_check = AV_NOPTS_VALUE;
3706 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
3707 st->pts_buffer[i] = AV_NOPTS_VALUE;
3709 st->sample_aspect_ratio = (AVRational) { 0, 1 };
3711 #if FF_API_R_FRAME_RATE
3712 st->info->last_dts = AV_NOPTS_VALUE;
3714 st->info->fps_first_dts = AV_NOPTS_VALUE;
3715 st->info->fps_last_dts = AV_NOPTS_VALUE;
3717 st->inject_global_side_data = s->internal->inject_global_side_data;
3719 s->streams[s->nb_streams++] = st;
3723 AVProgram *av_new_program(AVFormatContext *ac, int id)
3725 AVProgram *program = NULL;
3728 av_dlog(ac, "new_program: id=0x%04x\n", id);
3730 for (i = 0; i < ac->nb_programs; i++)
3731 if (ac->programs[i]->id == id)
3732 program = ac->programs[i];
3735 program = av_mallocz(sizeof(AVProgram));
3738 dynarray_add(&ac->programs, &ac->nb_programs, program);
3739 program->discard = AVDISCARD_NONE;
3742 program->pts_wrap_reference = AV_NOPTS_VALUE;
3743 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
3745 program->start_time =
3746 program->end_time = AV_NOPTS_VALUE;
3751 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
3752 int64_t start, int64_t end, const char *title)
3754 AVChapter *chapter = NULL;
3757 for (i = 0; i < s->nb_chapters; i++)
3758 if (s->chapters[i]->id == id)
3759 chapter = s->chapters[i];
3762 chapter = av_mallocz(sizeof(AVChapter));
3765 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
3767 av_dict_set(&chapter->metadata, "title", title, 0);
3769 chapter->time_base = time_base;
3770 chapter->start = start;
3776 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
3779 AVProgram *program = NULL;
3782 if (idx >= ac->nb_streams) {
3783 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3787 for (i = 0; i < ac->nb_programs; i++) {
3788 if (ac->programs[i]->id != progid)
3790 program = ac->programs[i];
3791 for (j = 0; j < program->nb_stream_indexes; j++)
3792 if (program->stream_index[j] == idx)
3795 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
3798 program->stream_index = tmp;
3799 program->stream_index[program->nb_stream_indexes++] = idx;
3804 static void print_fps(double d, const char *postfix)
3806 uint64_t v = lrintf(d * 100);
3808 av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3809 else if (v % (100 * 1000))
3810 av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3812 av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d / 1000, postfix);
3815 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3817 if (m && !(av_dict_count(m) == 1 && av_dict_get(m, "language", NULL, 0))) {
3818 AVDictionaryEntry *tag = NULL;
3820 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3821 while ((tag = av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX)))
3822 if (strcmp("language", tag->key)) {
3823 const char *p = tag->value;
3824 av_log(ctx, AV_LOG_INFO,
3825 "%s %-16s: ", indent, tag->key);
3828 size_t len = strcspn(p, "\x8\xa\xb\xc\xd");
3829 av_strlcpy(tmp, p, FFMIN(sizeof(tmp), len+1));
3830 av_log(ctx, AV_LOG_INFO, "%s", tmp);
3832 if (*p == 0xd) av_log(ctx, AV_LOG_INFO, " ");
3833 if (*p == 0xa) av_log(ctx, AV_LOG_INFO, "\n%s %-16s: ", indent, "");
3836 av_log(ctx, AV_LOG_INFO, "\n");
3841 /* "user interface" functions */
3842 static void dump_stream_format(AVFormatContext *ic, int i,
3843 int index, int is_output)
3846 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3847 AVStream *st = ic->streams[i];
3848 int g = av_gcd(st->time_base.num, st->time_base.den);
3849 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3850 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3851 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
3852 /* the pid is an important information, so we display it */
3853 /* XXX: add a generic system */
3854 if (flags & AVFMT_SHOW_IDS)
3855 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3857 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3858 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames,
3859 st->time_base.num / g, st->time_base.den / g);
3860 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3861 if (st->sample_aspect_ratio.num && // default
3862 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3863 AVRational display_aspect_ratio;
3864 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3865 st->codec->width * st->sample_aspect_ratio.num,
3866 st->codec->height * st->sample_aspect_ratio.den,
3868 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3869 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3870 display_aspect_ratio.num, display_aspect_ratio.den);
3872 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3873 if (st->avg_frame_rate.den && st->avg_frame_rate.num)
3874 print_fps(av_q2d(st->avg_frame_rate), "fps");
3875 #if FF_API_R_FRAME_RATE
3876 if (st->r_frame_rate.den && st->r_frame_rate.num)
3877 print_fps(av_q2d(st->r_frame_rate), "tbr");
3879 if (st->time_base.den && st->time_base.num)
3880 print_fps(1 / av_q2d(st->time_base), "tbn");
3881 if (st->codec->time_base.den && st->codec->time_base.num)
3882 print_fps(1 / av_q2d(st->codec->time_base), "tbc");
3884 if (st->disposition & AV_DISPOSITION_DEFAULT)
3885 av_log(NULL, AV_LOG_INFO, " (default)");
3886 if (st->disposition & AV_DISPOSITION_DUB)
3887 av_log(NULL, AV_LOG_INFO, " (dub)");
3888 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3889 av_log(NULL, AV_LOG_INFO, " (original)");
3890 if (st->disposition & AV_DISPOSITION_COMMENT)
3891 av_log(NULL, AV_LOG_INFO, " (comment)");
3892 if (st->disposition & AV_DISPOSITION_LYRICS)
3893 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3894 if (st->disposition & AV_DISPOSITION_KARAOKE)
3895 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3896 if (st->disposition & AV_DISPOSITION_FORCED)
3897 av_log(NULL, AV_LOG_INFO, " (forced)");
3898 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3899 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3900 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3901 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3902 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3903 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3904 av_log(NULL, AV_LOG_INFO, "\n");
3905 dump_metadata(NULL, st->metadata, " ");
3908 void av_dump_format(AVFormatContext *ic, int index,
3909 const char *url, int is_output)
3912 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3913 if (ic->nb_streams && !printed)
3916 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3917 is_output ? "Output" : "Input",
3919 is_output ? ic->oformat->name : ic->iformat->name,
3920 is_output ? "to" : "from", url);
3921 dump_metadata(NULL, ic->metadata, " ");
3923 av_log(NULL, AV_LOG_INFO, " Duration: ");
3924 if (ic->duration != AV_NOPTS_VALUE) {
3925 int hours, mins, secs, us;
3926 int64_t duration = ic->duration + 5000;
3927 secs = duration / AV_TIME_BASE;
3928 us = duration % AV_TIME_BASE;
3933 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3934 (100 * us) / AV_TIME_BASE);
3936 av_log(NULL, AV_LOG_INFO, "N/A");
3938 if (ic->start_time != AV_NOPTS_VALUE) {
3940 av_log(NULL, AV_LOG_INFO, ", start: ");
3941 secs = ic->start_time / AV_TIME_BASE;
3942 us = abs(ic->start_time % AV_TIME_BASE);
3943 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3944 secs, (int) av_rescale(us, 1000000, AV_TIME_BASE));
3946 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3948 av_log(NULL, AV_LOG_INFO, "%d kb/s", ic->bit_rate / 1000);
3950 av_log(NULL, AV_LOG_INFO, "N/A");
3951 av_log(NULL, AV_LOG_INFO, "\n");
3953 for (i = 0; i < ic->nb_chapters; i++) {
3954 AVChapter *ch = ic->chapters[i];
3955 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3956 av_log(NULL, AV_LOG_INFO,
3957 "start %f, ", ch->start * av_q2d(ch->time_base));
3958 av_log(NULL, AV_LOG_INFO,
3959 "end %f\n", ch->end * av_q2d(ch->time_base));
3961 dump_metadata(NULL, ch->metadata, " ");
3963 if (ic->nb_programs) {
3964 int j, k, total = 0;
3965 for (j = 0; j < ic->nb_programs; j++) {
3966 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3968 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3969 name ? name->value : "");
3970 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3971 for (k = 0; k < ic->programs[j]->nb_stream_indexes; k++) {
3972 dump_stream_format(ic, ic->programs[j]->stream_index[k],
3974 printed[ic->programs[j]->stream_index[k]] = 1;
3976 total += ic->programs[j]->nb_stream_indexes;
3978 if (total < ic->nb_streams)
3979 av_log(NULL, AV_LOG_INFO, " No Program\n");
3981 for (i = 0; i < ic->nb_streams; i++)
3983 dump_stream_format(ic, i, index, is_output);
3988 uint64_t ff_ntp_time(void)
3990 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3993 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
3996 char *q, buf1[20], c;
3997 int nd, len, percentd_found;
4009 while (av_isdigit(*p))
4010 nd = nd * 10 + *p++ - '0';
4012 } while (av_isdigit(c));
4021 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
4023 if ((q - buf + len) > buf_size - 1)
4025 memcpy(q, buf1, len);
4033 if ((q - buf) < buf_size - 1)
4037 if (!percentd_found)
4046 #define HEXDUMP_PRINT(...) \
4049 av_log(avcl, level, __VA_ARGS__); \
4051 fprintf(f, __VA_ARGS__); \
4054 static void hex_dump_internal(void *avcl, FILE *f, int level,
4055 const uint8_t *buf, int size)
4059 for (i = 0; i < size; i += 16) {
4063 HEXDUMP_PRINT("%08x ", i);
4064 for (j = 0; j < 16; j++) {
4066 HEXDUMP_PRINT(" %02x", buf[i + j]);
4071 for (j = 0; j < len; j++) {
4073 if (c < ' ' || c > '~')
4075 HEXDUMP_PRINT("%c", c);
4077 HEXDUMP_PRINT("\n");
4081 void av_hex_dump(FILE *f, const uint8_t *buf, int size)
4083 hex_dump_internal(NULL, f, 0, buf, size);
4086 void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size)
4088 hex_dump_internal(avcl, NULL, level, buf, size);
4091 static void pkt_dump_internal(void *avcl, FILE *f, int level, const AVPacket *pkt,
4092 int dump_payload, AVRational time_base)
4094 HEXDUMP_PRINT("stream #%d:\n", pkt->stream_index);
4095 HEXDUMP_PRINT(" keyframe=%d\n", (pkt->flags & AV_PKT_FLAG_KEY) != 0);
4096 HEXDUMP_PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
4097 /* DTS is _always_ valid after av_read_frame() */
4098 HEXDUMP_PRINT(" dts=");
4099 if (pkt->dts == AV_NOPTS_VALUE)
4100 HEXDUMP_PRINT("N/A");
4102 HEXDUMP_PRINT("%0.3f", pkt->dts * av_q2d(time_base));
4103 /* PTS may not be known if B-frames are present. */
4104 HEXDUMP_PRINT(" pts=");
4105 if (pkt->pts == AV_NOPTS_VALUE)
4106 HEXDUMP_PRINT("N/A");
4108 HEXDUMP_PRINT("%0.3f", pkt->pts * av_q2d(time_base));
4109 HEXDUMP_PRINT("\n");
4110 HEXDUMP_PRINT(" size=%d\n", pkt->size);
4112 av_hex_dump(f, pkt->data, pkt->size);
4115 void av_pkt_dump2(FILE *f, const AVPacket *pkt, int dump_payload, const AVStream *st)
4117 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
4120 void av_pkt_dump_log2(void *avcl, int level, const AVPacket *pkt, int dump_payload,
4123 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
4126 void av_url_split(char *proto, int proto_size,
4127 char *authorization, int authorization_size,
4128 char *hostname, int hostname_size,
4129 int *port_ptr, char *path, int path_size, const char *url)
4131 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
4137 if (authorization_size > 0)
4138 authorization[0] = 0;
4139 if (hostname_size > 0)
4144 /* parse protocol */
4145 if ((p = strchr(url, ':'))) {
4146 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4153 /* no protocol means plain filename */
4154 av_strlcpy(path, url, path_size);
4158 /* separate path from hostname */
4159 ls = strchr(p, '/');
4160 ls2 = strchr(p, '?');
4164 ls = FFMIN(ls, ls2);
4166 av_strlcpy(path, ls, path_size);
4168 ls = &p[strlen(p)]; // XXX
4170 /* the rest is hostname, use that to parse auth/port */
4172 /* authorization (user[:pass]@hostname) */
4174 while ((at = strchr(p, '@')) && at < ls) {
4175 av_strlcpy(authorization, at2,
4176 FFMIN(authorization_size, at + 1 - at2));
4177 p = at + 1; /* skip '@' */
4180 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4182 av_strlcpy(hostname, p + 1,
4183 FFMIN(hostname_size, brk - p));
4184 if (brk[1] == ':' && port_ptr)
4185 *port_ptr = atoi(brk + 2);
4186 } else if ((col = strchr(p, ':')) && col < ls) {
4187 av_strlcpy(hostname, p,
4188 FFMIN(col + 1 - p, hostname_size));
4190 *port_ptr = atoi(col + 1);
4192 av_strlcpy(hostname, p,
4193 FFMIN(ls + 1 - p, hostname_size));
4197 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4200 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4203 'C', 'D', 'E', 'F' };
4204 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4207 'c', 'd', 'e', 'f' };
4208 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4210 for (i = 0; i < s; i++) {
4211 buff[i * 2] = hex_table[src[i] >> 4];
4212 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4218 int ff_hex_to_data(uint8_t *data, const char *p)
4225 p += strspn(p, SPACE_CHARS);
4228 c = av_toupper((unsigned char) *p++);
4229 if (c >= '0' && c <= '9')
4231 else if (c >= 'A' && c <= 'F')
4246 #if FF_API_SET_PTS_INFO
4247 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
4248 unsigned int pts_num, unsigned int pts_den)
4250 avpriv_set_pts_info(s, pts_wrap_bits, pts_num, pts_den);
4254 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4255 unsigned int pts_num, unsigned int pts_den)
4258 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
4259 if (new_tb.num != pts_num)
4260 av_log(NULL, AV_LOG_DEBUG,
4261 "st:%d removing common factor %d from timebase\n",
4262 s->index, pts_num / new_tb.num);
4264 av_log(NULL, AV_LOG_WARNING,
4265 "st:%d has too large timebase, reducing\n", s->index);
4267 if (new_tb.num <= 0 || new_tb.den <= 0) {
4268 av_log(NULL, AV_LOG_ERROR,
4269 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4270 new_tb.num, new_tb.den,
4274 s->time_base = new_tb;
4275 av_codec_set_pkt_timebase(s->codec, new_tb);
4276 s->pts_wrap_bits = pts_wrap_bits;
4279 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4282 const char *ptr = str;
4284 /* Parse key=value pairs. */
4287 char *dest = NULL, *dest_end;
4288 int key_len, dest_len = 0;
4290 /* Skip whitespace and potential commas. */
4291 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4298 if (!(ptr = strchr(key, '=')))
4301 key_len = ptr - key;
4303 callback_get_buf(context, key, key_len, &dest, &dest_len);
4304 dest_end = dest + dest_len - 1;
4308 while (*ptr && *ptr != '\"') {
4312 if (dest && dest < dest_end)
4316 if (dest && dest < dest_end)
4324 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
4325 if (dest && dest < dest_end)
4333 int ff_find_stream_index(AVFormatContext *s, int id)
4336 for (i = 0; i < s->nb_streams; i++)
4337 if (s->streams[i]->id == id)
4342 int64_t ff_iso8601_to_unix_time(const char *datestr)
4344 struct tm time1 = { 0 }, time2 = { 0 };
4346 ret1 = av_small_strptime(datestr, "%Y - %m - %d %H:%M:%S", &time1);
4347 ret2 = av_small_strptime(datestr, "%Y - %m - %dT%H:%M:%S", &time2);
4349 return av_timegm(&time2);
4351 return av_timegm(&time1);
4354 int avformat_query_codec(AVOutputFormat *ofmt, enum AVCodecID codec_id,
4358 if (ofmt->query_codec)
4359 return ofmt->query_codec(codec_id, std_compliance);
4360 else if (ofmt->codec_tag)
4361 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4362 else if (codec_id == ofmt->video_codec ||
4363 codec_id == ofmt->audio_codec ||
4364 codec_id == ofmt->subtitle_codec)
4367 return AVERROR_PATCHWELCOME;
4370 int avformat_network_init(void)
4374 ff_network_inited_globally = 1;
4375 if ((ret = ff_network_init()) < 0)
4382 int avformat_network_deinit(void)
4391 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4392 uint64_t channel_layout, int32_t sample_rate,
4393 int32_t width, int32_t height)
4399 return AVERROR(EINVAL);
4402 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4404 if (channel_layout) {
4406 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4410 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4412 if (width || height) {
4414 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4416 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4418 return AVERROR(ENOMEM);
4419 bytestream_put_le32(&data, flags);
4421 bytestream_put_le32(&data, channels);
4423 bytestream_put_le64(&data, channel_layout);
4425 bytestream_put_le32(&data, sample_rate);
4426 if (width || height) {
4427 bytestream_put_le32(&data, width);
4428 bytestream_put_le32(&data, height);
4433 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
4435 AVRational undef = {0, 1};
4436 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
4437 AVRational codec_sample_aspect_ratio = stream && stream->codec ? stream->codec->sample_aspect_ratio : undef;
4438 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
4440 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
4441 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
4442 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
4443 stream_sample_aspect_ratio = undef;
4445 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
4446 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
4447 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
4448 frame_sample_aspect_ratio = undef;
4450 if (stream_sample_aspect_ratio.num)
4451 return stream_sample_aspect_ratio;
4453 return frame_sample_aspect_ratio;
4456 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
4458 AVRational fr = st->r_frame_rate;
4459 AVRational codec_fr = av_inv_q(st->codec->time_base);
4460 AVRational avg_fr = st->avg_frame_rate;
4462 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
4463 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
4468 if (st->codec->ticks_per_frame > 1) {
4469 codec_fr.den *= st->codec->ticks_per_frame;
4470 if ( codec_fr.num > 0 && codec_fr.den > 0 && av_q2d(codec_fr) < av_q2d(fr)*0.7
4471 && fabs(1.0 - av_q2d(av_div_q(avg_fr, fr))) > 0.1)
4478 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
4481 if (*spec <= '9' && *spec >= '0') /* opt:index */
4482 return strtol(spec, NULL, 0) == st->index;
4483 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
4484 *spec == 't') { /* opt:[vasdt] */
4485 enum AVMediaType type;
4488 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
4489 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
4490 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
4491 case 'd': type = AVMEDIA_TYPE_DATA; break;
4492 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
4493 default: av_assert0(0);
4495 if (type != st->codec->codec_type)
4497 if (*spec++ == ':') { /* possibly followed by :index */
4498 int i, index = strtol(spec, NULL, 0);
4499 for (i = 0; i < s->nb_streams; i++)
4500 if (s->streams[i]->codec->codec_type == type && index-- == 0)
4501 return i == st->index;
4505 } else if (*spec == 'p' && *(spec + 1) == ':') {
4509 prog_id = strtol(spec, &endptr, 0);
4510 for (i = 0; i < s->nb_programs; i++) {
4511 if (s->programs[i]->id != prog_id)
4514 if (*endptr++ == ':') {
4515 int stream_idx = strtol(endptr, NULL, 0);
4516 return stream_idx >= 0 &&
4517 stream_idx < s->programs[i]->nb_stream_indexes &&
4518 st->index == s->programs[i]->stream_index[stream_idx];
4521 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
4522 if (st->index == s->programs[i]->stream_index[j])
4526 } else if (*spec == '#' ||
4527 (*spec == 'i' && *(spec + 1) == ':')) {
4530 spec += 1 + (*spec == 'i');
4531 stream_id = strtol(spec, &endptr, 0);
4533 return stream_id == st->id;
4534 } else if (!*spec) /* empty specifier, matches everything */
4537 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
4538 return AVERROR(EINVAL);
4541 int ff_generate_avci_extradata(AVStream *st)
4543 static const uint8_t avci100_1080p_extradata[] = {
4545 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4546 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4547 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4548 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
4549 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
4550 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
4551 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
4552 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
4553 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4555 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4558 static const uint8_t avci100_1080i_extradata[] = {
4560 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4561 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4562 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4563 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
4564 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
4565 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
4566 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
4567 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
4568 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
4569 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
4570 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x00,
4572 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4575 static const uint8_t avci50_1080i_extradata[] = {
4577 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4578 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4579 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4580 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
4581 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
4582 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
4583 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
4584 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
4585 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
4586 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
4587 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
4589 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4592 static const uint8_t avci100_720p_extradata[] = {
4594 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4595 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
4596 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
4597 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
4598 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
4599 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
4600 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
4601 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
4602 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
4603 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
4605 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
4609 const uint8_t *data = NULL;
4612 if (st->codec->width == 1920) {
4613 if (st->codec->field_order == AV_FIELD_PROGRESSIVE) {
4614 data = avci100_1080p_extradata;
4615 size = sizeof(avci100_1080p_extradata);
4617 data = avci100_1080i_extradata;
4618 size = sizeof(avci100_1080i_extradata);
4620 } else if (st->codec->width == 1440) {
4621 data = avci50_1080i_extradata;
4622 size = sizeof(avci50_1080i_extradata);
4623 } else if (st->codec->width == 1280) {
4624 data = avci100_720p_extradata;
4625 size = sizeof(avci100_720p_extradata);
4631 av_freep(&st->codec->extradata);
4632 if (ff_alloc_extradata(st->codec, size))
4633 return AVERROR(ENOMEM);
4634 memcpy(st->codec->extradata, data, size);