2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "avio_internal.h"
24 #include "libavcodec/internal.h"
25 #include "libavutil/opt.h"
28 #include "libavutil/avstring.h"
30 #include "audiointerleave.h"
44 * various utility functions for use within FFmpeg
47 unsigned avformat_version(void)
49 return LIBAVFORMAT_VERSION_INT;
52 const char *avformat_configuration(void)
54 return LIBAV_CONFIGURATION;
57 const char *avformat_license(void)
59 #define LICENSE_PREFIX "libavformat license: "
60 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
63 /* fraction handling */
66 * f = val + (num / den) + 0.5.
68 * 'num' is normalized so that it is such as 0 <= num < den.
70 * @param f fractional number
71 * @param val integer value
72 * @param num must be >= 0
73 * @param den must be >= 1
75 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
88 * Fractional addition to f: f = f + (incr / f->den).
90 * @param f fractional number
91 * @param incr increment, can be positive or negative
93 static void av_frac_add(AVFrac *f, int64_t incr)
106 } else if (num >= den) {
113 /** head of registered input format linked list */
114 #if !FF_API_FIRST_FORMAT
117 AVInputFormat *first_iformat = NULL;
118 /** head of registered output format linked list */
119 #if !FF_API_FIRST_FORMAT
122 AVOutputFormat *first_oformat = NULL;
124 AVInputFormat *av_iformat_next(AVInputFormat *f)
126 if(f) return f->next;
127 else return first_iformat;
130 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
132 if(f) return f->next;
133 else return first_oformat;
136 void av_register_input_format(AVInputFormat *format)
140 while (*p != NULL) p = &(*p)->next;
145 void av_register_output_format(AVOutputFormat *format)
149 while (*p != NULL) p = &(*p)->next;
154 int av_match_ext(const char *filename, const char *extensions)
162 ext = strrchr(filename, '.');
168 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
171 if (!strcasecmp(ext1, ext))
181 static int match_format(const char *name, const char *names)
189 namelen = strlen(name);
190 while ((p = strchr(names, ','))) {
191 len = FFMAX(p - names, namelen);
192 if (!strncasecmp(name, names, len))
196 return !strcasecmp(name, names);
199 #if FF_API_GUESS_FORMAT
200 AVOutputFormat *guess_format(const char *short_name, const char *filename,
201 const char *mime_type)
203 return av_guess_format(short_name, filename, mime_type);
207 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
208 const char *mime_type)
210 AVOutputFormat *fmt = NULL, *fmt_found;
211 int score_max, score;
213 /* specific test for image sequences */
214 #if CONFIG_IMAGE2_MUXER
215 if (!short_name && filename &&
216 av_filename_number_test(filename) &&
217 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
218 return av_guess_format("image2", NULL, NULL);
221 /* Find the proper file type. */
224 while ((fmt = av_oformat_next(fmt))) {
226 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
228 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
230 if (filename && fmt->extensions &&
231 av_match_ext(filename, fmt->extensions)) {
234 if (score > score_max) {
242 #if FF_API_GUESS_FORMAT
243 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
244 const char *mime_type)
246 AVOutputFormat *fmt = av_guess_format(short_name, filename, mime_type);
249 AVOutputFormat *stream_fmt;
250 char stream_format_name[64];
252 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
253 stream_fmt = av_guess_format(stream_format_name, NULL, NULL);
263 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
264 const char *filename, const char *mime_type, enum AVMediaType type){
265 if(type == AVMEDIA_TYPE_VIDEO){
266 enum CodecID codec_id= CODEC_ID_NONE;
268 #if CONFIG_IMAGE2_MUXER
269 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
270 codec_id= av_guess_image2_codec(filename);
273 if(codec_id == CODEC_ID_NONE)
274 codec_id= fmt->video_codec;
276 }else if(type == AVMEDIA_TYPE_AUDIO)
277 return fmt->audio_codec;
278 else if (type == AVMEDIA_TYPE_SUBTITLE)
279 return fmt->subtitle_codec;
281 return CODEC_ID_NONE;
284 AVInputFormat *av_find_input_format(const char *short_name)
286 AVInputFormat *fmt = NULL;
287 while ((fmt = av_iformat_next(fmt))) {
288 if (match_format(short_name, fmt->name))
294 #if FF_API_SYMVER && CONFIG_SHARED && HAVE_SYMVER
295 FF_SYMVER(void, av_destruct_packet_nofree, (AVPacket *pkt), "LIBAVFORMAT_52")
297 av_destruct_packet_nofree(pkt);
300 FF_SYMVER(void, av_destruct_packet, (AVPacket *pkt), "LIBAVFORMAT_52")
302 av_destruct_packet(pkt);
305 FF_SYMVER(int, av_new_packet, (AVPacket *pkt, int size), "LIBAVFORMAT_52")
307 return av_new_packet(pkt, size);
310 FF_SYMVER(int, av_dup_packet, (AVPacket *pkt), "LIBAVFORMAT_52")
312 return av_dup_packet(pkt);
315 FF_SYMVER(void, av_free_packet, (AVPacket *pkt), "LIBAVFORMAT_52")
320 FF_SYMVER(void, av_init_packet, (AVPacket *pkt), "LIBAVFORMAT_52")
322 av_log(NULL, AV_LOG_WARNING, "Diverting av_*_packet function calls to libavcodec. Recompile to improve performance\n");
327 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
329 int ret= av_new_packet(pkt, size);
334 pkt->pos= avio_tell(s);
336 ret= avio_read(s, pkt->data, size);
340 av_shrink_packet(pkt, ret);
345 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
350 return av_get_packet(s, pkt, size);
351 old_size = pkt->size;
352 ret = av_grow_packet(pkt, size);
355 ret = avio_read(s, pkt->data + old_size, size);
356 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
361 int av_filename_number_test(const char *filename)
364 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
367 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
369 AVProbeData lpd = *pd;
370 AVInputFormat *fmt1 = NULL, *fmt;
373 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
374 int id3len = ff_id3v2_tag_len(lpd.buf);
375 if (lpd.buf_size > id3len + 16) {
377 lpd.buf_size -= id3len;
382 while ((fmt1 = av_iformat_next(fmt1))) {
383 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
386 if (fmt1->read_probe) {
387 score = fmt1->read_probe(&lpd);
388 } else if (fmt1->extensions) {
389 if (av_match_ext(lpd.filename, fmt1->extensions)) {
393 if (score > *score_max) {
396 }else if (score == *score_max)
402 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
404 return av_probe_input_format2(pd, is_opened, &score);
407 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
409 static const struct {
410 const char *name; enum CodecID id; enum AVMediaType type;
412 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
413 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
414 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
415 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
416 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
417 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
418 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
419 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
422 AVInputFormat *fmt = av_probe_input_format2(pd, 1, &score);
426 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
427 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
428 for (i = 0; fmt_id_type[i].name; i++) {
429 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
430 st->codec->codec_id = fmt_id_type[i].id;
431 st->codec->codec_type = fmt_id_type[i].type;
439 /************************************************************/
440 /* input media file */
443 * Open a media file from an IO stream. 'fmt' must be specified.
445 int av_open_input_stream(AVFormatContext **ic_ptr,
446 AVIOContext *pb, const char *filename,
447 AVInputFormat *fmt, AVFormatParameters *ap)
451 AVFormatParameters default_ap;
455 memset(ap, 0, sizeof(default_ap));
458 if(!ap->prealloced_context)
459 ic = avformat_alloc_context();
463 err = AVERROR(ENOMEM);
468 ic->duration = AV_NOPTS_VALUE;
469 ic->start_time = AV_NOPTS_VALUE;
470 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
472 /* allocate private data */
473 if (fmt->priv_data_size > 0) {
474 ic->priv_data = av_mallocz(fmt->priv_data_size);
475 if (!ic->priv_data) {
476 err = AVERROR(ENOMEM);
480 ic->priv_data = NULL;
483 // e.g. AVFMT_NOFILE formats will not have a AVIOContext
485 ff_id3v2_read(ic, ID3v2_DEFAULT_MAGIC);
487 if (ic->iformat->read_header) {
488 err = ic->iformat->read_header(ic, ap);
493 if (pb && !ic->data_offset)
494 ic->data_offset = avio_tell(ic->pb);
496 #if FF_API_OLD_METADATA
497 ff_metadata_demux_compat(ic);
500 ic->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
507 av_freep(&ic->priv_data);
508 for(i=0;i<ic->nb_streams;i++) {
509 AVStream *st = ic->streams[i];
511 av_free(st->priv_data);
512 av_free(st->codec->extradata);
524 /** size of probe buffer, for guessing file type from file contents */
525 #define PROBE_BUF_MIN 2048
526 #define PROBE_BUF_MAX (1<<20)
528 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
529 const char *filename, void *logctx,
530 unsigned int offset, unsigned int max_probe_size)
532 AVProbeData pd = { filename ? filename : "", NULL, -offset };
533 unsigned char *buf = NULL;
534 int ret = 0, probe_size;
536 if (!max_probe_size) {
537 max_probe_size = PROBE_BUF_MAX;
538 } else if (max_probe_size > PROBE_BUF_MAX) {
539 max_probe_size = PROBE_BUF_MAX;
540 } else if (max_probe_size < PROBE_BUF_MIN) {
541 return AVERROR(EINVAL);
544 if (offset >= max_probe_size) {
545 return AVERROR(EINVAL);
548 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt && ret >= 0;
549 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
550 int ret, score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
551 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
553 if (probe_size < offset) {
557 /* read probe data */
558 buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
559 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
560 /* fail if error was not end of file, otherwise, lower score */
561 if (ret != AVERROR_EOF) {
566 ret = 0; /* error was end of file, nothing read */
569 pd.buf = &buf[offset];
571 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
573 /* guess file format */
574 *fmt = av_probe_input_format2(&pd, 1, &score);
576 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
577 av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
579 av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
585 return AVERROR_INVALIDDATA;
588 /* rewind. reuse probe buffer to avoid seeking */
589 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
595 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
598 AVFormatParameters *ap)
601 AVProbeData probe_data, *pd = &probe_data;
602 AVIOContext *pb = NULL;
603 void *logctx= ap && ap->prealloced_context ? *ic_ptr : NULL;
607 pd->filename = filename;
612 /* guess format if no file can be opened */
613 fmt = av_probe_input_format(pd, 0);
616 /* Do not open file if the format does not need it. XXX: specific
617 hack needed to handle RTSP/TCP */
618 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
619 /* if no file needed do not try to open one */
620 if ((err=avio_open(&pb, filename, URL_RDONLY)) < 0) {
624 url_setbufsize(pb, buf_size);
626 if (!fmt && (err = av_probe_input_buffer(pb, &fmt, filename, logctx, 0, logctx ? (*ic_ptr)->probesize : 0)) < 0) {
631 /* if still no format found, error */
633 err = AVERROR_INVALIDDATA;
637 /* check filename in case an image number is expected */
638 if (fmt->flags & AVFMT_NEEDNUMBER) {
639 if (!av_filename_number_test(filename)) {
640 err = AVERROR_NUMEXPECTED;
644 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
652 if (ap && ap->prealloced_context)
659 /*******************************************************/
661 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
662 AVPacketList **plast_pktl){
663 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
668 (*plast_pktl)->next = pktl;
670 *packet_buffer = pktl;
672 /* add the packet in the buffered packet list */
678 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
684 AVPacketList *pktl = s->raw_packet_buffer;
688 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
689 !s->streams[pkt->stream_index]->probe_packets ||
690 s->raw_packet_buffer_remaining_size < pkt->size){
691 AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
694 s->raw_packet_buffer = pktl->next;
695 s->raw_packet_buffer_remaining_size += pkt->size;
702 ret= s->iformat->read_packet(s, pkt);
704 if (!pktl || ret == AVERROR(EAGAIN))
706 for (i = 0; i < s->nb_streams; i++)
707 s->streams[i]->probe_packets = 0;
710 st= s->streams[pkt->stream_index];
712 switch(st->codec->codec_type){
713 case AVMEDIA_TYPE_VIDEO:
714 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
716 case AVMEDIA_TYPE_AUDIO:
717 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
719 case AVMEDIA_TYPE_SUBTITLE:
720 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
724 if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
728 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
729 s->raw_packet_buffer_remaining_size -= pkt->size;
731 if(st->codec->codec_id == CODEC_ID_PROBE){
732 AVProbeData *pd = &st->probe_data;
733 av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
736 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
737 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
738 pd->buf_size += pkt->size;
739 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
741 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
742 //FIXME we dont reduce score to 0 for the case of running out of buffer space in bytes
743 set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0);
744 if(st->codec->codec_id != CODEC_ID_PROBE){
747 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
754 /**********************************************************/
757 * Get the number of samples of an audio frame. Return -1 on error.
759 static int get_audio_frame_size(AVCodecContext *enc, int size)
763 if(enc->codec_id == CODEC_ID_VORBIS)
766 if (enc->frame_size <= 1) {
767 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
769 if (bits_per_sample) {
770 if (enc->channels == 0)
772 frame_size = (size << 3) / (bits_per_sample * enc->channels);
774 /* used for example by ADPCM codecs */
775 if (enc->bit_rate == 0)
777 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
780 frame_size = enc->frame_size;
787 * Return the frame duration in seconds. Return 0 if not available.
789 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
790 AVCodecParserContext *pc, AVPacket *pkt)
796 switch(st->codec->codec_type) {
797 case AVMEDIA_TYPE_VIDEO:
798 if(st->time_base.num*1000LL > st->time_base.den){
799 *pnum = st->time_base.num;
800 *pden = st->time_base.den;
801 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
802 *pnum = st->codec->time_base.num;
803 *pden = st->codec->time_base.den;
804 if (pc && pc->repeat_pict) {
805 *pnum = (*pnum) * (1 + pc->repeat_pict);
807 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
808 //Thus if we have no parser in such case leave duration undefined.
809 if(st->codec->ticks_per_frame>1 && !pc){
814 case AVMEDIA_TYPE_AUDIO:
815 frame_size = get_audio_frame_size(st->codec, pkt->size);
816 if (frame_size <= 0 || st->codec->sample_rate <= 0)
819 *pden = st->codec->sample_rate;
826 static int is_intra_only(AVCodecContext *enc){
827 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
829 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
830 switch(enc->codec_id){
832 case CODEC_ID_MJPEGB:
834 case CODEC_ID_RAWVIDEO:
835 case CODEC_ID_DVVIDEO:
836 case CODEC_ID_HUFFYUV:
837 case CODEC_ID_FFVHUFF:
842 case CODEC_ID_JPEG2000:
850 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
851 int64_t dts, int64_t pts)
853 AVStream *st= s->streams[stream_index];
854 AVPacketList *pktl= s->packet_buffer;
856 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
859 st->first_dts= dts - st->cur_dts;
862 for(; pktl; pktl= pktl->next){
863 if(pktl->pkt.stream_index != stream_index)
865 //FIXME think more about this check
866 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
867 pktl->pkt.pts += st->first_dts;
869 if(pktl->pkt.dts != AV_NOPTS_VALUE)
870 pktl->pkt.dts += st->first_dts;
872 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
873 st->start_time= pktl->pkt.pts;
875 if (st->start_time == AV_NOPTS_VALUE)
876 st->start_time = pts;
879 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
881 AVPacketList *pktl= s->packet_buffer;
884 if(st->first_dts != AV_NOPTS_VALUE){
885 cur_dts= st->first_dts;
886 for(; pktl; pktl= pktl->next){
887 if(pktl->pkt.stream_index == pkt->stream_index){
888 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
890 cur_dts -= pkt->duration;
893 pktl= s->packet_buffer;
894 st->first_dts = cur_dts;
895 }else if(st->cur_dts)
898 for(; pktl; pktl= pktl->next){
899 if(pktl->pkt.stream_index != pkt->stream_index)
901 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
902 && !pktl->pkt.duration){
903 pktl->pkt.dts= cur_dts;
904 if(!st->codec->has_b_frames)
905 pktl->pkt.pts= cur_dts;
906 cur_dts += pkt->duration;
907 pktl->pkt.duration= pkt->duration;
911 if(st->first_dts == AV_NOPTS_VALUE)
912 st->cur_dts= cur_dts;
915 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
916 AVCodecParserContext *pc, AVPacket *pkt)
918 int num, den, presentation_delayed, delay, i;
921 if (s->flags & AVFMT_FLAG_NOFILLIN)
924 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
925 pkt->dts= AV_NOPTS_VALUE;
927 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == FF_B_TYPE)
928 //FIXME Set low_delay = 0 when has_b_frames = 1
929 st->codec->has_b_frames = 1;
931 /* do we have a video B-frame ? */
932 delay= st->codec->has_b_frames;
933 presentation_delayed = 0;
935 // ignore delay caused by frame threading so that the mpeg2-without-dts
936 // warning will not trigger
937 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
938 delay -= st->codec->thread_count-1;
940 /* XXX: need has_b_frame, but cannot get it if the codec is
943 pc && pc->pict_type != FF_B_TYPE)
944 presentation_delayed = 1;
946 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
947 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
948 pkt->dts -= 1LL<<st->pts_wrap_bits;
951 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
952 // we take the conservative approach and discard both
953 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
954 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
955 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
956 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
959 if (pkt->duration == 0) {
960 compute_frame_duration(&num, &den, st, pc, pkt);
962 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
964 if(pkt->duration != 0 && s->packet_buffer)
965 update_initial_durations(s, st, pkt);
969 /* correct timestamps with byte offset if demuxers only have timestamps
970 on packet boundaries */
971 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
972 /* this will estimate bitrate based on this frame's duration and size */
973 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
974 if(pkt->pts != AV_NOPTS_VALUE)
976 if(pkt->dts != AV_NOPTS_VALUE)
980 if (pc && pc->dts_sync_point >= 0) {
981 // we have synchronization info from the parser
982 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
984 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
985 if (pkt->dts != AV_NOPTS_VALUE) {
986 // got DTS from the stream, update reference timestamp
987 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
988 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
989 } else if (st->reference_dts != AV_NOPTS_VALUE) {
990 // compute DTS based on reference timestamp
991 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
992 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
994 if (pc->dts_sync_point > 0)
995 st->reference_dts = pkt->dts; // new reference
999 /* This may be redundant, but it should not hurt. */
1000 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1001 presentation_delayed = 1;
1003 // 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);
1004 /* interpolate PTS and DTS if they are not present */
1005 //We skip H264 currently because delay and has_b_frames are not reliably set
1006 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1007 if (presentation_delayed) {
1008 /* DTS = decompression timestamp */
1009 /* PTS = presentation timestamp */
1010 if (pkt->dts == AV_NOPTS_VALUE)
1011 pkt->dts = st->last_IP_pts;
1012 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1013 if (pkt->dts == AV_NOPTS_VALUE)
1014 pkt->dts = st->cur_dts;
1016 /* this is tricky: the dts must be incremented by the duration
1017 of the frame we are displaying, i.e. the last I- or P-frame */
1018 if (st->last_IP_duration == 0)
1019 st->last_IP_duration = pkt->duration;
1020 if(pkt->dts != AV_NOPTS_VALUE)
1021 st->cur_dts = pkt->dts + st->last_IP_duration;
1022 st->last_IP_duration = pkt->duration;
1023 st->last_IP_pts= pkt->pts;
1024 /* cannot compute PTS if not present (we can compute it only
1025 by knowing the future */
1026 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1027 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1028 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1029 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1030 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1031 pkt->pts += pkt->duration;
1032 // 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);
1036 /* presentation is not delayed : PTS and DTS are the same */
1037 if(pkt->pts == AV_NOPTS_VALUE)
1038 pkt->pts = pkt->dts;
1039 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1040 if(pkt->pts == AV_NOPTS_VALUE)
1041 pkt->pts = st->cur_dts;
1042 pkt->dts = pkt->pts;
1043 if(pkt->pts != AV_NOPTS_VALUE)
1044 st->cur_dts = pkt->pts + pkt->duration;
1048 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1049 st->pts_buffer[0]= pkt->pts;
1050 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1051 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1052 if(pkt->dts == AV_NOPTS_VALUE)
1053 pkt->dts= st->pts_buffer[0];
1054 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1055 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1057 if(pkt->dts > st->cur_dts)
1058 st->cur_dts = pkt->dts;
1061 // 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);
1064 if(is_intra_only(st->codec))
1065 pkt->flags |= AV_PKT_FLAG_KEY;
1068 /* keyframe computation */
1069 if (pc->key_frame == 1)
1070 pkt->flags |= AV_PKT_FLAG_KEY;
1071 else if (pc->key_frame == -1 && pc->pict_type == FF_I_TYPE)
1072 pkt->flags |= AV_PKT_FLAG_KEY;
1075 pkt->convergence_duration = pc->convergence_duration;
1079 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1084 av_init_packet(pkt);
1087 /* select current input stream component */
1090 if (!st->need_parsing || !st->parser) {
1091 /* no parsing needed: we just output the packet as is */
1092 /* raw data support */
1093 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
1094 compute_pkt_fields(s, st, NULL, pkt);
1096 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1097 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1098 ff_reduce_index(s, st->index);
1099 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1102 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1103 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1104 st->cur_ptr, st->cur_len,
1105 st->cur_pkt.pts, st->cur_pkt.dts,
1107 st->cur_pkt.pts = AV_NOPTS_VALUE;
1108 st->cur_pkt.dts = AV_NOPTS_VALUE;
1109 /* increment read pointer */
1113 /* return packet if any */
1117 pkt->stream_index = st->index;
1118 pkt->pts = st->parser->pts;
1119 pkt->dts = st->parser->dts;
1120 pkt->pos = st->parser->pos;
1121 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1123 pkt->destruct= st->cur_pkt.destruct;
1124 st->cur_pkt.destruct= NULL;
1125 st->cur_pkt.data = NULL;
1126 assert(st->cur_len == 0);
1128 pkt->destruct = NULL;
1130 compute_pkt_fields(s, st, st->parser, pkt);
1132 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1133 ff_reduce_index(s, st->index);
1134 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1135 0, 0, AVINDEX_KEYFRAME);
1142 av_free_packet(&st->cur_pkt);
1147 /* read next packet */
1148 ret = av_read_packet(s, &cur_pkt);
1150 if (ret == AVERROR(EAGAIN))
1152 /* return the last frames, if any */
1153 for(i = 0; i < s->nb_streams; i++) {
1155 if (st->parser && st->need_parsing) {
1156 av_parser_parse2(st->parser, st->codec,
1157 &pkt->data, &pkt->size,
1159 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1165 /* no more packets: really terminate parsing */
1168 st = s->streams[cur_pkt.stream_index];
1169 st->cur_pkt= cur_pkt;
1171 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1172 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1173 st->cur_pkt.pts < st->cur_pkt.dts){
1174 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1175 st->cur_pkt.stream_index,
1179 // av_free_packet(&st->cur_pkt);
1183 if(s->debug & FF_FDEBUG_TS)
1184 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1185 st->cur_pkt.stream_index,
1189 st->cur_pkt.duration,
1193 st->cur_ptr = st->cur_pkt.data;
1194 st->cur_len = st->cur_pkt.size;
1195 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1196 st->parser = av_parser_init(st->codec->codec_id);
1198 /* no parser available: just output the raw packets */
1199 st->need_parsing = AVSTREAM_PARSE_NONE;
1200 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1201 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1202 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1203 st->parser->flags |= PARSER_FLAG_ONCE;
1208 if(s->debug & FF_FDEBUG_TS)
1209 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1220 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1224 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1227 pktl = s->packet_buffer;
1229 AVPacket *next_pkt= &pktl->pkt;
1231 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1232 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1233 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1234 if( pktl->pkt.stream_index == next_pkt->stream_index
1235 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1236 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1237 next_pkt->pts= pktl->pkt.dts;
1241 pktl = s->packet_buffer;
1244 if( next_pkt->pts != AV_NOPTS_VALUE
1245 || next_pkt->dts == AV_NOPTS_VALUE
1247 /* read packet from packet buffer, if there is data */
1249 s->packet_buffer = pktl->next;
1255 int ret= av_read_frame_internal(s, pkt);
1257 if(pktl && ret != AVERROR(EAGAIN)){
1264 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1265 &s->packet_buffer_end)) < 0)
1266 return AVERROR(ENOMEM);
1268 assert(!s->packet_buffer);
1269 return av_read_frame_internal(s, pkt);
1274 /* XXX: suppress the packet queue */
1275 static void flush_packet_queue(AVFormatContext *s)
1280 pktl = s->packet_buffer;
1283 s->packet_buffer = pktl->next;
1284 av_free_packet(&pktl->pkt);
1287 while(s->raw_packet_buffer){
1288 pktl = s->raw_packet_buffer;
1289 s->raw_packet_buffer = pktl->next;
1290 av_free_packet(&pktl->pkt);
1293 s->packet_buffer_end=
1294 s->raw_packet_buffer_end= NULL;
1295 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1298 /*******************************************************/
1301 int av_find_default_stream_index(AVFormatContext *s)
1303 int first_audio_index = -1;
1307 if (s->nb_streams <= 0)
1309 for(i = 0; i < s->nb_streams; i++) {
1311 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1314 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1315 first_audio_index = i;
1317 return first_audio_index >= 0 ? first_audio_index : 0;
1321 * Flush the frame reader.
1323 void ff_read_frame_flush(AVFormatContext *s)
1328 flush_packet_queue(s);
1332 /* for each stream, reset read state */
1333 for(i = 0; i < s->nb_streams; i++) {
1337 av_parser_close(st->parser);
1339 av_free_packet(&st->cur_pkt);
1341 st->last_IP_pts = AV_NOPTS_VALUE;
1342 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1343 st->reference_dts = AV_NOPTS_VALUE;
1348 st->probe_packets = MAX_PROBE_PACKETS;
1350 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1351 st->pts_buffer[j]= AV_NOPTS_VALUE;
1355 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1358 for(i = 0; i < s->nb_streams; i++) {
1359 AVStream *st = s->streams[i];
1361 st->cur_dts = av_rescale(timestamp,
1362 st->time_base.den * (int64_t)ref_st->time_base.num,
1363 st->time_base.num * (int64_t)ref_st->time_base.den);
1367 void ff_reduce_index(AVFormatContext *s, int stream_index)
1369 AVStream *st= s->streams[stream_index];
1370 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1372 if((unsigned)st->nb_index_entries >= max_entries){
1374 for(i=0; 2*i<st->nb_index_entries; i++)
1375 st->index_entries[i]= st->index_entries[2*i];
1376 st->nb_index_entries= i;
1380 int ff_add_index_entry(AVIndexEntry **index_entries,
1381 int *nb_index_entries,
1382 unsigned int *index_entries_allocated_size,
1383 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1385 AVIndexEntry *entries, *ie;
1388 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1391 entries = av_fast_realloc(*index_entries,
1392 index_entries_allocated_size,
1393 (*nb_index_entries + 1) *
1394 sizeof(AVIndexEntry));
1398 *index_entries= entries;
1400 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1403 index= (*nb_index_entries)++;
1404 ie= &entries[index];
1405 assert(index==0 || ie[-1].timestamp < timestamp);
1407 ie= &entries[index];
1408 if(ie->timestamp != timestamp){
1409 if(ie->timestamp <= timestamp)
1411 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1412 (*nb_index_entries)++;
1413 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1414 distance= ie->min_distance;
1418 ie->timestamp = timestamp;
1419 ie->min_distance= distance;
1426 int av_add_index_entry(AVStream *st,
1427 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1429 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1430 &st->index_entries_allocated_size, pos,
1431 timestamp, size, distance, flags);
1434 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1435 int64_t wanted_timestamp, int flags)
1443 //optimize appending index entries at the end
1444 if(b && entries[b-1].timestamp < wanted_timestamp)
1449 timestamp = entries[m].timestamp;
1450 if(timestamp >= wanted_timestamp)
1452 if(timestamp <= wanted_timestamp)
1455 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1457 if(!(flags & AVSEEK_FLAG_ANY)){
1458 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1459 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1468 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1471 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1472 wanted_timestamp, flags);
1477 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1478 AVInputFormat *avif= s->iformat;
1479 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1480 int64_t ts_min, ts_max, ts;
1485 if (stream_index < 0)
1489 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1493 ts_min= AV_NOPTS_VALUE;
1494 pos_limit= -1; //gcc falsely says it may be uninitialized
1496 st= s->streams[stream_index];
1497 if(st->index_entries){
1500 index= av_index_search_timestamp(st, target_ts, flags | AVSEEK_FLAG_BACKWARD); //FIXME whole func must be checked for non-keyframe entries in index case, especially read_timestamp()
1501 index= FFMAX(index, 0);
1502 e= &st->index_entries[index];
1504 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1506 ts_min= e->timestamp;
1508 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1515 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1516 assert(index < st->nb_index_entries);
1518 e= &st->index_entries[index];
1519 assert(e->timestamp >= target_ts);
1521 ts_max= e->timestamp;
1522 pos_limit= pos_max - e->min_distance;
1524 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1525 pos_max,pos_limit, ts_max);
1530 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1535 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1538 av_update_cur_dts(s, st, ts);
1543 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 )){
1545 int64_t start_pos, filesize;
1549 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1552 if(ts_min == AV_NOPTS_VALUE){
1553 pos_min = s->data_offset;
1554 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1555 if (ts_min == AV_NOPTS_VALUE)
1559 if(ts_max == AV_NOPTS_VALUE){
1561 filesize = avio_size(s->pb);
1562 pos_max = filesize - 1;
1565 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1567 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1568 if (ts_max == AV_NOPTS_VALUE)
1572 int64_t tmp_pos= pos_max + 1;
1573 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1574 if(tmp_ts == AV_NOPTS_VALUE)
1578 if(tmp_pos >= filesize)
1584 if(ts_min > ts_max){
1586 }else if(ts_min == ts_max){
1591 while (pos_min < pos_limit) {
1593 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1597 assert(pos_limit <= pos_max);
1600 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1601 // interpolate position (better than dichotomy)
1602 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1603 + pos_min - approximate_keyframe_distance;
1604 }else if(no_change==1){
1605 // bisection, if interpolation failed to change min or max pos last time
1606 pos = (pos_min + pos_limit)>>1;
1608 /* linear search if bisection failed, can only happen if there
1609 are very few or no keyframes between min/max */
1614 else if(pos > pos_limit)
1618 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1624 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1625 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit,
1626 start_pos, no_change);
1628 if(ts == AV_NOPTS_VALUE){
1629 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1632 assert(ts != AV_NOPTS_VALUE);
1633 if (target_ts <= ts) {
1634 pos_limit = start_pos - 1;
1638 if (target_ts >= ts) {
1644 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1645 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1648 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1650 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1651 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1652 pos, ts_min, target_ts, ts_max);
1658 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1659 int64_t pos_min, pos_max;
1663 if (stream_index < 0)
1666 st= s->streams[stream_index];
1669 pos_min = s->data_offset;
1670 pos_max = avio_size(s->pb) - 1;
1672 if (pos < pos_min) pos= pos_min;
1673 else if(pos > pos_max) pos= pos_max;
1675 avio_seek(s->pb, pos, SEEK_SET);
1678 av_update_cur_dts(s, st, ts);
1683 static int av_seek_frame_generic(AVFormatContext *s,
1684 int stream_index, int64_t timestamp, int flags)
1691 st = s->streams[stream_index];
1693 index = av_index_search_timestamp(st, timestamp, flags);
1695 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1698 if(index < 0 || index==st->nb_index_entries-1){
1702 if(st->nb_index_entries){
1703 assert(st->index_entries);
1704 ie= &st->index_entries[st->nb_index_entries-1];
1705 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1707 av_update_cur_dts(s, st, ie->timestamp);
1709 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1715 ret = av_read_frame(s, &pkt);
1716 }while(ret == AVERROR(EAGAIN));
1719 av_free_packet(&pkt);
1720 if(stream_index == pkt.stream_index){
1721 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1725 index = av_index_search_timestamp(st, timestamp, flags);
1730 ff_read_frame_flush(s);
1731 if (s->iformat->read_seek){
1732 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1735 ie = &st->index_entries[index];
1736 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1738 av_update_cur_dts(s, st, ie->timestamp);
1743 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1748 ff_read_frame_flush(s);
1750 if(flags & AVSEEK_FLAG_BYTE)
1751 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1753 if(stream_index < 0){
1754 stream_index= av_find_default_stream_index(s);
1755 if(stream_index < 0)
1758 st= s->streams[stream_index];
1759 /* timestamp for default must be expressed in AV_TIME_BASE units */
1760 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1763 /* first, we try the format specific seek */
1764 if (s->iformat->read_seek)
1765 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1772 if(s->iformat->read_timestamp)
1773 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1775 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1778 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1780 if(min_ts > ts || max_ts < ts)
1783 ff_read_frame_flush(s);
1785 if (s->iformat->read_seek2)
1786 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1788 if(s->iformat->read_timestamp){
1789 //try to seek via read_timestamp()
1792 //Fallback to old API if new is not implemented but old is
1793 //Note the old has somewat different sematics
1794 if(s->iformat->read_seek || 1)
1795 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1797 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1800 /*******************************************************/
1803 * Return TRUE if the stream has accurate duration in any stream.
1805 * @return TRUE if the stream has accurate duration for at least one component.
1807 static int av_has_duration(AVFormatContext *ic)
1812 for(i = 0;i < ic->nb_streams; i++) {
1813 st = ic->streams[i];
1814 if (st->duration != AV_NOPTS_VALUE)
1821 * Estimate the stream timings from the one of each components.
1823 * Also computes the global bitrate if possible.
1825 static void av_update_stream_timings(AVFormatContext *ic)
1827 int64_t start_time, start_time1, end_time, end_time1;
1828 int64_t duration, duration1;
1832 start_time = INT64_MAX;
1833 end_time = INT64_MIN;
1834 duration = INT64_MIN;
1835 for(i = 0;i < ic->nb_streams; i++) {
1836 st = ic->streams[i];
1837 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1838 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1839 if (start_time1 < start_time)
1840 start_time = start_time1;
1841 if (st->duration != AV_NOPTS_VALUE) {
1842 end_time1 = start_time1
1843 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1844 if (end_time1 > end_time)
1845 end_time = end_time1;
1848 if (st->duration != AV_NOPTS_VALUE) {
1849 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1850 if (duration1 > duration)
1851 duration = duration1;
1854 if (start_time != INT64_MAX) {
1855 ic->start_time = start_time;
1856 if (end_time != INT64_MIN) {
1857 if (end_time - start_time > duration)
1858 duration = end_time - start_time;
1861 if (duration != INT64_MIN) {
1862 ic->duration = duration;
1863 if (ic->file_size > 0) {
1864 /* compute the bitrate */
1865 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1866 (double)ic->duration;
1871 static void fill_all_stream_timings(AVFormatContext *ic)
1876 av_update_stream_timings(ic);
1877 for(i = 0;i < ic->nb_streams; i++) {
1878 st = ic->streams[i];
1879 if (st->start_time == AV_NOPTS_VALUE) {
1880 if(ic->start_time != AV_NOPTS_VALUE)
1881 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1882 if(ic->duration != AV_NOPTS_VALUE)
1883 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1888 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1890 int64_t filesize, duration;
1894 /* if bit_rate is already set, we believe it */
1895 if (ic->bit_rate <= 0) {
1897 for(i=0;i<ic->nb_streams;i++) {
1898 st = ic->streams[i];
1899 if (st->codec->bit_rate > 0)
1900 bit_rate += st->codec->bit_rate;
1902 ic->bit_rate = bit_rate;
1905 /* if duration is already set, we believe it */
1906 if (ic->duration == AV_NOPTS_VALUE &&
1907 ic->bit_rate != 0 &&
1908 ic->file_size != 0) {
1909 filesize = ic->file_size;
1911 for(i = 0; i < ic->nb_streams; i++) {
1912 st = ic->streams[i];
1913 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1914 if (st->duration == AV_NOPTS_VALUE)
1915 st->duration = duration;
1921 #define DURATION_MAX_READ_SIZE 250000
1922 #define DURATION_MAX_RETRY 3
1924 /* only usable for MPEG-PS streams */
1925 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1927 AVPacket pkt1, *pkt = &pkt1;
1929 int read_size, i, ret;
1931 int64_t filesize, offset, duration;
1936 /* flush packet queue */
1937 flush_packet_queue(ic);
1939 for (i=0; i<ic->nb_streams; i++) {
1940 st = ic->streams[i];
1941 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1942 av_log(st->codec, AV_LOG_WARNING, "start time is not set in av_estimate_timings_from_pts\n");
1945 av_parser_close(st->parser);
1947 av_free_packet(&st->cur_pkt);
1951 /* estimate the end time (duration) */
1952 /* XXX: may need to support wrapping */
1953 filesize = ic->file_size;
1954 end_time = AV_NOPTS_VALUE;
1956 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
1960 avio_seek(ic->pb, offset, SEEK_SET);
1963 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
1967 ret = av_read_packet(ic, pkt);
1968 }while(ret == AVERROR(EAGAIN));
1971 read_size += pkt->size;
1972 st = ic->streams[pkt->stream_index];
1973 if (pkt->pts != AV_NOPTS_VALUE &&
1974 (st->start_time != AV_NOPTS_VALUE ||
1975 st->first_dts != AV_NOPTS_VALUE)) {
1976 duration = end_time = pkt->pts;
1977 if (st->start_time != AV_NOPTS_VALUE) duration -= st->start_time;
1978 else duration -= st->first_dts;
1980 duration += 1LL<<st->pts_wrap_bits;
1982 if (st->duration == AV_NOPTS_VALUE ||
1983 st->duration < duration)
1984 st->duration = duration;
1987 av_free_packet(pkt);
1989 }while( end_time==AV_NOPTS_VALUE
1990 && filesize > (DURATION_MAX_READ_SIZE<<retry)
1991 && ++retry <= DURATION_MAX_RETRY);
1993 fill_all_stream_timings(ic);
1995 avio_seek(ic->pb, old_offset, SEEK_SET);
1996 for (i=0; i<ic->nb_streams; i++) {
1998 st->cur_dts= st->first_dts;
1999 st->last_IP_pts = AV_NOPTS_VALUE;
2003 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
2007 /* get the file size, if possible */
2008 if (ic->iformat->flags & AVFMT_NOFILE) {
2011 file_size = avio_size(ic->pb);
2015 ic->file_size = file_size;
2017 if ((!strcmp(ic->iformat->name, "mpeg") ||
2018 !strcmp(ic->iformat->name, "mpegts")) &&
2019 file_size && !url_is_streamed(ic->pb)) {
2020 /* get accurate estimate from the PTSes */
2021 av_estimate_timings_from_pts(ic, old_offset);
2022 } else if (av_has_duration(ic)) {
2023 /* at least one component has timings - we use them for all
2025 fill_all_stream_timings(ic);
2027 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2028 /* less precise: use bitrate info */
2029 av_estimate_timings_from_bit_rate(ic);
2031 av_update_stream_timings(ic);
2037 for(i = 0;i < ic->nb_streams; i++) {
2038 st = ic->streams[i];
2039 printf("%d: start_time: %0.3f duration: %0.3f\n",
2040 i, (double)st->start_time / AV_TIME_BASE,
2041 (double)st->duration / AV_TIME_BASE);
2043 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2044 (double)ic->start_time / AV_TIME_BASE,
2045 (double)ic->duration / AV_TIME_BASE,
2046 ic->bit_rate / 1000);
2051 static int has_codec_parameters(AVCodecContext *enc)
2054 switch(enc->codec_type) {
2055 case AVMEDIA_TYPE_AUDIO:
2056 val = enc->sample_rate && enc->channels && enc->sample_fmt != AV_SAMPLE_FMT_NONE;
2057 if(!enc->frame_size &&
2058 (enc->codec_id == CODEC_ID_VORBIS ||
2059 enc->codec_id == CODEC_ID_AAC ||
2060 enc->codec_id == CODEC_ID_MP1 ||
2061 enc->codec_id == CODEC_ID_MP2 ||
2062 enc->codec_id == CODEC_ID_MP3 ||
2063 enc->codec_id == CODEC_ID_SPEEX))
2066 case AVMEDIA_TYPE_VIDEO:
2067 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
2073 return enc->codec_id != CODEC_ID_NONE && val != 0;
2076 static int has_decode_delay_been_guessed(AVStream *st)
2078 return st->codec->codec_id != CODEC_ID_H264 ||
2079 st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2082 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
2086 int got_picture, data_size, ret=0;
2089 if(!st->codec->codec){
2090 codec = avcodec_find_decoder(st->codec->codec_id);
2093 ret = avcodec_open(st->codec, codec);
2098 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st)){
2099 switch(st->codec->codec_type) {
2100 case AVMEDIA_TYPE_VIDEO:
2101 avcodec_get_frame_defaults(&picture);
2102 ret = avcodec_decode_video2(st->codec, &picture,
2103 &got_picture, avpkt);
2105 case AVMEDIA_TYPE_AUDIO:
2106 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2107 samples = av_malloc(data_size);
2110 ret = avcodec_decode_audio3(st->codec, samples,
2122 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2124 while (tags->id != CODEC_ID_NONE) {
2132 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2135 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2136 if(tag == tags[i].tag)
2139 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2140 if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2143 return CODEC_ID_NONE;
2146 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2149 for(i=0; tags && tags[i]; i++){
2150 int tag= ff_codec_get_tag(tags[i], id);
2156 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2159 for(i=0; tags && tags[i]; i++){
2160 enum CodecID id= ff_codec_get_id(tags[i], tag);
2161 if(id!=CODEC_ID_NONE) return id;
2163 return CODEC_ID_NONE;
2166 static void compute_chapters_end(AVFormatContext *s)
2170 for (i=0; i+1<s->nb_chapters; i++)
2171 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2172 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
2173 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
2174 s->chapters[i]->end = s->chapters[i+1]->start;
2177 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
2178 assert(s->start_time != AV_NOPTS_VALUE);
2179 assert(s->duration > 0);
2180 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
2182 s->chapters[i]->time_base);
2186 static int get_std_framerate(int i){
2187 if(i<60*12) return i*1001;
2188 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2192 * Is the time base unreliable.
2193 * This is a heuristic to balance between quick acceptance of the values in
2194 * the headers vs. some extra checks.
2195 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2196 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2197 * And there are "variable" fps files this needs to detect as well.
2199 static int tb_unreliable(AVCodecContext *c){
2200 if( c->time_base.den >= 101L*c->time_base.num
2201 || c->time_base.den < 5L*c->time_base.num
2202 /* || c->codec_tag == AV_RL32("DIVX")
2203 || c->codec_tag == AV_RL32("XVID")*/
2204 || c->codec_id == CODEC_ID_MPEG2VIDEO
2205 || c->codec_id == CODEC_ID_H264
2211 int av_find_stream_info(AVFormatContext *ic)
2213 int i, count, ret, read_size, j;
2215 AVPacket pkt1, *pkt;
2216 int64_t old_offset = avio_tell(ic->pb);
2218 for(i=0;i<ic->nb_streams;i++) {
2220 st = ic->streams[i];
2221 if (st->codec->codec_id == CODEC_ID_AAC) {
2222 st->codec->sample_rate = 0;
2223 st->codec->frame_size = 0;
2224 st->codec->channels = 0;
2226 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2227 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2228 /* if(!st->time_base.num)
2230 if(!st->codec->time_base.num)
2231 st->codec->time_base= st->time_base;
2233 //only for the split stuff
2234 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2235 st->parser = av_parser_init(st->codec->codec_id);
2236 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2237 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2240 assert(!st->codec->codec);
2241 codec = avcodec_find_decoder(st->codec->codec_id);
2243 /* Force decoding of at least one frame of codec data
2244 * this makes sure the codec initializes the channel configuration
2245 * and does not trust the values from the container.
2247 if (codec && codec->capabilities & CODEC_CAP_CHANNEL_CONF)
2248 st->codec->channels = 0;
2250 /* Ensure that subtitle_header is properly set. */
2251 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2252 && codec && !st->codec->codec)
2253 avcodec_open(st->codec, codec);
2255 //try to just open decoders, in case this is enough to get parameters
2256 if(!has_codec_parameters(st->codec)){
2257 if (codec && !st->codec->codec)
2258 avcodec_open(st->codec, codec);
2262 for (i=0; i<ic->nb_streams; i++) {
2263 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2269 if(url_interrupt_cb()){
2271 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2275 /* check if one codec still needs to be handled */
2276 for(i=0;i<ic->nb_streams;i++) {
2277 st = ic->streams[i];
2278 if (!has_codec_parameters(st->codec))
2280 /* variable fps and no guess at the real fps */
2281 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2282 && st->info->duration_count<20 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2284 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2286 if(st->first_dts == AV_NOPTS_VALUE)
2289 if (i == ic->nb_streams) {
2290 /* NOTE: if the format has no header, then we need to read
2291 some packets to get most of the streams, so we cannot
2293 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2294 /* if we found the info for all the codecs, we can stop */
2296 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2300 /* we did not get all the codec info, but we read too much data */
2301 if (read_size >= ic->probesize) {
2303 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2307 /* NOTE: a new stream can be added there if no header in file
2308 (AVFMTCTX_NOHEADER) */
2309 ret = av_read_frame_internal(ic, &pkt1);
2310 if (ret < 0 && ret != AVERROR(EAGAIN)) {
2312 ret = -1; /* we could not have all the codec parameters before EOF */
2313 for(i=0;i<ic->nb_streams;i++) {
2314 st = ic->streams[i];
2315 if (!has_codec_parameters(st->codec)){
2317 avcodec_string(buf, sizeof(buf), st->codec, 0);
2318 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2326 if (ret == AVERROR(EAGAIN))
2329 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2330 if ((ret = av_dup_packet(pkt)) < 0)
2331 goto find_stream_info_err;
2333 read_size += pkt->size;
2335 st = ic->streams[pkt->stream_index];
2336 if (st->codec_info_nb_frames>1) {
2337 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) {
2338 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2341 st->info->codec_info_duration += pkt->duration;
2344 int64_t last = st->info->last_dts;
2345 int64_t duration= pkt->dts - last;
2347 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2348 double dur= duration * av_q2d(st->time_base);
2350 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2351 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2352 if (st->info->duration_count < 2)
2353 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2354 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2355 int framerate= get_std_framerate(i);
2356 int ticks= lrintf(dur*framerate/(1001*12));
2357 double error= dur - ticks*1001*12/(double)framerate;
2358 st->info->duration_error[i] += error*error;
2360 st->info->duration_count++;
2361 // ignore the first 4 values, they might have some random jitter
2362 if (st->info->duration_count > 3)
2363 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2365 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2366 st->info->last_dts = pkt->dts;
2368 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2369 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2371 st->codec->extradata_size= i;
2372 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2373 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2374 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2378 /* if still no information, we try to open the codec and to
2379 decompress the frame. We try to avoid that in most cases as
2380 it takes longer and uses more memory. For MPEG-4, we need to
2381 decompress for QuickTime. */
2382 if (!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st))
2383 try_decode_frame(st, pkt);
2385 st->codec_info_nb_frames++;
2389 // close codecs which were opened in try_decode_frame()
2390 for(i=0;i<ic->nb_streams;i++) {
2391 st = ic->streams[i];
2392 if(st->codec->codec)
2393 avcodec_close(st->codec);
2395 for(i=0;i<ic->nb_streams;i++) {
2396 st = ic->streams[i];
2397 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2398 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2399 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2400 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2401 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2402 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
2403 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2405 // the check for tb_unreliable() is not completely correct, since this is not about handling
2406 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2407 // ipmovie.c produces.
2408 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > 1 && !st->r_frame_rate.num)
2409 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);
2410 if (st->info->duration_count && !st->r_frame_rate.num
2411 && tb_unreliable(st->codec) /*&&
2412 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2413 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2415 double best_error= 2*av_q2d(st->time_base);
2416 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2418 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2419 double error = st->info->duration_error[j] * get_std_framerate(j);
2420 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2421 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2422 if(error < best_error){
2424 num = get_std_framerate(j);
2427 // do not increase frame rate by more than 1 % in order to match a standard rate.
2428 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2429 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2432 if (!st->r_frame_rate.num){
2433 if( st->codec->time_base.den * (int64_t)st->time_base.num
2434 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2435 st->r_frame_rate.num = st->codec->time_base.den;
2436 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2438 st->r_frame_rate.num = st->time_base.den;
2439 st->r_frame_rate.den = st->time_base.num;
2442 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2443 if(!st->codec->bits_per_coded_sample)
2444 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2448 av_estimate_timings(ic, old_offset);
2450 compute_chapters_end(ic);
2453 /* correct DTS for B-frame streams with no timestamps */
2454 for(i=0;i<ic->nb_streams;i++) {
2455 st = ic->streams[i];
2456 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2458 ppktl = &ic->packet_buffer;
2460 if(ppkt1->stream_index != i)
2462 if(ppkt1->pkt->dts < 0)
2464 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2466 ppkt1->pkt->dts -= delta;
2471 st->cur_dts -= delta;
2477 find_stream_info_err:
2478 for (i=0; i < ic->nb_streams; i++)
2479 av_freep(&ic->streams[i]->info);
2483 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2487 for (i = 0; i < ic->nb_programs; i++)
2488 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2489 if (ic->programs[i]->stream_index[j] == s)
2490 return ic->programs[i];
2494 int av_find_best_stream(AVFormatContext *ic,
2495 enum AVMediaType type,
2496 int wanted_stream_nb,
2498 AVCodec **decoder_ret,
2501 int i, nb_streams = ic->nb_streams, stream_number = 0;
2502 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2503 unsigned *program = NULL;
2504 AVCodec *decoder = NULL, *best_decoder = NULL;
2506 if (related_stream >= 0 && wanted_stream_nb < 0) {
2507 AVProgram *p = find_program_from_stream(ic, related_stream);
2509 program = p->stream_index;
2510 nb_streams = p->nb_stream_indexes;
2513 for (i = 0; i < nb_streams; i++) {
2514 AVStream *st = ic->streams[program ? program[i] : i];
2515 AVCodecContext *avctx = st->codec;
2516 if (avctx->codec_type != type)
2518 if (wanted_stream_nb >= 0 && stream_number++ != wanted_stream_nb)
2520 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2523 decoder = avcodec_find_decoder(ic->streams[i]->codec->codec_id);
2526 ret = AVERROR_DECODER_NOT_FOUND;
2530 if (best_count >= st->codec_info_nb_frames)
2532 best_count = st->codec_info_nb_frames;
2533 ret = program ? program[i] : i;
2534 best_decoder = decoder;
2535 if (program && i == nb_streams - 1 && ret < 0) {
2537 nb_streams = ic->nb_streams;
2538 i = 0; /* no related stream found, try again with everything */
2542 *decoder_ret = best_decoder;
2546 /*******************************************************/
2548 int av_read_play(AVFormatContext *s)
2550 if (s->iformat->read_play)
2551 return s->iformat->read_play(s);
2553 return av_url_read_fpause(s->pb, 0);
2554 return AVERROR(ENOSYS);
2557 int av_read_pause(AVFormatContext *s)
2559 if (s->iformat->read_pause)
2560 return s->iformat->read_pause(s);
2562 return av_url_read_fpause(s->pb, 1);
2563 return AVERROR(ENOSYS);
2566 void av_close_input_stream(AVFormatContext *s)
2568 flush_packet_queue(s);
2569 if (s->iformat->read_close)
2570 s->iformat->read_close(s);
2571 avformat_free_context(s);
2574 void avformat_free_context(AVFormatContext *s)
2579 for(i=0;i<s->nb_streams;i++) {
2580 /* free all data in a stream component */
2583 av_parser_close(st->parser);
2584 av_free_packet(&st->cur_pkt);
2586 av_metadata_free(&st->metadata);
2587 av_free(st->index_entries);
2588 av_free(st->codec->extradata);
2589 av_free(st->codec->subtitle_header);
2591 #if FF_API_OLD_METADATA
2592 av_free(st->filename);
2594 av_free(st->priv_data);
2598 for(i=s->nb_programs-1; i>=0; i--) {
2599 #if FF_API_OLD_METADATA
2600 av_freep(&s->programs[i]->provider_name);
2601 av_freep(&s->programs[i]->name);
2603 av_metadata_free(&s->programs[i]->metadata);
2604 av_freep(&s->programs[i]->stream_index);
2605 av_freep(&s->programs[i]);
2607 av_freep(&s->programs);
2608 av_freep(&s->priv_data);
2609 while(s->nb_chapters--) {
2610 #if FF_API_OLD_METADATA
2611 av_free(s->chapters[s->nb_chapters]->title);
2613 av_metadata_free(&s->chapters[s->nb_chapters]->metadata);
2614 av_free(s->chapters[s->nb_chapters]);
2616 av_freep(&s->chapters);
2617 av_metadata_free(&s->metadata);
2622 void av_close_input_file(AVFormatContext *s)
2624 AVIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2625 av_close_input_stream(s);
2630 AVStream *av_new_stream(AVFormatContext *s, int id)
2635 #if FF_API_MAX_STREAMS
2636 if (s->nb_streams >= MAX_STREAMS){
2637 av_log(s, AV_LOG_ERROR, "Too many streams\n");
2643 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2645 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2648 s->streams = streams;
2651 st = av_mallocz(sizeof(AVStream));
2654 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2659 st->codec= avcodec_alloc_context();
2661 /* no default bitrate if decoding */
2662 st->codec->bit_rate = 0;
2664 st->index = s->nb_streams;
2666 st->start_time = AV_NOPTS_VALUE;
2667 st->duration = AV_NOPTS_VALUE;
2668 /* we set the current DTS to 0 so that formats without any timestamps
2669 but durations get some timestamps, formats with some unknown
2670 timestamps have their first few packets buffered and the
2671 timestamps corrected before they are returned to the user */
2673 st->first_dts = AV_NOPTS_VALUE;
2674 st->probe_packets = MAX_PROBE_PACKETS;
2676 /* default pts setting is MPEG-like */
2677 av_set_pts_info(st, 33, 1, 90000);
2678 st->last_IP_pts = AV_NOPTS_VALUE;
2679 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2680 st->pts_buffer[i]= AV_NOPTS_VALUE;
2681 st->reference_dts = AV_NOPTS_VALUE;
2683 st->sample_aspect_ratio = (AVRational){0,1};
2685 s->streams[s->nb_streams++] = st;
2689 AVProgram *av_new_program(AVFormatContext *ac, int id)
2691 AVProgram *program=NULL;
2695 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2698 for(i=0; i<ac->nb_programs; i++)
2699 if(ac->programs[i]->id == id)
2700 program = ac->programs[i];
2703 program = av_mallocz(sizeof(AVProgram));
2706 dynarray_add(&ac->programs, &ac->nb_programs, program);
2707 program->discard = AVDISCARD_NONE;
2714 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2716 AVChapter *chapter = NULL;
2719 for(i=0; i<s->nb_chapters; i++)
2720 if(s->chapters[i]->id == id)
2721 chapter = s->chapters[i];
2724 chapter= av_mallocz(sizeof(AVChapter));
2727 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2729 #if FF_API_OLD_METADATA
2730 av_free(chapter->title);
2732 av_metadata_set2(&chapter->metadata, "title", title, 0);
2734 chapter->time_base= time_base;
2735 chapter->start = start;
2741 /************************************************************/
2742 /* output media file */
2744 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2748 if (s->oformat->priv_data_size > 0) {
2749 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2751 return AVERROR(ENOMEM);
2752 if (s->oformat->priv_class) {
2753 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2754 av_opt_set_defaults(s->priv_data);
2757 s->priv_data = NULL;
2759 if (s->oformat->set_parameters) {
2760 ret = s->oformat->set_parameters(s, ap);
2767 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2769 const AVCodecTag *avctag;
2771 enum CodecID id = CODEC_ID_NONE;
2772 unsigned int tag = 0;
2775 * Check that tag + id is in the table
2776 * If neither is in the table -> OK
2777 * If tag is in the table with another id -> FAIL
2778 * If id is in the table with another tag -> FAIL unless strict < normal
2780 for (n = 0; s->oformat->codec_tag[n]; n++) {
2781 avctag = s->oformat->codec_tag[n];
2782 while (avctag->id != CODEC_ID_NONE) {
2783 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2785 if (id == st->codec->codec_id)
2788 if (avctag->id == st->codec->codec_id)
2793 if (id != CODEC_ID_NONE)
2795 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2800 int av_write_header(AVFormatContext *s)
2805 // some sanity checks
2806 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2807 av_log(s, AV_LOG_ERROR, "no streams\n");
2808 return AVERROR(EINVAL);
2811 for(i=0;i<s->nb_streams;i++) {
2814 switch (st->codec->codec_type) {
2815 case AVMEDIA_TYPE_AUDIO:
2816 if(st->codec->sample_rate<=0){
2817 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2818 return AVERROR(EINVAL);
2820 if(!st->codec->block_align)
2821 st->codec->block_align = st->codec->channels *
2822 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2824 case AVMEDIA_TYPE_VIDEO:
2825 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2826 av_log(s, AV_LOG_ERROR, "time base not set\n");
2827 return AVERROR(EINVAL);
2829 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2830 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2831 return AVERROR(EINVAL);
2833 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2834 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2835 return AVERROR(EINVAL);
2840 if(s->oformat->codec_tag){
2841 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)){
2842 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2843 st->codec->codec_tag= 0;
2845 if(st->codec->codec_tag){
2846 if (!validate_codec_tag(s, st)) {
2848 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2849 av_log(s, AV_LOG_ERROR,
2850 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
2851 tagbuf, st->codec->codec_tag, st->codec->codec_id);
2852 return AVERROR_INVALIDDATA;
2855 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2858 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2859 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2860 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2863 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2864 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2866 return AVERROR(ENOMEM);
2869 #if FF_API_OLD_METADATA
2870 ff_metadata_mux_compat(s);
2873 /* set muxer identification string */
2874 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2875 av_metadata_set2(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
2878 if(s->oformat->write_header){
2879 ret = s->oformat->write_header(s);
2884 /* init PTS generation */
2885 for(i=0;i<s->nb_streams;i++) {
2886 int64_t den = AV_NOPTS_VALUE;
2889 switch (st->codec->codec_type) {
2890 case AVMEDIA_TYPE_AUDIO:
2891 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2893 case AVMEDIA_TYPE_VIDEO:
2894 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2899 if (den != AV_NOPTS_VALUE) {
2901 return AVERROR_INVALIDDATA;
2902 av_frac_init(&st->pts, 0, 0, den);
2908 //FIXME merge with compute_pkt_fields
2909 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
2910 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2911 int num, den, frame_size, i;
2913 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n", pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
2915 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2918 /* duration field */
2919 if (pkt->duration == 0) {
2920 compute_frame_duration(&num, &den, st, NULL, pkt);
2922 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2926 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2929 //XXX/FIXME this is a temporary hack until all encoders output pts
2930 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2932 // pkt->pts= st->cur_dts;
2933 pkt->pts= st->pts.val;
2936 //calculate dts from pts
2937 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2938 st->pts_buffer[0]= pkt->pts;
2939 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2940 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
2941 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2942 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2944 pkt->dts= st->pts_buffer[0];
2947 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2948 av_log(s, AV_LOG_ERROR,
2949 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
2950 st->index, st->cur_dts, pkt->dts);
2953 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2954 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
2958 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2959 st->cur_dts= pkt->dts;
2960 st->pts.val= pkt->dts;
2963 switch (st->codec->codec_type) {
2964 case AVMEDIA_TYPE_AUDIO:
2965 frame_size = get_audio_frame_size(st->codec, pkt->size);
2967 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2968 likely equal to the encoder delay, but it would be better if we
2969 had the real timestamps from the encoder */
2970 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2971 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2974 case AVMEDIA_TYPE_VIDEO:
2975 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2983 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2985 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
2987 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2990 ret= s->oformat->write_packet(s, pkt);
2994 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
2995 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
2997 AVPacketList **next_point, *this_pktl;
2999 this_pktl = av_mallocz(sizeof(AVPacketList));
3000 this_pktl->pkt= *pkt;
3001 pkt->destruct= NULL; // do not free original but only the copy
3002 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3004 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3005 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3007 next_point = &s->packet_buffer;
3010 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3011 while(!compare(s, &(*next_point)->pkt, pkt)){
3012 next_point= &(*next_point)->next;
3016 next_point = &(s->packet_buffer_end->next);
3019 assert(!*next_point);
3021 s->packet_buffer_end= this_pktl;
3024 this_pktl->next= *next_point;
3026 s->streams[pkt->stream_index]->last_in_packet_buffer=
3027 *next_point= this_pktl;
3030 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3032 AVStream *st = s->streams[ pkt ->stream_index];
3033 AVStream *st2= s->streams[ next->stream_index];
3034 int64_t a= st2->time_base.num * (int64_t)st ->time_base.den;
3035 int64_t b= st ->time_base.num * (int64_t)st2->time_base.den;
3036 return av_rescale_rnd(pkt->dts, b, a, AV_ROUND_DOWN) < next->dts;
3039 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3045 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3048 for(i=0; i < s->nb_streams; i++)
3049 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3051 if(stream_count && (s->nb_streams == stream_count || flush)){
3052 pktl= s->packet_buffer;
3055 s->packet_buffer= pktl->next;
3056 if(!s->packet_buffer)
3057 s->packet_buffer_end= NULL;
3059 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3060 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3064 av_init_packet(out);
3070 * Interleave an AVPacket correctly so it can be muxed.
3071 * @param out the interleaved packet will be output here
3072 * @param in the input packet
3073 * @param flush 1 if no further packets are available as input and all
3074 * remaining packets should be output
3075 * @return 1 if a packet was output, 0 if no packet could be output,
3076 * < 0 if an error occurred
3078 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3079 if(s->oformat->interleave_packet)
3080 return s->oformat->interleave_packet(s, out, in, flush);
3082 return av_interleave_packet_per_dts(s, out, in, flush);
3085 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3086 AVStream *st= s->streams[ pkt->stream_index];
3088 //FIXME/XXX/HACK drop zero sized packets
3089 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3092 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
3093 if(compute_pkt_fields2(s, st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3096 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3101 int ret= av_interleave_packet(s, &opkt, pkt, 0);
3102 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3105 ret= s->oformat->write_packet(s, &opkt);
3107 av_free_packet(&opkt);
3115 int av_write_trailer(AVFormatContext *s)
3121 ret= av_interleave_packet(s, &pkt, NULL, 1);
3122 if(ret<0) //FIXME cleanup needed for ret<0 ?
3127 ret= s->oformat->write_packet(s, &pkt);
3129 av_free_packet(&pkt);
3135 if(s->oformat->write_trailer)
3136 ret = s->oformat->write_trailer(s);
3138 for(i=0;i<s->nb_streams;i++) {
3139 av_freep(&s->streams[i]->priv_data);
3140 av_freep(&s->streams[i]->index_entries);
3142 av_freep(&s->priv_data);
3146 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3149 AVProgram *program=NULL;
3152 if (idx >= ac->nb_streams) {
3153 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3157 for(i=0; i<ac->nb_programs; i++){
3158 if(ac->programs[i]->id != progid)
3160 program = ac->programs[i];
3161 for(j=0; j<program->nb_stream_indexes; j++)
3162 if(program->stream_index[j] == idx)
3165 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3168 program->stream_index = tmp;
3169 program->stream_index[program->nb_stream_indexes++] = idx;
3174 static void print_fps(double d, const char *postfix){
3175 uint64_t v= lrintf(d*100);
3176 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3177 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3178 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3181 static void dump_metadata(void *ctx, AVMetadata *m, const char *indent)
3183 if(m && !(m->count == 1 && av_metadata_get(m, "language", NULL, 0))){
3184 AVMetadataTag *tag=NULL;
3186 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3187 while((tag=av_metadata_get(m, "", tag, AV_METADATA_IGNORE_SUFFIX))) {
3188 if(strcmp("language", tag->key))
3189 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
3194 /* "user interface" functions */
3195 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3198 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3199 AVStream *st = ic->streams[i];
3200 int g = av_gcd(st->time_base.num, st->time_base.den);
3201 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0);
3202 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3203 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3204 /* the pid is an important information, so we display it */
3205 /* XXX: add a generic system */
3206 if (flags & AVFMT_SHOW_IDS)
3207 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3209 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3210 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3211 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3212 if (st->sample_aspect_ratio.num && // default
3213 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3214 AVRational display_aspect_ratio;
3215 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3216 st->codec->width*st->sample_aspect_ratio.num,
3217 st->codec->height*st->sample_aspect_ratio.den,
3219 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3220 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3221 display_aspect_ratio.num, display_aspect_ratio.den);
3223 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3224 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3225 print_fps(av_q2d(st->avg_frame_rate), "fps");
3226 if(st->r_frame_rate.den && st->r_frame_rate.num)
3227 print_fps(av_q2d(st->r_frame_rate), "tbr");
3228 if(st->time_base.den && st->time_base.num)
3229 print_fps(1/av_q2d(st->time_base), "tbn");
3230 if(st->codec->time_base.den && st->codec->time_base.num)
3231 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3233 if (st->disposition & AV_DISPOSITION_DEFAULT)
3234 av_log(NULL, AV_LOG_INFO, " (default)");
3235 if (st->disposition & AV_DISPOSITION_DUB)
3236 av_log(NULL, AV_LOG_INFO, " (dub)");
3237 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3238 av_log(NULL, AV_LOG_INFO, " (original)");
3239 if (st->disposition & AV_DISPOSITION_COMMENT)
3240 av_log(NULL, AV_LOG_INFO, " (comment)");
3241 if (st->disposition & AV_DISPOSITION_LYRICS)
3242 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3243 if (st->disposition & AV_DISPOSITION_KARAOKE)
3244 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3245 if (st->disposition & AV_DISPOSITION_FORCED)
3246 av_log(NULL, AV_LOG_INFO, " (forced)");
3247 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3248 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3249 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3250 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3251 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3252 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3253 av_log(NULL, AV_LOG_INFO, "\n");
3254 dump_metadata(NULL, st->metadata, " ");
3257 #if FF_API_DUMP_FORMAT
3258 void dump_format(AVFormatContext *ic,
3263 av_dump_format(ic, index, url, is_output);
3267 void av_dump_format(AVFormatContext *ic,
3273 uint8_t *printed = av_mallocz(ic->nb_streams);
3274 if (ic->nb_streams && !printed)
3277 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3278 is_output ? "Output" : "Input",
3280 is_output ? ic->oformat->name : ic->iformat->name,
3281 is_output ? "to" : "from", url);
3282 dump_metadata(NULL, ic->metadata, " ");
3284 av_log(NULL, AV_LOG_INFO, " Duration: ");
3285 if (ic->duration != AV_NOPTS_VALUE) {
3286 int hours, mins, secs, us;
3287 secs = ic->duration / AV_TIME_BASE;
3288 us = ic->duration % AV_TIME_BASE;
3293 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3294 (100 * us) / AV_TIME_BASE);
3296 av_log(NULL, AV_LOG_INFO, "N/A");
3298 if (ic->start_time != AV_NOPTS_VALUE) {
3300 av_log(NULL, AV_LOG_INFO, ", start: ");
3301 secs = ic->start_time / AV_TIME_BASE;
3302 us = abs(ic->start_time % AV_TIME_BASE);
3303 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3304 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3306 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3308 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3310 av_log(NULL, AV_LOG_INFO, "N/A");
3312 av_log(NULL, AV_LOG_INFO, "\n");
3314 for (i = 0; i < ic->nb_chapters; i++) {
3315 AVChapter *ch = ic->chapters[i];
3316 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3317 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3318 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3320 dump_metadata(NULL, ch->metadata, " ");
3322 if(ic->nb_programs) {
3323 int j, k, total = 0;
3324 for(j=0; j<ic->nb_programs; j++) {
3325 AVMetadataTag *name = av_metadata_get(ic->programs[j]->metadata,
3327 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3328 name ? name->value : "");
3329 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3330 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3331 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3332 printed[ic->programs[j]->stream_index[k]] = 1;
3334 total += ic->programs[j]->nb_stream_indexes;
3336 if (total < ic->nb_streams)
3337 av_log(NULL, AV_LOG_INFO, " No Program\n");
3339 for(i=0;i<ic->nb_streams;i++)
3341 dump_stream_format(ic, i, index, is_output);
3346 #if FF_API_PARSE_FRAME_PARAM
3347 #include "libavutil/parseutils.h"
3349 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
3351 return av_parse_video_size(width_ptr, height_ptr, str);
3354 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
3356 AVRational frame_rate;
3357 int ret = av_parse_video_rate(&frame_rate, arg);
3358 *frame_rate_num= frame_rate.num;
3359 *frame_rate_den= frame_rate.den;
3364 int64_t av_gettime(void)
3367 gettimeofday(&tv,NULL);
3368 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3371 uint64_t ff_ntp_time(void)
3373 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3376 #if FF_API_PARSE_DATE
3377 #include "libavutil/parseutils.h"
3379 int64_t parse_date(const char *timestr, int duration)
3382 av_parse_time(&timeval, timestr, duration);
3387 #if FF_API_FIND_INFO_TAG
3388 #include "libavutil/parseutils.h"
3390 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3392 return av_find_info_tag(arg, arg_size, tag1, info);
3396 int av_get_frame_filename(char *buf, int buf_size,
3397 const char *path, int number)
3400 char *q, buf1[20], c;
3401 int nd, len, percentd_found;
3413 while (isdigit(*p)) {
3414 nd = nd * 10 + *p++ - '0';
3417 } while (isdigit(c));
3426 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3428 if ((q - buf + len) > buf_size - 1)
3430 memcpy(q, buf1, len);
3438 if ((q - buf) < buf_size - 1)
3442 if (!percentd_found)
3451 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3455 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3457 for(i=0;i<size;i+=16) {
3464 PRINT(" %02x", buf[i+j]);
3469 for(j=0;j<len;j++) {
3471 if (c < ' ' || c > '~')
3480 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3482 hex_dump_internal(NULL, f, 0, buf, size);
3485 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3487 hex_dump_internal(avcl, NULL, level, buf, size);
3490 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3493 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3494 PRINT("stream #%d:\n", pkt->stream_index);
3495 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3496 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3497 /* DTS is _always_ valid after av_read_frame() */
3499 if (pkt->dts == AV_NOPTS_VALUE)
3502 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3503 /* PTS may not be known if B-frames are present. */
3505 if (pkt->pts == AV_NOPTS_VALUE)
3508 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3510 PRINT(" size=%d\n", pkt->size);
3513 av_hex_dump(f, pkt->data, pkt->size);
3516 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3518 AVRational tb = { 1, AV_TIME_BASE };
3519 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3522 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3524 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3527 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3529 AVRational tb = { 1, AV_TIME_BASE };
3530 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3533 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3536 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3539 #if FF_API_URL_SPLIT
3540 attribute_deprecated
3541 void ff_url_split(char *proto, int proto_size,
3542 char *authorization, int authorization_size,
3543 char *hostname, int hostname_size,
3545 char *path, int path_size,
3548 av_url_split(proto, proto_size,
3549 authorization, authorization_size,
3550 hostname, hostname_size,
3557 void av_url_split(char *proto, int proto_size,
3558 char *authorization, int authorization_size,
3559 char *hostname, int hostname_size,
3561 char *path, int path_size,
3564 const char *p, *ls, *at, *col, *brk;
3566 if (port_ptr) *port_ptr = -1;
3567 if (proto_size > 0) proto[0] = 0;
3568 if (authorization_size > 0) authorization[0] = 0;
3569 if (hostname_size > 0) hostname[0] = 0;
3570 if (path_size > 0) path[0] = 0;
3572 /* parse protocol */
3573 if ((p = strchr(url, ':'))) {
3574 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3579 /* no protocol means plain filename */
3580 av_strlcpy(path, url, path_size);
3584 /* separate path from hostname */
3585 ls = strchr(p, '/');
3587 ls = strchr(p, '?');
3589 av_strlcpy(path, ls, path_size);
3591 ls = &p[strlen(p)]; // XXX
3593 /* the rest is hostname, use that to parse auth/port */
3595 /* authorization (user[:pass]@hostname) */
3596 if ((at = strchr(p, '@')) && at < ls) {
3597 av_strlcpy(authorization, p,
3598 FFMIN(authorization_size, at + 1 - p));
3599 p = at + 1; /* skip '@' */
3602 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3604 av_strlcpy(hostname, p + 1,
3605 FFMIN(hostname_size, brk - p));
3606 if (brk[1] == ':' && port_ptr)
3607 *port_ptr = atoi(brk + 2);
3608 } else if ((col = strchr(p, ':')) && col < ls) {
3609 av_strlcpy(hostname, p,
3610 FFMIN(col + 1 - p, hostname_size));
3611 if (port_ptr) *port_ptr = atoi(col + 1);
3613 av_strlcpy(hostname, p,
3614 FFMIN(ls + 1 - p, hostname_size));
3618 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3621 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3624 'C', 'D', 'E', 'F' };
3625 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3628 'c', 'd', 'e', 'f' };
3629 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3631 for(i = 0; i < s; i++) {
3632 buff[i * 2] = hex_table[src[i] >> 4];
3633 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3639 int ff_hex_to_data(uint8_t *data, const char *p)
3646 p += strspn(p, SPACE_CHARS);
3649 c = toupper((unsigned char) *p++);
3650 if (c >= '0' && c <= '9')
3652 else if (c >= 'A' && c <= 'F')
3667 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3668 unsigned int pts_num, unsigned int pts_den)
3671 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3672 if(new_tb.num != pts_num)
3673 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3675 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3677 if(new_tb.num <= 0 || new_tb.den <= 0) {
3678 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3681 s->time_base = new_tb;
3682 s->pts_wrap_bits = pts_wrap_bits;
3685 int ff_url_join(char *str, int size, const char *proto,
3686 const char *authorization, const char *hostname,
3687 int port, const char *fmt, ...)
3690 struct addrinfo hints, *ai;
3695 av_strlcatf(str, size, "%s://", proto);
3696 if (authorization && authorization[0])
3697 av_strlcatf(str, size, "%s@", authorization);
3698 #if CONFIG_NETWORK && defined(AF_INET6)
3699 /* Determine if hostname is a numerical IPv6 address,
3700 * properly escape it within [] in that case. */
3701 memset(&hints, 0, sizeof(hints));
3702 hints.ai_flags = AI_NUMERICHOST;
3703 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3704 if (ai->ai_family == AF_INET6) {
3705 av_strlcat(str, "[", size);
3706 av_strlcat(str, hostname, size);
3707 av_strlcat(str, "]", size);
3709 av_strlcat(str, hostname, size);
3714 /* Not an IPv6 address, just output the plain string. */
3715 av_strlcat(str, hostname, size);
3718 av_strlcatf(str, size, ":%d", port);
3721 int len = strlen(str);
3724 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3730 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3731 AVFormatContext *src)
3736 local_pkt.stream_index = dst_stream;
3737 if (pkt->pts != AV_NOPTS_VALUE)
3738 local_pkt.pts = av_rescale_q(pkt->pts,
3739 src->streams[pkt->stream_index]->time_base,
3740 dst->streams[dst_stream]->time_base);
3741 if (pkt->dts != AV_NOPTS_VALUE)
3742 local_pkt.dts = av_rescale_q(pkt->dts,
3743 src->streams[pkt->stream_index]->time_base,
3744 dst->streams[dst_stream]->time_base);
3745 return av_write_frame(dst, &local_pkt);
3748 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3751 const char *ptr = str;
3753 /* Parse key=value pairs. */
3756 char *dest = NULL, *dest_end;
3757 int key_len, dest_len = 0;
3759 /* Skip whitespace and potential commas. */
3760 while (*ptr && (isspace(*ptr) || *ptr == ','))
3767 if (!(ptr = strchr(key, '=')))
3770 key_len = ptr - key;
3772 callback_get_buf(context, key, key_len, &dest, &dest_len);
3773 dest_end = dest + dest_len - 1;
3777 while (*ptr && *ptr != '\"') {
3781 if (dest && dest < dest_end)
3785 if (dest && dest < dest_end)
3793 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3794 if (dest && dest < dest_end)
3802 int ff_find_stream_index(AVFormatContext *s, int id)
3805 for (i = 0; i < s->nb_streams; i++) {
3806 if (s->streams[i]->id == id)