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);
464 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
472 /** size of probe buffer, for guessing file type from file contents */
473 #define PROBE_BUF_MIN 2048
474 #define PROBE_BUF_MAX (1<<20)
476 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
477 const char *filename, void *logctx,
478 unsigned int offset, unsigned int max_probe_size)
480 AVProbeData pd = { filename ? filename : "", NULL, -offset };
481 unsigned char *buf = NULL;
482 int ret = 0, probe_size;
484 if (!max_probe_size) {
485 max_probe_size = PROBE_BUF_MAX;
486 } else if (max_probe_size > PROBE_BUF_MAX) {
487 max_probe_size = PROBE_BUF_MAX;
488 } else if (max_probe_size < PROBE_BUF_MIN) {
489 return AVERROR(EINVAL);
492 if (offset >= max_probe_size) {
493 return AVERROR(EINVAL);
496 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt && ret >= 0;
497 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
498 int ret, score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
499 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
501 if (probe_size < offset) {
505 /* read probe data */
506 buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
507 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
508 /* fail if error was not end of file, otherwise, lower score */
509 if (ret != AVERROR_EOF) {
514 ret = 0; /* error was end of file, nothing read */
517 pd.buf = &buf[offset];
519 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
521 /* guess file format */
522 *fmt = av_probe_input_format2(&pd, 1, &score);
524 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
525 av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
527 av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
533 return AVERROR_INVALIDDATA;
536 /* rewind. reuse probe buffer to avoid seeking */
537 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
543 #if FF_API_FORMAT_PARAMETERS
544 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
547 AVFormatParameters *ap)
550 AVDictionary *opts = convert_format_parameters(ap);
552 if (!ap || !ap->prealloced_context)
555 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
562 /* open input file and probe the format if necessary */
563 static int init_input(AVFormatContext *s, const char *filename)
566 AVProbeData pd = {filename, NULL, 0};
569 s->flags |= AVFMT_FLAG_CUSTOM_IO;
571 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
572 else if (s->iformat->flags & AVFMT_NOFILE)
573 return AVERROR(EINVAL);
577 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
578 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
581 if ((ret = avio_open(&s->pb, filename, AVIO_FLAG_READ)) < 0)
585 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
588 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
590 AVFormatContext *s = *ps;
592 AVFormatParameters ap = { 0 };
593 AVDictionary *tmp = NULL;
595 if (!s && !(s = avformat_alloc_context()))
596 return AVERROR(ENOMEM);
601 av_dict_copy(&tmp, *options, 0);
603 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
606 if ((ret = init_input(s, filename)) < 0)
609 /* check filename in case an image number is expected */
610 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
611 if (!av_filename_number_test(filename)) {
612 ret = AVERROR(EINVAL);
617 s->duration = s->start_time = AV_NOPTS_VALUE;
618 av_strlcpy(s->filename, filename, sizeof(s->filename));
620 /* allocate private data */
621 if (s->iformat->priv_data_size > 0) {
622 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
623 ret = AVERROR(ENOMEM);
626 if (s->iformat->priv_class) {
627 *(const AVClass**)s->priv_data = s->iformat->priv_class;
628 av_opt_set_defaults(s->priv_data);
629 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
634 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
636 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
638 if (s->iformat->read_header)
639 if ((ret = s->iformat->read_header(s, &ap)) < 0)
642 if (s->pb && !s->data_offset)
643 s->data_offset = avio_tell(s->pb);
645 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
648 av_dict_free(options);
656 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
658 avformat_free_context(s);
663 /*******************************************************/
665 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
666 AVPacketList **plast_pktl){
667 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
672 (*plast_pktl)->next = pktl;
674 *packet_buffer = pktl;
676 /* add the packet in the buffered packet list */
682 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
688 AVPacketList *pktl = s->raw_packet_buffer;
692 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
693 !s->streams[pkt->stream_index]->probe_packets ||
694 s->raw_packet_buffer_remaining_size < pkt->size){
695 AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
698 s->raw_packet_buffer = pktl->next;
699 s->raw_packet_buffer_remaining_size += pkt->size;
706 ret= s->iformat->read_packet(s, pkt);
708 if (!pktl || ret == AVERROR(EAGAIN))
710 for (i = 0; i < s->nb_streams; i++)
711 s->streams[i]->probe_packets = 0;
714 st= s->streams[pkt->stream_index];
716 switch(st->codec->codec_type){
717 case AVMEDIA_TYPE_VIDEO:
718 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
720 case AVMEDIA_TYPE_AUDIO:
721 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
723 case AVMEDIA_TYPE_SUBTITLE:
724 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
728 if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
732 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
733 s->raw_packet_buffer_remaining_size -= pkt->size;
735 if(st->codec->codec_id == CODEC_ID_PROBE){
736 AVProbeData *pd = &st->probe_data;
737 av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
740 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
741 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
742 pd->buf_size += pkt->size;
743 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
745 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
746 //FIXME we dont reduce score to 0 for the case of running out of buffer space in bytes
747 set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0);
748 if(st->codec->codec_id != CODEC_ID_PROBE){
751 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
758 /**********************************************************/
761 * Get the number of samples of an audio frame. Return -1 on error.
763 static int get_audio_frame_size(AVCodecContext *enc, int size)
767 if(enc->codec_id == CODEC_ID_VORBIS)
770 if (enc->frame_size <= 1) {
771 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
773 if (bits_per_sample) {
774 if (enc->channels == 0)
776 frame_size = (size << 3) / (bits_per_sample * enc->channels);
778 /* used for example by ADPCM codecs */
779 if (enc->bit_rate == 0)
781 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
784 frame_size = enc->frame_size;
791 * Return the frame duration in seconds. Return 0 if not available.
793 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
794 AVCodecParserContext *pc, AVPacket *pkt)
800 switch(st->codec->codec_type) {
801 case AVMEDIA_TYPE_VIDEO:
802 if(st->time_base.num*1000LL > st->time_base.den){
803 *pnum = st->time_base.num;
804 *pden = st->time_base.den;
805 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
806 *pnum = st->codec->time_base.num;
807 *pden = st->codec->time_base.den;
808 if (pc && pc->repeat_pict) {
809 *pnum = (*pnum) * (1 + pc->repeat_pict);
811 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
812 //Thus if we have no parser in such case leave duration undefined.
813 if(st->codec->ticks_per_frame>1 && !pc){
818 case AVMEDIA_TYPE_AUDIO:
819 frame_size = get_audio_frame_size(st->codec, pkt->size);
820 if (frame_size <= 0 || st->codec->sample_rate <= 0)
823 *pden = st->codec->sample_rate;
830 static int is_intra_only(AVCodecContext *enc){
831 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
833 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
834 switch(enc->codec_id){
836 case CODEC_ID_MJPEGB:
838 case CODEC_ID_RAWVIDEO:
839 case CODEC_ID_DVVIDEO:
840 case CODEC_ID_HUFFYUV:
841 case CODEC_ID_FFVHUFF:
846 case CODEC_ID_JPEG2000:
854 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
855 int64_t dts, int64_t pts)
857 AVStream *st= s->streams[stream_index];
858 AVPacketList *pktl= s->packet_buffer;
860 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
863 st->first_dts= dts - st->cur_dts;
866 for(; pktl; pktl= pktl->next){
867 if(pktl->pkt.stream_index != stream_index)
869 //FIXME think more about this check
870 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
871 pktl->pkt.pts += st->first_dts;
873 if(pktl->pkt.dts != AV_NOPTS_VALUE)
874 pktl->pkt.dts += st->first_dts;
876 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
877 st->start_time= pktl->pkt.pts;
879 if (st->start_time == AV_NOPTS_VALUE)
880 st->start_time = pts;
883 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
885 AVPacketList *pktl= s->packet_buffer;
888 if(st->first_dts != AV_NOPTS_VALUE){
889 cur_dts= st->first_dts;
890 for(; pktl; pktl= pktl->next){
891 if(pktl->pkt.stream_index == pkt->stream_index){
892 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
894 cur_dts -= pkt->duration;
897 pktl= s->packet_buffer;
898 st->first_dts = cur_dts;
899 }else if(st->cur_dts)
902 for(; pktl; pktl= pktl->next){
903 if(pktl->pkt.stream_index != pkt->stream_index)
905 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
906 && !pktl->pkt.duration){
907 pktl->pkt.dts= cur_dts;
908 if(!st->codec->has_b_frames)
909 pktl->pkt.pts= cur_dts;
910 cur_dts += pkt->duration;
911 pktl->pkt.duration= pkt->duration;
915 if(st->first_dts == AV_NOPTS_VALUE)
916 st->cur_dts= cur_dts;
919 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
920 AVCodecParserContext *pc, AVPacket *pkt)
922 int num, den, presentation_delayed, delay, i;
925 if (s->flags & AVFMT_FLAG_NOFILLIN)
928 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
929 pkt->dts= AV_NOPTS_VALUE;
931 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
932 //FIXME Set low_delay = 0 when has_b_frames = 1
933 st->codec->has_b_frames = 1;
935 /* do we have a video B-frame ? */
936 delay= st->codec->has_b_frames;
937 presentation_delayed = 0;
939 // ignore delay caused by frame threading so that the mpeg2-without-dts
940 // warning will not trigger
941 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
942 delay -= st->codec->thread_count-1;
944 /* XXX: need has_b_frame, but cannot get it if the codec is
947 pc && pc->pict_type != AV_PICTURE_TYPE_B)
948 presentation_delayed = 1;
950 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
951 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
952 pkt->dts -= 1LL<<st->pts_wrap_bits;
955 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
956 // we take the conservative approach and discard both
957 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
958 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
959 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
960 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
963 if (pkt->duration == 0) {
964 compute_frame_duration(&num, &den, st, pc, pkt);
966 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
968 if(pkt->duration != 0 && s->packet_buffer)
969 update_initial_durations(s, st, pkt);
973 /* correct timestamps with byte offset if demuxers only have timestamps
974 on packet boundaries */
975 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
976 /* this will estimate bitrate based on this frame's duration and size */
977 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
978 if(pkt->pts != AV_NOPTS_VALUE)
980 if(pkt->dts != AV_NOPTS_VALUE)
984 if (pc && pc->dts_sync_point >= 0) {
985 // we have synchronization info from the parser
986 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
988 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
989 if (pkt->dts != AV_NOPTS_VALUE) {
990 // got DTS from the stream, update reference timestamp
991 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
992 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
993 } else if (st->reference_dts != AV_NOPTS_VALUE) {
994 // compute DTS based on reference timestamp
995 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
996 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
998 if (pc->dts_sync_point > 0)
999 st->reference_dts = pkt->dts; // new reference
1003 /* This may be redundant, but it should not hurt. */
1004 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1005 presentation_delayed = 1;
1007 // 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);
1008 /* interpolate PTS and DTS if they are not present */
1009 //We skip H264 currently because delay and has_b_frames are not reliably set
1010 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1011 if (presentation_delayed) {
1012 /* DTS = decompression timestamp */
1013 /* PTS = presentation timestamp */
1014 if (pkt->dts == AV_NOPTS_VALUE)
1015 pkt->dts = st->last_IP_pts;
1016 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1017 if (pkt->dts == AV_NOPTS_VALUE)
1018 pkt->dts = st->cur_dts;
1020 /* this is tricky: the dts must be incremented by the duration
1021 of the frame we are displaying, i.e. the last I- or P-frame */
1022 if (st->last_IP_duration == 0)
1023 st->last_IP_duration = pkt->duration;
1024 if(pkt->dts != AV_NOPTS_VALUE)
1025 st->cur_dts = pkt->dts + st->last_IP_duration;
1026 st->last_IP_duration = pkt->duration;
1027 st->last_IP_pts= pkt->pts;
1028 /* cannot compute PTS if not present (we can compute it only
1029 by knowing the future */
1030 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1031 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1032 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1033 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1034 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1035 pkt->pts += pkt->duration;
1036 // 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);
1040 /* presentation is not delayed : PTS and DTS are the same */
1041 if(pkt->pts == AV_NOPTS_VALUE)
1042 pkt->pts = pkt->dts;
1043 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1044 if(pkt->pts == AV_NOPTS_VALUE)
1045 pkt->pts = st->cur_dts;
1046 pkt->dts = pkt->pts;
1047 if(pkt->pts != AV_NOPTS_VALUE)
1048 st->cur_dts = pkt->pts + pkt->duration;
1052 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1053 st->pts_buffer[0]= pkt->pts;
1054 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1055 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1056 if(pkt->dts == AV_NOPTS_VALUE)
1057 pkt->dts= st->pts_buffer[0];
1058 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1059 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1061 if(pkt->dts > st->cur_dts)
1062 st->cur_dts = pkt->dts;
1065 // 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);
1068 if(is_intra_only(st->codec))
1069 pkt->flags |= AV_PKT_FLAG_KEY;
1072 /* keyframe computation */
1073 if (pc->key_frame == 1)
1074 pkt->flags |= AV_PKT_FLAG_KEY;
1075 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1076 pkt->flags |= AV_PKT_FLAG_KEY;
1079 pkt->convergence_duration = pc->convergence_duration;
1083 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1088 av_init_packet(pkt);
1091 /* select current input stream component */
1094 if (!st->need_parsing || !st->parser) {
1095 /* no parsing needed: we just output the packet as is */
1096 /* raw data support */
1097 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
1098 compute_pkt_fields(s, st, NULL, pkt);
1100 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1101 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1102 ff_reduce_index(s, st->index);
1103 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1106 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1107 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1108 st->cur_ptr, st->cur_len,
1109 st->cur_pkt.pts, st->cur_pkt.dts,
1111 st->cur_pkt.pts = AV_NOPTS_VALUE;
1112 st->cur_pkt.dts = AV_NOPTS_VALUE;
1113 /* increment read pointer */
1117 /* return packet if any */
1121 pkt->stream_index = st->index;
1122 pkt->pts = st->parser->pts;
1123 pkt->dts = st->parser->dts;
1124 pkt->pos = st->parser->pos;
1125 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1127 pkt->destruct= st->cur_pkt.destruct;
1128 st->cur_pkt.destruct= NULL;
1129 st->cur_pkt.data = NULL;
1130 assert(st->cur_len == 0);
1132 pkt->destruct = NULL;
1134 compute_pkt_fields(s, st, st->parser, pkt);
1136 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1137 ff_reduce_index(s, st->index);
1138 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1139 0, 0, AVINDEX_KEYFRAME);
1146 av_free_packet(&st->cur_pkt);
1151 /* read next packet */
1152 ret = av_read_packet(s, &cur_pkt);
1154 if (ret == AVERROR(EAGAIN))
1156 /* return the last frames, if any */
1157 for(i = 0; i < s->nb_streams; i++) {
1159 if (st->parser && st->need_parsing) {
1160 av_parser_parse2(st->parser, st->codec,
1161 &pkt->data, &pkt->size,
1163 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1169 /* no more packets: really terminate parsing */
1172 st = s->streams[cur_pkt.stream_index];
1173 st->cur_pkt= cur_pkt;
1175 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1176 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1177 st->cur_pkt.pts < st->cur_pkt.dts){
1178 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1179 st->cur_pkt.stream_index,
1183 // av_free_packet(&st->cur_pkt);
1187 if(s->debug & FF_FDEBUG_TS)
1188 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1189 st->cur_pkt.stream_index,
1193 st->cur_pkt.duration,
1197 st->cur_ptr = st->cur_pkt.data;
1198 st->cur_len = st->cur_pkt.size;
1199 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1200 st->parser = av_parser_init(st->codec->codec_id);
1202 /* no parser available: just output the raw packets */
1203 st->need_parsing = AVSTREAM_PARSE_NONE;
1204 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1205 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1206 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1207 st->parser->flags |= PARSER_FLAG_ONCE;
1212 if(s->debug & FF_FDEBUG_TS)
1213 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1224 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1228 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1231 pktl = s->packet_buffer;
1233 AVPacket *next_pkt= &pktl->pkt;
1235 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1236 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1237 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1238 if( pktl->pkt.stream_index == next_pkt->stream_index
1239 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1240 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1241 next_pkt->pts= pktl->pkt.dts;
1245 pktl = s->packet_buffer;
1248 if( next_pkt->pts != AV_NOPTS_VALUE
1249 || next_pkt->dts == AV_NOPTS_VALUE
1251 /* read packet from packet buffer, if there is data */
1253 s->packet_buffer = pktl->next;
1259 int ret= av_read_frame_internal(s, pkt);
1261 if(pktl && ret != AVERROR(EAGAIN)){
1268 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1269 &s->packet_buffer_end)) < 0)
1270 return AVERROR(ENOMEM);
1272 assert(!s->packet_buffer);
1273 return av_read_frame_internal(s, pkt);
1278 /* XXX: suppress the packet queue */
1279 static void flush_packet_queue(AVFormatContext *s)
1284 pktl = s->packet_buffer;
1287 s->packet_buffer = pktl->next;
1288 av_free_packet(&pktl->pkt);
1291 while(s->raw_packet_buffer){
1292 pktl = s->raw_packet_buffer;
1293 s->raw_packet_buffer = pktl->next;
1294 av_free_packet(&pktl->pkt);
1297 s->packet_buffer_end=
1298 s->raw_packet_buffer_end= NULL;
1299 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1302 /*******************************************************/
1305 int av_find_default_stream_index(AVFormatContext *s)
1307 int first_audio_index = -1;
1311 if (s->nb_streams <= 0)
1313 for(i = 0; i < s->nb_streams; i++) {
1315 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1318 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1319 first_audio_index = i;
1321 return first_audio_index >= 0 ? first_audio_index : 0;
1325 * Flush the frame reader.
1327 void ff_read_frame_flush(AVFormatContext *s)
1332 flush_packet_queue(s);
1336 /* for each stream, reset read state */
1337 for(i = 0; i < s->nb_streams; i++) {
1341 av_parser_close(st->parser);
1343 av_free_packet(&st->cur_pkt);
1345 st->last_IP_pts = AV_NOPTS_VALUE;
1346 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1347 st->reference_dts = AV_NOPTS_VALUE;
1352 st->probe_packets = MAX_PROBE_PACKETS;
1354 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1355 st->pts_buffer[j]= AV_NOPTS_VALUE;
1359 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1362 for(i = 0; i < s->nb_streams; i++) {
1363 AVStream *st = s->streams[i];
1365 st->cur_dts = av_rescale(timestamp,
1366 st->time_base.den * (int64_t)ref_st->time_base.num,
1367 st->time_base.num * (int64_t)ref_st->time_base.den);
1371 void ff_reduce_index(AVFormatContext *s, int stream_index)
1373 AVStream *st= s->streams[stream_index];
1374 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1376 if((unsigned)st->nb_index_entries >= max_entries){
1378 for(i=0; 2*i<st->nb_index_entries; i++)
1379 st->index_entries[i]= st->index_entries[2*i];
1380 st->nb_index_entries= i;
1384 int ff_add_index_entry(AVIndexEntry **index_entries,
1385 int *nb_index_entries,
1386 unsigned int *index_entries_allocated_size,
1387 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1389 AVIndexEntry *entries, *ie;
1392 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1395 entries = av_fast_realloc(*index_entries,
1396 index_entries_allocated_size,
1397 (*nb_index_entries + 1) *
1398 sizeof(AVIndexEntry));
1402 *index_entries= entries;
1404 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1407 index= (*nb_index_entries)++;
1408 ie= &entries[index];
1409 assert(index==0 || ie[-1].timestamp < timestamp);
1411 ie= &entries[index];
1412 if(ie->timestamp != timestamp){
1413 if(ie->timestamp <= timestamp)
1415 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1416 (*nb_index_entries)++;
1417 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1418 distance= ie->min_distance;
1422 ie->timestamp = timestamp;
1423 ie->min_distance= distance;
1430 int av_add_index_entry(AVStream *st,
1431 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1433 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1434 &st->index_entries_allocated_size, pos,
1435 timestamp, size, distance, flags);
1438 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1439 int64_t wanted_timestamp, int flags)
1447 //optimize appending index entries at the end
1448 if(b && entries[b-1].timestamp < wanted_timestamp)
1453 timestamp = entries[m].timestamp;
1454 if(timestamp >= wanted_timestamp)
1456 if(timestamp <= wanted_timestamp)
1459 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1461 if(!(flags & AVSEEK_FLAG_ANY)){
1462 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1463 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1472 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1475 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1476 wanted_timestamp, flags);
1479 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1480 AVInputFormat *avif= s->iformat;
1481 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1482 int64_t ts_min, ts_max, ts;
1487 if (stream_index < 0)
1490 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1493 ts_min= AV_NOPTS_VALUE;
1494 pos_limit= -1; //gcc falsely says it may be uninitialized
1496 st= s->streams[stream_index];
1497 if(st->index_entries){
1500 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()
1501 index= FFMAX(index, 0);
1502 e= &st->index_entries[index];
1504 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1506 ts_min= e->timestamp;
1507 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1513 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1514 assert(index < st->nb_index_entries);
1516 e= &st->index_entries[index];
1517 assert(e->timestamp >= target_ts);
1519 ts_max= e->timestamp;
1520 pos_limit= pos_max - e->min_distance;
1521 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1522 pos_max,pos_limit, ts_max);
1526 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1531 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1534 av_update_cur_dts(s, st, ts);
1539 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 )){
1541 int64_t start_pos, filesize;
1544 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1546 if(ts_min == AV_NOPTS_VALUE){
1547 pos_min = s->data_offset;
1548 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1549 if (ts_min == AV_NOPTS_VALUE)
1553 if(ts_max == AV_NOPTS_VALUE){
1555 filesize = avio_size(s->pb);
1556 pos_max = filesize - 1;
1559 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1561 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1562 if (ts_max == AV_NOPTS_VALUE)
1566 int64_t tmp_pos= pos_max + 1;
1567 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1568 if(tmp_ts == AV_NOPTS_VALUE)
1572 if(tmp_pos >= filesize)
1578 if(ts_min > ts_max){
1580 }else if(ts_min == ts_max){
1585 while (pos_min < pos_limit) {
1586 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1587 pos_min, pos_max, ts_min, ts_max);
1588 assert(pos_limit <= pos_max);
1591 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1592 // interpolate position (better than dichotomy)
1593 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1594 + pos_min - approximate_keyframe_distance;
1595 }else if(no_change==1){
1596 // bisection, if interpolation failed to change min or max pos last time
1597 pos = (pos_min + pos_limit)>>1;
1599 /* linear search if bisection failed, can only happen if there
1600 are very few or no keyframes between min/max */
1605 else if(pos > pos_limit)
1609 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1614 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1615 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1616 pos_limit, start_pos, no_change);
1617 if(ts == AV_NOPTS_VALUE){
1618 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1621 assert(ts != AV_NOPTS_VALUE);
1622 if (target_ts <= ts) {
1623 pos_limit = start_pos - 1;
1627 if (target_ts >= ts) {
1633 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1634 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1636 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1638 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1639 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1640 pos, ts_min, target_ts, ts_max);
1645 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1646 int64_t pos_min, pos_max;
1650 if (stream_index < 0)
1653 st= s->streams[stream_index];
1656 pos_min = s->data_offset;
1657 pos_max = avio_size(s->pb) - 1;
1659 if (pos < pos_min) pos= pos_min;
1660 else if(pos > pos_max) pos= pos_max;
1662 avio_seek(s->pb, pos, SEEK_SET);
1665 av_update_cur_dts(s, st, ts);
1670 static int av_seek_frame_generic(AVFormatContext *s,
1671 int stream_index, int64_t timestamp, int flags)
1678 st = s->streams[stream_index];
1680 index = av_index_search_timestamp(st, timestamp, flags);
1682 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1685 if(index < 0 || index==st->nb_index_entries-1){
1689 if(st->nb_index_entries){
1690 assert(st->index_entries);
1691 ie= &st->index_entries[st->nb_index_entries-1];
1692 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1694 av_update_cur_dts(s, st, ie->timestamp);
1696 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1702 ret = av_read_frame(s, &pkt);
1703 }while(ret == AVERROR(EAGAIN));
1706 av_free_packet(&pkt);
1707 if(stream_index == pkt.stream_index){
1708 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1712 index = av_index_search_timestamp(st, timestamp, flags);
1717 ff_read_frame_flush(s);
1718 if (s->iformat->read_seek){
1719 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1722 ie = &st->index_entries[index];
1723 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1725 av_update_cur_dts(s, st, ie->timestamp);
1730 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1735 ff_read_frame_flush(s);
1737 if(flags & AVSEEK_FLAG_BYTE)
1738 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1740 if(stream_index < 0){
1741 stream_index= av_find_default_stream_index(s);
1742 if(stream_index < 0)
1745 st= s->streams[stream_index];
1746 /* timestamp for default must be expressed in AV_TIME_BASE units */
1747 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1750 /* first, we try the format specific seek */
1751 if (s->iformat->read_seek)
1752 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1759 if(s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH))
1760 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1761 else if (!(s->iformat->flags & AVFMT_NOGENSEARCH))
1762 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1767 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1769 if(min_ts > ts || max_ts < ts)
1772 ff_read_frame_flush(s);
1774 if (s->iformat->read_seek2)
1775 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1777 if(s->iformat->read_timestamp){
1778 //try to seek via read_timestamp()
1781 //Fallback to old API if new is not implemented but old is
1782 //Note the old has somewat different sematics
1783 if(s->iformat->read_seek || 1)
1784 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1786 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1789 /*******************************************************/
1792 * Return TRUE if the stream has accurate duration in any stream.
1794 * @return TRUE if the stream has accurate duration for at least one component.
1796 static int av_has_duration(AVFormatContext *ic)
1801 for(i = 0;i < ic->nb_streams; i++) {
1802 st = ic->streams[i];
1803 if (st->duration != AV_NOPTS_VALUE)
1810 * Estimate the stream timings from the one of each components.
1812 * Also computes the global bitrate if possible.
1814 static void av_update_stream_timings(AVFormatContext *ic)
1816 int64_t start_time, start_time1, end_time, end_time1;
1817 int64_t duration, duration1;
1821 start_time = INT64_MAX;
1822 end_time = INT64_MIN;
1823 duration = INT64_MIN;
1824 for(i = 0;i < ic->nb_streams; i++) {
1825 st = ic->streams[i];
1826 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1827 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1828 if (start_time1 < start_time)
1829 start_time = start_time1;
1830 if (st->duration != AV_NOPTS_VALUE) {
1831 end_time1 = start_time1
1832 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1833 if (end_time1 > end_time)
1834 end_time = end_time1;
1837 if (st->duration != AV_NOPTS_VALUE) {
1838 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1839 if (duration1 > duration)
1840 duration = duration1;
1843 if (start_time != INT64_MAX) {
1844 ic->start_time = start_time;
1845 if (end_time != INT64_MIN) {
1846 if (end_time - start_time > duration)
1847 duration = end_time - start_time;
1850 if (duration != INT64_MIN) {
1851 ic->duration = duration;
1852 if (ic->file_size > 0) {
1853 /* compute the bitrate */
1854 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1855 (double)ic->duration;
1860 static void fill_all_stream_timings(AVFormatContext *ic)
1865 av_update_stream_timings(ic);
1866 for(i = 0;i < ic->nb_streams; i++) {
1867 st = ic->streams[i];
1868 if (st->start_time == AV_NOPTS_VALUE) {
1869 if(ic->start_time != AV_NOPTS_VALUE)
1870 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1871 if(ic->duration != AV_NOPTS_VALUE)
1872 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1877 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1879 int64_t filesize, duration;
1883 /* if bit_rate is already set, we believe it */
1884 if (ic->bit_rate <= 0) {
1886 for(i=0;i<ic->nb_streams;i++) {
1887 st = ic->streams[i];
1888 if (st->codec->bit_rate > 0)
1889 bit_rate += st->codec->bit_rate;
1891 ic->bit_rate = bit_rate;
1894 /* if duration is already set, we believe it */
1895 if (ic->duration == AV_NOPTS_VALUE &&
1896 ic->bit_rate != 0 &&
1897 ic->file_size != 0) {
1898 filesize = ic->file_size;
1900 for(i = 0; i < ic->nb_streams; i++) {
1901 st = ic->streams[i];
1902 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1903 if (st->duration == AV_NOPTS_VALUE)
1904 st->duration = duration;
1910 #define DURATION_MAX_READ_SIZE 250000
1911 #define DURATION_MAX_RETRY 3
1913 /* only usable for MPEG-PS streams */
1914 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1916 AVPacket pkt1, *pkt = &pkt1;
1918 int read_size, i, ret;
1920 int64_t filesize, offset, duration;
1925 /* flush packet queue */
1926 flush_packet_queue(ic);
1928 for (i=0; i<ic->nb_streams; i++) {
1929 st = ic->streams[i];
1930 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1931 av_log(st->codec, AV_LOG_WARNING, "start time is not set in av_estimate_timings_from_pts\n");
1934 av_parser_close(st->parser);
1936 av_free_packet(&st->cur_pkt);
1940 /* estimate the end time (duration) */
1941 /* XXX: may need to support wrapping */
1942 filesize = ic->file_size;
1943 end_time = AV_NOPTS_VALUE;
1945 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
1949 avio_seek(ic->pb, offset, SEEK_SET);
1952 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
1956 ret = av_read_packet(ic, pkt);
1957 }while(ret == AVERROR(EAGAIN));
1960 read_size += pkt->size;
1961 st = ic->streams[pkt->stream_index];
1962 if (pkt->pts != AV_NOPTS_VALUE &&
1963 (st->start_time != AV_NOPTS_VALUE ||
1964 st->first_dts != AV_NOPTS_VALUE)) {
1965 duration = end_time = pkt->pts;
1966 if (st->start_time != AV_NOPTS_VALUE) duration -= st->start_time;
1967 else duration -= st->first_dts;
1969 duration += 1LL<<st->pts_wrap_bits;
1971 if (st->duration == AV_NOPTS_VALUE ||
1972 st->duration < duration)
1973 st->duration = duration;
1976 av_free_packet(pkt);
1978 }while( end_time==AV_NOPTS_VALUE
1979 && filesize > (DURATION_MAX_READ_SIZE<<retry)
1980 && ++retry <= DURATION_MAX_RETRY);
1982 fill_all_stream_timings(ic);
1984 avio_seek(ic->pb, old_offset, SEEK_SET);
1985 for (i=0; i<ic->nb_streams; i++) {
1987 st->cur_dts= st->first_dts;
1988 st->last_IP_pts = AV_NOPTS_VALUE;
1989 st->reference_dts = AV_NOPTS_VALUE;
1993 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
1997 /* get the file size, if possible */
1998 if (ic->iformat->flags & AVFMT_NOFILE) {
2001 file_size = avio_size(ic->pb);
2005 ic->file_size = file_size;
2007 if ((!strcmp(ic->iformat->name, "mpeg") ||
2008 !strcmp(ic->iformat->name, "mpegts")) &&
2009 file_size && ic->pb->seekable) {
2010 /* get accurate estimate from the PTSes */
2011 av_estimate_timings_from_pts(ic, old_offset);
2012 } else if (av_has_duration(ic)) {
2013 /* at least one component has timings - we use them for all
2015 fill_all_stream_timings(ic);
2017 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2018 /* less precise: use bitrate info */
2019 av_estimate_timings_from_bit_rate(ic);
2021 av_update_stream_timings(ic);
2025 AVStream av_unused *st;
2026 for(i = 0;i < ic->nb_streams; i++) {
2027 st = ic->streams[i];
2028 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2029 (double) st->start_time / AV_TIME_BASE,
2030 (double) st->duration / AV_TIME_BASE);
2032 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2033 (double) ic->start_time / AV_TIME_BASE,
2034 (double) ic->duration / AV_TIME_BASE,
2035 ic->bit_rate / 1000);
2039 static int has_codec_parameters(AVCodecContext *enc)
2042 switch(enc->codec_type) {
2043 case AVMEDIA_TYPE_AUDIO:
2044 val = enc->sample_rate && enc->channels && enc->sample_fmt != AV_SAMPLE_FMT_NONE;
2045 if(!enc->frame_size &&
2046 (enc->codec_id == CODEC_ID_VORBIS ||
2047 enc->codec_id == CODEC_ID_AAC ||
2048 enc->codec_id == CODEC_ID_MP1 ||
2049 enc->codec_id == CODEC_ID_MP2 ||
2050 enc->codec_id == CODEC_ID_MP3 ||
2051 enc->codec_id == CODEC_ID_SPEEX))
2054 case AVMEDIA_TYPE_VIDEO:
2055 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
2061 return enc->codec_id != CODEC_ID_NONE && val != 0;
2064 static int has_decode_delay_been_guessed(AVStream *st)
2066 return st->codec->codec_id != CODEC_ID_H264 ||
2067 st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2070 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
2074 int got_picture, data_size, ret=0;
2077 if(!st->codec->codec){
2078 codec = avcodec_find_decoder(st->codec->codec_id);
2081 ret = avcodec_open(st->codec, codec);
2086 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st)){
2087 switch(st->codec->codec_type) {
2088 case AVMEDIA_TYPE_VIDEO:
2089 avcodec_get_frame_defaults(&picture);
2090 ret = avcodec_decode_video2(st->codec, &picture,
2091 &got_picture, avpkt);
2093 case AVMEDIA_TYPE_AUDIO:
2094 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2095 samples = av_malloc(data_size);
2098 ret = avcodec_decode_audio3(st->codec, samples,
2110 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2112 while (tags->id != CODEC_ID_NONE) {
2120 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2123 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2124 if(tag == tags[i].tag)
2127 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2128 if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2131 return CODEC_ID_NONE;
2134 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2137 for(i=0; tags && tags[i]; i++){
2138 int tag= ff_codec_get_tag(tags[i], id);
2144 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2147 for(i=0; tags && tags[i]; i++){
2148 enum CodecID id= ff_codec_get_id(tags[i], tag);
2149 if(id!=CODEC_ID_NONE) return id;
2151 return CODEC_ID_NONE;
2154 static void compute_chapters_end(AVFormatContext *s)
2157 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2159 for (i = 0; i < s->nb_chapters; i++)
2160 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2161 AVChapter *ch = s->chapters[i];
2162 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2165 for (j = 0; j < s->nb_chapters; j++) {
2166 AVChapter *ch1 = s->chapters[j];
2167 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2168 if (j != i && next_start > ch->start && next_start < end)
2171 ch->end = (end == INT64_MAX) ? ch->start : end;
2175 static int get_std_framerate(int i){
2176 if(i<60*12) return i*1001;
2177 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2181 * Is the time base unreliable.
2182 * This is a heuristic to balance between quick acceptance of the values in
2183 * the headers vs. some extra checks.
2184 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2185 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2186 * And there are "variable" fps files this needs to detect as well.
2188 static int tb_unreliable(AVCodecContext *c){
2189 if( c->time_base.den >= 101L*c->time_base.num
2190 || c->time_base.den < 5L*c->time_base.num
2191 /* || c->codec_tag == AV_RL32("DIVX")
2192 || c->codec_tag == AV_RL32("XVID")*/
2193 || c->codec_id == CODEC_ID_MPEG2VIDEO
2194 || c->codec_id == CODEC_ID_H264
2200 int av_find_stream_info(AVFormatContext *ic)
2202 int i, count, ret, read_size, j;
2204 AVPacket pkt1, *pkt;
2205 int64_t old_offset = avio_tell(ic->pb);
2207 for(i=0;i<ic->nb_streams;i++) {
2209 st = ic->streams[i];
2210 if (st->codec->codec_id == CODEC_ID_AAC) {
2211 st->codec->sample_rate = 0;
2212 st->codec->frame_size = 0;
2213 st->codec->channels = 0;
2215 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2216 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2217 /* if(!st->time_base.num)
2219 if(!st->codec->time_base.num)
2220 st->codec->time_base= st->time_base;
2222 //only for the split stuff
2223 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2224 st->parser = av_parser_init(st->codec->codec_id);
2225 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2226 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2229 assert(!st->codec->codec);
2230 codec = avcodec_find_decoder(st->codec->codec_id);
2232 /* Force decoding of at least one frame of codec data
2233 * this makes sure the codec initializes the channel configuration
2234 * and does not trust the values from the container.
2236 if (codec && codec->capabilities & CODEC_CAP_CHANNEL_CONF)
2237 st->codec->channels = 0;
2239 /* Ensure that subtitle_header is properly set. */
2240 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2241 && codec && !st->codec->codec)
2242 avcodec_open(st->codec, codec);
2244 //try to just open decoders, in case this is enough to get parameters
2245 if(!has_codec_parameters(st->codec)){
2246 if (codec && !st->codec->codec)
2247 avcodec_open(st->codec, codec);
2251 for (i=0; i<ic->nb_streams; i++) {
2252 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2258 if(url_interrupt_cb()){
2260 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2264 /* check if one codec still needs to be handled */
2265 for(i=0;i<ic->nb_streams;i++) {
2266 int fps_analyze_framecount = 20;
2268 st = ic->streams[i];
2269 if (!has_codec_parameters(st->codec))
2271 /* if the timebase is coarse (like the usual millisecond precision
2272 of mkv), we need to analyze more frames to reliably arrive at
2274 if (av_q2d(st->time_base) > 0.0005)
2275 fps_analyze_framecount *= 2;
2276 if (ic->fps_probe_size >= 0)
2277 fps_analyze_framecount = ic->fps_probe_size;
2278 /* variable fps and no guess at the real fps */
2279 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2280 && st->info->duration_count < fps_analyze_framecount
2281 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2283 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2285 if(st->first_dts == AV_NOPTS_VALUE)
2288 if (i == ic->nb_streams) {
2289 /* NOTE: if the format has no header, then we need to read
2290 some packets to get most of the streams, so we cannot
2292 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2293 /* if we found the info for all the codecs, we can stop */
2295 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2299 /* we did not get all the codec info, but we read too much data */
2300 if (read_size >= ic->probesize) {
2302 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2306 /* NOTE: a new stream can be added there if no header in file
2307 (AVFMTCTX_NOHEADER) */
2308 ret = av_read_frame_internal(ic, &pkt1);
2309 if (ret < 0 && ret != AVERROR(EAGAIN)) {
2311 ret = -1; /* we could not have all the codec parameters before EOF */
2312 for(i=0;i<ic->nb_streams;i++) {
2313 st = ic->streams[i];
2314 if (!has_codec_parameters(st->codec)){
2316 avcodec_string(buf, sizeof(buf), st->codec, 0);
2317 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2325 if (ret == AVERROR(EAGAIN))
2328 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2329 if ((ret = av_dup_packet(pkt)) < 0)
2330 goto find_stream_info_err;
2332 read_size += pkt->size;
2334 st = ic->streams[pkt->stream_index];
2335 if (st->codec_info_nb_frames>1) {
2336 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) {
2337 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2340 st->info->codec_info_duration += pkt->duration;
2343 int64_t last = st->info->last_dts;
2344 int64_t duration= pkt->dts - last;
2346 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2347 double dur= duration * av_q2d(st->time_base);
2349 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2350 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2351 if (st->info->duration_count < 2)
2352 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2353 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2354 int framerate= get_std_framerate(i);
2355 int ticks= lrintf(dur*framerate/(1001*12));
2356 double error= dur - ticks*1001*12/(double)framerate;
2357 st->info->duration_error[i] += error*error;
2359 st->info->duration_count++;
2360 // ignore the first 4 values, they might have some random jitter
2361 if (st->info->duration_count > 3)
2362 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2364 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2365 st->info->last_dts = pkt->dts;
2367 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2368 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2370 st->codec->extradata_size= i;
2371 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2372 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2373 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2377 /* if still no information, we try to open the codec and to
2378 decompress the frame. We try to avoid that in most cases as
2379 it takes longer and uses more memory. For MPEG-4, we need to
2380 decompress for QuickTime. */
2381 if (!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st))
2382 try_decode_frame(st, pkt);
2384 st->codec_info_nb_frames++;
2388 // close codecs which were opened in try_decode_frame()
2389 for(i=0;i<ic->nb_streams;i++) {
2390 st = ic->streams[i];
2391 if(st->codec->codec)
2392 avcodec_close(st->codec);
2394 for(i=0;i<ic->nb_streams;i++) {
2395 st = ic->streams[i];
2396 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2397 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2398 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2399 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2400 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2401 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
2402 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2404 // the check for tb_unreliable() is not completely correct, since this is not about handling
2405 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2406 // ipmovie.c produces.
2407 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > 1 && !st->r_frame_rate.num)
2408 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);
2409 if (st->info->duration_count && !st->r_frame_rate.num
2410 && tb_unreliable(st->codec) /*&&
2411 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2412 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2414 double best_error= 2*av_q2d(st->time_base);
2415 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2417 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2418 double error = st->info->duration_error[j] * get_std_framerate(j);
2419 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2420 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2421 if(error < best_error){
2423 num = get_std_framerate(j);
2426 // do not increase frame rate by more than 1 % in order to match a standard rate.
2427 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2428 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2431 if (!st->r_frame_rate.num){
2432 if( st->codec->time_base.den * (int64_t)st->time_base.num
2433 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2434 st->r_frame_rate.num = st->codec->time_base.den;
2435 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2437 st->r_frame_rate.num = st->time_base.den;
2438 st->r_frame_rate.den = st->time_base.num;
2441 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2442 if(!st->codec->bits_per_coded_sample)
2443 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2444 // set stream disposition based on audio service type
2445 switch (st->codec->audio_service_type) {
2446 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2447 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2448 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2449 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2450 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2451 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2452 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2453 st->disposition = AV_DISPOSITION_COMMENT; break;
2454 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2455 st->disposition = AV_DISPOSITION_KARAOKE; break;
2460 av_estimate_timings(ic, old_offset);
2462 compute_chapters_end(ic);
2465 /* correct DTS for B-frame streams with no timestamps */
2466 for(i=0;i<ic->nb_streams;i++) {
2467 st = ic->streams[i];
2468 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2470 ppktl = &ic->packet_buffer;
2472 if(ppkt1->stream_index != i)
2474 if(ppkt1->pkt->dts < 0)
2476 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2478 ppkt1->pkt->dts -= delta;
2483 st->cur_dts -= delta;
2489 find_stream_info_err:
2490 for (i=0; i < ic->nb_streams; i++)
2491 av_freep(&ic->streams[i]->info);
2495 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2499 for (i = 0; i < ic->nb_programs; i++)
2500 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2501 if (ic->programs[i]->stream_index[j] == s)
2502 return ic->programs[i];
2506 int av_find_best_stream(AVFormatContext *ic,
2507 enum AVMediaType type,
2508 int wanted_stream_nb,
2510 AVCodec **decoder_ret,
2513 int i, nb_streams = ic->nb_streams;
2514 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2515 unsigned *program = NULL;
2516 AVCodec *decoder = NULL, *best_decoder = NULL;
2518 if (related_stream >= 0 && wanted_stream_nb < 0) {
2519 AVProgram *p = find_program_from_stream(ic, related_stream);
2521 program = p->stream_index;
2522 nb_streams = p->nb_stream_indexes;
2525 for (i = 0; i < nb_streams; i++) {
2526 int real_stream_index = program ? program[i] : i;
2527 AVStream *st = ic->streams[real_stream_index];
2528 AVCodecContext *avctx = st->codec;
2529 if (avctx->codec_type != type)
2531 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2533 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2536 decoder = avcodec_find_decoder(st->codec->codec_id);
2539 ret = AVERROR_DECODER_NOT_FOUND;
2543 if (best_count >= st->codec_info_nb_frames)
2545 best_count = st->codec_info_nb_frames;
2546 ret = real_stream_index;
2547 best_decoder = decoder;
2548 if (program && i == nb_streams - 1 && ret < 0) {
2550 nb_streams = ic->nb_streams;
2551 i = 0; /* no related stream found, try again with everything */
2555 *decoder_ret = best_decoder;
2559 /*******************************************************/
2561 int av_read_play(AVFormatContext *s)
2563 if (s->iformat->read_play)
2564 return s->iformat->read_play(s);
2566 return avio_pause(s->pb, 0);
2567 return AVERROR(ENOSYS);
2570 int av_read_pause(AVFormatContext *s)
2572 if (s->iformat->read_pause)
2573 return s->iformat->read_pause(s);
2575 return avio_pause(s->pb, 1);
2576 return AVERROR(ENOSYS);
2579 void av_close_input_stream(AVFormatContext *s)
2581 flush_packet_queue(s);
2582 if (s->iformat->read_close)
2583 s->iformat->read_close(s);
2584 avformat_free_context(s);
2587 void avformat_free_context(AVFormatContext *s)
2593 if (s->iformat && s->iformat->priv_class && s->priv_data)
2594 av_opt_free(s->priv_data);
2596 for(i=0;i<s->nb_streams;i++) {
2597 /* free all data in a stream component */
2600 av_parser_close(st->parser);
2601 av_free_packet(&st->cur_pkt);
2603 av_dict_free(&st->metadata);
2604 av_free(st->index_entries);
2605 av_free(st->codec->extradata);
2606 av_free(st->codec->subtitle_header);
2608 av_free(st->priv_data);
2612 for(i=s->nb_programs-1; i>=0; i--) {
2613 av_dict_free(&s->programs[i]->metadata);
2614 av_freep(&s->programs[i]->stream_index);
2615 av_freep(&s->programs[i]);
2617 av_freep(&s->programs);
2618 av_freep(&s->priv_data);
2619 while(s->nb_chapters--) {
2620 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2621 av_free(s->chapters[s->nb_chapters]);
2623 av_freep(&s->chapters);
2624 av_dict_free(&s->metadata);
2625 av_freep(&s->streams);
2629 void av_close_input_file(AVFormatContext *s)
2631 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2633 av_close_input_stream(s);
2638 AVStream *av_new_stream(AVFormatContext *s, int id)
2644 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2646 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2649 s->streams = streams;
2651 st = av_mallocz(sizeof(AVStream));
2654 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2659 st->codec= avcodec_alloc_context();
2661 /* no default bitrate if decoding */
2662 st->codec->bit_rate = 0;
2664 st->index = s->nb_streams;
2666 st->start_time = AV_NOPTS_VALUE;
2667 st->duration = AV_NOPTS_VALUE;
2668 /* we set the current DTS to 0 so that formats without any timestamps
2669 but durations get some timestamps, formats with some unknown
2670 timestamps have their first few packets buffered and the
2671 timestamps corrected before they are returned to the user */
2673 st->first_dts = AV_NOPTS_VALUE;
2674 st->probe_packets = MAX_PROBE_PACKETS;
2676 /* default pts setting is MPEG-like */
2677 av_set_pts_info(st, 33, 1, 90000);
2678 st->last_IP_pts = AV_NOPTS_VALUE;
2679 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2680 st->pts_buffer[i]= AV_NOPTS_VALUE;
2681 st->reference_dts = AV_NOPTS_VALUE;
2683 st->sample_aspect_ratio = (AVRational){0,1};
2685 s->streams[s->nb_streams++] = st;
2689 AVProgram *av_new_program(AVFormatContext *ac, int id)
2691 AVProgram *program=NULL;
2694 av_dlog(ac, "new_program: id=0x%04x\n", id);
2696 for(i=0; i<ac->nb_programs; i++)
2697 if(ac->programs[i]->id == id)
2698 program = ac->programs[i];
2701 program = av_mallocz(sizeof(AVProgram));
2704 dynarray_add(&ac->programs, &ac->nb_programs, program);
2705 program->discard = AVDISCARD_NONE;
2712 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2714 AVChapter *chapter = NULL;
2717 for(i=0; i<s->nb_chapters; i++)
2718 if(s->chapters[i]->id == id)
2719 chapter = s->chapters[i];
2722 chapter= av_mallocz(sizeof(AVChapter));
2725 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2727 av_dict_set(&chapter->metadata, "title", title, 0);
2729 chapter->time_base= time_base;
2730 chapter->start = start;
2736 /************************************************************/
2737 /* output media file */
2739 #if FF_API_FORMAT_PARAMETERS
2740 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2744 if (s->oformat->priv_data_size > 0) {
2745 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2747 return AVERROR(ENOMEM);
2748 if (s->oformat->priv_class) {
2749 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2750 av_opt_set_defaults(s->priv_data);
2753 s->priv_data = NULL;
2755 if (s->oformat->set_parameters) {
2756 ret = s->oformat->set_parameters(s, ap);
2764 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2766 const AVCodecTag *avctag;
2768 enum CodecID id = CODEC_ID_NONE;
2769 unsigned int tag = 0;
2772 * Check that tag + id is in the table
2773 * If neither is in the table -> OK
2774 * If tag is in the table with another id -> FAIL
2775 * If id is in the table with another tag -> FAIL unless strict < normal
2777 for (n = 0; s->oformat->codec_tag[n]; n++) {
2778 avctag = s->oformat->codec_tag[n];
2779 while (avctag->id != CODEC_ID_NONE) {
2780 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2782 if (id == st->codec->codec_id)
2785 if (avctag->id == st->codec->codec_id)
2790 if (id != CODEC_ID_NONE)
2792 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2797 #if FF_API_FORMAT_PARAMETERS
2798 int av_write_header(AVFormatContext *s)
2800 return avformat_write_header(s, NULL);
2804 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2808 AVDictionary *tmp = NULL;
2811 av_dict_copy(&tmp, *options, 0);
2812 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2815 // some sanity checks
2816 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2817 av_log(s, AV_LOG_ERROR, "no streams\n");
2818 ret = AVERROR(EINVAL);
2822 for(i=0;i<s->nb_streams;i++) {
2825 switch (st->codec->codec_type) {
2826 case AVMEDIA_TYPE_AUDIO:
2827 if(st->codec->sample_rate<=0){
2828 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2829 ret = AVERROR(EINVAL);
2832 if(!st->codec->block_align)
2833 st->codec->block_align = st->codec->channels *
2834 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2836 case AVMEDIA_TYPE_VIDEO:
2837 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2838 av_log(s, AV_LOG_ERROR, "time base not set\n");
2839 ret = AVERROR(EINVAL);
2842 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2843 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2844 ret = AVERROR(EINVAL);
2847 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2848 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2849 ret = AVERROR(EINVAL);
2855 if(s->oformat->codec_tag){
2856 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)){
2857 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2858 st->codec->codec_tag= 0;
2860 if(st->codec->codec_tag){
2861 if (!validate_codec_tag(s, st)) {
2863 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2864 av_log(s, AV_LOG_ERROR,
2865 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
2866 tagbuf, st->codec->codec_tag, st->codec->codec_id);
2867 ret = AVERROR_INVALIDDATA;
2871 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2874 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2875 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2876 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2879 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2880 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2881 if (!s->priv_data) {
2882 ret = AVERROR(ENOMEM);
2885 if (s->oformat->priv_class) {
2886 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2887 av_opt_set_defaults(s->priv_data);
2888 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2893 /* set muxer identification string */
2894 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2895 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
2898 if(s->oformat->write_header){
2899 ret = s->oformat->write_header(s);
2904 /* init PTS generation */
2905 for(i=0;i<s->nb_streams;i++) {
2906 int64_t den = AV_NOPTS_VALUE;
2909 switch (st->codec->codec_type) {
2910 case AVMEDIA_TYPE_AUDIO:
2911 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2913 case AVMEDIA_TYPE_VIDEO:
2914 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2919 if (den != AV_NOPTS_VALUE) {
2921 ret = AVERROR_INVALIDDATA;
2924 av_frac_init(&st->pts, 0, 0, den);
2929 av_dict_free(options);
2938 //FIXME merge with compute_pkt_fields
2939 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
2940 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2941 int num, den, frame_size, i;
2943 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
2944 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
2946 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2947 return AVERROR(EINVAL);*/
2949 /* duration field */
2950 if (pkt->duration == 0) {
2951 compute_frame_duration(&num, &den, st, NULL, pkt);
2953 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2957 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2960 //XXX/FIXME this is a temporary hack until all encoders output pts
2961 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2963 // pkt->pts= st->cur_dts;
2964 pkt->pts= st->pts.val;
2967 //calculate dts from pts
2968 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2969 st->pts_buffer[0]= pkt->pts;
2970 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2971 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
2972 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2973 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2975 pkt->dts= st->pts_buffer[0];
2978 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2979 av_log(s, AV_LOG_ERROR,
2980 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
2981 st->index, st->cur_dts, pkt->dts);
2982 return AVERROR(EINVAL);
2984 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2985 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
2986 return AVERROR(EINVAL);
2989 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2990 st->cur_dts= pkt->dts;
2991 st->pts.val= pkt->dts;
2994 switch (st->codec->codec_type) {
2995 case AVMEDIA_TYPE_AUDIO:
2996 frame_size = get_audio_frame_size(st->codec, pkt->size);
2998 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2999 likely equal to the encoder delay, but it would be better if we
3000 had the real timestamps from the encoder */
3001 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3002 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3005 case AVMEDIA_TYPE_VIDEO:
3006 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3014 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3016 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3018 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3021 ret= s->oformat->write_packet(s, pkt);
3025 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3026 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3028 AVPacketList **next_point, *this_pktl;
3030 this_pktl = av_mallocz(sizeof(AVPacketList));
3031 this_pktl->pkt= *pkt;
3032 pkt->destruct= NULL; // do not free original but only the copy
3033 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3035 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3036 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3038 next_point = &s->packet_buffer;
3041 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3042 while(!compare(s, &(*next_point)->pkt, pkt)){
3043 next_point= &(*next_point)->next;
3047 next_point = &(s->packet_buffer_end->next);
3050 assert(!*next_point);
3052 s->packet_buffer_end= this_pktl;
3055 this_pktl->next= *next_point;
3057 s->streams[pkt->stream_index]->last_in_packet_buffer=
3058 *next_point= this_pktl;
3061 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3063 AVStream *st = s->streams[ pkt ->stream_index];
3064 AVStream *st2= s->streams[ next->stream_index];
3065 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3069 return pkt->stream_index < next->stream_index;
3073 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3079 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3082 for(i=0; i < s->nb_streams; i++)
3083 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3085 if(stream_count && (s->nb_streams == stream_count || flush)){
3086 pktl= s->packet_buffer;
3089 s->packet_buffer= pktl->next;
3090 if(!s->packet_buffer)
3091 s->packet_buffer_end= NULL;
3093 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3094 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3098 av_init_packet(out);
3104 * Interleave an AVPacket correctly so it can be muxed.
3105 * @param out the interleaved packet will be output here
3106 * @param in the input packet
3107 * @param flush 1 if no further packets are available as input and all
3108 * remaining packets should be output
3109 * @return 1 if a packet was output, 0 if no packet could be output,
3110 * < 0 if an error occurred
3112 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3113 if(s->oformat->interleave_packet)
3114 return s->oformat->interleave_packet(s, out, in, flush);
3116 return av_interleave_packet_per_dts(s, out, in, flush);
3119 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3120 AVStream *st= s->streams[ pkt->stream_index];
3123 //FIXME/XXX/HACK drop zero sized packets
3124 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3127 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3128 pkt->size, pkt->dts, pkt->pts);
3129 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3132 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3133 return AVERROR(EINVAL);
3137 int ret= av_interleave_packet(s, &opkt, pkt, 0);
3138 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3141 ret= s->oformat->write_packet(s, &opkt);
3143 av_free_packet(&opkt);
3151 int av_write_trailer(AVFormatContext *s)
3157 ret= av_interleave_packet(s, &pkt, NULL, 1);
3158 if(ret<0) //FIXME cleanup needed for ret<0 ?
3163 ret= s->oformat->write_packet(s, &pkt);
3165 av_free_packet(&pkt);
3171 if(s->oformat->write_trailer)
3172 ret = s->oformat->write_trailer(s);
3174 for(i=0;i<s->nb_streams;i++) {
3175 av_freep(&s->streams[i]->priv_data);
3176 av_freep(&s->streams[i]->index_entries);
3178 if (s->iformat && s->iformat->priv_class)
3179 av_opt_free(s->priv_data);
3180 av_freep(&s->priv_data);
3184 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3187 AVProgram *program=NULL;
3190 if (idx >= ac->nb_streams) {
3191 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3195 for(i=0; i<ac->nb_programs; i++){
3196 if(ac->programs[i]->id != progid)
3198 program = ac->programs[i];
3199 for(j=0; j<program->nb_stream_indexes; j++)
3200 if(program->stream_index[j] == idx)
3203 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3206 program->stream_index = tmp;
3207 program->stream_index[program->nb_stream_indexes++] = idx;
3212 static void print_fps(double d, const char *postfix){
3213 uint64_t v= lrintf(d*100);
3214 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3215 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3216 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3219 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3221 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3222 AVDictionaryEntry *tag=NULL;
3224 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3225 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3226 if(strcmp("language", tag->key))
3227 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
3232 /* "user interface" functions */
3233 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3236 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3237 AVStream *st = ic->streams[i];
3238 int g = av_gcd(st->time_base.num, st->time_base.den);
3239 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3240 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3241 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3242 /* the pid is an important information, so we display it */
3243 /* XXX: add a generic system */
3244 if (flags & AVFMT_SHOW_IDS)
3245 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3247 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3248 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3249 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3250 if (st->sample_aspect_ratio.num && // default
3251 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3252 AVRational display_aspect_ratio;
3253 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3254 st->codec->width*st->sample_aspect_ratio.num,
3255 st->codec->height*st->sample_aspect_ratio.den,
3257 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3258 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3259 display_aspect_ratio.num, display_aspect_ratio.den);
3261 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3262 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3263 print_fps(av_q2d(st->avg_frame_rate), "fps");
3264 if(st->r_frame_rate.den && st->r_frame_rate.num)
3265 print_fps(av_q2d(st->r_frame_rate), "tbr");
3266 if(st->time_base.den && st->time_base.num)
3267 print_fps(1/av_q2d(st->time_base), "tbn");
3268 if(st->codec->time_base.den && st->codec->time_base.num)
3269 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3271 if (st->disposition & AV_DISPOSITION_DEFAULT)
3272 av_log(NULL, AV_LOG_INFO, " (default)");
3273 if (st->disposition & AV_DISPOSITION_DUB)
3274 av_log(NULL, AV_LOG_INFO, " (dub)");
3275 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3276 av_log(NULL, AV_LOG_INFO, " (original)");
3277 if (st->disposition & AV_DISPOSITION_COMMENT)
3278 av_log(NULL, AV_LOG_INFO, " (comment)");
3279 if (st->disposition & AV_DISPOSITION_LYRICS)
3280 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3281 if (st->disposition & AV_DISPOSITION_KARAOKE)
3282 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3283 if (st->disposition & AV_DISPOSITION_FORCED)
3284 av_log(NULL, AV_LOG_INFO, " (forced)");
3285 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3286 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3287 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3288 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3289 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3290 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3291 av_log(NULL, AV_LOG_INFO, "\n");
3292 dump_metadata(NULL, st->metadata, " ");
3295 #if FF_API_DUMP_FORMAT
3296 void dump_format(AVFormatContext *ic,
3301 av_dump_format(ic, index, url, is_output);
3305 void av_dump_format(AVFormatContext *ic,
3311 uint8_t *printed = av_mallocz(ic->nb_streams);
3312 if (ic->nb_streams && !printed)
3315 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3316 is_output ? "Output" : "Input",
3318 is_output ? ic->oformat->name : ic->iformat->name,
3319 is_output ? "to" : "from", url);
3320 dump_metadata(NULL, ic->metadata, " ");
3322 av_log(NULL, AV_LOG_INFO, " Duration: ");
3323 if (ic->duration != AV_NOPTS_VALUE) {
3324 int hours, mins, secs, us;
3325 secs = ic->duration / AV_TIME_BASE;
3326 us = ic->duration % AV_TIME_BASE;
3331 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3332 (100 * us) / AV_TIME_BASE);
3334 av_log(NULL, AV_LOG_INFO, "N/A");
3336 if (ic->start_time != AV_NOPTS_VALUE) {
3338 av_log(NULL, AV_LOG_INFO, ", start: ");
3339 secs = ic->start_time / AV_TIME_BASE;
3340 us = abs(ic->start_time % AV_TIME_BASE);
3341 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3342 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3344 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3346 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3348 av_log(NULL, AV_LOG_INFO, "N/A");
3350 av_log(NULL, AV_LOG_INFO, "\n");
3352 for (i = 0; i < ic->nb_chapters; i++) {
3353 AVChapter *ch = ic->chapters[i];
3354 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3355 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3356 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3358 dump_metadata(NULL, ch->metadata, " ");
3360 if(ic->nb_programs) {
3361 int j, k, total = 0;
3362 for(j=0; j<ic->nb_programs; j++) {
3363 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3365 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3366 name ? name->value : "");
3367 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3368 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3369 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3370 printed[ic->programs[j]->stream_index[k]] = 1;
3372 total += ic->programs[j]->nb_stream_indexes;
3374 if (total < ic->nb_streams)
3375 av_log(NULL, AV_LOG_INFO, " No Program\n");
3377 for(i=0;i<ic->nb_streams;i++)
3379 dump_stream_format(ic, i, index, is_output);
3384 int64_t av_gettime(void)
3387 gettimeofday(&tv,NULL);
3388 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3391 uint64_t ff_ntp_time(void)
3393 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3396 #if FF_API_PARSE_DATE
3397 #include "libavutil/parseutils.h"
3399 int64_t parse_date(const char *timestr, int duration)
3402 av_parse_time(&timeval, timestr, duration);
3407 #if FF_API_FIND_INFO_TAG
3408 #include "libavutil/parseutils.h"
3410 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3412 return av_find_info_tag(arg, arg_size, tag1, info);
3416 int av_get_frame_filename(char *buf, int buf_size,
3417 const char *path, int number)
3420 char *q, buf1[20], c;
3421 int nd, len, percentd_found;
3433 while (isdigit(*p)) {
3434 nd = nd * 10 + *p++ - '0';
3437 } while (isdigit(c));
3446 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3448 if ((q - buf + len) > buf_size - 1)
3450 memcpy(q, buf1, len);
3458 if ((q - buf) < buf_size - 1)
3462 if (!percentd_found)
3471 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3475 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3477 for(i=0;i<size;i+=16) {
3484 PRINT(" %02x", buf[i+j]);
3489 for(j=0;j<len;j++) {
3491 if (c < ' ' || c > '~')
3500 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3502 hex_dump_internal(NULL, f, 0, buf, size);
3505 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3507 hex_dump_internal(avcl, NULL, level, buf, size);
3510 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3513 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3514 PRINT("stream #%d:\n", pkt->stream_index);
3515 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3516 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3517 /* DTS is _always_ valid after av_read_frame() */
3519 if (pkt->dts == AV_NOPTS_VALUE)
3522 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3523 /* PTS may not be known if B-frames are present. */
3525 if (pkt->pts == AV_NOPTS_VALUE)
3528 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3530 PRINT(" size=%d\n", pkt->size);
3533 av_hex_dump(f, pkt->data, pkt->size);
3537 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3539 AVRational tb = { 1, AV_TIME_BASE };
3540 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3544 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3546 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3550 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3552 AVRational tb = { 1, AV_TIME_BASE };
3553 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3557 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3560 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3563 void av_url_split(char *proto, int proto_size,
3564 char *authorization, int authorization_size,
3565 char *hostname, int hostname_size,
3567 char *path, int path_size,
3570 const char *p, *ls, *at, *col, *brk;
3572 if (port_ptr) *port_ptr = -1;
3573 if (proto_size > 0) proto[0] = 0;
3574 if (authorization_size > 0) authorization[0] = 0;
3575 if (hostname_size > 0) hostname[0] = 0;
3576 if (path_size > 0) path[0] = 0;
3578 /* parse protocol */
3579 if ((p = strchr(url, ':'))) {
3580 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3585 /* no protocol means plain filename */
3586 av_strlcpy(path, url, path_size);
3590 /* separate path from hostname */
3591 ls = strchr(p, '/');
3593 ls = strchr(p, '?');
3595 av_strlcpy(path, ls, path_size);
3597 ls = &p[strlen(p)]; // XXX
3599 /* the rest is hostname, use that to parse auth/port */
3601 /* authorization (user[:pass]@hostname) */
3602 if ((at = strchr(p, '@')) && at < ls) {
3603 av_strlcpy(authorization, p,
3604 FFMIN(authorization_size, at + 1 - p));
3605 p = at + 1; /* skip '@' */
3608 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3610 av_strlcpy(hostname, p + 1,
3611 FFMIN(hostname_size, brk - p));
3612 if (brk[1] == ':' && port_ptr)
3613 *port_ptr = atoi(brk + 2);
3614 } else if ((col = strchr(p, ':')) && col < ls) {
3615 av_strlcpy(hostname, p,
3616 FFMIN(col + 1 - p, hostname_size));
3617 if (port_ptr) *port_ptr = atoi(col + 1);
3619 av_strlcpy(hostname, p,
3620 FFMIN(ls + 1 - p, hostname_size));
3624 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3627 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3630 'C', 'D', 'E', 'F' };
3631 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3634 'c', 'd', 'e', 'f' };
3635 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3637 for(i = 0; i < s; i++) {
3638 buff[i * 2] = hex_table[src[i] >> 4];
3639 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3645 int ff_hex_to_data(uint8_t *data, const char *p)
3652 p += strspn(p, SPACE_CHARS);
3655 c = toupper((unsigned char) *p++);
3656 if (c >= '0' && c <= '9')
3658 else if (c >= 'A' && c <= 'F')
3673 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3674 unsigned int pts_num, unsigned int pts_den)
3677 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3678 if(new_tb.num != pts_num)
3679 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3681 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3683 if(new_tb.num <= 0 || new_tb.den <= 0) {
3684 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3687 s->time_base = new_tb;
3688 s->pts_wrap_bits = pts_wrap_bits;
3691 int ff_url_join(char *str, int size, const char *proto,
3692 const char *authorization, const char *hostname,
3693 int port, const char *fmt, ...)
3696 struct addrinfo hints, *ai;
3701 av_strlcatf(str, size, "%s://", proto);
3702 if (authorization && authorization[0])
3703 av_strlcatf(str, size, "%s@", authorization);
3704 #if CONFIG_NETWORK && defined(AF_INET6)
3705 /* Determine if hostname is a numerical IPv6 address,
3706 * properly escape it within [] in that case. */
3707 memset(&hints, 0, sizeof(hints));
3708 hints.ai_flags = AI_NUMERICHOST;
3709 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3710 if (ai->ai_family == AF_INET6) {
3711 av_strlcat(str, "[", size);
3712 av_strlcat(str, hostname, size);
3713 av_strlcat(str, "]", size);
3715 av_strlcat(str, hostname, size);
3720 /* Not an IPv6 address, just output the plain string. */
3721 av_strlcat(str, hostname, size);
3724 av_strlcatf(str, size, ":%d", port);
3727 int len = strlen(str);
3730 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3736 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3737 AVFormatContext *src)
3742 local_pkt.stream_index = dst_stream;
3743 if (pkt->pts != AV_NOPTS_VALUE)
3744 local_pkt.pts = av_rescale_q(pkt->pts,
3745 src->streams[pkt->stream_index]->time_base,
3746 dst->streams[dst_stream]->time_base);
3747 if (pkt->dts != AV_NOPTS_VALUE)
3748 local_pkt.dts = av_rescale_q(pkt->dts,
3749 src->streams[pkt->stream_index]->time_base,
3750 dst->streams[dst_stream]->time_base);
3751 return av_write_frame(dst, &local_pkt);
3754 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3757 const char *ptr = str;
3759 /* Parse key=value pairs. */
3762 char *dest = NULL, *dest_end;
3763 int key_len, dest_len = 0;
3765 /* Skip whitespace and potential commas. */
3766 while (*ptr && (isspace(*ptr) || *ptr == ','))
3773 if (!(ptr = strchr(key, '=')))
3776 key_len = ptr - key;
3778 callback_get_buf(context, key, key_len, &dest, &dest_len);
3779 dest_end = dest + dest_len - 1;
3783 while (*ptr && *ptr != '\"') {
3787 if (dest && dest < dest_end)
3791 if (dest && dest < dest_end)
3799 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3800 if (dest && dest < dest_end)
3808 int ff_find_stream_index(AVFormatContext *s, int id)
3811 for (i = 0; i < s->nb_streams; i++) {
3812 if (s->streams[i]->id == id)
3818 void ff_make_absolute_url(char *buf, int size, const char *base,
3822 /* Absolute path, relative to the current server */
3823 if (base && strstr(base, "://") && rel[0] == '/') {
3825 av_strlcpy(buf, base, size);
3826 sep = strstr(buf, "://");
3829 sep = strchr(sep, '/');
3833 av_strlcat(buf, rel, size);
3836 /* If rel actually is an absolute url, just copy it */
3837 if (!base || strstr(rel, "://") || rel[0] == '/') {
3838 av_strlcpy(buf, rel, size);
3842 av_strlcpy(buf, base, size);
3843 /* Remove the file name from the base url */
3844 sep = strrchr(buf, '/');
3849 while (av_strstart(rel, "../", NULL) && sep) {
3850 /* Remove the path delimiter at the end */
3852 sep = strrchr(buf, '/');
3853 /* If the next directory name to pop off is "..", break here */
3854 if (!strcmp(sep ? &sep[1] : buf, "..")) {
3855 /* Readd the slash we just removed */
3856 av_strlcat(buf, "/", size);
3859 /* Cut off the directory name */
3866 av_strlcat(buf, rel, size);