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 FFMPEG_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 > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !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;
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 int real_stream_index = program ? program[i] : i;
2515 AVStream *st = ic->streams[real_stream_index];
2516 AVCodecContext *avctx = st->codec;
2517 if (avctx->codec_type != type)
2519 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2521 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2524 decoder = avcodec_find_decoder(st->codec->codec_id);
2527 ret = AVERROR_DECODER_NOT_FOUND;
2531 if (best_count >= st->codec_info_nb_frames)
2533 best_count = st->codec_info_nb_frames;
2534 ret = real_stream_index;
2535 best_decoder = decoder;
2536 if (program && i == nb_streams - 1 && ret < 0) {
2538 nb_streams = ic->nb_streams;
2539 i = 0; /* no related stream found, try again with everything */
2543 *decoder_ret = best_decoder;
2547 /*******************************************************/
2549 int av_read_play(AVFormatContext *s)
2551 if (s->iformat->read_play)
2552 return s->iformat->read_play(s);
2554 return av_url_read_fpause(s->pb, 0);
2555 return AVERROR(ENOSYS);
2558 int av_read_pause(AVFormatContext *s)
2560 if (s->iformat->read_pause)
2561 return s->iformat->read_pause(s);
2563 return av_url_read_fpause(s->pb, 1);
2564 return AVERROR(ENOSYS);
2567 void av_close_input_stream(AVFormatContext *s)
2569 flush_packet_queue(s);
2570 if (s->iformat->read_close)
2571 s->iformat->read_close(s);
2572 avformat_free_context(s);
2575 void avformat_free_context(AVFormatContext *s)
2580 for(i=0;i<s->nb_streams;i++) {
2581 /* free all data in a stream component */
2584 av_parser_close(st->parser);
2585 av_free_packet(&st->cur_pkt);
2587 av_metadata_free(&st->metadata);
2588 av_free(st->index_entries);
2589 av_free(st->codec->extradata);
2590 av_free(st->codec->subtitle_header);
2592 #if FF_API_OLD_METADATA
2593 av_free(st->filename);
2595 av_free(st->priv_data);
2599 for(i=s->nb_programs-1; i>=0; i--) {
2600 #if FF_API_OLD_METADATA
2601 av_freep(&s->programs[i]->provider_name);
2602 av_freep(&s->programs[i]->name);
2604 av_metadata_free(&s->programs[i]->metadata);
2605 av_freep(&s->programs[i]->stream_index);
2606 av_freep(&s->programs[i]);
2608 av_freep(&s->programs);
2609 av_freep(&s->priv_data);
2610 while(s->nb_chapters--) {
2611 #if FF_API_OLD_METADATA
2612 av_free(s->chapters[s->nb_chapters]->title);
2614 av_metadata_free(&s->chapters[s->nb_chapters]->metadata);
2615 av_free(s->chapters[s->nb_chapters]);
2617 av_freep(&s->chapters);
2618 av_metadata_free(&s->metadata);
2623 void av_close_input_file(AVFormatContext *s)
2625 AVIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2626 av_close_input_stream(s);
2631 AVStream *av_new_stream(AVFormatContext *s, int id)
2636 #if FF_API_MAX_STREAMS
2637 if (s->nb_streams >= MAX_STREAMS){
2638 av_log(s, AV_LOG_ERROR, "Too many streams\n");
2644 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2646 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2649 s->streams = streams;
2652 st = av_mallocz(sizeof(AVStream));
2655 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2660 st->codec= avcodec_alloc_context();
2662 /* no default bitrate if decoding */
2663 st->codec->bit_rate = 0;
2665 st->index = s->nb_streams;
2667 st->start_time = AV_NOPTS_VALUE;
2668 st->duration = AV_NOPTS_VALUE;
2669 /* we set the current DTS to 0 so that formats without any timestamps
2670 but durations get some timestamps, formats with some unknown
2671 timestamps have their first few packets buffered and the
2672 timestamps corrected before they are returned to the user */
2674 st->first_dts = AV_NOPTS_VALUE;
2675 st->probe_packets = MAX_PROBE_PACKETS;
2677 /* default pts setting is MPEG-like */
2678 av_set_pts_info(st, 33, 1, 90000);
2679 st->last_IP_pts = AV_NOPTS_VALUE;
2680 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2681 st->pts_buffer[i]= AV_NOPTS_VALUE;
2682 st->reference_dts = AV_NOPTS_VALUE;
2684 st->sample_aspect_ratio = (AVRational){0,1};
2686 s->streams[s->nb_streams++] = st;
2690 AVProgram *av_new_program(AVFormatContext *ac, int id)
2692 AVProgram *program=NULL;
2696 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2699 for(i=0; i<ac->nb_programs; i++)
2700 if(ac->programs[i]->id == id)
2701 program = ac->programs[i];
2704 program = av_mallocz(sizeof(AVProgram));
2707 dynarray_add(&ac->programs, &ac->nb_programs, program);
2708 program->discard = AVDISCARD_NONE;
2715 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2717 AVChapter *chapter = NULL;
2720 for(i=0; i<s->nb_chapters; i++)
2721 if(s->chapters[i]->id == id)
2722 chapter = s->chapters[i];
2725 chapter= av_mallocz(sizeof(AVChapter));
2728 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2730 #if FF_API_OLD_METADATA
2731 av_free(chapter->title);
2733 av_metadata_set2(&chapter->metadata, "title", title, 0);
2735 chapter->time_base= time_base;
2736 chapter->start = start;
2742 /************************************************************/
2743 /* output media file */
2745 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2749 if (s->oformat->priv_data_size > 0) {
2750 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2752 return AVERROR(ENOMEM);
2753 if (s->oformat->priv_class) {
2754 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2755 av_opt_set_defaults(s->priv_data);
2758 s->priv_data = NULL;
2760 if (s->oformat->set_parameters) {
2761 ret = s->oformat->set_parameters(s, ap);
2768 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2770 const AVCodecTag *avctag;
2772 enum CodecID id = CODEC_ID_NONE;
2773 unsigned int tag = 0;
2776 * Check that tag + id is in the table
2777 * If neither is in the table -> OK
2778 * If tag is in the table with another id -> FAIL
2779 * If id is in the table with another tag -> FAIL unless strict < normal
2781 for (n = 0; s->oformat->codec_tag[n]; n++) {
2782 avctag = s->oformat->codec_tag[n];
2783 while (avctag->id != CODEC_ID_NONE) {
2784 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2786 if (id == st->codec->codec_id)
2789 if (avctag->id == st->codec->codec_id)
2794 if (id != CODEC_ID_NONE)
2796 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2801 int av_write_header(AVFormatContext *s)
2806 // some sanity checks
2807 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2808 av_log(s, AV_LOG_ERROR, "no streams\n");
2809 return AVERROR(EINVAL);
2812 for(i=0;i<s->nb_streams;i++) {
2815 switch (st->codec->codec_type) {
2816 case AVMEDIA_TYPE_AUDIO:
2817 if(st->codec->sample_rate<=0){
2818 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2819 return AVERROR(EINVAL);
2821 if(!st->codec->block_align)
2822 st->codec->block_align = st->codec->channels *
2823 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2825 case AVMEDIA_TYPE_VIDEO:
2826 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2827 av_log(s, AV_LOG_ERROR, "time base not set\n");
2828 return AVERROR(EINVAL);
2830 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2831 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2832 return AVERROR(EINVAL);
2834 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2835 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2836 return AVERROR(EINVAL);
2841 if(s->oformat->codec_tag){
2842 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)){
2843 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2844 st->codec->codec_tag= 0;
2846 if(st->codec->codec_tag){
2847 if (!validate_codec_tag(s, st)) {
2849 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2850 av_log(s, AV_LOG_ERROR,
2851 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
2852 tagbuf, st->codec->codec_tag, st->codec->codec_id);
2853 return AVERROR_INVALIDDATA;
2856 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2859 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2860 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2861 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2864 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2865 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2867 return AVERROR(ENOMEM);
2870 #if FF_API_OLD_METADATA
2871 ff_metadata_mux_compat(s);
2874 /* set muxer identification string */
2875 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2876 av_metadata_set2(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
2879 if(s->oformat->write_header){
2880 ret = s->oformat->write_header(s);
2885 /* init PTS generation */
2886 for(i=0;i<s->nb_streams;i++) {
2887 int64_t den = AV_NOPTS_VALUE;
2890 switch (st->codec->codec_type) {
2891 case AVMEDIA_TYPE_AUDIO:
2892 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2894 case AVMEDIA_TYPE_VIDEO:
2895 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2900 if (den != AV_NOPTS_VALUE) {
2902 return AVERROR_INVALIDDATA;
2903 av_frac_init(&st->pts, 0, 0, den);
2909 //FIXME merge with compute_pkt_fields
2910 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
2911 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2912 int num, den, frame_size, i;
2914 // 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);
2916 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2919 /* duration field */
2920 if (pkt->duration == 0) {
2921 compute_frame_duration(&num, &den, st, NULL, pkt);
2923 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2927 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2930 //XXX/FIXME this is a temporary hack until all encoders output pts
2931 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2933 // pkt->pts= st->cur_dts;
2934 pkt->pts= st->pts.val;
2937 //calculate dts from pts
2938 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2939 st->pts_buffer[0]= pkt->pts;
2940 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2941 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
2942 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2943 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2945 pkt->dts= st->pts_buffer[0];
2948 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2949 av_log(s, AV_LOG_ERROR,
2950 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
2951 st->index, st->cur_dts, pkt->dts);
2954 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2955 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
2959 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2960 st->cur_dts= pkt->dts;
2961 st->pts.val= pkt->dts;
2964 switch (st->codec->codec_type) {
2965 case AVMEDIA_TYPE_AUDIO:
2966 frame_size = get_audio_frame_size(st->codec, pkt->size);
2968 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2969 likely equal to the encoder delay, but it would be better if we
2970 had the real timestamps from the encoder */
2971 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2972 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2975 case AVMEDIA_TYPE_VIDEO:
2976 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2984 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2986 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
2988 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2991 ret= s->oformat->write_packet(s, pkt);
2993 ret= url_ferror(s->pb);
2997 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
2998 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3000 AVPacketList **next_point, *this_pktl;
3002 this_pktl = av_mallocz(sizeof(AVPacketList));
3003 this_pktl->pkt= *pkt;
3004 pkt->destruct= NULL; // do not free original but only the copy
3005 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3007 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3008 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3010 next_point = &s->packet_buffer;
3013 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3014 while(!compare(s, &(*next_point)->pkt, pkt)){
3015 next_point= &(*next_point)->next;
3019 next_point = &(s->packet_buffer_end->next);
3022 assert(!*next_point);
3024 s->packet_buffer_end= this_pktl;
3027 this_pktl->next= *next_point;
3029 s->streams[pkt->stream_index]->last_in_packet_buffer=
3030 *next_point= this_pktl;
3033 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3035 AVStream *st = s->streams[ pkt ->stream_index];
3036 AVStream *st2= s->streams[ next->stream_index];
3037 int64_t a= st2->time_base.num * (int64_t)st ->time_base.den;
3038 int64_t b= st ->time_base.num * (int64_t)st2->time_base.den;
3039 return av_rescale_rnd(pkt->dts, b, a, AV_ROUND_DOWN) < next->dts;
3042 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3048 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3051 for(i=0; i < s->nb_streams; i++)
3052 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3054 if(stream_count && (s->nb_streams == stream_count || flush)){
3055 pktl= s->packet_buffer;
3058 s->packet_buffer= pktl->next;
3059 if(!s->packet_buffer)
3060 s->packet_buffer_end= NULL;
3062 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3063 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3067 av_init_packet(out);
3073 * Interleave an AVPacket correctly so it can be muxed.
3074 * @param out the interleaved packet will be output here
3075 * @param in the input packet
3076 * @param flush 1 if no further packets are available as input and all
3077 * remaining packets should be output
3078 * @return 1 if a packet was output, 0 if no packet could be output,
3079 * < 0 if an error occurred
3081 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3082 if(s->oformat->interleave_packet)
3083 return s->oformat->interleave_packet(s, out, in, flush);
3085 return av_interleave_packet_per_dts(s, out, in, flush);
3088 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3089 AVStream *st= s->streams[ pkt->stream_index];
3091 //FIXME/XXX/HACK drop zero sized packets
3092 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3095 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
3096 if(compute_pkt_fields2(s, st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3099 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3104 int ret= av_interleave_packet(s, &opkt, pkt, 0);
3105 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3108 ret= s->oformat->write_packet(s, &opkt);
3110 av_free_packet(&opkt);
3115 if(url_ferror(s->pb))
3116 return url_ferror(s->pb);
3120 int av_write_trailer(AVFormatContext *s)
3126 ret= av_interleave_packet(s, &pkt, NULL, 1);
3127 if(ret<0) //FIXME cleanup needed for ret<0 ?
3132 ret= s->oformat->write_packet(s, &pkt);
3134 av_free_packet(&pkt);
3138 if(url_ferror(s->pb))
3142 if(s->oformat->write_trailer)
3143 ret = s->oformat->write_trailer(s);
3146 ret=url_ferror(s->pb);
3147 for(i=0;i<s->nb_streams;i++) {
3148 av_freep(&s->streams[i]->priv_data);
3149 av_freep(&s->streams[i]->index_entries);
3151 av_freep(&s->priv_data);
3155 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3158 AVProgram *program=NULL;
3161 if (idx >= ac->nb_streams) {
3162 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3166 for(i=0; i<ac->nb_programs; i++){
3167 if(ac->programs[i]->id != progid)
3169 program = ac->programs[i];
3170 for(j=0; j<program->nb_stream_indexes; j++)
3171 if(program->stream_index[j] == idx)
3174 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3177 program->stream_index = tmp;
3178 program->stream_index[program->nb_stream_indexes++] = idx;
3183 static void print_fps(double d, const char *postfix){
3184 uint64_t v= lrintf(d*100);
3185 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3186 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3187 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3190 static void dump_metadata(void *ctx, AVMetadata *m, const char *indent)
3192 if(m && !(m->count == 1 && av_metadata_get(m, "language", NULL, 0))){
3193 AVMetadataTag *tag=NULL;
3195 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3196 while((tag=av_metadata_get(m, "", tag, AV_METADATA_IGNORE_SUFFIX))) {
3197 if(strcmp("language", tag->key))
3198 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
3203 /* "user interface" functions */
3204 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3207 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3208 AVStream *st = ic->streams[i];
3209 int g = av_gcd(st->time_base.num, st->time_base.den);
3210 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0);
3211 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3212 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3213 /* the pid is an important information, so we display it */
3214 /* XXX: add a generic system */
3215 if (flags & AVFMT_SHOW_IDS)
3216 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3218 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3219 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3220 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3221 if (st->sample_aspect_ratio.num && // default
3222 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3223 AVRational display_aspect_ratio;
3224 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3225 st->codec->width*st->sample_aspect_ratio.num,
3226 st->codec->height*st->sample_aspect_ratio.den,
3228 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3229 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3230 display_aspect_ratio.num, display_aspect_ratio.den);
3232 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3233 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3234 print_fps(av_q2d(st->avg_frame_rate), "fps");
3235 if(st->r_frame_rate.den && st->r_frame_rate.num)
3236 print_fps(av_q2d(st->r_frame_rate), "tbr");
3237 if(st->time_base.den && st->time_base.num)
3238 print_fps(1/av_q2d(st->time_base), "tbn");
3239 if(st->codec->time_base.den && st->codec->time_base.num)
3240 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3242 if (st->disposition & AV_DISPOSITION_DEFAULT)
3243 av_log(NULL, AV_LOG_INFO, " (default)");
3244 if (st->disposition & AV_DISPOSITION_DUB)
3245 av_log(NULL, AV_LOG_INFO, " (dub)");
3246 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3247 av_log(NULL, AV_LOG_INFO, " (original)");
3248 if (st->disposition & AV_DISPOSITION_COMMENT)
3249 av_log(NULL, AV_LOG_INFO, " (comment)");
3250 if (st->disposition & AV_DISPOSITION_LYRICS)
3251 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3252 if (st->disposition & AV_DISPOSITION_KARAOKE)
3253 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3254 if (st->disposition & AV_DISPOSITION_FORCED)
3255 av_log(NULL, AV_LOG_INFO, " (forced)");
3256 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3257 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3258 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3259 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3260 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3261 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3262 av_log(NULL, AV_LOG_INFO, "\n");
3263 dump_metadata(NULL, st->metadata, " ");
3266 #if FF_API_DUMP_FORMAT
3267 void dump_format(AVFormatContext *ic,
3272 av_dump_format(ic, index, url, is_output);
3276 void av_dump_format(AVFormatContext *ic,
3282 uint8_t *printed = av_mallocz(ic->nb_streams);
3283 if (ic->nb_streams && !printed)
3286 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3287 is_output ? "Output" : "Input",
3289 is_output ? ic->oformat->name : ic->iformat->name,
3290 is_output ? "to" : "from", url);
3291 dump_metadata(NULL, ic->metadata, " ");
3293 av_log(NULL, AV_LOG_INFO, " Duration: ");
3294 if (ic->duration != AV_NOPTS_VALUE) {
3295 int hours, mins, secs, us;
3296 secs = ic->duration / AV_TIME_BASE;
3297 us = ic->duration % AV_TIME_BASE;
3302 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3303 (100 * us) / AV_TIME_BASE);
3305 av_log(NULL, AV_LOG_INFO, "N/A");
3307 if (ic->start_time != AV_NOPTS_VALUE) {
3309 av_log(NULL, AV_LOG_INFO, ", start: ");
3310 secs = ic->start_time / AV_TIME_BASE;
3311 us = abs(ic->start_time % AV_TIME_BASE);
3312 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3313 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3315 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3317 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3319 av_log(NULL, AV_LOG_INFO, "N/A");
3321 av_log(NULL, AV_LOG_INFO, "\n");
3323 for (i = 0; i < ic->nb_chapters; i++) {
3324 AVChapter *ch = ic->chapters[i];
3325 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3326 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3327 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3329 dump_metadata(NULL, ch->metadata, " ");
3331 if(ic->nb_programs) {
3332 int j, k, total = 0;
3333 for(j=0; j<ic->nb_programs; j++) {
3334 AVMetadataTag *name = av_metadata_get(ic->programs[j]->metadata,
3336 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3337 name ? name->value : "");
3338 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3339 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3340 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3341 printed[ic->programs[j]->stream_index[k]] = 1;
3343 total += ic->programs[j]->nb_stream_indexes;
3345 if (total < ic->nb_streams)
3346 av_log(NULL, AV_LOG_INFO, " No Program\n");
3348 for(i=0;i<ic->nb_streams;i++)
3350 dump_stream_format(ic, i, index, is_output);
3355 #if FF_API_PARSE_FRAME_PARAM
3356 #include "libavutil/parseutils.h"
3358 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
3360 return av_parse_video_size(width_ptr, height_ptr, str);
3363 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
3365 AVRational frame_rate;
3366 int ret = av_parse_video_rate(&frame_rate, arg);
3367 *frame_rate_num= frame_rate.num;
3368 *frame_rate_den= frame_rate.den;
3373 int64_t av_gettime(void)
3376 gettimeofday(&tv,NULL);
3377 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3380 uint64_t ff_ntp_time(void)
3382 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3385 #if FF_API_PARSE_DATE
3386 #include "libavutil/parseutils.h"
3388 int64_t parse_date(const char *timestr, int duration)
3391 av_parse_time(&timeval, timestr, duration);
3396 #if FF_API_FIND_INFO_TAG
3397 #include "libavutil/parseutils.h"
3399 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3401 return av_find_info_tag(arg, arg_size, tag1, info);
3405 int av_get_frame_filename(char *buf, int buf_size,
3406 const char *path, int number)
3409 char *q, buf1[20], c;
3410 int nd, len, percentd_found;
3422 while (isdigit(*p)) {
3423 nd = nd * 10 + *p++ - '0';
3426 } while (isdigit(c));
3435 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3437 if ((q - buf + len) > buf_size - 1)
3439 memcpy(q, buf1, len);
3447 if ((q - buf) < buf_size - 1)
3451 if (!percentd_found)
3460 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3464 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3466 for(i=0;i<size;i+=16) {
3473 PRINT(" %02x", buf[i+j]);
3478 for(j=0;j<len;j++) {
3480 if (c < ' ' || c > '~')
3489 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3491 hex_dump_internal(NULL, f, 0, buf, size);
3494 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3496 hex_dump_internal(avcl, NULL, level, buf, size);
3499 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3502 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3503 PRINT("stream #%d:\n", pkt->stream_index);
3504 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3505 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3506 /* DTS is _always_ valid after av_read_frame() */
3508 if (pkt->dts == AV_NOPTS_VALUE)
3511 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3512 /* PTS may not be known if B-frames are present. */
3514 if (pkt->pts == AV_NOPTS_VALUE)
3517 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3519 PRINT(" size=%d\n", pkt->size);
3522 av_hex_dump(f, pkt->data, pkt->size);
3525 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3527 AVRational tb = { 1, AV_TIME_BASE };
3528 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3531 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3533 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3536 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3538 AVRational tb = { 1, AV_TIME_BASE };
3539 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3542 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3545 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3548 #if FF_API_URL_SPLIT
3549 attribute_deprecated
3550 void ff_url_split(char *proto, int proto_size,
3551 char *authorization, int authorization_size,
3552 char *hostname, int hostname_size,
3554 char *path, int path_size,
3557 av_url_split(proto, proto_size,
3558 authorization, authorization_size,
3559 hostname, hostname_size,
3566 void av_url_split(char *proto, int proto_size,
3567 char *authorization, int authorization_size,
3568 char *hostname, int hostname_size,
3570 char *path, int path_size,
3573 const char *p, *ls, *at, *col, *brk;
3575 if (port_ptr) *port_ptr = -1;
3576 if (proto_size > 0) proto[0] = 0;
3577 if (authorization_size > 0) authorization[0] = 0;
3578 if (hostname_size > 0) hostname[0] = 0;
3579 if (path_size > 0) path[0] = 0;
3581 /* parse protocol */
3582 if ((p = strchr(url, ':'))) {
3583 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3588 /* no protocol means plain filename */
3589 av_strlcpy(path, url, path_size);
3593 /* separate path from hostname */
3594 ls = strchr(p, '/');
3596 ls = strchr(p, '?');
3598 av_strlcpy(path, ls, path_size);
3600 ls = &p[strlen(p)]; // XXX
3602 /* the rest is hostname, use that to parse auth/port */
3604 /* authorization (user[:pass]@hostname) */
3605 if ((at = strchr(p, '@')) && at < ls) {
3606 av_strlcpy(authorization, p,
3607 FFMIN(authorization_size, at + 1 - p));
3608 p = at + 1; /* skip '@' */
3611 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3613 av_strlcpy(hostname, p + 1,
3614 FFMIN(hostname_size, brk - p));
3615 if (brk[1] == ':' && port_ptr)
3616 *port_ptr = atoi(brk + 2);
3617 } else if ((col = strchr(p, ':')) && col < ls) {
3618 av_strlcpy(hostname, p,
3619 FFMIN(col + 1 - p, hostname_size));
3620 if (port_ptr) *port_ptr = atoi(col + 1);
3622 av_strlcpy(hostname, p,
3623 FFMIN(ls + 1 - p, hostname_size));
3627 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3630 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3633 'C', 'D', 'E', 'F' };
3634 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3637 'c', 'd', 'e', 'f' };
3638 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3640 for(i = 0; i < s; i++) {
3641 buff[i * 2] = hex_table[src[i] >> 4];
3642 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3648 int ff_hex_to_data(uint8_t *data, const char *p)
3655 p += strspn(p, SPACE_CHARS);
3658 c = toupper((unsigned char) *p++);
3659 if (c >= '0' && c <= '9')
3661 else if (c >= 'A' && c <= 'F')
3676 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3677 unsigned int pts_num, unsigned int pts_den)
3680 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3681 if(new_tb.num != pts_num)
3682 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3684 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3686 if(new_tb.num <= 0 || new_tb.den <= 0) {
3687 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3690 s->time_base = new_tb;
3691 s->pts_wrap_bits = pts_wrap_bits;
3694 int ff_url_join(char *str, int size, const char *proto,
3695 const char *authorization, const char *hostname,
3696 int port, const char *fmt, ...)
3699 struct addrinfo hints, *ai;
3704 av_strlcatf(str, size, "%s://", proto);
3705 if (authorization && authorization[0])
3706 av_strlcatf(str, size, "%s@", authorization);
3707 #if CONFIG_NETWORK && defined(AF_INET6)
3708 /* Determine if hostname is a numerical IPv6 address,
3709 * properly escape it within [] in that case. */
3710 memset(&hints, 0, sizeof(hints));
3711 hints.ai_flags = AI_NUMERICHOST;
3712 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3713 if (ai->ai_family == AF_INET6) {
3714 av_strlcat(str, "[", size);
3715 av_strlcat(str, hostname, size);
3716 av_strlcat(str, "]", size);
3718 av_strlcat(str, hostname, size);
3723 /* Not an IPv6 address, just output the plain string. */
3724 av_strlcat(str, hostname, size);
3727 av_strlcatf(str, size, ":%d", port);
3730 int len = strlen(str);
3733 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3739 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3740 AVFormatContext *src)
3745 local_pkt.stream_index = dst_stream;
3746 if (pkt->pts != AV_NOPTS_VALUE)
3747 local_pkt.pts = av_rescale_q(pkt->pts,
3748 src->streams[pkt->stream_index]->time_base,
3749 dst->streams[dst_stream]->time_base);
3750 if (pkt->dts != AV_NOPTS_VALUE)
3751 local_pkt.dts = av_rescale_q(pkt->dts,
3752 src->streams[pkt->stream_index]->time_base,
3753 dst->streams[dst_stream]->time_base);
3754 return av_write_frame(dst, &local_pkt);
3757 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3760 const char *ptr = str;
3762 /* Parse key=value pairs. */
3765 char *dest = NULL, *dest_end;
3766 int key_len, dest_len = 0;
3768 /* Skip whitespace and potential commas. */
3769 while (*ptr && (isspace(*ptr) || *ptr == ','))
3776 if (!(ptr = strchr(key, '=')))
3779 key_len = ptr - key;
3781 callback_get_buf(context, key, key_len, &dest, &dest_len);
3782 dest_end = dest + dest_len - 1;
3786 while (*ptr && *ptr != '\"') {
3790 if (dest && dest < dest_end)
3794 if (dest && dest < dest_end)
3802 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3803 if (dest && dest < dest_end)
3811 int ff_find_stream_index(AVFormatContext *s, int id)
3814 for (i = 0; i < s->nb_streams; i++) {
3815 if (s->streams[i]->id == id)