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 },
961 out_pkt.stream_index = st->index;
962 out_pkt.pts = st->parser->pts;
963 out_pkt.dts = st->parser->dts;
964 out_pkt.pos = st->parser->pos;
966 if (st->parser->key_frame == 1 ||
967 (st->parser->key_frame == -1 &&
968 st->parser->pict_type == AV_PICTURE_TYPE_I))
969 out_pkt.flags |= AV_PKT_FLAG_KEY;
971 compute_pkt_fields(s, st, st->parser, &out_pkt);
973 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
974 out_pkt.flags & AV_PKT_FLAG_KEY) {
975 ff_reduce_index(s, st->index);
976 av_add_index_entry(st, st->parser->frame_offset, out_pkt.dts,
977 0, 0, AVINDEX_KEYFRAME);
980 if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
981 out_pkt.buf = pkt->buf;
983 #if FF_API_DESTRUCT_PACKET
984 FF_DISABLE_DEPRECATION_WARNINGS
985 out_pkt.destruct = pkt->destruct;
986 pkt->destruct = NULL;
987 FF_ENABLE_DEPRECATION_WARNINGS
990 if ((ret = av_dup_packet(&out_pkt)) < 0)
993 if (!add_to_pktbuf(&s->parse_queue, &out_pkt, &s->parse_queue_end)) {
994 av_free_packet(&out_pkt);
995 ret = AVERROR(ENOMEM);
1000 /* end of the stream => close and free the parser */
1001 if (pkt == &flush_pkt) {
1002 av_parser_close(st->parser);
1007 av_free_packet(pkt);
1011 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1012 AVPacketList **pkt_buffer_end,
1016 av_assert0(*pkt_buffer);
1019 *pkt_buffer = pktl->next;
1021 *pkt_buffer_end = NULL;
1026 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1028 int ret = 0, i, got_packet = 0;
1030 av_init_packet(pkt);
1032 while (!got_packet && !s->parse_queue) {
1036 /* read next packet */
1037 ret = ff_read_packet(s, &cur_pkt);
1039 if (ret == AVERROR(EAGAIN))
1041 /* flush the parsers */
1042 for (i = 0; i < s->nb_streams; i++) {
1044 if (st->parser && st->need_parsing)
1045 parse_packet(s, NULL, st->index);
1047 /* all remaining packets are now in parse_queue =>
1048 * really terminate parsing */
1052 st = s->streams[cur_pkt.stream_index];
1054 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1055 cur_pkt.dts != AV_NOPTS_VALUE &&
1056 cur_pkt.pts < cur_pkt.dts) {
1057 av_log(s, AV_LOG_WARNING,
1058 "Invalid timestamps stream=%d, pts=%"PRId64", "
1059 "dts=%"PRId64", size=%d\n",
1060 cur_pkt.stream_index, cur_pkt.pts,
1061 cur_pkt.dts, cur_pkt.size);
1063 if (s->debug & FF_FDEBUG_TS)
1064 av_log(s, AV_LOG_DEBUG,
1065 "ff_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", "
1066 "size=%d, duration=%d, flags=%d\n",
1067 cur_pkt.stream_index, cur_pkt.pts, cur_pkt.dts,
1068 cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
1070 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1071 st->parser = av_parser_init(st->codec->codec_id);
1073 /* no parser available: just output the raw packets */
1074 st->need_parsing = AVSTREAM_PARSE_NONE;
1075 else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1076 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1077 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1078 st->parser->flags |= PARSER_FLAG_ONCE;
1081 if (!st->need_parsing || !st->parser) {
1082 /* no parsing needed: we just output the packet as is */
1084 compute_pkt_fields(s, st, NULL, pkt);
1085 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1086 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1087 ff_reduce_index(s, st->index);
1088 av_add_index_entry(st, pkt->pos, pkt->dts,
1089 0, 0, AVINDEX_KEYFRAME);
1092 } else if (st->discard < AVDISCARD_ALL) {
1093 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1097 av_free_packet(&cur_pkt);
1101 if (!got_packet && s->parse_queue)
1102 ret = read_from_packet_buffer(&s->parse_queue, &s->parse_queue_end, pkt);
1104 if (s->debug & FF_FDEBUG_TS)
1105 av_log(s, AV_LOG_DEBUG,
1106 "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", "
1107 "size=%d, duration=%d, flags=%d\n",
1108 pkt->stream_index, pkt->pts, pkt->dts,
1109 pkt->size, pkt->duration, pkt->flags);
1114 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1116 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1120 return s->packet_buffer
1121 ? read_from_packet_buffer(&s->packet_buffer,
1122 &s->packet_buffer_end, pkt)
1123 : read_frame_internal(s, pkt);
1127 AVPacketList *pktl = s->packet_buffer;
1130 AVPacket *next_pkt = &pktl->pkt;
1132 if (next_pkt->dts != AV_NOPTS_VALUE) {
1133 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1134 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1135 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1136 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0) &&
1137 av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) {
1139 next_pkt->pts = pktl->pkt.dts;
1143 pktl = s->packet_buffer;
1146 /* read packet from packet buffer, if there is data */
1147 if (!(next_pkt->pts == AV_NOPTS_VALUE &&
1148 next_pkt->dts != AV_NOPTS_VALUE && !eof))
1149 return read_from_packet_buffer(&s->packet_buffer,
1150 &s->packet_buffer_end, pkt);
1153 ret = read_frame_internal(s, pkt);
1155 if (pktl && ret != AVERROR(EAGAIN)) {
1162 if (av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1163 &s->packet_buffer_end)) < 0)
1164 return AVERROR(ENOMEM);
1168 /* XXX: suppress the packet queue */
1169 static void flush_packet_queue(AVFormatContext *s)
1171 free_packet_buffer(&s->parse_queue, &s->parse_queue_end);
1172 free_packet_buffer(&s->packet_buffer, &s->packet_buffer_end);
1173 free_packet_buffer(&s->raw_packet_buffer, &s->raw_packet_buffer_end);
1175 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1178 /*******************************************************/
1181 int av_find_default_stream_index(AVFormatContext *s)
1183 int first_audio_index = -1;
1187 if (s->nb_streams <= 0)
1189 for (i = 0; i < s->nb_streams; i++) {
1191 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1192 !(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
1195 if (first_audio_index < 0 &&
1196 st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1197 first_audio_index = i;
1199 return first_audio_index >= 0 ? first_audio_index : 0;
1202 /** Flush the frame reader. */
1203 void ff_read_frame_flush(AVFormatContext *s)
1208 flush_packet_queue(s);
1210 /* Reset read state for each stream. */
1211 for (i = 0; i < s->nb_streams; i++) {
1215 av_parser_close(st->parser);
1218 st->last_IP_pts = AV_NOPTS_VALUE;
1219 /* We set the current DTS to an unspecified origin. */
1220 st->cur_dts = AV_NOPTS_VALUE;
1222 st->probe_packets = MAX_PROBE_PACKETS;
1224 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1225 st->pts_buffer[j] = AV_NOPTS_VALUE;
1229 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1233 for (i = 0; i < s->nb_streams; i++) {
1234 AVStream *st = s->streams[i];
1237 av_rescale(timestamp,
1238 st->time_base.den * (int64_t) ref_st->time_base.num,
1239 st->time_base.num * (int64_t) ref_st->time_base.den);
1243 void ff_reduce_index(AVFormatContext *s, int stream_index)
1245 AVStream *st = s->streams[stream_index];
1246 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1248 if ((unsigned) st->nb_index_entries >= max_entries) {
1250 for (i = 0; 2 * i < st->nb_index_entries; i++)
1251 st->index_entries[i] = st->index_entries[2 * i];
1252 st->nb_index_entries = i;
1256 int ff_add_index_entry(AVIndexEntry **index_entries,
1257 int *nb_index_entries,
1258 unsigned int *index_entries_allocated_size,
1259 int64_t pos, int64_t timestamp,
1260 int size, int distance, int flags)
1262 AVIndexEntry *entries, *ie;
1265 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1268 entries = av_fast_realloc(*index_entries,
1269 index_entries_allocated_size,
1270 (*nb_index_entries + 1) *
1271 sizeof(AVIndexEntry));
1275 *index_entries = entries;
1277 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
1278 timestamp, AVSEEK_FLAG_ANY);
1281 index = (*nb_index_entries)++;
1282 ie = &entries[index];
1283 assert(index == 0 || ie[-1].timestamp < timestamp);
1285 ie = &entries[index];
1286 if (ie->timestamp != timestamp) {
1287 if (ie->timestamp <= timestamp)
1289 memmove(entries + index + 1, entries + index,
1290 sizeof(AVIndexEntry) * (*nb_index_entries - index));
1291 (*nb_index_entries)++;
1292 } else if (ie->pos == pos && distance < ie->min_distance)
1293 // do not reduce the distance
1294 distance = ie->min_distance;
1298 ie->timestamp = timestamp;
1299 ie->min_distance = distance;
1306 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
1307 int size, int distance, int flags)
1309 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1310 &st->index_entries_allocated_size, pos,
1311 timestamp, size, distance, flags);
1314 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1315 int64_t wanted_timestamp, int flags)
1323 // Optimize appending index entries at the end.
1324 if (b && entries[b - 1].timestamp < wanted_timestamp)
1329 timestamp = entries[m].timestamp;
1330 if (timestamp >= wanted_timestamp)
1332 if (timestamp <= wanted_timestamp)
1335 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1337 if (!(flags & AVSEEK_FLAG_ANY))
1338 while (m >= 0 && m < nb_entries &&
1339 !(entries[m].flags & AVINDEX_KEYFRAME))
1340 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1342 if (m == nb_entries)
1347 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
1349 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1350 wanted_timestamp, flags);
1353 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
1354 int64_t target_ts, int flags)
1356 AVInputFormat *avif = s->iformat;
1357 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1358 int64_t ts_min, ts_max, ts;
1363 if (stream_index < 0)
1366 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1369 ts_min = AV_NOPTS_VALUE;
1370 pos_limit = -1; // GCC falsely says it may be uninitialized.
1372 st = s->streams[stream_index];
1373 if (st->index_entries) {
1376 /* FIXME: Whole function must be checked for non-keyframe entries in
1377 * index case, especially read_timestamp(). */
1378 index = av_index_search_timestamp(st, target_ts,
1379 flags | AVSEEK_FLAG_BACKWARD);
1380 index = FFMAX(index, 0);
1381 e = &st->index_entries[index];
1383 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
1385 ts_min = e->timestamp;
1386 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1392 index = av_index_search_timestamp(st, target_ts,
1393 flags & ~AVSEEK_FLAG_BACKWARD);
1394 assert(index < st->nb_index_entries);
1396 e = &st->index_entries[index];
1397 assert(e->timestamp >= target_ts);
1399 ts_max = e->timestamp;
1400 pos_limit = pos_max - e->min_distance;
1401 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
1402 " dts_max=%"PRId64"\n", pos_max, pos_limit, ts_max);
1406 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
1407 ts_min, ts_max, flags, &ts, avif->read_timestamp);
1412 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1415 ff_update_cur_dts(s, st, ts);
1420 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1421 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1422 int64_t ts_min, int64_t ts_max,
1423 int flags, int64_t *ts_ret,
1424 int64_t (*read_timestamp)(struct AVFormatContext *, int,
1425 int64_t *, int64_t))
1428 int64_t start_pos, filesize;
1431 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1433 if (ts_min == AV_NOPTS_VALUE) {
1434 pos_min = s->data_offset;
1435 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1436 if (ts_min == AV_NOPTS_VALUE)
1440 if (ts_max == AV_NOPTS_VALUE) {
1442 filesize = avio_size(s->pb);
1443 pos_max = filesize - 1;
1446 ts_max = read_timestamp(s, stream_index, &pos_max,
1449 } while (ts_max == AV_NOPTS_VALUE && pos_max >= step);
1450 if (ts_max == AV_NOPTS_VALUE)
1454 int64_t tmp_pos = pos_max + 1;
1455 int64_t tmp_ts = read_timestamp(s, stream_index,
1456 &tmp_pos, INT64_MAX);
1457 if (tmp_ts == AV_NOPTS_VALUE)
1461 if (tmp_pos >= filesize)
1464 pos_limit = pos_max;
1467 if (ts_min > ts_max)
1469 else if (ts_min == ts_max)
1470 pos_limit = pos_min;
1473 while (pos_min < pos_limit) {
1474 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64
1475 " dts_max=%"PRId64"\n", pos_min, pos_max, ts_min, ts_max);
1476 assert(pos_limit <= pos_max);
1478 if (no_change == 0) {
1479 int64_t approximate_keyframe_distance = pos_max - pos_limit;
1480 // interpolate position (better than dichotomy)
1481 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
1483 pos_min - approximate_keyframe_distance;
1484 } else if (no_change == 1) {
1485 // bisection if interpolation did not change min / max pos last time
1486 pos = (pos_min + pos_limit) >> 1;
1488 /* linear search if bisection failed, can only happen if there
1489 * are very few or no keyframes between min/max */
1494 else if (pos > pos_limit)
1498 // May pass pos_limit instead of -1.
1499 ts = read_timestamp(s, stream_index, &pos, INT64_MAX);
1504 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64
1505 " target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1506 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1507 pos_limit, start_pos, no_change);
1508 if (ts == AV_NOPTS_VALUE) {
1509 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1512 assert(ts != AV_NOPTS_VALUE);
1513 if (target_ts <= ts) {
1514 pos_limit = start_pos - 1;
1518 if (target_ts >= ts) {
1524 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1525 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1527 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1529 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1530 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1531 pos, ts_min, target_ts, ts_max);
1536 static int seek_frame_byte(AVFormatContext *s, int stream_index,
1537 int64_t pos, int flags)
1539 int64_t pos_min, pos_max;
1541 pos_min = s->data_offset;
1542 pos_max = avio_size(s->pb) - 1;
1546 else if (pos > pos_max)
1549 avio_seek(s->pb, pos, SEEK_SET);
1554 static int seek_frame_generic(AVFormatContext *s, int stream_index,
1555 int64_t timestamp, int flags)
1562 st = s->streams[stream_index];
1564 index = av_index_search_timestamp(st, timestamp, flags);
1566 if (index < 0 && st->nb_index_entries &&
1567 timestamp < st->index_entries[0].timestamp)
1570 if (index < 0 || index == st->nb_index_entries - 1) {
1573 if (st->nb_index_entries) {
1574 assert(st->index_entries);
1575 ie = &st->index_entries[st->nb_index_entries - 1];
1576 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1578 ff_update_cur_dts(s, st, ie->timestamp);
1580 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1586 read_status = av_read_frame(s, &pkt);
1587 } while (read_status == AVERROR(EAGAIN));
1588 if (read_status < 0)
1590 av_free_packet(&pkt);
1591 if (stream_index == pkt.stream_index)
1592 if ((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1595 index = av_index_search_timestamp(st, timestamp, flags);
1600 ff_read_frame_flush(s);
1601 if (s->iformat->read_seek)
1602 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1604 ie = &st->index_entries[index];
1605 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1607 ff_update_cur_dts(s, st, ie->timestamp);
1612 static int seek_frame_internal(AVFormatContext *s, int stream_index,
1613 int64_t timestamp, int flags)
1618 if (flags & AVSEEK_FLAG_BYTE) {
1619 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1621 ff_read_frame_flush(s);
1622 return seek_frame_byte(s, stream_index, timestamp, flags);
1625 if (stream_index < 0) {
1626 stream_index = av_find_default_stream_index(s);
1627 if (stream_index < 0)
1630 st = s->streams[stream_index];
1631 /* timestamp for default must be expressed in AV_TIME_BASE units */
1632 timestamp = av_rescale(timestamp, st->time_base.den,
1633 AV_TIME_BASE * (int64_t) st->time_base.num);
1636 /* first, we try the format specific seek */
1637 if (s->iformat->read_seek) {
1638 ff_read_frame_flush(s);
1639 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1645 if (s->iformat->read_timestamp &&
1646 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1647 ff_read_frame_flush(s);
1648 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1649 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1650 ff_read_frame_flush(s);
1651 return seek_frame_generic(s, stream_index, timestamp, flags);
1656 int av_seek_frame(AVFormatContext *s, int stream_index,
1657 int64_t timestamp, int flags)
1659 int ret = seek_frame_internal(s, stream_index, timestamp, flags);
1662 ret = queue_attached_pictures(s);
1667 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
1668 int64_t ts, int64_t max_ts, int flags)
1670 if (min_ts > ts || max_ts < ts)
1673 if (s->iformat->read_seek2) {
1675 ff_read_frame_flush(s);
1676 ret = s->iformat->read_seek2(s, stream_index, min_ts,
1680 ret = queue_attached_pictures(s);
1684 if (s->iformat->read_timestamp) {
1685 // try to seek via read_timestamp()
1688 // Fall back on old API if new is not implemented but old is.
1689 // Note the old API has somewhat different semantics.
1690 if (s->iformat->read_seek || 1)
1691 return av_seek_frame(s, stream_index, ts,
1692 flags | ((uint64_t) ts - min_ts >
1693 (uint64_t) max_ts - ts
1694 ? AVSEEK_FLAG_BACKWARD : 0));
1696 // try some generic seek like seek_frame_generic() but with new ts semantics
1699 /*******************************************************/
1702 * Return TRUE if the stream has accurate duration in any stream.
1704 * @return TRUE if the stream has accurate duration for at least one component.
1706 static int has_duration(AVFormatContext *ic)
1711 for (i = 0; i < ic->nb_streams; i++) {
1712 st = ic->streams[i];
1713 if (st->duration != AV_NOPTS_VALUE)
1716 if (ic->duration != AV_NOPTS_VALUE)
1722 * Estimate the stream timings from the one of each components.
1724 * Also computes the global bitrate if possible.
1726 static void update_stream_timings(AVFormatContext *ic)
1728 int64_t start_time, start_time1, end_time, end_time1;
1729 int64_t duration, duration1, filesize;
1733 start_time = INT64_MAX;
1734 end_time = INT64_MIN;
1735 duration = INT64_MIN;
1736 for (i = 0; i < ic->nb_streams; i++) {
1737 st = ic->streams[i];
1738 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1739 start_time1 = av_rescale_q(st->start_time, st->time_base,
1741 start_time = FFMIN(start_time, start_time1);
1742 if (st->duration != AV_NOPTS_VALUE) {
1743 end_time1 = start_time1 +
1744 av_rescale_q(st->duration, st->time_base,
1746 end_time = FFMAX(end_time, end_time1);
1749 if (st->duration != AV_NOPTS_VALUE) {
1750 duration1 = av_rescale_q(st->duration, st->time_base,
1752 duration = FFMAX(duration, duration1);
1755 if (start_time != INT64_MAX) {
1756 ic->start_time = start_time;
1757 if (end_time != INT64_MIN)
1758 duration = FFMAX(duration, end_time - start_time);
1760 if (duration != INT64_MIN) {
1761 ic->duration = duration;
1762 if (ic->pb && (filesize = avio_size(ic->pb)) > 0)
1763 /* compute the bitrate */
1764 ic->bit_rate = (double) filesize * 8.0 * AV_TIME_BASE /
1765 (double) ic->duration;
1769 static void fill_all_stream_timings(AVFormatContext *ic)
1774 update_stream_timings(ic);
1775 for (i = 0; i < ic->nb_streams; i++) {
1776 st = ic->streams[i];
1777 if (st->start_time == AV_NOPTS_VALUE) {
1778 if (ic->start_time != AV_NOPTS_VALUE)
1779 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
1781 if (ic->duration != AV_NOPTS_VALUE)
1782 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
1788 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
1790 int64_t filesize, duration;
1794 /* if bit_rate is already set, we believe it */
1795 if (ic->bit_rate <= 0) {
1797 for (i = 0; i < ic->nb_streams; i++) {
1798 st = ic->streams[i];
1799 if (st->codec->bit_rate > 0) {
1800 if (INT_MAX - st->codec->bit_rate < bit_rate) {
1804 bit_rate += st->codec->bit_rate;
1807 ic->bit_rate = bit_rate;
1810 /* if duration is already set, we believe it */
1811 if (ic->duration == AV_NOPTS_VALUE &&
1812 ic->bit_rate != 0) {
1813 filesize = ic->pb ? avio_size(ic->pb) : 0;
1815 for (i = 0; i < ic->nb_streams; i++) {
1816 st = ic->streams[i];
1817 duration = av_rescale(8 * filesize, st->time_base.den,
1819 (int64_t) st->time_base.num);
1820 if (st->duration == AV_NOPTS_VALUE)
1821 st->duration = duration;
1827 #define DURATION_MAX_READ_SIZE 250000
1828 #define DURATION_MAX_RETRY 3
1830 /* only usable for MPEG-PS streams */
1831 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1833 AVPacket pkt1, *pkt = &pkt1;
1835 int read_size, i, ret;
1837 int64_t filesize, offset, duration;
1840 /* flush packet queue */
1841 flush_packet_queue(ic);
1843 for (i = 0; i < ic->nb_streams; i++) {
1844 st = ic->streams[i];
1845 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1846 av_log(st->codec, AV_LOG_WARNING,
1847 "start time is not set in estimate_timings_from_pts\n");
1850 av_parser_close(st->parser);
1855 /* estimate the end time (duration) */
1856 /* XXX: may need to support wrapping */
1857 filesize = ic->pb ? avio_size(ic->pb) : 0;
1858 end_time = AV_NOPTS_VALUE;
1860 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
1864 avio_seek(ic->pb, offset, SEEK_SET);
1867 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
1871 ret = ff_read_packet(ic, pkt);
1872 } while (ret == AVERROR(EAGAIN));
1875 read_size += pkt->size;
1876 st = ic->streams[pkt->stream_index];
1877 if (pkt->pts != AV_NOPTS_VALUE &&
1878 (st->start_time != AV_NOPTS_VALUE ||
1879 st->first_dts != AV_NOPTS_VALUE)) {
1880 duration = end_time = pkt->pts;
1881 if (st->start_time != AV_NOPTS_VALUE)
1882 duration -= st->start_time;
1884 duration -= st->first_dts;
1886 duration += 1LL << st->pts_wrap_bits;
1888 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
1889 st->duration = duration;
1892 av_free_packet(pkt);
1894 } while (end_time == AV_NOPTS_VALUE &&
1895 filesize > (DURATION_MAX_READ_SIZE << retry) &&
1896 ++retry <= DURATION_MAX_RETRY);
1898 fill_all_stream_timings(ic);
1900 avio_seek(ic->pb, old_offset, SEEK_SET);
1901 for (i = 0; i < ic->nb_streams; i++) {
1902 st = ic->streams[i];
1903 st->cur_dts = st->first_dts;
1904 st->last_IP_pts = AV_NOPTS_VALUE;
1908 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
1912 /* get the file size, if possible */
1913 if (ic->iformat->flags & AVFMT_NOFILE) {
1916 file_size = avio_size(ic->pb);
1917 file_size = FFMAX(0, file_size);
1920 if ((!strcmp(ic->iformat->name, "mpeg") ||
1921 !strcmp(ic->iformat->name, "mpegts")) &&
1922 file_size && ic->pb->seekable) {
1923 /* get accurate estimate from the PTSes */
1924 estimate_timings_from_pts(ic, old_offset);
1925 } else if (has_duration(ic)) {
1926 /* at least one component has timings - we use them for all
1928 fill_all_stream_timings(ic);
1930 av_log(ic, AV_LOG_WARNING,
1931 "Estimating duration from bitrate, this may be inaccurate\n");
1932 /* less precise: use bitrate info */
1933 estimate_timings_from_bit_rate(ic);
1935 update_stream_timings(ic);
1939 AVStream av_unused *st;
1940 for (i = 0; i < ic->nb_streams; i++) {
1941 st = ic->streams[i];
1942 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
1943 (double) st->start_time / AV_TIME_BASE,
1944 (double) st->duration / AV_TIME_BASE);
1947 "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1948 (double) ic->start_time / AV_TIME_BASE,
1949 (double) ic->duration / AV_TIME_BASE,
1950 ic->bit_rate / 1000);
1954 static int has_codec_parameters(AVStream *st)
1956 AVCodecContext *avctx = st->codec;
1959 switch (avctx->codec_type) {
1960 case AVMEDIA_TYPE_AUDIO:
1961 val = avctx->sample_rate && avctx->channels;
1962 if (st->info->found_decoder >= 0 &&
1963 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
1966 case AVMEDIA_TYPE_VIDEO:
1968 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
1975 return avctx->codec_id != AV_CODEC_ID_NONE && val != 0;
1978 static int has_decode_delay_been_guessed(AVStream *st)
1980 return st->codec->codec_id != AV_CODEC_ID_H264 ||
1981 st->info->nb_decoded_frames >= 6;
1984 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
1985 static int try_decode_frame(AVStream *st, AVPacket *avpkt,
1986 AVDictionary **options)
1988 const AVCodec *codec;
1989 int got_picture = 1, ret = 0;
1990 AVFrame *frame = av_frame_alloc();
1991 AVPacket pkt = *avpkt;
1994 return AVERROR(ENOMEM);
1996 if (!avcodec_is_open(st->codec) && !st->info->found_decoder) {
1997 AVDictionary *thread_opt = NULL;
1999 codec = st->codec->codec ? st->codec->codec
2000 : avcodec_find_decoder(st->codec->codec_id);
2003 st->info->found_decoder = -1;
2008 /* Force thread count to 1 since the H.264 decoder will not extract
2009 * SPS and PPS to extradata during multi-threaded decoding. */
2010 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2011 ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
2013 av_dict_free(&thread_opt);
2015 st->info->found_decoder = -1;
2018 st->info->found_decoder = 1;
2019 } else if (!st->info->found_decoder)
2020 st->info->found_decoder = 1;
2022 if (st->info->found_decoder < 0) {
2027 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2029 (!has_codec_parameters(st) || !has_decode_delay_been_guessed(st) ||
2030 (!st->codec_info_nb_frames &&
2031 st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2033 switch (st->codec->codec_type) {
2034 case AVMEDIA_TYPE_VIDEO:
2035 ret = avcodec_decode_video2(st->codec, frame,
2036 &got_picture, &pkt);
2038 case AVMEDIA_TYPE_AUDIO:
2039 ret = avcodec_decode_audio4(st->codec, frame, &got_picture, &pkt);
2046 st->info->nb_decoded_frames++;
2054 av_frame_free(&frame);
2058 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
2060 while (tags->id != AV_CODEC_ID_NONE) {
2068 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2071 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
2072 if (tag == tags[i].tag)
2074 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
2075 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2077 return AV_CODEC_ID_NONE;
2080 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
2085 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
2087 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
2089 return AV_CODEC_ID_NONE;
2093 if (sflags & (1 << (bps - 1))) {
2096 return AV_CODEC_ID_PCM_S8;
2098 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
2100 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
2102 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
2104 return AV_CODEC_ID_NONE;
2109 return AV_CODEC_ID_PCM_U8;
2111 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
2113 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
2115 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
2117 return AV_CODEC_ID_NONE;
2123 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
2126 for (i = 0; tags && tags[i]; i++) {
2127 int tag = ff_codec_get_tag(tags[i], id);
2134 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
2137 for (i = 0; tags && tags[i]; i++) {
2138 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
2139 if (id != AV_CODEC_ID_NONE)
2142 return AV_CODEC_ID_NONE;
2145 static void compute_chapters_end(AVFormatContext *s)
2148 int64_t max_time = s->duration +
2149 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2151 for (i = 0; i < s->nb_chapters; i++)
2152 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2153 AVChapter *ch = s->chapters[i];
2154 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
2158 for (j = 0; j < s->nb_chapters; j++) {
2159 AVChapter *ch1 = s->chapters[j];
2160 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
2162 if (j != i && next_start > ch->start && next_start < end)
2165 ch->end = (end == INT64_MAX) ? ch->start : end;
2169 static int get_std_framerate(int i)
2172 return (i + 1) * 1001;
2174 return ((const int[]) { 24, 30, 60, 12, 15 })[i - 60 * 12] * 1000 * 12;
2177 /* Is the time base unreliable?
2178 * This is a heuristic to balance between quick acceptance of the values in
2179 * the headers vs. some extra checks.
2180 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2181 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2182 * And there are "variable" fps files this needs to detect as well. */
2183 static int tb_unreliable(AVCodecContext *c)
2185 if (c->time_base.den >= 101L * c->time_base.num ||
2186 c->time_base.den < 5L * c->time_base.num ||
2187 // c->codec_tag == AV_RL32("DIVX") ||
2188 // c->codec_tag == AV_RL32("XVID") ||
2189 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
2190 c->codec_id == AV_CODEC_ID_H264)
2195 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2197 int i, count, ret, read_size, j;
2199 AVPacket pkt1, *pkt;
2200 int64_t old_offset = avio_tell(ic->pb);
2201 // new streams might appear, no options for those
2202 int orig_nb_streams = ic->nb_streams;
2204 for (i = 0; i < ic->nb_streams; i++) {
2205 const AVCodec *codec;
2206 AVDictionary *thread_opt = NULL;
2207 st = ic->streams[i];
2209 // only for the split stuff
2210 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2211 st->parser = av_parser_init(st->codec->codec_id);
2212 if (st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser)
2213 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2215 codec = st->codec->codec ? st->codec->codec
2216 : avcodec_find_decoder(st->codec->codec_id);
2218 /* Force thread count to 1 since the H.264 decoder will not extract
2219 * SPS and PPS to extradata during multi-threaded decoding. */
2220 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
2222 /* Ensure that subtitle_header is properly set. */
2223 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2224 && codec && !st->codec->codec)
2225 avcodec_open2(st->codec, codec,
2226 options ? &options[i] : &thread_opt);
2228 // Try to just open decoders, in case this is enough to get parameters.
2229 if (!has_codec_parameters(st)) {
2230 if (codec && !st->codec->codec)
2231 avcodec_open2(st->codec, codec,
2232 options ? &options[i] : &thread_opt);
2235 av_dict_free(&thread_opt);
2238 for (i = 0; i < ic->nb_streams; i++) {
2239 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
2240 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
2246 if (ff_check_interrupt(&ic->interrupt_callback)) {
2248 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2252 /* check if one codec still needs to be handled */
2253 for (i = 0; i < ic->nb_streams; i++) {
2254 int fps_analyze_framecount = 20;
2256 st = ic->streams[i];
2257 if (!has_codec_parameters(st))
2259 /* If the timebase is coarse (like the usual millisecond precision
2260 * of mkv), we need to analyze more frames to reliably arrive at
2261 * the correct fps. */
2262 if (av_q2d(st->time_base) > 0.0005)
2263 fps_analyze_framecount *= 2;
2264 if (ic->fps_probe_size >= 0)
2265 fps_analyze_framecount = ic->fps_probe_size;
2266 /* variable fps and no guess at the real fps */
2267 if (tb_unreliable(st->codec) && !st->avg_frame_rate.num &&
2268 st->codec_info_nb_frames < fps_analyze_framecount &&
2269 st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2271 if (st->parser && st->parser->parser->split &&
2272 !st->codec->extradata)
2274 if (st->first_dts == AV_NOPTS_VALUE &&
2275 (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2276 st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2279 if (i == ic->nb_streams) {
2280 /* NOTE: If the format has no header, then we need to read some
2281 * packets to get most of the streams, so we cannot stop here. */
2282 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2283 /* If we found the info for all the codecs, we can stop. */
2285 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2289 /* We did not get all the codec info, but we read too much data. */
2290 if (read_size >= ic->probesize) {
2292 av_log(ic, AV_LOG_DEBUG,
2293 "Probe buffer size limit %d reached\n", ic->probesize);
2297 /* NOTE: A new stream can be added there if no header in file
2298 * (AVFMTCTX_NOHEADER). */
2299 ret = read_frame_internal(ic, &pkt1);
2300 if (ret == AVERROR(EAGAIN))
2305 AVPacket empty_pkt = { 0 };
2307 av_init_packet(&empty_pkt);
2309 /* We could not have all the codec parameters before EOF. */
2311 for (i = 0; i < ic->nb_streams; i++) {
2312 st = ic->streams[i];
2314 /* flush the decoders */
2315 if (st->info->found_decoder == 1) {
2317 err = try_decode_frame(st, &empty_pkt,
2318 (options && i < orig_nb_streams)
2319 ? &options[i] : NULL);
2320 } while (err > 0 && !has_codec_parameters(st));
2324 av_log(ic, AV_LOG_WARNING,
2325 "decoding for stream %d failed\n", st->index);
2326 } else if (!has_codec_parameters(st)) {
2328 avcodec_string(buf, sizeof(buf), st->codec, 0);
2329 av_log(ic, AV_LOG_WARNING,
2330 "Could not find codec parameters (%s)\n", buf);
2338 if (ic->flags & AVFMT_FLAG_NOBUFFER) {
2341 pkt = add_to_pktbuf(&ic->packet_buffer, &pkt1,
2342 &ic->packet_buffer_end);
2343 if ((ret = av_dup_packet(pkt)) < 0)
2344 goto find_stream_info_err;
2347 read_size += pkt->size;
2349 st = ic->streams[pkt->stream_index];
2350 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
2351 /* check for non-increasing dts */
2352 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
2353 st->info->fps_last_dts >= pkt->dts) {
2354 av_log(ic, AV_LOG_WARNING,
2355 "Non-increasing DTS in stream %d: packet %d with DTS "
2356 "%"PRId64", packet %d with DTS %"PRId64"\n",
2357 st->index, st->info->fps_last_dts_idx,
2358 st->info->fps_last_dts, st->codec_info_nb_frames,
2360 st->info->fps_first_dts =
2361 st->info->fps_last_dts = AV_NOPTS_VALUE;
2363 /* Check for a discontinuity in dts. If the difference in dts
2364 * is more than 1000 times the average packet duration in the
2365 * sequence, we treat it as a discontinuity. */
2366 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
2367 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
2368 (pkt->dts - st->info->fps_last_dts) / 1000 >
2369 (st->info->fps_last_dts - st->info->fps_first_dts) /
2370 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
2371 av_log(ic, AV_LOG_WARNING,
2372 "DTS discontinuity in stream %d: packet %d with DTS "
2373 "%"PRId64", packet %d with DTS %"PRId64"\n",
2374 st->index, st->info->fps_last_dts_idx,
2375 st->info->fps_last_dts, st->codec_info_nb_frames,
2377 st->info->fps_first_dts =
2378 st->info->fps_last_dts = AV_NOPTS_VALUE;
2381 /* update stored dts values */
2382 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
2383 st->info->fps_first_dts = pkt->dts;
2384 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
2386 st->info->fps_last_dts = pkt->dts;
2387 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
2389 /* check max_analyze_duration */
2390 if (av_rescale_q(pkt->dts - st->info->fps_first_dts, st->time_base,
2391 AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
2392 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached\n",
2393 ic->max_analyze_duration);
2397 if (st->parser && st->parser->parser->split && !st->codec->extradata) {
2398 int i = st->parser->parser->split(st->codec, pkt->data, pkt->size);
2399 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
2400 st->codec->extradata_size = i;
2401 st->codec->extradata = av_malloc(st->codec->extradata_size +
2402 FF_INPUT_BUFFER_PADDING_SIZE);
2403 if (!st->codec->extradata)
2404 return AVERROR(ENOMEM);
2405 memcpy(st->codec->extradata, pkt->data,
2406 st->codec->extradata_size);
2407 memset(st->codec->extradata + i, 0,
2408 FF_INPUT_BUFFER_PADDING_SIZE);
2412 /* If still no information, we try to open the codec and to
2413 * decompress the frame. We try to avoid that in most cases as
2414 * it takes longer and uses more memory. For MPEG-4, we need to
2415 * decompress for QuickTime.
2417 * If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2418 * least one frame of codec data, this makes sure the codec initializes
2419 * the channel configuration and does not only trust the values from
2421 try_decode_frame(st, pkt,
2422 (options && i < orig_nb_streams) ? &options[i] : NULL);
2424 st->codec_info_nb_frames++;
2428 // close codecs which were opened in try_decode_frame()
2429 for (i = 0; i < ic->nb_streams; i++) {
2430 st = ic->streams[i];
2431 avcodec_close(st->codec);
2433 for (i = 0; i < ic->nb_streams; i++) {
2434 st = ic->streams[i];
2435 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2436 /* estimate average framerate if not set by demuxer */
2437 if (!st->avg_frame_rate.num &&
2438 st->info->fps_last_dts != st->info->fps_first_dts) {
2439 int64_t delta_dts = st->info->fps_last_dts -
2440 st->info->fps_first_dts;
2441 int delta_packets = st->info->fps_last_dts_idx -
2442 st->info->fps_first_dts_idx;
2444 double best_error = 0.01;
2446 if (delta_dts >= INT64_MAX / st->time_base.num ||
2447 delta_packets >= INT64_MAX / st->time_base.den ||
2450 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2451 delta_packets * (int64_t) st->time_base.den,
2452 delta_dts * (int64_t) st->time_base.num, 60000);
2454 /* Round guessed framerate to a "standard" framerate if it's
2455 * within 1% of the original estimate. */
2456 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
2457 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
2458 double error = fabs(av_q2d(st->avg_frame_rate) /
2459 av_q2d(std_fps) - 1);
2461 if (error < best_error) {
2463 best_fps = std_fps.num;
2467 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2468 best_fps, 12 * 1001, INT_MAX);
2470 } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2471 if (!st->codec->bits_per_coded_sample)
2472 st->codec->bits_per_coded_sample =
2473 av_get_bits_per_sample(st->codec->codec_id);
2474 // set stream disposition based on audio service type
2475 switch (st->codec->audio_service_type) {
2476 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2477 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
2479 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2480 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
2482 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2483 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
2485 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2486 st->disposition = AV_DISPOSITION_COMMENT;
2488 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2489 st->disposition = AV_DISPOSITION_KARAOKE;
2495 estimate_timings(ic, old_offset);
2497 compute_chapters_end(ic);
2499 find_stream_info_err:
2500 for (i = 0; i < ic->nb_streams; i++) {
2501 ic->streams[i]->codec->thread_count = 0;
2502 av_freep(&ic->streams[i]->info);
2507 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2511 for (i = 0; i < ic->nb_programs; i++)
2512 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2513 if (ic->programs[i]->stream_index[j] == s)
2514 return ic->programs[i];
2518 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
2519 int wanted_stream_nb, int related_stream,
2520 AVCodec **decoder_ret, int flags)
2522 int i, nb_streams = ic->nb_streams;
2523 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2524 unsigned *program = NULL;
2525 AVCodec *decoder = NULL, *best_decoder = NULL;
2527 if (related_stream >= 0 && wanted_stream_nb < 0) {
2528 AVProgram *p = find_program_from_stream(ic, related_stream);
2530 program = p->stream_index;
2531 nb_streams = p->nb_stream_indexes;
2534 for (i = 0; i < nb_streams; i++) {
2535 int real_stream_index = program ? program[i] : i;
2536 AVStream *st = ic->streams[real_stream_index];
2537 AVCodecContext *avctx = st->codec;
2538 if (avctx->codec_type != type)
2540 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2542 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED |
2543 AV_DISPOSITION_VISUAL_IMPAIRED))
2546 decoder = avcodec_find_decoder(st->codec->codec_id);
2549 ret = AVERROR_DECODER_NOT_FOUND;
2553 if (best_count >= st->codec_info_nb_frames)
2555 best_count = st->codec_info_nb_frames;
2556 ret = real_stream_index;
2557 best_decoder = decoder;
2558 if (program && i == nb_streams - 1 && ret < 0) {
2560 nb_streams = ic->nb_streams;
2561 /* no related stream found, try again with everything */
2566 *decoder_ret = best_decoder;
2570 /*******************************************************/
2572 int av_read_play(AVFormatContext *s)
2574 if (s->iformat->read_play)
2575 return s->iformat->read_play(s);
2577 return avio_pause(s->pb, 0);
2578 return AVERROR(ENOSYS);
2581 int av_read_pause(AVFormatContext *s)
2583 if (s->iformat->read_pause)
2584 return s->iformat->read_pause(s);
2586 return avio_pause(s->pb, 1);
2587 return AVERROR(ENOSYS);
2590 void avformat_free_context(AVFormatContext *s)
2596 if (s->iformat && s->iformat->priv_class && s->priv_data)
2597 av_opt_free(s->priv_data);
2599 for (i = 0; i < s->nb_streams; i++) {
2600 /* free all data in a stream component */
2603 for (j = 0; j < st->nb_side_data; j++)
2604 av_freep(&st->side_data[j].data);
2605 av_freep(&st->side_data);
2606 st->nb_side_data = 0;
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;