2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 #include "libavutil/avassert.h"
28 #include "libavutil/avstring.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/internal.h"
31 #include "libavutil/mathematics.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/parseutils.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/time.h"
36 #include "libavutil/timestamp.h"
38 #include "libavcodec/bytestream.h"
39 #include "libavcodec/internal.h"
40 #include "libavcodec/raw.h"
42 #include "audiointerleave.h"
44 #include "avio_internal.h"
54 #include "libavutil/ffversion.h"
55 const char av_format_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
59 * various utility functions for use within FFmpeg
62 unsigned avformat_version(void)
64 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
65 return LIBAVFORMAT_VERSION_INT;
68 const char *avformat_configuration(void)
70 return FFMPEG_CONFIGURATION;
73 const char *avformat_license(void)
75 #define LICENSE_PREFIX "libavformat license: "
76 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
79 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
81 static int is_relative(int64_t ts) {
82 return ts > (RELATIVE_TS_BASE - (1LL<<48));
86 * Wrap a given time stamp, if there is an indication for an overflow
89 * @param timestamp the time stamp to wrap
90 * @return resulting time stamp
92 static int64_t wrap_timestamp(AVStream *st, int64_t timestamp)
94 if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&
95 st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
96 if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
97 timestamp < st->pts_wrap_reference)
98 return timestamp + (1ULL << st->pts_wrap_bits);
99 else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
100 timestamp >= st->pts_wrap_reference)
101 return timestamp - (1ULL << st->pts_wrap_bits);
106 MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
107 MAKE_ACCESSORS(AVStream, stream, char *, recommended_encoder_configuration)
108 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, video_codec)
109 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, audio_codec)
110 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
111 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, data_codec)
112 MAKE_ACCESSORS(AVFormatContext, format, int, metadata_header_padding)
113 MAKE_ACCESSORS(AVFormatContext, format, void *, opaque)
114 MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb)
116 int64_t av_stream_get_end_pts(const AVStream *st)
121 struct AVCodecParserContext *av_stream_get_parser(const AVStream *st)
126 void av_format_inject_global_side_data(AVFormatContext *s)
129 s->internal->inject_global_side_data = 1;
130 for (i = 0; i < s->nb_streams; i++) {
131 AVStream *st = s->streams[i];
132 st->inject_global_side_data = 1;
136 int ff_copy_whitelists(AVFormatContext *dst, AVFormatContext *src)
138 av_assert0(!dst->codec_whitelist && !dst->format_whitelist);
139 dst-> codec_whitelist = av_strdup(src->codec_whitelist);
140 dst->format_whitelist = av_strdup(src->format_whitelist);
141 if ( (src-> codec_whitelist && !dst-> codec_whitelist)
142 || (src->format_whitelist && !dst->format_whitelist)) {
143 av_log(dst, AV_LOG_ERROR, "Failed to duplicate whitelist\n");
144 return AVERROR(ENOMEM);
149 static const AVCodec *find_decoder(AVFormatContext *s, AVStream *st, enum AVCodecID codec_id)
151 if (st->codec->codec)
152 return st->codec->codec;
154 switch (st->codec->codec_type) {
155 case AVMEDIA_TYPE_VIDEO:
156 if (s->video_codec) return s->video_codec;
158 case AVMEDIA_TYPE_AUDIO:
159 if (s->audio_codec) return s->audio_codec;
161 case AVMEDIA_TYPE_SUBTITLE:
162 if (s->subtitle_codec) return s->subtitle_codec;
166 return avcodec_find_decoder(codec_id);
169 int av_format_get_probe_score(const AVFormatContext *s)
171 return s->probe_score;
174 /* an arbitrarily chosen "sane" max packet size -- 50M */
175 #define SANE_CHUNK_SIZE (50000000)
177 int ffio_limit(AVIOContext *s, int size)
179 if (s->maxsize>= 0) {
180 int64_t remaining= s->maxsize - avio_tell(s);
181 if (remaining < size) {
182 int64_t newsize = avio_size(s);
183 if (!s->maxsize || s->maxsize<newsize)
184 s->maxsize = newsize - !newsize;
185 remaining= s->maxsize - avio_tell(s);
186 remaining= FFMAX(remaining, 0);
189 if (s->maxsize>= 0 && remaining+1 < size) {
190 av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
197 /* Read the data in sane-sized chunks and append to pkt.
198 * Return the number of bytes read or an error. */
199 static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
201 int64_t orig_pos = pkt->pos; // av_grow_packet might reset pos
202 int orig_size = pkt->size;
206 int prev_size = pkt->size;
209 /* When the caller requests a lot of data, limit it to the amount
210 * left in file or SANE_CHUNK_SIZE when it is not known. */
212 if (read_size > SANE_CHUNK_SIZE/10) {
213 read_size = ffio_limit(s, read_size);
214 // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
216 read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
219 ret = av_grow_packet(pkt, read_size);
223 ret = avio_read(s, pkt->data + prev_size, read_size);
224 if (ret != read_size) {
225 av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
232 pkt->flags |= AV_PKT_FLAG_CORRUPT;
237 return pkt->size > orig_size ? pkt->size - orig_size : ret;
240 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
245 pkt->pos = avio_tell(s);
247 return append_packet_chunked(s, pkt, size);
250 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
253 return av_get_packet(s, pkt, size);
254 return append_packet_chunked(s, pkt, size);
257 int av_filename_number_test(const char *filename)
261 (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0);
264 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
267 static const struct {
270 enum AVMediaType type;
272 { "aac", AV_CODEC_ID_AAC, AVMEDIA_TYPE_AUDIO },
273 { "ac3", AV_CODEC_ID_AC3, AVMEDIA_TYPE_AUDIO },
274 { "dts", AV_CODEC_ID_DTS, AVMEDIA_TYPE_AUDIO },
275 { "dvbsub", AV_CODEC_ID_DVB_SUBTITLE,AVMEDIA_TYPE_SUBTITLE },
276 { "eac3", AV_CODEC_ID_EAC3, AVMEDIA_TYPE_AUDIO },
277 { "h264", AV_CODEC_ID_H264, AVMEDIA_TYPE_VIDEO },
278 { "hevc", AV_CODEC_ID_HEVC, AVMEDIA_TYPE_VIDEO },
279 { "loas", AV_CODEC_ID_AAC_LATM, AVMEDIA_TYPE_AUDIO },
280 { "m4v", AV_CODEC_ID_MPEG4, AVMEDIA_TYPE_VIDEO },
281 { "mp3", AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO },
282 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
286 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
288 if (fmt && st->request_probe <= score) {
290 av_log(s, AV_LOG_DEBUG,
291 "Probe with size=%d, packets=%d detected %s with score=%d\n",
292 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets,
294 for (i = 0; fmt_id_type[i].name; i++) {
295 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
296 st->codec->codec_id = fmt_id_type[i].id;
297 st->codec->codec_type = fmt_id_type[i].type;
305 /************************************************************/
306 /* input media file */
308 int av_demuxer_open(AVFormatContext *ic) {
311 if (ic->format_whitelist && av_match_list(ic->iformat->name, ic->format_whitelist, ',') <= 0) {
312 av_log(ic, AV_LOG_ERROR, "Format not on whitelist\n");
313 return AVERROR(EINVAL);
316 if (ic->iformat->read_header) {
317 err = ic->iformat->read_header(ic);
322 if (ic->pb && !ic->internal->data_offset)
323 ic->internal->data_offset = avio_tell(ic->pb);
328 /* Open input file and probe the format if necessary. */
329 static int init_input(AVFormatContext *s, const char *filename,
330 AVDictionary **options)
333 AVProbeData pd = { filename, NULL, 0 };
334 int score = AVPROBE_SCORE_RETRY;
337 s->flags |= AVFMT_FLAG_CUSTOM_IO;
339 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
340 s, 0, s->format_probesize);
341 else if (s->iformat->flags & AVFMT_NOFILE)
342 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
343 "will be ignored with AVFMT_NOFILE format.\n");
347 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
348 (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
351 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ | s->avio_flags,
352 &s->interrupt_callback, options)) < 0)
356 return av_probe_input_buffer2(s->pb, &s->iformat, filename,
357 s, 0, s->format_probesize);
360 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
361 AVPacketList **plast_pktl)
363 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
368 (*plast_pktl)->next = pktl;
370 *packet_buffer = pktl;
372 /* Add the packet in the buffered packet list. */
378 int avformat_queue_attached_pictures(AVFormatContext *s)
381 for (i = 0; i < s->nb_streams; i++)
382 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
383 s->streams[i]->discard < AVDISCARD_ALL) {
384 AVPacket copy = s->streams[i]->attached_pic;
385 if (copy.size <= 0) {
386 av_log(s, AV_LOG_WARNING,
387 "Attached picture on stream %d has invalid size, "
391 copy.buf = av_buffer_ref(copy.buf);
393 return AVERROR(ENOMEM);
395 add_to_pktbuf(&s->internal->raw_packet_buffer, ©,
396 &s->internal->raw_packet_buffer_end);
401 int avformat_open_input(AVFormatContext **ps, const char *filename,
402 AVInputFormat *fmt, AVDictionary **options)
404 AVFormatContext *s = *ps;
406 AVDictionary *tmp = NULL;
407 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
409 if (!s && !(s = avformat_alloc_context()))
410 return AVERROR(ENOMEM);
412 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
413 return AVERROR(EINVAL);
419 av_dict_copy(&tmp, *options, 0);
421 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
424 if ((ret = init_input(s, filename, &tmp)) < 0)
426 s->probe_score = ret;
428 if (s->format_whitelist && av_match_list(s->iformat->name, s->format_whitelist, ',') <= 0) {
429 av_log(s, AV_LOG_ERROR, "Format not on whitelist\n");
430 ret = AVERROR(EINVAL);
434 avio_skip(s->pb, s->skip_initial_bytes);
436 /* Check filename in case an image number is expected. */
437 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
438 if (!av_filename_number_test(filename)) {
439 ret = AVERROR(EINVAL);
444 s->duration = s->start_time = AV_NOPTS_VALUE;
445 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
447 /* Allocate private data. */
448 if (s->iformat->priv_data_size > 0) {
449 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
450 ret = AVERROR(ENOMEM);
453 if (s->iformat->priv_class) {
454 *(const AVClass **) s->priv_data = s->iformat->priv_class;
455 av_opt_set_defaults(s->priv_data);
456 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
461 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
463 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, 0);
465 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
466 if ((ret = s->iformat->read_header(s)) < 0)
469 if (id3v2_extra_meta) {
470 if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
471 !strcmp(s->iformat->name, "tta")) {
472 if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
475 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
477 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
479 if ((ret = avformat_queue_attached_pictures(s)) < 0)
482 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
483 s->internal->data_offset = avio_tell(s->pb);
485 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
488 av_dict_free(options);
495 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
497 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
499 avformat_free_context(s);
504 /*******************************************************/
506 static void force_codec_ids(AVFormatContext *s, AVStream *st)
508 switch (st->codec->codec_type) {
509 case AVMEDIA_TYPE_VIDEO:
510 if (s->video_codec_id)
511 st->codec->codec_id = s->video_codec_id;
513 case AVMEDIA_TYPE_AUDIO:
514 if (s->audio_codec_id)
515 st->codec->codec_id = s->audio_codec_id;
517 case AVMEDIA_TYPE_SUBTITLE:
518 if (s->subtitle_codec_id)
519 st->codec->codec_id = s->subtitle_codec_id;
524 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
526 if (st->request_probe>0) {
527 AVProbeData *pd = &st->probe_data;
529 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
533 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
535 av_log(s, AV_LOG_WARNING,
536 "Failed to reallocate probe buffer for stream %d\n",
541 memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
542 pd->buf_size += pkt->size;
543 memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
546 st->probe_packets = 0;
548 av_log(s, AV_LOG_WARNING,
549 "nothing to probe for stream %d\n", st->index);
553 end= s->internal->raw_packet_buffer_remaining_size <= 0
554 || st->probe_packets<= 0;
556 if (end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
557 int score = set_codec_from_probe_data(s, st, pd);
558 if ( (st->codec->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
562 st->request_probe = -1;
563 if (st->codec->codec_id != AV_CODEC_ID_NONE) {
564 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
566 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
568 force_codec_ids(s, st);
574 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
576 int64_t ref = pkt->dts;
577 int i, pts_wrap_behavior;
578 int64_t pts_wrap_reference;
579 AVProgram *first_program;
581 if (ref == AV_NOPTS_VALUE)
583 if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
585 ref &= (1LL << st->pts_wrap_bits)-1;
587 // reference time stamp should be 60 s before first time stamp
588 pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
589 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
590 pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
591 (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
592 AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
594 first_program = av_find_program_from_stream(s, NULL, stream_index);
596 if (!first_program) {
597 int default_stream_index = av_find_default_stream_index(s);
598 if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
599 for (i = 0; i < s->nb_streams; i++) {
600 if (av_find_program_from_stream(s, NULL, i))
602 s->streams[i]->pts_wrap_reference = pts_wrap_reference;
603 s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
607 st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
608 st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
612 AVProgram *program = first_program;
614 if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
615 pts_wrap_reference = program->pts_wrap_reference;
616 pts_wrap_behavior = program->pts_wrap_behavior;
619 program = av_find_program_from_stream(s, program, stream_index);
622 // update every program with differing pts_wrap_reference
623 program = first_program;
625 if (program->pts_wrap_reference != pts_wrap_reference) {
626 for (i = 0; i<program->nb_stream_indexes; i++) {
627 s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
628 s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
631 program->pts_wrap_reference = pts_wrap_reference;
632 program->pts_wrap_behavior = pts_wrap_behavior;
634 program = av_find_program_from_stream(s, program, stream_index);
640 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
646 AVPacketList *pktl = s->internal->raw_packet_buffer;
650 st = s->streams[pkt->stream_index];
651 if (s->internal->raw_packet_buffer_remaining_size <= 0)
652 if ((err = probe_codec(s, st, NULL)) < 0)
654 if (st->request_probe <= 0) {
655 s->internal->raw_packet_buffer = pktl->next;
656 s->internal->raw_packet_buffer_remaining_size += pkt->size;
665 ret = s->iformat->read_packet(s, pkt);
667 if (!pktl || ret == AVERROR(EAGAIN))
669 for (i = 0; i < s->nb_streams; i++) {
671 if (st->probe_packets)
672 if ((err = probe_codec(s, st, NULL)) < 0)
674 av_assert0(st->request_probe <= 0);
679 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
680 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
681 av_log(s, AV_LOG_WARNING,
682 "Dropped corrupted packet (stream = %d)\n",
688 if (pkt->stream_index >= (unsigned)s->nb_streams) {
689 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
693 st = s->streams[pkt->stream_index];
695 if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
696 // correct first time stamps to negative values
697 if (!is_relative(st->first_dts))
698 st->first_dts = wrap_timestamp(st, st->first_dts);
699 if (!is_relative(st->start_time))
700 st->start_time = wrap_timestamp(st, st->start_time);
701 if (!is_relative(st->cur_dts))
702 st->cur_dts = wrap_timestamp(st, st->cur_dts);
705 pkt->dts = wrap_timestamp(st, pkt->dts);
706 pkt->pts = wrap_timestamp(st, pkt->pts);
708 force_codec_ids(s, st);
710 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
711 if (s->use_wallclock_as_timestamps)
712 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
714 if (!pktl && st->request_probe <= 0)
717 add_to_pktbuf(&s->internal->raw_packet_buffer, pkt,
718 &s->internal->raw_packet_buffer_end);
719 s->internal->raw_packet_buffer_remaining_size -= pkt->size;
721 if ((err = probe_codec(s, st, pkt)) < 0)
727 /**********************************************************/
729 static int determinable_frame_size(AVCodecContext *avctx)
731 if (/*avctx->codec_id == AV_CODEC_ID_AAC ||*/
732 avctx->codec_id == AV_CODEC_ID_MP1 ||
733 avctx->codec_id == AV_CODEC_ID_MP2 ||
734 avctx->codec_id == AV_CODEC_ID_MP3/* ||
735 avctx->codec_id == AV_CODEC_ID_CELT*/)
741 * Return the frame duration in seconds. Return 0 if not available.
743 void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
744 AVCodecParserContext *pc, AVPacket *pkt)
746 AVRational codec_framerate = s->iformat ? st->codec->framerate :
747 av_mul_q(av_inv_q(st->codec->time_base), (AVRational){1, st->codec->ticks_per_frame});
752 switch (st->codec->codec_type) {
753 case AVMEDIA_TYPE_VIDEO:
754 if (st->r_frame_rate.num && !pc && s->iformat) {
755 *pnum = st->r_frame_rate.den;
756 *pden = st->r_frame_rate.num;
757 } else if (st->time_base.num * 1000LL > st->time_base.den) {
758 *pnum = st->time_base.num;
759 *pden = st->time_base.den;
760 } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
761 av_assert0(st->codec->ticks_per_frame);
762 av_reduce(pnum, pden,
764 codec_framerate.num * (int64_t)st->codec->ticks_per_frame,
767 if (pc && pc->repeat_pict) {
768 av_assert0(s->iformat); // this may be wrong for interlaced encoding but its not used for that case
769 av_reduce(pnum, pden,
770 (*pnum) * (1LL + pc->repeat_pict),
774 /* If this codec can be interlaced or progressive then we need
775 * a parser to compute duration of a packet. Thus if we have
776 * no parser in such case leave duration undefined. */
777 if (st->codec->ticks_per_frame > 1 && !pc)
781 case AVMEDIA_TYPE_AUDIO:
782 frame_size = av_get_audio_frame_duration(st->codec, pkt->size);
783 if (frame_size <= 0 || st->codec->sample_rate <= 0)
786 *pden = st->codec->sample_rate;
793 static int is_intra_only(AVCodecContext *enc) {
794 const AVCodecDescriptor *desc;
796 if (enc->codec_type != AVMEDIA_TYPE_VIDEO)
799 desc = av_codec_get_codec_descriptor(enc);
801 desc = avcodec_descriptor_get(enc->codec_id);
802 av_codec_set_codec_descriptor(enc, desc);
805 return !!(desc->props & AV_CODEC_PROP_INTRA_ONLY);
809 static int has_decode_delay_been_guessed(AVStream *st)
811 if (st->codec->codec_id != AV_CODEC_ID_H264) return 1;
812 if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
814 #if CONFIG_H264_DECODER
815 if (st->codec->has_b_frames &&
816 avpriv_h264_has_num_reorder_frames(st->codec) == st->codec->has_b_frames)
819 if (st->codec->has_b_frames<3)
820 return st->nb_decoded_frames >= 7;
821 else if (st->codec->has_b_frames<4)
822 return st->nb_decoded_frames >= 18;
824 return st->nb_decoded_frames >= 20;
827 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
831 if (pktl == s->internal->packet_buffer_end)
832 return s->internal->parse_queue;
836 static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
837 int onein_oneout = st->codec->codec_id != AV_CODEC_ID_H264 &&
838 st->codec->codec_id != AV_CODEC_ID_HEVC;
841 int delay = st->codec->has_b_frames;
844 if (dts == AV_NOPTS_VALUE) {
845 int64_t best_score = INT64_MAX;
846 for (i = 0; i<delay; i++) {
847 if (st->pts_reorder_error_count[i]) {
848 int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
849 if (score < best_score) {
856 for (i = 0; i<delay; i++) {
857 if (pts_buffer[i] != AV_NOPTS_VALUE) {
858 int64_t diff = FFABS(pts_buffer[i] - dts)
859 + (uint64_t)st->pts_reorder_error[i];
860 diff = FFMAX(diff, st->pts_reorder_error[i]);
861 st->pts_reorder_error[i] = diff;
862 st->pts_reorder_error_count[i]++;
863 if (st->pts_reorder_error_count[i] > 250) {
864 st->pts_reorder_error[i] >>= 1;
865 st->pts_reorder_error_count[i] >>= 1;
872 if (dts == AV_NOPTS_VALUE)
878 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
879 int64_t dts, int64_t pts, AVPacket *pkt)
881 AVStream *st = s->streams[stream_index];
882 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
883 int64_t pts_buffer[MAX_REORDER_DELAY+1];
887 if (st->first_dts != AV_NOPTS_VALUE ||
888 dts == AV_NOPTS_VALUE ||
889 st->cur_dts == AV_NOPTS_VALUE ||
893 delay = st->codec->has_b_frames;
894 st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
896 shift = st->first_dts - RELATIVE_TS_BASE;
898 for (i = 0; i<MAX_REORDER_DELAY+1; i++)
899 pts_buffer[i] = AV_NOPTS_VALUE;
901 if (is_relative(pts))
904 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
905 if (pktl->pkt.stream_index != stream_index)
907 if (is_relative(pktl->pkt.pts))
908 pktl->pkt.pts += shift;
910 if (is_relative(pktl->pkt.dts))
911 pktl->pkt.dts += shift;
913 if (st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
914 st->start_time = pktl->pkt.pts;
916 if (pktl->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)) {
917 pts_buffer[0] = pktl->pkt.pts;
918 for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
919 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
921 pktl->pkt.dts = select_from_pts_buffer(st, pts_buffer, pktl->pkt.dts);
925 if (st->start_time == AV_NOPTS_VALUE)
926 st->start_time = pts;
929 static void update_initial_durations(AVFormatContext *s, AVStream *st,
930 int stream_index, int duration)
932 AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
933 int64_t cur_dts = RELATIVE_TS_BASE;
935 if (st->first_dts != AV_NOPTS_VALUE) {
936 if (st->update_initial_durations_done)
938 st->update_initial_durations_done = 1;
939 cur_dts = st->first_dts;
940 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
941 if (pktl->pkt.stream_index == stream_index) {
942 if (pktl->pkt.pts != pktl->pkt.dts ||
943 pktl->pkt.dts != AV_NOPTS_VALUE ||
949 if (pktl && pktl->pkt.dts != st->first_dts) {
950 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %d) in the queue\n",
951 av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
955 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
958 pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
959 st->first_dts = cur_dts;
960 } else if (st->cur_dts != RELATIVE_TS_BASE)
963 for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
964 if (pktl->pkt.stream_index != stream_index)
966 if (pktl->pkt.pts == pktl->pkt.dts &&
967 (pktl->pkt.dts == AV_NOPTS_VALUE || pktl->pkt.dts == st->first_dts) &&
968 !pktl->pkt.duration) {
969 pktl->pkt.dts = cur_dts;
970 if (!st->codec->has_b_frames)
971 pktl->pkt.pts = cur_dts;
972 // if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
973 pktl->pkt.duration = duration;
976 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
979 st->cur_dts = cur_dts;
982 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
983 AVCodecParserContext *pc, AVPacket *pkt,
984 int64_t next_dts, int64_t next_pts)
986 int num, den, presentation_delayed, delay, i;
989 int onein_oneout = st->codec->codec_id != AV_CODEC_ID_H264 &&
990 st->codec->codec_id != AV_CODEC_ID_HEVC;
992 if (s->flags & AVFMT_FLAG_NOFILLIN)
995 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
996 if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
997 if (st->last_dts_for_order_check <= pkt->dts) {
1000 av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
1001 "DTS %"PRIi64" < %"PRIi64" out of order\n",
1003 st->last_dts_for_order_check);
1004 st->dts_misordered++;
1006 if (st->dts_ordered + st->dts_misordered > 250) {
1007 st->dts_ordered >>= 1;
1008 st->dts_misordered >>= 1;
1012 st->last_dts_for_order_check = pkt->dts;
1013 if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
1014 pkt->dts = AV_NOPTS_VALUE;
1017 if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1018 pkt->dts = AV_NOPTS_VALUE;
1020 if (pc && pc->pict_type == AV_PICTURE_TYPE_B
1021 && !st->codec->has_b_frames)
1022 //FIXME Set low_delay = 0 when has_b_frames = 1
1023 st->codec->has_b_frames = 1;
1025 /* do we have a video B-frame ? */
1026 delay = st->codec->has_b_frames;
1027 presentation_delayed = 0;
1029 /* XXX: need has_b_frame, but cannot get it if the codec is
1030 * not initialized */
1032 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1033 presentation_delayed = 1;
1035 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
1036 st->pts_wrap_bits < 63 &&
1037 pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
1038 if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
1039 pkt->dts -= 1LL << st->pts_wrap_bits;
1041 pkt->pts += 1LL << st->pts_wrap_bits;
1044 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1045 * We take the conservative approach and discard both.
1046 * Note: If this is misbehaving for an H.264 file, then possibly
1047 * presentation_delayed is not set correctly. */
1048 if (delay == 1 && pkt->dts == pkt->pts &&
1049 pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
1050 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1051 if ( strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
1052 && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1053 pkt->dts = AV_NOPTS_VALUE;
1056 duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
1057 if (pkt->duration == 0) {
1058 ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
1060 duration = (AVRational) {num, den};
1061 pkt->duration = av_rescale_rnd(1,
1062 num * (int64_t) st->time_base.den,
1063 den * (int64_t) st->time_base.num,
1068 if (pkt->duration != 0 && (s->internal->packet_buffer || s->internal->parse_queue))
1069 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1071 /* Correct timestamps with byte offset if demuxers only have timestamps
1072 * on packet boundaries */
1073 if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
1074 /* this will estimate bitrate based on this frame's duration and size */
1075 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1076 if (pkt->pts != AV_NOPTS_VALUE)
1078 if (pkt->dts != AV_NOPTS_VALUE)
1082 /* This may be redundant, but it should not hurt. */
1083 if (pkt->dts != AV_NOPTS_VALUE &&
1084 pkt->pts != AV_NOPTS_VALUE &&
1085 pkt->pts > pkt->dts)
1086 presentation_delayed = 1;
1088 av_log(NULL, AV_LOG_TRACE,
1089 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%d delay:%d onein_oneout:%d\n",
1090 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
1091 pkt->stream_index, pc, pkt->duration, delay, onein_oneout);
1092 /* Interpolate PTS and DTS if they are not present. We skip H264
1093 * currently because delay and has_b_frames are not reliably set. */
1094 if ((delay == 0 || (delay == 1 && pc)) &&
1096 if (presentation_delayed) {
1097 /* DTS = decompression timestamp */
1098 /* PTS = presentation timestamp */
1099 if (pkt->dts == AV_NOPTS_VALUE)
1100 pkt->dts = st->last_IP_pts;
1101 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1102 if (pkt->dts == AV_NOPTS_VALUE)
1103 pkt->dts = st->cur_dts;
1105 /* This is tricky: the dts must be incremented by the duration
1106 * of the frame we are displaying, i.e. the last I- or P-frame. */
1107 if (st->last_IP_duration == 0)
1108 st->last_IP_duration = pkt->duration;
1109 if (pkt->dts != AV_NOPTS_VALUE)
1110 st->cur_dts = pkt->dts + st->last_IP_duration;
1111 if (pkt->dts != AV_NOPTS_VALUE &&
1112 pkt->pts == AV_NOPTS_VALUE &&
1113 st->last_IP_duration > 0 &&
1114 ((uint64_t)st->cur_dts - (uint64_t)next_dts + 1) <= 2 &&
1115 next_dts != next_pts &&
1116 next_pts != AV_NOPTS_VALUE)
1117 pkt->pts = next_dts;
1119 st->last_IP_duration = pkt->duration;
1120 st->last_IP_pts = pkt->pts;
1121 /* Cannot compute PTS if not present (we can compute it only
1122 * by knowing the future. */
1123 } else if (pkt->pts != AV_NOPTS_VALUE ||
1124 pkt->dts != AV_NOPTS_VALUE ||
1127 /* presentation is not delayed : PTS and DTS are the same */
1128 if (pkt->pts == AV_NOPTS_VALUE)
1129 pkt->pts = pkt->dts;
1130 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1132 if (pkt->pts == AV_NOPTS_VALUE)
1133 pkt->pts = st->cur_dts;
1134 pkt->dts = pkt->pts;
1135 if (pkt->pts != AV_NOPTS_VALUE)
1136 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
1140 if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)) {
1141 st->pts_buffer[0] = pkt->pts;
1142 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
1143 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
1145 pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
1147 // We skipped it above so we try here.
1149 // This should happen on the first packet
1150 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1151 if (pkt->dts > st->cur_dts)
1152 st->cur_dts = pkt->dts;
1154 av_log(NULL, AV_LOG_TRACE, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1155 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
1158 if (is_intra_only(st->codec))
1159 pkt->flags |= AV_PKT_FLAG_KEY;
1161 pkt->convergence_duration = pc->convergence_duration;
1164 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1167 AVPacketList *pktl = *pkt_buf;
1168 *pkt_buf = pktl->next;
1169 av_free_packet(&pktl->pkt);
1172 *pkt_buf_end = NULL;
1176 * Parse a packet, add all split parts to parse_queue.
1178 * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
1180 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1182 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1183 AVStream *st = s->streams[stream_index];
1184 uint8_t *data = pkt ? pkt->data : NULL;
1185 int size = pkt ? pkt->size : 0;
1186 int ret = 0, got_output = 0;
1189 av_init_packet(&flush_pkt);
1192 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1193 // preserve 0-size sync packets
1194 compute_pkt_fields(s, st, st->parser, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1197 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1199 int64_t next_pts = pkt->pts;
1200 int64_t next_dts = pkt->dts;
1202 av_init_packet(&out_pkt);
1203 len = av_parser_parse2(st->parser, st->codec,
1204 &out_pkt.data, &out_pkt.size, data, size,
1205 pkt->pts, pkt->dts, pkt->pos);
1207 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1209 /* increment read pointer */
1213 got_output = !!out_pkt.size;
1218 if (pkt->side_data) {
1219 out_pkt.side_data = pkt->side_data;
1220 out_pkt.side_data_elems = pkt->side_data_elems;
1221 pkt->side_data = NULL;
1222 pkt->side_data_elems = 0;
1225 /* set the duration */
1226 out_pkt.duration = (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->duration : 0;
1227 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1228 if (st->codec->sample_rate > 0) {
1230 av_rescale_q_rnd(st->parser->duration,
1231 (AVRational) { 1, st->codec->sample_rate },
1237 out_pkt.stream_index = st->index;
1238 out_pkt.pts = st->parser->pts;
1239 out_pkt.dts = st->parser->dts;
1240 out_pkt.pos = st->parser->pos;
1242 if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1243 out_pkt.pos = st->parser->frame_offset;
1245 if (st->parser->key_frame == 1 ||
1246 (st->parser->key_frame == -1 &&
1247 st->parser->pict_type == AV_PICTURE_TYPE_I))
1248 out_pkt.flags |= AV_PKT_FLAG_KEY;
1250 if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1251 out_pkt.flags |= AV_PKT_FLAG_KEY;
1253 compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts);
1255 if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
1256 out_pkt.buf = pkt->buf;
1258 #if FF_API_DESTRUCT_PACKET
1259 FF_DISABLE_DEPRECATION_WARNINGS
1260 out_pkt.destruct = pkt->destruct;
1261 pkt->destruct = NULL;
1262 FF_ENABLE_DEPRECATION_WARNINGS
1265 if ((ret = av_dup_packet(&out_pkt)) < 0)
1268 if (!add_to_pktbuf(&s->internal->parse_queue, &out_pkt, &s->internal->parse_queue_end)) {
1269 av_free_packet(&out_pkt);
1270 ret = AVERROR(ENOMEM);
1275 /* end of the stream => close and free the parser */
1276 if (pkt == &flush_pkt) {
1277 av_parser_close(st->parser);
1282 av_free_packet(pkt);
1286 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1287 AVPacketList **pkt_buffer_end,
1291 av_assert0(*pkt_buffer);
1294 *pkt_buffer = pktl->next;
1296 *pkt_buffer_end = NULL;
1301 static int64_t ts_to_samples(AVStream *st, int64_t ts)
1303 return av_rescale(ts, st->time_base.num * st->codec->sample_rate, st->time_base.den);
1306 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1308 int ret = 0, i, got_packet = 0;
1309 AVDictionary *metadata = NULL;
1311 av_init_packet(pkt);
1313 while (!got_packet && !s->internal->parse_queue) {
1317 /* read next packet */
1318 ret = ff_read_packet(s, &cur_pkt);
1320 if (ret == AVERROR(EAGAIN))
1322 /* flush the parsers */
1323 for (i = 0; i < s->nb_streams; i++) {
1325 if (st->parser && st->need_parsing)
1326 parse_packet(s, NULL, st->index);
1328 /* all remaining packets are now in parse_queue =>
1329 * really terminate parsing */
1333 st = s->streams[cur_pkt.stream_index];
1335 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1336 cur_pkt.dts != AV_NOPTS_VALUE &&
1337 cur_pkt.pts < cur_pkt.dts) {
1338 av_log(s, AV_LOG_WARNING,
1339 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1340 cur_pkt.stream_index,
1341 av_ts2str(cur_pkt.pts),
1342 av_ts2str(cur_pkt.dts),
1345 if (s->debug & FF_FDEBUG_TS)
1346 av_log(s, AV_LOG_DEBUG,
1347 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
1348 cur_pkt.stream_index,
1349 av_ts2str(cur_pkt.pts),
1350 av_ts2str(cur_pkt.dts),
1351 cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
1353 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1354 st->parser = av_parser_init(st->codec->codec_id);
1356 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1357 "%s, packets or times may be invalid.\n",
1358 avcodec_get_name(st->codec->codec_id));
1359 /* no parser available: just output the raw packets */
1360 st->need_parsing = AVSTREAM_PARSE_NONE;
1361 } else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1362 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1363 else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1364 st->parser->flags |= PARSER_FLAG_ONCE;
1365 else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1366 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1369 if (!st->need_parsing || !st->parser) {
1370 /* no parsing needed: we just output the packet as is */
1372 compute_pkt_fields(s, st, NULL, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1373 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1374 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1375 ff_reduce_index(s, st->index);
1376 av_add_index_entry(st, pkt->pos, pkt->dts,
1377 0, 0, AVINDEX_KEYFRAME);
1380 } else if (st->discard < AVDISCARD_ALL) {
1381 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1385 av_free_packet(&cur_pkt);
1387 if (pkt->flags & AV_PKT_FLAG_KEY)
1388 st->skip_to_keyframe = 0;
1389 if (st->skip_to_keyframe) {
1390 av_free_packet(&cur_pkt);
1398 if (!got_packet && s->internal->parse_queue)
1399 ret = read_from_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt);
1402 AVStream *st = s->streams[pkt->stream_index];
1403 int discard_padding = 0;
1404 if (st->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
1405 int64_t pts = pkt->pts - (is_relative(pkt->pts) ? RELATIVE_TS_BASE : 0);
1406 int64_t sample = ts_to_samples(st, pts);
1407 int duration = ts_to_samples(st, pkt->duration);
1408 int64_t end_sample = sample + duration;
1409 if (duration > 0 && end_sample >= st->first_discard_sample &&
1410 sample < st->last_discard_sample)
1411 discard_padding = FFMIN(end_sample - st->first_discard_sample, duration);
1413 if (st->skip_samples || discard_padding) {
1414 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1416 AV_WL32(p, st->skip_samples);
1417 AV_WL32(p + 4, discard_padding);
1418 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d / discard %d\n", st->skip_samples, discard_padding);
1420 st->skip_samples = 0;
1423 if (st->inject_global_side_data) {
1424 for (i = 0; i < st->nb_side_data; i++) {
1425 AVPacketSideData *src_sd = &st->side_data[i];
1428 if (av_packet_get_side_data(pkt, src_sd->type, NULL))
1431 dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
1433 av_log(s, AV_LOG_WARNING, "Could not inject global side data\n");
1437 memcpy(dst_data, src_sd->data, src_sd->size);
1439 st->inject_global_side_data = 0;
1442 if (!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
1443 av_packet_merge_side_data(pkt);
1446 av_opt_get_dict_val(s, "metadata", AV_OPT_SEARCH_CHILDREN, &metadata);
1448 s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
1449 av_dict_copy(&s->metadata, metadata, 0);
1450 av_dict_free(&metadata);
1451 av_opt_set_dict_val(s, "metadata", NULL, AV_OPT_SEARCH_CHILDREN);
1454 if (s->debug & FF_FDEBUG_TS)
1455 av_log(s, AV_LOG_DEBUG,
1456 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1457 "size=%d, duration=%d, flags=%d\n",
1459 av_ts2str(pkt->pts),
1460 av_ts2str(pkt->dts),
1461 pkt->size, pkt->duration, pkt->flags);
1466 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1468 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1474 ret = s->internal->packet_buffer
1475 ? read_from_packet_buffer(&s->internal->packet_buffer,
1476 &s->internal->packet_buffer_end, pkt)
1477 : read_frame_internal(s, pkt);
1484 AVPacketList *pktl = s->internal->packet_buffer;
1487 AVPacket *next_pkt = &pktl->pkt;
1489 if (next_pkt->dts != AV_NOPTS_VALUE) {
1490 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1491 // last dts seen for this stream. if any of packets following
1492 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1493 int64_t last_dts = next_pkt->dts;
1494 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1495 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1496 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0)) {
1497 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) {
1499 next_pkt->pts = pktl->pkt.dts;
1501 if (last_dts != AV_NOPTS_VALUE) {
1502 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1503 last_dts = pktl->pkt.dts;
1508 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1509 // Fixing the last reference frame had none pts issue (For MXF etc).
1510 // We only do this when
1512 // 2. we are not able to resolve a pts value for current packet.
1513 // 3. the packets for this stream at the end of the files had valid dts.
1514 next_pkt->pts = last_dts + next_pkt->duration;
1516 pktl = s->internal->packet_buffer;
1519 /* read packet from packet buffer, if there is data */
1520 st = s->streams[next_pkt->stream_index];
1521 if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
1522 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1523 ret = read_from_packet_buffer(&s->internal->packet_buffer,
1524 &s->internal->packet_buffer_end, pkt);
1529 ret = read_frame_internal(s, pkt);
1531 if (pktl && ret != AVERROR(EAGAIN)) {
1538 if (av_dup_packet(add_to_pktbuf(&s->internal->packet_buffer, pkt,
1539 &s->internal->packet_buffer_end)) < 0)
1540 return AVERROR(ENOMEM);
1545 st = s->streams[pkt->stream_index];
1546 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1547 ff_reduce_index(s, st->index);
1548 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1551 if (is_relative(pkt->dts))
1552 pkt->dts -= RELATIVE_TS_BASE;
1553 if (is_relative(pkt->pts))
1554 pkt->pts -= RELATIVE_TS_BASE;
1559 /* XXX: suppress the packet queue */
1560 static void flush_packet_queue(AVFormatContext *s)
1564 free_packet_buffer(&s->internal->parse_queue, &s->internal->parse_queue_end);
1565 free_packet_buffer(&s->internal->packet_buffer, &s->internal->packet_buffer_end);
1566 free_packet_buffer(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
1568 s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1571 /*******************************************************/
1574 int av_find_default_stream_index(AVFormatContext *s)
1578 int best_stream = 0;
1579 int best_score = -1;
1581 if (s->nb_streams <= 0)
1583 for (i = 0; i < s->nb_streams; i++) {
1586 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1587 !(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
1588 if (!st->codec->width && !st->codec->height && !st->codec_info_nb_frames)
1593 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1594 if (!st->codec->sample_rate && !st->codec_info_nb_frames)
1600 if (st->discard != AVDISCARD_ALL)
1603 if (score > best_score) {
1611 /** Flush the frame reader. */
1612 void ff_read_frame_flush(AVFormatContext *s)
1617 flush_packet_queue(s);
1619 /* Reset read state for each stream. */
1620 for (i = 0; i < s->nb_streams; i++) {
1624 av_parser_close(st->parser);
1627 st->last_IP_pts = AV_NOPTS_VALUE;
1628 st->last_dts_for_order_check = AV_NOPTS_VALUE;
1629 if (st->first_dts == AV_NOPTS_VALUE)
1630 st->cur_dts = RELATIVE_TS_BASE;
1632 /* We set the current DTS to an unspecified origin. */
1633 st->cur_dts = AV_NOPTS_VALUE;
1635 st->probe_packets = MAX_PROBE_PACKETS;
1637 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1638 st->pts_buffer[j] = AV_NOPTS_VALUE;
1640 if (s->internal->inject_global_side_data)
1641 st->inject_global_side_data = 1;
1645 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1649 for (i = 0; i < s->nb_streams; i++) {
1650 AVStream *st = s->streams[i];
1653 av_rescale(timestamp,
1654 st->time_base.den * (int64_t) ref_st->time_base.num,
1655 st->time_base.num * (int64_t) ref_st->time_base.den);
1659 void ff_reduce_index(AVFormatContext *s, int stream_index)
1661 AVStream *st = s->streams[stream_index];
1662 unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1664 if ((unsigned) st->nb_index_entries >= max_entries) {
1666 for (i = 0; 2 * i < st->nb_index_entries; i++)
1667 st->index_entries[i] = st->index_entries[2 * i];
1668 st->nb_index_entries = i;
1672 int ff_add_index_entry(AVIndexEntry **index_entries,
1673 int *nb_index_entries,
1674 unsigned int *index_entries_allocated_size,
1675 int64_t pos, int64_t timestamp,
1676 int size, int distance, int flags)
1678 AVIndexEntry *entries, *ie;
1681 if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1684 if (timestamp == AV_NOPTS_VALUE)
1685 return AVERROR(EINVAL);
1687 if (size < 0 || size > 0x3FFFFFFF)
1688 return AVERROR(EINVAL);
1690 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1691 timestamp -= RELATIVE_TS_BASE;
1693 entries = av_fast_realloc(*index_entries,
1694 index_entries_allocated_size,
1695 (*nb_index_entries + 1) *
1696 sizeof(AVIndexEntry));
1700 *index_entries = entries;
1702 index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
1703 timestamp, AVSEEK_FLAG_ANY);
1706 index = (*nb_index_entries)++;
1707 ie = &entries[index];
1708 av_assert0(index == 0 || ie[-1].timestamp < timestamp);
1710 ie = &entries[index];
1711 if (ie->timestamp != timestamp) {
1712 if (ie->timestamp <= timestamp)
1714 memmove(entries + index + 1, entries + index,
1715 sizeof(AVIndexEntry) * (*nb_index_entries - index));
1716 (*nb_index_entries)++;
1717 } else if (ie->pos == pos && distance < ie->min_distance)
1718 // do not reduce the distance
1719 distance = ie->min_distance;
1723 ie->timestamp = timestamp;
1724 ie->min_distance = distance;
1731 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
1732 int size, int distance, int flags)
1734 timestamp = wrap_timestamp(st, timestamp);
1735 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1736 &st->index_entries_allocated_size, pos,
1737 timestamp, size, distance, flags);
1740 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1741 int64_t wanted_timestamp, int flags)
1749 // Optimize appending index entries at the end.
1750 if (b && entries[b - 1].timestamp < wanted_timestamp)
1755 timestamp = entries[m].timestamp;
1756 if (timestamp >= wanted_timestamp)
1758 if (timestamp <= wanted_timestamp)
1761 m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1763 if (!(flags & AVSEEK_FLAG_ANY))
1764 while (m >= 0 && m < nb_entries &&
1765 !(entries[m].flags & AVINDEX_KEYFRAME))
1766 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1768 if (m == nb_entries)
1773 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
1775 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1776 wanted_timestamp, flags);
1779 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
1780 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1782 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
1783 if (stream_index >= 0)
1784 ts = wrap_timestamp(s->streams[stream_index], ts);
1788 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
1789 int64_t target_ts, int flags)
1791 AVInputFormat *avif = s->iformat;
1792 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1793 int64_t ts_min, ts_max, ts;
1798 if (stream_index < 0)
1801 av_log(s, AV_LOG_TRACE, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1804 ts_min = AV_NOPTS_VALUE;
1805 pos_limit = -1; // GCC falsely says it may be uninitialized.
1807 st = s->streams[stream_index];
1808 if (st->index_entries) {
1811 /* FIXME: Whole function must be checked for non-keyframe entries in
1812 * index case, especially read_timestamp(). */
1813 index = av_index_search_timestamp(st, target_ts,
1814 flags | AVSEEK_FLAG_BACKWARD);
1815 index = FFMAX(index, 0);
1816 e = &st->index_entries[index];
1818 if (e->timestamp <= target_ts || e->pos == e->min_distance) {
1820 ts_min = e->timestamp;
1821 av_log(s, AV_LOG_TRACE, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
1822 pos_min, av_ts2str(ts_min));
1824 av_assert1(index == 0);
1827 index = av_index_search_timestamp(st, target_ts,
1828 flags & ~AVSEEK_FLAG_BACKWARD);
1829 av_assert0(index < st->nb_index_entries);
1831 e = &st->index_entries[index];
1832 av_assert1(e->timestamp >= target_ts);
1834 ts_max = e->timestamp;
1835 pos_limit = pos_max - e->min_distance;
1836 av_log(s, AV_LOG_TRACE, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
1837 " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
1841 pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
1842 ts_min, ts_max, flags, &ts, avif->read_timestamp);
1847 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1850 ff_read_frame_flush(s);
1851 ff_update_cur_dts(s, st, ts);
1856 int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
1857 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1859 int64_t step = 1024;
1860 int64_t limit, ts_max;
1861 int64_t filesize = avio_size(s->pb);
1862 int64_t pos_max = filesize - 1;
1865 pos_max = FFMAX(0, (pos_max) - step);
1866 ts_max = ff_read_timestamp(s, stream_index,
1867 &pos_max, limit, read_timestamp);
1869 } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
1870 if (ts_max == AV_NOPTS_VALUE)
1874 int64_t tmp_pos = pos_max + 1;
1875 int64_t tmp_ts = ff_read_timestamp(s, stream_index,
1876 &tmp_pos, INT64_MAX, read_timestamp);
1877 if (tmp_ts == AV_NOPTS_VALUE)
1879 av_assert0(tmp_pos > pos_max);
1882 if (tmp_pos >= filesize)
1894 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1895 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1896 int64_t ts_min, int64_t ts_max,
1897 int flags, int64_t *ts_ret,
1898 int64_t (*read_timestamp)(struct AVFormatContext *, int,
1899 int64_t *, int64_t))
1906 av_log(s, AV_LOG_TRACE, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1908 if (ts_min == AV_NOPTS_VALUE) {
1909 pos_min = s->internal->data_offset;
1910 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
1911 if (ts_min == AV_NOPTS_VALUE)
1915 if (ts_min >= target_ts) {
1920 if (ts_max == AV_NOPTS_VALUE) {
1921 if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
1923 pos_limit = pos_max;
1926 if (ts_max <= target_ts) {
1931 av_assert0(ts_min < ts_max);
1934 while (pos_min < pos_limit) {
1935 av_log(s, AV_LOG_TRACE,
1936 "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
1937 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
1938 av_assert0(pos_limit <= pos_max);
1940 if (no_change == 0) {
1941 int64_t approximate_keyframe_distance = pos_max - pos_limit;
1942 // interpolate position (better than dichotomy)
1943 pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
1945 pos_min - approximate_keyframe_distance;
1946 } else if (no_change == 1) {
1947 // bisection if interpolation did not change min / max pos last time
1948 pos = (pos_min + pos_limit) >> 1;
1950 /* linear search if bisection failed, can only happen if there
1951 * are very few or no keyframes between min/max */
1956 else if (pos > pos_limit)
1960 // May pass pos_limit instead of -1.
1961 ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
1966 av_log(s, AV_LOG_TRACE, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
1967 " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
1968 pos_min, pos, pos_max,
1969 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
1970 pos_limit, start_pos, no_change);
1971 if (ts == AV_NOPTS_VALUE) {
1972 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1975 if (target_ts <= ts) {
1976 pos_limit = start_pos - 1;
1980 if (target_ts >= ts) {
1986 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1987 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1990 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
1992 ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
1993 av_log(s, AV_LOG_TRACE, "pos=0x%"PRIx64" %s<=%s<=%s\n",
1994 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
2000 static int seek_frame_byte(AVFormatContext *s, int stream_index,
2001 int64_t pos, int flags)
2003 int64_t pos_min, pos_max;
2005 pos_min = s->internal->data_offset;
2006 pos_max = avio_size(s->pb) - 1;
2010 else if (pos > pos_max)
2013 avio_seek(s->pb, pos, SEEK_SET);
2015 s->io_repositioned = 1;
2020 static int seek_frame_generic(AVFormatContext *s, int stream_index,
2021 int64_t timestamp, int flags)
2028 st = s->streams[stream_index];
2030 index = av_index_search_timestamp(st, timestamp, flags);
2032 if (index < 0 && st->nb_index_entries &&
2033 timestamp < st->index_entries[0].timestamp)
2036 if (index < 0 || index == st->nb_index_entries - 1) {
2040 if (st->nb_index_entries) {
2041 av_assert0(st->index_entries);
2042 ie = &st->index_entries[st->nb_index_entries - 1];
2043 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2045 ff_update_cur_dts(s, st, ie->timestamp);
2047 if ((ret = avio_seek(s->pb, s->internal->data_offset, SEEK_SET)) < 0)
2053 read_status = av_read_frame(s, &pkt);
2054 } while (read_status == AVERROR(EAGAIN));
2055 if (read_status < 0)
2057 av_free_packet(&pkt);
2058 if (stream_index == pkt.stream_index && pkt.dts > timestamp) {
2059 if (pkt.flags & AV_PKT_FLAG_KEY)
2061 if (nonkey++ > 1000 && st->codec->codec_id != AV_CODEC_ID_CDGRAPHICS) {
2062 av_log(s, AV_LOG_ERROR,"seek_frame_generic failed as this stream seems to contain no keyframes after the target timestamp, %d non keyframes found\n", nonkey);
2067 index = av_index_search_timestamp(st, timestamp, flags);
2072 ff_read_frame_flush(s);
2073 if (s->iformat->read_seek)
2074 if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2076 ie = &st->index_entries[index];
2077 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2079 ff_update_cur_dts(s, st, ie->timestamp);
2084 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2085 int64_t timestamp, int flags)
2090 if (flags & AVSEEK_FLAG_BYTE) {
2091 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2093 ff_read_frame_flush(s);
2094 return seek_frame_byte(s, stream_index, timestamp, flags);
2097 if (stream_index < 0) {
2098 stream_index = av_find_default_stream_index(s);
2099 if (stream_index < 0)
2102 st = s->streams[stream_index];
2103 /* timestamp for default must be expressed in AV_TIME_BASE units */
2104 timestamp = av_rescale(timestamp, st->time_base.den,
2105 AV_TIME_BASE * (int64_t) st->time_base.num);
2108 /* first, we try the format specific seek */
2109 if (s->iformat->read_seek) {
2110 ff_read_frame_flush(s);
2111 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2117 if (s->iformat->read_timestamp &&
2118 !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2119 ff_read_frame_flush(s);
2120 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2121 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2122 ff_read_frame_flush(s);
2123 return seek_frame_generic(s, stream_index, timestamp, flags);
2128 int av_seek_frame(AVFormatContext *s, int stream_index,
2129 int64_t timestamp, int flags)
2133 if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2134 int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2135 if ((flags & AVSEEK_FLAG_BACKWARD))
2139 return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2140 flags & ~AVSEEK_FLAG_BACKWARD);
2143 ret = seek_frame_internal(s, stream_index, timestamp, flags);
2146 ret = avformat_queue_attached_pictures(s);
2151 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
2152 int64_t ts, int64_t max_ts, int flags)
2154 if (min_ts > ts || max_ts < ts)
2156 if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2157 return AVERROR(EINVAL);
2160 flags |= AVSEEK_FLAG_ANY;
2161 flags &= ~AVSEEK_FLAG_BACKWARD;
2163 if (s->iformat->read_seek2) {
2165 ff_read_frame_flush(s);
2167 if (stream_index == -1 && s->nb_streams == 1) {
2168 AVRational time_base = s->streams[0]->time_base;
2169 ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2170 min_ts = av_rescale_rnd(min_ts, time_base.den,
2171 time_base.num * (int64_t)AV_TIME_BASE,
2172 AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
2173 max_ts = av_rescale_rnd(max_ts, time_base.den,
2174 time_base.num * (int64_t)AV_TIME_BASE,
2175 AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
2178 ret = s->iformat->read_seek2(s, stream_index, min_ts,
2182 ret = avformat_queue_attached_pictures(s);
2186 if (s->iformat->read_timestamp) {
2187 // try to seek via read_timestamp()
2190 // Fall back on old API if new is not implemented but old is.
2191 // Note the old API has somewhat different semantics.
2192 if (s->iformat->read_seek || 1) {
2193 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2194 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2195 if (ret<0 && ts != min_ts && max_ts != ts) {
2196 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2198 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2203 // try some generic seek like seek_frame_generic() but with new ts semantics
2204 return -1; //unreachable
2207 int avformat_flush(AVFormatContext *s)
2209 ff_read_frame_flush(s);
2213 /*******************************************************/
2216 * Return TRUE if the stream has accurate duration in any stream.
2218 * @return TRUE if the stream has accurate duration for at least one component.
2220 static int has_duration(AVFormatContext *ic)
2225 for (i = 0; i < ic->nb_streams; i++) {
2226 st = ic->streams[i];
2227 if (st->duration != AV_NOPTS_VALUE)
2230 if (ic->duration != AV_NOPTS_VALUE)
2236 * Estimate the stream timings from the one of each components.
2238 * Also computes the global bitrate if possible.
2240 static void update_stream_timings(AVFormatContext *ic)
2242 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
2243 int64_t duration, duration1, filesize;
2248 start_time = INT64_MAX;
2249 start_time_text = INT64_MAX;
2250 end_time = INT64_MIN;
2251 duration = INT64_MIN;
2252 for (i = 0; i < ic->nb_streams; i++) {
2253 st = ic->streams[i];
2254 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2255 start_time1 = av_rescale_q(st->start_time, st->time_base,
2257 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codec->codec_type == AVMEDIA_TYPE_DATA) {
2258 if (start_time1 < start_time_text)
2259 start_time_text = start_time1;
2261 start_time = FFMIN(start_time, start_time1);
2262 end_time1 = AV_NOPTS_VALUE;
2263 if (st->duration != AV_NOPTS_VALUE) {
2264 end_time1 = start_time1 +
2265 av_rescale_q(st->duration, st->time_base,
2267 end_time = FFMAX(end_time, end_time1);
2269 for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
2270 if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2271 p->start_time = start_time1;
2272 if (p->end_time < end_time1)
2273 p->end_time = end_time1;
2276 if (st->duration != AV_NOPTS_VALUE) {
2277 duration1 = av_rescale_q(st->duration, st->time_base,
2279 duration = FFMAX(duration, duration1);
2282 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2283 start_time = start_time_text;
2284 else if (start_time > start_time_text)
2285 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2287 if (start_time != INT64_MAX) {
2288 ic->start_time = start_time;
2289 if (end_time != INT64_MIN) {
2290 if (ic->nb_programs) {
2291 for (i = 0; i < ic->nb_programs; i++) {
2292 p = ic->programs[i];
2293 if (p->start_time != AV_NOPTS_VALUE && p->end_time > p->start_time)
2294 duration = FFMAX(duration, p->end_time - p->start_time);
2297 duration = FFMAX(duration, end_time - start_time);
2300 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2301 ic->duration = duration;
2303 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
2304 /* compute the bitrate */
2305 double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2306 (double) ic->duration;
2307 if (bitrate >= 0 && bitrate <= INT_MAX)
2308 ic->bit_rate = bitrate;
2312 static void fill_all_stream_timings(AVFormatContext *ic)
2317 update_stream_timings(ic);
2318 for (i = 0; i < ic->nb_streams; i++) {
2319 st = ic->streams[i];
2320 if (st->start_time == AV_NOPTS_VALUE) {
2321 if (ic->start_time != AV_NOPTS_VALUE)
2322 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
2324 if (ic->duration != AV_NOPTS_VALUE)
2325 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
2331 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2333 int64_t filesize, duration;
2334 int i, show_warning = 0;
2337 /* if bit_rate is already set, we believe it */
2338 if (ic->bit_rate <= 0) {
2340 for (i = 0; i < ic->nb_streams; i++) {
2341 st = ic->streams[i];
2342 if (st->codec->bit_rate > 0) {
2343 if (INT_MAX - st->codec->bit_rate < bit_rate) {
2347 bit_rate += st->codec->bit_rate;
2348 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && st->codec_info_nb_frames > 1) {
2349 // If we have a videostream with packets but without a bitrate
2350 // then consider the sum not known
2355 ic->bit_rate = bit_rate;
2358 /* if duration is already set, we believe it */
2359 if (ic->duration == AV_NOPTS_VALUE &&
2360 ic->bit_rate != 0) {
2361 filesize = ic->pb ? avio_size(ic->pb) : 0;
2362 if (filesize > ic->internal->data_offset) {
2363 filesize -= ic->internal->data_offset;
2364 for (i = 0; i < ic->nb_streams; i++) {
2365 st = ic->streams[i];
2366 if ( st->time_base.num <= INT64_MAX / ic->bit_rate
2367 && st->duration == AV_NOPTS_VALUE) {
2368 duration = av_rescale(8 * filesize, st->time_base.den,
2370 (int64_t) st->time_base.num);
2371 st->duration = duration;
2378 av_log(ic, AV_LOG_WARNING,
2379 "Estimating duration from bitrate, this may be inaccurate\n");
2382 #define DURATION_MAX_READ_SIZE 250000LL
2383 #define DURATION_MAX_RETRY 4
2385 /* only usable for MPEG-PS streams */
2386 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2388 AVPacket pkt1, *pkt = &pkt1;
2390 int num, den, read_size, i, ret;
2391 int found_duration = 0;
2393 int64_t filesize, offset, duration;
2396 /* flush packet queue */
2397 flush_packet_queue(ic);
2399 for (i = 0; i < ic->nb_streams; i++) {
2400 st = ic->streams[i];
2401 if (st->start_time == AV_NOPTS_VALUE &&
2402 st->first_dts == AV_NOPTS_VALUE &&
2403 st->codec->codec_type != AVMEDIA_TYPE_UNKNOWN)
2404 av_log(st->codec, AV_LOG_WARNING,
2405 "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2408 av_parser_close(st->parser);
2413 av_opt_set(ic, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN);
2414 /* estimate the end time (duration) */
2415 /* XXX: may need to support wrapping */
2416 filesize = ic->pb ? avio_size(ic->pb) : 0;
2418 is_end = found_duration;
2419 offset = filesize - (DURATION_MAX_READ_SIZE << retry);
2423 avio_seek(ic->pb, offset, SEEK_SET);
2426 if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
2430 ret = ff_read_packet(ic, pkt);
2431 } while (ret == AVERROR(EAGAIN));
2434 read_size += pkt->size;
2435 st = ic->streams[pkt->stream_index];
2436 if (pkt->pts != AV_NOPTS_VALUE &&
2437 (st->start_time != AV_NOPTS_VALUE ||
2438 st->first_dts != AV_NOPTS_VALUE)) {
2439 if (pkt->duration == 0) {
2440 ff_compute_frame_duration(ic, &num, &den, st, st->parser, pkt);
2442 pkt->duration = av_rescale_rnd(1,
2443 num * (int64_t) st->time_base.den,
2444 den * (int64_t) st->time_base.num,
2448 duration = pkt->pts + pkt->duration;
2450 if (st->start_time != AV_NOPTS_VALUE)
2451 duration -= st->start_time;
2453 duration -= st->first_dts;
2455 if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
2456 (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2457 st->duration = duration;
2458 st->info->last_duration = duration;
2461 av_free_packet(pkt);
2464 /* check if all audio/video streams have valid duration */
2467 for (i = 0; i < ic->nb_streams; i++) {
2468 st = ic->streams[i];
2469 switch (st->codec->codec_type) {
2470 case AVMEDIA_TYPE_VIDEO:
2471 case AVMEDIA_TYPE_AUDIO:
2472 if (st->duration == AV_NOPTS_VALUE)
2479 ++retry <= DURATION_MAX_RETRY);
2481 av_opt_set(ic, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN);
2483 /* warn about audio/video streams which duration could not be estimated */
2484 for (i = 0; i < ic->nb_streams; i++) {
2485 st = ic->streams[i];
2486 if (st->duration == AV_NOPTS_VALUE) {
2487 switch (st->codec->codec_type) {
2488 case AVMEDIA_TYPE_VIDEO:
2489 case AVMEDIA_TYPE_AUDIO:
2490 if (st->start_time != AV_NOPTS_VALUE || st->first_dts != AV_NOPTS_VALUE) {
2491 av_log(ic, AV_LOG_DEBUG, "stream %d : no PTS found at end of file, duration not set\n", i);
2493 av_log(ic, AV_LOG_DEBUG, "stream %d : no TS found at start of file, duration not set\n", i);
2497 fill_all_stream_timings(ic);
2499 avio_seek(ic->pb, old_offset, SEEK_SET);
2500 for (i = 0; i < ic->nb_streams; i++) {
2503 st = ic->streams[i];
2504 st->cur_dts = st->first_dts;
2505 st->last_IP_pts = AV_NOPTS_VALUE;
2506 st->last_dts_for_order_check = AV_NOPTS_VALUE;
2507 for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
2508 st->pts_buffer[j] = AV_NOPTS_VALUE;
2512 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2516 /* get the file size, if possible */
2517 if (ic->iformat->flags & AVFMT_NOFILE) {
2520 file_size = avio_size(ic->pb);
2521 file_size = FFMAX(0, file_size);
2524 if ((!strcmp(ic->iformat->name, "mpeg") ||
2525 !strcmp(ic->iformat->name, "mpegts")) &&
2526 file_size && ic->pb->seekable) {
2527 /* get accurate estimate from the PTSes */
2528 estimate_timings_from_pts(ic, old_offset);
2529 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2530 } else if (has_duration(ic)) {
2531 /* at least one component has timings - we use them for all
2533 fill_all_stream_timings(ic);
2534 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2536 /* less precise: use bitrate info */
2537 estimate_timings_from_bit_rate(ic);
2538 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2540 update_stream_timings(ic);
2544 AVStream av_unused *st;
2545 for (i = 0; i < ic->nb_streams; i++) {
2546 st = ic->streams[i];
2547 av_log(ic, AV_LOG_TRACE, "%d: start_time: %0.3f duration: %0.3f\n", i,
2548 (double) st->start_time / AV_TIME_BASE,
2549 (double) st->duration / AV_TIME_BASE);
2551 av_log(ic, AV_LOG_TRACE,
2552 "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2553 (double) ic->start_time / AV_TIME_BASE,
2554 (double) ic->duration / AV_TIME_BASE,
2555 ic->bit_rate / 1000);
2559 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2561 AVCodecContext *avctx = st->codec;
2563 #define FAIL(errmsg) do { \
2565 *errmsg_ptr = errmsg; \
2569 if ( avctx->codec_id == AV_CODEC_ID_NONE
2570 && avctx->codec_type != AVMEDIA_TYPE_DATA)
2571 FAIL("unknown codec");
2572 switch (avctx->codec_type) {
2573 case AVMEDIA_TYPE_AUDIO:
2574 if (!avctx->frame_size && determinable_frame_size(avctx))
2575 FAIL("unspecified frame size");
2576 if (st->info->found_decoder >= 0 &&
2577 avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2578 FAIL("unspecified sample format");
2579 if (!avctx->sample_rate)
2580 FAIL("unspecified sample rate");
2581 if (!avctx->channels)
2582 FAIL("unspecified number of channels");
2583 if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
2584 FAIL("no decodable DTS frames");
2586 case AVMEDIA_TYPE_VIDEO:
2588 FAIL("unspecified size");
2589 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
2590 FAIL("unspecified pixel format");
2591 if (st->codec->codec_id == AV_CODEC_ID_RV30 || st->codec->codec_id == AV_CODEC_ID_RV40)
2592 if (!st->sample_aspect_ratio.num && !st->codec->sample_aspect_ratio.num && !st->codec_info_nb_frames)
2593 FAIL("no frame in rv30/40 and no sar");
2595 case AVMEDIA_TYPE_SUBTITLE:
2596 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
2597 FAIL("unspecified size");
2599 case AVMEDIA_TYPE_DATA:
2600 if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
2606 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2607 static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
2608 AVDictionary **options)
2610 const AVCodec *codec;
2611 int got_picture = 1, ret = 0;
2612 AVFrame *frame = av_frame_alloc();
2613 AVSubtitle subtitle;
2614 AVPacket pkt = *avpkt;
2617 return AVERROR(ENOMEM);
2619 if (!avcodec_is_open(st->codec) &&
2620 st->info->found_decoder <= 0 &&
2621 (st->codec->codec_id != -st->info->found_decoder || !st->codec->codec_id)) {
2622 AVDictionary *thread_opt = NULL;
2624 codec = find_decoder(s, st, st->codec->codec_id);
2627 st->info->found_decoder = -st->codec->codec_id;
2632 /* Force thread count to 1 since the H.264 decoder will not extract
2633 * SPS and PPS to extradata during multi-threaded decoding. */
2634 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2635 if (s->codec_whitelist)
2636 av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
2637 ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
2639 av_dict_free(&thread_opt);
2641 st->info->found_decoder = -st->codec->codec_id;
2644 st->info->found_decoder = 1;
2645 } else if (!st->info->found_decoder)
2646 st->info->found_decoder = 1;
2648 if (st->info->found_decoder < 0) {
2653 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2655 (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
2656 (!st->codec_info_nb_frames &&
2657 st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2659 switch (st->codec->codec_type) {
2660 case AVMEDIA_TYPE_VIDEO:
2661 ret = avcodec_decode_video2(st->codec, frame,
2662 &got_picture, &pkt);
2664 case AVMEDIA_TYPE_AUDIO:
2665 ret = avcodec_decode_audio4(st->codec, frame, &got_picture, &pkt);
2667 case AVMEDIA_TYPE_SUBTITLE:
2668 ret = avcodec_decode_subtitle2(st->codec, &subtitle,
2669 &got_picture, &pkt);
2677 st->nb_decoded_frames++;
2684 if (!pkt.data && !got_picture)
2688 av_frame_free(&frame);
2692 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
2694 while (tags->id != AV_CODEC_ID_NONE) {
2702 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2705 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
2706 if (tag == tags[i].tag)
2708 for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
2709 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2711 return AV_CODEC_ID_NONE;
2714 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
2719 return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
2721 return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
2723 return AV_CODEC_ID_NONE;
2728 if (sflags & (1 << (bps - 1))) {
2731 return AV_CODEC_ID_PCM_S8;
2733 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
2735 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
2737 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
2739 return AV_CODEC_ID_NONE;
2744 return AV_CODEC_ID_PCM_U8;
2746 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
2748 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
2750 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
2752 return AV_CODEC_ID_NONE;
2758 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
2761 if (!av_codec_get_tag2(tags, id, &tag))
2766 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
2770 for (i = 0; tags && tags[i]; i++) {
2771 const AVCodecTag *codec_tags = tags[i];
2772 while (codec_tags->id != AV_CODEC_ID_NONE) {
2773 if (codec_tags->id == id) {
2774 *tag = codec_tags->tag;
2783 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
2786 for (i = 0; tags && tags[i]; i++) {
2787 enum AVCodecID id = ff_codec_get_id(tags[i], tag);
2788 if (id != AV_CODEC_ID_NONE)
2791 return AV_CODEC_ID_NONE;
2794 static void compute_chapters_end(AVFormatContext *s)
2797 int64_t max_time = s->duration +
2798 ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2800 for (i = 0; i < s->nb_chapters; i++)
2801 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2802 AVChapter *ch = s->chapters[i];
2803 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
2807 for (j = 0; j < s->nb_chapters; j++) {
2808 AVChapter *ch1 = s->chapters[j];
2809 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
2811 if (j != i && next_start > ch->start && next_start < end)
2814 ch->end = (end == INT64_MAX) ? ch->start : end;
2818 static int get_std_framerate(int i)
2821 return (i + 1) * 1001;
2825 return ((const int[]) { 40, 48, 50, 60, 80, 120, 240})[i] * 1001 * 12;
2829 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
2832 /* Is the time base unreliable?
2833 * This is a heuristic to balance between quick acceptance of the values in
2834 * the headers vs. some extra checks.
2835 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2836 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2837 * And there are "variable" fps files this needs to detect as well. */
2838 static int tb_unreliable(AVCodecContext *c)
2840 if (c->time_base.den >= 101LL * c->time_base.num ||
2841 c->time_base.den < 5LL * c->time_base.num ||
2842 // c->codec_tag == AV_RL32("DIVX") ||
2843 // c->codec_tag == AV_RL32("XVID") ||
2844 c->codec_tag == AV_RL32("mp4v") ||
2845 c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
2846 c->codec_id == AV_CODEC_ID_GIF ||
2847 c->codec_id == AV_CODEC_ID_HEVC ||
2848 c->codec_id == AV_CODEC_ID_H264)
2853 int ff_alloc_extradata(AVCodecContext *avctx, int size)
2857 if (size < 0 || size >= INT32_MAX - FF_INPUT_BUFFER_PADDING_SIZE) {
2858 avctx->extradata = NULL;
2859 avctx->extradata_size = 0;
2860 return AVERROR(EINVAL);
2862 avctx->extradata = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
2863 if (avctx->extradata) {
2864 memset(avctx->extradata + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2865 avctx->extradata_size = size;
2868 avctx->extradata_size = 0;
2869 ret = AVERROR(ENOMEM);
2874 int ff_get_extradata(AVCodecContext *avctx, AVIOContext *pb, int size)
2876 int ret = ff_alloc_extradata(avctx, size);
2879 ret = avio_read(pb, avctx->extradata, size);
2881 av_freep(&avctx->extradata);
2882 avctx->extradata_size = 0;
2883 av_log(avctx, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
2884 return ret < 0 ? ret : AVERROR_INVALIDDATA;
2890 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
2893 int64_t last = st->info->last_dts;
2895 if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
2896 && ts - (uint64_t)last < INT64_MAX) {
2897 double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
2898 int64_t duration = ts - last;
2900 if (!st->info->duration_error)
2901 st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
2902 if (!st->info->duration_error)
2903 return AVERROR(ENOMEM);
2905 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2906 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
2907 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
2908 if (st->info->duration_error[0][1][i] < 1e10) {
2909 int framerate = get_std_framerate(i);
2910 double sdts = dts*framerate/(1001*12);
2911 for (j= 0; j<2; j++) {
2912 int64_t ticks = llrint(sdts+j*0.5);
2913 double error= sdts - ticks + j*0.5;
2914 st->info->duration_error[j][0][i] += error;
2915 st->info->duration_error[j][1][i] += error*error;
2919 st->info->duration_count++;
2920 st->info->rfps_duration_sum += duration;
2922 if (st->info->duration_count % 10 == 0) {
2923 int n = st->info->duration_count;
2924 for (i = 0; i<MAX_STD_TIMEBASES; i++) {
2925 if (st->info->duration_error[0][1][i] < 1e10) {
2926 double a0 = st->info->duration_error[0][0][i] / n;
2927 double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
2928 double a1 = st->info->duration_error[1][0][i] / n;
2929 double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
2930 if (error0 > 0.04 && error1 > 0.04) {
2931 st->info->duration_error[0][1][i] = 2e10;
2932 st->info->duration_error[1][1][i] = 2e10;
2938 // ignore the first 4 values, they might have some random jitter
2939 if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
2940 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2942 if (ts != AV_NOPTS_VALUE)
2943 st->info->last_dts = ts;
2948 void ff_rfps_calculate(AVFormatContext *ic)
2952 for (i = 0; i < ic->nb_streams; i++) {
2953 AVStream *st = ic->streams[i];
2955 if (st->codec->codec_type != AVMEDIA_TYPE_VIDEO)
2957 // the check for tb_unreliable() is not completely correct, since this is not about handling
2958 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2959 // ipmovie.c produces.
2960 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
2961 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->info->duration_gcd, INT_MAX);
2962 if (st->info->duration_count>1 && !st->r_frame_rate.num
2963 && tb_unreliable(st->codec)) {
2965 double best_error= 0.01;
2966 AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
2968 for (j= 0; j<MAX_STD_TIMEBASES; j++) {
2971 if (st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2973 if (!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
2976 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
2979 for (k= 0; k<2; k++) {
2980 int n = st->info->duration_count;
2981 double a= st->info->duration_error[k][0][j] / n;
2982 double error= st->info->duration_error[k][1][j]/n - a*a;
2984 if (error < best_error && best_error> 0.000000001) {
2986 num = get_std_framerate(j);
2989 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2992 // do not increase frame rate by more than 1 % in order to match a standard rate.
2993 if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
2994 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2996 if ( !st->avg_frame_rate.num
2997 && st->r_frame_rate.num && st->info->rfps_duration_sum
2998 && st->info->codec_info_duration <= 0
2999 && st->info->duration_count > 2
3000 && fabs(1.0 / (av_q2d(st->r_frame_rate) * av_q2d(st->time_base)) - st->info->rfps_duration_sum / (double)st->info->duration_count) <= 1.0
3002 av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
3003 st->avg_frame_rate = st->r_frame_rate;
3006 av_freep(&st->info->duration_error);
3007 st->info->last_dts = AV_NOPTS_VALUE;
3008 st->info->duration_count = 0;
3009 st->info->rfps_duration_sum = 0;
3013 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3015 int i, count, ret = 0, j;
3018 AVPacket pkt1, *pkt;
3019 int64_t old_offset = avio_tell(ic->pb);
3020 // new streams might appear, no options for those
3021 int orig_nb_streams = ic->nb_streams;
3023 int64_t max_analyze_duration = ic->max_analyze_duration2;
3024 int64_t max_stream_analyze_duration;
3025 int64_t probesize = ic->probesize2;
3027 if (!max_analyze_duration)
3028 max_analyze_duration = ic->max_analyze_duration;
3030 probesize = ic->probesize;
3031 flush_codecs = probesize > 0;
3033 av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3035 max_stream_analyze_duration = max_analyze_duration;
3036 if (!max_analyze_duration) {
3037 max_stream_analyze_duration =
3038 max_analyze_duration = 5*AV_TIME_BASE;
3039 if (!strcmp(ic->iformat->name, "flv"))
3040 max_stream_analyze_duration = 30*AV_TIME_BASE;
3044 av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d\n",
3045 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count);
3047 for (i = 0; i < ic->nb_streams; i++) {
3048 const AVCodec *codec;
3049 AVDictionary *thread_opt = NULL;
3050 st = ic->streams[i];
3052 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3053 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3054 /* if (!st->time_base.num)
3056 if (!st->codec->time_base.num)
3057 st->codec->time_base = st->time_base;
3059 // only for the split stuff
3060 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
3061 st->parser = av_parser_init(st->codec->codec_id);
3063 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3064 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3065 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3066 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3068 } else if (st->need_parsing) {
3069 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3070 "%s, packets or times may be invalid.\n",
3071 avcodec_get_name(st->codec->codec_id));
3074 codec = find_decoder(ic, st, st->codec->codec_id);
3076 /* Force thread count to 1 since the H.264 decoder will not extract
3077 * SPS and PPS to extradata during multi-threaded decoding. */
3078 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3080 if (ic->codec_whitelist)
3081 av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3083 /* Ensure that subtitle_header is properly set. */
3084 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
3085 && codec && !st->codec->codec) {
3086 if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
3087 av_log(ic, AV_LOG_WARNING,
3088 "Failed to open codec in av_find_stream_info\n");
3091 // Try to just open decoders, in case this is enough to get parameters.
3092 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3093 if (codec && !st->codec->codec)
3094 if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
3095 av_log(ic, AV_LOG_WARNING,
3096 "Failed to open codec in av_find_stream_info\n");
3099 av_dict_free(&thread_opt);
3102 for (i = 0; i < ic->nb_streams; i++) {
3103 #if FF_API_R_FRAME_RATE
3104 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3106 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3107 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
3113 int analyzed_all_streams;
3114 if (ff_check_interrupt(&ic->interrupt_callback)) {
3116 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3120 /* check if one codec still needs to be handled */
3121 for (i = 0; i < ic->nb_streams; i++) {
3122 int fps_analyze_framecount = 20;
3124 st = ic->streams[i];
3125 if (!has_codec_parameters(st, NULL))
3127 /* If the timebase is coarse (like the usual millisecond precision
3128 * of mkv), we need to analyze more frames to reliably arrive at
3129 * the correct fps. */
3130 if (av_q2d(st->time_base) > 0.0005)
3131 fps_analyze_framecount *= 2;
3132 if (!tb_unreliable(st->codec))
3133 fps_analyze_framecount = 0;
3134 if (ic->fps_probe_size >= 0)
3135 fps_analyze_framecount = ic->fps_probe_size;
3136 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3137 fps_analyze_framecount = 0;
3138 /* variable fps and no guess at the real fps */
3139 if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3140 st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3141 int count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
3142 st->info->codec_info_duration_fields/2 :
3143 st->info->duration_count;
3144 if (count < fps_analyze_framecount)
3147 if (st->parser && st->parser->parser->split &&
3148 !st->codec->extradata)
3150 if (st->first_dts == AV_NOPTS_VALUE &&
3151 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3152 st->codec_info_nb_frames < ic->max_ts_probe &&
3153 (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3154 st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
3157 analyzed_all_streams = 0;
3158 if (i == ic->nb_streams) {
3159 analyzed_all_streams = 1;
3160 /* NOTE: If the format has no header, then we need to read some
3161 * packets to get most of the streams, so we cannot stop here. */
3162 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3163 /* If we found the info for all the codecs, we can stop. */
3165 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3170 /* We did not get all the codec info, but we read too much data. */
3171 if (read_size >= probesize) {
3173 av_log(ic, AV_LOG_DEBUG,
3174 "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3175 for (i = 0; i < ic->nb_streams; i++)
3176 if (!ic->streams[i]->r_frame_rate.num &&
3177 ic->streams[i]->info->duration_count <= 1 &&
3178 ic->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3179 strcmp(ic->iformat->name, "image2"))
3180 av_log(ic, AV_LOG_WARNING,
3181 "Stream #%d: not enough frames to estimate rate; "
3182 "consider increasing probesize\n", i);
3186 /* NOTE: A new stream can be added there if no header in file
3187 * (AVFMTCTX_NOHEADER). */
3188 ret = read_frame_internal(ic, &pkt1);
3189 if (ret == AVERROR(EAGAIN))
3197 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3198 free_packet_buffer(&ic->internal->packet_buffer,
3199 &ic->internal->packet_buffer_end);
3201 pkt = add_to_pktbuf(&ic->internal->packet_buffer, &pkt1,
3202 &ic->internal->packet_buffer_end);
3204 ret = AVERROR(ENOMEM);
3205 goto find_stream_info_err;
3207 if ((ret = av_dup_packet(pkt)) < 0)
3208 goto find_stream_info_err;
3211 st = ic->streams[pkt->stream_index];
3212 if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3213 read_size += pkt->size;
3215 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3216 /* check for non-increasing dts */
3217 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3218 st->info->fps_last_dts >= pkt->dts) {
3219 av_log(ic, AV_LOG_DEBUG,
3220 "Non-increasing DTS in stream %d: packet %d with DTS "
3221 "%"PRId64", packet %d with DTS %"PRId64"\n",
3222 st->index, st->info->fps_last_dts_idx,
3223 st->info->fps_last_dts, st->codec_info_nb_frames,
3225 st->info->fps_first_dts =
3226 st->info->fps_last_dts = AV_NOPTS_VALUE;
3228 /* Check for a discontinuity in dts. If the difference in dts
3229 * is more than 1000 times the average packet duration in the
3230 * sequence, we treat it as a discontinuity. */
3231 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3232 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3233 (pkt->dts - st->info->fps_last_dts) / 1000 >
3234 (st->info->fps_last_dts - st->info->fps_first_dts) /
3235 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3236 av_log(ic, AV_LOG_WARNING,
3237 "DTS discontinuity in stream %d: packet %d with DTS "
3238 "%"PRId64", packet %d with DTS %"PRId64"\n",
3239 st->index, st->info->fps_last_dts_idx,
3240 st->info->fps_last_dts, st->codec_info_nb_frames,
3242 st->info->fps_first_dts =
3243 st->info->fps_last_dts = AV_NOPTS_VALUE;
3246 /* update stored dts values */
3247 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3248 st->info->fps_first_dts = pkt->dts;
3249 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3251 st->info->fps_last_dts = pkt->dts;
3252 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3254 if (st->codec_info_nb_frames>1) {
3257 if (st->time_base.den > 0)
3258 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3259 if (st->avg_frame_rate.num > 0)
3260 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3263 && st->codec_info_nb_frames>30
3264 && st->info->fps_first_dts != AV_NOPTS_VALUE
3265 && st->info->fps_last_dts != AV_NOPTS_VALUE)
3266 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3268 if (t >= (analyzed_all_streams ? max_analyze_duration : max_stream_analyze_duration)) {
3269 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds\n",
3270 max_analyze_duration,
3272 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3273 av_packet_unref(pkt);
3276 if (pkt->duration) {
3277 st->info->codec_info_duration += pkt->duration;
3278 st->info->codec_info_duration_fields += st->parser && st->need_parsing && st->codec->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3281 #if FF_API_R_FRAME_RATE
3282 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3283 ff_rfps_add_frame(ic, st, pkt->dts);
3285 if (st->parser && st->parser->parser->split && !st->codec->extradata) {
3286 int i = st->parser->parser->split(st->codec, pkt->data, pkt->size);
3287 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
3288 if (ff_alloc_extradata(st->codec, i))
3289 return AVERROR(ENOMEM);
3290 memcpy(st->codec->extradata, pkt->data,
3291 st->codec->extradata_size);
3295 /* If still no information, we try to open the codec and to
3296 * decompress the frame. We try to avoid that in most cases as
3297 * it takes longer and uses more memory. For MPEG-4, we need to
3298 * decompress for QuickTime.
3300 * If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3301 * least one frame of codec data, this makes sure the codec initializes
3302 * the channel configuration and does not only trust the values from
3304 try_decode_frame(ic, st, pkt,
3305 (options && i < orig_nb_streams) ? &options[i] : NULL);
3307 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3308 av_packet_unref(pkt);
3310 st->codec_info_nb_frames++;
3315 AVPacket empty_pkt = { 0 };
3317 av_init_packet(&empty_pkt);
3319 for (i = 0; i < ic->nb_streams; i++) {
3321 st = ic->streams[i];
3323 /* flush the decoders */
3324 if (st->info->found_decoder == 1) {
3326 err = try_decode_frame(ic, st, &empty_pkt,
3327 (options && i < orig_nb_streams)
3328 ? &options[i] : NULL);
3329 } while (err > 0 && !has_codec_parameters(st, NULL));
3332 av_log(ic, AV_LOG_INFO,
3333 "decoding for stream %d failed\n", st->index);
3339 // close codecs which were opened in try_decode_frame()
3340 for (i = 0; i < ic->nb_streams; i++) {
3341 st = ic->streams[i];
3342 avcodec_close(st->codec);
3345 ff_rfps_calculate(ic);
3347 for (i = 0; i < ic->nb_streams; i++) {
3348 st = ic->streams[i];
3349 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3350 if (st->codec->codec_id == AV_CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample) {
3351 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
3352 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == st->codec->pix_fmt)
3353 st->codec->codec_tag= tag;
3356 /* estimate average framerate if not set by demuxer */
3357 if (st->info->codec_info_duration_fields &&
3358 !st->avg_frame_rate.num &&
3359 st->info->codec_info_duration) {
3361 double best_error = 0.01;
3363 if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
3364 st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
3365 st->info->codec_info_duration < 0)
3367 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3368 st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
3369 st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
3371 /* Round guessed framerate to a "standard" framerate if it's
3372 * within 1% of the original estimate. */
3373 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
3374 AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
3375 double error = fabs(av_q2d(st->avg_frame_rate) /
3376 av_q2d(std_fps) - 1);
3378 if (error < best_error) {
3380 best_fps = std_fps.num;
3384 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3385 best_fps, 12 * 1001, INT_MAX);
3388 if (!st->r_frame_rate.num) {
3389 if ( st->codec->time_base.den * (int64_t) st->time_base.num
3390 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t) st->time_base.den) {
3391 st->r_frame_rate.num = st->codec->time_base.den;
3392 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
3394 st->r_frame_rate.num = st->time_base.den;
3395 st->r_frame_rate.den = st->time_base.num;
3398 if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
3399 AVRational hw_ratio = { st->codec->height, st->codec->width };
3400 st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
3403 } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
3404 if (!st->codec->bits_per_coded_sample)
3405 st->codec->bits_per_coded_sample =
3406 av_get_bits_per_sample(st->codec->codec_id);
3407 // set stream disposition based on audio service type
3408 switch (st->codec->audio_service_type) {
3409 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
3410 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
3412 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
3413 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
3415 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
3416 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
3418 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
3419 st->disposition = AV_DISPOSITION_COMMENT;
3421 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
3422 st->disposition = AV_DISPOSITION_KARAOKE;
3429 estimate_timings(ic, old_offset);
3431 av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
3433 if (ret >= 0 && ic->nb_streams)
3434 /* We could not have all the codec parameters before EOF. */
3436 for (i = 0; i < ic->nb_streams; i++) {
3438 st = ic->streams[i];
3439 if (!has_codec_parameters(st, &errmsg)) {
3441 avcodec_string(buf, sizeof(buf), st->codec, 0);
3442 av_log(ic, AV_LOG_WARNING,
3443 "Could not find codec parameters for stream %d (%s): %s\n"
3444 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
3451 compute_chapters_end(ic);
3453 find_stream_info_err:
3454 for (i = 0; i < ic->nb_streams; i++) {
3455 st = ic->streams[i];
3456 if (ic->streams[i]->codec->codec_type != AVMEDIA_TYPE_AUDIO)
3457 ic->streams[i]->codec->thread_count = 0;
3459 av_freep(&st->info->duration_error);
3460 av_freep(&ic->streams[i]->info);
3463 av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
3464 avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
3468 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
3472 for (i = 0; i < ic->nb_programs; i++) {
3473 if (ic->programs[i] == last) {
3477 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
3478 if (ic->programs[i]->stream_index[j] == s)
3479 return ic->programs[i];
3485 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
3486 int wanted_stream_nb, int related_stream,
3487 AVCodec **decoder_ret, int flags)
3489 int i, nb_streams = ic->nb_streams;
3490 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe;
3491 unsigned *program = NULL;
3492 const AVCodec *decoder = NULL, *best_decoder = NULL;
3494 if (related_stream >= 0 && wanted_stream_nb < 0) {
3495 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
3497 program = p->stream_index;
3498 nb_streams = p->nb_stream_indexes;
3501 for (i = 0; i < nb_streams; i++) {
3502 int real_stream_index = program ? program[i] : i;
3503 AVStream *st = ic->streams[real_stream_index];
3504 AVCodecContext *avctx = st->codec;
3505 if (avctx->codec_type != type)
3507 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
3509 if (wanted_stream_nb != real_stream_index &&
3510 st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED |
3511 AV_DISPOSITION_VISUAL_IMPAIRED))
3513 if (type == AVMEDIA_TYPE_AUDIO && !avctx->channels)
3516 decoder = find_decoder(ic, st, st->codec->codec_id);
3519 ret = AVERROR_DECODER_NOT_FOUND;
3523 count = st->codec_info_nb_frames;
3524 bitrate = avctx->bit_rate;
3526 bitrate = avctx->rc_max_rate;
3527 multiframe = FFMIN(5, count);
3528 if ((best_multiframe > multiframe) ||
3529 (best_multiframe == multiframe && best_bitrate > bitrate) ||
3530 (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
3533 best_bitrate = bitrate;
3534 best_multiframe = multiframe;
3535 ret = real_stream_index;
3536 best_decoder = decoder;
3537 if (program && i == nb_streams - 1 && ret < 0) {
3539 nb_streams = ic->nb_streams;
3540 /* no related stream found, try again with everything */
3545 *decoder_ret = (AVCodec*)best_decoder;
3549 /*******************************************************/
3551 int av_read_play(AVFormatContext *s)
3553 if (s->iformat->read_play)
3554 return s->iformat->read_play(s);
3556 return avio_pause(s->pb, 0);
3557 return AVERROR(ENOSYS);
3560 int av_read_pause(AVFormatContext *s)
3562 if (s->iformat->read_pause)
3563 return s->iformat->read_pause(s);
3565 return avio_pause(s->pb, 1);
3566 return AVERROR(ENOSYS);
3569 void ff_free_stream(AVFormatContext *s, AVStream *st) {
3571 av_assert0(s->nb_streams>0);
3572 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
3574 for (j = 0; j < st->nb_side_data; j++)
3575 av_freep(&st->side_data[j].data);
3576 av_freep(&st->side_data);
3577 st->nb_side_data = 0;
3580 av_parser_close(st->parser);
3582 if (st->attached_pic.data)
3583 av_free_packet(&st->attached_pic);
3584 av_dict_free(&st->metadata);
3585 av_freep(&st->probe_data.buf);
3586 av_freep(&st->index_entries);
3587 av_freep(&st->codec->extradata);
3588 av_freep(&st->codec->subtitle_header);
3589 av_freep(&st->codec);
3590 av_freep(&st->priv_data);
3592 av_freep(&st->info->duration_error);
3593 av_freep(&st->info);
3594 av_freep(&st->recommended_encoder_configuration);
3595 av_freep(&s->streams[ --s->nb_streams ]);
3598 void avformat_free_context(AVFormatContext *s)
3606 if (s->iformat && s->iformat->priv_class && s->priv_data)
3607 av_opt_free(s->priv_data);
3608 if (s->oformat && s->oformat->priv_class && s->priv_data)
3609 av_opt_free(s->priv_data);
3611 for (i = s->nb_streams - 1; i >= 0; i--) {
3612 ff_free_stream(s, s->streams[i]);
3614 for (i = s->nb_programs - 1; i >= 0; i--) {
3615 av_dict_free(&s->programs[i]->metadata);
3616 av_freep(&s->programs[i]->stream_index);
3617 av_freep(&s->programs[i]);
3619 av_freep(&s->programs);
3620 av_freep(&s->priv_data);
3621 while (s->nb_chapters--) {
3622 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
3623 av_freep(&s->chapters[s->nb_chapters]);
3625 av_freep(&s->chapters);
3626 av_dict_free(&s->metadata);
3627 av_freep(&s->streams);
3628 av_freep(&s->internal);
3629 flush_packet_queue(s);
3633 void avformat_close_input(AVFormatContext **ps)
3644 if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
3645 (s->flags & AVFMT_FLAG_CUSTOM_IO))
3648 flush_packet_queue(s);
3651 if (s->iformat->read_close)
3652 s->iformat->read_close(s);
3654 avformat_free_context(s);
3661 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
3667 if (s->nb_streams >= INT_MAX/sizeof(*streams))
3669 streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
3672 s->streams = streams;
3674 st = av_mallocz(sizeof(AVStream));
3677 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
3681 st->info->last_dts = AV_NOPTS_VALUE;
3683 st->codec = avcodec_alloc_context3(c);
3690 /* no default bitrate if decoding */
3691 st->codec->bit_rate = 0;
3693 /* default pts setting is MPEG-like */
3694 avpriv_set_pts_info(st, 33, 1, 90000);
3697 st->index = s->nb_streams;
3698 st->start_time = AV_NOPTS_VALUE;
3699 st->duration = AV_NOPTS_VALUE;
3700 /* we set the current DTS to 0 so that formats without any timestamps
3701 * but durations get some timestamps, formats with some unknown
3702 * timestamps have their first few packets buffered and the
3703 * timestamps corrected before they are returned to the user */
3704 st->cur_dts = s->iformat ? RELATIVE_TS_BASE : 0;
3705 st->first_dts = AV_NOPTS_VALUE;
3706 st->probe_packets = MAX_PROBE_PACKETS;
3707 st->pts_wrap_reference = AV_NOPTS_VALUE;
3708 st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
3710 st->last_IP_pts = AV_NOPTS_VALUE;
3711 st->last_dts_for_order_check = AV_NOPTS_VALUE;
3712 for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
3713 st->pts_buffer[i] = AV_NOPTS_VALUE;
3715 st->sample_aspect_ratio = (AVRational) { 0, 1 };
3717 #if FF_API_R_FRAME_RATE
3718 st->info->last_dts = AV_NOPTS_VALUE;
3720 st->info->fps_first_dts = AV_NOPTS_VALUE;
3721 st->info->fps_last_dts = AV_NOPTS_VALUE;
3723 st->inject_global_side_data = s->internal->inject_global_side_data;
3725 s->streams[s->nb_streams++] = st;
3729 AVProgram *av_new_program(AVFormatContext *ac, int id)
3731 AVProgram *program = NULL;
3734 av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
3736 for (i = 0; i < ac->nb_programs; i++)
3737 if (ac->programs[i]->id == id)
3738 program = ac->programs[i];
3741 program = av_mallocz(sizeof(AVProgram));
3744 dynarray_add(&ac->programs, &ac->nb_programs, program);
3745 program->discard = AVDISCARD_NONE;
3748 program->pts_wrap_reference = AV_NOPTS_VALUE;
3749 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
3751 program->start_time =
3752 program->end_time = AV_NOPTS_VALUE;
3757 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
3758 int64_t start, int64_t end, const char *title)
3760 AVChapter *chapter = NULL;
3763 if (end != AV_NOPTS_VALUE && start > end) {
3764 av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
3768 for (i = 0; i < s->nb_chapters; i++)
3769 if (s->chapters[i]->id == id)
3770 chapter = s->chapters[i];
3773 chapter = av_mallocz(sizeof(AVChapter));
3776 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
3778 av_dict_set(&chapter->metadata, "title", title, 0);
3780 chapter->time_base = time_base;
3781 chapter->start = start;
3787 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
3790 AVProgram *program = NULL;
3793 if (idx >= ac->nb_streams) {
3794 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3798 for (i = 0; i < ac->nb_programs; i++) {
3799 if (ac->programs[i]->id != progid)
3801 program = ac->programs[i];
3802 for (j = 0; j < program->nb_stream_indexes; j++)
3803 if (program->stream_index[j] == idx)
3806 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
3809 program->stream_index = tmp;
3810 program->stream_index[program->nb_stream_indexes++] = idx;
3815 uint64_t ff_ntp_time(void)
3817 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3820 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
3823 char *q, buf1[20], c;
3824 int nd, len, percentd_found;
3836 while (av_isdigit(*p))
3837 nd = nd * 10 + *p++ - '0';
3839 } while (av_isdigit(c));
3850 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3852 if ((q - buf + len) > buf_size - 1)
3854 memcpy(q, buf1, len);
3862 if ((q - buf) < buf_size - 1)
3866 if (!percentd_found)
3875 void av_url_split(char *proto, int proto_size,
3876 char *authorization, int authorization_size,
3877 char *hostname, int hostname_size,
3878 int *port_ptr, char *path, int path_size, const char *url)
3880 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
3886 if (authorization_size > 0)
3887 authorization[0] = 0;
3888 if (hostname_size > 0)
3893 /* parse protocol */
3894 if ((p = strchr(url, ':'))) {
3895 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3902 /* no protocol means plain filename */
3903 av_strlcpy(path, url, path_size);
3907 /* separate path from hostname */
3908 ls = strchr(p, '/');
3909 ls2 = strchr(p, '?');
3913 ls = FFMIN(ls, ls2);
3915 av_strlcpy(path, ls, path_size);
3917 ls = &p[strlen(p)]; // XXX
3919 /* the rest is hostname, use that to parse auth/port */
3921 /* authorization (user[:pass]@hostname) */
3923 while ((at = strchr(p, '@')) && at < ls) {
3924 av_strlcpy(authorization, at2,
3925 FFMIN(authorization_size, at + 1 - at2));
3926 p = at + 1; /* skip '@' */
3929 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3931 av_strlcpy(hostname, p + 1,
3932 FFMIN(hostname_size, brk - p));
3933 if (brk[1] == ':' && port_ptr)
3934 *port_ptr = atoi(brk + 2);
3935 } else if ((col = strchr(p, ':')) && col < ls) {
3936 av_strlcpy(hostname, p,
3937 FFMIN(col + 1 - p, hostname_size));
3939 *port_ptr = atoi(col + 1);
3941 av_strlcpy(hostname, p,
3942 FFMIN(ls + 1 - p, hostname_size));
3946 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3949 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3952 'C', 'D', 'E', 'F' };
3953 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3956 'c', 'd', 'e', 'f' };
3957 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3959 for (i = 0; i < s; i++) {
3960 buff[i * 2] = hex_table[src[i] >> 4];
3961 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3967 int ff_hex_to_data(uint8_t *data, const char *p)
3974 p += strspn(p, SPACE_CHARS);
3977 c = av_toupper((unsigned char) *p++);
3978 if (c >= '0' && c <= '9')
3980 else if (c >= 'A' && c <= 'F')
3995 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
3996 unsigned int pts_num, unsigned int pts_den)
3999 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
4000 if (new_tb.num != pts_num)
4001 av_log(NULL, AV_LOG_DEBUG,
4002 "st:%d removing common factor %d from timebase\n",
4003 s->index, pts_num / new_tb.num);
4005 av_log(NULL, AV_LOG_WARNING,
4006 "st:%d has too large timebase, reducing\n", s->index);
4008 if (new_tb.num <= 0 || new_tb.den <= 0) {
4009 av_log(NULL, AV_LOG_ERROR,
4010 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4011 new_tb.num, new_tb.den,
4015 s->time_base = new_tb;
4016 av_codec_set_pkt_timebase(s->codec, new_tb);
4017 s->pts_wrap_bits = pts_wrap_bits;
4020 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4023 const char *ptr = str;
4025 /* Parse key=value pairs. */
4028 char *dest = NULL, *dest_end;
4029 int key_len, dest_len = 0;
4031 /* Skip whitespace and potential commas. */
4032 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4039 if (!(ptr = strchr(key, '=')))
4042 key_len = ptr - key;
4044 callback_get_buf(context, key, key_len, &dest, &dest_len);
4045 dest_end = dest + dest_len - 1;
4049 while (*ptr && *ptr != '\"') {
4053 if (dest && dest < dest_end)
4057 if (dest && dest < dest_end)
4065 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
4066 if (dest && dest < dest_end)
4074 int ff_find_stream_index(AVFormatContext *s, int id)
4077 for (i = 0; i < s->nb_streams; i++)
4078 if (s->streams[i]->id == id)
4083 int64_t ff_iso8601_to_unix_time(const char *datestr)
4085 struct tm time1 = { 0 }, time2 = { 0 };
4087 ret1 = av_small_strptime(datestr, "%Y - %m - %d %T", &time1);
4088 ret2 = av_small_strptime(datestr, "%Y - %m - %dT%T", &time2);
4090 return av_timegm(&time2);
4092 return av_timegm(&time1);
4095 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
4099 if (ofmt->query_codec)
4100 return ofmt->query_codec(codec_id, std_compliance);
4101 else if (ofmt->codec_tag)
4102 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4103 else if (codec_id == ofmt->video_codec ||
4104 codec_id == ofmt->audio_codec ||
4105 codec_id == ofmt->subtitle_codec)
4108 return AVERROR_PATCHWELCOME;
4111 int avformat_network_init(void)
4115 ff_network_inited_globally = 1;
4116 if ((ret = ff_network_init()) < 0)
4118 if ((ret = ff_tls_init()) < 0)
4124 int avformat_network_deinit(void)
4133 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4134 uint64_t channel_layout, int32_t sample_rate,
4135 int32_t width, int32_t height)
4141 return AVERROR(EINVAL);
4144 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4146 if (channel_layout) {
4148 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4152 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4154 if (width || height) {
4156 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4158 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4160 return AVERROR(ENOMEM);
4161 bytestream_put_le32(&data, flags);
4163 bytestream_put_le32(&data, channels);
4165 bytestream_put_le64(&data, channel_layout);
4167 bytestream_put_le32(&data, sample_rate);
4168 if (width || height) {
4169 bytestream_put_le32(&data, width);
4170 bytestream_put_le32(&data, height);
4175 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
4177 AVRational undef = {0, 1};
4178 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
4179 AVRational codec_sample_aspect_ratio = stream && stream->codec ? stream->codec->sample_aspect_ratio : undef;
4180 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
4182 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
4183 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
4184 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
4185 stream_sample_aspect_ratio = undef;
4187 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
4188 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
4189 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
4190 frame_sample_aspect_ratio = undef;
4192 if (stream_sample_aspect_ratio.num)
4193 return stream_sample_aspect_ratio;
4195 return frame_sample_aspect_ratio;
4198 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
4200 AVRational fr = st->r_frame_rate;
4201 AVRational codec_fr = st->codec->framerate;
4202 AVRational avg_fr = st->avg_frame_rate;
4204 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
4205 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
4210 if (st->codec->ticks_per_frame > 1) {
4211 if ( codec_fr.num > 0 && codec_fr.den > 0 &&
4212 (fr.num == 0 || av_q2d(codec_fr) < av_q2d(fr)*0.7 && fabs(1.0 - av_q2d(av_div_q(avg_fr, fr))) > 0.1))
4219 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
4222 if (*spec <= '9' && *spec >= '0') /* opt:index */
4223 return strtol(spec, NULL, 0) == st->index;
4224 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
4225 *spec == 't') { /* opt:[vasdt] */
4226 enum AVMediaType type;
4229 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
4230 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
4231 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
4232 case 'd': type = AVMEDIA_TYPE_DATA; break;
4233 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
4234 default: av_assert0(0);
4236 if (type != st->codec->codec_type)
4238 if (*spec++ == ':') { /* possibly followed by :index */
4239 int i, index = strtol(spec, NULL, 0);
4240 for (i = 0; i < s->nb_streams; i++)
4241 if (s->streams[i]->codec->codec_type == type && index-- == 0)
4242 return i == st->index;
4246 } else if (*spec == 'p' && *(spec + 1) == ':') {
4250 prog_id = strtol(spec, &endptr, 0);
4251 for (i = 0; i < s->nb_programs; i++) {
4252 if (s->programs[i]->id != prog_id)
4255 if (*endptr++ == ':') {
4256 int stream_idx = strtol(endptr, NULL, 0);
4257 return stream_idx >= 0 &&
4258 stream_idx < s->programs[i]->nb_stream_indexes &&
4259 st->index == s->programs[i]->stream_index[stream_idx];
4262 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
4263 if (st->index == s->programs[i]->stream_index[j])
4267 } else if (*spec == '#' ||
4268 (*spec == 'i' && *(spec + 1) == ':')) {
4271 spec += 1 + (*spec == 'i');
4272 stream_id = strtol(spec, &endptr, 0);
4274 return stream_id == st->id;
4275 } else if (*spec == 'm' && *(spec + 1) == ':') {
4276 AVDictionaryEntry *tag;
4281 val = strchr(spec, ':');
4283 key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
4285 return AVERROR(ENOMEM);
4287 tag = av_dict_get(st->metadata, key, NULL, 0);
4289 if (!val || !strcmp(tag->value, val + 1))
4298 } else if (*spec == 'u') {
4299 AVCodecContext *avctx = st->codec;
4301 switch (avctx->codec_type) {
4302 case AVMEDIA_TYPE_AUDIO:
4303 val = avctx->sample_rate && avctx->channels;
4304 if (avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
4307 case AVMEDIA_TYPE_VIDEO:
4308 val = avctx->width && avctx->height;
4309 if (avctx->pix_fmt == AV_PIX_FMT_NONE)
4312 case AVMEDIA_TYPE_UNKNOWN:
4319 return avctx->codec_id != AV_CODEC_ID_NONE && val != 0;
4320 } else if (!*spec) /* empty specifier, matches everything */
4323 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
4324 return AVERROR(EINVAL);
4327 int ff_generate_avci_extradata(AVStream *st)
4329 static const uint8_t avci100_1080p_extradata[] = {
4331 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4332 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4333 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4334 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
4335 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
4336 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
4337 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
4338 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
4339 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4341 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4344 static const uint8_t avci100_1080i_extradata[] = {
4346 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4347 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4348 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4349 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
4350 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
4351 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
4352 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
4353 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
4354 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
4355 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
4356 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
4358 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4361 static const uint8_t avci50_1080p_extradata[] = {
4363 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4364 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4365 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4366 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
4367 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
4368 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
4369 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
4370 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
4371 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
4373 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4376 static const uint8_t avci50_1080i_extradata[] = {
4378 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
4379 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4380 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4381 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
4382 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
4383 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
4384 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
4385 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
4386 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
4387 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
4388 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
4390 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4393 static const uint8_t avci100_720p_extradata[] = {
4395 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4396 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
4397 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
4398 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
4399 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
4400 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
4401 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
4402 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
4403 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
4404 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
4406 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
4409 static const uint8_t avci50_720p_extradata[] = {
4411 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
4412 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
4413 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
4414 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
4415 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
4416 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
4417 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
4418 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
4419 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
4421 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
4425 const uint8_t *data = NULL;
4428 if (st->codec->width == 1920) {
4429 if (st->codec->field_order == AV_FIELD_PROGRESSIVE) {
4430 data = avci100_1080p_extradata;
4431 size = sizeof(avci100_1080p_extradata);
4433 data = avci100_1080i_extradata;
4434 size = sizeof(avci100_1080i_extradata);
4436 } else if (st->codec->width == 1440) {
4437 if (st->codec->field_order == AV_FIELD_PROGRESSIVE) {
4438 data = avci50_1080p_extradata;
4439 size = sizeof(avci50_1080p_extradata);
4441 data = avci50_1080i_extradata;
4442 size = sizeof(avci50_1080i_extradata);
4444 } else if (st->codec->width == 1280) {
4445 data = avci100_720p_extradata;
4446 size = sizeof(avci100_720p_extradata);
4447 } else if (st->codec->width == 960) {
4448 data = avci50_720p_extradata;
4449 size = sizeof(avci50_720p_extradata);
4455 av_freep(&st->codec->extradata);
4456 if (ff_alloc_extradata(st->codec, size))
4457 return AVERROR(ENOMEM);
4458 memcpy(st->codec->extradata, data, size);
4463 uint8_t *av_stream_get_side_data(AVStream *st, enum AVPacketSideDataType type,
4468 for (i = 0; i < st->nb_side_data; i++) {
4469 if (st->side_data[i].type == type) {
4471 *size = st->side_data[i].size;
4472 return st->side_data[i].data;
4478 uint8_t *ff_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
4481 AVPacketSideData *sd, *tmp;
4483 uint8_t *data = av_malloc(size);
4488 for (i = 0; i < st->nb_side_data; i++) {
4489 sd = &st->side_data[i];
4491 if (sd->type == type) {
4492 av_freep(&sd->data);
4499 tmp = av_realloc_array(st->side_data, st->nb_side_data + 1, sizeof(*tmp));
4505 st->side_data = tmp;
4508 sd = &st->side_data[st->nb_side_data - 1];