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
25 #include "avio_internal.h"
27 #include "libavcodec/internal.h"
28 #include "libavcodec/raw.h"
29 #include "libavcodec/bytestream.h"
30 #include "libavutil/avassert.h"
31 #include "libavutil/opt.h"
32 #include "libavutil/dict.h"
33 #include "libavutil/pixdesc.h"
36 #include "libavutil/avassert.h"
37 #include "libavutil/avstring.h"
38 #include "libavutil/mathematics.h"
39 #include "libavutil/parseutils.h"
40 #include "libavutil/time.h"
41 #include "libavutil/timestamp.h"
43 #include "audiointerleave.h"
55 * various utility functions for use within FFmpeg
58 unsigned avformat_version(void)
60 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
61 return LIBAVFORMAT_VERSION_INT;
64 const char *avformat_configuration(void)
66 return FFMPEG_CONFIGURATION;
69 const char *avformat_license(void)
71 #define LICENSE_PREFIX "libavformat license: "
72 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
75 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
77 static int is_relative(int64_t ts) {
78 return ts > (RELATIVE_TS_BASE - (1LL<<48));
81 /** head of registered input format linked list */
82 static AVInputFormat *first_iformat = NULL;
83 /** head of registered output format linked list */
84 static AVOutputFormat *first_oformat = NULL;
86 AVInputFormat *av_iformat_next(AVInputFormat *f)
89 else return first_iformat;
92 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
95 else return first_oformat;
98 void av_register_input_format(AVInputFormat *format)
102 while (*p != NULL) p = &(*p)->next;
107 void av_register_output_format(AVOutputFormat *format)
111 while (*p != NULL) p = &(*p)->next;
116 int av_match_ext(const char *filename, const char *extensions)
124 ext = strrchr(filename, '.');
130 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
133 if (!av_strcasecmp(ext1, ext))
143 static int match_format(const char *name, const char *names)
151 namelen = strlen(name);
152 while ((p = strchr(names, ','))) {
153 len = FFMAX(p - names, namelen);
154 if (!av_strncasecmp(name, names, len))
158 return !av_strcasecmp(name, names);
161 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
162 const char *mime_type)
164 AVOutputFormat *fmt = NULL, *fmt_found;
165 int score_max, score;
167 /* specific test for image sequences */
168 #if CONFIG_IMAGE2_MUXER
169 if (!short_name && filename &&
170 av_filename_number_test(filename) &&
171 ff_guess_image2_codec(filename) != AV_CODEC_ID_NONE) {
172 return av_guess_format("image2", NULL, NULL);
175 /* Find the proper file type. */
178 while ((fmt = av_oformat_next(fmt))) {
180 if (fmt->name && short_name && match_format(short_name, fmt->name))
182 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
184 if (filename && fmt->extensions &&
185 av_match_ext(filename, fmt->extensions)) {
188 if (score > score_max) {
196 enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
197 const char *filename, const char *mime_type, enum AVMediaType type){
198 if(type == AVMEDIA_TYPE_VIDEO){
199 enum AVCodecID codec_id= AV_CODEC_ID_NONE;
201 #if CONFIG_IMAGE2_MUXER
202 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
203 codec_id= ff_guess_image2_codec(filename);
206 if(codec_id == AV_CODEC_ID_NONE)
207 codec_id= fmt->video_codec;
209 }else if(type == AVMEDIA_TYPE_AUDIO)
210 return fmt->audio_codec;
211 else if (type == AVMEDIA_TYPE_SUBTITLE)
212 return fmt->subtitle_codec;
214 return AV_CODEC_ID_NONE;
217 AVInputFormat *av_find_input_format(const char *short_name)
219 AVInputFormat *fmt = NULL;
220 while ((fmt = av_iformat_next(fmt))) {
221 if (match_format(short_name, fmt->name))
227 int ffio_limit(AVIOContext *s, int size)
230 int64_t remaining= s->maxsize - avio_tell(s);
231 if(remaining < size){
232 int64_t newsize= avio_size(s);
233 if(!s->maxsize || s->maxsize<newsize)
234 s->maxsize= newsize - !newsize;
235 remaining= s->maxsize - avio_tell(s);
236 remaining= FFMAX(remaining, 0);
239 if(s->maxsize>=0 && remaining+1 < size){
240 av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
247 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
250 int orig_size = size;
251 size= ffio_limit(s, size);
253 ret= av_new_packet(pkt, size);
258 pkt->pos= avio_tell(s);
260 ret= avio_read(s, pkt->data, size);
264 av_shrink_packet(pkt, ret);
265 if (pkt->size < orig_size)
266 pkt->flags |= AV_PKT_FLAG_CORRUPT;
271 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
276 return av_get_packet(s, pkt, size);
277 old_size = pkt->size;
278 ret = av_grow_packet(pkt, size);
281 ret = avio_read(s, pkt->data + old_size, size);
282 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
287 int av_filename_number_test(const char *filename)
290 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
293 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
295 AVProbeData lpd = *pd;
296 AVInputFormat *fmt1 = NULL, *fmt;
297 int score, nodat = 0, score_max=0;
298 const static uint8_t zerobuffer[AVPROBE_PADDING_SIZE];
301 lpd.buf = zerobuffer;
303 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
304 int id3len = ff_id3v2_tag_len(lpd.buf);
305 if (lpd.buf_size > id3len + 16) {
307 lpd.buf_size -= id3len;
313 while ((fmt1 = av_iformat_next(fmt1))) {
314 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
317 if (fmt1->read_probe) {
318 score = fmt1->read_probe(&lpd);
319 if(fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
320 score = FFMAX(score, nodat ? AVPROBE_SCORE_MAX/4-1 : 1);
321 } else if (fmt1->extensions) {
322 if (av_match_ext(lpd.filename, fmt1->extensions)) {
326 if (score > score_max) {
329 }else if (score == score_max)
332 *score_ret= score_max;
337 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
340 AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
341 if(score_ret > *score_max){
342 *score_max= score_ret;
348 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
350 return av_probe_input_format2(pd, is_opened, &score);
353 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
355 static const struct {
356 const char *name; enum AVCodecID id; enum AVMediaType type;
358 { "aac" , AV_CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
359 { "ac3" , AV_CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
360 { "dts" , AV_CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
361 { "eac3" , AV_CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
362 { "h264" , AV_CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
363 { "loas" , AV_CODEC_ID_AAC_LATM , AVMEDIA_TYPE_AUDIO },
364 { "m4v" , AV_CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
365 { "mp3" , AV_CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
366 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
370 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
372 if (fmt && st->request_probe <= score) {
374 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
375 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
376 for (i = 0; fmt_id_type[i].name; i++) {
377 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
378 st->codec->codec_id = fmt_id_type[i].id;
379 st->codec->codec_type = fmt_id_type[i].type;
387 /************************************************************/
388 /* input media file */
390 int av_demuxer_open(AVFormatContext *ic){
393 if (ic->iformat->read_header) {
394 err = ic->iformat->read_header(ic);
399 if (ic->pb && !ic->data_offset)
400 ic->data_offset = avio_tell(ic->pb);
406 /** size of probe buffer, for guessing file type from file contents */
407 #define PROBE_BUF_MIN 2048
408 #define PROBE_BUF_MAX (1<<20)
410 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
411 const char *filename, void *logctx,
412 unsigned int offset, unsigned int max_probe_size)
414 AVProbeData pd = { filename ? filename : "", NULL, -offset };
415 unsigned char *buf = NULL;
416 int ret = 0, probe_size, buf_offset = 0;
418 if (!max_probe_size) {
419 max_probe_size = PROBE_BUF_MAX;
420 } else if (max_probe_size > PROBE_BUF_MAX) {
421 max_probe_size = PROBE_BUF_MAX;
422 } else if (max_probe_size < PROBE_BUF_MIN) {
423 return AVERROR(EINVAL);
426 if (offset >= max_probe_size) {
427 return AVERROR(EINVAL);
430 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
431 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
432 int score = probe_size < max_probe_size ? AVPROBE_SCORE_RETRY : 0;
435 if (probe_size < offset) {
439 /* read probe data */
440 buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
443 return AVERROR(ENOMEM);
446 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
447 /* fail if error was not end of file, otherwise, lower score */
448 if (ret != AVERROR_EOF) {
453 ret = 0; /* error was end of file, nothing read */
455 pd.buf_size = buf_offset += ret;
456 pd.buf = &buf[offset];
458 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
460 /* guess file format */
461 *fmt = av_probe_input_format2(&pd, 1, &score);
463 if(score <= AVPROBE_SCORE_RETRY){ //this can only be true in the last iteration
464 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
466 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
472 return AVERROR_INVALIDDATA;
475 /* rewind. reuse probe buffer to avoid seeking */
476 ret = ffio_rewind_with_probe_data(pb, &buf, pd.buf_size);
481 /* open input file and probe the format if necessary */
482 static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)
485 AVProbeData pd = {filename, NULL, 0};
486 int score = AVPROBE_SCORE_RETRY;
489 s->flags |= AVFMT_FLAG_CUSTOM_IO;
491 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
492 else if (s->iformat->flags & AVFMT_NOFILE)
493 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
494 "will be ignored with AVFMT_NOFILE format.\n");
498 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
499 (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
502 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ | s->avio_flags,
503 &s->interrupt_callback, options)) < 0)
507 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
510 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
511 AVPacketList **plast_pktl){
512 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
517 (*plast_pktl)->next = pktl;
519 *packet_buffer = pktl;
521 /* add the packet in the buffered packet list */
527 void avformat_queue_attached_pictures(AVFormatContext *s)
530 for (i = 0; i < s->nb_streams; i++)
531 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
532 s->streams[i]->discard < AVDISCARD_ALL) {
533 AVPacket copy = s->streams[i]->attached_pic;
534 copy.destruct = NULL;
535 add_to_pktbuf(&s->raw_packet_buffer, ©, &s->raw_packet_buffer_end);
539 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
541 AVFormatContext *s = *ps;
543 AVDictionary *tmp = NULL;
544 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
546 if (!s && !(s = avformat_alloc_context()))
547 return AVERROR(ENOMEM);
549 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
550 return AVERROR(EINVAL);
556 av_dict_copy(&tmp, *options, 0);
558 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
561 if ((ret = init_input(s, filename, &tmp)) < 0)
563 avio_skip(s->pb, s->skip_initial_bytes);
565 /* check filename in case an image number is expected */
566 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
567 if (!av_filename_number_test(filename)) {
568 ret = AVERROR(EINVAL);
573 s->duration = s->start_time = AV_NOPTS_VALUE;
574 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
576 /* allocate private data */
577 if (s->iformat->priv_data_size > 0) {
578 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
579 ret = AVERROR(ENOMEM);
582 if (s->iformat->priv_class) {
583 *(const AVClass**)s->priv_data = s->iformat->priv_class;
584 av_opt_set_defaults(s->priv_data);
585 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
590 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
592 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
594 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
595 if ((ret = s->iformat->read_header(s)) < 0)
598 if (id3v2_extra_meta) {
599 if (!strcmp(s->iformat->name, "mp3")) {
600 if((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
603 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
605 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
607 avformat_queue_attached_pictures(s);
609 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
610 s->data_offset = avio_tell(s->pb);
612 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
615 av_dict_free(options);
622 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
624 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
626 avformat_free_context(s);
631 /*******************************************************/
633 static void probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
635 if(st->request_probe>0){
636 AVProbeData *pd = &st->probe_data;
638 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
642 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
646 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
647 pd->buf_size += pkt->size;
648 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
651 st->probe_packets = 0;
653 av_log(s, AV_LOG_WARNING, "nothing to probe for stream %d\n",
658 end= s->raw_packet_buffer_remaining_size <= 0
659 || st->probe_packets<=0;
661 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
662 int score= set_codec_from_probe_data(s, st, pd);
663 if( (st->codec->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_RETRY)
667 st->request_probe= -1;
668 if(st->codec->codec_id != AV_CODEC_ID_NONE){
669 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
671 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
677 static void force_codec_ids(AVFormatContext *s, AVStream *st)
679 switch(st->codec->codec_type){
680 case AVMEDIA_TYPE_VIDEO:
681 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
683 case AVMEDIA_TYPE_AUDIO:
684 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
686 case AVMEDIA_TYPE_SUBTITLE:
687 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
692 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
698 AVPacketList *pktl = s->raw_packet_buffer;
702 st = s->streams[pkt->stream_index];
703 if(st->request_probe <= 0){
704 s->raw_packet_buffer = pktl->next;
705 s->raw_packet_buffer_remaining_size += pkt->size;
714 ret= s->iformat->read_packet(s, pkt);
716 if (!pktl || ret == AVERROR(EAGAIN))
718 for (i = 0; i < s->nb_streams; i++) {
720 if (st->probe_packets) {
721 probe_codec(s, st, NULL);
723 av_assert0(st->request_probe <= 0);
728 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
729 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
730 av_log(s, AV_LOG_WARNING,
731 "Dropped corrupted packet (stream = %d)\n",
737 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
738 av_packet_merge_side_data(pkt);
740 if(pkt->stream_index >= (unsigned)s->nb_streams){
741 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
745 st= s->streams[pkt->stream_index];
747 force_codec_ids(s, st);
749 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
750 if (s->use_wallclock_as_timestamps)
751 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
753 if(!pktl && st->request_probe <= 0)
756 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
757 s->raw_packet_buffer_remaining_size -= pkt->size;
759 probe_codec(s, st, pkt);
763 #if FF_API_READ_PACKET
764 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
766 return ff_read_packet(s, pkt);
771 /**********************************************************/
773 static int determinable_frame_size(AVCodecContext *avctx)
775 if (/*avctx->codec_id == AV_CODEC_ID_AAC ||*/
776 avctx->codec_id == AV_CODEC_ID_MP1 ||
777 avctx->codec_id == AV_CODEC_ID_MP2 ||
778 avctx->codec_id == AV_CODEC_ID_MP3/* ||
779 avctx->codec_id == AV_CODEC_ID_CELT*/)
785 * Get the number of samples of an audio frame. Return -1 on error.
787 int ff_get_audio_frame_size(AVCodecContext *enc, int size, int mux)
791 /* give frame_size priority if demuxing */
792 if (!mux && enc->frame_size > 1)
793 return enc->frame_size;
795 if ((frame_size = av_get_audio_frame_duration(enc, size)) > 0)
798 /* fallback to using frame_size if muxing */
799 if (enc->frame_size > 1)
800 return enc->frame_size;
807 * Return the frame duration in seconds. Return 0 if not available.
809 void ff_compute_frame_duration(int *pnum, int *pden, AVStream *st,
810 AVCodecParserContext *pc, AVPacket *pkt)
816 switch(st->codec->codec_type) {
817 case AVMEDIA_TYPE_VIDEO:
818 if (st->r_frame_rate.num && !pc) {
819 *pnum = st->r_frame_rate.den;
820 *pden = st->r_frame_rate.num;
821 } else if(st->time_base.num*1000LL > st->time_base.den) {
822 *pnum = st->time_base.num;
823 *pden = st->time_base.den;
824 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
825 *pnum = st->codec->time_base.num;
826 *pden = st->codec->time_base.den;
827 if (pc && pc->repeat_pict) {
828 if (*pnum > INT_MAX / (1 + pc->repeat_pict))
829 *pden /= 1 + pc->repeat_pict;
831 *pnum *= 1 + pc->repeat_pict;
833 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
834 //Thus if we have no parser in such case leave duration undefined.
835 if(st->codec->ticks_per_frame>1 && !pc){
840 case AVMEDIA_TYPE_AUDIO:
841 frame_size = ff_get_audio_frame_size(st->codec, pkt->size, 0);
842 if (frame_size <= 0 || st->codec->sample_rate <= 0)
845 *pden = st->codec->sample_rate;
852 static int is_intra_only(AVCodecContext *enc){
853 const AVCodecDescriptor *desc;
855 if(enc->codec_type != AVMEDIA_TYPE_VIDEO)
858 desc = av_codec_get_codec_descriptor(enc);
860 desc = avcodec_descriptor_get(enc->codec_id);
861 av_codec_set_codec_descriptor(enc, desc);
864 return !!(desc->props & AV_CODEC_PROP_INTRA_ONLY);
868 static int has_decode_delay_been_guessed(AVStream *st)
870 if(st->codec->codec_id != AV_CODEC_ID_H264) return 1;
871 if(!st->info) // if we have left find_stream_info then nb_decoded_frames wont increase anymore for stream copy
873 #if CONFIG_H264_DECODER
874 if(st->codec->has_b_frames &&
875 avpriv_h264_has_num_reorder_frames(st->codec) == st->codec->has_b_frames)
878 if(st->codec->has_b_frames<3)
879 return st->nb_decoded_frames >= 7;
880 else if(st->codec->has_b_frames<4)
881 return st->nb_decoded_frames >= 18;
883 return st->nb_decoded_frames >= 20;
886 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
890 if (pktl == s->parse_queue_end)
891 return s->packet_buffer;
895 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
896 int64_t dts, int64_t pts)
898 AVStream *st= s->streams[stream_index];
899 AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
900 int64_t pts_buffer[MAX_REORDER_DELAY+1];
904 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE || is_relative(dts))
907 delay = st->codec->has_b_frames;
908 st->first_dts= dts - (st->cur_dts - RELATIVE_TS_BASE);
910 shift = st->first_dts - RELATIVE_TS_BASE;
912 for (i=0; i<MAX_REORDER_DELAY+1; i++)
913 pts_buffer[i] = AV_NOPTS_VALUE;
915 if (is_relative(pts))
918 for(; pktl; pktl= get_next_pkt(s, st, pktl)){
919 if(pktl->pkt.stream_index != stream_index)
921 if(is_relative(pktl->pkt.pts))
922 pktl->pkt.pts += shift;
924 if(is_relative(pktl->pkt.dts))
925 pktl->pkt.dts += shift;
927 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
928 st->start_time= pktl->pkt.pts;
930 if(pktl->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)){
931 pts_buffer[0]= pktl->pkt.pts;
932 for(i=0; i<delay && pts_buffer[i] > pts_buffer[i+1]; i++)
933 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i+1]);
934 if(pktl->pkt.dts == AV_NOPTS_VALUE)
935 pktl->pkt.dts= pts_buffer[0];
938 if (st->start_time == AV_NOPTS_VALUE)
939 st->start_time = pts;
942 static void update_initial_durations(AVFormatContext *s, AVStream *st,
943 int stream_index, int duration)
945 AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
946 int64_t cur_dts= RELATIVE_TS_BASE;
948 if(st->first_dts != AV_NOPTS_VALUE){
949 cur_dts= st->first_dts;
950 for(; pktl; pktl= get_next_pkt(s, st, pktl)){
951 if(pktl->pkt.stream_index == stream_index){
952 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
957 if(pktl && pktl->pkt.dts != st->first_dts) {
958 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s in que\n", av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts));
962 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in ques\n", av_ts2str(st->first_dts));
965 pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
966 st->first_dts = cur_dts;
967 }else if(st->cur_dts != RELATIVE_TS_BASE)
970 for(; pktl; pktl= get_next_pkt(s, st, pktl)){
971 if(pktl->pkt.stream_index != stream_index)
973 if(pktl->pkt.pts == pktl->pkt.dts && (pktl->pkt.dts == AV_NOPTS_VALUE || pktl->pkt.dts == st->first_dts)
974 && !pktl->pkt.duration){
975 pktl->pkt.dts= cur_dts;
976 if(!st->codec->has_b_frames)
977 pktl->pkt.pts= cur_dts;
978 // if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
979 pktl->pkt.duration = duration;
982 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
985 st->cur_dts= cur_dts;
988 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
989 AVCodecParserContext *pc, AVPacket *pkt)
991 int num, den, presentation_delayed, delay, i;
994 if (s->flags & AVFMT_FLAG_NOFILLIN)
997 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
998 pkt->dts= AV_NOPTS_VALUE;
1000 if (st->codec->codec_id != AV_CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
1001 //FIXME Set low_delay = 0 when has_b_frames = 1
1002 st->codec->has_b_frames = 1;
1004 /* do we have a video B-frame ? */
1005 delay= st->codec->has_b_frames;
1006 presentation_delayed = 0;
1008 /* XXX: need has_b_frame, but cannot get it if the codec is
1011 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1012 presentation_delayed = 1;
1014 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && st->pts_wrap_bits<63 && pkt->dts - (1LL<<(st->pts_wrap_bits-1)) > pkt->pts){
1015 if(is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits-1)) > st->cur_dts) {
1016 pkt->dts -= 1LL<<st->pts_wrap_bits;
1018 pkt->pts += 1LL<<st->pts_wrap_bits;
1021 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
1022 // we take the conservative approach and discard both
1023 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
1024 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
1025 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1026 if(strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1027 pkt->dts= AV_NOPTS_VALUE;
1030 if (pkt->duration == 0) {
1031 ff_compute_frame_duration(&num, &den, st, pc, pkt);
1033 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1036 if(pkt->duration != 0 && (s->packet_buffer || s->parse_queue))
1037 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1039 /* correct timestamps with byte offset if demuxers only have timestamps
1040 on packet boundaries */
1041 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1042 /* this will estimate bitrate based on this frame's duration and size */
1043 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1044 if(pkt->pts != AV_NOPTS_VALUE)
1046 if(pkt->dts != AV_NOPTS_VALUE)
1050 if (pc && pc->dts_sync_point >= 0) {
1051 // we have synchronization info from the parser
1052 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1054 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1055 if (pkt->dts != AV_NOPTS_VALUE) {
1056 // got DTS from the stream, update reference timestamp
1057 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1058 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1059 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1060 // compute DTS based on reference timestamp
1061 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1062 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1064 if (pc->dts_sync_point > 0)
1065 st->reference_dts = pkt->dts; // new reference
1069 /* This may be redundant, but it should not hurt. */
1070 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1071 presentation_delayed = 1;
1073 av_dlog(NULL, "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%d\n",
1074 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), pkt->stream_index, pc, pkt->duration);
1075 /* interpolate PTS and DTS if they are not present */
1076 //We skip H264 currently because delay and has_b_frames are not reliably set
1077 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != AV_CODEC_ID_H264){
1078 if (presentation_delayed) {
1079 /* DTS = decompression timestamp */
1080 /* PTS = presentation timestamp */
1081 if (pkt->dts == AV_NOPTS_VALUE)
1082 pkt->dts = st->last_IP_pts;
1083 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1084 if (pkt->dts == AV_NOPTS_VALUE)
1085 pkt->dts = st->cur_dts;
1087 /* this is tricky: the dts must be incremented by the duration
1088 of the frame we are displaying, i.e. the last I- or P-frame */
1089 if (st->last_IP_duration == 0)
1090 st->last_IP_duration = pkt->duration;
1091 if(pkt->dts != AV_NOPTS_VALUE)
1092 st->cur_dts = pkt->dts + st->last_IP_duration;
1093 st->last_IP_duration = pkt->duration;
1094 st->last_IP_pts= pkt->pts;
1095 /* cannot compute PTS if not present (we can compute it only
1096 by knowing the future */
1097 } else if (pkt->pts != AV_NOPTS_VALUE ||
1098 pkt->dts != AV_NOPTS_VALUE ||
1100 int duration = pkt->duration;
1102 if(st->cur_dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && duration){
1103 int64_t old_diff= FFABS(st->cur_dts - duration - pkt->pts);
1104 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1105 if( old_diff < new_diff && old_diff < (duration>>3)
1106 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO
1107 && (!strcmp(s->iformat->name, "mpeg") ||
1108 !strcmp(s->iformat->name, "mpegts"))){
1109 pkt->pts += duration;
1110 av_log(s, AV_LOG_WARNING, "Adjusting PTS forward\n");
1111 // av_log(NULL, AV_LOG_DEBUG, "id:%d old:%"PRId64" new:%"PRId64" dur:%d cur:%s size:%d\n",
1112 // pkt->stream_index, old_diff, new_diff, pkt->duration, av_ts2str(st->cur_dts), pkt->size);
1116 /* presentation is not delayed : PTS and DTS are the same */
1117 if (pkt->pts == AV_NOPTS_VALUE)
1118 pkt->pts = pkt->dts;
1119 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1121 if (pkt->pts == AV_NOPTS_VALUE)
1122 pkt->pts = st->cur_dts;
1123 pkt->dts = pkt->pts;
1124 if (pkt->pts != AV_NOPTS_VALUE)
1125 st->cur_dts = pkt->pts + duration;
1129 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)){
1130 st->pts_buffer[0]= pkt->pts;
1131 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1132 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1133 if(pkt->dts == AV_NOPTS_VALUE)
1134 pkt->dts= st->pts_buffer[0];
1136 if(st->codec->codec_id == AV_CODEC_ID_H264){ // we skipped it above so we try here
1137 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1139 if(pkt->dts > st->cur_dts)
1140 st->cur_dts = pkt->dts;
1142 av_dlog(NULL, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1143 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
1146 if (is_intra_only(st->codec))
1147 pkt->flags |= AV_PKT_FLAG_KEY;
1149 pkt->convergence_duration = pc->convergence_duration;
1152 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1155 AVPacketList *pktl = *pkt_buf;
1156 *pkt_buf = pktl->next;
1157 av_free_packet(&pktl->pkt);
1160 *pkt_buf_end = NULL;
1164 * Parse a packet, add all split parts to parse_queue
1166 * @param pkt packet to parse, NULL when flushing the parser at end of stream
1168 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1170 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1171 AVStream *st = s->streams[stream_index];
1172 uint8_t *data = pkt ? pkt->data : NULL;
1173 int size = pkt ? pkt->size : 0;
1174 int ret = 0, got_output = 0;
1177 av_init_packet(&flush_pkt);
1180 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1181 // preserve 0-size sync packets
1182 compute_pkt_fields(s, st, st->parser, pkt);
1185 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1188 av_init_packet(&out_pkt);
1189 len = av_parser_parse2(st->parser, st->codec,
1190 &out_pkt.data, &out_pkt.size, data, size,
1191 pkt->pts, pkt->dts, pkt->pos);
1193 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1195 /* increment read pointer */
1199 got_output = !!out_pkt.size;
1204 /* set the duration */
1205 out_pkt.duration = 0;
1206 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1207 if (st->codec->sample_rate > 0) {
1208 out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
1209 (AVRational){ 1, st->codec->sample_rate },
1213 } else if (st->codec->time_base.num != 0 &&
1214 st->codec->time_base.den != 0) {
1215 out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
1216 st->codec->time_base,
1221 out_pkt.stream_index = st->index;
1222 out_pkt.pts = st->parser->pts;
1223 out_pkt.dts = st->parser->dts;
1224 out_pkt.pos = st->parser->pos;
1226 if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1227 out_pkt.pos = st->parser->frame_offset;
1229 if (st->parser->key_frame == 1 ||
1230 (st->parser->key_frame == -1 &&
1231 st->parser->pict_type == AV_PICTURE_TYPE_I))
1232 out_pkt.flags |= AV_PKT_FLAG_KEY;
1234 if(st->parser->key_frame == -1 && st->parser->pict_type==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1235 out_pkt.flags |= AV_PKT_FLAG_KEY;
1237 compute_pkt_fields(s, st, st->parser, &out_pkt);
1239 if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
1240 out_pkt.destruct = pkt->destruct;
1241 pkt->destruct = NULL;
1243 if ((ret = av_dup_packet(&out_pkt)) < 0)
1246 if (!add_to_pktbuf(&s->parse_queue, &out_pkt, &s->parse_queue_end)) {
1247 av_free_packet(&out_pkt);
1248 ret = AVERROR(ENOMEM);
1254 /* end of the stream => close and free the parser */
1255 if (pkt == &flush_pkt) {
1256 av_parser_close(st->parser);
1261 av_free_packet(pkt);
1265 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1266 AVPacketList **pkt_buffer_end,
1270 av_assert0(*pkt_buffer);
1273 *pkt_buffer = pktl->next;
1275 *pkt_buffer_end = NULL;
1280 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1282 int ret = 0, i, got_packet = 0;
1284 av_init_packet(pkt);
1286 while (!got_packet && !s->parse_queue) {
1290 /* read next packet */
1291 ret = ff_read_packet(s, &cur_pkt);
1293 if (ret == AVERROR(EAGAIN))
1295 /* flush the parsers */
1296 for(i = 0; i < s->nb_streams; i++) {
1298 if (st->parser && st->need_parsing)
1299 parse_packet(s, NULL, st->index);
1301 /* all remaining packets are now in parse_queue =>
1302 * really terminate parsing */
1306 st = s->streams[cur_pkt.stream_index];
1308 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1309 cur_pkt.dts != AV_NOPTS_VALUE &&
1310 cur_pkt.pts < cur_pkt.dts) {
1311 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1312 cur_pkt.stream_index,
1313 av_ts2str(cur_pkt.pts),
1314 av_ts2str(cur_pkt.dts),
1317 if (s->debug & FF_FDEBUG_TS)
1318 av_log(s, AV_LOG_DEBUG, "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
1319 cur_pkt.stream_index,
1320 av_ts2str(cur_pkt.pts),
1321 av_ts2str(cur_pkt.dts),
1326 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1327 st->parser = av_parser_init(st->codec->codec_id);
1329 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1330 "%s, packets or times may be invalid.\n",
1331 avcodec_get_name(st->codec->codec_id));
1332 /* no parser available: just output the raw packets */
1333 st->need_parsing = AVSTREAM_PARSE_NONE;
1334 } else if(st->need_parsing == AVSTREAM_PARSE_HEADERS) {
1335 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1336 } else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE) {
1337 st->parser->flags |= PARSER_FLAG_ONCE;
1338 } else if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
1339 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1343 if (!st->need_parsing || !st->parser) {
1344 /* no parsing needed: we just output the packet as is */
1346 compute_pkt_fields(s, st, NULL, pkt);
1347 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1348 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1349 ff_reduce_index(s, st->index);
1350 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1353 } else if (st->discard < AVDISCARD_ALL) {
1354 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1358 av_free_packet(&cur_pkt);
1360 if (pkt->flags & AV_PKT_FLAG_KEY)
1361 st->skip_to_keyframe = 0;
1362 if (st->skip_to_keyframe) {
1363 av_free_packet(&cur_pkt);
1368 if (!got_packet && s->parse_queue)
1369 ret = read_from_packet_buffer(&s->parse_queue, &s->parse_queue_end, pkt);
1371 if(s->debug & FF_FDEBUG_TS)
1372 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
1374 av_ts2str(pkt->pts),
1375 av_ts2str(pkt->dts),
1383 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1385 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1391 ret = s->packet_buffer ?
1392 read_from_packet_buffer(&s->packet_buffer, &s->packet_buffer_end, pkt) :
1393 read_frame_internal(s, pkt);
1400 AVPacketList *pktl = s->packet_buffer;
1403 AVPacket *next_pkt = &pktl->pkt;
1405 if (next_pkt->dts != AV_NOPTS_VALUE) {
1406 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1407 // last dts seen for this stream. if any of packets following
1408 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1409 int64_t last_dts = next_pkt->dts;
1410 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1411 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1412 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0)) {
1413 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1414 next_pkt->pts = pktl->pkt.dts;
1416 if (last_dts != AV_NOPTS_VALUE) {
1417 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1418 last_dts = pktl->pkt.dts;
1423 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1424 // Fixing the last reference frame had none pts issue (For MXF etc).
1425 // We only do this when
1427 // 2. we are not able to resolve a pts value for current packet.
1428 // 3. the packets for this stream at the end of the files had valid dts.
1429 next_pkt->pts = last_dts + next_pkt->duration;
1431 pktl = s->packet_buffer;
1434 /* read packet from packet buffer, if there is data */
1435 if (!(next_pkt->pts == AV_NOPTS_VALUE &&
1436 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1437 ret = read_from_packet_buffer(&s->packet_buffer,
1438 &s->packet_buffer_end, pkt);
1443 ret = read_frame_internal(s, pkt);
1445 if (pktl && ret != AVERROR(EAGAIN)) {
1452 if (av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1453 &s->packet_buffer_end)) < 0)
1454 return AVERROR(ENOMEM);
1459 st = s->streams[pkt->stream_index];
1460 if (st->skip_samples) {
1461 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1462 AV_WL32(p, st->skip_samples);
1463 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d\n", st->skip_samples);
1464 st->skip_samples = 0;
1467 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1468 ff_reduce_index(s, st->index);
1469 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1472 if (is_relative(pkt->dts))
1473 pkt->dts -= RELATIVE_TS_BASE;
1474 if (is_relative(pkt->pts))
1475 pkt->pts -= RELATIVE_TS_BASE;
1480 /* XXX: suppress the packet queue */
1481 static void flush_packet_queue(AVFormatContext *s)
1483 free_packet_buffer(&s->parse_queue, &s->parse_queue_end);
1484 free_packet_buffer(&s->packet_buffer, &s->packet_buffer_end);
1485 free_packet_buffer(&s->raw_packet_buffer, &s->raw_packet_buffer_end);
1487 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1490 /*******************************************************/
1493 int av_find_default_stream_index(AVFormatContext *s)
1495 int first_audio_index = -1;
1499 if (s->nb_streams <= 0)
1501 for(i = 0; i < s->nb_streams; i++) {
1503 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1504 !(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
1507 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1508 first_audio_index = i;
1510 return first_audio_index >= 0 ? first_audio_index : 0;
1514 * Flush the frame reader.
1516 void ff_read_frame_flush(AVFormatContext *s)
1521 flush_packet_queue(s);
1523 /* for each stream, reset read state */
1524 for(i = 0; i < s->nb_streams; i++) {
1528 av_parser_close(st->parser);
1531 st->last_IP_pts = AV_NOPTS_VALUE;
1532 if(st->first_dts == AV_NOPTS_VALUE) st->cur_dts = RELATIVE_TS_BASE;
1533 else st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1534 st->reference_dts = AV_NOPTS_VALUE;
1536 st->probe_packets = MAX_PROBE_PACKETS;
1538 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1539 st->pts_buffer[j]= AV_NOPTS_VALUE;
1543 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1547 for(i = 0; i < s->nb_streams; i++) {
1548 AVStream *st = s->streams[i];
1550 st->cur_dts = av_rescale(timestamp,
1551 st->time_base.den * (int64_t)ref_st->time_base.num,
1552 st->time_base.num * (int64_t)ref_st->time_base.den);
1556 void ff_reduce_index(AVFormatContext *s, int stream_index)
1558 AVStream *st= s->streams[stream_index];
1559 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1561 if((unsigned)st->nb_index_entries >= max_entries){
1563 for(i=0; 2*i<st->nb_index_entries; i++)
1564 st->index_entries[i]= st->index_entries[2*i];
1565 st->nb_index_entries= i;
1569 int ff_add_index_entry(AVIndexEntry **index_entries,
1570 int *nb_index_entries,
1571 unsigned int *index_entries_allocated_size,
1572 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1574 AVIndexEntry *entries, *ie;
1577 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1580 if(timestamp == AV_NOPTS_VALUE)
1581 return AVERROR(EINVAL);
1583 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1584 timestamp -= RELATIVE_TS_BASE;
1586 entries = av_fast_realloc(*index_entries,
1587 index_entries_allocated_size,
1588 (*nb_index_entries + 1) *
1589 sizeof(AVIndexEntry));
1593 *index_entries= entries;
1595 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1598 index= (*nb_index_entries)++;
1599 ie= &entries[index];
1600 assert(index==0 || ie[-1].timestamp < timestamp);
1602 ie= &entries[index];
1603 if(ie->timestamp != timestamp){
1604 if(ie->timestamp <= timestamp)
1606 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1607 (*nb_index_entries)++;
1608 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1609 distance= ie->min_distance;
1613 ie->timestamp = timestamp;
1614 ie->min_distance= distance;
1621 int av_add_index_entry(AVStream *st,
1622 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1624 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1625 &st->index_entries_allocated_size, pos,
1626 timestamp, size, distance, flags);
1629 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1630 int64_t wanted_timestamp, int flags)
1638 //optimize appending index entries at the end
1639 if(b && entries[b-1].timestamp < wanted_timestamp)
1644 timestamp = entries[m].timestamp;
1645 if(timestamp >= wanted_timestamp)
1647 if(timestamp <= wanted_timestamp)
1650 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1652 if(!(flags & AVSEEK_FLAG_ANY)){
1653 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1654 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1663 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1666 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1667 wanted_timestamp, flags);
1670 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
1672 AVInputFormat *avif= s->iformat;
1673 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1674 int64_t ts_min, ts_max, ts;
1679 if (stream_index < 0)
1682 av_dlog(s, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1685 ts_min= AV_NOPTS_VALUE;
1686 pos_limit= -1; //gcc falsely says it may be uninitialized
1688 st= s->streams[stream_index];
1689 if(st->index_entries){
1692 index= av_index_search_timestamp(st, target_ts, flags | AVSEEK_FLAG_BACKWARD); //FIXME whole func must be checked for non-keyframe entries in index case, especially read_timestamp()
1693 index= FFMAX(index, 0);
1694 e= &st->index_entries[index];
1696 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1698 ts_min= e->timestamp;
1699 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
1700 pos_min, av_ts2str(ts_min));
1705 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1706 assert(index < st->nb_index_entries);
1708 e= &st->index_entries[index];
1709 assert(e->timestamp >= target_ts);
1711 ts_max= e->timestamp;
1712 pos_limit= pos_max - e->min_distance;
1713 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%s\n",
1714 pos_max, pos_limit, av_ts2str(ts_max));
1718 pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1723 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1726 ff_read_frame_flush(s);
1727 ff_update_cur_dts(s, st, ts);
1732 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1733 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1734 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1735 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1738 int64_t start_pos, filesize;
1741 av_dlog(s, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1743 if(ts_min == AV_NOPTS_VALUE){
1744 pos_min = s->data_offset;
1745 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1746 if (ts_min == AV_NOPTS_VALUE)
1750 if(ts_min >= target_ts){
1755 if(ts_max == AV_NOPTS_VALUE){
1757 filesize = avio_size(s->pb);
1758 pos_max = filesize - 1;
1761 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1763 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1764 if (ts_max == AV_NOPTS_VALUE)
1768 int64_t tmp_pos= pos_max + 1;
1769 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1770 if(tmp_ts == AV_NOPTS_VALUE)
1774 if(tmp_pos >= filesize)
1780 if(ts_max <= target_ts){
1785 if(ts_min > ts_max){
1787 }else if(ts_min == ts_max){
1792 while (pos_min < pos_limit) {
1793 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
1794 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
1795 assert(pos_limit <= pos_max);
1798 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1799 // interpolate position (better than dichotomy)
1800 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1801 + pos_min - approximate_keyframe_distance;
1802 }else if(no_change==1){
1803 // bisection, if interpolation failed to change min or max pos last time
1804 pos = (pos_min + pos_limit)>>1;
1806 /* linear search if bisection failed, can only happen if there
1807 are very few or no keyframes between min/max */
1812 else if(pos > pos_limit)
1816 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1821 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
1822 pos_min, pos, pos_max,
1823 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
1824 pos_limit, start_pos, no_change);
1825 if(ts == AV_NOPTS_VALUE){
1826 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1829 assert(ts != AV_NOPTS_VALUE);
1830 if (target_ts <= ts) {
1831 pos_limit = start_pos - 1;
1835 if (target_ts >= ts) {
1841 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1842 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1845 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1847 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1848 av_dlog(s, "pos=0x%"PRIx64" %s<=%s<=%s\n",
1849 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
1855 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1856 int64_t pos_min, pos_max;
1858 pos_min = s->data_offset;
1859 pos_max = avio_size(s->pb) - 1;
1861 if (pos < pos_min) pos= pos_min;
1862 else if(pos > pos_max) pos= pos_max;
1864 avio_seek(s->pb, pos, SEEK_SET);
1869 static int seek_frame_generic(AVFormatContext *s,
1870 int stream_index, int64_t timestamp, int flags)
1877 st = s->streams[stream_index];
1879 index = av_index_search_timestamp(st, timestamp, flags);
1881 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1884 if(index < 0 || index==st->nb_index_entries-1){
1888 if(st->nb_index_entries){
1889 assert(st->index_entries);
1890 ie= &st->index_entries[st->nb_index_entries-1];
1891 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1893 ff_update_cur_dts(s, st, ie->timestamp);
1895 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1901 read_status = av_read_frame(s, &pkt);
1902 } while (read_status == AVERROR(EAGAIN));
1903 if (read_status < 0)
1905 av_free_packet(&pkt);
1906 if(stream_index == pkt.stream_index && pkt.dts > timestamp){
1907 if(pkt.flags & AV_PKT_FLAG_KEY)
1909 if(nonkey++ > 1000 && st->codec->codec_id != AV_CODEC_ID_CDGRAPHICS){
1910 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);
1915 index = av_index_search_timestamp(st, timestamp, flags);
1920 ff_read_frame_flush(s);
1921 if (s->iformat->read_seek){
1922 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1925 ie = &st->index_entries[index];
1926 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1928 ff_update_cur_dts(s, st, ie->timestamp);
1933 static int seek_frame_internal(AVFormatContext *s, int stream_index,
1934 int64_t timestamp, int flags)
1939 if (flags & AVSEEK_FLAG_BYTE) {
1940 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1942 ff_read_frame_flush(s);
1943 return seek_frame_byte(s, stream_index, timestamp, flags);
1946 if(stream_index < 0){
1947 stream_index= av_find_default_stream_index(s);
1948 if(stream_index < 0)
1951 st= s->streams[stream_index];
1952 /* timestamp for default must be expressed in AV_TIME_BASE units */
1953 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1956 /* first, we try the format specific seek */
1957 if (s->iformat->read_seek) {
1958 ff_read_frame_flush(s);
1959 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1966 if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1967 ff_read_frame_flush(s);
1968 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1969 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1970 ff_read_frame_flush(s);
1971 return seek_frame_generic(s, stream_index, timestamp, flags);
1977 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1979 int ret = seek_frame_internal(s, stream_index, timestamp, flags);
1982 avformat_queue_attached_pictures(s);
1987 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1989 if(min_ts > ts || max_ts < ts)
1992 if (s->iformat->read_seek2) {
1994 ff_read_frame_flush(s);
1995 ret = s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1998 avformat_queue_attached_pictures(s);
2002 if(s->iformat->read_timestamp){
2003 //try to seek via read_timestamp()
2006 //Fallback to old API if new is not implemented but old is
2007 //Note the old has somewhat different semantics
2008 if (s->iformat->read_seek || 1) {
2009 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2010 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2011 if (ret<0 && ts != min_ts && max_ts != ts) {
2012 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2014 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2019 // try some generic seek like seek_frame_generic() but with new ts semantics
2022 /*******************************************************/
2025 * Return TRUE if the stream has accurate duration in any stream.
2027 * @return TRUE if the stream has accurate duration for at least one component.
2029 static int has_duration(AVFormatContext *ic)
2034 for(i = 0;i < ic->nb_streams; i++) {
2035 st = ic->streams[i];
2036 if (st->duration != AV_NOPTS_VALUE)
2039 if (ic->duration != AV_NOPTS_VALUE)
2045 * Estimate the stream timings from the one of each components.
2047 * Also computes the global bitrate if possible.
2049 static void update_stream_timings(AVFormatContext *ic)
2051 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
2052 int64_t duration, duration1, filesize;
2057 start_time = INT64_MAX;
2058 start_time_text = INT64_MAX;
2059 end_time = INT64_MIN;
2060 duration = INT64_MIN;
2061 for(i = 0;i < ic->nb_streams; i++) {
2062 st = ic->streams[i];
2063 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2064 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
2065 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codec->codec_type == AVMEDIA_TYPE_DATA) {
2066 if (start_time1 < start_time_text)
2067 start_time_text = start_time1;
2069 start_time = FFMIN(start_time, start_time1);
2070 end_time1 = AV_NOPTS_VALUE;
2071 if (st->duration != AV_NOPTS_VALUE) {
2072 end_time1 = start_time1
2073 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
2074 end_time = FFMAX(end_time, end_time1);
2076 for(p = NULL; (p = av_find_program_from_stream(ic, p, i)); ){
2077 if(p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2078 p->start_time = start_time1;
2079 if(p->end_time < end_time1)
2080 p->end_time = end_time1;
2083 if (st->duration != AV_NOPTS_VALUE) {
2084 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
2085 duration = FFMAX(duration, duration1);
2088 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2089 start_time = start_time_text;
2090 else if(start_time > start_time_text)
2091 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2093 if (start_time != INT64_MAX) {
2094 ic->start_time = start_time;
2095 if (end_time != INT64_MIN) {
2096 if (ic->nb_programs) {
2097 for (i=0; i<ic->nb_programs; i++) {
2098 p = ic->programs[i];
2099 if(p->start_time != AV_NOPTS_VALUE && p->end_time > p->start_time)
2100 duration = FFMAX(duration, p->end_time - p->start_time);
2103 duration = FFMAX(duration, end_time - start_time);
2106 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2107 ic->duration = duration;
2109 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
2110 /* compute the bitrate */
2111 ic->bit_rate = (double)filesize * 8.0 * AV_TIME_BASE /
2112 (double)ic->duration;
2116 static void fill_all_stream_timings(AVFormatContext *ic)
2121 update_stream_timings(ic);
2122 for(i = 0;i < ic->nb_streams; i++) {
2123 st = ic->streams[i];
2124 if (st->start_time == AV_NOPTS_VALUE) {
2125 if(ic->start_time != AV_NOPTS_VALUE)
2126 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
2127 if(ic->duration != AV_NOPTS_VALUE)
2128 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
2133 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2135 int64_t filesize, duration;
2139 /* if bit_rate is already set, we believe it */
2140 if (ic->bit_rate <= 0) {
2142 for(i=0;i<ic->nb_streams;i++) {
2143 st = ic->streams[i];
2144 if (st->codec->bit_rate > 0)
2145 bit_rate += st->codec->bit_rate;
2147 ic->bit_rate = bit_rate;
2150 /* if duration is already set, we believe it */
2151 if (ic->duration == AV_NOPTS_VALUE &&
2152 ic->bit_rate != 0) {
2153 filesize = ic->pb ? avio_size(ic->pb) : 0;
2155 for(i = 0; i < ic->nb_streams; i++) {
2156 st = ic->streams[i];
2157 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
2158 if (st->duration == AV_NOPTS_VALUE)
2159 st->duration = duration;
2165 #define DURATION_MAX_READ_SIZE 250000LL
2166 #define DURATION_MAX_RETRY 4
2168 /* only usable for MPEG-PS streams */
2169 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2171 AVPacket pkt1, *pkt = &pkt1;
2173 int read_size, i, ret;
2175 int64_t filesize, offset, duration;
2178 /* flush packet queue */
2179 flush_packet_queue(ic);
2181 for (i=0; i<ic->nb_streams; i++) {
2182 st = ic->streams[i];
2183 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
2184 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2187 av_parser_close(st->parser);
2192 /* estimate the end time (duration) */
2193 /* XXX: may need to support wrapping */
2194 filesize = ic->pb ? avio_size(ic->pb) : 0;
2195 end_time = AV_NOPTS_VALUE;
2197 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2201 avio_seek(ic->pb, offset, SEEK_SET);
2204 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2208 ret = ff_read_packet(ic, pkt);
2209 } while(ret == AVERROR(EAGAIN));
2212 read_size += pkt->size;
2213 st = ic->streams[pkt->stream_index];
2214 if (pkt->pts != AV_NOPTS_VALUE &&
2215 (st->start_time != AV_NOPTS_VALUE ||
2216 st->first_dts != AV_NOPTS_VALUE)) {
2217 duration = end_time = pkt->pts;
2218 if (st->start_time != AV_NOPTS_VALUE)
2219 duration -= st->start_time;
2221 duration -= st->first_dts;
2223 duration += 1LL<<st->pts_wrap_bits;
2225 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2226 st->duration = duration;
2229 av_free_packet(pkt);
2231 }while( end_time==AV_NOPTS_VALUE
2232 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2233 && ++retry <= DURATION_MAX_RETRY);
2235 fill_all_stream_timings(ic);
2237 avio_seek(ic->pb, old_offset, SEEK_SET);
2238 for (i=0; i<ic->nb_streams; i++) {
2240 st->cur_dts= st->first_dts;
2241 st->last_IP_pts = AV_NOPTS_VALUE;
2242 st->reference_dts = AV_NOPTS_VALUE;
2246 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2250 /* get the file size, if possible */
2251 if (ic->iformat->flags & AVFMT_NOFILE) {
2254 file_size = avio_size(ic->pb);
2255 file_size = FFMAX(0, file_size);
2258 if ((!strcmp(ic->iformat->name, "mpeg") ||
2259 !strcmp(ic->iformat->name, "mpegts")) &&
2260 file_size && ic->pb->seekable) {
2261 /* get accurate estimate from the PTSes */
2262 estimate_timings_from_pts(ic, old_offset);
2263 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2264 } else if (has_duration(ic)) {
2265 /* at least one component has timings - we use them for all
2267 fill_all_stream_timings(ic);
2268 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2270 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2271 /* less precise: use bitrate info */
2272 estimate_timings_from_bit_rate(ic);
2273 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2275 update_stream_timings(ic);
2279 AVStream av_unused *st;
2280 for(i = 0;i < ic->nb_streams; i++) {
2281 st = ic->streams[i];
2282 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2283 (double) st->start_time / AV_TIME_BASE,
2284 (double) st->duration / AV_TIME_BASE);
2286 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2287 (double) ic->start_time / AV_TIME_BASE,
2288 (double) ic->duration / AV_TIME_BASE,
2289 ic->bit_rate / 1000);
2293 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2295 AVCodecContext *avctx = st->codec;
2297 #define FAIL(errmsg) do { \
2299 *errmsg_ptr = errmsg; \
2303 switch (avctx->codec_type) {
2304 case AVMEDIA_TYPE_AUDIO:
2305 if (!avctx->frame_size && determinable_frame_size(avctx))
2306 FAIL("unspecified frame size");
2307 if (st->info->found_decoder >= 0 && avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2308 FAIL("unspecified sample format");
2309 if (!avctx->sample_rate)
2310 FAIL("unspecified sample rate");
2311 if (!avctx->channels)
2312 FAIL("unspecified number of channels");
2313 if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
2314 FAIL("no decodable DTS frames");
2316 case AVMEDIA_TYPE_VIDEO:
2318 FAIL("unspecified size");
2319 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
2320 FAIL("unspecified pixel format");
2322 case AVMEDIA_TYPE_SUBTITLE:
2323 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
2324 FAIL("unspecified size");
2326 case AVMEDIA_TYPE_DATA:
2327 if(avctx->codec_id == AV_CODEC_ID_NONE) return 1;
2330 if (avctx->codec_id == AV_CODEC_ID_NONE)
2331 FAIL("unknown codec");
2335 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2336 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2338 const AVCodec *codec;
2339 int got_picture = 1, ret = 0;
2340 AVFrame *frame = avcodec_alloc_frame();
2341 AVSubtitle subtitle;
2342 AVPacket pkt = *avpkt;
2345 return AVERROR(ENOMEM);
2347 if (!avcodec_is_open(st->codec) && !st->info->found_decoder) {
2348 AVDictionary *thread_opt = NULL;
2350 codec = st->codec->codec ? st->codec->codec :
2351 avcodec_find_decoder(st->codec->codec_id);
2354 st->info->found_decoder = -1;
2359 /* force thread count to 1 since the h264 decoder will not extract SPS
2360 * and PPS to extradata during multi-threaded decoding */
2361 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2362 ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
2364 av_dict_free(&thread_opt);
2366 st->info->found_decoder = -1;
2369 st->info->found_decoder = 1;
2370 } else if (!st->info->found_decoder)
2371 st->info->found_decoder = 1;
2373 if (st->info->found_decoder < 0) {
2378 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2380 (!has_codec_parameters(st, NULL) ||
2381 !has_decode_delay_been_guessed(st) ||
2382 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2384 avcodec_get_frame_defaults(frame);
2385 switch(st->codec->codec_type) {
2386 case AVMEDIA_TYPE_VIDEO:
2387 ret = avcodec_decode_video2(st->codec, frame,
2388 &got_picture, &pkt);
2390 case AVMEDIA_TYPE_AUDIO:
2391 ret = avcodec_decode_audio4(st->codec, frame, &got_picture, &pkt);
2393 case AVMEDIA_TYPE_SUBTITLE:
2394 ret = avcodec_decode_subtitle2(st->codec, &subtitle,
2395 &got_picture, &pkt);
2403 st->nb_decoded_frames++;
2410 if(!pkt.data && !got_picture)
2414 avcodec_free_frame(&frame);
2418 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
2420 while (tags->id != AV_CODEC_ID_NONE) {
2428 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2431 for(i=0; tags[i].id != AV_CODEC_ID_NONE;i++) {
2432 if(tag == tags[i].tag)
2435 for(i=0; tags[i].id != AV_CODEC_ID_NONE; i++) {
2436 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2439 return AV_CODEC_ID_NONE;
2442 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
2446 case 32: return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
2447 case 64: return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
2448 default: return AV_CODEC_ID_NONE;
2453 if (sflags & (1 << (bps - 1))) {
2455 case 1: return AV_CODEC_ID_PCM_S8;
2456 case 2: return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
2457 case 3: return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
2458 case 4: return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
2459 default: return AV_CODEC_ID_NONE;
2463 case 1: return AV_CODEC_ID_PCM_U8;
2464 case 2: return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
2465 case 3: return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
2466 case 4: return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
2467 default: return AV_CODEC_ID_NONE;
2473 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum AVCodecID id)
2476 for(i=0; tags && tags[i]; i++){
2477 int tag= ff_codec_get_tag(tags[i], id);
2483 enum AVCodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2486 for(i=0; tags && tags[i]; i++){
2487 enum AVCodecID id= ff_codec_get_id(tags[i], tag);
2488 if(id!=AV_CODEC_ID_NONE) return id;
2490 return AV_CODEC_ID_NONE;
2493 static void compute_chapters_end(AVFormatContext *s)
2496 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2498 for (i = 0; i < s->nb_chapters; i++)
2499 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2500 AVChapter *ch = s->chapters[i];
2501 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2504 for (j = 0; j < s->nb_chapters; j++) {
2505 AVChapter *ch1 = s->chapters[j];
2506 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2507 if (j != i && next_start > ch->start && next_start < end)
2510 ch->end = (end == INT64_MAX) ? ch->start : end;
2514 static int get_std_framerate(int i){
2515 if(i<60*12) return (i+1)*1001;
2516 else return ((const int[]){24,30,60,12,15,48})[i-60*12]*1000*12;
2520 * Is the time base unreliable.
2521 * This is a heuristic to balance between quick acceptance of the values in
2522 * the headers vs. some extra checks.
2523 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2524 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2525 * And there are "variable" fps files this needs to detect as well.
2527 static int tb_unreliable(AVCodecContext *c){
2528 if( c->time_base.den >= 101L*c->time_base.num
2529 || c->time_base.den < 5L*c->time_base.num
2530 /* || c->codec_tag == AV_RL32("DIVX")
2531 || c->codec_tag == AV_RL32("XVID")*/
2532 || c->codec_tag == AV_RL32("mp4v")
2533 || c->codec_id == AV_CODEC_ID_MPEG2VIDEO
2534 || c->codec_id == AV_CODEC_ID_H264
2540 #if FF_API_FORMAT_PARAMETERS
2541 int av_find_stream_info(AVFormatContext *ic)
2543 return avformat_find_stream_info(ic, NULL);
2547 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2549 int i, count, ret, read_size, j;
2551 AVPacket pkt1, *pkt;
2552 int64_t old_offset = avio_tell(ic->pb);
2553 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2554 int flush_codecs = ic->probesize > 0;
2557 av_log(ic, AV_LOG_DEBUG, "File position before avformat_find_stream_info() is %"PRId64"\n", avio_tell(ic->pb));
2559 for(i=0;i<ic->nb_streams;i++) {
2560 const AVCodec *codec;
2561 AVDictionary *thread_opt = NULL;
2562 st = ic->streams[i];
2564 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2565 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2566 /* if(!st->time_base.num)
2568 if(!st->codec->time_base.num)
2569 st->codec->time_base= st->time_base;
2571 //only for the split stuff
2572 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2573 st->parser = av_parser_init(st->codec->codec_id);
2575 if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
2576 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2577 } else if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
2578 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
2580 } else if (st->need_parsing) {
2581 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
2582 "%s, packets or times may be invalid.\n",
2583 avcodec_get_name(st->codec->codec_id));
2586 codec = st->codec->codec ? st->codec->codec :
2587 avcodec_find_decoder(st->codec->codec_id);
2589 /* force thread count to 1 since the h264 decoder will not extract SPS
2590 * and PPS to extradata during multi-threaded decoding */
2591 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
2593 /* Ensure that subtitle_header is properly set. */
2594 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2595 && codec && !st->codec->codec)
2596 avcodec_open2(st->codec, codec, options ? &options[i]
2599 //try to just open decoders, in case this is enough to get parameters
2600 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
2601 if (codec && !st->codec->codec)
2602 avcodec_open2(st->codec, codec, options ? &options[i]
2606 av_dict_free(&thread_opt);
2609 for (i=0; i<ic->nb_streams; i++) {
2610 #if FF_API_R_FRAME_RATE
2611 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2613 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
2614 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
2620 if (ff_check_interrupt(&ic->interrupt_callback)){
2622 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2626 /* check if one codec still needs to be handled */
2627 for(i=0;i<ic->nb_streams;i++) {
2628 int fps_analyze_framecount = 20;
2630 st = ic->streams[i];
2631 if (!has_codec_parameters(st, NULL))
2633 /* if the timebase is coarse (like the usual millisecond precision
2634 of mkv), we need to analyze more frames to reliably arrive at
2636 if (av_q2d(st->time_base) > 0.0005)
2637 fps_analyze_framecount *= 2;
2638 if (ic->fps_probe_size >= 0)
2639 fps_analyze_framecount = ic->fps_probe_size;
2640 /* variable fps and no guess at the real fps */
2641 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2642 && st->info->duration_count < fps_analyze_framecount
2643 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2645 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2647 if (st->first_dts == AV_NOPTS_VALUE &&
2648 (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2649 st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2652 if (i == ic->nb_streams) {
2653 /* NOTE: if the format has no header, then we need to read
2654 some packets to get most of the streams, so we cannot
2656 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2657 /* if we found the info for all the codecs, we can stop */
2659 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2664 /* we did not get all the codec info, but we read too much data */
2665 if (read_size >= ic->probesize) {
2667 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2668 for (i = 0; i < ic->nb_streams; i++)
2669 if (!ic->streams[i]->r_frame_rate.num &&
2670 ic->streams[i]->info->duration_count <= 1)
2671 av_log(ic, AV_LOG_WARNING,
2672 "Stream #%d: not enough frames to estimate rate; "
2673 "consider increasing probesize\n", i);
2677 /* NOTE: a new stream can be added there if no header in file
2678 (AVFMTCTX_NOHEADER) */
2679 ret = read_frame_internal(ic, &pkt1);
2680 if (ret == AVERROR(EAGAIN))
2688 if (ic->flags & AVFMT_FLAG_NOBUFFER) {
2691 pkt = add_to_pktbuf(&ic->packet_buffer, &pkt1,
2692 &ic->packet_buffer_end);
2693 if ((ret = av_dup_packet(pkt)) < 0)
2694 goto find_stream_info_err;
2697 read_size += pkt->size;
2699 st = ic->streams[pkt->stream_index];
2700 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
2701 /* check for non-increasing dts */
2702 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
2703 st->info->fps_last_dts >= pkt->dts) {
2704 av_log(ic, AV_LOG_DEBUG, "Non-increasing DTS in stream %d: "
2705 "packet %d with DTS %"PRId64", packet %d with DTS "
2706 "%"PRId64"\n", st->index, st->info->fps_last_dts_idx,
2707 st->info->fps_last_dts, st->codec_info_nb_frames, pkt->dts);
2708 st->info->fps_first_dts = st->info->fps_last_dts = AV_NOPTS_VALUE;
2710 /* check for a discontinuity in dts - if the difference in dts
2711 * is more than 1000 times the average packet duration in the sequence,
2712 * we treat it as a discontinuity */
2713 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
2714 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
2715 (pkt->dts - st->info->fps_last_dts) / 1000 >
2716 (st->info->fps_last_dts - st->info->fps_first_dts) / (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
2717 av_log(ic, AV_LOG_WARNING, "DTS discontinuity in stream %d: "
2718 "packet %d with DTS %"PRId64", packet %d with DTS "
2719 "%"PRId64"\n", st->index, st->info->fps_last_dts_idx,
2720 st->info->fps_last_dts, st->codec_info_nb_frames, pkt->dts);
2721 st->info->fps_first_dts = st->info->fps_last_dts = AV_NOPTS_VALUE;
2724 /* update stored dts values */
2725 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
2726 st->info->fps_first_dts = pkt->dts;
2727 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
2729 st->info->fps_last_dts = pkt->dts;
2730 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
2732 if (st->codec_info_nb_frames>1) {
2734 if (st->time_base.den > 0)
2735 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
2736 if (st->avg_frame_rate.num > 0)
2737 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
2739 if (t >= ic->max_analyze_duration) {
2740 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2743 if (pkt->duration) {
2744 st->info->codec_info_duration += pkt->duration;
2745 st->info->codec_info_duration_fields += st->parser && st->codec->ticks_per_frame==2 ? st->parser->repeat_pict + 1 : 2;
2748 #if FF_API_R_FRAME_RATE
2750 int64_t last = st->info->last_dts;
2752 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2753 double dts= (is_relative(pkt->dts) ? pkt->dts - RELATIVE_TS_BASE : pkt->dts) * av_q2d(st->time_base);
2754 int64_t duration= pkt->dts - last;
2756 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2757 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
2758 for (i=0; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) {
2759 int framerate= get_std_framerate(i);
2760 double sdts= dts*framerate/(1001*12);
2762 int64_t ticks= llrint(sdts+j*0.5);
2763 double error= sdts - ticks + j*0.5;
2764 st->info->duration_error[j][0][i] += error;
2765 st->info->duration_error[j][1][i] += error*error;
2768 st->info->duration_count++;
2769 // ignore the first 4 values, they might have some random jitter
2770 if (st->info->duration_count > 3 && is_relative(pkt->dts) == is_relative(last))
2771 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2773 if (pkt->dts != AV_NOPTS_VALUE)
2774 st->info->last_dts = pkt->dts;
2777 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2778 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2779 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
2780 st->codec->extradata_size= i;
2781 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2782 if (!st->codec->extradata)
2783 return AVERROR(ENOMEM);
2784 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2785 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2789 /* if still no information, we try to open the codec and to
2790 decompress the frame. We try to avoid that in most cases as
2791 it takes longer and uses more memory. For MPEG-4, we need to
2792 decompress for QuickTime.
2794 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2795 least one frame of codec data, this makes sure the codec initializes
2796 the channel configuration and does not only trust the values from the container.
2798 try_decode_frame(st, pkt, (options && i < orig_nb_streams ) ? &options[i] : NULL);
2800 st->codec_info_nb_frames++;
2805 AVPacket empty_pkt = { 0 };
2807 av_init_packet(&empty_pkt);
2809 ret = -1; /* we could not have all the codec parameters before EOF */
2810 for(i=0;i<ic->nb_streams;i++) {
2813 st = ic->streams[i];
2815 /* flush the decoders */
2816 if (st->info->found_decoder == 1) {
2818 err = try_decode_frame(st, &empty_pkt,
2819 (options && i < orig_nb_streams) ?
2820 &options[i] : NULL);
2821 } while (err > 0 && !has_codec_parameters(st, NULL));
2824 av_log(ic, AV_LOG_INFO,
2825 "decoding for stream %d failed\n", st->index);
2829 if (!has_codec_parameters(st, &errmsg)) {
2831 avcodec_string(buf, sizeof(buf), st->codec, 0);
2832 av_log(ic, AV_LOG_WARNING,
2833 "Could not find codec parameters for stream %d (%s): %s\n"
2834 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
2842 // close codecs which were opened in try_decode_frame()
2843 for(i=0;i<ic->nb_streams;i++) {
2844 st = ic->streams[i];
2845 avcodec_close(st->codec);
2847 for(i=0;i<ic->nb_streams;i++) {
2848 st = ic->streams[i];
2849 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2850 if(st->codec->codec_id == AV_CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2851 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2852 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2853 st->codec->codec_tag= tag;
2856 /* estimate average framerate if not set by demuxer */
2857 if (st->info->codec_info_duration_fields && !st->avg_frame_rate.num && st->info->codec_info_duration) {
2859 double best_error = 0.01;
2861 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2862 st->info->codec_info_duration_fields*(int64_t)st->time_base.den,
2863 st->info->codec_info_duration*2*(int64_t)st->time_base.num, 60000);
2865 /* round guessed framerate to a "standard" framerate if it's
2866 * within 1% of the original estimate*/
2867 for (j = 1; j < MAX_STD_TIMEBASES; j++) {
2868 AVRational std_fps = { get_std_framerate(j), 12*1001 };
2869 double error = fabs(av_q2d(st->avg_frame_rate) / av_q2d(std_fps) - 1);
2871 if (error < best_error) {
2873 best_fps = std_fps.num;
2877 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2878 best_fps, 12*1001, INT_MAX);
2881 // the check for tb_unreliable() is not completely correct, since this is not about handling
2882 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2883 // ipmovie.c produces.
2884 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)
2885 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);
2886 if (st->info->duration_count>1 && !st->r_frame_rate.num
2887 && tb_unreliable(st->codec)) {
2889 double best_error= 0.01;
2891 for (j=0; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) {
2894 if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2896 if(!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
2899 int n= st->info->duration_count;
2900 double a= st->info->duration_error[k][0][j] / n;
2901 double error= st->info->duration_error[k][1][j]/n - a*a;
2903 if(error < best_error && best_error> 0.000000001){
2905 num = get_std_framerate(j);
2908 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2911 // do not increase frame rate by more than 1 % in order to match a standard rate.
2912 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2913 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2916 if (!st->r_frame_rate.num){
2917 if( st->codec->time_base.den * (int64_t)st->time_base.num
2918 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2919 st->r_frame_rate.num = st->codec->time_base.den;
2920 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2922 st->r_frame_rate.num = st->time_base.den;
2923 st->r_frame_rate.den = st->time_base.num;
2926 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2927 if(!st->codec->bits_per_coded_sample)
2928 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2929 // set stream disposition based on audio service type
2930 switch (st->codec->audio_service_type) {
2931 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2932 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2933 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2934 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2935 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2936 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2937 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2938 st->disposition = AV_DISPOSITION_COMMENT; break;
2939 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2940 st->disposition = AV_DISPOSITION_KARAOKE; break;
2946 estimate_timings(ic, old_offset);
2948 compute_chapters_end(ic);
2950 find_stream_info_err:
2951 for (i=0; i < ic->nb_streams; i++) {
2952 if (ic->streams[i]->codec)
2953 ic->streams[i]->codec->thread_count = 0;
2954 av_freep(&ic->streams[i]->info);
2957 av_log(ic, AV_LOG_DEBUG, "File position after avformat_find_stream_info() is %"PRId64"\n", avio_tell(ic->pb));
2961 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2965 for (i = 0; i < ic->nb_programs; i++) {
2966 if (ic->programs[i] == last) {
2970 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2971 if (ic->programs[i]->stream_index[j] == s)
2972 return ic->programs[i];
2978 int av_find_best_stream(AVFormatContext *ic,
2979 enum AVMediaType type,
2980 int wanted_stream_nb,
2982 AVCodec **decoder_ret,
2985 int i, nb_streams = ic->nb_streams;
2986 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe;
2987 unsigned *program = NULL;
2988 AVCodec *decoder = NULL, *best_decoder = NULL;
2990 if (related_stream >= 0 && wanted_stream_nb < 0) {
2991 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2993 program = p->stream_index;
2994 nb_streams = p->nb_stream_indexes;
2997 for (i = 0; i < nb_streams; i++) {
2998 int real_stream_index = program ? program[i] : i;
2999 AVStream *st = ic->streams[real_stream_index];
3000 AVCodecContext *avctx = st->codec;
3001 if (avctx->codec_type != type)
3003 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
3005 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
3008 decoder = avcodec_find_decoder(st->codec->codec_id);
3011 ret = AVERROR_DECODER_NOT_FOUND;
3015 count = st->codec_info_nb_frames;
3016 bitrate = avctx->bit_rate;
3017 multiframe = FFMIN(5, count);
3018 if ((best_multiframe > multiframe) ||
3019 (best_multiframe == multiframe && best_bitrate > bitrate) ||
3020 (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
3023 best_bitrate = bitrate;
3024 best_multiframe = multiframe;
3025 ret = real_stream_index;
3026 best_decoder = decoder;
3027 if (program && i == nb_streams - 1 && ret < 0) {
3029 nb_streams = ic->nb_streams;
3030 i = 0; /* no related stream found, try again with everything */
3034 *decoder_ret = best_decoder;
3038 /*******************************************************/
3040 int av_read_play(AVFormatContext *s)
3042 if (s->iformat->read_play)
3043 return s->iformat->read_play(s);
3045 return avio_pause(s->pb, 0);
3046 return AVERROR(ENOSYS);
3049 int av_read_pause(AVFormatContext *s)
3051 if (s->iformat->read_pause)
3052 return s->iformat->read_pause(s);
3054 return avio_pause(s->pb, 1);
3055 return AVERROR(ENOSYS);
3058 void ff_free_stream(AVFormatContext *s, AVStream *st){
3059 av_assert0(s->nb_streams>0);
3060 av_assert0(s->streams[ s->nb_streams-1 ] == st);
3063 av_parser_close(st->parser);
3065 if (st->attached_pic.data)
3066 av_free_packet(&st->attached_pic);
3067 av_dict_free(&st->metadata);
3068 av_freep(&st->index_entries);
3069 av_freep(&st->codec->extradata);
3070 av_freep(&st->codec->subtitle_header);
3071 av_freep(&st->codec);
3072 av_freep(&st->priv_data);
3073 av_freep(&st->info);
3074 av_freep(&st->probe_data.buf);
3075 av_freep(&s->streams[ --s->nb_streams ]);
3078 void avformat_free_context(AVFormatContext *s)
3086 if (s->iformat && s->iformat->priv_class && s->priv_data)
3087 av_opt_free(s->priv_data);
3089 for(i=s->nb_streams-1; i>=0; i--) {
3090 ff_free_stream(s, s->streams[i]);
3092 for(i=s->nb_programs-1; i>=0; i--) {
3093 av_dict_free(&s->programs[i]->metadata);
3094 av_freep(&s->programs[i]->stream_index);
3095 av_freep(&s->programs[i]);
3097 av_freep(&s->programs);
3098 av_freep(&s->priv_data);
3099 while(s->nb_chapters--) {
3100 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
3101 av_freep(&s->chapters[s->nb_chapters]);
3103 av_freep(&s->chapters);
3104 av_dict_free(&s->metadata);
3105 av_freep(&s->streams);
3109 #if FF_API_CLOSE_INPUT_FILE
3110 void av_close_input_file(AVFormatContext *s)
3112 avformat_close_input(&s);
3116 void avformat_close_input(AVFormatContext **ps)
3118 AVFormatContext *s = *ps;
3119 AVIOContext *pb = s->pb;
3121 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
3122 (s->flags & AVFMT_FLAG_CUSTOM_IO))
3125 flush_packet_queue(s);
3128 if (s->iformat->read_close)
3129 s->iformat->read_close(s);
3132 avformat_free_context(s);
3139 #if FF_API_NEW_STREAM
3140 AVStream *av_new_stream(AVFormatContext *s, int id)
3142 AVStream *st = avformat_new_stream(s, NULL);
3149 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
3155 if (s->nb_streams >= INT_MAX/sizeof(*streams))
3157 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
3160 s->streams = streams;
3162 st = av_mallocz(sizeof(AVStream));
3165 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
3169 st->info->last_dts = AV_NOPTS_VALUE;
3171 st->codec = avcodec_alloc_context3(c);
3173 /* no default bitrate if decoding */
3174 st->codec->bit_rate = 0;
3176 st->index = s->nb_streams;
3177 st->start_time = AV_NOPTS_VALUE;
3178 st->duration = AV_NOPTS_VALUE;
3179 /* we set the current DTS to 0 so that formats without any timestamps
3180 but durations get some timestamps, formats with some unknown
3181 timestamps have their first few packets buffered and the
3182 timestamps corrected before they are returned to the user */
3183 st->cur_dts = s->iformat ? RELATIVE_TS_BASE : 0;
3184 st->first_dts = AV_NOPTS_VALUE;
3185 st->probe_packets = MAX_PROBE_PACKETS;
3187 /* default pts setting is MPEG-like */
3188 avpriv_set_pts_info(st, 33, 1, 90000);
3189 st->last_IP_pts = AV_NOPTS_VALUE;
3190 for(i=0; i<MAX_REORDER_DELAY+1; i++)
3191 st->pts_buffer[i]= AV_NOPTS_VALUE;
3192 st->reference_dts = AV_NOPTS_VALUE;
3194 st->sample_aspect_ratio = (AVRational){0,1};
3196 #if FF_API_R_FRAME_RATE
3197 st->info->last_dts = AV_NOPTS_VALUE;
3199 st->info->fps_first_dts = AV_NOPTS_VALUE;
3200 st->info->fps_last_dts = AV_NOPTS_VALUE;
3202 s->streams[s->nb_streams++] = st;
3206 AVProgram *av_new_program(AVFormatContext *ac, int id)
3208 AVProgram *program=NULL;
3211 av_dlog(ac, "new_program: id=0x%04x\n", id);
3213 for(i=0; i<ac->nb_programs; i++)
3214 if(ac->programs[i]->id == id)
3215 program = ac->programs[i];
3218 program = av_mallocz(sizeof(AVProgram));
3221 dynarray_add(&ac->programs, &ac->nb_programs, program);
3222 program->discard = AVDISCARD_NONE;
3226 program->start_time =
3227 program->end_time = AV_NOPTS_VALUE;
3232 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
3234 AVChapter *chapter = NULL;
3237 for(i=0; i<s->nb_chapters; i++)
3238 if(s->chapters[i]->id == id)
3239 chapter = s->chapters[i];
3242 chapter= av_mallocz(sizeof(AVChapter));
3245 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
3247 av_dict_set(&chapter->metadata, "title", title, 0);
3249 chapter->time_base= time_base;
3250 chapter->start = start;
3256 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3259 AVProgram *program=NULL;
3262 if (idx >= ac->nb_streams) {
3263 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3267 for(i=0; i<ac->nb_programs; i++){
3268 if(ac->programs[i]->id != progid)
3270 program = ac->programs[i];
3271 for(j=0; j<program->nb_stream_indexes; j++)
3272 if(program->stream_index[j] == idx)
3275 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3278 program->stream_index = tmp;
3279 program->stream_index[program->nb_stream_indexes++] = idx;
3284 static void print_fps(double d, const char *postfix){
3285 uint64_t v= lrintf(d*100);
3286 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3287 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3288 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3291 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3293 if(m && !(av_dict_count(m) == 1 && av_dict_get(m, "language", NULL, 0))){
3294 AVDictionaryEntry *tag=NULL;
3296 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3297 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3298 if(strcmp("language", tag->key)){
3299 const char *p = tag->value;
3300 av_log(ctx, AV_LOG_INFO, "%s %-16s: ", indent, tag->key);
3303 size_t len = strcspn(p, "\x8\xa\xb\xc\xd");
3304 av_strlcpy(tmp, p, FFMIN(sizeof(tmp), len+1));
3305 av_log(ctx, AV_LOG_INFO, "%s", tmp);
3307 if (*p == 0xd) av_log(ctx, AV_LOG_INFO, " ");
3308 if (*p == 0xa) av_log(ctx, AV_LOG_INFO, "\n%s %-16s: ", indent, "");
3311 av_log(ctx, AV_LOG_INFO, "\n");
3317 /* "user interface" functions */
3318 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3321 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3322 AVStream *st = ic->streams[i];
3323 int g = av_gcd(st->time_base.num, st->time_base.den);
3324 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3325 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3326 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
3327 /* the pid is an important information, so we display it */
3328 /* XXX: add a generic system */
3329 if (flags & AVFMT_SHOW_IDS)
3330 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3332 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3333 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3334 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3335 if (st->sample_aspect_ratio.num && // default
3336 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3337 AVRational display_aspect_ratio;
3338 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3339 st->codec->width*st->sample_aspect_ratio.num,
3340 st->codec->height*st->sample_aspect_ratio.den,
3342 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3343 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3344 display_aspect_ratio.num, display_aspect_ratio.den);
3346 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3347 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3348 print_fps(av_q2d(st->avg_frame_rate), "fps");
3349 #if FF_API_R_FRAME_RATE
3350 if(st->r_frame_rate.den && st->r_frame_rate.num)
3351 print_fps(av_q2d(st->r_frame_rate), "tbr");
3353 if(st->time_base.den && st->time_base.num)
3354 print_fps(1/av_q2d(st->time_base), "tbn");
3355 if(st->codec->time_base.den && st->codec->time_base.num)
3356 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3358 if (st->disposition & AV_DISPOSITION_DEFAULT)
3359 av_log(NULL, AV_LOG_INFO, " (default)");
3360 if (st->disposition & AV_DISPOSITION_DUB)
3361 av_log(NULL, AV_LOG_INFO, " (dub)");
3362 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3363 av_log(NULL, AV_LOG_INFO, " (original)");
3364 if (st->disposition & AV_DISPOSITION_COMMENT)
3365 av_log(NULL, AV_LOG_INFO, " (comment)");
3366 if (st->disposition & AV_DISPOSITION_LYRICS)
3367 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3368 if (st->disposition & AV_DISPOSITION_KARAOKE)
3369 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3370 if (st->disposition & AV_DISPOSITION_FORCED)
3371 av_log(NULL, AV_LOG_INFO, " (forced)");
3372 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3373 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3374 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3375 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3376 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3377 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3378 av_log(NULL, AV_LOG_INFO, "\n");
3379 dump_metadata(NULL, st->metadata, " ");
3382 void av_dump_format(AVFormatContext *ic,
3388 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3389 if (ic->nb_streams && !printed)
3392 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3393 is_output ? "Output" : "Input",
3395 is_output ? ic->oformat->name : ic->iformat->name,
3396 is_output ? "to" : "from", url);
3397 dump_metadata(NULL, ic->metadata, " ");
3399 av_log(NULL, AV_LOG_INFO, " Duration: ");
3400 if (ic->duration != AV_NOPTS_VALUE) {
3401 int hours, mins, secs, us;
3402 int64_t duration = ic->duration + 5000;
3403 secs = duration / AV_TIME_BASE;
3404 us = duration % AV_TIME_BASE;
3409 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3410 (100 * us) / AV_TIME_BASE);
3412 av_log(NULL, AV_LOG_INFO, "N/A");
3414 if (ic->start_time != AV_NOPTS_VALUE) {
3416 av_log(NULL, AV_LOG_INFO, ", start: ");
3417 secs = ic->start_time / AV_TIME_BASE;
3418 us = abs(ic->start_time % AV_TIME_BASE);
3419 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3420 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3422 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3424 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3426 av_log(NULL, AV_LOG_INFO, "N/A");
3428 av_log(NULL, AV_LOG_INFO, "\n");
3430 for (i = 0; i < ic->nb_chapters; i++) {
3431 AVChapter *ch = ic->chapters[i];
3432 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3433 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3434 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3436 dump_metadata(NULL, ch->metadata, " ");
3438 if(ic->nb_programs) {
3439 int j, k, total = 0;
3440 for(j=0; j<ic->nb_programs; j++) {
3441 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3443 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3444 name ? name->value : "");
3445 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3446 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3447 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3448 printed[ic->programs[j]->stream_index[k]] = 1;
3450 total += ic->programs[j]->nb_stream_indexes;
3452 if (total < ic->nb_streams)
3453 av_log(NULL, AV_LOG_INFO, " No Program\n");
3455 for(i=0;i<ic->nb_streams;i++)
3457 dump_stream_format(ic, i, index, is_output);
3462 #if FF_API_AV_GETTIME && CONFIG_SHARED && HAVE_SYMVER
3463 FF_SYMVER(int64_t, av_gettime, (void), "LIBAVFORMAT_54")
3465 return av_gettime();
3469 uint64_t ff_ntp_time(void)
3471 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3474 int av_get_frame_filename(char *buf, int buf_size,
3475 const char *path, int number)
3478 char *q, buf1[20], c;
3479 int nd, len, percentd_found;
3491 while (isdigit(*p)) {
3492 nd = nd * 10 + *p++ - '0';
3495 } while (isdigit(c));
3504 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3506 if ((q - buf + len) > buf_size - 1)
3508 memcpy(q, buf1, len);
3516 if ((q - buf) < buf_size - 1)
3520 if (!percentd_found)
3529 static void hex_dump_internal(void *avcl, FILE *f, int level,
3530 const uint8_t *buf, int size)
3533 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3535 for(i=0;i<size;i+=16) {
3542 PRINT(" %02x", buf[i+j]);
3547 for(j=0;j<len;j++) {
3549 if (c < ' ' || c > '~')
3558 void av_hex_dump(FILE *f, const uint8_t *buf, int size)
3560 hex_dump_internal(NULL, f, 0, buf, size);
3563 void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size)
3565 hex_dump_internal(avcl, NULL, level, buf, size);
3568 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3570 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3571 PRINT("stream #%d:\n", pkt->stream_index);
3572 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3573 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3574 /* DTS is _always_ valid after av_read_frame() */
3576 if (pkt->dts == AV_NOPTS_VALUE)
3579 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3580 /* PTS may not be known if B-frames are present. */
3582 if (pkt->pts == AV_NOPTS_VALUE)
3585 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3587 PRINT(" size=%d\n", pkt->size);
3590 av_hex_dump(f, pkt->data, pkt->size);
3594 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3596 AVRational tb = { 1, AV_TIME_BASE };
3597 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3601 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3603 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3607 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3609 AVRational tb = { 1, AV_TIME_BASE };
3610 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3614 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3617 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3620 void av_url_split(char *proto, int proto_size,
3621 char *authorization, int authorization_size,
3622 char *hostname, int hostname_size,
3624 char *path, int path_size,
3627 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
3629 if (port_ptr) *port_ptr = -1;
3630 if (proto_size > 0) proto[0] = 0;
3631 if (authorization_size > 0) authorization[0] = 0;
3632 if (hostname_size > 0) hostname[0] = 0;
3633 if (path_size > 0) path[0] = 0;
3635 /* parse protocol */
3636 if ((p = strchr(url, ':'))) {
3637 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3642 /* no protocol means plain filename */
3643 av_strlcpy(path, url, path_size);
3647 /* separate path from hostname */
3648 ls = strchr(p, '/');
3649 ls2 = strchr(p, '?');
3653 ls = FFMIN(ls, ls2);
3655 av_strlcpy(path, ls, path_size);
3657 ls = &p[strlen(p)]; // XXX
3659 /* the rest is hostname, use that to parse auth/port */
3661 /* authorization (user[:pass]@hostname) */
3663 while ((at = strchr(p, '@')) && at < ls) {
3664 av_strlcpy(authorization, at2,
3665 FFMIN(authorization_size, at + 1 - at2));
3666 p = at + 1; /* skip '@' */
3669 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3671 av_strlcpy(hostname, p + 1,
3672 FFMIN(hostname_size, brk - p));
3673 if (brk[1] == ':' && port_ptr)
3674 *port_ptr = atoi(brk + 2);
3675 } else if ((col = strchr(p, ':')) && col < ls) {
3676 av_strlcpy(hostname, p,
3677 FFMIN(col + 1 - p, hostname_size));
3678 if (port_ptr) *port_ptr = atoi(col + 1);
3680 av_strlcpy(hostname, p,
3681 FFMIN(ls + 1 - p, hostname_size));
3685 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3688 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3691 'C', 'D', 'E', 'F' };
3692 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3695 'c', 'd', 'e', 'f' };
3696 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3698 for(i = 0; i < s; i++) {
3699 buff[i * 2] = hex_table[src[i] >> 4];
3700 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3706 int ff_hex_to_data(uint8_t *data, const char *p)
3713 p += strspn(p, SPACE_CHARS);
3716 c = toupper((unsigned char) *p++);
3717 if (c >= '0' && c <= '9')
3719 else if (c >= 'A' && c <= 'F')
3734 #if FF_API_SET_PTS_INFO
3735 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3736 unsigned int pts_num, unsigned int pts_den)
3738 avpriv_set_pts_info(s, pts_wrap_bits, pts_num, pts_den);
3742 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
3743 unsigned int pts_num, unsigned int pts_den)
3746 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3747 if(new_tb.num != pts_num)
3748 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3750 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3752 if(new_tb.num <= 0 || new_tb.den <= 0) {
3753 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase %d/%d for st:%d\n", new_tb.num, new_tb.den, s->index);
3756 s->time_base = new_tb;
3757 av_codec_set_pkt_timebase(s->codec, new_tb);
3758 s->pts_wrap_bits = pts_wrap_bits;
3761 int ff_url_join(char *str, int size, const char *proto,
3762 const char *authorization, const char *hostname,
3763 int port, const char *fmt, ...)
3766 struct addrinfo hints = { 0 }, *ai;
3771 av_strlcatf(str, size, "%s://", proto);
3772 if (authorization && authorization[0])
3773 av_strlcatf(str, size, "%s@", authorization);
3774 #if CONFIG_NETWORK && defined(AF_INET6)
3775 /* Determine if hostname is a numerical IPv6 address,
3776 * properly escape it within [] in that case. */
3777 hints.ai_flags = AI_NUMERICHOST;
3778 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3779 if (ai->ai_family == AF_INET6) {
3780 av_strlcat(str, "[", size);
3781 av_strlcat(str, hostname, size);
3782 av_strlcat(str, "]", size);
3784 av_strlcat(str, hostname, size);
3789 /* Not an IPv6 address, just output the plain string. */
3790 av_strlcat(str, hostname, size);
3793 av_strlcatf(str, size, ":%d", port);
3796 int len = strlen(str);
3799 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3805 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3806 AVFormatContext *src)
3811 local_pkt.stream_index = dst_stream;
3812 if (pkt->pts != AV_NOPTS_VALUE)
3813 local_pkt.pts = av_rescale_q(pkt->pts,
3814 src->streams[pkt->stream_index]->time_base,
3815 dst->streams[dst_stream]->time_base);
3816 if (pkt->dts != AV_NOPTS_VALUE)
3817 local_pkt.dts = av_rescale_q(pkt->dts,
3818 src->streams[pkt->stream_index]->time_base,
3819 dst->streams[dst_stream]->time_base);
3820 return av_write_frame(dst, &local_pkt);
3823 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3826 const char *ptr = str;
3828 /* Parse key=value pairs. */
3831 char *dest = NULL, *dest_end;
3832 int key_len, dest_len = 0;
3834 /* Skip whitespace and potential commas. */
3835 while (*ptr && (isspace(*ptr) || *ptr == ','))
3842 if (!(ptr = strchr(key, '=')))
3845 key_len = ptr - key;
3847 callback_get_buf(context, key, key_len, &dest, &dest_len);
3848 dest_end = dest + dest_len - 1;
3852 while (*ptr && *ptr != '\"') {
3856 if (dest && dest < dest_end)
3860 if (dest && dest < dest_end)
3868 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3869 if (dest && dest < dest_end)
3877 int ff_find_stream_index(AVFormatContext *s, int id)
3880 for (i = 0; i < s->nb_streams; i++) {
3881 if (s->streams[i]->id == id)
3887 void ff_make_absolute_url(char *buf, int size, const char *base,
3890 char *sep, *path_query;
3891 /* Absolute path, relative to the current server */
3892 if (base && strstr(base, "://") && rel[0] == '/') {
3894 av_strlcpy(buf, base, size);
3895 sep = strstr(buf, "://");
3897 /* Take scheme from base url */
3898 if (rel[1] == '/') {
3901 /* Take scheme and host from base url */
3903 sep = strchr(sep, '/');
3908 av_strlcat(buf, rel, size);
3911 /* If rel actually is an absolute url, just copy it */
3912 if (!base || strstr(rel, "://") || rel[0] == '/') {
3913 av_strlcpy(buf, rel, size);
3917 av_strlcpy(buf, base, size);
3919 /* Strip off any query string from base */
3920 path_query = strchr(buf, '?');
3921 if (path_query != NULL)
3924 /* Is relative path just a new query part? */
3925 if (rel[0] == '?') {
3926 av_strlcat(buf, rel, size);
3930 /* Remove the file name from the base url */
3931 sep = strrchr(buf, '/');
3936 while (av_strstart(rel, "../", NULL) && sep) {
3937 /* Remove the path delimiter at the end */
3939 sep = strrchr(buf, '/');
3940 /* If the next directory name to pop off is "..", break here */
3941 if (!strcmp(sep ? &sep[1] : buf, "..")) {
3942 /* Readd the slash we just removed */
3943 av_strlcat(buf, "/", size);
3946 /* Cut off the directory name */
3953 av_strlcat(buf, rel, size);
3956 int64_t ff_iso8601_to_unix_time(const char *datestr)
3958 struct tm time1 = {0}, time2 = {0};
3960 ret1 = av_small_strptime(datestr, "%Y - %m - %d %H:%M:%S", &time1);
3961 ret2 = av_small_strptime(datestr, "%Y - %m - %dT%H:%M:%S", &time2);
3963 return av_timegm(&time2);
3965 return av_timegm(&time1);
3968 int avformat_query_codec(AVOutputFormat *ofmt, enum AVCodecID codec_id, int std_compliance)
3971 if (ofmt->query_codec)
3972 return ofmt->query_codec(codec_id, std_compliance);
3973 else if (ofmt->codec_tag)
3974 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
3975 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
3976 codec_id == ofmt->subtitle_codec)
3979 return AVERROR_PATCHWELCOME;
3982 int avformat_network_init(void)
3986 ff_network_inited_globally = 1;
3987 if ((ret = ff_network_init()) < 0)
3994 int avformat_network_deinit(void)
4003 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4004 uint64_t channel_layout, int32_t sample_rate,
4005 int32_t width, int32_t height)
4011 return AVERROR(EINVAL);
4014 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4016 if (channel_layout) {
4018 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4022 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4024 if (width || height) {
4026 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4028 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4030 return AVERROR(ENOMEM);
4031 bytestream_put_le32(&data, flags);
4033 bytestream_put_le32(&data, channels);
4035 bytestream_put_le64(&data, channel_layout);
4037 bytestream_put_le32(&data, sample_rate);
4038 if (width || height) {
4039 bytestream_put_le32(&data, width);
4040 bytestream_put_le32(&data, height);
4045 const struct AVCodecTag *avformat_get_riff_video_tags(void)
4047 return ff_codec_bmp_tags;
4049 const struct AVCodecTag *avformat_get_riff_audio_tags(void)
4051 return ff_codec_wav_tags;
4054 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
4056 AVRational undef = {0, 1};
4057 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
4058 AVRational codec_sample_aspect_ratio = stream && stream->codec ? stream->codec->sample_aspect_ratio : undef;
4059 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
4061 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
4062 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
4063 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
4064 stream_sample_aspect_ratio = undef;
4066 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
4067 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
4068 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
4069 frame_sample_aspect_ratio = undef;
4071 if (stream_sample_aspect_ratio.num)
4072 return stream_sample_aspect_ratio;
4074 return frame_sample_aspect_ratio;
4077 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
4080 if (*spec <= '9' && *spec >= '0') /* opt:index */
4081 return strtol(spec, NULL, 0) == st->index;
4082 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
4083 *spec == 't') { /* opt:[vasdt] */
4084 enum AVMediaType type;
4087 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
4088 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
4089 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
4090 case 'd': type = AVMEDIA_TYPE_DATA; break;
4091 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
4092 default: av_assert0(0);
4094 if (type != st->codec->codec_type)
4096 if (*spec++ == ':') { /* possibly followed by :index */
4097 int i, index = strtol(spec, NULL, 0);
4098 for (i = 0; i < s->nb_streams; i++)
4099 if (s->streams[i]->codec->codec_type == type && index-- == 0)
4100 return i == st->index;
4104 } else if (*spec == 'p' && *(spec + 1) == ':') {
4108 prog_id = strtol(spec, &endptr, 0);
4109 for (i = 0; i < s->nb_programs; i++) {
4110 if (s->programs[i]->id != prog_id)
4113 if (*endptr++ == ':') {
4114 int stream_idx = strtol(endptr, NULL, 0);
4115 return stream_idx >= 0 &&
4116 stream_idx < s->programs[i]->nb_stream_indexes &&
4117 st->index == s->programs[i]->stream_index[stream_idx];
4120 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
4121 if (st->index == s->programs[i]->stream_index[j])
4125 } else if (*spec == '#') {
4128 sid = strtol(spec + 1, &endptr, 0);
4130 return st->id == sid;
4131 } else if (!*spec) /* empty specifier, matches everything */
4134 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
4135 return AVERROR(EINVAL);