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"
32 #include "libavutil/avstring.h"
34 #include "audiointerleave.h"
49 * various utility functions for use within Libav
52 unsigned avformat_version(void)
54 return LIBAVFORMAT_VERSION_INT;
57 const char *avformat_configuration(void)
59 return LIBAV_CONFIGURATION;
62 const char *avformat_license(void)
64 #define LICENSE_PREFIX "libavformat license: "
65 return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
68 /* fraction handling */
71 * f = val + (num / den) + 0.5.
73 * 'num' is normalized so that it is such as 0 <= num < den.
75 * @param f fractional number
76 * @param val integer value
77 * @param num must be >= 0
78 * @param den must be >= 1
80 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
93 * Fractional addition to f: f = f + (incr / f->den).
95 * @param f fractional number
96 * @param incr increment, can be positive or negative
98 static void av_frac_add(AVFrac *f, int64_t incr)
111 } else if (num >= den) {
118 /** head of registered input format linked list */
119 static AVInputFormat *first_iformat = NULL;
120 /** head of registered output format linked list */
121 static AVOutputFormat *first_oformat = NULL;
123 AVInputFormat *av_iformat_next(AVInputFormat *f)
125 if(f) return f->next;
126 else return first_iformat;
129 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
131 if(f) return f->next;
132 else return first_oformat;
135 void av_register_input_format(AVInputFormat *format)
139 while (*p != NULL) p = &(*p)->next;
144 void av_register_output_format(AVOutputFormat *format)
148 while (*p != NULL) p = &(*p)->next;
153 int av_match_ext(const char *filename, const char *extensions)
161 ext = strrchr(filename, '.');
167 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
170 if (!strcasecmp(ext1, ext))
180 static int match_format(const char *name, const char *names)
188 namelen = strlen(name);
189 while ((p = strchr(names, ','))) {
190 len = FFMAX(p - names, namelen);
191 if (!strncasecmp(name, names, len))
195 return !strcasecmp(name, names);
198 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
199 const char *mime_type)
201 AVOutputFormat *fmt = NULL, *fmt_found;
202 int score_max, score;
204 /* specific test for image sequences */
205 #if CONFIG_IMAGE2_MUXER
206 if (!short_name && filename &&
207 av_filename_number_test(filename) &&
208 ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
209 return av_guess_format("image2", NULL, NULL);
212 /* Find the proper file type. */
215 while ((fmt = av_oformat_next(fmt))) {
217 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
219 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
221 if (filename && fmt->extensions &&
222 av_match_ext(filename, fmt->extensions)) {
225 if (score > score_max) {
233 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
234 const char *filename, const char *mime_type, enum AVMediaType type){
235 if(type == AVMEDIA_TYPE_VIDEO){
236 enum CodecID codec_id= CODEC_ID_NONE;
238 #if CONFIG_IMAGE2_MUXER
239 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
240 codec_id= ff_guess_image2_codec(filename);
243 if(codec_id == CODEC_ID_NONE)
244 codec_id= fmt->video_codec;
246 }else if(type == AVMEDIA_TYPE_AUDIO)
247 return fmt->audio_codec;
248 else if (type == AVMEDIA_TYPE_SUBTITLE)
249 return fmt->subtitle_codec;
251 return CODEC_ID_NONE;
254 AVInputFormat *av_find_input_format(const char *short_name)
256 AVInputFormat *fmt = NULL;
257 while ((fmt = av_iformat_next(fmt))) {
258 if (match_format(short_name, fmt->name))
265 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
267 int ret= av_new_packet(pkt, size);
272 pkt->pos= avio_tell(s);
274 ret= avio_read(s, pkt->data, size);
278 av_shrink_packet(pkt, ret);
283 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
288 return av_get_packet(s, pkt, size);
289 old_size = pkt->size;
290 ret = av_grow_packet(pkt, size);
293 ret = avio_read(s, pkt->data + old_size, size);
294 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
299 int av_filename_number_test(const char *filename)
302 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
305 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
307 AVProbeData lpd = *pd;
308 AVInputFormat *fmt1 = NULL, *fmt;
311 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
312 int id3len = ff_id3v2_tag_len(lpd.buf);
313 if (lpd.buf_size > id3len + 16) {
315 lpd.buf_size -= id3len;
321 while ((fmt1 = av_iformat_next(fmt1))) {
322 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
325 if (fmt1->read_probe) {
326 score = fmt1->read_probe(&lpd);
327 } else if (fmt1->extensions) {
328 if (av_match_ext(lpd.filename, fmt1->extensions)) {
332 if (score > *score_max) {
335 }else if (score == *score_max)
339 /* a hack for files with huge id3v2 tags -- try to guess by file extension. */
340 if (!fmt && id3 && *score_max < AVPROBE_SCORE_MAX/4) {
341 while ((fmt = av_iformat_next(fmt)))
342 if (fmt->extensions && av_match_ext(lpd.filename, fmt->extensions)) {
343 *score_max = AVPROBE_SCORE_MAX/4;
351 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
353 return av_probe_input_format2(pd, is_opened, &score);
356 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
358 static const struct {
359 const char *name; enum CodecID id; enum AVMediaType type;
361 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
362 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
363 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
364 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
365 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
366 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
367 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
368 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
371 AVInputFormat *fmt = av_probe_input_format2(pd, 1, &score);
375 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
376 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
377 for (i = 0; fmt_id_type[i].name; i++) {
378 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
379 st->codec->codec_id = fmt_id_type[i].id;
380 st->codec->codec_type = fmt_id_type[i].type;
388 /************************************************************/
389 /* input media file */
392 * Open a media file from an IO stream. 'fmt' must be specified.
394 int av_open_input_stream(AVFormatContext **ic_ptr,
395 AVIOContext *pb, const char *filename,
396 AVInputFormat *fmt, AVFormatParameters *ap)
400 AVFormatParameters default_ap;
404 memset(ap, 0, sizeof(default_ap));
407 if(!ap->prealloced_context)
408 ic = avformat_alloc_context();
412 err = AVERROR(ENOMEM);
417 ic->duration = AV_NOPTS_VALUE;
418 ic->start_time = AV_NOPTS_VALUE;
419 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
421 /* allocate private data */
422 if (fmt->priv_data_size > 0) {
423 ic->priv_data = av_mallocz(fmt->priv_data_size);
424 if (!ic->priv_data) {
425 err = AVERROR(ENOMEM);
428 if (fmt->priv_class) {
429 *(const AVClass**)ic->priv_data = fmt->priv_class;
430 av_opt_set_defaults(ic->priv_data);
433 ic->priv_data = NULL;
436 // e.g. AVFMT_NOFILE formats will not have a AVIOContext
438 ff_id3v2_read(ic, ID3v2_DEFAULT_MAGIC);
440 if (ic->iformat->read_header) {
441 err = ic->iformat->read_header(ic, ap);
446 if (pb && !ic->data_offset)
447 ic->data_offset = avio_tell(ic->pb);
449 ic->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
456 av_freep(&ic->priv_data);
457 for(i=0;i<ic->nb_streams;i++) {
458 AVStream *st = ic->streams[i];
460 av_free(st->priv_data);
461 av_free(st->codec->extradata);
473 /** size of probe buffer, for guessing file type from file contents */
474 #define PROBE_BUF_MIN 2048
475 #define PROBE_BUF_MAX (1<<20)
477 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
478 const char *filename, void *logctx,
479 unsigned int offset, unsigned int max_probe_size)
481 AVProbeData pd = { filename ? filename : "", NULL, -offset };
482 unsigned char *buf = NULL;
483 int ret = 0, probe_size;
485 if (!max_probe_size) {
486 max_probe_size = PROBE_BUF_MAX;
487 } else if (max_probe_size > PROBE_BUF_MAX) {
488 max_probe_size = PROBE_BUF_MAX;
489 } else if (max_probe_size < PROBE_BUF_MIN) {
490 return AVERROR(EINVAL);
493 if (offset >= max_probe_size) {
494 return AVERROR(EINVAL);
497 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt && ret >= 0;
498 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
499 int ret, score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
500 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
502 if (probe_size < offset) {
506 /* read probe data */
507 buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
508 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
509 /* fail if error was not end of file, otherwise, lower score */
510 if (ret != AVERROR_EOF) {
515 ret = 0; /* error was end of file, nothing read */
518 pd.buf = &buf[offset];
520 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
522 /* guess file format */
523 *fmt = av_probe_input_format2(&pd, 1, &score);
525 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
526 av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
528 av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
534 return AVERROR_INVALIDDATA;
537 /* rewind. reuse probe buffer to avoid seeking */
538 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
544 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
547 AVFormatParameters *ap)
550 AVProbeData probe_data, *pd = &probe_data;
551 AVIOContext *pb = NULL;
552 void *logctx= ap && ap->prealloced_context ? *ic_ptr : NULL;
556 pd->filename = filename;
561 /* guess format if no file can be opened */
562 fmt = av_probe_input_format(pd, 0);
565 /* Do not open file if the format does not need it. XXX: specific
566 hack needed to handle RTSP/TCP */
567 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
568 /* if no file needed do not try to open one */
569 if ((err=avio_open(&pb, filename, AVIO_FLAG_READ)) < 0) {
573 ffio_set_buf_size(pb, buf_size);
575 if (!fmt && (err = av_probe_input_buffer(pb, &fmt, filename, logctx, 0, logctx ? (*ic_ptr)->probesize : 0)) < 0) {
580 /* if still no format found, error */
582 err = AVERROR_INVALIDDATA;
586 /* check filename in case an image number is expected */
587 if (fmt->flags & AVFMT_NEEDNUMBER) {
588 if (!av_filename_number_test(filename)) {
589 err = AVERROR(EINVAL);
593 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
601 if (ap && ap->prealloced_context)
608 /*******************************************************/
610 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
611 AVPacketList **plast_pktl){
612 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
617 (*plast_pktl)->next = pktl;
619 *packet_buffer = pktl;
621 /* add the packet in the buffered packet list */
627 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
633 AVPacketList *pktl = s->raw_packet_buffer;
637 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
638 !s->streams[pkt->stream_index]->probe_packets ||
639 s->raw_packet_buffer_remaining_size < pkt->size){
640 AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
643 s->raw_packet_buffer = pktl->next;
644 s->raw_packet_buffer_remaining_size += pkt->size;
651 ret= s->iformat->read_packet(s, pkt);
653 if (!pktl || ret == AVERROR(EAGAIN))
655 for (i = 0; i < s->nb_streams; i++)
656 s->streams[i]->probe_packets = 0;
659 st= s->streams[pkt->stream_index];
661 switch(st->codec->codec_type){
662 case AVMEDIA_TYPE_VIDEO:
663 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
665 case AVMEDIA_TYPE_AUDIO:
666 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
668 case AVMEDIA_TYPE_SUBTITLE:
669 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
673 if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
677 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
678 s->raw_packet_buffer_remaining_size -= pkt->size;
680 if(st->codec->codec_id == CODEC_ID_PROBE){
681 AVProbeData *pd = &st->probe_data;
682 av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
685 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
686 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
687 pd->buf_size += pkt->size;
688 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
690 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
691 //FIXME we dont reduce score to 0 for the case of running out of buffer space in bytes
692 set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0);
693 if(st->codec->codec_id != CODEC_ID_PROBE){
696 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
703 /**********************************************************/
706 * Get the number of samples of an audio frame. Return -1 on error.
708 static int get_audio_frame_size(AVCodecContext *enc, int size)
712 if(enc->codec_id == CODEC_ID_VORBIS)
715 if (enc->frame_size <= 1) {
716 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
718 if (bits_per_sample) {
719 if (enc->channels == 0)
721 frame_size = (size << 3) / (bits_per_sample * enc->channels);
723 /* used for example by ADPCM codecs */
724 if (enc->bit_rate == 0)
726 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
729 frame_size = enc->frame_size;
736 * Return the frame duration in seconds. Return 0 if not available.
738 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
739 AVCodecParserContext *pc, AVPacket *pkt)
745 switch(st->codec->codec_type) {
746 case AVMEDIA_TYPE_VIDEO:
747 if(st->time_base.num*1000LL > st->time_base.den){
748 *pnum = st->time_base.num;
749 *pden = st->time_base.den;
750 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
751 *pnum = st->codec->time_base.num;
752 *pden = st->codec->time_base.den;
753 if (pc && pc->repeat_pict) {
754 *pnum = (*pnum) * (1 + pc->repeat_pict);
756 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
757 //Thus if we have no parser in such case leave duration undefined.
758 if(st->codec->ticks_per_frame>1 && !pc){
763 case AVMEDIA_TYPE_AUDIO:
764 frame_size = get_audio_frame_size(st->codec, pkt->size);
765 if (frame_size <= 0 || st->codec->sample_rate <= 0)
768 *pden = st->codec->sample_rate;
775 static int is_intra_only(AVCodecContext *enc){
776 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
778 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
779 switch(enc->codec_id){
781 case CODEC_ID_MJPEGB:
783 case CODEC_ID_RAWVIDEO:
784 case CODEC_ID_DVVIDEO:
785 case CODEC_ID_HUFFYUV:
786 case CODEC_ID_FFVHUFF:
791 case CODEC_ID_JPEG2000:
799 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
800 int64_t dts, int64_t pts)
802 AVStream *st= s->streams[stream_index];
803 AVPacketList *pktl= s->packet_buffer;
805 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
808 st->first_dts= dts - st->cur_dts;
811 for(; pktl; pktl= pktl->next){
812 if(pktl->pkt.stream_index != stream_index)
814 //FIXME think more about this check
815 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
816 pktl->pkt.pts += st->first_dts;
818 if(pktl->pkt.dts != AV_NOPTS_VALUE)
819 pktl->pkt.dts += st->first_dts;
821 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
822 st->start_time= pktl->pkt.pts;
824 if (st->start_time == AV_NOPTS_VALUE)
825 st->start_time = pts;
828 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
830 AVPacketList *pktl= s->packet_buffer;
833 if(st->first_dts != AV_NOPTS_VALUE){
834 cur_dts= st->first_dts;
835 for(; pktl; pktl= pktl->next){
836 if(pktl->pkt.stream_index == pkt->stream_index){
837 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
839 cur_dts -= pkt->duration;
842 pktl= s->packet_buffer;
843 st->first_dts = cur_dts;
844 }else if(st->cur_dts)
847 for(; pktl; pktl= pktl->next){
848 if(pktl->pkt.stream_index != pkt->stream_index)
850 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
851 && !pktl->pkt.duration){
852 pktl->pkt.dts= cur_dts;
853 if(!st->codec->has_b_frames)
854 pktl->pkt.pts= cur_dts;
855 cur_dts += pkt->duration;
856 pktl->pkt.duration= pkt->duration;
860 if(st->first_dts == AV_NOPTS_VALUE)
861 st->cur_dts= cur_dts;
864 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
865 AVCodecParserContext *pc, AVPacket *pkt)
867 int num, den, presentation_delayed, delay, i;
870 if (s->flags & AVFMT_FLAG_NOFILLIN)
873 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
874 pkt->dts= AV_NOPTS_VALUE;
876 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
877 //FIXME Set low_delay = 0 when has_b_frames = 1
878 st->codec->has_b_frames = 1;
880 /* do we have a video B-frame ? */
881 delay= st->codec->has_b_frames;
882 presentation_delayed = 0;
884 // ignore delay caused by frame threading so that the mpeg2-without-dts
885 // warning will not trigger
886 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
887 delay -= st->codec->thread_count-1;
889 /* XXX: need has_b_frame, but cannot get it if the codec is
892 pc && pc->pict_type != AV_PICTURE_TYPE_B)
893 presentation_delayed = 1;
895 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
896 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
897 pkt->dts -= 1LL<<st->pts_wrap_bits;
900 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
901 // we take the conservative approach and discard both
902 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
903 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
904 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
905 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
908 if (pkt->duration == 0) {
909 compute_frame_duration(&num, &den, st, pc, pkt);
911 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
913 if(pkt->duration != 0 && s->packet_buffer)
914 update_initial_durations(s, st, pkt);
918 /* correct timestamps with byte offset if demuxers only have timestamps
919 on packet boundaries */
920 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
921 /* this will estimate bitrate based on this frame's duration and size */
922 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
923 if(pkt->pts != AV_NOPTS_VALUE)
925 if(pkt->dts != AV_NOPTS_VALUE)
929 if (pc && pc->dts_sync_point >= 0) {
930 // we have synchronization info from the parser
931 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
933 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
934 if (pkt->dts != AV_NOPTS_VALUE) {
935 // got DTS from the stream, update reference timestamp
936 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
937 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
938 } else if (st->reference_dts != AV_NOPTS_VALUE) {
939 // compute DTS based on reference timestamp
940 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
941 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
943 if (pc->dts_sync_point > 0)
944 st->reference_dts = pkt->dts; // new reference
948 /* This may be redundant, but it should not hurt. */
949 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
950 presentation_delayed = 1;
952 // 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);
953 /* interpolate PTS and DTS if they are not present */
954 //We skip H264 currently because delay and has_b_frames are not reliably set
955 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
956 if (presentation_delayed) {
957 /* DTS = decompression timestamp */
958 /* PTS = presentation timestamp */
959 if (pkt->dts == AV_NOPTS_VALUE)
960 pkt->dts = st->last_IP_pts;
961 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
962 if (pkt->dts == AV_NOPTS_VALUE)
963 pkt->dts = st->cur_dts;
965 /* this is tricky: the dts must be incremented by the duration
966 of the frame we are displaying, i.e. the last I- or P-frame */
967 if (st->last_IP_duration == 0)
968 st->last_IP_duration = pkt->duration;
969 if(pkt->dts != AV_NOPTS_VALUE)
970 st->cur_dts = pkt->dts + st->last_IP_duration;
971 st->last_IP_duration = pkt->duration;
972 st->last_IP_pts= pkt->pts;
973 /* cannot compute PTS if not present (we can compute it only
974 by knowing the future */
975 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
976 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
977 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
978 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
979 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
980 pkt->pts += pkt->duration;
981 // 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);
985 /* presentation is not delayed : PTS and DTS are the same */
986 if(pkt->pts == AV_NOPTS_VALUE)
988 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
989 if(pkt->pts == AV_NOPTS_VALUE)
990 pkt->pts = st->cur_dts;
992 if(pkt->pts != AV_NOPTS_VALUE)
993 st->cur_dts = pkt->pts + pkt->duration;
997 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
998 st->pts_buffer[0]= pkt->pts;
999 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1000 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1001 if(pkt->dts == AV_NOPTS_VALUE)
1002 pkt->dts= st->pts_buffer[0];
1003 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1004 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1006 if(pkt->dts > st->cur_dts)
1007 st->cur_dts = pkt->dts;
1010 // 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);
1013 if(is_intra_only(st->codec))
1014 pkt->flags |= AV_PKT_FLAG_KEY;
1017 /* keyframe computation */
1018 if (pc->key_frame == 1)
1019 pkt->flags |= AV_PKT_FLAG_KEY;
1020 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1021 pkt->flags |= AV_PKT_FLAG_KEY;
1024 pkt->convergence_duration = pc->convergence_duration;
1028 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1033 av_init_packet(pkt);
1036 /* select current input stream component */
1039 if (!st->need_parsing || !st->parser) {
1040 /* no parsing needed: we just output the packet as is */
1041 /* raw data support */
1042 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
1043 compute_pkt_fields(s, st, NULL, pkt);
1045 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1046 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1047 ff_reduce_index(s, st->index);
1048 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1051 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1052 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1053 st->cur_ptr, st->cur_len,
1054 st->cur_pkt.pts, st->cur_pkt.dts,
1056 st->cur_pkt.pts = AV_NOPTS_VALUE;
1057 st->cur_pkt.dts = AV_NOPTS_VALUE;
1058 /* increment read pointer */
1062 /* return packet if any */
1066 pkt->stream_index = st->index;
1067 pkt->pts = st->parser->pts;
1068 pkt->dts = st->parser->dts;
1069 pkt->pos = st->parser->pos;
1070 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1072 pkt->destruct= st->cur_pkt.destruct;
1073 st->cur_pkt.destruct= NULL;
1074 st->cur_pkt.data = NULL;
1075 assert(st->cur_len == 0);
1077 pkt->destruct = NULL;
1079 compute_pkt_fields(s, st, st->parser, pkt);
1081 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1082 ff_reduce_index(s, st->index);
1083 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1084 0, 0, AVINDEX_KEYFRAME);
1091 av_free_packet(&st->cur_pkt);
1096 /* read next packet */
1097 ret = av_read_packet(s, &cur_pkt);
1099 if (ret == AVERROR(EAGAIN))
1101 /* return the last frames, if any */
1102 for(i = 0; i < s->nb_streams; i++) {
1104 if (st->parser && st->need_parsing) {
1105 av_parser_parse2(st->parser, st->codec,
1106 &pkt->data, &pkt->size,
1108 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1114 /* no more packets: really terminate parsing */
1117 st = s->streams[cur_pkt.stream_index];
1118 st->cur_pkt= cur_pkt;
1120 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1121 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1122 st->cur_pkt.pts < st->cur_pkt.dts){
1123 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1124 st->cur_pkt.stream_index,
1128 // av_free_packet(&st->cur_pkt);
1132 if(s->debug & FF_FDEBUG_TS)
1133 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1134 st->cur_pkt.stream_index,
1138 st->cur_pkt.duration,
1142 st->cur_ptr = st->cur_pkt.data;
1143 st->cur_len = st->cur_pkt.size;
1144 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1145 st->parser = av_parser_init(st->codec->codec_id);
1147 /* no parser available: just output the raw packets */
1148 st->need_parsing = AVSTREAM_PARSE_NONE;
1149 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1150 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1151 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1152 st->parser->flags |= PARSER_FLAG_ONCE;
1157 if(s->debug & FF_FDEBUG_TS)
1158 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1169 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1173 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1176 pktl = s->packet_buffer;
1178 AVPacket *next_pkt= &pktl->pkt;
1180 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1181 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1182 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1183 if( pktl->pkt.stream_index == next_pkt->stream_index
1184 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1185 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1186 next_pkt->pts= pktl->pkt.dts;
1190 pktl = s->packet_buffer;
1193 if( next_pkt->pts != AV_NOPTS_VALUE
1194 || next_pkt->dts == AV_NOPTS_VALUE
1196 /* read packet from packet buffer, if there is data */
1198 s->packet_buffer = pktl->next;
1204 int ret= av_read_frame_internal(s, pkt);
1206 if(pktl && ret != AVERROR(EAGAIN)){
1213 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1214 &s->packet_buffer_end)) < 0)
1215 return AVERROR(ENOMEM);
1217 assert(!s->packet_buffer);
1218 return av_read_frame_internal(s, pkt);
1223 /* XXX: suppress the packet queue */
1224 static void flush_packet_queue(AVFormatContext *s)
1229 pktl = s->packet_buffer;
1232 s->packet_buffer = pktl->next;
1233 av_free_packet(&pktl->pkt);
1236 while(s->raw_packet_buffer){
1237 pktl = s->raw_packet_buffer;
1238 s->raw_packet_buffer = pktl->next;
1239 av_free_packet(&pktl->pkt);
1242 s->packet_buffer_end=
1243 s->raw_packet_buffer_end= NULL;
1244 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1247 /*******************************************************/
1250 int av_find_default_stream_index(AVFormatContext *s)
1252 int first_audio_index = -1;
1256 if (s->nb_streams <= 0)
1258 for(i = 0; i < s->nb_streams; i++) {
1260 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1263 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1264 first_audio_index = i;
1266 return first_audio_index >= 0 ? first_audio_index : 0;
1270 * Flush the frame reader.
1272 void ff_read_frame_flush(AVFormatContext *s)
1277 flush_packet_queue(s);
1281 /* for each stream, reset read state */
1282 for(i = 0; i < s->nb_streams; i++) {
1286 av_parser_close(st->parser);
1288 av_free_packet(&st->cur_pkt);
1290 st->last_IP_pts = AV_NOPTS_VALUE;
1291 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1292 st->reference_dts = AV_NOPTS_VALUE;
1297 st->probe_packets = MAX_PROBE_PACKETS;
1299 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1300 st->pts_buffer[j]= AV_NOPTS_VALUE;
1304 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1307 for(i = 0; i < s->nb_streams; i++) {
1308 AVStream *st = s->streams[i];
1310 st->cur_dts = av_rescale(timestamp,
1311 st->time_base.den * (int64_t)ref_st->time_base.num,
1312 st->time_base.num * (int64_t)ref_st->time_base.den);
1316 void ff_reduce_index(AVFormatContext *s, int stream_index)
1318 AVStream *st= s->streams[stream_index];
1319 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1321 if((unsigned)st->nb_index_entries >= max_entries){
1323 for(i=0; 2*i<st->nb_index_entries; i++)
1324 st->index_entries[i]= st->index_entries[2*i];
1325 st->nb_index_entries= i;
1329 int ff_add_index_entry(AVIndexEntry **index_entries,
1330 int *nb_index_entries,
1331 unsigned int *index_entries_allocated_size,
1332 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1334 AVIndexEntry *entries, *ie;
1337 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1340 entries = av_fast_realloc(*index_entries,
1341 index_entries_allocated_size,
1342 (*nb_index_entries + 1) *
1343 sizeof(AVIndexEntry));
1347 *index_entries= entries;
1349 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1352 index= (*nb_index_entries)++;
1353 ie= &entries[index];
1354 assert(index==0 || ie[-1].timestamp < timestamp);
1356 ie= &entries[index];
1357 if(ie->timestamp != timestamp){
1358 if(ie->timestamp <= timestamp)
1360 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1361 (*nb_index_entries)++;
1362 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1363 distance= ie->min_distance;
1367 ie->timestamp = timestamp;
1368 ie->min_distance= distance;
1375 int av_add_index_entry(AVStream *st,
1376 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1378 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1379 &st->index_entries_allocated_size, pos,
1380 timestamp, size, distance, flags);
1383 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1384 int64_t wanted_timestamp, int flags)
1392 //optimize appending index entries at the end
1393 if(b && entries[b-1].timestamp < wanted_timestamp)
1398 timestamp = entries[m].timestamp;
1399 if(timestamp >= wanted_timestamp)
1401 if(timestamp <= wanted_timestamp)
1404 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1406 if(!(flags & AVSEEK_FLAG_ANY)){
1407 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1408 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1417 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1420 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1421 wanted_timestamp, flags);
1426 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1427 AVInputFormat *avif= s->iformat;
1428 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1429 int64_t ts_min, ts_max, ts;
1434 if (stream_index < 0)
1438 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1442 ts_min= AV_NOPTS_VALUE;
1443 pos_limit= -1; //gcc falsely says it may be uninitialized
1445 st= s->streams[stream_index];
1446 if(st->index_entries){
1449 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()
1450 index= FFMAX(index, 0);
1451 e= &st->index_entries[index];
1453 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1455 ts_min= e->timestamp;
1457 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1464 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1465 assert(index < st->nb_index_entries);
1467 e= &st->index_entries[index];
1468 assert(e->timestamp >= target_ts);
1470 ts_max= e->timestamp;
1471 pos_limit= pos_max - e->min_distance;
1473 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1474 pos_max,pos_limit, ts_max);
1479 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1484 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1487 av_update_cur_dts(s, st, ts);
1492 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 )){
1494 int64_t start_pos, filesize;
1498 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1501 if(ts_min == AV_NOPTS_VALUE){
1502 pos_min = s->data_offset;
1503 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1504 if (ts_min == AV_NOPTS_VALUE)
1508 if(ts_max == AV_NOPTS_VALUE){
1510 filesize = avio_size(s->pb);
1511 pos_max = filesize - 1;
1514 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1516 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1517 if (ts_max == AV_NOPTS_VALUE)
1521 int64_t tmp_pos= pos_max + 1;
1522 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1523 if(tmp_ts == AV_NOPTS_VALUE)
1527 if(tmp_pos >= filesize)
1533 if(ts_min > ts_max){
1535 }else if(ts_min == ts_max){
1540 while (pos_min < pos_limit) {
1542 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1546 assert(pos_limit <= pos_max);
1549 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1550 // interpolate position (better than dichotomy)
1551 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1552 + pos_min - approximate_keyframe_distance;
1553 }else if(no_change==1){
1554 // bisection, if interpolation failed to change min or max pos last time
1555 pos = (pos_min + pos_limit)>>1;
1557 /* linear search if bisection failed, can only happen if there
1558 are very few or no keyframes between min/max */
1563 else if(pos > pos_limit)
1567 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1573 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1574 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit,
1575 start_pos, no_change);
1577 if(ts == AV_NOPTS_VALUE){
1578 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1581 assert(ts != AV_NOPTS_VALUE);
1582 if (target_ts <= ts) {
1583 pos_limit = start_pos - 1;
1587 if (target_ts >= ts) {
1593 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1594 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1597 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1599 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1600 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1601 pos, ts_min, target_ts, ts_max);
1607 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1608 int64_t pos_min, pos_max;
1612 if (stream_index < 0)
1615 st= s->streams[stream_index];
1618 pos_min = s->data_offset;
1619 pos_max = avio_size(s->pb) - 1;
1621 if (pos < pos_min) pos= pos_min;
1622 else if(pos > pos_max) pos= pos_max;
1624 avio_seek(s->pb, pos, SEEK_SET);
1627 av_update_cur_dts(s, st, ts);
1632 static int av_seek_frame_generic(AVFormatContext *s,
1633 int stream_index, int64_t timestamp, int flags)
1640 st = s->streams[stream_index];
1642 index = av_index_search_timestamp(st, timestamp, flags);
1644 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1647 if(index < 0 || index==st->nb_index_entries-1){
1651 if(st->nb_index_entries){
1652 assert(st->index_entries);
1653 ie= &st->index_entries[st->nb_index_entries-1];
1654 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1656 av_update_cur_dts(s, st, ie->timestamp);
1658 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1664 ret = av_read_frame(s, &pkt);
1665 }while(ret == AVERROR(EAGAIN));
1668 av_free_packet(&pkt);
1669 if(stream_index == pkt.stream_index){
1670 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1674 index = av_index_search_timestamp(st, timestamp, flags);
1679 ff_read_frame_flush(s);
1680 if (s->iformat->read_seek){
1681 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1684 ie = &st->index_entries[index];
1685 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1687 av_update_cur_dts(s, st, ie->timestamp);
1692 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1697 ff_read_frame_flush(s);
1699 if(flags & AVSEEK_FLAG_BYTE)
1700 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1702 if(stream_index < 0){
1703 stream_index= av_find_default_stream_index(s);
1704 if(stream_index < 0)
1707 st= s->streams[stream_index];
1708 /* timestamp for default must be expressed in AV_TIME_BASE units */
1709 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1712 /* first, we try the format specific seek */
1713 if (s->iformat->read_seek)
1714 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1721 if(s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH))
1722 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1723 else if (!(s->iformat->flags & AVFMT_NOGENSEARCH))
1724 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1729 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1731 if(min_ts > ts || max_ts < ts)
1734 ff_read_frame_flush(s);
1736 if (s->iformat->read_seek2)
1737 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1739 if(s->iformat->read_timestamp){
1740 //try to seek via read_timestamp()
1743 //Fallback to old API if new is not implemented but old is
1744 //Note the old has somewat different sematics
1745 if(s->iformat->read_seek || 1)
1746 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1748 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1751 /*******************************************************/
1754 * Return TRUE if the stream has accurate duration in any stream.
1756 * @return TRUE if the stream has accurate duration for at least one component.
1758 static int av_has_duration(AVFormatContext *ic)
1763 for(i = 0;i < ic->nb_streams; i++) {
1764 st = ic->streams[i];
1765 if (st->duration != AV_NOPTS_VALUE)
1772 * Estimate the stream timings from the one of each components.
1774 * Also computes the global bitrate if possible.
1776 static void av_update_stream_timings(AVFormatContext *ic)
1778 int64_t start_time, start_time1, end_time, end_time1;
1779 int64_t duration, duration1;
1783 start_time = INT64_MAX;
1784 end_time = INT64_MIN;
1785 duration = INT64_MIN;
1786 for(i = 0;i < ic->nb_streams; i++) {
1787 st = ic->streams[i];
1788 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1789 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1790 if (start_time1 < start_time)
1791 start_time = start_time1;
1792 if (st->duration != AV_NOPTS_VALUE) {
1793 end_time1 = start_time1
1794 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1795 if (end_time1 > end_time)
1796 end_time = end_time1;
1799 if (st->duration != AV_NOPTS_VALUE) {
1800 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1801 if (duration1 > duration)
1802 duration = duration1;
1805 if (start_time != INT64_MAX) {
1806 ic->start_time = start_time;
1807 if (end_time != INT64_MIN) {
1808 if (end_time - start_time > duration)
1809 duration = end_time - start_time;
1812 if (duration != INT64_MIN) {
1813 ic->duration = duration;
1814 if (ic->file_size > 0) {
1815 /* compute the bitrate */
1816 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1817 (double)ic->duration;
1822 static void fill_all_stream_timings(AVFormatContext *ic)
1827 av_update_stream_timings(ic);
1828 for(i = 0;i < ic->nb_streams; i++) {
1829 st = ic->streams[i];
1830 if (st->start_time == AV_NOPTS_VALUE) {
1831 if(ic->start_time != AV_NOPTS_VALUE)
1832 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1833 if(ic->duration != AV_NOPTS_VALUE)
1834 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1839 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1841 int64_t filesize, duration;
1845 /* if bit_rate is already set, we believe it */
1846 if (ic->bit_rate <= 0) {
1848 for(i=0;i<ic->nb_streams;i++) {
1849 st = ic->streams[i];
1850 if (st->codec->bit_rate > 0)
1851 bit_rate += st->codec->bit_rate;
1853 ic->bit_rate = bit_rate;
1856 /* if duration is already set, we believe it */
1857 if (ic->duration == AV_NOPTS_VALUE &&
1858 ic->bit_rate != 0 &&
1859 ic->file_size != 0) {
1860 filesize = ic->file_size;
1862 for(i = 0; i < ic->nb_streams; i++) {
1863 st = ic->streams[i];
1864 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1865 if (st->duration == AV_NOPTS_VALUE)
1866 st->duration = duration;
1872 #define DURATION_MAX_READ_SIZE 250000
1873 #define DURATION_MAX_RETRY 3
1875 /* only usable for MPEG-PS streams */
1876 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1878 AVPacket pkt1, *pkt = &pkt1;
1880 int read_size, i, ret;
1882 int64_t filesize, offset, duration;
1887 /* flush packet queue */
1888 flush_packet_queue(ic);
1890 for (i=0; i<ic->nb_streams; i++) {
1891 st = ic->streams[i];
1892 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1893 av_log(st->codec, AV_LOG_WARNING, "start time is not set in av_estimate_timings_from_pts\n");
1896 av_parser_close(st->parser);
1898 av_free_packet(&st->cur_pkt);
1902 /* estimate the end time (duration) */
1903 /* XXX: may need to support wrapping */
1904 filesize = ic->file_size;
1905 end_time = AV_NOPTS_VALUE;
1907 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
1911 avio_seek(ic->pb, offset, SEEK_SET);
1914 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
1918 ret = av_read_packet(ic, pkt);
1919 }while(ret == AVERROR(EAGAIN));
1922 read_size += pkt->size;
1923 st = ic->streams[pkt->stream_index];
1924 if (pkt->pts != AV_NOPTS_VALUE &&
1925 (st->start_time != AV_NOPTS_VALUE ||
1926 st->first_dts != AV_NOPTS_VALUE)) {
1927 duration = end_time = pkt->pts;
1928 if (st->start_time != AV_NOPTS_VALUE) duration -= st->start_time;
1929 else duration -= st->first_dts;
1931 duration += 1LL<<st->pts_wrap_bits;
1933 if (st->duration == AV_NOPTS_VALUE ||
1934 st->duration < duration)
1935 st->duration = duration;
1938 av_free_packet(pkt);
1940 }while( end_time==AV_NOPTS_VALUE
1941 && filesize > (DURATION_MAX_READ_SIZE<<retry)
1942 && ++retry <= DURATION_MAX_RETRY);
1944 fill_all_stream_timings(ic);
1946 avio_seek(ic->pb, old_offset, SEEK_SET);
1947 for (i=0; i<ic->nb_streams; i++) {
1949 st->cur_dts= st->first_dts;
1950 st->last_IP_pts = AV_NOPTS_VALUE;
1954 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
1958 /* get the file size, if possible */
1959 if (ic->iformat->flags & AVFMT_NOFILE) {
1962 file_size = avio_size(ic->pb);
1966 ic->file_size = file_size;
1968 if ((!strcmp(ic->iformat->name, "mpeg") ||
1969 !strcmp(ic->iformat->name, "mpegts")) &&
1970 file_size && ic->pb->seekable) {
1971 /* get accurate estimate from the PTSes */
1972 av_estimate_timings_from_pts(ic, old_offset);
1973 } else if (av_has_duration(ic)) {
1974 /* at least one component has timings - we use them for all
1976 fill_all_stream_timings(ic);
1978 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
1979 /* less precise: use bitrate info */
1980 av_estimate_timings_from_bit_rate(ic);
1982 av_update_stream_timings(ic);
1986 AVStream av_unused *st;
1987 for(i = 0;i < ic->nb_streams; i++) {
1988 st = ic->streams[i];
1989 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
1990 (double) st->start_time / AV_TIME_BASE,
1991 (double) st->duration / AV_TIME_BASE);
1993 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1994 (double) ic->start_time / AV_TIME_BASE,
1995 (double) ic->duration / AV_TIME_BASE,
1996 ic->bit_rate / 1000);
2000 static int has_codec_parameters(AVCodecContext *enc)
2003 switch(enc->codec_type) {
2004 case AVMEDIA_TYPE_AUDIO:
2005 val = enc->sample_rate && enc->channels && enc->sample_fmt != AV_SAMPLE_FMT_NONE;
2006 if(!enc->frame_size &&
2007 (enc->codec_id == CODEC_ID_VORBIS ||
2008 enc->codec_id == CODEC_ID_AAC ||
2009 enc->codec_id == CODEC_ID_MP1 ||
2010 enc->codec_id == CODEC_ID_MP2 ||
2011 enc->codec_id == CODEC_ID_MP3 ||
2012 enc->codec_id == CODEC_ID_SPEEX))
2015 case AVMEDIA_TYPE_VIDEO:
2016 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
2022 return enc->codec_id != CODEC_ID_NONE && val != 0;
2025 static int has_decode_delay_been_guessed(AVStream *st)
2027 return st->codec->codec_id != CODEC_ID_H264 ||
2028 st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2031 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
2035 int got_picture, data_size, ret=0;
2038 if(!st->codec->codec){
2039 codec = avcodec_find_decoder(st->codec->codec_id);
2042 ret = avcodec_open(st->codec, codec);
2047 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st)){
2048 switch(st->codec->codec_type) {
2049 case AVMEDIA_TYPE_VIDEO:
2050 avcodec_get_frame_defaults(&picture);
2051 ret = avcodec_decode_video2(st->codec, &picture,
2052 &got_picture, avpkt);
2054 case AVMEDIA_TYPE_AUDIO:
2055 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2056 samples = av_malloc(data_size);
2059 ret = avcodec_decode_audio3(st->codec, samples,
2071 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2073 while (tags->id != CODEC_ID_NONE) {
2081 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2084 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2085 if(tag == tags[i].tag)
2088 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2089 if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2092 return CODEC_ID_NONE;
2095 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2098 for(i=0; tags && tags[i]; i++){
2099 int tag= ff_codec_get_tag(tags[i], id);
2105 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2108 for(i=0; tags && tags[i]; i++){
2109 enum CodecID id= ff_codec_get_id(tags[i], tag);
2110 if(id!=CODEC_ID_NONE) return id;
2112 return CODEC_ID_NONE;
2115 static void compute_chapters_end(AVFormatContext *s)
2118 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2120 for (i = 0; i < s->nb_chapters; i++)
2121 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2122 AVChapter *ch = s->chapters[i];
2123 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2126 for (j = 0; j < s->nb_chapters; j++) {
2127 AVChapter *ch1 = s->chapters[j];
2128 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2129 if (j != i && next_start > ch->start && next_start < end)
2132 ch->end = (end == INT64_MAX) ? ch->start : end;
2136 static int get_std_framerate(int i){
2137 if(i<60*12) return i*1001;
2138 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2142 * Is the time base unreliable.
2143 * This is a heuristic to balance between quick acceptance of the values in
2144 * the headers vs. some extra checks.
2145 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2146 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2147 * And there are "variable" fps files this needs to detect as well.
2149 static int tb_unreliable(AVCodecContext *c){
2150 if( c->time_base.den >= 101L*c->time_base.num
2151 || c->time_base.den < 5L*c->time_base.num
2152 /* || c->codec_tag == AV_RL32("DIVX")
2153 || c->codec_tag == AV_RL32("XVID")*/
2154 || c->codec_id == CODEC_ID_MPEG2VIDEO
2155 || c->codec_id == CODEC_ID_H264
2161 int av_find_stream_info(AVFormatContext *ic)
2163 int i, count, ret, read_size, j;
2165 AVPacket pkt1, *pkt;
2166 int64_t old_offset = avio_tell(ic->pb);
2168 for(i=0;i<ic->nb_streams;i++) {
2170 st = ic->streams[i];
2171 if (st->codec->codec_id == CODEC_ID_AAC) {
2172 st->codec->sample_rate = 0;
2173 st->codec->frame_size = 0;
2174 st->codec->channels = 0;
2176 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2177 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2178 /* if(!st->time_base.num)
2180 if(!st->codec->time_base.num)
2181 st->codec->time_base= st->time_base;
2183 //only for the split stuff
2184 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2185 st->parser = av_parser_init(st->codec->codec_id);
2186 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2187 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2190 assert(!st->codec->codec);
2191 codec = avcodec_find_decoder(st->codec->codec_id);
2193 /* Force decoding of at least one frame of codec data
2194 * this makes sure the codec initializes the channel configuration
2195 * and does not trust the values from the container.
2197 if (codec && codec->capabilities & CODEC_CAP_CHANNEL_CONF)
2198 st->codec->channels = 0;
2200 /* Ensure that subtitle_header is properly set. */
2201 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2202 && codec && !st->codec->codec)
2203 avcodec_open(st->codec, codec);
2205 //try to just open decoders, in case this is enough to get parameters
2206 if(!has_codec_parameters(st->codec)){
2207 if (codec && !st->codec->codec)
2208 avcodec_open(st->codec, codec);
2212 for (i=0; i<ic->nb_streams; i++) {
2213 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2219 if(url_interrupt_cb()){
2221 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2225 /* check if one codec still needs to be handled */
2226 for(i=0;i<ic->nb_streams;i++) {
2227 int fps_analyze_framecount = 20;
2229 st = ic->streams[i];
2230 if (!has_codec_parameters(st->codec))
2232 /* if the timebase is coarse (like the usual millisecond precision
2233 of mkv), we need to analyze more frames to reliably arrive at
2235 if (av_q2d(st->time_base) > 0.0005)
2236 fps_analyze_framecount *= 2;
2237 if (ic->fps_probe_size >= 0)
2238 fps_analyze_framecount = ic->fps_probe_size;
2239 /* variable fps and no guess at the real fps */
2240 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2241 && st->info->duration_count < fps_analyze_framecount
2242 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2244 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2246 if(st->first_dts == AV_NOPTS_VALUE)
2249 if (i == ic->nb_streams) {
2250 /* NOTE: if the format has no header, then we need to read
2251 some packets to get most of the streams, so we cannot
2253 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2254 /* if we found the info for all the codecs, we can stop */
2256 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2260 /* we did not get all the codec info, but we read too much data */
2261 if (read_size >= ic->probesize) {
2263 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2267 /* NOTE: a new stream can be added there if no header in file
2268 (AVFMTCTX_NOHEADER) */
2269 ret = av_read_frame_internal(ic, &pkt1);
2270 if (ret < 0 && ret != AVERROR(EAGAIN)) {
2272 ret = -1; /* we could not have all the codec parameters before EOF */
2273 for(i=0;i<ic->nb_streams;i++) {
2274 st = ic->streams[i];
2275 if (!has_codec_parameters(st->codec)){
2277 avcodec_string(buf, sizeof(buf), st->codec, 0);
2278 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2286 if (ret == AVERROR(EAGAIN))
2289 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2290 if ((ret = av_dup_packet(pkt)) < 0)
2291 goto find_stream_info_err;
2293 read_size += pkt->size;
2295 st = ic->streams[pkt->stream_index];
2296 if (st->codec_info_nb_frames>1) {
2297 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) {
2298 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2301 st->info->codec_info_duration += pkt->duration;
2304 int64_t last = st->info->last_dts;
2305 int64_t duration= pkt->dts - last;
2307 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2308 double dur= duration * av_q2d(st->time_base);
2310 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2311 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2312 if (st->info->duration_count < 2)
2313 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2314 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2315 int framerate= get_std_framerate(i);
2316 int ticks= lrintf(dur*framerate/(1001*12));
2317 double error= dur - ticks*1001*12/(double)framerate;
2318 st->info->duration_error[i] += error*error;
2320 st->info->duration_count++;
2321 // ignore the first 4 values, they might have some random jitter
2322 if (st->info->duration_count > 3)
2323 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2325 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2326 st->info->last_dts = pkt->dts;
2328 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2329 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2331 st->codec->extradata_size= i;
2332 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2333 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2334 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2338 /* if still no information, we try to open the codec and to
2339 decompress the frame. We try to avoid that in most cases as
2340 it takes longer and uses more memory. For MPEG-4, we need to
2341 decompress for QuickTime. */
2342 if (!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st))
2343 try_decode_frame(st, pkt);
2345 st->codec_info_nb_frames++;
2349 // close codecs which were opened in try_decode_frame()
2350 for(i=0;i<ic->nb_streams;i++) {
2351 st = ic->streams[i];
2352 if(st->codec->codec)
2353 avcodec_close(st->codec);
2355 for(i=0;i<ic->nb_streams;i++) {
2356 st = ic->streams[i];
2357 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2358 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2359 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2360 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2361 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2362 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
2363 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2365 // the check for tb_unreliable() is not completely correct, since this is not about handling
2366 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2367 // ipmovie.c produces.
2368 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > 1 && !st->r_frame_rate.num)
2369 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);
2370 if (st->info->duration_count && !st->r_frame_rate.num
2371 && tb_unreliable(st->codec) /*&&
2372 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2373 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2375 double best_error= 2*av_q2d(st->time_base);
2376 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2378 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2379 double error = st->info->duration_error[j] * get_std_framerate(j);
2380 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2381 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2382 if(error < best_error){
2384 num = get_std_framerate(j);
2387 // do not increase frame rate by more than 1 % in order to match a standard rate.
2388 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2389 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2392 if (!st->r_frame_rate.num){
2393 if( st->codec->time_base.den * (int64_t)st->time_base.num
2394 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2395 st->r_frame_rate.num = st->codec->time_base.den;
2396 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2398 st->r_frame_rate.num = st->time_base.den;
2399 st->r_frame_rate.den = st->time_base.num;
2402 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2403 if(!st->codec->bits_per_coded_sample)
2404 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2405 // set stream disposition based on audio service type
2406 switch (st->codec->audio_service_type) {
2407 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2408 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2409 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2410 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2411 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2412 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2413 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2414 st->disposition = AV_DISPOSITION_COMMENT; break;
2415 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2416 st->disposition = AV_DISPOSITION_KARAOKE; break;
2421 av_estimate_timings(ic, old_offset);
2423 compute_chapters_end(ic);
2426 /* correct DTS for B-frame streams with no timestamps */
2427 for(i=0;i<ic->nb_streams;i++) {
2428 st = ic->streams[i];
2429 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2431 ppktl = &ic->packet_buffer;
2433 if(ppkt1->stream_index != i)
2435 if(ppkt1->pkt->dts < 0)
2437 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2439 ppkt1->pkt->dts -= delta;
2444 st->cur_dts -= delta;
2450 find_stream_info_err:
2451 for (i=0; i < ic->nb_streams; i++)
2452 av_freep(&ic->streams[i]->info);
2456 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2460 for (i = 0; i < ic->nb_programs; i++)
2461 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2462 if (ic->programs[i]->stream_index[j] == s)
2463 return ic->programs[i];
2467 int av_find_best_stream(AVFormatContext *ic,
2468 enum AVMediaType type,
2469 int wanted_stream_nb,
2471 AVCodec **decoder_ret,
2474 int i, nb_streams = ic->nb_streams;
2475 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2476 unsigned *program = NULL;
2477 AVCodec *decoder = NULL, *best_decoder = NULL;
2479 if (related_stream >= 0 && wanted_stream_nb < 0) {
2480 AVProgram *p = find_program_from_stream(ic, related_stream);
2482 program = p->stream_index;
2483 nb_streams = p->nb_stream_indexes;
2486 for (i = 0; i < nb_streams; i++) {
2487 int real_stream_index = program ? program[i] : i;
2488 AVStream *st = ic->streams[real_stream_index];
2489 AVCodecContext *avctx = st->codec;
2490 if (avctx->codec_type != type)
2492 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2494 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2497 decoder = avcodec_find_decoder(st->codec->codec_id);
2500 ret = AVERROR_DECODER_NOT_FOUND;
2504 if (best_count >= st->codec_info_nb_frames)
2506 best_count = st->codec_info_nb_frames;
2507 ret = real_stream_index;
2508 best_decoder = decoder;
2509 if (program && i == nb_streams - 1 && ret < 0) {
2511 nb_streams = ic->nb_streams;
2512 i = 0; /* no related stream found, try again with everything */
2516 *decoder_ret = best_decoder;
2520 /*******************************************************/
2522 int av_read_play(AVFormatContext *s)
2524 if (s->iformat->read_play)
2525 return s->iformat->read_play(s);
2527 return avio_pause(s->pb, 0);
2528 return AVERROR(ENOSYS);
2531 int av_read_pause(AVFormatContext *s)
2533 if (s->iformat->read_pause)
2534 return s->iformat->read_pause(s);
2536 return avio_pause(s->pb, 1);
2537 return AVERROR(ENOSYS);
2540 void av_close_input_stream(AVFormatContext *s)
2542 flush_packet_queue(s);
2543 if (s->iformat->read_close)
2544 s->iformat->read_close(s);
2545 avformat_free_context(s);
2548 void avformat_free_context(AVFormatContext *s)
2554 if (s->iformat && s->iformat->priv_class && s->priv_data)
2555 av_opt_free(s->priv_data);
2557 for(i=0;i<s->nb_streams;i++) {
2558 /* free all data in a stream component */
2561 av_parser_close(st->parser);
2562 av_free_packet(&st->cur_pkt);
2564 av_dict_free(&st->metadata);
2565 av_free(st->index_entries);
2566 av_free(st->codec->extradata);
2567 av_free(st->codec->subtitle_header);
2569 av_free(st->priv_data);
2573 for(i=s->nb_programs-1; i>=0; i--) {
2574 av_dict_free(&s->programs[i]->metadata);
2575 av_freep(&s->programs[i]->stream_index);
2576 av_freep(&s->programs[i]);
2578 av_freep(&s->programs);
2579 av_freep(&s->priv_data);
2580 while(s->nb_chapters--) {
2581 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2582 av_free(s->chapters[s->nb_chapters]);
2584 av_freep(&s->chapters);
2585 av_dict_free(&s->metadata);
2586 av_freep(&s->streams);
2590 void av_close_input_file(AVFormatContext *s)
2592 AVIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2593 av_close_input_stream(s);
2598 AVStream *av_new_stream(AVFormatContext *s, int id)
2604 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2606 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2609 s->streams = streams;
2611 st = av_mallocz(sizeof(AVStream));
2614 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2619 st->codec= avcodec_alloc_context();
2621 /* no default bitrate if decoding */
2622 st->codec->bit_rate = 0;
2624 st->index = s->nb_streams;
2626 st->start_time = AV_NOPTS_VALUE;
2627 st->duration = AV_NOPTS_VALUE;
2628 /* we set the current DTS to 0 so that formats without any timestamps
2629 but durations get some timestamps, formats with some unknown
2630 timestamps have their first few packets buffered and the
2631 timestamps corrected before they are returned to the user */
2633 st->first_dts = AV_NOPTS_VALUE;
2634 st->probe_packets = MAX_PROBE_PACKETS;
2636 /* default pts setting is MPEG-like */
2637 av_set_pts_info(st, 33, 1, 90000);
2638 st->last_IP_pts = AV_NOPTS_VALUE;
2639 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2640 st->pts_buffer[i]= AV_NOPTS_VALUE;
2641 st->reference_dts = AV_NOPTS_VALUE;
2643 st->sample_aspect_ratio = (AVRational){0,1};
2645 s->streams[s->nb_streams++] = st;
2649 AVProgram *av_new_program(AVFormatContext *ac, int id)
2651 AVProgram *program=NULL;
2655 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2658 for(i=0; i<ac->nb_programs; i++)
2659 if(ac->programs[i]->id == id)
2660 program = ac->programs[i];
2663 program = av_mallocz(sizeof(AVProgram));
2666 dynarray_add(&ac->programs, &ac->nb_programs, program);
2667 program->discard = AVDISCARD_NONE;
2674 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2676 AVChapter *chapter = NULL;
2679 for(i=0; i<s->nb_chapters; i++)
2680 if(s->chapters[i]->id == id)
2681 chapter = s->chapters[i];
2684 chapter= av_mallocz(sizeof(AVChapter));
2687 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2689 av_dict_set(&chapter->metadata, "title", title, 0);
2691 chapter->time_base= time_base;
2692 chapter->start = start;
2698 /************************************************************/
2699 /* output media file */
2701 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2705 if (s->oformat->priv_data_size > 0) {
2706 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2708 return AVERROR(ENOMEM);
2709 if (s->oformat->priv_class) {
2710 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2711 av_opt_set_defaults(s->priv_data);
2714 s->priv_data = NULL;
2716 if (s->oformat->set_parameters) {
2717 ret = s->oformat->set_parameters(s, ap);
2724 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2726 const AVCodecTag *avctag;
2728 enum CodecID id = CODEC_ID_NONE;
2729 unsigned int tag = 0;
2732 * Check that tag + id is in the table
2733 * If neither is in the table -> OK
2734 * If tag is in the table with another id -> FAIL
2735 * If id is in the table with another tag -> FAIL unless strict < normal
2737 for (n = 0; s->oformat->codec_tag[n]; n++) {
2738 avctag = s->oformat->codec_tag[n];
2739 while (avctag->id != CODEC_ID_NONE) {
2740 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2742 if (id == st->codec->codec_id)
2745 if (avctag->id == st->codec->codec_id)
2750 if (id != CODEC_ID_NONE)
2752 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2757 int av_write_header(AVFormatContext *s)
2762 // some sanity checks
2763 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2764 av_log(s, AV_LOG_ERROR, "no streams\n");
2765 return AVERROR(EINVAL);
2768 for(i=0;i<s->nb_streams;i++) {
2771 switch (st->codec->codec_type) {
2772 case AVMEDIA_TYPE_AUDIO:
2773 if(st->codec->sample_rate<=0){
2774 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2775 return AVERROR(EINVAL);
2777 if(!st->codec->block_align)
2778 st->codec->block_align = st->codec->channels *
2779 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2781 case AVMEDIA_TYPE_VIDEO:
2782 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2783 av_log(s, AV_LOG_ERROR, "time base not set\n");
2784 return AVERROR(EINVAL);
2786 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2787 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2788 return AVERROR(EINVAL);
2790 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2791 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2792 return AVERROR(EINVAL);
2797 if(s->oformat->codec_tag){
2798 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)){
2799 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2800 st->codec->codec_tag= 0;
2802 if(st->codec->codec_tag){
2803 if (!validate_codec_tag(s, st)) {
2805 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2806 av_log(s, AV_LOG_ERROR,
2807 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
2808 tagbuf, st->codec->codec_tag, st->codec->codec_id);
2809 return AVERROR_INVALIDDATA;
2812 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2815 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2816 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2817 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2820 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2821 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2823 return AVERROR(ENOMEM);
2826 /* set muxer identification string */
2827 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2828 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
2831 if(s->oformat->write_header){
2832 ret = s->oformat->write_header(s);
2837 /* init PTS generation */
2838 for(i=0;i<s->nb_streams;i++) {
2839 int64_t den = AV_NOPTS_VALUE;
2842 switch (st->codec->codec_type) {
2843 case AVMEDIA_TYPE_AUDIO:
2844 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2846 case AVMEDIA_TYPE_VIDEO:
2847 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2852 if (den != AV_NOPTS_VALUE) {
2854 return AVERROR_INVALIDDATA;
2855 av_frac_init(&st->pts, 0, 0, den);
2861 //FIXME merge with compute_pkt_fields
2862 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
2863 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2864 int num, den, frame_size, i;
2866 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
2867 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
2869 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2870 return AVERROR(EINVAL);*/
2872 /* duration field */
2873 if (pkt->duration == 0) {
2874 compute_frame_duration(&num, &den, st, NULL, pkt);
2876 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2880 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2883 //XXX/FIXME this is a temporary hack until all encoders output pts
2884 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2886 // pkt->pts= st->cur_dts;
2887 pkt->pts= st->pts.val;
2890 //calculate dts from pts
2891 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2892 st->pts_buffer[0]= pkt->pts;
2893 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2894 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
2895 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2896 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2898 pkt->dts= st->pts_buffer[0];
2901 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2902 av_log(s, AV_LOG_ERROR,
2903 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
2904 st->index, st->cur_dts, pkt->dts);
2905 return AVERROR(EINVAL);
2907 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2908 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
2909 return AVERROR(EINVAL);
2912 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2913 st->cur_dts= pkt->dts;
2914 st->pts.val= pkt->dts;
2917 switch (st->codec->codec_type) {
2918 case AVMEDIA_TYPE_AUDIO:
2919 frame_size = get_audio_frame_size(st->codec, pkt->size);
2921 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2922 likely equal to the encoder delay, but it would be better if we
2923 had the real timestamps from the encoder */
2924 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2925 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2928 case AVMEDIA_TYPE_VIDEO:
2929 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2937 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2939 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
2941 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2944 ret= s->oformat->write_packet(s, pkt);
2948 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
2949 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
2951 AVPacketList **next_point, *this_pktl;
2953 this_pktl = av_mallocz(sizeof(AVPacketList));
2954 this_pktl->pkt= *pkt;
2955 pkt->destruct= NULL; // do not free original but only the copy
2956 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
2958 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
2959 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
2961 next_point = &s->packet_buffer;
2964 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
2965 while(!compare(s, &(*next_point)->pkt, pkt)){
2966 next_point= &(*next_point)->next;
2970 next_point = &(s->packet_buffer_end->next);
2973 assert(!*next_point);
2975 s->packet_buffer_end= this_pktl;
2978 this_pktl->next= *next_point;
2980 s->streams[pkt->stream_index]->last_in_packet_buffer=
2981 *next_point= this_pktl;
2984 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
2986 AVStream *st = s->streams[ pkt ->stream_index];
2987 AVStream *st2= s->streams[ next->stream_index];
2988 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
2992 return pkt->stream_index < next->stream_index;
2996 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3002 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3005 for(i=0; i < s->nb_streams; i++)
3006 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3008 if(stream_count && (s->nb_streams == stream_count || flush)){
3009 pktl= s->packet_buffer;
3012 s->packet_buffer= pktl->next;
3013 if(!s->packet_buffer)
3014 s->packet_buffer_end= NULL;
3016 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3017 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3021 av_init_packet(out);
3027 * Interleave an AVPacket correctly so it can be muxed.
3028 * @param out the interleaved packet will be output here
3029 * @param in the input packet
3030 * @param flush 1 if no further packets are available as input and all
3031 * remaining packets should be output
3032 * @return 1 if a packet was output, 0 if no packet could be output,
3033 * < 0 if an error occurred
3035 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3036 if(s->oformat->interleave_packet)
3037 return s->oformat->interleave_packet(s, out, in, flush);
3039 return av_interleave_packet_per_dts(s, out, in, flush);
3042 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3043 AVStream *st= s->streams[ pkt->stream_index];
3046 //FIXME/XXX/HACK drop zero sized packets
3047 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3050 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3051 pkt->size, pkt->dts, pkt->pts);
3052 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3055 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3056 return AVERROR(EINVAL);
3060 int ret= av_interleave_packet(s, &opkt, pkt, 0);
3061 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3064 ret= s->oformat->write_packet(s, &opkt);
3066 av_free_packet(&opkt);
3074 int av_write_trailer(AVFormatContext *s)
3080 ret= av_interleave_packet(s, &pkt, NULL, 1);
3081 if(ret<0) //FIXME cleanup needed for ret<0 ?
3086 ret= s->oformat->write_packet(s, &pkt);
3088 av_free_packet(&pkt);
3094 if(s->oformat->write_trailer)
3095 ret = s->oformat->write_trailer(s);
3097 for(i=0;i<s->nb_streams;i++) {
3098 av_freep(&s->streams[i]->priv_data);
3099 av_freep(&s->streams[i]->index_entries);
3101 if (s->iformat && s->iformat->priv_class)
3102 av_opt_free(s->priv_data);
3103 av_freep(&s->priv_data);
3107 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3110 AVProgram *program=NULL;
3113 if (idx >= ac->nb_streams) {
3114 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3118 for(i=0; i<ac->nb_programs; i++){
3119 if(ac->programs[i]->id != progid)
3121 program = ac->programs[i];
3122 for(j=0; j<program->nb_stream_indexes; j++)
3123 if(program->stream_index[j] == idx)
3126 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3129 program->stream_index = tmp;
3130 program->stream_index[program->nb_stream_indexes++] = idx;
3135 static void print_fps(double d, const char *postfix){
3136 uint64_t v= lrintf(d*100);
3137 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3138 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3139 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3142 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3144 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3145 AVDictionaryEntry *tag=NULL;
3147 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3148 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3149 if(strcmp("language", tag->key))
3150 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
3155 /* "user interface" functions */
3156 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3159 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3160 AVStream *st = ic->streams[i];
3161 int g = av_gcd(st->time_base.num, st->time_base.den);
3162 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3163 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3164 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3165 /* the pid is an important information, so we display it */
3166 /* XXX: add a generic system */
3167 if (flags & AVFMT_SHOW_IDS)
3168 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3170 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3171 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3172 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3173 if (st->sample_aspect_ratio.num && // default
3174 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3175 AVRational display_aspect_ratio;
3176 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3177 st->codec->width*st->sample_aspect_ratio.num,
3178 st->codec->height*st->sample_aspect_ratio.den,
3180 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3181 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3182 display_aspect_ratio.num, display_aspect_ratio.den);
3184 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3185 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3186 print_fps(av_q2d(st->avg_frame_rate), "fps");
3187 if(st->r_frame_rate.den && st->r_frame_rate.num)
3188 print_fps(av_q2d(st->r_frame_rate), "tbr");
3189 if(st->time_base.den && st->time_base.num)
3190 print_fps(1/av_q2d(st->time_base), "tbn");
3191 if(st->codec->time_base.den && st->codec->time_base.num)
3192 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3194 if (st->disposition & AV_DISPOSITION_DEFAULT)
3195 av_log(NULL, AV_LOG_INFO, " (default)");
3196 if (st->disposition & AV_DISPOSITION_DUB)
3197 av_log(NULL, AV_LOG_INFO, " (dub)");
3198 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3199 av_log(NULL, AV_LOG_INFO, " (original)");
3200 if (st->disposition & AV_DISPOSITION_COMMENT)
3201 av_log(NULL, AV_LOG_INFO, " (comment)");
3202 if (st->disposition & AV_DISPOSITION_LYRICS)
3203 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3204 if (st->disposition & AV_DISPOSITION_KARAOKE)
3205 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3206 if (st->disposition & AV_DISPOSITION_FORCED)
3207 av_log(NULL, AV_LOG_INFO, " (forced)");
3208 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3209 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3210 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3211 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3212 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3213 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3214 av_log(NULL, AV_LOG_INFO, "\n");
3215 dump_metadata(NULL, st->metadata, " ");
3218 #if FF_API_DUMP_FORMAT
3219 void dump_format(AVFormatContext *ic,
3224 av_dump_format(ic, index, url, is_output);
3228 void av_dump_format(AVFormatContext *ic,
3234 uint8_t *printed = av_mallocz(ic->nb_streams);
3235 if (ic->nb_streams && !printed)
3238 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3239 is_output ? "Output" : "Input",
3241 is_output ? ic->oformat->name : ic->iformat->name,
3242 is_output ? "to" : "from", url);
3243 dump_metadata(NULL, ic->metadata, " ");
3245 av_log(NULL, AV_LOG_INFO, " Duration: ");
3246 if (ic->duration != AV_NOPTS_VALUE) {
3247 int hours, mins, secs, us;
3248 secs = ic->duration / AV_TIME_BASE;
3249 us = ic->duration % AV_TIME_BASE;
3254 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3255 (100 * us) / AV_TIME_BASE);
3257 av_log(NULL, AV_LOG_INFO, "N/A");
3259 if (ic->start_time != AV_NOPTS_VALUE) {
3261 av_log(NULL, AV_LOG_INFO, ", start: ");
3262 secs = ic->start_time / AV_TIME_BASE;
3263 us = abs(ic->start_time % AV_TIME_BASE);
3264 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3265 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3267 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3269 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3271 av_log(NULL, AV_LOG_INFO, "N/A");
3273 av_log(NULL, AV_LOG_INFO, "\n");
3275 for (i = 0; i < ic->nb_chapters; i++) {
3276 AVChapter *ch = ic->chapters[i];
3277 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3278 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3279 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3281 dump_metadata(NULL, ch->metadata, " ");
3283 if(ic->nb_programs) {
3284 int j, k, total = 0;
3285 for(j=0; j<ic->nb_programs; j++) {
3286 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3288 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3289 name ? name->value : "");
3290 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3291 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3292 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3293 printed[ic->programs[j]->stream_index[k]] = 1;
3295 total += ic->programs[j]->nb_stream_indexes;
3297 if (total < ic->nb_streams)
3298 av_log(NULL, AV_LOG_INFO, " No Program\n");
3300 for(i=0;i<ic->nb_streams;i++)
3302 dump_stream_format(ic, i, index, is_output);
3307 int64_t av_gettime(void)
3310 gettimeofday(&tv,NULL);
3311 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3314 uint64_t ff_ntp_time(void)
3316 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3319 #if FF_API_PARSE_DATE
3320 #include "libavutil/parseutils.h"
3322 int64_t parse_date(const char *timestr, int duration)
3325 av_parse_time(&timeval, timestr, duration);
3330 #if FF_API_FIND_INFO_TAG
3331 #include "libavutil/parseutils.h"
3333 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3335 return av_find_info_tag(arg, arg_size, tag1, info);
3339 int av_get_frame_filename(char *buf, int buf_size,
3340 const char *path, int number)
3343 char *q, buf1[20], c;
3344 int nd, len, percentd_found;
3356 while (isdigit(*p)) {
3357 nd = nd * 10 + *p++ - '0';
3360 } while (isdigit(c));
3369 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3371 if ((q - buf + len) > buf_size - 1)
3373 memcpy(q, buf1, len);
3381 if ((q - buf) < buf_size - 1)
3385 if (!percentd_found)
3394 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3398 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3400 for(i=0;i<size;i+=16) {
3407 PRINT(" %02x", buf[i+j]);
3412 for(j=0;j<len;j++) {
3414 if (c < ' ' || c > '~')
3423 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3425 hex_dump_internal(NULL, f, 0, buf, size);
3428 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3430 hex_dump_internal(avcl, NULL, level, buf, size);
3433 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3436 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3437 PRINT("stream #%d:\n", pkt->stream_index);
3438 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3439 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3440 /* DTS is _always_ valid after av_read_frame() */
3442 if (pkt->dts == AV_NOPTS_VALUE)
3445 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3446 /* PTS may not be known if B-frames are present. */
3448 if (pkt->pts == AV_NOPTS_VALUE)
3451 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3453 PRINT(" size=%d\n", pkt->size);
3456 av_hex_dump(f, pkt->data, pkt->size);
3460 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3462 AVRational tb = { 1, AV_TIME_BASE };
3463 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3467 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3469 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3473 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3475 AVRational tb = { 1, AV_TIME_BASE };
3476 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3480 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3483 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3486 void av_url_split(char *proto, int proto_size,
3487 char *authorization, int authorization_size,
3488 char *hostname, int hostname_size,
3490 char *path, int path_size,
3493 const char *p, *ls, *at, *col, *brk;
3495 if (port_ptr) *port_ptr = -1;
3496 if (proto_size > 0) proto[0] = 0;
3497 if (authorization_size > 0) authorization[0] = 0;
3498 if (hostname_size > 0) hostname[0] = 0;
3499 if (path_size > 0) path[0] = 0;
3501 /* parse protocol */
3502 if ((p = strchr(url, ':'))) {
3503 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3508 /* no protocol means plain filename */
3509 av_strlcpy(path, url, path_size);
3513 /* separate path from hostname */
3514 ls = strchr(p, '/');
3516 ls = strchr(p, '?');
3518 av_strlcpy(path, ls, path_size);
3520 ls = &p[strlen(p)]; // XXX
3522 /* the rest is hostname, use that to parse auth/port */
3524 /* authorization (user[:pass]@hostname) */
3525 if ((at = strchr(p, '@')) && at < ls) {
3526 av_strlcpy(authorization, p,
3527 FFMIN(authorization_size, at + 1 - p));
3528 p = at + 1; /* skip '@' */
3531 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3533 av_strlcpy(hostname, p + 1,
3534 FFMIN(hostname_size, brk - p));
3535 if (brk[1] == ':' && port_ptr)
3536 *port_ptr = atoi(brk + 2);
3537 } else if ((col = strchr(p, ':')) && col < ls) {
3538 av_strlcpy(hostname, p,
3539 FFMIN(col + 1 - p, hostname_size));
3540 if (port_ptr) *port_ptr = atoi(col + 1);
3542 av_strlcpy(hostname, p,
3543 FFMIN(ls + 1 - p, hostname_size));
3547 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3550 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3553 'C', 'D', 'E', 'F' };
3554 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3557 'c', 'd', 'e', 'f' };
3558 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3560 for(i = 0; i < s; i++) {
3561 buff[i * 2] = hex_table[src[i] >> 4];
3562 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3568 int ff_hex_to_data(uint8_t *data, const char *p)
3575 p += strspn(p, SPACE_CHARS);
3578 c = toupper((unsigned char) *p++);
3579 if (c >= '0' && c <= '9')
3581 else if (c >= 'A' && c <= 'F')
3596 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3597 unsigned int pts_num, unsigned int pts_den)
3600 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3601 if(new_tb.num != pts_num)
3602 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3604 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3606 if(new_tb.num <= 0 || new_tb.den <= 0) {
3607 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3610 s->time_base = new_tb;
3611 s->pts_wrap_bits = pts_wrap_bits;
3614 int ff_url_join(char *str, int size, const char *proto,
3615 const char *authorization, const char *hostname,
3616 int port, const char *fmt, ...)
3619 struct addrinfo hints, *ai;
3624 av_strlcatf(str, size, "%s://", proto);
3625 if (authorization && authorization[0])
3626 av_strlcatf(str, size, "%s@", authorization);
3627 #if CONFIG_NETWORK && defined(AF_INET6)
3628 /* Determine if hostname is a numerical IPv6 address,
3629 * properly escape it within [] in that case. */
3630 memset(&hints, 0, sizeof(hints));
3631 hints.ai_flags = AI_NUMERICHOST;
3632 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3633 if (ai->ai_family == AF_INET6) {
3634 av_strlcat(str, "[", size);
3635 av_strlcat(str, hostname, size);
3636 av_strlcat(str, "]", size);
3638 av_strlcat(str, hostname, size);
3643 /* Not an IPv6 address, just output the plain string. */
3644 av_strlcat(str, hostname, size);
3647 av_strlcatf(str, size, ":%d", port);
3650 int len = strlen(str);
3653 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3659 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3660 AVFormatContext *src)
3665 local_pkt.stream_index = dst_stream;
3666 if (pkt->pts != AV_NOPTS_VALUE)
3667 local_pkt.pts = av_rescale_q(pkt->pts,
3668 src->streams[pkt->stream_index]->time_base,
3669 dst->streams[dst_stream]->time_base);
3670 if (pkt->dts != AV_NOPTS_VALUE)
3671 local_pkt.dts = av_rescale_q(pkt->dts,
3672 src->streams[pkt->stream_index]->time_base,
3673 dst->streams[dst_stream]->time_base);
3674 return av_write_frame(dst, &local_pkt);
3677 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3680 const char *ptr = str;
3682 /* Parse key=value pairs. */
3685 char *dest = NULL, *dest_end;
3686 int key_len, dest_len = 0;
3688 /* Skip whitespace and potential commas. */
3689 while (*ptr && (isspace(*ptr) || *ptr == ','))
3696 if (!(ptr = strchr(key, '=')))
3699 key_len = ptr - key;
3701 callback_get_buf(context, key, key_len, &dest, &dest_len);
3702 dest_end = dest + dest_len - 1;
3706 while (*ptr && *ptr != '\"') {
3710 if (dest && dest < dest_end)
3714 if (dest && dest < dest_end)
3722 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3723 if (dest && dest < dest_end)
3731 int ff_find_stream_index(AVFormatContext *s, int id)
3734 for (i = 0; i < s->nb_streams; i++) {
3735 if (s->streams[i]->id == id)
3741 void ff_make_absolute_url(char *buf, int size, const char *base,
3745 /* Absolute path, relative to the current server */
3746 if (base && strstr(base, "://") && rel[0] == '/') {
3748 av_strlcpy(buf, base, size);
3749 sep = strstr(buf, "://");
3752 sep = strchr(sep, '/');
3756 av_strlcat(buf, rel, size);
3759 /* If rel actually is an absolute url, just copy it */
3760 if (!base || strstr(rel, "://") || rel[0] == '/') {
3761 av_strlcpy(buf, rel, size);
3765 av_strlcpy(buf, base, size);
3766 /* Remove the file name from the base url */
3767 sep = strrchr(buf, '/');
3772 while (av_strstart(rel, "../", NULL) && sep) {
3773 /* Remove the path delimiter at the end */
3775 sep = strrchr(buf, '/');
3776 /* If the next directory name to pop off is "..", break here */
3777 if (!strcmp(sep ? &sep[1] : buf, "..")) {
3778 /* Readd the slash we just removed */
3779 av_strlcat(buf, "/", size);
3782 /* Cut off the directory name */
3789 av_strlcat(buf, rel, size);