2 * various utility functions for use within Libav
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; 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"
39 #include "libavcodec/bytestream.h"
40 #include "libavcodec/internal.h"
42 #include "audiointerleave.h"
44 #include "avio_internal.h"
56 * various utility functions for use within Libav
59 unsigned avformat_version(void)
61 return LIBAVFORMAT_VERSION_INT;
64 const char *avformat_configuration(void)
66 return LIBAV_CONFIGURATION;
69 const char *avformat_license(void)
71 #define LICENSE_PREFIX "libavformat license: "
72 return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
75 /* an arbitrarily chosen "sane" max packet size -- 50M */
76 #define SANE_CHUNK_SIZE (50000000)
78 /* Read the data in sane-sized chunks and append to pkt.
79 * Return the number of bytes read or an error. */
80 static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
82 int64_t chunk_size = size;
83 int64_t orig_pos = pkt->pos; // av_grow_packet might reset pos
84 int orig_size = pkt->size;
88 int prev_size = pkt->size;
91 /* When the caller requests a lot of data, limit it to the amount
92 * left in file or SANE_CHUNK_SIZE when it is not known. */
93 if (size > SANE_CHUNK_SIZE) {
94 int64_t filesize = avio_size(s) - avio_tell(s);
95 chunk_size = FFMAX(filesize, SANE_CHUNK_SIZE);
97 read_size = FFMIN(size, chunk_size);
99 ret = av_grow_packet(pkt, read_size);
103 ret = avio_read(s, pkt->data + prev_size, read_size);
104 if (ret != read_size) {
105 av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
115 return pkt->size > orig_size ? pkt->size - orig_size : ret;
118 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
123 pkt->pos = avio_tell(s);
125 return append_packet_chunked(s, pkt, size);
128 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
131 return av_get_packet(s, pkt, size);
132 return append_packet_chunked(s, pkt, size);
135 int av_filename_number_test(const char *filename)
139 (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0);
142 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened,
145 AVProbeData lpd = *pd;
146 AVInputFormat *fmt1 = NULL, *fmt;
149 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
150 int id3len = ff_id3v2_tag_len(lpd.buf);
151 if (lpd.buf_size > id3len + 16) {
153 lpd.buf_size -= id3len;
159 while ((fmt1 = av_iformat_next(fmt1))) {
160 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
163 if (fmt1->read_probe) {
164 score = fmt1->read_probe(&lpd);
165 } else if (fmt1->extensions) {
166 if (av_match_ext(lpd.filename, fmt1->extensions))
167 score = AVPROBE_SCORE_EXTENSION;
169 if (score > *score_max) {
172 } else if (score == *score_max)
176 // A hack for files with huge id3v2 tags -- try to guess by file extension.
177 if (!fmt && is_opened && *score_max < AVPROBE_SCORE_EXTENSION / 2) {
178 while ((fmt = av_iformat_next(fmt)))
179 if (fmt->extensions &&
180 av_match_ext(lpd.filename, fmt->extensions)) {
181 *score_max = AVPROBE_SCORE_EXTENSION / 2;
186 if (!fmt && id3 && *score_max < AVPROBE_SCORE_EXTENSION / 2 - 1) {
187 while ((fmt = av_iformat_next(fmt)))
188 if (fmt->extensions && av_match_ext("mp3", fmt->extensions)) {
189 *score_max = AVPROBE_SCORE_EXTENSION / 2 - 1;
197 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)
200 return av_probe_input_format2(pd, is_opened, &score);
203 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
204 AVProbeData *pd, int score)
206 static const struct {
209 enum AVMediaType type;
211 { "aac", AV_CODEC_ID_AAC, AVMEDIA_TYPE_AUDIO },
212 { "ac3", AV_CODEC_ID_AC3, AVMEDIA_TYPE_AUDIO },
213 { "dts", AV_CODEC_ID_DTS, AVMEDIA_TYPE_AUDIO },
214 { "eac3", AV_CODEC_ID_EAC3, AVMEDIA_TYPE_AUDIO },
215 { "h264", AV_CODEC_ID_H264, AVMEDIA_TYPE_VIDEO },
216 { "m4v", AV_CODEC_ID_MPEG4, AVMEDIA_TYPE_VIDEO },
217 { "mp3", AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO },
218 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
221 AVInputFormat *fmt = av_probe_input_format2(pd, 1, &score);
225 av_log(s, AV_LOG_DEBUG,
226 "Probe with size=%d, packets=%d detected %s with score=%d\n",
227 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets,
229 for (i = 0; fmt_id_type[i].name; i++) {
230 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
231 st->codec->codec_id = fmt_id_type[i].id;
232 st->codec->codec_type = fmt_id_type[i].type;
240 /************************************************************/
241 /* input media file */
243 /** size of probe buffer, for guessing file type from file contents */
244 #define PROBE_BUF_MIN 2048
245 #define PROBE_BUF_MAX (1 << 20)
247 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
248 const char *filename, void *logctx,
249 unsigned int offset, unsigned int max_probe_size)
251 AVProbeData pd = { filename ? filename : "" };
253 int ret = 0, probe_size;
256 max_probe_size = PROBE_BUF_MAX;
257 else if (max_probe_size > PROBE_BUF_MAX)
258 max_probe_size = PROBE_BUF_MAX;
259 else if (max_probe_size < PROBE_BUF_MIN)
260 return AVERROR(EINVAL);
262 if (offset >= max_probe_size)
263 return AVERROR(EINVAL);
264 avio_skip(pb, offset);
265 max_probe_size -= offset;
267 for (probe_size = PROBE_BUF_MIN; probe_size <= max_probe_size && !*fmt;
268 probe_size = FFMIN(probe_size << 1,
269 FFMAX(max_probe_size, probe_size + 1))) {
270 int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX / 4 : 0;
272 /* Read probe data. */
273 if ((ret = av_reallocp(&buf, probe_size + AVPROBE_PADDING_SIZE)) < 0)
275 if ((ret = avio_read(pb, buf + pd.buf_size,
276 probe_size - pd.buf_size)) < 0) {
277 /* Fail if error was not end of file, otherwise, lower score. */
278 if (ret != AVERROR_EOF) {
283 ret = 0; /* error was end of file, nothing read */
288 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
290 /* Guess file format. */
291 *fmt = av_probe_input_format2(&pd, 1, &score);
293 /* This can only be true in the last iteration. */
294 if (score <= AVPROBE_SCORE_MAX / 4) {
295 av_log(logctx, AV_LOG_WARNING,
296 "Format detected only with low score of %d, "
297 "misdetection possible!\n", score);
299 av_log(logctx, AV_LOG_DEBUG,
300 "Probed with size=%d and score=%d\n", probe_size, score);
306 return AVERROR_INVALIDDATA;
309 /* Rewind. Reuse probe buffer to avoid seeking. */
310 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
316 /* Open input file and probe the format if necessary. */
317 static int init_input(AVFormatContext *s, const char *filename,
318 AVDictionary **options)
321 AVProbeData pd = { filename, NULL, 0 };
324 s->flags |= AVFMT_FLAG_CUSTOM_IO;
326 return av_probe_input_buffer(s->pb, &s->iformat, filename,
328 else if (s->iformat->flags & AVFMT_NOFILE)
329 return AVERROR(EINVAL);
333 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
334 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
337 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ,
338 &s->interrupt_callback, options)) < 0)
342 return av_probe_input_buffer(s->pb, &s->iformat, filename,
346 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
347 AVPacketList **plast_pktl)
349 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
354 (*plast_pktl)->next = pktl;
356 *packet_buffer = pktl;
358 /* Add the packet in the buffered packet list. */
364 static int queue_attached_pictures(AVFormatContext *s)
367 for (i = 0; i < s->nb_streams; i++)
368 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
369 s->streams[i]->discard < AVDISCARD_ALL) {
370 AVPacket copy = s->streams[i]->attached_pic;
371 copy.buf = av_buffer_ref(copy.buf);
373 return AVERROR(ENOMEM);
375 add_to_pktbuf(&s->raw_packet_buffer, ©,
376 &s->raw_packet_buffer_end);
381 int avformat_open_input(AVFormatContext **ps, const char *filename,
382 AVInputFormat *fmt, AVDictionary **options)
384 AVFormatContext *s = *ps;
386 AVDictionary *tmp = NULL;
387 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
389 if (!s && !(s = avformat_alloc_context()))
390 return AVERROR(ENOMEM);
395 av_dict_copy(&tmp, *options, 0);
397 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
400 if ((ret = init_input(s, filename, &tmp)) < 0)
403 /* Check filename in case an image number is expected. */
404 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
405 if (!av_filename_number_test(filename)) {
406 ret = AVERROR(EINVAL);
411 s->duration = s->start_time = AV_NOPTS_VALUE;
412 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
414 /* Allocate private data. */
415 if (s->iformat->priv_data_size > 0) {
416 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
417 ret = AVERROR(ENOMEM);
420 if (s->iformat->priv_class) {
421 *(const AVClass **) s->priv_data = s->iformat->priv_class;
422 av_opt_set_defaults(s->priv_data);
423 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
428 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
430 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
432 if (s->iformat->read_header)
433 if ((ret = s->iformat->read_header(s)) < 0)
436 if (id3v2_extra_meta &&
437 (ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
439 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
441 if ((ret = queue_attached_pictures(s)) < 0)
444 if (s->pb && !s->data_offset)
445 s->data_offset = avio_tell(s->pb);
447 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
450 av_dict_free(options);
457 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
459 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
461 avformat_free_context(s);
466 /*******************************************************/
468 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
470 if (st->codec->codec_id == AV_CODEC_ID_PROBE) {
471 AVProbeData *pd = &st->probe_data;
472 av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
477 if ((err = av_reallocp(&pd->buf, pd->buf_size + pkt->size +
478 AVPROBE_PADDING_SIZE)) < 0)
480 memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
481 pd->buf_size += pkt->size;
482 memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
484 st->probe_packets = 0;
486 av_log(s, AV_LOG_ERROR,
487 "nothing to probe for stream %d\n", st->index);
492 if (!st->probe_packets ||
493 av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
494 set_codec_from_probe_data(s, st, pd, st->probe_packets > 0
495 ? AVPROBE_SCORE_MAX / 4 : 0);
496 if (st->codec->codec_id != AV_CODEC_ID_PROBE) {
499 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
506 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
512 AVPacketList *pktl = s->raw_packet_buffer;
516 st = s->streams[pkt->stream_index];
517 if (st->codec->codec_id != AV_CODEC_ID_PROBE ||
518 !st->probe_packets ||
519 s->raw_packet_buffer_remaining_size < pkt->size) {
521 if (st->probe_packets)
522 if ((err = probe_codec(s, st, NULL)) < 0)
524 pd = &st->probe_data;
527 s->raw_packet_buffer = pktl->next;
528 s->raw_packet_buffer_remaining_size += pkt->size;
537 ret = s->iformat->read_packet(s, pkt);
539 if (!pktl || ret == AVERROR(EAGAIN))
541 for (i = 0; i < s->nb_streams; i++) {
543 if (st->probe_packets)
544 if ((err = probe_codec(s, st, NULL)) < 0)
550 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
551 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
552 av_log(s, AV_LOG_WARNING,
553 "Dropped corrupted packet (stream = %d)\n",
559 st = s->streams[pkt->stream_index];
561 switch (st->codec->codec_type) {
562 case AVMEDIA_TYPE_VIDEO:
563 if (s->video_codec_id)
564 st->codec->codec_id = s->video_codec_id;
566 case AVMEDIA_TYPE_AUDIO:
567 if (s->audio_codec_id)
568 st->codec->codec_id = s->audio_codec_id;
570 case AVMEDIA_TYPE_SUBTITLE:
571 if (s->subtitle_codec_id)
572 st->codec->codec_id = s->subtitle_codec_id;
576 if (!pktl && (st->codec->codec_id != AV_CODEC_ID_PROBE ||
580 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
581 s->raw_packet_buffer_remaining_size -= pkt->size;
583 if ((err = probe_codec(s, st, pkt)) < 0)
588 /**********************************************************/
591 * Get the number of samples of an audio frame. Return -1 on error.
593 int ff_get_audio_frame_size(AVCodecContext *enc, int size, int mux)
597 /* give frame_size priority if demuxing */
598 if (!mux && enc->frame_size > 1)
599 return enc->frame_size;
601 if ((frame_size = av_get_audio_frame_duration(enc, size)) > 0)
604 /* Fall back on using frame_size if muxing. */
605 if (enc->frame_size > 1)
606 return enc->frame_size;
612 * Return the frame duration in seconds. Return 0 if not available.
614 void ff_compute_frame_duration(int *pnum, int *pden, AVStream *st,
615 AVCodecParserContext *pc, AVPacket *pkt)
621 switch (st->codec->codec_type) {
622 case AVMEDIA_TYPE_VIDEO:
623 if (st->avg_frame_rate.num) {
624 *pnum = st->avg_frame_rate.den;
625 *pden = st->avg_frame_rate.num;
626 } else if (st->time_base.num * 1000LL > st->time_base.den) {
627 *pnum = st->time_base.num;
628 *pden = st->time_base.den;
629 } else if (st->codec->time_base.num * 1000LL > st->codec->time_base.den) {
630 *pnum = st->codec->time_base.num;
631 *pden = st->codec->time_base.den;
632 if (pc && pc->repeat_pict) {
633 if (*pnum > INT_MAX / (1 + pc->repeat_pict))
634 *pden /= 1 + pc->repeat_pict;
636 *pnum *= 1 + pc->repeat_pict;
638 /* If this codec can be interlaced or progressive then we need
639 * a parser to compute duration of a packet. Thus if we have
640 * no parser in such case leave duration undefined. */
641 if (st->codec->ticks_per_frame > 1 && !pc)
645 case AVMEDIA_TYPE_AUDIO:
646 frame_size = ff_get_audio_frame_size(st->codec, pkt->size, 0);
647 if (frame_size <= 0 || st->codec->sample_rate <= 0)
650 *pden = st->codec->sample_rate;
657 static int is_intra_only(enum AVCodecID id)
659 const AVCodecDescriptor *d = avcodec_descriptor_get(id);
662 if (d->type == AVMEDIA_TYPE_VIDEO && !(d->props & AV_CODEC_PROP_INTRA_ONLY))
667 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
668 int64_t dts, int64_t pts)
670 AVStream *st = s->streams[stream_index];
671 AVPacketList *pktl = s->packet_buffer;
673 if (st->first_dts != AV_NOPTS_VALUE ||
674 dts == AV_NOPTS_VALUE ||
675 st->cur_dts == AV_NOPTS_VALUE)
678 st->first_dts = dts - st->cur_dts;
681 for (; pktl; pktl = pktl->next) {
682 if (pktl->pkt.stream_index != stream_index)
684 // FIXME: think more about this check
685 if (pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
686 pktl->pkt.pts += st->first_dts;
688 if (pktl->pkt.dts != AV_NOPTS_VALUE)
689 pktl->pkt.dts += st->first_dts;
691 if (st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
692 st->start_time = pktl->pkt.pts;
694 if (st->start_time == AV_NOPTS_VALUE)
695 st->start_time = pts;
698 static void update_initial_durations(AVFormatContext *s, AVStream *st,
699 int stream_index, int duration)
701 AVPacketList *pktl = s->packet_buffer;
704 if (st->first_dts != AV_NOPTS_VALUE) {
705 cur_dts = st->first_dts;
706 for (; pktl; pktl = pktl->next) {
707 if (pktl->pkt.stream_index == stream_index) {
708 if (pktl->pkt.pts != pktl->pkt.dts ||
709 pktl->pkt.dts != AV_NOPTS_VALUE ||
715 pktl = s->packet_buffer;
716 st->first_dts = cur_dts;
717 } else if (st->cur_dts)
720 for (; pktl; pktl = pktl->next) {
721 if (pktl->pkt.stream_index != stream_index)
723 if (pktl->pkt.pts == pktl->pkt.dts &&
724 pktl->pkt.dts == AV_NOPTS_VALUE &&
725 !pktl->pkt.duration) {
726 pktl->pkt.dts = cur_dts;
727 if (!st->codec->has_b_frames)
728 pktl->pkt.pts = cur_dts;
730 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
731 pktl->pkt.duration = duration;
735 if (st->first_dts == AV_NOPTS_VALUE)
736 st->cur_dts = cur_dts;
739 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
740 AVCodecParserContext *pc, AVPacket *pkt)
742 int num, den, presentation_delayed, delay, i;
745 if (s->flags & AVFMT_FLAG_NOFILLIN)
748 if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
749 pkt->dts = AV_NOPTS_VALUE;
751 /* do we have a video B-frame ? */
752 delay = st->codec->has_b_frames;
753 presentation_delayed = 0;
755 /* XXX: need has_b_frame, but cannot get it if the codec is
758 pc && pc->pict_type != AV_PICTURE_TYPE_B)
759 presentation_delayed = 1;
761 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
762 st->pts_wrap_bits < 63 &&
763 pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
764 pkt->dts -= 1LL << st->pts_wrap_bits;
767 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
768 * We take the conservative approach and discard both.
769 * Note: If this is misbehaving for an H.264 file, then possibly
770 * presentation_delayed is not set correctly. */
771 if (delay == 1 && pkt->dts == pkt->pts &&
772 pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
773 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
774 pkt->dts = pkt->pts = AV_NOPTS_VALUE;
777 if (pkt->duration == 0 && st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
778 ff_compute_frame_duration(&num, &den, st, pc, pkt);
780 pkt->duration = av_rescale_rnd(1, num * (int64_t) st->time_base.den,
781 den * (int64_t) st->time_base.num,
784 if (pkt->duration != 0 && s->packet_buffer)
785 update_initial_durations(s, st, pkt->stream_index,
790 /* Correct timestamps with byte offset if demuxers only have timestamps
791 * on packet boundaries */
792 if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
793 /* this will estimate bitrate based on this frame's duration and size */
794 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
795 if (pkt->pts != AV_NOPTS_VALUE)
797 if (pkt->dts != AV_NOPTS_VALUE)
801 /* This may be redundant, but it should not hurt. */
802 if (pkt->dts != AV_NOPTS_VALUE &&
803 pkt->pts != AV_NOPTS_VALUE &&
805 presentation_delayed = 1;
808 "IN delayed:%d pts:%"PRId64", dts:%"PRId64" "
809 "cur_dts:%"PRId64" st:%d pc:%p\n",
810 presentation_delayed, pkt->pts, pkt->dts, st->cur_dts,
811 pkt->stream_index, pc);
812 /* Interpolate PTS and DTS if they are not present. We skip H.264
813 * currently because delay and has_b_frames are not reliably set. */
814 if ((delay == 0 || (delay == 1 && pc)) &&
815 st->codec->codec_id != AV_CODEC_ID_H264) {
816 if (presentation_delayed) {
817 /* DTS = decompression timestamp */
818 /* PTS = presentation timestamp */
819 if (pkt->dts == AV_NOPTS_VALUE)
820 pkt->dts = st->last_IP_pts;
821 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
822 if (pkt->dts == AV_NOPTS_VALUE)
823 pkt->dts = st->cur_dts;
825 /* This is tricky: the dts must be incremented by the duration
826 * of the frame we are displaying, i.e. the last I- or P-frame. */
827 if (st->last_IP_duration == 0)
828 st->last_IP_duration = pkt->duration;
829 if (pkt->dts != AV_NOPTS_VALUE)
830 st->cur_dts = pkt->dts + st->last_IP_duration;
831 st->last_IP_duration = pkt->duration;
832 st->last_IP_pts = pkt->pts;
833 /* Cannot compute PTS if not present (we can compute it only
834 * by knowing the future. */
835 } else if (pkt->pts != AV_NOPTS_VALUE ||
836 pkt->dts != AV_NOPTS_VALUE ||
838 st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
839 int duration = pkt->duration;
840 if (!duration && st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
841 ff_compute_frame_duration(&num, &den, st, pc, pkt);
843 duration = av_rescale_rnd(1,
844 num * (int64_t) st->time_base.den,
845 den * (int64_t) st->time_base.num,
847 if (duration != 0 && s->packet_buffer)
848 update_initial_durations(s, st, pkt->stream_index,
853 if (pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE ||
855 /* presentation is not delayed : PTS and DTS are the same */
856 if (pkt->pts == AV_NOPTS_VALUE)
858 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
860 if (pkt->pts == AV_NOPTS_VALUE)
861 pkt->pts = st->cur_dts;
863 if (pkt->pts != AV_NOPTS_VALUE)
864 st->cur_dts = pkt->pts + duration;
869 if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
870 st->pts_buffer[0] = pkt->pts;
871 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
872 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
873 if (pkt->dts == AV_NOPTS_VALUE)
874 pkt->dts = st->pts_buffer[0];
875 // We skipped it above so we try here.
876 if (st->codec->codec_id == AV_CODEC_ID_H264)
877 // This should happen on the first packet
878 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
879 if (pkt->dts > st->cur_dts)
880 st->cur_dts = pkt->dts;
884 "OUTdelayed:%d/%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64"\n",
885 presentation_delayed, delay, pkt->pts, pkt->dts, st->cur_dts);
888 if (is_intra_only(st->codec->codec_id))
889 pkt->flags |= AV_PKT_FLAG_KEY;
891 pkt->convergence_duration = pc->convergence_duration;
894 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
897 AVPacketList *pktl = *pkt_buf;
898 *pkt_buf = pktl->next;
899 av_free_packet(&pktl->pkt);
906 * Parse a packet, add all split parts to parse_queue.
908 * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
910 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
912 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
913 AVStream *st = s->streams[stream_index];
914 uint8_t *data = pkt ? pkt->data : NULL;
915 int size = pkt ? pkt->size : 0;
916 int ret = 0, got_output = 0;
919 av_init_packet(&flush_pkt);
924 while (size > 0 || (pkt == &flush_pkt && got_output)) {
927 av_init_packet(&out_pkt);
928 len = av_parser_parse2(st->parser, st->codec,
929 &out_pkt.data, &out_pkt.size, data, size,
930 pkt->pts, pkt->dts, pkt->pos);
932 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
933 /* increment read pointer */
937 got_output = !!out_pkt.size;
942 if (pkt->side_data) {
943 out_pkt.side_data = pkt->side_data;
944 out_pkt.side_data_elems = pkt->side_data_elems;
945 pkt->side_data = NULL;
946 pkt->side_data_elems = 0;
949 /* set the duration */
950 out_pkt.duration = 0;
951 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
952 if (st->codec->sample_rate > 0) {
954 av_rescale_q_rnd(st->parser->duration,
955 (AVRational) { 1, st->codec->sample_rate },
959 } else if (st->codec->time_base.num != 0 &&
960 st->codec->time_base.den != 0) {
961 out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
962 st->codec->time_base,
967 out_pkt.stream_index = st->index;
968 out_pkt.pts = st->parser->pts;
969 out_pkt.dts = st->parser->dts;
970 out_pkt.pos = st->parser->pos;
972 if (st->parser->key_frame == 1 ||
973 (st->parser->key_frame == -1 &&
974 st->parser->pict_type == AV_PICTURE_TYPE_I))
975 out_pkt.flags |= AV_PKT_FLAG_KEY;
977 compute_pkt_fields(s, st, st->parser, &out_pkt);
979 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
980 out_pkt.flags & AV_PKT_FLAG_KEY) {
981 ff_reduce_index(s, st->index);
982 av_add_index_entry(st, st->parser->frame_offset, out_pkt.dts,
983 0, 0, AVINDEX_KEYFRAME);
986 if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
987 out_pkt.buf = pkt->buf;
989 #if FF_API_DESTRUCT_PACKET
990 FF_DISABLE_DEPRECATION_WARNINGS
991 out_pkt.destruct = pkt->destruct;
992 pkt->destruct = NULL;
993 FF_ENABLE_DEPRECATION_WARNINGS
996 if ((ret = av_dup_packet(&out_pkt)) < 0)
999 if (!add_to_pktbuf(&s->parse_queue, &out_pkt, &s->parse_queue_end)) {
1000 av_free_packet(&out_pkt);
1001 ret = AVERROR(ENOMEM);
1006 /* end of the stream => close and free the parser */
1007 if (pkt == &flush_pkt) {
1008 av_parser_close(st->parser);
1013 av_free_packet(pkt);
1017 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1018 AVPacketList **pkt_buffer_end,
1022 av_assert0(*pkt_buffer);
1025 *pkt_buffer = pktl->next;
1027 *pkt_buffer_end = NULL;
1032 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1034 int ret = 0, i, got_packet = 0;
1036 av_init_packet(pkt);
1038 while (!got_packet && !s->parse_queue) {
1042 /* read next packet */
1043 ret = ff_read_packet(s, &cur_pkt);
1045 if (ret == AVERROR(EAGAIN))
1047 /* flush the parsers */
1048 for (i = 0; i < s->nb_streams; i++) {
1050 if (st->parser && st->need_parsing)
1051 parse_packet(s, NULL, st->index);
1053 /* all remaining packets are now in parse_queue =>
1054 * really terminate parsing */
1058 st = s->streams[cur_pkt.stream_index];
1060 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1061 cur_pkt.dts != AV_NOPTS_VALUE &&
1062 cur_pkt.pts < cur_pkt.dts) {
1063 av_log(s, AV_LOG_WARNING,
1064 "Invalid timestamps stream=%d, pts=%"PRId64", "
1065 "dts=%"PRId64", size=%d\n",
1066 cur_pkt.stream_index, cur_pkt.pts,
1067 cur_pkt.dts, cur_pkt.size);
1069 if (s->debug & FF_FDEBUG_TS)
1070 av_log(s, AV_LOG_DEBUG,
1071 "ff_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", "
1072 "size=%d, duration=%d, flags=%d\n",
1073 cur_pkt.stream_index, cur_pkt.pts, cur_pkt.dts,
1074 cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
1076 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1077 st->parser = av_parser_init(st->codec->codec_id);
1079 /* no parser available: just output the raw packets */
1080 st->need_parsing = AVSTREAM_PARSE_NONE;
1081 else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1082 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1083 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1084 st->parser->flags |= PARSER_FLAG_ONCE;
1087 if (!st->need_parsing || !st->parser) {
1088 /* no parsing needed: we just output the packet as is */
1090 compute_pkt_fields(s, st, NULL, pkt);
1091 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1092 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1093 ff_reduce_index(s, st->index);
1094 av_add_index_entry(st, pkt->pos, pkt->dts,
1095 0, 0, AVINDEX_KEYFRAME);
1098 } else if (st->discard < AVDISCARD_ALL) {
1099 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1103 av_free_packet(&cur_pkt);
1107 if (!got_packet && s->parse_queue)
1108 ret = read_from_packet_buffer(&s->parse_queue, &s->parse_queue_end, pkt);
1110 if (s->debug & FF_FDEBUG_TS)
1111 av_log(s, AV_LOG_DEBUG,
1112 "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", "
1113 "size=%d, duration=%d, flags=%d\n",
1114 pkt->stream_index, pkt->pts, pkt->dts,
1115 pkt->size, pkt->duration, pkt->flags);
1120 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1122 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1126 return s->packet_buffer
1127 ? read_from_packet_buffer(&s->packet_buffer,
1128 &s->packet_buffer_end, pkt)
1129 : read_frame_internal(s, pkt);
1133 AVPacketList *pktl = s->packet_buffer;
1136 AVPacket *next_pkt = &pktl->pkt;
1138 if (next_pkt->dts != AV_NOPTS_VALUE) {
1139 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1140 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1141 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1142 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0) &&
1143 av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) {
1145 next_pkt->pts = pktl->pkt.dts;
1149 pktl = s->packet_buffer;
1152 /* read packet from packet buffer, if there is data */
1153 if (!(next_pkt->pts == AV_NOPTS_VALUE &&
1154 next_pkt->dts != AV_NOPTS_VALUE && !eof))
1155 return read_from_packet_buffer(&s->packet_buffer,
1156 &s->packet_buffer_end, pkt);
1159 ret = read_frame_internal(s, pkt);
1161 if (pktl && ret != AVERROR(EAGAIN)) {
1168 if (av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1169 &s->packet_buffer_end)) < 0)
1170 return AVERROR(ENOMEM);
1174 /* XXX: suppress the packet queue */
1175 static void flush_packet_queue(AVFormatContext *s)
1177 free_packet_buffer(&s->parse_queue, &s->parse_queue_end);
1178 free_packet_buffer(&s->packet_buffer, &s->packet_buffer_end);
1179 free_packet_buffer(&s->raw_packet_buffer, &s->raw_packet_buffer_end);
1181 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1184 /*******************************************************/
1187 int av_find_default_stream_index(AVFormatContext *s)
1189 int first_audio_index = -1;
1193 if (s->nb_streams <= 0)
1195 for (i = 0; i < s->nb_streams; i++) {
1197 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1198 !(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
1201 if (first_audio_index < 0 &&
1202 st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1203 first_audio_index = i;
1205 return first_audio_index >= 0 ? first_audio_index : 0;
1208 /** Flush the frame reader. */
1209 void ff_read_frame_flush(AVFormatContext *s)
1214 flush_packet_queue(s);
1216 /* Reset read state for each stream. */
1217 for (i = 0; i < s->nb_streams; i++) {
1221 av_parser_close(st->parser);
1224 st->last_IP_pts = AV_NOPTS_VALUE;
1225 /* We set the current DTS to an unspecified origin. */
1226 st->cur_dts = AV_NOPTS_VALUE;
1228 st->probe_packets = MAX_PROBE_PACKETS;
1230 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1231 st->pts_buffer[j] = AV_NOPTS_VALUE;
1235 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1239 for (i = 0; i < s->nb_streams; i++) {
1240 AVStream *st = s->streams[i];
1243 av_rescale(timestamp,
1244 st->time_base.den * (int64_t) ref_st->time_base.num,
1245 st->time_base.num * (int64_t) ref_st->time_base.den);
1249 void ff_reduce_index(AVFormatContext *s, int stream_index)
1251 AVStream *st = s->streams[stream_index];
1252 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1254 if ((unsigned) st->nb_index_entries >= max_entries) {
1256 for (i = 0; 2 * i < st->nb_index_entries; i++)
1257 st->index_entries[i] = st->index_entries[2 * i];
1258 st->nb_index_entries = i;
1262 int ff_add_index_entry(AVIndexEntry **index_entries,
1263 int *nb_index_entries,
1264 unsigned int *index_entries_allocated_size,
1265 int64_t pos, int64_t timestamp,
1266 int size, int distance, int flags)
1268 AVIndexEntry *entries, *ie;
1271 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1274 entries = av_fast_realloc(*index_entries,
1275 index_entries_allocated_size,
1276 (*nb_index_entries + 1) *
1277 sizeof(AVIndexEntry));
1281 *index_entries = entries;
1283 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
1284 timestamp, AVSEEK_FLAG_ANY);
1287 index = (*nb_index_entries)++;
1288 ie = &entries[index];
1289 assert(index == 0 || ie[-1].timestamp < timestamp);
1291 ie = &entries[index];
1292 if (ie->timestamp != timestamp) {
1293 if (ie->timestamp <= timestamp)
1295 memmove(entries + index + 1, entries + index,
1296 sizeof(AVIndexEntry) * (*nb_index_entries - index));
1297 (*nb_index_entries)++;
1298 } else if (ie->pos == pos && distance < ie->min_distance)
1299 // do not reduce the distance
1300 distance = ie->min_distance;
1304 ie->timestamp = timestamp;
1305 ie->min_distance = distance;
1312 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
1313 int size, int distance, int flags)
1315 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1316 &st->index_entries_allocated_size, pos,
1317 timestamp, size, distance, flags);
1320 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1321 int64_t wanted_timestamp, int flags)
1329 // Optimize appending index entries at the end.
1330 if (b && entries[b - 1].timestamp < wanted_timestamp)
1335 timestamp = entries[m].timestamp;
1336 if (timestamp >= wanted_timestamp)
1338 if (timestamp <= wanted_timestamp)
1341 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1343 if (!(flags & AVSEEK_FLAG_ANY))
1344 while (m >= 0 && m < nb_entries &&
1345 !(entries[m].flags & AVINDEX_KEYFRAME))
1346 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1348 if (m == nb_entries)
1353 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
1355 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1356 wanted_timestamp, flags);
1359 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
1360 int64_t target_ts, int flags)
1362 AVInputFormat *avif = s->iformat;
1363 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1364 int64_t ts_min, ts_max, ts;
1369 if (stream_index < 0)
1372 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1375 ts_min = AV_NOPTS_VALUE;
1376 pos_limit = -1; // GCC falsely says it may be uninitialized.
1378 st = s->streams[stream_index];
1379 if (st->index_entries) {
1382 /* FIXME: Whole function must be checked for non-keyframe entries in
1383 * index case, especially read_timestamp(). */
1384 index = av_index_search_timestamp(st, target_ts,
1385 flags | AVSEEK_FLAG_BACKWARD);
1386 index = FFMAX(index, 0);
1387 e = &st->index_entries[index];
1389 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
1391 ts_min = e->timestamp;
1392 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1398 index = av_index_search_timestamp(st, target_ts,
1399 flags & ~AVSEEK_FLAG_BACKWARD);
1400 assert(index < st->nb_index_entries);
1402 e = &st->index_entries[index];
1403 assert(e->timestamp >= target_ts);
1405 ts_max = e->timestamp;
1406 pos_limit = pos_max - e->min_distance;
1407 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
1408 " dts_max=%"PRId64"\n", pos_max, pos_limit, ts_max);
1412 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
1413 ts_min, ts_max, flags, &ts, avif->read_timestamp);
1418 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1421 ff_update_cur_dts(s, st, ts);
1426 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1427 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1428 int64_t ts_min, int64_t ts_max,
1429 int flags, int64_t *ts_ret,
1430 int64_t (*read_timestamp)(struct AVFormatContext *, int,
1431 int64_t *, int64_t))
1434 int64_t start_pos, filesize;
1437 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1439 if (ts_min == AV_NOPTS_VALUE) {
1440 pos_min = s->data_offset;
1441 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1442 if (ts_min == AV_NOPTS_VALUE)
1446 if (ts_max == AV_NOPTS_VALUE) {
1448 filesize = avio_size(s->pb);
1449 pos_max = filesize - 1;
1452 ts_max = read_timestamp(s, stream_index, &pos_max,
1455 } while (ts_max == AV_NOPTS_VALUE && pos_max >= step);
1456 if (ts_max == AV_NOPTS_VALUE)
1460 int64_t tmp_pos = pos_max + 1;
1461 int64_t tmp_ts = read_timestamp(s, stream_index,
1462 &tmp_pos, INT64_MAX);
1463 if (tmp_ts == AV_NOPTS_VALUE)
1467 if (tmp_pos >= filesize)
1470 pos_limit = pos_max;
1473 if (ts_min > ts_max)
1475 else if (ts_min == ts_max)
1476 pos_limit = pos_min;
1479 while (pos_min < pos_limit) {
1480 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64
1481 " dts_max=%"PRId64"\n", pos_min, pos_max, ts_min, ts_max);
1482 assert(pos_limit <= pos_max);
1484 if (no_change == 0) {
1485 int64_t approximate_keyframe_distance = pos_max - pos_limit;
1486 // interpolate position (better than dichotomy)
1487 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
1489 pos_min - approximate_keyframe_distance;
1490 } else if (no_change == 1) {
1491 // bisection if interpolation did not change min / max pos last time
1492 pos = (pos_min + pos_limit) >> 1;
1494 /* linear search if bisection failed, can only happen if there
1495 * are very few or no keyframes between min/max */
1500 else if (pos > pos_limit)
1504 // May pass pos_limit instead of -1.
1505 ts = read_timestamp(s, stream_index, &pos, INT64_MAX);
1510 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64
1511 " target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1512 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1513 pos_limit, start_pos, no_change);
1514 if (ts == AV_NOPTS_VALUE) {
1515 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1518 assert(ts != AV_NOPTS_VALUE);
1519 if (target_ts <= ts) {
1520 pos_limit = start_pos - 1;
1524 if (target_ts >= ts) {
1530 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1531 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1533 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1535 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1536 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1537 pos, ts_min, target_ts, ts_max);
1542 static int seek_frame_byte(AVFormatContext *s, int stream_index,
1543 int64_t pos, int flags)
1545 int64_t pos_min, pos_max;
1547 pos_min = s->data_offset;
1548 pos_max = avio_size(s->pb) - 1;
1552 else if (pos > pos_max)
1555 avio_seek(s->pb, pos, SEEK_SET);
1560 static int seek_frame_generic(AVFormatContext *s, int stream_index,
1561 int64_t timestamp, int flags)
1568 st = s->streams[stream_index];
1570 index = av_index_search_timestamp(st, timestamp, flags);
1572 if (index < 0 && st->nb_index_entries &&
1573 timestamp < st->index_entries[0].timestamp)
1576 if (index < 0 || index == st->nb_index_entries - 1) {
1579 if (st->nb_index_entries) {
1580 assert(st->index_entries);
1581 ie = &st->index_entries[st->nb_index_entries - 1];
1582 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1584 ff_update_cur_dts(s, st, ie->timestamp);
1586 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1592 read_status = av_read_frame(s, &pkt);
1593 } while (read_status == AVERROR(EAGAIN));
1594 if (read_status < 0)
1596 av_free_packet(&pkt);
1597 if (stream_index == pkt.stream_index)
1598 if ((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1601 index = av_index_search_timestamp(st, timestamp, flags);
1606 ff_read_frame_flush(s);
1607 if (s->iformat->read_seek)
1608 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1610 ie = &st->index_entries[index];
1611 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1613 ff_update_cur_dts(s, st, ie->timestamp);
1618 static int seek_frame_internal(AVFormatContext *s, int stream_index,
1619 int64_t timestamp, int flags)
1624 if (flags & AVSEEK_FLAG_BYTE) {
1625 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1627 ff_read_frame_flush(s);
1628 return seek_frame_byte(s, stream_index, timestamp, flags);
1631 if (stream_index < 0) {
1632 stream_index = av_find_default_stream_index(s);
1633 if (stream_index < 0)
1636 st = s->streams[stream_index];
1637 /* timestamp for default must be expressed in AV_TIME_BASE units */
1638 timestamp = av_rescale(timestamp, st->time_base.den,
1639 AV_TIME_BASE * (int64_t) st->time_base.num);
1642 /* first, we try the format specific seek */
1643 if (s->iformat->read_seek) {
1644 ff_read_frame_flush(s);
1645 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1651 if (s->iformat->read_timestamp &&
1652 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1653 ff_read_frame_flush(s);
1654 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1655 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1656 ff_read_frame_flush(s);
1657 return seek_frame_generic(s, stream_index, timestamp, flags);
1662 int av_seek_frame(AVFormatContext *s, int stream_index,
1663 int64_t timestamp, int flags)
1665 int ret = seek_frame_internal(s, stream_index, timestamp, flags);
1668 ret = queue_attached_pictures(s);
1673 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
1674 int64_t ts, int64_t max_ts, int flags)
1676 if (min_ts > ts || max_ts < ts)
1679 if (s->iformat->read_seek2) {
1681 ff_read_frame_flush(s);
1682 ret = s->iformat->read_seek2(s, stream_index, min_ts,
1686 ret = queue_attached_pictures(s);
1690 if (s->iformat->read_timestamp) {
1691 // try to seek via read_timestamp()
1694 // Fall back on old API if new is not implemented but old is.
1695 // Note the old API has somewhat different semantics.
1696 if (s->iformat->read_seek || 1)
1697 return av_seek_frame(s, stream_index, ts,
1698 flags | ((uint64_t) ts - min_ts >
1699 (uint64_t) max_ts - ts
1700 ? AVSEEK_FLAG_BACKWARD : 0));
1702 // try some generic seek like seek_frame_generic() but with new ts semantics
1705 /*******************************************************/
1708 * Return TRUE if the stream has accurate duration in any stream.
1710 * @return TRUE if the stream has accurate duration for at least one component.
1712 static int has_duration(AVFormatContext *ic)
1717 for (i = 0; i < ic->nb_streams; i++) {
1718 st = ic->streams[i];
1719 if (st->duration != AV_NOPTS_VALUE)
1722 if (ic->duration != AV_NOPTS_VALUE)
1728 * Estimate the stream timings from the one of each components.
1730 * Also computes the global bitrate if possible.
1732 static void update_stream_timings(AVFormatContext *ic)
1734 int64_t start_time, start_time1, end_time, end_time1;
1735 int64_t duration, duration1, filesize;
1739 start_time = INT64_MAX;
1740 end_time = INT64_MIN;
1741 duration = INT64_MIN;
1742 for (i = 0; i < ic->nb_streams; i++) {
1743 st = ic->streams[i];
1744 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1745 start_time1 = av_rescale_q(st->start_time, st->time_base,
1747 start_time = FFMIN(start_time, start_time1);
1748 if (st->duration != AV_NOPTS_VALUE) {
1749 end_time1 = start_time1 +
1750 av_rescale_q(st->duration, st->time_base,
1752 end_time = FFMAX(end_time, end_time1);
1755 if (st->duration != AV_NOPTS_VALUE) {
1756 duration1 = av_rescale_q(st->duration, st->time_base,
1758 duration = FFMAX(duration, duration1);
1761 if (start_time != INT64_MAX) {
1762 ic->start_time = start_time;
1763 if (end_time != INT64_MIN)
1764 duration = FFMAX(duration, end_time - start_time);
1766 if (duration != INT64_MIN) {
1767 ic->duration = duration;
1768 if (ic->pb && (filesize = avio_size(ic->pb)) > 0)
1769 /* compute the bitrate */
1770 ic->bit_rate = (double) filesize * 8.0 * AV_TIME_BASE /
1771 (double) ic->duration;
1775 static void fill_all_stream_timings(AVFormatContext *ic)
1780 update_stream_timings(ic);
1781 for (i = 0; i < ic->nb_streams; i++) {
1782 st = ic->streams[i];
1783 if (st->start_time == AV_NOPTS_VALUE) {
1784 if (ic->start_time != AV_NOPTS_VALUE)
1785 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
1787 if (ic->duration != AV_NOPTS_VALUE)
1788 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
1794 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
1796 int64_t filesize, duration;
1800 /* if bit_rate is already set, we believe it */
1801 if (ic->bit_rate <= 0) {
1803 for (i = 0; i < ic->nb_streams; i++) {
1804 st = ic->streams[i];
1805 if (st->codec->bit_rate > 0) {
1806 if (INT_MAX - st->codec->bit_rate < bit_rate) {
1810 bit_rate += st->codec->bit_rate;
1813 ic->bit_rate = bit_rate;
1816 /* if duration is already set, we believe it */
1817 if (ic->duration == AV_NOPTS_VALUE &&
1818 ic->bit_rate != 0) {
1819 filesize = ic->pb ? avio_size(ic->pb) : 0;
1821 for (i = 0; i < ic->nb_streams; i++) {
1822 st = ic->streams[i];
1823 duration = av_rescale(8 * filesize, st->time_base.den,
1825 (int64_t) st->time_base.num);
1826 if (st->duration == AV_NOPTS_VALUE)
1827 st->duration = duration;
1833 #define DURATION_MAX_READ_SIZE 250000
1834 #define DURATION_MAX_RETRY 3
1836 /* only usable for MPEG-PS streams */
1837 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1839 AVPacket pkt1, *pkt = &pkt1;
1841 int read_size, i, ret;
1843 int64_t filesize, offset, duration;
1846 /* flush packet queue */
1847 flush_packet_queue(ic);
1849 for (i = 0; i < ic->nb_streams; i++) {
1850 st = ic->streams[i];
1851 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1852 av_log(st->codec, AV_LOG_WARNING,
1853 "start time is not set in estimate_timings_from_pts\n");
1856 av_parser_close(st->parser);
1861 /* estimate the end time (duration) */
1862 /* XXX: may need to support wrapping */
1863 filesize = ic->pb ? avio_size(ic->pb) : 0;
1864 end_time = AV_NOPTS_VALUE;
1866 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
1870 avio_seek(ic->pb, offset, SEEK_SET);
1873 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
1877 ret = ff_read_packet(ic, pkt);
1878 } while (ret == AVERROR(EAGAIN));
1881 read_size += pkt->size;
1882 st = ic->streams[pkt->stream_index];
1883 if (pkt->pts != AV_NOPTS_VALUE &&
1884 (st->start_time != AV_NOPTS_VALUE ||
1885 st->first_dts != AV_NOPTS_VALUE)) {
1886 duration = end_time = pkt->pts;
1887 if (st->start_time != AV_NOPTS_VALUE)
1888 duration -= st->start_time;
1890 duration -= st->first_dts;
1892 duration += 1LL << st->pts_wrap_bits;
1894 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
1895 st->duration = duration;
1898 av_free_packet(pkt);
1900 } while (end_time == AV_NOPTS_VALUE &&
1901 filesize > (DURATION_MAX_READ_SIZE << retry) &&
1902 ++retry <= DURATION_MAX_RETRY);
1904 fill_all_stream_timings(ic);
1906 avio_seek(ic->pb, old_offset, SEEK_SET);
1907 for (i = 0; i < ic->nb_streams; i++) {
1908 st = ic->streams[i];
1909 st->cur_dts = st->first_dts;
1910 st->last_IP_pts = AV_NOPTS_VALUE;
1914 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
1918 /* get the file size, if possible */
1919 if (ic->iformat->flags & AVFMT_NOFILE) {
1922 file_size = avio_size(ic->pb);
1923 file_size = FFMAX(0, file_size);
1926 if ((!strcmp(ic->iformat->name, "mpeg") ||
1927 !strcmp(ic->iformat->name, "mpegts")) &&
1928 file_size && ic->pb->seekable) {
1929 /* get accurate estimate from the PTSes */
1930 estimate_timings_from_pts(ic, old_offset);
1931 } else if (has_duration(ic)) {
1932 /* at least one component has timings - we use them for all
1934 fill_all_stream_timings(ic);
1936 av_log(ic, AV_LOG_WARNING,
1937 "Estimating duration from bitrate, this may be inaccurate\n");
1938 /* less precise: use bitrate info */
1939 estimate_timings_from_bit_rate(ic);
1941 update_stream_timings(ic);
1945 AVStream av_unused *st;
1946 for (i = 0; i < ic->nb_streams; i++) {
1947 st = ic->streams[i];
1948 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
1949 (double) st->start_time / AV_TIME_BASE,
1950 (double) st->duration / AV_TIME_BASE);
1953 "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1954 (double) ic->start_time / AV_TIME_BASE,
1955 (double) ic->duration / AV_TIME_BASE,
1956 ic->bit_rate / 1000);
1960 static int has_codec_parameters(AVStream *st)
1962 AVCodecContext *avctx = st->codec;
1965 switch (avctx->codec_type) {
1966 case AVMEDIA_TYPE_AUDIO:
1967 val = avctx->sample_rate && avctx->channels;
1968 if (st->info->found_decoder >= 0 &&
1969 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
1972 case AVMEDIA_TYPE_VIDEO:
1974 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
1981 return avctx->codec_id != AV_CODEC_ID_NONE && val != 0;
1984 static int has_decode_delay_been_guessed(AVStream *st)
1986 return st->codec->codec_id != AV_CODEC_ID_H264 ||
1987 st->info->nb_decoded_frames >= 6;
1990 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
1991 static int try_decode_frame(AVStream *st, AVPacket *avpkt,
1992 AVDictionary **options)
1994 const AVCodec *codec;
1995 int got_picture = 1, ret = 0;
1996 AVFrame *frame = av_frame_alloc();
1997 AVPacket pkt = *avpkt;
2000 return AVERROR(ENOMEM);
2002 if (!avcodec_is_open(st->codec) && !st->info->found_decoder) {
2003 AVDictionary *thread_opt = NULL;
2005 codec = st->codec->codec ? st->codec->codec
2006 : avcodec_find_decoder(st->codec->codec_id);
2009 st->info->found_decoder = -1;
2014 /* Force thread count to 1 since the H.264 decoder will not extract
2015 * SPS and PPS to extradata during multi-threaded decoding. */
2016 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2017 ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
2019 av_dict_free(&thread_opt);
2021 st->info->found_decoder = -1;
2024 st->info->found_decoder = 1;
2025 } else if (!st->info->found_decoder)
2026 st->info->found_decoder = 1;
2028 if (st->info->found_decoder < 0) {
2033 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2035 (!has_codec_parameters(st) || !has_decode_delay_been_guessed(st) ||
2036 (!st->codec_info_nb_frames &&
2037 st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2039 switch (st->codec->codec_type) {
2040 case AVMEDIA_TYPE_VIDEO:
2041 ret = avcodec_decode_video2(st->codec, frame,
2042 &got_picture, &pkt);
2044 case AVMEDIA_TYPE_AUDIO:
2045 ret = avcodec_decode_audio4(st->codec, frame, &got_picture, &pkt);
2052 st->info->nb_decoded_frames++;
2060 av_frame_free(&frame);
2064 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
2066 while (tags->id != AV_CODEC_ID_NONE) {
2074 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2077 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
2078 if (tag == tags[i].tag)
2080 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
2081 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2083 return AV_CODEC_ID_NONE;
2086 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
2091 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
2093 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
2095 return AV_CODEC_ID_NONE;
2099 if (sflags & (1 << (bps - 1))) {
2102 return AV_CODEC_ID_PCM_S8;
2104 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
2106 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
2108 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
2110 return AV_CODEC_ID_NONE;
2115 return AV_CODEC_ID_PCM_U8;
2117 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
2119 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
2121 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
2123 return AV_CODEC_ID_NONE;
2129 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
2132 for (i = 0; tags && tags[i]; i++) {
2133 int tag = ff_codec_get_tag(tags[i], id);
2140 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
2143 for (i = 0; tags && tags[i]; i++) {
2144 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
2145 if (id != AV_CODEC_ID_NONE)
2148 return AV_CODEC_ID_NONE;
2151 static void compute_chapters_end(AVFormatContext *s)
2154 int64_t max_time = s->duration +
2155 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2157 for (i = 0; i < s->nb_chapters; i++)
2158 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2159 AVChapter *ch = s->chapters[i];
2160 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
2164 for (j = 0; j < s->nb_chapters; j++) {
2165 AVChapter *ch1 = s->chapters[j];
2166 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
2168 if (j != i && next_start > ch->start && next_start < end)
2171 ch->end = (end == INT64_MAX) ? ch->start : end;
2175 static int get_std_framerate(int i)
2178 return (i + 1) * 1001;
2180 return ((const int[]) { 24, 30, 60, 12, 15 })[i - 60 * 12] * 1000 * 12;
2183 /* Is the time base unreliable?
2184 * This is a heuristic to balance between quick acceptance of the values in
2185 * the headers vs. some extra checks.
2186 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2187 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2188 * And there are "variable" fps files this needs to detect as well. */
2189 static int tb_unreliable(AVCodecContext *c)
2191 if (c->time_base.den >= 101L * c->time_base.num ||
2192 c->time_base.den < 5L * c->time_base.num ||
2193 // c->codec_tag == AV_RL32("DIVX") ||
2194 // c->codec_tag == AV_RL32("XVID") ||
2195 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
2196 c->codec_id == AV_CODEC_ID_H264)
2201 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2203 int i, count, ret, read_size, j;
2205 AVPacket pkt1, *pkt;
2206 int64_t old_offset = avio_tell(ic->pb);
2207 // new streams might appear, no options for those
2208 int orig_nb_streams = ic->nb_streams;
2210 for (i = 0; i < ic->nb_streams; i++) {
2211 const AVCodec *codec;
2212 AVDictionary *thread_opt = NULL;
2213 st = ic->streams[i];
2215 // only for the split stuff
2216 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2217 st->parser = av_parser_init(st->codec->codec_id);
2218 if (st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser)
2219 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2221 codec = st->codec->codec ? st->codec->codec
2222 : avcodec_find_decoder(st->codec->codec_id);
2224 /* Force thread count to 1 since the H.264 decoder will not extract
2225 * SPS and PPS to extradata during multi-threaded decoding. */
2226 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
2228 /* Ensure that subtitle_header is properly set. */
2229 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2230 && codec && !st->codec->codec)
2231 avcodec_open2(st->codec, codec,
2232 options ? &options[i] : &thread_opt);
2234 // Try to just open decoders, in case this is enough to get parameters.
2235 if (!has_codec_parameters(st)) {
2236 if (codec && !st->codec->codec)
2237 avcodec_open2(st->codec, codec,
2238 options ? &options[i] : &thread_opt);
2241 av_dict_free(&thread_opt);
2244 for (i = 0; i < ic->nb_streams; i++) {
2245 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
2246 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
2252 if (ff_check_interrupt(&ic->interrupt_callback)) {
2254 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2258 /* check if one codec still needs to be handled */
2259 for (i = 0; i < ic->nb_streams; i++) {
2260 int fps_analyze_framecount = 20;
2262 st = ic->streams[i];
2263 if (!has_codec_parameters(st))
2265 /* If the timebase is coarse (like the usual millisecond precision
2266 * of mkv), we need to analyze more frames to reliably arrive at
2267 * the correct fps. */
2268 if (av_q2d(st->time_base) > 0.0005)
2269 fps_analyze_framecount *= 2;
2270 if (ic->fps_probe_size >= 0)
2271 fps_analyze_framecount = ic->fps_probe_size;
2272 /* variable fps and no guess at the real fps */
2273 if (tb_unreliable(st->codec) && !st->avg_frame_rate.num &&
2274 st->codec_info_nb_frames < fps_analyze_framecount &&
2275 st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2277 if (st->parser && st->parser->parser->split &&
2278 !st->codec->extradata)
2280 if (st->first_dts == AV_NOPTS_VALUE &&
2281 (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2282 st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2285 if (i == ic->nb_streams) {
2286 /* NOTE: If the format has no header, then we need to read some
2287 * packets to get most of the streams, so we cannot stop here. */
2288 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2289 /* If we found the info for all the codecs, we can stop. */
2291 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2295 /* We did not get all the codec info, but we read too much data. */
2296 if (read_size >= ic->probesize) {
2298 av_log(ic, AV_LOG_DEBUG,
2299 "Probe buffer size limit %d reached\n", ic->probesize);
2303 /* NOTE: A new stream can be added there if no header in file
2304 * (AVFMTCTX_NOHEADER). */
2305 ret = read_frame_internal(ic, &pkt1);
2306 if (ret == AVERROR(EAGAIN))
2311 AVPacket empty_pkt = { 0 };
2313 av_init_packet(&empty_pkt);
2315 /* We could not have all the codec parameters before EOF. */
2317 for (i = 0; i < ic->nb_streams; i++) {
2318 st = ic->streams[i];
2320 /* flush the decoders */
2321 if (st->info->found_decoder == 1) {
2323 err = try_decode_frame(st, &empty_pkt,
2324 (options && i < orig_nb_streams)
2325 ? &options[i] : NULL);
2326 } while (err > 0 && !has_codec_parameters(st));
2330 av_log(ic, AV_LOG_WARNING,
2331 "decoding for stream %d failed\n", st->index);
2332 } else if (!has_codec_parameters(st)) {
2334 avcodec_string(buf, sizeof(buf), st->codec, 0);
2335 av_log(ic, AV_LOG_WARNING,
2336 "Could not find codec parameters (%s)\n", buf);
2344 if (ic->flags & AVFMT_FLAG_NOBUFFER) {
2347 pkt = add_to_pktbuf(&ic->packet_buffer, &pkt1,
2348 &ic->packet_buffer_end);
2349 if ((ret = av_dup_packet(pkt)) < 0)
2350 goto find_stream_info_err;
2353 read_size += pkt->size;
2355 st = ic->streams[pkt->stream_index];
2356 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
2357 /* check for non-increasing dts */
2358 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
2359 st->info->fps_last_dts >= pkt->dts) {
2360 av_log(ic, AV_LOG_WARNING,
2361 "Non-increasing DTS in stream %d: packet %d with DTS "
2362 "%"PRId64", packet %d with DTS %"PRId64"\n",
2363 st->index, st->info->fps_last_dts_idx,
2364 st->info->fps_last_dts, st->codec_info_nb_frames,
2366 st->info->fps_first_dts =
2367 st->info->fps_last_dts = AV_NOPTS_VALUE;
2369 /* Check for a discontinuity in dts. If the difference in dts
2370 * is more than 1000 times the average packet duration in the
2371 * sequence, we treat it as a discontinuity. */
2372 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
2373 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
2374 (pkt->dts - st->info->fps_last_dts) / 1000 >
2375 (st->info->fps_last_dts - st->info->fps_first_dts) /
2376 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
2377 av_log(ic, AV_LOG_WARNING,
2378 "DTS discontinuity in stream %d: packet %d with DTS "
2379 "%"PRId64", packet %d with DTS %"PRId64"\n",
2380 st->index, st->info->fps_last_dts_idx,
2381 st->info->fps_last_dts, st->codec_info_nb_frames,
2383 st->info->fps_first_dts =
2384 st->info->fps_last_dts = AV_NOPTS_VALUE;
2387 /* update stored dts values */
2388 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
2389 st->info->fps_first_dts = pkt->dts;
2390 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
2392 st->info->fps_last_dts = pkt->dts;
2393 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
2395 /* check max_analyze_duration */
2396 if (av_rescale_q(pkt->dts - st->info->fps_first_dts, st->time_base,
2397 AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
2398 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached\n",
2399 ic->max_analyze_duration);
2403 if (st->parser && st->parser->parser->split && !st->codec->extradata) {
2404 int i = st->parser->parser->split(st->codec, pkt->data, pkt->size);
2405 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
2406 st->codec->extradata_size = i;
2407 st->codec->extradata = av_malloc(st->codec->extradata_size +
2408 FF_INPUT_BUFFER_PADDING_SIZE);
2409 if (!st->codec->extradata)
2410 return AVERROR(ENOMEM);
2411 memcpy(st->codec->extradata, pkt->data,
2412 st->codec->extradata_size);
2413 memset(st->codec->extradata + i, 0,
2414 FF_INPUT_BUFFER_PADDING_SIZE);
2418 /* If still no information, we try to open the codec and to
2419 * decompress the frame. We try to avoid that in most cases as
2420 * it takes longer and uses more memory. For MPEG-4, we need to
2421 * decompress for QuickTime.
2423 * If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2424 * least one frame of codec data, this makes sure the codec initializes
2425 * the channel configuration and does not only trust the values from
2427 try_decode_frame(st, pkt,
2428 (options && i < orig_nb_streams) ? &options[i] : NULL);
2430 st->codec_info_nb_frames++;
2434 // close codecs which were opened in try_decode_frame()
2435 for (i = 0; i < ic->nb_streams; i++) {
2436 st = ic->streams[i];
2437 avcodec_close(st->codec);
2439 for (i = 0; i < ic->nb_streams; i++) {
2440 st = ic->streams[i];
2441 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2442 /* estimate average framerate if not set by demuxer */
2443 if (!st->avg_frame_rate.num &&
2444 st->info->fps_last_dts != st->info->fps_first_dts) {
2445 int64_t delta_dts = st->info->fps_last_dts -
2446 st->info->fps_first_dts;
2447 int delta_packets = st->info->fps_last_dts_idx -
2448 st->info->fps_first_dts_idx;
2450 double best_error = 0.01;
2452 if (delta_dts >= INT64_MAX / st->time_base.num ||
2453 delta_packets >= INT64_MAX / st->time_base.den ||
2456 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2457 delta_packets * (int64_t) st->time_base.den,
2458 delta_dts * (int64_t) st->time_base.num, 60000);
2460 /* Round guessed framerate to a "standard" framerate if it's
2461 * within 1% of the original estimate. */
2462 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
2463 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
2464 double error = fabs(av_q2d(st->avg_frame_rate) /
2465 av_q2d(std_fps) - 1);
2467 if (error < best_error) {
2469 best_fps = std_fps.num;
2473 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2474 best_fps, 12 * 1001, INT_MAX);
2476 } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2477 if (!st->codec->bits_per_coded_sample)
2478 st->codec->bits_per_coded_sample =
2479 av_get_bits_per_sample(st->codec->codec_id);
2480 // set stream disposition based on audio service type
2481 switch (st->codec->audio_service_type) {
2482 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2483 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
2485 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2486 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
2488 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2489 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
2491 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2492 st->disposition = AV_DISPOSITION_COMMENT;
2494 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2495 st->disposition = AV_DISPOSITION_KARAOKE;
2501 estimate_timings(ic, old_offset);
2503 compute_chapters_end(ic);
2505 find_stream_info_err:
2506 for (i = 0; i < ic->nb_streams; i++) {
2507 ic->streams[i]->codec->thread_count = 0;
2508 av_freep(&ic->streams[i]->info);
2513 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2517 for (i = 0; i < ic->nb_programs; i++)
2518 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2519 if (ic->programs[i]->stream_index[j] == s)
2520 return ic->programs[i];
2524 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
2525 int wanted_stream_nb, int related_stream,
2526 AVCodec **decoder_ret, int flags)
2528 int i, nb_streams = ic->nb_streams;
2529 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2530 unsigned *program = NULL;
2531 AVCodec *decoder = NULL, *best_decoder = NULL;
2533 if (related_stream >= 0 && wanted_stream_nb < 0) {
2534 AVProgram *p = find_program_from_stream(ic, related_stream);
2536 program = p->stream_index;
2537 nb_streams = p->nb_stream_indexes;
2540 for (i = 0; i < nb_streams; i++) {
2541 int real_stream_index = program ? program[i] : i;
2542 AVStream *st = ic->streams[real_stream_index];
2543 AVCodecContext *avctx = st->codec;
2544 if (avctx->codec_type != type)
2546 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2548 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED |
2549 AV_DISPOSITION_VISUAL_IMPAIRED))
2552 decoder = avcodec_find_decoder(st->codec->codec_id);
2555 ret = AVERROR_DECODER_NOT_FOUND;
2559 if (best_count >= st->codec_info_nb_frames)
2561 best_count = st->codec_info_nb_frames;
2562 ret = real_stream_index;
2563 best_decoder = decoder;
2564 if (program && i == nb_streams - 1 && ret < 0) {
2566 nb_streams = ic->nb_streams;
2567 /* no related stream found, try again with everything */
2572 *decoder_ret = best_decoder;
2576 /*******************************************************/
2578 int av_read_play(AVFormatContext *s)
2580 if (s->iformat->read_play)
2581 return s->iformat->read_play(s);
2583 return avio_pause(s->pb, 0);
2584 return AVERROR(ENOSYS);
2587 int av_read_pause(AVFormatContext *s)
2589 if (s->iformat->read_pause)
2590 return s->iformat->read_pause(s);
2592 return avio_pause(s->pb, 1);
2593 return AVERROR(ENOSYS);
2596 void avformat_free_context(AVFormatContext *s)
2602 if (s->iformat && s->iformat->priv_class && s->priv_data)
2603 av_opt_free(s->priv_data);
2605 for (i = 0; i < s->nb_streams; i++) {
2606 /* free all data in a stream component */
2609 av_parser_close(st->parser);
2611 if (st->attached_pic.data)
2612 av_free_packet(&st->attached_pic);
2613 av_dict_free(&st->metadata);
2614 av_freep(&st->probe_data.buf);
2615 av_free(st->index_entries);
2616 av_free(st->codec->extradata);
2617 av_free(st->codec->subtitle_header);
2619 av_free(st->priv_data);
2623 for (i = s->nb_programs - 1; i >= 0; i--) {
2624 av_dict_free(&s->programs[i]->metadata);
2625 av_freep(&s->programs[i]->stream_index);
2626 av_freep(&s->programs[i]);
2628 av_freep(&s->programs);
2629 av_freep(&s->priv_data);
2630 while (s->nb_chapters--) {
2631 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2632 av_free(s->chapters[s->nb_chapters]);
2634 av_freep(&s->chapters);
2635 av_dict_free(&s->metadata);
2636 av_freep(&s->streams);
2637 av_freep(&s->internal);
2641 void avformat_close_input(AVFormatContext **ps)
2643 AVFormatContext *s = *ps;
2644 AVIOContext *pb = s->pb;
2646 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
2647 (s->flags & AVFMT_FLAG_CUSTOM_IO))
2650 flush_packet_queue(s);
2653 if (s->iformat->read_close)
2654 s->iformat->read_close(s);
2656 avformat_free_context(s);
2663 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
2668 if (av_reallocp_array(&s->streams, s->nb_streams + 1,
2669 sizeof(*s->streams)) < 0) {
2674 st = av_mallocz(sizeof(AVStream));
2677 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2682 st->codec = avcodec_alloc_context3(c);
2684 /* no default bitrate if decoding */
2685 st->codec->bit_rate = 0;
2686 st->index = s->nb_streams;
2687 st->start_time = AV_NOPTS_VALUE;
2688 st->duration = AV_NOPTS_VALUE;
2689 /* we set the current DTS to 0 so that formats without any timestamps
2690 * but durations get some timestamps, formats with some unknown
2691 * timestamps have their first few packets buffered and the
2692 * timestamps corrected before they are returned to the user */
2694 st->first_dts = AV_NOPTS_VALUE;
2695 st->probe_packets = MAX_PROBE_PACKETS;
2697 /* default pts setting is MPEG-like */
2698 avpriv_set_pts_info(st, 33, 1, 90000);
2699 st->last_IP_pts = AV_NOPTS_VALUE;
2700 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
2701 st->pts_buffer[i] = AV_NOPTS_VALUE;
2703 st->sample_aspect_ratio = (AVRational) { 0, 1 };
2705 st->info->fps_first_dts = AV_NOPTS_VALUE;
2706 st->info->fps_last_dts = AV_NOPTS_VALUE;
2708 s->streams[s->nb_streams++] = st;
2712 AVProgram *av_new_program(AVFormatContext *ac, int id)
2714 AVProgram *program = NULL;
2717 av_dlog(ac, "new_program: id=0x%04x\n", id);
2719 for (i = 0; i < ac->nb_programs; i++)
2720 if (ac->programs[i]->id == id)
2721 program = ac->programs[i];
2724 program = av_mallocz(sizeof(AVProgram));
2727 dynarray_add(&ac->programs, &ac->nb_programs, program);
2728 program->discard = AVDISCARD_NONE;
2735 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
2736 int64_t start, int64_t end, const char *title)
2738 AVChapter *chapter = NULL;
2741 for (i = 0; i < s->nb_chapters; i++)
2742 if (s->chapters[i]->id == id)
2743 chapter = s->chapters[i];
2746 chapter = av_mallocz(sizeof(AVChapter));
2749 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2751 av_dict_set(&chapter->metadata, "title", title, 0);
2753 chapter->time_base = time_base;
2754 chapter->start = start;
2760 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
2763 AVProgram *program = NULL;
2765 if (idx >= ac->nb_streams) {
2766 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
2770 for (i = 0; i < ac->nb_programs; i++) {
2771 if (ac->programs[i]->id != progid)
2773 program = ac->programs[i];
2774 for (j = 0; j < program->nb_stream_indexes; j++)
2775 if (program->stream_index[j] == idx)
2778 if (av_reallocp_array(&program->stream_index,
2779 program->nb_stream_indexes + 1,
2780 sizeof(*program->stream_index)) < 0) {
2781 program->nb_stream_indexes = 0;
2784 program->stream_index[program->nb_stream_indexes++] = idx;
2789 static void print_fps(double d, const char *postfix)
2791 uint64_t v = lrintf(d * 100);
2793 av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
2794 else if (v % (100 * 1000))
2795 av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
2797 av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d / 1000, postfix);
2800 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
2802 if (m && !(av_dict_count(m) == 1 && av_dict_get(m, "language", NULL, 0))) {
2803 AVDictionaryEntry *tag = NULL;
2805 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
2806 while ((tag = av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX)))
2807 if (strcmp("language", tag->key))
2808 av_log(ctx, AV_LOG_INFO,
2809 "%s %-16s: %s\n", indent, tag->key, tag->value);
2813 /* "user interface" functions */
2814 static void dump_stream_format(AVFormatContext *ic, int i,
2815 int index, int is_output)
2818 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2819 AVStream *st = ic->streams[i];
2820 int g = av_gcd(st->time_base.num, st->time_base.den);
2821 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
2822 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2823 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2824 /* the pid is an important information, so we display it */
2825 /* XXX: add a generic system */
2826 if (flags & AVFMT_SHOW_IDS)
2827 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2829 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
2830 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames,
2831 st->time_base.num / g, st->time_base.den / g);
2832 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2833 if (st->sample_aspect_ratio.num && // default
2834 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
2835 AVRational display_aspect_ratio;
2836 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
2837 st->codec->width * st->sample_aspect_ratio.num,
2838 st->codec->height * st->sample_aspect_ratio.den,
2840 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
2841 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
2842 display_aspect_ratio.num, display_aspect_ratio.den);
2844 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2845 if (st->avg_frame_rate.den && st->avg_frame_rate.num)
2846 print_fps(av_q2d(st->avg_frame_rate), "fps");
2847 if (st->time_base.den && st->time_base.num)
2848 print_fps(1 / av_q2d(st->time_base), "tbn");
2849 if (st->codec->time_base.den && st->codec->time_base.num)
2850 print_fps(1 / av_q2d(st->codec->time_base), "tbc");
2852 if (st->disposition & AV_DISPOSITION_DEFAULT)
2853 av_log(NULL, AV_LOG_INFO, " (default)");
2854 if (st->disposition & AV_DISPOSITION_DUB)
2855 av_log(NULL, AV_LOG_INFO, " (dub)");
2856 if (st->disposition & AV_DISPOSITION_ORIGINAL)
2857 av_log(NULL, AV_LOG_INFO, " (original)");
2858 if (st->disposition & AV_DISPOSITION_COMMENT)
2859 av_log(NULL, AV_LOG_INFO, " (comment)");
2860 if (st->disposition & AV_DISPOSITION_LYRICS)
2861 av_log(NULL, AV_LOG_INFO, " (lyrics)");
2862 if (st->disposition & AV_DISPOSITION_KARAOKE)
2863 av_log(NULL, AV_LOG_INFO, " (karaoke)");
2864 if (st->disposition & AV_DISPOSITION_FORCED)
2865 av_log(NULL, AV_LOG_INFO, " (forced)");
2866 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
2867 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
2868 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
2869 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
2870 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
2871 av_log(NULL, AV_LOG_INFO, " (clean effects)");
2872 av_log(NULL, AV_LOG_INFO, "\n");
2873 dump_metadata(NULL, st->metadata, " ");
2876 void av_dump_format(AVFormatContext *ic, int index,
2877 const char *url, int is_output)
2880 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
2881 if (ic->nb_streams && !printed)
2884 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2885 is_output ? "Output" : "Input",
2887 is_output ? ic->oformat->name : ic->iformat->name,
2888 is_output ? "to" : "from", url);
2889 dump_metadata(NULL, ic->metadata, " ");
2891 av_log(NULL, AV_LOG_INFO, " Duration: ");
2892 if (ic->duration != AV_NOPTS_VALUE) {
2893 int hours, mins, secs, us;
2894 secs = ic->duration / AV_TIME_BASE;
2895 us = ic->duration % AV_TIME_BASE;
2900 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
2901 (100 * us) / AV_TIME_BASE);
2903 av_log(NULL, AV_LOG_INFO, "N/A");
2905 if (ic->start_time != AV_NOPTS_VALUE) {
2907 av_log(NULL, AV_LOG_INFO, ", start: ");
2908 secs = ic->start_time / AV_TIME_BASE;
2909 us = abs(ic->start_time % AV_TIME_BASE);
2910 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2911 secs, (int) av_rescale(us, 1000000, AV_TIME_BASE));
2913 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2915 av_log(NULL, AV_LOG_INFO, "%d kb/s", ic->bit_rate / 1000);
2917 av_log(NULL, AV_LOG_INFO, "N/A");
2918 av_log(NULL, AV_LOG_INFO, "\n");
2920 for (i = 0; i < ic->nb_chapters; i++) {
2921 AVChapter *ch = ic->chapters[i];
2922 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
2923 av_log(NULL, AV_LOG_INFO,
2924 "start %f, ", ch->start * av_q2d(ch->time_base));
2925 av_log(NULL, AV_LOG_INFO,
2926 "end %f\n", ch->end * av_q2d(ch->time_base));
2928 dump_metadata(NULL, ch->metadata, " ");
2930 if (ic->nb_programs) {
2931 int j, k, total = 0;
2932 for (j = 0; j < ic->nb_programs; j++) {
2933 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
2935 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2936 name ? name->value : "");
2937 dump_metadata(NULL, ic->programs[j]->metadata, " ");
2938 for (k = 0; k < ic->programs[j]->nb_stream_indexes; k++) {
2939 dump_stream_format(ic, ic->programs[j]->stream_index[k],
2941 printed[ic->programs[j]->stream_index[k]] = 1;
2943 total += ic->programs[j]->nb_stream_indexes;
2945 if (total < ic->nb_streams)
2946 av_log(NULL, AV_LOG_INFO, " No Program\n");
2948 for (i = 0; i < ic->nb_streams; i++)
2950 dump_stream_format(ic, i, index, is_output);
2955 uint64_t ff_ntp_time(void)
2957 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
2960 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
2963 char *q, buf1[20], c;
2964 int nd, len, percentd_found;
2976 while (av_isdigit(*p))
2977 nd = nd * 10 + *p++ - '0';
2979 } while (av_isdigit(c));
2988 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2990 if ((q - buf + len) > buf_size - 1)
2992 memcpy(q, buf1, len);
3000 if ((q - buf) < buf_size - 1)
3004 if (!percentd_found)
3013 #define HEXDUMP_PRINT(...) \
3016 av_log(avcl, level, __VA_ARGS__); \
3018 fprintf(f, __VA_ARGS__); \
3021 static void hex_dump_internal(void *avcl, FILE *f, int level,
3022 const uint8_t *buf, int size)
3026 for (i = 0; i < size; i += 16) {
3030 HEXDUMP_PRINT("%08x ", i);
3031 for (j = 0; j < 16; j++) {
3033 HEXDUMP_PRINT(" %02x", buf[i + j]);
3038 for (j = 0; j < len; j++) {
3040 if (c < ' ' || c > '~')
3042 HEXDUMP_PRINT("%c", c);
3044 HEXDUMP_PRINT("\n");
3048 void av_hex_dump(FILE *f, const uint8_t *buf, int size)
3050 hex_dump_internal(NULL, f, 0, buf, size);
3053 void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size)
3055 hex_dump_internal(avcl, NULL, level, buf, size);
3058 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt,
3059 int dump_payload, AVRational time_base)
3061 HEXDUMP_PRINT("stream #%d:\n", pkt->stream_index);
3062 HEXDUMP_PRINT(" keyframe=%d\n", (pkt->flags & AV_PKT_FLAG_KEY) != 0);
3063 HEXDUMP_PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3064 /* DTS is _always_ valid after av_read_frame() */
3065 HEXDUMP_PRINT(" dts=");
3066 if (pkt->dts == AV_NOPTS_VALUE)
3067 HEXDUMP_PRINT("N/A");
3069 HEXDUMP_PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3070 /* PTS may not be known if B-frames are present. */
3071 HEXDUMP_PRINT(" pts=");
3072 if (pkt->pts == AV_NOPTS_VALUE)
3073 HEXDUMP_PRINT("N/A");
3075 HEXDUMP_PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3076 HEXDUMP_PRINT("\n");
3077 HEXDUMP_PRINT(" size=%d\n", pkt->size);
3079 av_hex_dump(f, pkt->data, pkt->size);
3082 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3084 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3087 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3090 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3093 void av_url_split(char *proto, int proto_size,
3094 char *authorization, int authorization_size,
3095 char *hostname, int hostname_size,
3096 int *port_ptr, char *path, int path_size, const char *url)
3098 const char *p, *ls, *at, *col, *brk;
3104 if (authorization_size > 0)
3105 authorization[0] = 0;
3106 if (hostname_size > 0)
3111 /* parse protocol */
3112 if ((p = strchr(url, ':'))) {
3113 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3120 /* no protocol means plain filename */
3121 av_strlcpy(path, url, path_size);
3125 /* separate path from hostname */
3126 ls = strchr(p, '/');
3128 ls = strchr(p, '?');
3130 av_strlcpy(path, ls, path_size);
3132 ls = &p[strlen(p)]; // XXX
3134 /* the rest is hostname, use that to parse auth/port */
3136 /* authorization (user[:pass]@hostname) */
3137 if ((at = strchr(p, '@')) && at < ls) {
3138 av_strlcpy(authorization, p,
3139 FFMIN(authorization_size, at + 1 - p));
3140 p = at + 1; /* skip '@' */
3143 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3145 av_strlcpy(hostname, p + 1,
3146 FFMIN(hostname_size, brk - p));
3147 if (brk[1] == ':' && port_ptr)
3148 *port_ptr = atoi(brk + 2);
3149 } else if ((col = strchr(p, ':')) && col < ls) {
3150 av_strlcpy(hostname, p,
3151 FFMIN(col + 1 - p, hostname_size));
3153 *port_ptr = atoi(col + 1);
3155 av_strlcpy(hostname, p,
3156 FFMIN(ls + 1 - p, hostname_size));
3160 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3163 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3166 'C', 'D', 'E', 'F' };
3167 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3170 'c', 'd', 'e', 'f' };
3171 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3173 for (i = 0; i < s; i++) {
3174 buff[i * 2] = hex_table[src[i] >> 4];
3175 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3181 int ff_hex_to_data(uint8_t *data, const char *p)
3188 p += strspn(p, SPACE_CHARS);
3191 c = av_toupper((unsigned char) *p++);
3192 if (c >= '0' && c <= '9')
3194 else if (c >= 'A' && c <= 'F')
3209 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
3210 unsigned int pts_num, unsigned int pts_den)
3213 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
3214 if (new_tb.num != pts_num)
3215 av_log(NULL, AV_LOG_DEBUG,
3216 "st:%d removing common factor %d from timebase\n",
3217 s->index, pts_num / new_tb.num);
3219 av_log(NULL, AV_LOG_WARNING,
3220 "st:%d has too large timebase, reducing\n", s->index);
3222 if (new_tb.num <= 0 || new_tb.den <= 0) {
3223 av_log(NULL, AV_LOG_ERROR,
3224 "Ignoring attempt to set invalid timebase for st:%d\n",
3228 s->time_base = new_tb;
3229 s->pts_wrap_bits = pts_wrap_bits;
3232 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3235 const char *ptr = str;
3237 /* Parse key=value pairs. */
3240 char *dest = NULL, *dest_end;
3241 int key_len, dest_len = 0;
3243 /* Skip whitespace and potential commas. */
3244 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
3251 if (!(ptr = strchr(key, '=')))
3254 key_len = ptr - key;
3256 callback_get_buf(context, key, key_len, &dest, &dest_len);
3257 dest_end = dest + dest_len - 1;
3261 while (*ptr && *ptr != '\"') {
3265 if (dest && dest < dest_end)
3269 if (dest && dest < dest_end)
3277 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
3278 if (dest && dest < dest_end)
3286 int ff_find_stream_index(AVFormatContext *s, int id)
3289 for (i = 0; i < s->nb_streams; i++)
3290 if (s->streams[i]->id == id)
3295 int64_t ff_iso8601_to_unix_time(const char *datestr)
3298 struct tm time1 = { 0 }, time2 = { 0 };
3300 ret1 = strptime(datestr, "%Y - %m - %d %T", &time1);
3301 ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2);
3303 return av_timegm(&time2);
3305 return av_timegm(&time1);
3307 av_log(NULL, AV_LOG_WARNING,
3308 "strptime() unavailable on this system, cannot convert "
3309 "the date string.\n");
3314 int avformat_query_codec(AVOutputFormat *ofmt, enum AVCodecID codec_id,
3318 if (ofmt->query_codec)
3319 return ofmt->query_codec(codec_id, std_compliance);
3320 else if (ofmt->codec_tag)
3321 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
3322 else if (codec_id == ofmt->video_codec ||
3323 codec_id == ofmt->audio_codec ||
3324 codec_id == ofmt->subtitle_codec)
3327 return AVERROR_PATCHWELCOME;
3330 int avformat_network_init(void)
3334 ff_network_inited_globally = 1;
3335 if ((ret = ff_network_init()) < 0)
3342 int avformat_network_deinit(void)
3351 int ff_add_param_change(AVPacket *pkt, int32_t channels,
3352 uint64_t channel_layout, int32_t sample_rate,
3353 int32_t width, int32_t height)
3359 return AVERROR(EINVAL);
3362 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
3364 if (channel_layout) {
3366 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
3370 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
3372 if (width || height) {
3374 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
3376 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
3378 return AVERROR(ENOMEM);
3379 bytestream_put_le32(&data, flags);
3381 bytestream_put_le32(&data, channels);
3383 bytestream_put_le64(&data, channel_layout);
3385 bytestream_put_le32(&data, sample_rate);
3386 if (width || height) {
3387 bytestream_put_le32(&data, width);
3388 bytestream_put_le32(&data, height);
3393 int ff_generate_avci_extradata(AVStream *st)
3395 static const uint8_t avci100_1080p_extradata[] = {
3397 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
3398 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
3399 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
3400 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
3401 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
3402 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
3403 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
3404 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
3405 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3407 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
3410 static const uint8_t avci100_1080i_extradata[] = {
3412 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
3413 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
3414 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
3415 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
3416 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
3417 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
3418 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
3419 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
3420 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
3421 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
3422 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x00,
3424 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
3427 static const uint8_t avci50_1080i_extradata[] = {
3429 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
3430 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
3431 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
3432 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
3433 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
3434 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
3435 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
3436 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
3437 0x81, 0x13, 0xf7, 0xff, 0x80, 0x01, 0x80, 0x02,
3438 0x71, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
3439 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
3441 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
3444 static const uint8_t avci100_720p_extradata[] = {
3446 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
3447 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
3448 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
3449 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
3450 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
3451 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
3452 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
3453 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
3454 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
3455 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
3457 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
3461 const uint8_t *data = NULL;
3464 if (st->codec->width == 1920) {
3465 if (st->codec->field_order == AV_FIELD_PROGRESSIVE) {
3466 data = avci100_1080p_extradata;
3467 size = sizeof(avci100_1080p_extradata);
3469 data = avci100_1080i_extradata;
3470 size = sizeof(avci100_1080i_extradata);
3472 } else if (st->codec->width == 1440) {
3473 data = avci50_1080i_extradata;
3474 size = sizeof(avci50_1080i_extradata);
3475 } else if (st->codec->width == 1280) {
3476 data = avci100_720p_extradata;
3477 size = sizeof(avci100_720p_extradata);
3483 av_freep(&st->codec->extradata);
3484 st->codec->extradata_size = 0;
3485 st->codec->extradata = av_mallocz(size + FF_INPUT_BUFFER_PADDING_SIZE);
3486 if (!st->codec->extradata)
3487 return AVERROR(ENOMEM);
3489 memcpy(st->codec->extradata, data, size);
3490 st->codec->extradata_size = size;