2 * various utility functions for use within Libav
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "avio_internal.h"
27 #include "libavcodec/internal.h"
28 #include "libavutil/opt.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/pixdesc.h"
33 #include "libavutil/avstring.h"
35 #include "audiointerleave.h"
50 * various utility functions for use within Libav
53 unsigned avformat_version(void)
55 return LIBAVFORMAT_VERSION_INT;
58 const char *avformat_configuration(void)
60 return LIBAV_CONFIGURATION;
63 const char *avformat_license(void)
65 #define LICENSE_PREFIX "libavformat license: "
66 return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
69 /* fraction handling */
72 * f = val + (num / den) + 0.5.
74 * 'num' is normalized so that it is such as 0 <= num < den.
76 * @param f fractional number
77 * @param val integer value
78 * @param num must be >= 0
79 * @param den must be >= 1
81 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
94 * Fractional addition to f: f = f + (incr / f->den).
96 * @param f fractional number
97 * @param incr increment, can be positive or negative
99 static void av_frac_add(AVFrac *f, int64_t incr)
112 } else if (num >= den) {
119 /** head of registered input format linked list */
120 static AVInputFormat *first_iformat = NULL;
121 /** head of registered output format linked list */
122 static AVOutputFormat *first_oformat = NULL;
124 AVInputFormat *av_iformat_next(AVInputFormat *f)
126 if(f) return f->next;
127 else return first_iformat;
130 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
132 if(f) return f->next;
133 else return first_oformat;
136 void av_register_input_format(AVInputFormat *format)
140 while (*p != NULL) p = &(*p)->next;
145 void av_register_output_format(AVOutputFormat *format)
149 while (*p != NULL) p = &(*p)->next;
154 int av_match_ext(const char *filename, const char *extensions)
162 ext = strrchr(filename, '.');
168 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
171 if (!strcasecmp(ext1, ext))
181 static int match_format(const char *name, const char *names)
189 namelen = strlen(name);
190 while ((p = strchr(names, ','))) {
191 len = FFMAX(p - names, namelen);
192 if (!strncasecmp(name, names, len))
196 return !strcasecmp(name, names);
199 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
200 const char *mime_type)
202 AVOutputFormat *fmt = NULL, *fmt_found;
203 int score_max, score;
205 /* specific test for image sequences */
206 #if CONFIG_IMAGE2_MUXER
207 if (!short_name && filename &&
208 av_filename_number_test(filename) &&
209 ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
210 return av_guess_format("image2", NULL, NULL);
213 /* Find the proper file type. */
216 while ((fmt = av_oformat_next(fmt))) {
218 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
220 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
222 if (filename && fmt->extensions &&
223 av_match_ext(filename, fmt->extensions)) {
226 if (score > score_max) {
234 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
235 const char *filename, const char *mime_type, enum AVMediaType type){
236 if(type == AVMEDIA_TYPE_VIDEO){
237 enum CodecID codec_id= CODEC_ID_NONE;
239 #if CONFIG_IMAGE2_MUXER
240 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
241 codec_id= ff_guess_image2_codec(filename);
244 if(codec_id == CODEC_ID_NONE)
245 codec_id= fmt->video_codec;
247 }else if(type == AVMEDIA_TYPE_AUDIO)
248 return fmt->audio_codec;
249 else if (type == AVMEDIA_TYPE_SUBTITLE)
250 return fmt->subtitle_codec;
252 return CODEC_ID_NONE;
255 AVInputFormat *av_find_input_format(const char *short_name)
257 AVInputFormat *fmt = NULL;
258 while ((fmt = av_iformat_next(fmt))) {
259 if (match_format(short_name, fmt->name))
266 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
268 int ret= av_new_packet(pkt, size);
273 pkt->pos= avio_tell(s);
275 ret= avio_read(s, pkt->data, size);
279 av_shrink_packet(pkt, ret);
284 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
289 return av_get_packet(s, pkt, size);
290 old_size = pkt->size;
291 ret = av_grow_packet(pkt, size);
294 ret = avio_read(s, pkt->data + old_size, size);
295 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
300 int av_filename_number_test(const char *filename)
303 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
306 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
308 AVProbeData lpd = *pd;
309 AVInputFormat *fmt1 = NULL, *fmt;
312 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
313 int id3len = ff_id3v2_tag_len(lpd.buf);
314 if (lpd.buf_size > id3len + 16) {
316 lpd.buf_size -= id3len;
322 while ((fmt1 = av_iformat_next(fmt1))) {
323 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
326 if (fmt1->read_probe) {
327 score = fmt1->read_probe(&lpd);
328 } else if (fmt1->extensions) {
329 if (av_match_ext(lpd.filename, fmt1->extensions)) {
333 if (score > *score_max) {
336 }else if (score == *score_max)
340 /* a hack for files with huge id3v2 tags -- try to guess by file extension. */
341 if (!fmt && id3 && *score_max < AVPROBE_SCORE_MAX/4) {
342 while ((fmt = av_iformat_next(fmt)))
343 if (fmt->extensions && av_match_ext(lpd.filename, fmt->extensions)) {
344 *score_max = AVPROBE_SCORE_MAX/4;
352 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
354 return av_probe_input_format2(pd, is_opened, &score);
357 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
359 static const struct {
360 const char *name; enum CodecID id; enum AVMediaType type;
362 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
363 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
364 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
365 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
366 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
367 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
368 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
369 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
372 AVInputFormat *fmt = av_probe_input_format2(pd, 1, &score);
376 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
377 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
378 for (i = 0; fmt_id_type[i].name; i++) {
379 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
380 st->codec->codec_id = fmt_id_type[i].id;
381 st->codec->codec_type = fmt_id_type[i].type;
389 /************************************************************/
390 /* input media file */
392 #if FF_API_FORMAT_PARAMETERS
393 static AVDictionary *convert_format_parameters(AVFormatParameters *ap)
396 AVDictionary *opts = NULL;
401 if (ap->time_base.num) {
402 snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
403 av_dict_set(&opts, "framerate", buf, 0);
405 if (ap->sample_rate) {
406 snprintf(buf, sizeof(buf), "%d", ap->sample_rate);
407 av_dict_set(&opts, "sample_rate", buf, 0);
410 snprintf(buf, sizeof(buf), "%d", ap->channels);
411 av_dict_set(&opts, "channels", buf, 0);
413 if (ap->width || ap->height) {
414 snprintf(buf, sizeof(buf), "%dx%d", ap->width, ap->height);
415 av_dict_set(&opts, "video_size", buf, 0);
417 if (ap->pix_fmt != PIX_FMT_NONE) {
418 av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(ap->pix_fmt), 0);
421 snprintf(buf, sizeof(buf), "%d", ap->channel);
422 av_dict_set(&opts, "channel", buf, 0);
425 av_dict_set(&opts, "standard", ap->standard, 0);
427 if (ap->mpeg2ts_compute_pcr) {
428 av_dict_set(&opts, "mpeg2ts_compute_pcr", "1", 0);
430 if (ap->initial_pause) {
431 av_dict_set(&opts, "initial_pause", "1", 0);
437 * Open a media file from an IO stream. 'fmt' must be specified.
439 int av_open_input_stream(AVFormatContext **ic_ptr,
440 AVIOContext *pb, const char *filename,
441 AVInputFormat *fmt, AVFormatParameters *ap)
446 AVFormatParameters default_ap;
450 memset(ap, 0, sizeof(default_ap));
452 opts = convert_format_parameters(ap);
454 if(!ap->prealloced_context)
455 ic = avformat_alloc_context();
459 err = AVERROR(ENOMEM);
462 if (pb && fmt && fmt->flags & AVFMT_NOFILE)
463 av_log(ic, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
464 "will be ignored with AVFMT_NOFILE format.\n");
468 if ((err = avformat_open_input(&ic, filename, fmt, &opts)) < 0)
470 ic->pb = ic->pb ? ic->pb : pb; // don't leak custom pb if it wasn't set above
479 /** size of probe buffer, for guessing file type from file contents */
480 #define PROBE_BUF_MIN 2048
481 #define PROBE_BUF_MAX (1<<20)
483 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
484 const char *filename, void *logctx,
485 unsigned int offset, unsigned int max_probe_size)
487 AVProbeData pd = { filename ? filename : "", NULL, -offset };
488 unsigned char *buf = NULL;
489 int ret = 0, probe_size;
491 if (!max_probe_size) {
492 max_probe_size = PROBE_BUF_MAX;
493 } else if (max_probe_size > PROBE_BUF_MAX) {
494 max_probe_size = PROBE_BUF_MAX;
495 } else if (max_probe_size < PROBE_BUF_MIN) {
496 return AVERROR(EINVAL);
499 if (offset >= max_probe_size) {
500 return AVERROR(EINVAL);
503 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt && ret >= 0;
504 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
505 int ret, score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
506 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
508 if (probe_size < offset) {
512 /* read probe data */
513 buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
514 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
515 /* fail if error was not end of file, otherwise, lower score */
516 if (ret != AVERROR_EOF) {
521 ret = 0; /* error was end of file, nothing read */
524 pd.buf = &buf[offset];
526 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
528 /* guess file format */
529 *fmt = av_probe_input_format2(&pd, 1, &score);
531 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
532 av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
534 av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
540 return AVERROR_INVALIDDATA;
543 /* rewind. reuse probe buffer to avoid seeking */
544 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
550 #if FF_API_FORMAT_PARAMETERS
551 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
554 AVFormatParameters *ap)
557 AVDictionary *opts = convert_format_parameters(ap);
559 if (!ap || !ap->prealloced_context)
562 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
569 /* open input file and probe the format if necessary */
570 static int init_input(AVFormatContext *s, const char *filename)
573 AVProbeData pd = {filename, NULL, 0};
576 s->flags |= AVFMT_FLAG_CUSTOM_IO;
578 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
579 else if (s->iformat->flags & AVFMT_NOFILE)
580 return AVERROR(EINVAL);
584 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
585 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
588 if ((ret = avio_open(&s->pb, filename, AVIO_FLAG_READ)) < 0)
592 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
595 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
597 AVFormatContext *s = *ps;
599 AVFormatParameters ap = { 0 };
600 AVDictionary *tmp = NULL;
602 if (!s && !(s = avformat_alloc_context()))
603 return AVERROR(ENOMEM);
608 av_dict_copy(&tmp, *options, 0);
610 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
613 if ((ret = init_input(s, filename)) < 0)
616 /* check filename in case an image number is expected */
617 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
618 if (!av_filename_number_test(filename)) {
619 ret = AVERROR(EINVAL);
624 s->duration = s->start_time = AV_NOPTS_VALUE;
625 av_strlcpy(s->filename, filename, sizeof(s->filename));
627 /* allocate private data */
628 if (s->iformat->priv_data_size > 0) {
629 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
630 ret = AVERROR(ENOMEM);
633 if (s->iformat->priv_class) {
634 *(const AVClass**)s->priv_data = s->iformat->priv_class;
635 av_opt_set_defaults(s->priv_data);
636 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
641 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
643 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
645 if (s->iformat->read_header)
646 if ((ret = s->iformat->read_header(s, &ap)) < 0)
649 if (s->pb && !s->data_offset)
650 s->data_offset = avio_tell(s->pb);
652 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
655 av_dict_free(options);
663 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
665 avformat_free_context(s);
670 /*******************************************************/
672 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
673 AVPacketList **plast_pktl){
674 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
679 (*plast_pktl)->next = pktl;
681 *packet_buffer = pktl;
683 /* add the packet in the buffered packet list */
689 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
695 AVPacketList *pktl = s->raw_packet_buffer;
699 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
700 !s->streams[pkt->stream_index]->probe_packets ||
701 s->raw_packet_buffer_remaining_size < pkt->size){
702 AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
705 s->raw_packet_buffer = pktl->next;
706 s->raw_packet_buffer_remaining_size += pkt->size;
713 ret= s->iformat->read_packet(s, pkt);
715 if (!pktl || ret == AVERROR(EAGAIN))
717 for (i = 0; i < s->nb_streams; i++)
718 s->streams[i]->probe_packets = 0;
721 st= s->streams[pkt->stream_index];
723 switch(st->codec->codec_type){
724 case AVMEDIA_TYPE_VIDEO:
725 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
727 case AVMEDIA_TYPE_AUDIO:
728 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
730 case AVMEDIA_TYPE_SUBTITLE:
731 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
735 if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
739 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
740 s->raw_packet_buffer_remaining_size -= pkt->size;
742 if(st->codec->codec_id == CODEC_ID_PROBE){
743 AVProbeData *pd = &st->probe_data;
744 av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
747 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
748 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
749 pd->buf_size += pkt->size;
750 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
752 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
753 //FIXME we dont reduce score to 0 for the case of running out of buffer space in bytes
754 set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0);
755 if(st->codec->codec_id != CODEC_ID_PROBE){
758 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
765 /**********************************************************/
768 * Get the number of samples of an audio frame. Return -1 on error.
770 static int get_audio_frame_size(AVCodecContext *enc, int size)
774 if(enc->codec_id == CODEC_ID_VORBIS)
777 if (enc->frame_size <= 1) {
778 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
780 if (bits_per_sample) {
781 if (enc->channels == 0)
783 frame_size = (size << 3) / (bits_per_sample * enc->channels);
785 /* used for example by ADPCM codecs */
786 if (enc->bit_rate == 0)
788 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
791 frame_size = enc->frame_size;
798 * Return the frame duration in seconds. Return 0 if not available.
800 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
801 AVCodecParserContext *pc, AVPacket *pkt)
807 switch(st->codec->codec_type) {
808 case AVMEDIA_TYPE_VIDEO:
809 if(st->time_base.num*1000LL > st->time_base.den){
810 *pnum = st->time_base.num;
811 *pden = st->time_base.den;
812 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
813 *pnum = st->codec->time_base.num;
814 *pden = st->codec->time_base.den;
815 if (pc && pc->repeat_pict) {
816 *pnum = (*pnum) * (1 + pc->repeat_pict);
818 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
819 //Thus if we have no parser in such case leave duration undefined.
820 if(st->codec->ticks_per_frame>1 && !pc){
825 case AVMEDIA_TYPE_AUDIO:
826 frame_size = get_audio_frame_size(st->codec, pkt->size);
827 if (frame_size <= 0 || st->codec->sample_rate <= 0)
830 *pden = st->codec->sample_rate;
837 static int is_intra_only(AVCodecContext *enc){
838 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
840 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
841 switch(enc->codec_id){
843 case CODEC_ID_MJPEGB:
845 case CODEC_ID_RAWVIDEO:
846 case CODEC_ID_DVVIDEO:
847 case CODEC_ID_HUFFYUV:
848 case CODEC_ID_FFVHUFF:
853 case CODEC_ID_JPEG2000:
861 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
862 int64_t dts, int64_t pts)
864 AVStream *st= s->streams[stream_index];
865 AVPacketList *pktl= s->packet_buffer;
867 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
870 st->first_dts= dts - st->cur_dts;
873 for(; pktl; pktl= pktl->next){
874 if(pktl->pkt.stream_index != stream_index)
876 //FIXME think more about this check
877 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
878 pktl->pkt.pts += st->first_dts;
880 if(pktl->pkt.dts != AV_NOPTS_VALUE)
881 pktl->pkt.dts += st->first_dts;
883 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
884 st->start_time= pktl->pkt.pts;
886 if (st->start_time == AV_NOPTS_VALUE)
887 st->start_time = pts;
890 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
892 AVPacketList *pktl= s->packet_buffer;
895 if(st->first_dts != AV_NOPTS_VALUE){
896 cur_dts= st->first_dts;
897 for(; pktl; pktl= pktl->next){
898 if(pktl->pkt.stream_index == pkt->stream_index){
899 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
901 cur_dts -= pkt->duration;
904 pktl= s->packet_buffer;
905 st->first_dts = cur_dts;
906 }else if(st->cur_dts)
909 for(; pktl; pktl= pktl->next){
910 if(pktl->pkt.stream_index != pkt->stream_index)
912 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
913 && !pktl->pkt.duration){
914 pktl->pkt.dts= cur_dts;
915 if(!st->codec->has_b_frames)
916 pktl->pkt.pts= cur_dts;
917 cur_dts += pkt->duration;
918 pktl->pkt.duration= pkt->duration;
922 if(st->first_dts == AV_NOPTS_VALUE)
923 st->cur_dts= cur_dts;
926 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
927 AVCodecParserContext *pc, AVPacket *pkt)
929 int num, den, presentation_delayed, delay, i;
932 if (s->flags & AVFMT_FLAG_NOFILLIN)
935 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
936 pkt->dts= AV_NOPTS_VALUE;
938 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
939 //FIXME Set low_delay = 0 when has_b_frames = 1
940 st->codec->has_b_frames = 1;
942 /* do we have a video B-frame ? */
943 delay= st->codec->has_b_frames;
944 presentation_delayed = 0;
946 // ignore delay caused by frame threading so that the mpeg2-without-dts
947 // warning will not trigger
948 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
949 delay -= st->codec->thread_count-1;
951 /* XXX: need has_b_frame, but cannot get it if the codec is
954 pc && pc->pict_type != AV_PICTURE_TYPE_B)
955 presentation_delayed = 1;
957 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
958 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
959 pkt->dts -= 1LL<<st->pts_wrap_bits;
962 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
963 // we take the conservative approach and discard both
964 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
965 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
966 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
967 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
970 if (pkt->duration == 0) {
971 compute_frame_duration(&num, &den, st, pc, pkt);
973 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
975 if(pkt->duration != 0 && s->packet_buffer)
976 update_initial_durations(s, st, pkt);
980 /* correct timestamps with byte offset if demuxers only have timestamps
981 on packet boundaries */
982 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
983 /* this will estimate bitrate based on this frame's duration and size */
984 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
985 if(pkt->pts != AV_NOPTS_VALUE)
987 if(pkt->dts != AV_NOPTS_VALUE)
991 if (pc && pc->dts_sync_point >= 0) {
992 // we have synchronization info from the parser
993 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
995 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
996 if (pkt->dts != AV_NOPTS_VALUE) {
997 // got DTS from the stream, update reference timestamp
998 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
999 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1000 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1001 // compute DTS based on reference timestamp
1002 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1003 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1005 if (pc->dts_sync_point > 0)
1006 st->reference_dts = pkt->dts; // new reference
1010 /* This may be redundant, but it should not hurt. */
1011 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1012 presentation_delayed = 1;
1014 // av_log(NULL, AV_LOG_DEBUG, "IN delayed:%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64" st:%d pc:%p\n", presentation_delayed, pkt->pts, pkt->dts, st->cur_dts, pkt->stream_index, pc);
1015 /* interpolate PTS and DTS if they are not present */
1016 //We skip H264 currently because delay and has_b_frames are not reliably set
1017 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1018 if (presentation_delayed) {
1019 /* DTS = decompression timestamp */
1020 /* PTS = presentation timestamp */
1021 if (pkt->dts == AV_NOPTS_VALUE)
1022 pkt->dts = st->last_IP_pts;
1023 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1024 if (pkt->dts == AV_NOPTS_VALUE)
1025 pkt->dts = st->cur_dts;
1027 /* this is tricky: the dts must be incremented by the duration
1028 of the frame we are displaying, i.e. the last I- or P-frame */
1029 if (st->last_IP_duration == 0)
1030 st->last_IP_duration = pkt->duration;
1031 if(pkt->dts != AV_NOPTS_VALUE)
1032 st->cur_dts = pkt->dts + st->last_IP_duration;
1033 st->last_IP_duration = pkt->duration;
1034 st->last_IP_pts= pkt->pts;
1035 /* cannot compute PTS if not present (we can compute it only
1036 by knowing the future */
1037 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1038 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1039 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1040 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1041 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1042 pkt->pts += pkt->duration;
1043 // av_log(NULL, AV_LOG_DEBUG, "id:%d old:%"PRId64" new:%"PRId64" dur:%d cur:%"PRId64" size:%d\n", pkt->stream_index, old_diff, new_diff, pkt->duration, st->cur_dts, pkt->size);
1047 /* presentation is not delayed : PTS and DTS are the same */
1048 if(pkt->pts == AV_NOPTS_VALUE)
1049 pkt->pts = pkt->dts;
1050 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1051 if(pkt->pts == AV_NOPTS_VALUE)
1052 pkt->pts = st->cur_dts;
1053 pkt->dts = pkt->pts;
1054 if(pkt->pts != AV_NOPTS_VALUE)
1055 st->cur_dts = pkt->pts + pkt->duration;
1059 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1060 st->pts_buffer[0]= pkt->pts;
1061 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1062 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1063 if(pkt->dts == AV_NOPTS_VALUE)
1064 pkt->dts= st->pts_buffer[0];
1065 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1066 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1068 if(pkt->dts > st->cur_dts)
1069 st->cur_dts = pkt->dts;
1072 // av_log(NULL, AV_LOG_ERROR, "OUTdelayed:%d/%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64"\n", presentation_delayed, delay, pkt->pts, pkt->dts, st->cur_dts);
1075 if(is_intra_only(st->codec))
1076 pkt->flags |= AV_PKT_FLAG_KEY;
1079 /* keyframe computation */
1080 if (pc->key_frame == 1)
1081 pkt->flags |= AV_PKT_FLAG_KEY;
1082 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1083 pkt->flags |= AV_PKT_FLAG_KEY;
1086 pkt->convergence_duration = pc->convergence_duration;
1090 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1095 av_init_packet(pkt);
1098 /* select current input stream component */
1101 if (!st->need_parsing || !st->parser) {
1102 /* no parsing needed: we just output the packet as is */
1103 /* raw data support */
1104 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
1105 compute_pkt_fields(s, st, NULL, pkt);
1107 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1108 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1109 ff_reduce_index(s, st->index);
1110 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1113 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1114 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1115 st->cur_ptr, st->cur_len,
1116 st->cur_pkt.pts, st->cur_pkt.dts,
1118 st->cur_pkt.pts = AV_NOPTS_VALUE;
1119 st->cur_pkt.dts = AV_NOPTS_VALUE;
1120 /* increment read pointer */
1124 /* return packet if any */
1128 pkt->stream_index = st->index;
1129 pkt->pts = st->parser->pts;
1130 pkt->dts = st->parser->dts;
1131 pkt->pos = st->parser->pos;
1132 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1134 pkt->destruct= st->cur_pkt.destruct;
1135 st->cur_pkt.destruct= NULL;
1136 st->cur_pkt.data = NULL;
1137 assert(st->cur_len == 0);
1139 pkt->destruct = NULL;
1141 compute_pkt_fields(s, st, st->parser, pkt);
1143 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1144 ff_reduce_index(s, st->index);
1145 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1146 0, 0, AVINDEX_KEYFRAME);
1153 av_free_packet(&st->cur_pkt);
1158 /* read next packet */
1159 ret = av_read_packet(s, &cur_pkt);
1161 if (ret == AVERROR(EAGAIN))
1163 /* return the last frames, if any */
1164 for(i = 0; i < s->nb_streams; i++) {
1166 if (st->parser && st->need_parsing) {
1167 av_parser_parse2(st->parser, st->codec,
1168 &pkt->data, &pkt->size,
1170 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1176 /* no more packets: really terminate parsing */
1179 st = s->streams[cur_pkt.stream_index];
1180 st->cur_pkt= cur_pkt;
1182 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1183 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1184 st->cur_pkt.pts < st->cur_pkt.dts){
1185 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1186 st->cur_pkt.stream_index,
1190 // av_free_packet(&st->cur_pkt);
1194 if(s->debug & FF_FDEBUG_TS)
1195 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1196 st->cur_pkt.stream_index,
1200 st->cur_pkt.duration,
1204 st->cur_ptr = st->cur_pkt.data;
1205 st->cur_len = st->cur_pkt.size;
1206 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1207 st->parser = av_parser_init(st->codec->codec_id);
1209 /* no parser available: just output the raw packets */
1210 st->need_parsing = AVSTREAM_PARSE_NONE;
1211 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1212 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1213 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1214 st->parser->flags |= PARSER_FLAG_ONCE;
1219 if(s->debug & FF_FDEBUG_TS)
1220 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1231 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1235 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1238 pktl = s->packet_buffer;
1240 AVPacket *next_pkt= &pktl->pkt;
1242 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1243 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1244 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1245 if( pktl->pkt.stream_index == next_pkt->stream_index
1246 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1247 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1248 next_pkt->pts= pktl->pkt.dts;
1252 pktl = s->packet_buffer;
1255 if( next_pkt->pts != AV_NOPTS_VALUE
1256 || next_pkt->dts == AV_NOPTS_VALUE
1258 /* read packet from packet buffer, if there is data */
1260 s->packet_buffer = pktl->next;
1266 int ret= av_read_frame_internal(s, pkt);
1268 if(pktl && ret != AVERROR(EAGAIN)){
1275 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1276 &s->packet_buffer_end)) < 0)
1277 return AVERROR(ENOMEM);
1279 assert(!s->packet_buffer);
1280 return av_read_frame_internal(s, pkt);
1285 /* XXX: suppress the packet queue */
1286 static void flush_packet_queue(AVFormatContext *s)
1291 pktl = s->packet_buffer;
1294 s->packet_buffer = pktl->next;
1295 av_free_packet(&pktl->pkt);
1298 while(s->raw_packet_buffer){
1299 pktl = s->raw_packet_buffer;
1300 s->raw_packet_buffer = pktl->next;
1301 av_free_packet(&pktl->pkt);
1304 s->packet_buffer_end=
1305 s->raw_packet_buffer_end= NULL;
1306 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1309 /*******************************************************/
1312 int av_find_default_stream_index(AVFormatContext *s)
1314 int first_audio_index = -1;
1318 if (s->nb_streams <= 0)
1320 for(i = 0; i < s->nb_streams; i++) {
1322 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1325 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1326 first_audio_index = i;
1328 return first_audio_index >= 0 ? first_audio_index : 0;
1332 * Flush the frame reader.
1334 void ff_read_frame_flush(AVFormatContext *s)
1339 flush_packet_queue(s);
1343 /* for each stream, reset read state */
1344 for(i = 0; i < s->nb_streams; i++) {
1348 av_parser_close(st->parser);
1350 av_free_packet(&st->cur_pkt);
1352 st->last_IP_pts = AV_NOPTS_VALUE;
1353 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1354 st->reference_dts = AV_NOPTS_VALUE;
1359 st->probe_packets = MAX_PROBE_PACKETS;
1361 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1362 st->pts_buffer[j]= AV_NOPTS_VALUE;
1366 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1369 for(i = 0; i < s->nb_streams; i++) {
1370 AVStream *st = s->streams[i];
1372 st->cur_dts = av_rescale(timestamp,
1373 st->time_base.den * (int64_t)ref_st->time_base.num,
1374 st->time_base.num * (int64_t)ref_st->time_base.den);
1378 void ff_reduce_index(AVFormatContext *s, int stream_index)
1380 AVStream *st= s->streams[stream_index];
1381 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1383 if((unsigned)st->nb_index_entries >= max_entries){
1385 for(i=0; 2*i<st->nb_index_entries; i++)
1386 st->index_entries[i]= st->index_entries[2*i];
1387 st->nb_index_entries= i;
1391 int ff_add_index_entry(AVIndexEntry **index_entries,
1392 int *nb_index_entries,
1393 unsigned int *index_entries_allocated_size,
1394 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1396 AVIndexEntry *entries, *ie;
1399 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1402 entries = av_fast_realloc(*index_entries,
1403 index_entries_allocated_size,
1404 (*nb_index_entries + 1) *
1405 sizeof(AVIndexEntry));
1409 *index_entries= entries;
1411 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1414 index= (*nb_index_entries)++;
1415 ie= &entries[index];
1416 assert(index==0 || ie[-1].timestamp < timestamp);
1418 ie= &entries[index];
1419 if(ie->timestamp != timestamp){
1420 if(ie->timestamp <= timestamp)
1422 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1423 (*nb_index_entries)++;
1424 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1425 distance= ie->min_distance;
1429 ie->timestamp = timestamp;
1430 ie->min_distance= distance;
1437 int av_add_index_entry(AVStream *st,
1438 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1440 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1441 &st->index_entries_allocated_size, pos,
1442 timestamp, size, distance, flags);
1445 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1446 int64_t wanted_timestamp, int flags)
1454 //optimize appending index entries at the end
1455 if(b && entries[b-1].timestamp < wanted_timestamp)
1460 timestamp = entries[m].timestamp;
1461 if(timestamp >= wanted_timestamp)
1463 if(timestamp <= wanted_timestamp)
1466 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1468 if(!(flags & AVSEEK_FLAG_ANY)){
1469 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1470 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1479 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1482 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1483 wanted_timestamp, flags);
1486 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1487 AVInputFormat *avif= s->iformat;
1488 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1489 int64_t ts_min, ts_max, ts;
1494 if (stream_index < 0)
1497 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1500 ts_min= AV_NOPTS_VALUE;
1501 pos_limit= -1; //gcc falsely says it may be uninitialized
1503 st= s->streams[stream_index];
1504 if(st->index_entries){
1507 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()
1508 index= FFMAX(index, 0);
1509 e= &st->index_entries[index];
1511 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1513 ts_min= e->timestamp;
1514 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1520 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1521 assert(index < st->nb_index_entries);
1523 e= &st->index_entries[index];
1524 assert(e->timestamp >= target_ts);
1526 ts_max= e->timestamp;
1527 pos_limit= pos_max - e->min_distance;
1528 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1529 pos_max,pos_limit, ts_max);
1533 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1538 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1541 av_update_cur_dts(s, st, ts);
1546 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, int64_t pos_min, int64_t pos_max, int64_t pos_limit, int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret, int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t )){
1548 int64_t start_pos, filesize;
1551 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1553 if(ts_min == AV_NOPTS_VALUE){
1554 pos_min = s->data_offset;
1555 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1556 if (ts_min == AV_NOPTS_VALUE)
1560 if(ts_max == AV_NOPTS_VALUE){
1562 filesize = avio_size(s->pb);
1563 pos_max = filesize - 1;
1566 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1568 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1569 if (ts_max == AV_NOPTS_VALUE)
1573 int64_t tmp_pos= pos_max + 1;
1574 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1575 if(tmp_ts == AV_NOPTS_VALUE)
1579 if(tmp_pos >= filesize)
1585 if(ts_min > ts_max){
1587 }else if(ts_min == ts_max){
1592 while (pos_min < pos_limit) {
1593 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1594 pos_min, pos_max, ts_min, ts_max);
1595 assert(pos_limit <= pos_max);
1598 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1599 // interpolate position (better than dichotomy)
1600 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1601 + pos_min - approximate_keyframe_distance;
1602 }else if(no_change==1){
1603 // bisection, if interpolation failed to change min or max pos last time
1604 pos = (pos_min + pos_limit)>>1;
1606 /* linear search if bisection failed, can only happen if there
1607 are very few or no keyframes between min/max */
1612 else if(pos > pos_limit)
1616 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1621 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1622 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1623 pos_limit, start_pos, no_change);
1624 if(ts == AV_NOPTS_VALUE){
1625 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1628 assert(ts != AV_NOPTS_VALUE);
1629 if (target_ts <= ts) {
1630 pos_limit = start_pos - 1;
1634 if (target_ts >= ts) {
1640 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1641 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1643 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1645 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1646 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1647 pos, ts_min, target_ts, ts_max);
1652 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1653 int64_t pos_min, pos_max;
1657 if (stream_index < 0)
1660 st= s->streams[stream_index];
1663 pos_min = s->data_offset;
1664 pos_max = avio_size(s->pb) - 1;
1666 if (pos < pos_min) pos= pos_min;
1667 else if(pos > pos_max) pos= pos_max;
1669 avio_seek(s->pb, pos, SEEK_SET);
1672 av_update_cur_dts(s, st, ts);
1677 static int av_seek_frame_generic(AVFormatContext *s,
1678 int stream_index, int64_t timestamp, int flags)
1685 st = s->streams[stream_index];
1687 index = av_index_search_timestamp(st, timestamp, flags);
1689 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1692 if(index < 0 || index==st->nb_index_entries-1){
1696 if(st->nb_index_entries){
1697 assert(st->index_entries);
1698 ie= &st->index_entries[st->nb_index_entries-1];
1699 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1701 av_update_cur_dts(s, st, ie->timestamp);
1703 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1709 ret = av_read_frame(s, &pkt);
1710 }while(ret == AVERROR(EAGAIN));
1713 av_free_packet(&pkt);
1714 if(stream_index == pkt.stream_index){
1715 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1719 index = av_index_search_timestamp(st, timestamp, flags);
1724 ff_read_frame_flush(s);
1725 if (s->iformat->read_seek){
1726 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1729 ie = &st->index_entries[index];
1730 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1732 av_update_cur_dts(s, st, ie->timestamp);
1737 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1742 ff_read_frame_flush(s);
1744 if(flags & AVSEEK_FLAG_BYTE)
1745 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1747 if(stream_index < 0){
1748 stream_index= av_find_default_stream_index(s);
1749 if(stream_index < 0)
1752 st= s->streams[stream_index];
1753 /* timestamp for default must be expressed in AV_TIME_BASE units */
1754 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1757 /* first, we try the format specific seek */
1758 if (s->iformat->read_seek)
1759 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1766 if(s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH))
1767 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1768 else if (!(s->iformat->flags & AVFMT_NOGENSEARCH))
1769 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1774 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1776 if(min_ts > ts || max_ts < ts)
1779 ff_read_frame_flush(s);
1781 if (s->iformat->read_seek2)
1782 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1784 if(s->iformat->read_timestamp){
1785 //try to seek via read_timestamp()
1788 //Fallback to old API if new is not implemented but old is
1789 //Note the old has somewat different sematics
1790 if(s->iformat->read_seek || 1)
1791 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1793 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1796 /*******************************************************/
1799 * Return TRUE if the stream has accurate duration in any stream.
1801 * @return TRUE if the stream has accurate duration for at least one component.
1803 static int av_has_duration(AVFormatContext *ic)
1808 for(i = 0;i < ic->nb_streams; i++) {
1809 st = ic->streams[i];
1810 if (st->duration != AV_NOPTS_VALUE)
1817 * Estimate the stream timings from the one of each components.
1819 * Also computes the global bitrate if possible.
1821 static void av_update_stream_timings(AVFormatContext *ic)
1823 int64_t start_time, start_time1, end_time, end_time1;
1824 int64_t duration, duration1;
1828 start_time = INT64_MAX;
1829 end_time = INT64_MIN;
1830 duration = INT64_MIN;
1831 for(i = 0;i < ic->nb_streams; i++) {
1832 st = ic->streams[i];
1833 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1834 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1835 if (start_time1 < start_time)
1836 start_time = start_time1;
1837 if (st->duration != AV_NOPTS_VALUE) {
1838 end_time1 = start_time1
1839 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1840 if (end_time1 > end_time)
1841 end_time = end_time1;
1844 if (st->duration != AV_NOPTS_VALUE) {
1845 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1846 if (duration1 > duration)
1847 duration = duration1;
1850 if (start_time != INT64_MAX) {
1851 ic->start_time = start_time;
1852 if (end_time != INT64_MIN) {
1853 if (end_time - start_time > duration)
1854 duration = end_time - start_time;
1857 if (duration != INT64_MIN) {
1858 ic->duration = duration;
1859 if (ic->file_size > 0) {
1860 /* compute the bitrate */
1861 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1862 (double)ic->duration;
1867 static void fill_all_stream_timings(AVFormatContext *ic)
1872 av_update_stream_timings(ic);
1873 for(i = 0;i < ic->nb_streams; i++) {
1874 st = ic->streams[i];
1875 if (st->start_time == AV_NOPTS_VALUE) {
1876 if(ic->start_time != AV_NOPTS_VALUE)
1877 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1878 if(ic->duration != AV_NOPTS_VALUE)
1879 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1884 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1886 int64_t filesize, duration;
1890 /* if bit_rate is already set, we believe it */
1891 if (ic->bit_rate <= 0) {
1893 for(i=0;i<ic->nb_streams;i++) {
1894 st = ic->streams[i];
1895 if (st->codec->bit_rate > 0)
1896 bit_rate += st->codec->bit_rate;
1898 ic->bit_rate = bit_rate;
1901 /* if duration is already set, we believe it */
1902 if (ic->duration == AV_NOPTS_VALUE &&
1903 ic->bit_rate != 0 &&
1904 ic->file_size != 0) {
1905 filesize = ic->file_size;
1907 for(i = 0; i < ic->nb_streams; i++) {
1908 st = ic->streams[i];
1909 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1910 if (st->duration == AV_NOPTS_VALUE)
1911 st->duration = duration;
1917 #define DURATION_MAX_READ_SIZE 250000
1918 #define DURATION_MAX_RETRY 3
1920 /* only usable for MPEG-PS streams */
1921 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1923 AVPacket pkt1, *pkt = &pkt1;
1925 int read_size, i, ret;
1927 int64_t filesize, offset, duration;
1932 /* flush packet queue */
1933 flush_packet_queue(ic);
1935 for (i=0; i<ic->nb_streams; i++) {
1936 st = ic->streams[i];
1937 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1938 av_log(st->codec, AV_LOG_WARNING, "start time is not set in av_estimate_timings_from_pts\n");
1941 av_parser_close(st->parser);
1943 av_free_packet(&st->cur_pkt);
1947 /* estimate the end time (duration) */
1948 /* XXX: may need to support wrapping */
1949 filesize = ic->file_size;
1950 end_time = AV_NOPTS_VALUE;
1952 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
1956 avio_seek(ic->pb, offset, SEEK_SET);
1959 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
1963 ret = av_read_packet(ic, pkt);
1964 }while(ret == AVERROR(EAGAIN));
1967 read_size += pkt->size;
1968 st = ic->streams[pkt->stream_index];
1969 if (pkt->pts != AV_NOPTS_VALUE &&
1970 (st->start_time != AV_NOPTS_VALUE ||
1971 st->first_dts != AV_NOPTS_VALUE)) {
1972 duration = end_time = pkt->pts;
1973 if (st->start_time != AV_NOPTS_VALUE) duration -= st->start_time;
1974 else duration -= st->first_dts;
1976 duration += 1LL<<st->pts_wrap_bits;
1978 if (st->duration == AV_NOPTS_VALUE ||
1979 st->duration < duration)
1980 st->duration = duration;
1983 av_free_packet(pkt);
1985 }while( end_time==AV_NOPTS_VALUE
1986 && filesize > (DURATION_MAX_READ_SIZE<<retry)
1987 && ++retry <= DURATION_MAX_RETRY);
1989 fill_all_stream_timings(ic);
1991 avio_seek(ic->pb, old_offset, SEEK_SET);
1992 for (i=0; i<ic->nb_streams; i++) {
1994 st->cur_dts= st->first_dts;
1995 st->last_IP_pts = AV_NOPTS_VALUE;
1996 st->reference_dts = AV_NOPTS_VALUE;
2000 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
2004 /* get the file size, if possible */
2005 if (ic->iformat->flags & AVFMT_NOFILE) {
2008 file_size = avio_size(ic->pb);
2012 ic->file_size = file_size;
2014 if ((!strcmp(ic->iformat->name, "mpeg") ||
2015 !strcmp(ic->iformat->name, "mpegts")) &&
2016 file_size && ic->pb->seekable) {
2017 /* get accurate estimate from the PTSes */
2018 av_estimate_timings_from_pts(ic, old_offset);
2019 } else if (av_has_duration(ic)) {
2020 /* at least one component has timings - we use them for all
2022 fill_all_stream_timings(ic);
2024 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2025 /* less precise: use bitrate info */
2026 av_estimate_timings_from_bit_rate(ic);
2028 av_update_stream_timings(ic);
2032 AVStream av_unused *st;
2033 for(i = 0;i < ic->nb_streams; i++) {
2034 st = ic->streams[i];
2035 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2036 (double) st->start_time / AV_TIME_BASE,
2037 (double) st->duration / AV_TIME_BASE);
2039 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2040 (double) ic->start_time / AV_TIME_BASE,
2041 (double) ic->duration / AV_TIME_BASE,
2042 ic->bit_rate / 1000);
2046 static int has_codec_parameters(AVCodecContext *enc)
2049 switch(enc->codec_type) {
2050 case AVMEDIA_TYPE_AUDIO:
2051 val = enc->sample_rate && enc->channels && enc->sample_fmt != AV_SAMPLE_FMT_NONE;
2052 if(!enc->frame_size &&
2053 (enc->codec_id == CODEC_ID_VORBIS ||
2054 enc->codec_id == CODEC_ID_AAC ||
2055 enc->codec_id == CODEC_ID_MP1 ||
2056 enc->codec_id == CODEC_ID_MP2 ||
2057 enc->codec_id == CODEC_ID_MP3 ||
2058 enc->codec_id == CODEC_ID_SPEEX))
2061 case AVMEDIA_TYPE_VIDEO:
2062 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
2068 return enc->codec_id != CODEC_ID_NONE && val != 0;
2071 static int has_decode_delay_been_guessed(AVStream *st)
2073 return st->codec->codec_id != CODEC_ID_H264 ||
2074 st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2077 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
2081 int got_picture, data_size, ret=0;
2084 if(!st->codec->codec){
2085 codec = avcodec_find_decoder(st->codec->codec_id);
2088 ret = avcodec_open(st->codec, codec);
2093 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st)){
2094 switch(st->codec->codec_type) {
2095 case AVMEDIA_TYPE_VIDEO:
2096 avcodec_get_frame_defaults(&picture);
2097 ret = avcodec_decode_video2(st->codec, &picture,
2098 &got_picture, avpkt);
2100 case AVMEDIA_TYPE_AUDIO:
2101 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2102 samples = av_malloc(data_size);
2105 ret = avcodec_decode_audio3(st->codec, samples,
2117 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2119 while (tags->id != CODEC_ID_NONE) {
2127 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2130 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2131 if(tag == tags[i].tag)
2134 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2135 if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2138 return CODEC_ID_NONE;
2141 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2144 for(i=0; tags && tags[i]; i++){
2145 int tag= ff_codec_get_tag(tags[i], id);
2151 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2154 for(i=0; tags && tags[i]; i++){
2155 enum CodecID id= ff_codec_get_id(tags[i], tag);
2156 if(id!=CODEC_ID_NONE) return id;
2158 return CODEC_ID_NONE;
2161 static void compute_chapters_end(AVFormatContext *s)
2164 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2166 for (i = 0; i < s->nb_chapters; i++)
2167 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2168 AVChapter *ch = s->chapters[i];
2169 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2172 for (j = 0; j < s->nb_chapters; j++) {
2173 AVChapter *ch1 = s->chapters[j];
2174 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2175 if (j != i && next_start > ch->start && next_start < end)
2178 ch->end = (end == INT64_MAX) ? ch->start : end;
2182 static int get_std_framerate(int i){
2183 if(i<60*12) return i*1001;
2184 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2188 * Is the time base unreliable.
2189 * This is a heuristic to balance between quick acceptance of the values in
2190 * the headers vs. some extra checks.
2191 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2192 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2193 * And there are "variable" fps files this needs to detect as well.
2195 static int tb_unreliable(AVCodecContext *c){
2196 if( c->time_base.den >= 101L*c->time_base.num
2197 || c->time_base.den < 5L*c->time_base.num
2198 /* || c->codec_tag == AV_RL32("DIVX")
2199 || c->codec_tag == AV_RL32("XVID")*/
2200 || c->codec_id == CODEC_ID_MPEG2VIDEO
2201 || c->codec_id == CODEC_ID_H264
2207 int av_find_stream_info(AVFormatContext *ic)
2209 int i, count, ret, read_size, j;
2211 AVPacket pkt1, *pkt;
2212 int64_t old_offset = avio_tell(ic->pb);
2214 for(i=0;i<ic->nb_streams;i++) {
2216 st = ic->streams[i];
2217 if (st->codec->codec_id == CODEC_ID_AAC) {
2218 st->codec->sample_rate = 0;
2219 st->codec->frame_size = 0;
2220 st->codec->channels = 0;
2222 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2223 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2224 /* if(!st->time_base.num)
2226 if(!st->codec->time_base.num)
2227 st->codec->time_base= st->time_base;
2229 //only for the split stuff
2230 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2231 st->parser = av_parser_init(st->codec->codec_id);
2232 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2233 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2236 assert(!st->codec->codec);
2237 codec = avcodec_find_decoder(st->codec->codec_id);
2239 /* Force decoding of at least one frame of codec data
2240 * this makes sure the codec initializes the channel configuration
2241 * and does not trust the values from the container.
2243 if (codec && codec->capabilities & CODEC_CAP_CHANNEL_CONF)
2244 st->codec->channels = 0;
2246 /* Ensure that subtitle_header is properly set. */
2247 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2248 && codec && !st->codec->codec)
2249 avcodec_open(st->codec, codec);
2251 //try to just open decoders, in case this is enough to get parameters
2252 if(!has_codec_parameters(st->codec)){
2253 if (codec && !st->codec->codec)
2254 avcodec_open(st->codec, codec);
2258 for (i=0; i<ic->nb_streams; i++) {
2259 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2265 if(url_interrupt_cb()){
2267 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2271 /* check if one codec still needs to be handled */
2272 for(i=0;i<ic->nb_streams;i++) {
2273 int fps_analyze_framecount = 20;
2275 st = ic->streams[i];
2276 if (!has_codec_parameters(st->codec))
2278 /* if the timebase is coarse (like the usual millisecond precision
2279 of mkv), we need to analyze more frames to reliably arrive at
2281 if (av_q2d(st->time_base) > 0.0005)
2282 fps_analyze_framecount *= 2;
2283 if (ic->fps_probe_size >= 0)
2284 fps_analyze_framecount = ic->fps_probe_size;
2285 /* variable fps and no guess at the real fps */
2286 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2287 && st->info->duration_count < fps_analyze_framecount
2288 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2290 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2292 if(st->first_dts == AV_NOPTS_VALUE)
2295 if (i == ic->nb_streams) {
2296 /* NOTE: if the format has no header, then we need to read
2297 some packets to get most of the streams, so we cannot
2299 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2300 /* if we found the info for all the codecs, we can stop */
2302 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2306 /* we did not get all the codec info, but we read too much data */
2307 if (read_size >= ic->probesize) {
2309 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2313 /* NOTE: a new stream can be added there if no header in file
2314 (AVFMTCTX_NOHEADER) */
2315 ret = av_read_frame_internal(ic, &pkt1);
2316 if (ret < 0 && ret != AVERROR(EAGAIN)) {
2318 ret = -1; /* we could not have all the codec parameters before EOF */
2319 for(i=0;i<ic->nb_streams;i++) {
2320 st = ic->streams[i];
2321 if (!has_codec_parameters(st->codec)){
2323 avcodec_string(buf, sizeof(buf), st->codec, 0);
2324 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2332 if (ret == AVERROR(EAGAIN))
2335 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2336 if ((ret = av_dup_packet(pkt)) < 0)
2337 goto find_stream_info_err;
2339 read_size += pkt->size;
2341 st = ic->streams[pkt->stream_index];
2342 if (st->codec_info_nb_frames>1) {
2343 if (st->time_base.den > 0 && av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
2344 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2347 st->info->codec_info_duration += pkt->duration;
2350 int64_t last = st->info->last_dts;
2351 int64_t duration= pkt->dts - last;
2353 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2354 double dur= duration * av_q2d(st->time_base);
2356 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2357 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2358 if (st->info->duration_count < 2)
2359 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2360 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2361 int framerate= get_std_framerate(i);
2362 int ticks= lrintf(dur*framerate/(1001*12));
2363 double error= dur - ticks*1001*12/(double)framerate;
2364 st->info->duration_error[i] += error*error;
2366 st->info->duration_count++;
2367 // ignore the first 4 values, they might have some random jitter
2368 if (st->info->duration_count > 3)
2369 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2371 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2372 st->info->last_dts = pkt->dts;
2374 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2375 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2377 st->codec->extradata_size= i;
2378 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2379 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2380 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2384 /* if still no information, we try to open the codec and to
2385 decompress the frame. We try to avoid that in most cases as
2386 it takes longer and uses more memory. For MPEG-4, we need to
2387 decompress for QuickTime. */
2388 if (!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st))
2389 try_decode_frame(st, pkt);
2391 st->codec_info_nb_frames++;
2395 // close codecs which were opened in try_decode_frame()
2396 for(i=0;i<ic->nb_streams;i++) {
2397 st = ic->streams[i];
2398 if(st->codec->codec)
2399 avcodec_close(st->codec);
2401 for(i=0;i<ic->nb_streams;i++) {
2402 st = ic->streams[i];
2403 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2404 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2405 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2406 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2407 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2408 // the check for tb_unreliable() is not completely correct, since this is not about handling
2409 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2410 // ipmovie.c produces.
2411 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > 1 && !st->r_frame_rate.num)
2412 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);
2413 if (st->info->duration_count && !st->r_frame_rate.num
2414 && tb_unreliable(st->codec) /*&&
2415 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2416 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2418 double best_error= 2*av_q2d(st->time_base);
2419 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2421 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2422 double error = st->info->duration_error[j] * get_std_framerate(j);
2423 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2424 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2425 if(error < best_error){
2427 num = get_std_framerate(j);
2430 // do not increase frame rate by more than 1 % in order to match a standard rate.
2431 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2432 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2435 if (!st->r_frame_rate.num){
2436 if( st->codec->time_base.den * (int64_t)st->time_base.num
2437 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2438 st->r_frame_rate.num = st->codec->time_base.den;
2439 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2441 st->r_frame_rate.num = st->time_base.den;
2442 st->r_frame_rate.den = st->time_base.num;
2445 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2446 if(!st->codec->bits_per_coded_sample)
2447 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2448 // set stream disposition based on audio service type
2449 switch (st->codec->audio_service_type) {
2450 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2451 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2452 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2453 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2454 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2455 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2456 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2457 st->disposition = AV_DISPOSITION_COMMENT; break;
2458 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2459 st->disposition = AV_DISPOSITION_KARAOKE; break;
2464 av_estimate_timings(ic, old_offset);
2466 compute_chapters_end(ic);
2469 /* correct DTS for B-frame streams with no timestamps */
2470 for(i=0;i<ic->nb_streams;i++) {
2471 st = ic->streams[i];
2472 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2474 ppktl = &ic->packet_buffer;
2476 if(ppkt1->stream_index != i)
2478 if(ppkt1->pkt->dts < 0)
2480 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2482 ppkt1->pkt->dts -= delta;
2487 st->cur_dts -= delta;
2493 find_stream_info_err:
2494 for (i=0; i < ic->nb_streams; i++)
2495 av_freep(&ic->streams[i]->info);
2499 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2503 for (i = 0; i < ic->nb_programs; i++)
2504 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2505 if (ic->programs[i]->stream_index[j] == s)
2506 return ic->programs[i];
2510 int av_find_best_stream(AVFormatContext *ic,
2511 enum AVMediaType type,
2512 int wanted_stream_nb,
2514 AVCodec **decoder_ret,
2517 int i, nb_streams = ic->nb_streams;
2518 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2519 unsigned *program = NULL;
2520 AVCodec *decoder = NULL, *best_decoder = NULL;
2522 if (related_stream >= 0 && wanted_stream_nb < 0) {
2523 AVProgram *p = find_program_from_stream(ic, related_stream);
2525 program = p->stream_index;
2526 nb_streams = p->nb_stream_indexes;
2529 for (i = 0; i < nb_streams; i++) {
2530 int real_stream_index = program ? program[i] : i;
2531 AVStream *st = ic->streams[real_stream_index];
2532 AVCodecContext *avctx = st->codec;
2533 if (avctx->codec_type != type)
2535 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2537 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2540 decoder = avcodec_find_decoder(st->codec->codec_id);
2543 ret = AVERROR_DECODER_NOT_FOUND;
2547 if (best_count >= st->codec_info_nb_frames)
2549 best_count = st->codec_info_nb_frames;
2550 ret = real_stream_index;
2551 best_decoder = decoder;
2552 if (program && i == nb_streams - 1 && ret < 0) {
2554 nb_streams = ic->nb_streams;
2555 i = 0; /* no related stream found, try again with everything */
2559 *decoder_ret = best_decoder;
2563 /*******************************************************/
2565 int av_read_play(AVFormatContext *s)
2567 if (s->iformat->read_play)
2568 return s->iformat->read_play(s);
2570 return avio_pause(s->pb, 0);
2571 return AVERROR(ENOSYS);
2574 int av_read_pause(AVFormatContext *s)
2576 if (s->iformat->read_pause)
2577 return s->iformat->read_pause(s);
2579 return avio_pause(s->pb, 1);
2580 return AVERROR(ENOSYS);
2583 void av_close_input_stream(AVFormatContext *s)
2585 flush_packet_queue(s);
2586 if (s->iformat->read_close)
2587 s->iformat->read_close(s);
2588 avformat_free_context(s);
2591 void avformat_free_context(AVFormatContext *s)
2597 if (s->iformat && s->iformat->priv_class && s->priv_data)
2598 av_opt_free(s->priv_data);
2600 for(i=0;i<s->nb_streams;i++) {
2601 /* free all data in a stream component */
2604 av_parser_close(st->parser);
2605 av_free_packet(&st->cur_pkt);
2607 av_dict_free(&st->metadata);
2608 av_free(st->index_entries);
2609 av_free(st->codec->extradata);
2610 av_free(st->codec->subtitle_header);
2612 av_free(st->priv_data);
2616 for(i=s->nb_programs-1; i>=0; i--) {
2617 av_dict_free(&s->programs[i]->metadata);
2618 av_freep(&s->programs[i]->stream_index);
2619 av_freep(&s->programs[i]);
2621 av_freep(&s->programs);
2622 av_freep(&s->priv_data);
2623 while(s->nb_chapters--) {
2624 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2625 av_free(s->chapters[s->nb_chapters]);
2627 av_freep(&s->chapters);
2628 av_dict_free(&s->metadata);
2629 av_freep(&s->streams);
2633 void av_close_input_file(AVFormatContext *s)
2635 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2637 av_close_input_stream(s);
2642 AVStream *av_new_stream(AVFormatContext *s, int id)
2648 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2650 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2653 s->streams = streams;
2655 st = av_mallocz(sizeof(AVStream));
2658 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2663 st->codec= avcodec_alloc_context();
2665 /* no default bitrate if decoding */
2666 st->codec->bit_rate = 0;
2668 st->index = s->nb_streams;
2670 st->start_time = AV_NOPTS_VALUE;
2671 st->duration = AV_NOPTS_VALUE;
2672 /* we set the current DTS to 0 so that formats without any timestamps
2673 but durations get some timestamps, formats with some unknown
2674 timestamps have their first few packets buffered and the
2675 timestamps corrected before they are returned to the user */
2677 st->first_dts = AV_NOPTS_VALUE;
2678 st->probe_packets = MAX_PROBE_PACKETS;
2680 /* default pts setting is MPEG-like */
2681 av_set_pts_info(st, 33, 1, 90000);
2682 st->last_IP_pts = AV_NOPTS_VALUE;
2683 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2684 st->pts_buffer[i]= AV_NOPTS_VALUE;
2685 st->reference_dts = AV_NOPTS_VALUE;
2687 st->sample_aspect_ratio = (AVRational){0,1};
2689 s->streams[s->nb_streams++] = st;
2693 AVProgram *av_new_program(AVFormatContext *ac, int id)
2695 AVProgram *program=NULL;
2698 av_dlog(ac, "new_program: id=0x%04x\n", id);
2700 for(i=0; i<ac->nb_programs; i++)
2701 if(ac->programs[i]->id == id)
2702 program = ac->programs[i];
2705 program = av_mallocz(sizeof(AVProgram));
2708 dynarray_add(&ac->programs, &ac->nb_programs, program);
2709 program->discard = AVDISCARD_NONE;
2716 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2718 AVChapter *chapter = NULL;
2721 for(i=0; i<s->nb_chapters; i++)
2722 if(s->chapters[i]->id == id)
2723 chapter = s->chapters[i];
2726 chapter= av_mallocz(sizeof(AVChapter));
2729 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2731 av_dict_set(&chapter->metadata, "title", title, 0);
2733 chapter->time_base= time_base;
2734 chapter->start = start;
2740 /************************************************************/
2741 /* output media file */
2743 #if FF_API_FORMAT_PARAMETERS
2744 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2748 if (s->oformat->priv_data_size > 0) {
2749 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2751 return AVERROR(ENOMEM);
2752 if (s->oformat->priv_class) {
2753 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2754 av_opt_set_defaults(s->priv_data);
2757 s->priv_data = NULL;
2759 if (s->oformat->set_parameters) {
2760 ret = s->oformat->set_parameters(s, ap);
2768 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2770 const AVCodecTag *avctag;
2772 enum CodecID id = CODEC_ID_NONE;
2773 unsigned int tag = 0;
2776 * Check that tag + id is in the table
2777 * If neither is in the table -> OK
2778 * If tag is in the table with another id -> FAIL
2779 * If id is in the table with another tag -> FAIL unless strict < normal
2781 for (n = 0; s->oformat->codec_tag[n]; n++) {
2782 avctag = s->oformat->codec_tag[n];
2783 while (avctag->id != CODEC_ID_NONE) {
2784 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2786 if (id == st->codec->codec_id)
2789 if (avctag->id == st->codec->codec_id)
2794 if (id != CODEC_ID_NONE)
2796 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2801 #if FF_API_FORMAT_PARAMETERS
2802 int av_write_header(AVFormatContext *s)
2804 return avformat_write_header(s, NULL);
2808 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2812 AVDictionary *tmp = NULL;
2815 av_dict_copy(&tmp, *options, 0);
2816 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2819 // some sanity checks
2820 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2821 av_log(s, AV_LOG_ERROR, "no streams\n");
2822 ret = AVERROR(EINVAL);
2826 for(i=0;i<s->nb_streams;i++) {
2829 switch (st->codec->codec_type) {
2830 case AVMEDIA_TYPE_AUDIO:
2831 if(st->codec->sample_rate<=0){
2832 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2833 ret = AVERROR(EINVAL);
2836 if(!st->codec->block_align)
2837 st->codec->block_align = st->codec->channels *
2838 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2840 case AVMEDIA_TYPE_VIDEO:
2841 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2842 av_log(s, AV_LOG_ERROR, "time base not set\n");
2843 ret = AVERROR(EINVAL);
2846 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2847 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2848 ret = AVERROR(EINVAL);
2851 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2852 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2853 ret = AVERROR(EINVAL);
2859 if(s->oformat->codec_tag){
2860 if(st->codec->codec_tag && st->codec->codec_id == CODEC_ID_RAWVIDEO && av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id) == 0 && !validate_codec_tag(s, st)){
2861 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2862 st->codec->codec_tag= 0;
2864 if(st->codec->codec_tag){
2865 if (!validate_codec_tag(s, st)) {
2867 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2868 av_log(s, AV_LOG_ERROR,
2869 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
2870 tagbuf, st->codec->codec_tag, st->codec->codec_id);
2871 ret = AVERROR_INVALIDDATA;
2875 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2878 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2879 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2880 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2883 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2884 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2885 if (!s->priv_data) {
2886 ret = AVERROR(ENOMEM);
2889 if (s->oformat->priv_class) {
2890 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2891 av_opt_set_defaults(s->priv_data);
2892 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2897 /* set muxer identification string */
2898 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2899 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
2902 if(s->oformat->write_header){
2903 ret = s->oformat->write_header(s);
2908 /* init PTS generation */
2909 for(i=0;i<s->nb_streams;i++) {
2910 int64_t den = AV_NOPTS_VALUE;
2913 switch (st->codec->codec_type) {
2914 case AVMEDIA_TYPE_AUDIO:
2915 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2917 case AVMEDIA_TYPE_VIDEO:
2918 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2923 if (den != AV_NOPTS_VALUE) {
2925 ret = AVERROR_INVALIDDATA;
2928 av_frac_init(&st->pts, 0, 0, den);
2933 av_dict_free(options);
2942 //FIXME merge with compute_pkt_fields
2943 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
2944 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2945 int num, den, frame_size, i;
2947 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
2948 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
2950 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2951 return AVERROR(EINVAL);*/
2953 /* duration field */
2954 if (pkt->duration == 0) {
2955 compute_frame_duration(&num, &den, st, NULL, pkt);
2957 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2961 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2964 //XXX/FIXME this is a temporary hack until all encoders output pts
2965 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2967 // pkt->pts= st->cur_dts;
2968 pkt->pts= st->pts.val;
2971 //calculate dts from pts
2972 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2973 st->pts_buffer[0]= pkt->pts;
2974 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2975 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
2976 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2977 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2979 pkt->dts= st->pts_buffer[0];
2981 #ifdef GST_EXT_FFMUX_ENHANCEMENT
2983 if (st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts) {
2984 av_log(st->codec, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2985 if (st->cur_dts > pkt->dts) {
2986 av_log(st->codec, AV_LOG_ERROR, "[Drop] error, non monotone timestamps %"PRId64" > %"PRId64"\n", st->cur_dts, pkt->dts);
2990 } else if (st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts) {
2991 av_log(st->codec, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2994 #else /* GST_EXT_FFMUX_ENHANCEMENT */
2995 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2996 av_log(s, AV_LOG_ERROR,
2997 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
2998 st->index, st->cur_dts, pkt->dts);
2999 return AVERROR(EINVAL);
3001 #endif /* GST_EXT_FFMUX_ENHANCEMENT */
3002 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3003 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3004 return AVERROR(EINVAL);
3007 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3008 st->cur_dts= pkt->dts;
3009 st->pts.val= pkt->dts;
3012 switch (st->codec->codec_type) {
3013 case AVMEDIA_TYPE_AUDIO:
3014 frame_size = get_audio_frame_size(st->codec, pkt->size);
3016 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3017 likely equal to the encoder delay, but it would be better if we
3018 had the real timestamps from the encoder */
3019 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3020 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3023 case AVMEDIA_TYPE_VIDEO:
3024 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3032 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3034 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3036 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3039 ret= s->oformat->write_packet(s, pkt);
3043 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3044 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3046 AVPacketList **next_point, *this_pktl;
3048 this_pktl = av_mallocz(sizeof(AVPacketList));
3049 this_pktl->pkt= *pkt;
3050 pkt->destruct= NULL; // do not free original but only the copy
3051 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3053 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3054 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3056 next_point = &s->packet_buffer;
3059 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3060 while(!compare(s, &(*next_point)->pkt, pkt)){
3061 next_point= &(*next_point)->next;
3065 next_point = &(s->packet_buffer_end->next);
3068 assert(!*next_point);
3070 s->packet_buffer_end= this_pktl;
3073 this_pktl->next= *next_point;
3075 s->streams[pkt->stream_index]->last_in_packet_buffer=
3076 *next_point= this_pktl;
3079 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3081 AVStream *st = s->streams[ pkt ->stream_index];
3082 AVStream *st2= s->streams[ next->stream_index];
3083 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3087 return pkt->stream_index < next->stream_index;
3091 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3097 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3100 for(i=0; i < s->nb_streams; i++)
3101 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3103 if(stream_count && (s->nb_streams == stream_count || flush)){
3104 pktl= s->packet_buffer;
3107 s->packet_buffer= pktl->next;
3108 if(!s->packet_buffer)
3109 s->packet_buffer_end= NULL;
3111 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3112 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3116 av_init_packet(out);
3122 * Interleave an AVPacket correctly so it can be muxed.
3123 * @param out the interleaved packet will be output here
3124 * @param in the input packet
3125 * @param flush 1 if no further packets are available as input and all
3126 * remaining packets should be output
3127 * @return 1 if a packet was output, 0 if no packet could be output,
3128 * < 0 if an error occurred
3130 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3131 if(s->oformat->interleave_packet)
3132 return s->oformat->interleave_packet(s, out, in, flush);
3134 return av_interleave_packet_per_dts(s, out, in, flush);
3137 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3138 AVStream *st= s->streams[ pkt->stream_index];
3141 //FIXME/XXX/HACK drop zero sized packets
3142 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3145 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3146 pkt->size, pkt->dts, pkt->pts);
3147 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3150 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3151 return AVERROR(EINVAL);
3155 int ret= av_interleave_packet(s, &opkt, pkt, 0);
3156 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3159 ret= s->oformat->write_packet(s, &opkt);
3161 av_free_packet(&opkt);
3169 int av_write_trailer(AVFormatContext *s)
3175 ret= av_interleave_packet(s, &pkt, NULL, 1);
3176 if(ret<0) //FIXME cleanup needed for ret<0 ?
3181 ret= s->oformat->write_packet(s, &pkt);
3183 av_free_packet(&pkt);
3189 if(s->oformat->write_trailer)
3190 ret = s->oformat->write_trailer(s);
3192 for(i=0;i<s->nb_streams;i++) {
3193 av_freep(&s->streams[i]->priv_data);
3194 av_freep(&s->streams[i]->index_entries);
3196 if (s->iformat && s->iformat->priv_class)
3197 av_opt_free(s->priv_data);
3198 av_freep(&s->priv_data);
3202 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3205 AVProgram *program=NULL;
3208 if (idx >= ac->nb_streams) {
3209 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3213 for(i=0; i<ac->nb_programs; i++){
3214 if(ac->programs[i]->id != progid)
3216 program = ac->programs[i];
3217 for(j=0; j<program->nb_stream_indexes; j++)
3218 if(program->stream_index[j] == idx)
3221 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3224 program->stream_index = tmp;
3225 program->stream_index[program->nb_stream_indexes++] = idx;
3230 static void print_fps(double d, const char *postfix){
3231 uint64_t v= lrintf(d*100);
3232 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3233 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3234 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3237 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3239 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3240 AVDictionaryEntry *tag=NULL;
3242 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3243 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3244 if(strcmp("language", tag->key))
3245 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
3250 /* "user interface" functions */
3251 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3254 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3255 AVStream *st = ic->streams[i];
3256 int g = av_gcd(st->time_base.num, st->time_base.den);
3257 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3258 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3259 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3260 /* the pid is an important information, so we display it */
3261 /* XXX: add a generic system */
3262 if (flags & AVFMT_SHOW_IDS)
3263 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3265 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3266 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3267 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3268 if (st->sample_aspect_ratio.num && // default
3269 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3270 AVRational display_aspect_ratio;
3271 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3272 st->codec->width*st->sample_aspect_ratio.num,
3273 st->codec->height*st->sample_aspect_ratio.den,
3275 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3276 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3277 display_aspect_ratio.num, display_aspect_ratio.den);
3279 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3280 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3281 print_fps(av_q2d(st->avg_frame_rate), "fps");
3282 if(st->r_frame_rate.den && st->r_frame_rate.num)
3283 print_fps(av_q2d(st->r_frame_rate), "tbr");
3284 if(st->time_base.den && st->time_base.num)
3285 print_fps(1/av_q2d(st->time_base), "tbn");
3286 if(st->codec->time_base.den && st->codec->time_base.num)
3287 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3289 if (st->disposition & AV_DISPOSITION_DEFAULT)
3290 av_log(NULL, AV_LOG_INFO, " (default)");
3291 if (st->disposition & AV_DISPOSITION_DUB)
3292 av_log(NULL, AV_LOG_INFO, " (dub)");
3293 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3294 av_log(NULL, AV_LOG_INFO, " (original)");
3295 if (st->disposition & AV_DISPOSITION_COMMENT)
3296 av_log(NULL, AV_LOG_INFO, " (comment)");
3297 if (st->disposition & AV_DISPOSITION_LYRICS)
3298 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3299 if (st->disposition & AV_DISPOSITION_KARAOKE)
3300 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3301 if (st->disposition & AV_DISPOSITION_FORCED)
3302 av_log(NULL, AV_LOG_INFO, " (forced)");
3303 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3304 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3305 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3306 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3307 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3308 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3309 av_log(NULL, AV_LOG_INFO, "\n");
3310 dump_metadata(NULL, st->metadata, " ");
3313 #if FF_API_DUMP_FORMAT
3314 void dump_format(AVFormatContext *ic,
3319 av_dump_format(ic, index, url, is_output);
3323 void av_dump_format(AVFormatContext *ic,
3329 uint8_t *printed = av_mallocz(ic->nb_streams);
3330 if (ic->nb_streams && !printed)
3333 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3334 is_output ? "Output" : "Input",
3336 is_output ? ic->oformat->name : ic->iformat->name,
3337 is_output ? "to" : "from", url);
3338 dump_metadata(NULL, ic->metadata, " ");
3340 av_log(NULL, AV_LOG_INFO, " Duration: ");
3341 if (ic->duration != AV_NOPTS_VALUE) {
3342 int hours, mins, secs, us;
3343 secs = ic->duration / AV_TIME_BASE;
3344 us = ic->duration % AV_TIME_BASE;
3349 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3350 (100 * us) / AV_TIME_BASE);
3352 av_log(NULL, AV_LOG_INFO, "N/A");
3354 if (ic->start_time != AV_NOPTS_VALUE) {
3356 av_log(NULL, AV_LOG_INFO, ", start: ");
3357 secs = ic->start_time / AV_TIME_BASE;
3358 us = abs(ic->start_time % AV_TIME_BASE);
3359 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3360 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3362 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3364 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3366 av_log(NULL, AV_LOG_INFO, "N/A");
3368 av_log(NULL, AV_LOG_INFO, "\n");
3370 for (i = 0; i < ic->nb_chapters; i++) {
3371 AVChapter *ch = ic->chapters[i];
3372 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3373 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3374 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3376 dump_metadata(NULL, ch->metadata, " ");
3378 if(ic->nb_programs) {
3379 int j, k, total = 0;
3380 for(j=0; j<ic->nb_programs; j++) {
3381 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3383 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3384 name ? name->value : "");
3385 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3386 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3387 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3388 printed[ic->programs[j]->stream_index[k]] = 1;
3390 total += ic->programs[j]->nb_stream_indexes;
3392 if (total < ic->nb_streams)
3393 av_log(NULL, AV_LOG_INFO, " No Program\n");
3395 for(i=0;i<ic->nb_streams;i++)
3397 dump_stream_format(ic, i, index, is_output);
3402 int64_t av_gettime(void)
3405 gettimeofday(&tv,NULL);
3406 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3409 uint64_t ff_ntp_time(void)
3411 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3414 #if FF_API_PARSE_DATE
3415 #include "libavutil/parseutils.h"
3417 int64_t parse_date(const char *timestr, int duration)
3420 av_parse_time(&timeval, timestr, duration);
3425 #if FF_API_FIND_INFO_TAG
3426 #include "libavutil/parseutils.h"
3428 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3430 return av_find_info_tag(arg, arg_size, tag1, info);
3434 int av_get_frame_filename(char *buf, int buf_size,
3435 const char *path, int number)
3438 char *q, buf1[20], c;
3439 int nd, len, percentd_found;
3451 while (isdigit(*p)) {
3452 nd = nd * 10 + *p++ - '0';
3455 } while (isdigit(c));
3464 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3466 if ((q - buf + len) > buf_size - 1)
3468 memcpy(q, buf1, len);
3476 if ((q - buf) < buf_size - 1)
3480 if (!percentd_found)
3489 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3493 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3495 for(i=0;i<size;i+=16) {
3502 PRINT(" %02x", buf[i+j]);
3507 for(j=0;j<len;j++) {
3509 if (c < ' ' || c > '~')
3518 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3520 hex_dump_internal(NULL, f, 0, buf, size);
3523 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3525 hex_dump_internal(avcl, NULL, level, buf, size);
3528 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3531 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3532 PRINT("stream #%d:\n", pkt->stream_index);
3533 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3534 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3535 /* DTS is _always_ valid after av_read_frame() */
3537 if (pkt->dts == AV_NOPTS_VALUE)
3540 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3541 /* PTS may not be known if B-frames are present. */
3543 if (pkt->pts == AV_NOPTS_VALUE)
3546 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3548 PRINT(" size=%d\n", pkt->size);
3551 av_hex_dump(f, pkt->data, pkt->size);
3555 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3557 AVRational tb = { 1, AV_TIME_BASE };
3558 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3562 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3564 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3568 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3570 AVRational tb = { 1, AV_TIME_BASE };
3571 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3575 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3578 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3581 void av_url_split(char *proto, int proto_size,
3582 char *authorization, int authorization_size,
3583 char *hostname, int hostname_size,
3585 char *path, int path_size,
3588 const char *p, *ls, *at, *col, *brk;
3590 if (port_ptr) *port_ptr = -1;
3591 if (proto_size > 0) proto[0] = 0;
3592 if (authorization_size > 0) authorization[0] = 0;
3593 if (hostname_size > 0) hostname[0] = 0;
3594 if (path_size > 0) path[0] = 0;
3596 /* parse protocol */
3597 if ((p = strchr(url, ':'))) {
3598 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3603 /* no protocol means plain filename */
3604 av_strlcpy(path, url, path_size);
3608 /* separate path from hostname */
3609 ls = strchr(p, '/');
3611 ls = strchr(p, '?');
3613 av_strlcpy(path, ls, path_size);
3615 ls = &p[strlen(p)]; // XXX
3617 /* the rest is hostname, use that to parse auth/port */
3619 /* authorization (user[:pass]@hostname) */
3620 if ((at = strchr(p, '@')) && at < ls) {
3621 av_strlcpy(authorization, p,
3622 FFMIN(authorization_size, at + 1 - p));
3623 p = at + 1; /* skip '@' */
3626 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3628 av_strlcpy(hostname, p + 1,
3629 FFMIN(hostname_size, brk - p));
3630 if (brk[1] == ':' && port_ptr)
3631 *port_ptr = atoi(brk + 2);
3632 } else if ((col = strchr(p, ':')) && col < ls) {
3633 av_strlcpy(hostname, p,
3634 FFMIN(col + 1 - p, hostname_size));
3635 if (port_ptr) *port_ptr = atoi(col + 1);
3637 av_strlcpy(hostname, p,
3638 FFMIN(ls + 1 - p, hostname_size));
3642 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3645 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3648 'C', 'D', 'E', 'F' };
3649 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3652 'c', 'd', 'e', 'f' };
3653 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3655 for(i = 0; i < s; i++) {
3656 buff[i * 2] = hex_table[src[i] >> 4];
3657 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3663 int ff_hex_to_data(uint8_t *data, const char *p)
3670 p += strspn(p, SPACE_CHARS);
3673 c = toupper((unsigned char) *p++);
3674 if (c >= '0' && c <= '9')
3676 else if (c >= 'A' && c <= 'F')
3691 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3692 unsigned int pts_num, unsigned int pts_den)
3695 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3696 if(new_tb.num != pts_num)
3697 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3699 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3701 if(new_tb.num <= 0 || new_tb.den <= 0) {
3702 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3705 s->time_base = new_tb;
3706 s->pts_wrap_bits = pts_wrap_bits;
3709 int ff_url_join(char *str, int size, const char *proto,
3710 const char *authorization, const char *hostname,
3711 int port, const char *fmt, ...)
3714 struct addrinfo hints, *ai;
3719 av_strlcatf(str, size, "%s://", proto);
3720 if (authorization && authorization[0])
3721 av_strlcatf(str, size, "%s@", authorization);
3722 #if CONFIG_NETWORK && defined(AF_INET6)
3723 /* Determine if hostname is a numerical IPv6 address,
3724 * properly escape it within [] in that case. */
3725 memset(&hints, 0, sizeof(hints));
3726 hints.ai_flags = AI_NUMERICHOST;
3727 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3728 if (ai->ai_family == AF_INET6) {
3729 av_strlcat(str, "[", size);
3730 av_strlcat(str, hostname, size);
3731 av_strlcat(str, "]", size);
3733 av_strlcat(str, hostname, size);
3738 /* Not an IPv6 address, just output the plain string. */
3739 av_strlcat(str, hostname, size);
3742 av_strlcatf(str, size, ":%d", port);
3745 int len = strlen(str);
3748 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3754 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3755 AVFormatContext *src)
3760 local_pkt.stream_index = dst_stream;
3761 if (pkt->pts != AV_NOPTS_VALUE)
3762 local_pkt.pts = av_rescale_q(pkt->pts,
3763 src->streams[pkt->stream_index]->time_base,
3764 dst->streams[dst_stream]->time_base);
3765 if (pkt->dts != AV_NOPTS_VALUE)
3766 local_pkt.dts = av_rescale_q(pkt->dts,
3767 src->streams[pkt->stream_index]->time_base,
3768 dst->streams[dst_stream]->time_base);
3769 return av_write_frame(dst, &local_pkt);
3772 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3775 const char *ptr = str;
3777 /* Parse key=value pairs. */
3780 char *dest = NULL, *dest_end;
3781 int key_len, dest_len = 0;
3783 /* Skip whitespace and potential commas. */
3784 while (*ptr && (isspace(*ptr) || *ptr == ','))
3791 if (!(ptr = strchr(key, '=')))
3794 key_len = ptr - key;
3796 callback_get_buf(context, key, key_len, &dest, &dest_len);
3797 dest_end = dest + dest_len - 1;
3801 while (*ptr && *ptr != '\"') {
3805 if (dest && dest < dest_end)
3809 if (dest && dest < dest_end)
3817 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3818 if (dest && dest < dest_end)
3826 int ff_find_stream_index(AVFormatContext *s, int id)
3829 for (i = 0; i < s->nb_streams; i++) {
3830 if (s->streams[i]->id == id)
3836 void ff_make_absolute_url(char *buf, int size, const char *base,
3840 /* Absolute path, relative to the current server */
3841 if (base && strstr(base, "://") && rel[0] == '/') {
3843 av_strlcpy(buf, base, size);
3844 sep = strstr(buf, "://");
3847 sep = strchr(sep, '/');
3851 av_strlcat(buf, rel, size);
3854 /* If rel actually is an absolute url, just copy it */
3855 if (!base || strstr(rel, "://") || rel[0] == '/') {
3856 av_strlcpy(buf, rel, size);
3860 av_strlcpy(buf, base, size);
3861 /* Remove the file name from the base url */
3862 sep = strrchr(buf, '/');
3867 while (av_strstart(rel, "../", NULL) && sep) {
3868 /* Remove the path delimiter at the end */
3870 sep = strrchr(buf, '/');
3871 /* If the next directory name to pop off is "..", break here */
3872 if (!strcmp(sep ? &sep[1] : buf, "..")) {
3873 /* Readd the slash we just removed */
3874 av_strlcat(buf, "/", size);
3877 /* Cut off the directory name */
3884 av_strlcat(buf, rel, size);