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
24 #include "libavcodec/opt.h"
26 #include "libavutil/avstring.h"
28 #include "audiointerleave.h"
40 #ifndef GST_EXT_FFMUX_ENHANCEMENT
41 #define GST_EXT_FFMUX_ENHANCEMENT
46 * various utility functions for use within FFmpeg
49 unsigned avformat_version(void)
51 return LIBAVFORMAT_VERSION_INT;
54 const char *avformat_configuration(void)
56 return FFMPEG_CONFIGURATION;
59 const char *avformat_license(void)
61 #define LICENSE_PREFIX "libavformat license: "
62 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
65 /* fraction handling */
68 * f = val + (num / den) + 0.5.
70 * 'num' is normalized so that it is such as 0 <= num < den.
72 * @param f fractional number
73 * @param val integer value
74 * @param num must be >= 0
75 * @param den must be >= 1
77 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
90 * Fractional addition to f: f = f + (incr / f->den).
92 * @param f fractional number
93 * @param incr increment, can be positive or negative
95 static void av_frac_add(AVFrac *f, int64_t incr)
108 } else if (num >= den) {
115 /** head of registered input format linked list */
116 AVInputFormat *first_iformat = NULL;
117 /** head of registered output format linked list */
118 AVOutputFormat *first_oformat = NULL;
120 AVInputFormat *av_iformat_next(AVInputFormat *f)
122 if(f) return f->next;
123 else return first_iformat;
126 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
128 if(f) return f->next;
129 else return first_oformat;
132 void av_register_input_format(AVInputFormat *format)
136 while (*p != NULL) p = &(*p)->next;
141 void av_register_output_format(AVOutputFormat *format)
145 while (*p != NULL) p = &(*p)->next;
150 int av_match_ext(const char *filename, const char *extensions)
158 ext = strrchr(filename, '.');
164 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
167 if (!strcasecmp(ext1, ext))
177 static int match_format(const char *name, const char *names)
185 namelen = strlen(name);
186 while ((p = strchr(names, ','))) {
187 len = FFMAX(p - names, namelen);
188 if (!strncasecmp(name, names, len))
192 return !strcasecmp(name, names);
195 #if LIBAVFORMAT_VERSION_MAJOR < 53
196 AVOutputFormat *guess_format(const char *short_name, const char *filename,
197 const char *mime_type)
199 return av_guess_format(short_name, filename, mime_type);
203 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
204 const char *mime_type)
206 AVOutputFormat *fmt, *fmt_found;
207 int score_max, score;
209 /* specific test for image sequences */
210 #if CONFIG_IMAGE2_MUXER
211 if (!short_name && filename &&
212 av_filename_number_test(filename) &&
213 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
214 return av_guess_format("image2", NULL, NULL);
217 /* Find the proper file type. */
221 while (fmt != NULL) {
223 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
225 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
227 if (filename && fmt->extensions &&
228 av_match_ext(filename, fmt->extensions)) {
231 if (score > score_max) {
240 #if LIBAVFORMAT_VERSION_MAJOR < 53
241 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
242 const char *mime_type)
244 AVOutputFormat *fmt = av_guess_format(short_name, filename, mime_type);
247 AVOutputFormat *stream_fmt;
248 char stream_format_name[64];
250 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
251 stream_fmt = av_guess_format(stream_format_name, NULL, NULL);
261 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
262 const char *filename, const char *mime_type, enum AVMediaType type){
263 if(type == AVMEDIA_TYPE_VIDEO){
264 enum CodecID codec_id= CODEC_ID_NONE;
266 #if CONFIG_IMAGE2_MUXER
267 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
268 codec_id= av_guess_image2_codec(filename);
271 if(codec_id == CODEC_ID_NONE)
272 codec_id= fmt->video_codec;
274 }else if(type == AVMEDIA_TYPE_AUDIO)
275 return fmt->audio_codec;
277 return CODEC_ID_NONE;
280 AVInputFormat *av_find_input_format(const char *short_name)
283 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
284 if (match_format(short_name, fmt->name))
290 #if LIBAVFORMAT_VERSION_MAJOR < 53 && CONFIG_SHARED && HAVE_SYMVER
291 FF_SYMVER(void, av_destruct_packet_nofree, (AVPacket *pkt), "LIBAVFORMAT_52")
293 av_destruct_packet_nofree(pkt);
296 FF_SYMVER(void, av_destruct_packet, (AVPacket *pkt), "LIBAVFORMAT_52")
298 av_destruct_packet(pkt);
301 FF_SYMVER(int, av_new_packet, (AVPacket *pkt, int size), "LIBAVFORMAT_52")
303 return av_new_packet(pkt, size);
306 FF_SYMVER(int, av_dup_packet, (AVPacket *pkt), "LIBAVFORMAT_52")
308 return av_dup_packet(pkt);
311 FF_SYMVER(void, av_free_packet, (AVPacket *pkt), "LIBAVFORMAT_52")
316 FF_SYMVER(void, av_init_packet, (AVPacket *pkt), "LIBAVFORMAT_52")
318 av_log(NULL, AV_LOG_WARNING, "Diverting av_*_packet function calls to libavcodec. Recompile to improve performance\n");
323 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
325 int ret= av_new_packet(pkt, size);
330 pkt->pos= url_ftell(s);
332 ret= get_buffer(s, pkt->data, size);
336 av_shrink_packet(pkt, ret);
342 int av_filename_number_test(const char *filename)
345 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
348 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
350 AVInputFormat *fmt1, *fmt;
354 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
355 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
358 if (fmt1->read_probe) {
359 score = fmt1->read_probe(pd);
360 } else if (fmt1->extensions) {
361 if (av_match_ext(pd->filename, fmt1->extensions)) {
365 if (score > *score_max) {
368 }else if (score == *score_max)
374 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
376 return av_probe_input_format2(pd, is_opened, &score);
379 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
382 fmt = av_probe_input_format2(pd, 1, &score);
385 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
386 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
387 if (!strcmp(fmt->name, "mp3")) {
388 st->codec->codec_id = CODEC_ID_MP3;
389 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
390 } else if (!strcmp(fmt->name, "ac3")) {
391 st->codec->codec_id = CODEC_ID_AC3;
392 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
393 } else if (!strcmp(fmt->name, "eac3")) {
394 st->codec->codec_id = CODEC_ID_EAC3;
395 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
396 } else if (!strcmp(fmt->name, "mpegvideo")) {
397 st->codec->codec_id = CODEC_ID_MPEG2VIDEO;
398 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
399 } else if (!strcmp(fmt->name, "m4v")) {
400 st->codec->codec_id = CODEC_ID_MPEG4;
401 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
402 } else if (!strcmp(fmt->name, "h264")) {
403 st->codec->codec_id = CODEC_ID_H264;
404 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
405 } else if (!strcmp(fmt->name, "dts")) {
406 st->codec->codec_id = CODEC_ID_DTS;
407 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
408 } else if (!strcmp(fmt->name, "aac")) {
409 st->codec->codec_id = CODEC_ID_AAC;
410 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
416 /************************************************************/
417 /* input media file */
420 * Open a media file from an IO stream. 'fmt' must be specified.
422 int av_open_input_stream(AVFormatContext **ic_ptr,
423 ByteIOContext *pb, const char *filename,
424 AVInputFormat *fmt, AVFormatParameters *ap)
428 AVFormatParameters default_ap;
432 memset(ap, 0, sizeof(default_ap));
435 if(!ap->prealloced_context)
436 ic = avformat_alloc_context();
440 err = AVERROR(ENOMEM);
445 ic->duration = AV_NOPTS_VALUE;
446 ic->start_time = AV_NOPTS_VALUE;
447 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
449 /* allocate private data */
450 if (fmt->priv_data_size > 0) {
451 ic->priv_data = av_mallocz(fmt->priv_data_size);
452 if (!ic->priv_data) {
453 err = AVERROR(ENOMEM);
457 ic->priv_data = NULL;
460 if (ic->iformat->read_header) {
461 err = ic->iformat->read_header(ic, ap);
466 if (pb && !ic->data_offset)
467 ic->data_offset = url_ftell(ic->pb);
469 #if LIBAVFORMAT_VERSION_MAJOR < 53
470 ff_metadata_demux_compat(ic);
473 ic->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
480 av_freep(&ic->priv_data);
481 for(i=0;i<ic->nb_streams;i++) {
482 AVStream *st = ic->streams[i];
484 av_free(st->priv_data);
485 av_free(st->codec->extradata);
495 /** size of probe buffer, for guessing file type from file contents */
496 #define PROBE_BUF_MIN 2048
497 #define PROBE_BUF_MAX (1<<20)
499 int ff_probe_input_buffer(ByteIOContext **pb, AVInputFormat **fmt,
500 const char *filename, void *logctx,
501 unsigned int offset, unsigned int max_probe_size)
503 AVProbeData pd = { filename ? filename : "", NULL, -offset };
504 unsigned char *buf = NULL;
505 int ret = 0, probe_size;
507 if (!max_probe_size) {
508 max_probe_size = PROBE_BUF_MAX;
509 } else if (max_probe_size > PROBE_BUF_MAX) {
510 max_probe_size = PROBE_BUF_MAX;
511 } else if (max_probe_size < PROBE_BUF_MIN) {
512 return AVERROR(EINVAL);
515 if (offset >= max_probe_size) {
516 return AVERROR(EINVAL);
519 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt && ret >= 0;
520 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
521 int ret, score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
522 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
524 if (probe_size < offset) {
528 /* read probe data */
529 buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
530 if ((ret = get_buffer(*pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
531 /* fail if error was not end of file, otherwise, lower score */
532 if (ret != AVERROR_EOF) {
537 ret = 0; /* error was end of file, nothing read */
540 pd.buf = &buf[offset];
542 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
544 /* guess file format */
545 *fmt = av_probe_input_format2(&pd, 1, &score);
547 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
548 av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
550 av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
556 return AVERROR_INVALIDDATA;
559 /* rewind. reuse probe buffer to avoid seeking */
560 if ((ret = ff_rewind_with_probe_data(*pb, buf, pd.buf_size)) < 0)
566 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
569 AVFormatParameters *ap)
572 AVProbeData probe_data, *pd = &probe_data;
573 ByteIOContext *pb = NULL;
574 void *logctx= ap && ap->prealloced_context ? *ic_ptr : NULL;
578 pd->filename = filename;
583 /* guess format if no file can be opened */
584 fmt = av_probe_input_format(pd, 0);
587 /* Do not open file if the format does not need it. XXX: specific
588 hack needed to handle RTSP/TCP */
589 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
590 /* if no file needed do not try to open one */
591 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
595 url_setbufsize(pb, buf_size);
597 if (!fmt && (err = ff_probe_input_buffer(&pb, &fmt, filename, logctx, 0, logctx ? (*ic_ptr)->probesize : 0)) < 0) {
602 /* if still no format found, error */
604 err = AVERROR_INVALIDDATA;
608 /* check filename in case an image number is expected */
609 if (fmt->flags & AVFMT_NEEDNUMBER) {
610 if (!av_filename_number_test(filename)) {
611 err = AVERROR_NUMEXPECTED;
615 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
623 if (ap && ap->prealloced_context)
630 /*******************************************************/
632 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
633 AVPacketList **plast_pktl){
634 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
639 (*plast_pktl)->next = pktl;
641 *packet_buffer = pktl;
643 /* add the packet in the buffered packet list */
649 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
655 AVPacketList *pktl = s->raw_packet_buffer;
659 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
660 !s->streams[pkt->stream_index]->probe_packets ||
661 s->raw_packet_buffer_remaining_size < pkt->size){
662 AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
665 s->raw_packet_buffer = pktl->next;
666 s->raw_packet_buffer_remaining_size += pkt->size;
673 ret= s->iformat->read_packet(s, pkt);
675 if (!pktl || ret == AVERROR(EAGAIN))
677 for (i = 0; i < s->nb_streams; i++)
678 s->streams[i]->probe_packets = 0;
681 st= s->streams[pkt->stream_index];
683 switch(st->codec->codec_type){
684 case AVMEDIA_TYPE_VIDEO:
685 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
687 case AVMEDIA_TYPE_AUDIO:
688 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
690 case AVMEDIA_TYPE_SUBTITLE:
691 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
695 if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
699 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
700 s->raw_packet_buffer_remaining_size -= pkt->size;
702 if(st->codec->codec_id == CODEC_ID_PROBE){
703 AVProbeData *pd = &st->probe_data;
704 av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
707 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
708 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
709 pd->buf_size += pkt->size;
710 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
712 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
713 //FIXME we dont reduce score to 0 for the case of running out of buffer space in bytes
714 set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0);
715 if(st->codec->codec_id != CODEC_ID_PROBE){
718 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
725 /**********************************************************/
728 * Get the number of samples of an audio frame. Return -1 on error.
730 static int get_audio_frame_size(AVCodecContext *enc, int size)
734 if(enc->codec_id == CODEC_ID_VORBIS)
737 if (enc->frame_size <= 1) {
738 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
740 if (bits_per_sample) {
741 if (enc->channels == 0)
743 frame_size = (size << 3) / (bits_per_sample * enc->channels);
745 /* used for example by ADPCM codecs */
746 if (enc->bit_rate == 0)
748 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
751 frame_size = enc->frame_size;
758 * Return the frame duration in seconds. Return 0 if not available.
760 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
761 AVCodecParserContext *pc, AVPacket *pkt)
767 switch(st->codec->codec_type) {
768 case AVMEDIA_TYPE_VIDEO:
769 if(st->time_base.num*1000LL > st->time_base.den){
770 *pnum = st->time_base.num;
771 *pden = st->time_base.den;
772 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
773 *pnum = st->codec->time_base.num;
774 *pden = st->codec->time_base.den;
775 if (pc && pc->repeat_pict) {
776 *pnum = (*pnum) * (1 + pc->repeat_pict);
778 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
779 //Thus if we have no parser in such case leave duration undefined.
780 if(st->codec->ticks_per_frame>1 && !pc){
785 case AVMEDIA_TYPE_AUDIO:
786 frame_size = get_audio_frame_size(st->codec, pkt->size);
790 *pden = st->codec->sample_rate;
797 static int is_intra_only(AVCodecContext *enc){
798 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
800 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
801 switch(enc->codec_id){
803 case CODEC_ID_MJPEGB:
805 case CODEC_ID_RAWVIDEO:
806 case CODEC_ID_DVVIDEO:
807 case CODEC_ID_HUFFYUV:
808 case CODEC_ID_FFVHUFF:
813 case CODEC_ID_JPEG2000:
821 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
822 int64_t dts, int64_t pts)
824 AVStream *st= s->streams[stream_index];
825 AVPacketList *pktl= s->packet_buffer;
827 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
830 st->first_dts= dts - st->cur_dts;
833 for(; pktl; pktl= pktl->next){
834 if(pktl->pkt.stream_index != stream_index)
836 //FIXME think more about this check
837 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
838 pktl->pkt.pts += st->first_dts;
840 if(pktl->pkt.dts != AV_NOPTS_VALUE)
841 pktl->pkt.dts += st->first_dts;
843 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
844 st->start_time= pktl->pkt.pts;
846 if (st->start_time == AV_NOPTS_VALUE)
847 st->start_time = pts;
850 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
852 AVPacketList *pktl= s->packet_buffer;
855 if(st->first_dts != AV_NOPTS_VALUE){
856 cur_dts= st->first_dts;
857 for(; pktl; pktl= pktl->next){
858 if(pktl->pkt.stream_index == pkt->stream_index){
859 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
861 cur_dts -= pkt->duration;
864 pktl= s->packet_buffer;
865 st->first_dts = cur_dts;
866 }else if(st->cur_dts)
869 for(; pktl; pktl= pktl->next){
870 if(pktl->pkt.stream_index != pkt->stream_index)
872 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
873 && !pktl->pkt.duration){
874 pktl->pkt.dts= cur_dts;
875 if(!st->codec->has_b_frames)
876 pktl->pkt.pts= cur_dts;
877 cur_dts += pkt->duration;
878 pktl->pkt.duration= pkt->duration;
882 if(st->first_dts == AV_NOPTS_VALUE)
883 st->cur_dts= cur_dts;
886 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
887 AVCodecParserContext *pc, AVPacket *pkt)
889 int num, den, presentation_delayed, delay, i;
892 if (s->flags & AVFMT_FLAG_NOFILLIN)
895 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
896 pkt->dts= AV_NOPTS_VALUE;
898 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == FF_B_TYPE)
899 //FIXME Set low_delay = 0 when has_b_frames = 1
900 st->codec->has_b_frames = 1;
902 /* do we have a video B-frame ? */
903 delay= st->codec->has_b_frames;
904 presentation_delayed = 0;
905 /* XXX: need has_b_frame, but cannot get it if the codec is
908 pc && pc->pict_type != FF_B_TYPE)
909 presentation_delayed = 1;
911 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
912 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
913 pkt->dts -= 1LL<<st->pts_wrap_bits;
916 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
917 // we take the conservative approach and discard both
918 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
919 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
920 av_log(s, AV_LOG_WARNING, "invalid dts/pts combination\n");
921 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
924 if (pkt->duration == 0) {
925 compute_frame_duration(&num, &den, st, pc, pkt);
927 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
929 if(pkt->duration != 0 && s->packet_buffer)
930 update_initial_durations(s, st, pkt);
934 /* correct timestamps with byte offset if demuxers only have timestamps
935 on packet boundaries */
936 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
937 /* this will estimate bitrate based on this frame's duration and size */
938 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
939 if(pkt->pts != AV_NOPTS_VALUE)
941 if(pkt->dts != AV_NOPTS_VALUE)
945 if (pc && pc->dts_sync_point >= 0) {
946 // we have synchronization info from the parser
947 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
949 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
950 if (pkt->dts != AV_NOPTS_VALUE) {
951 // got DTS from the stream, update reference timestamp
952 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
953 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
954 } else if (st->reference_dts != AV_NOPTS_VALUE) {
955 // compute DTS based on reference timestamp
956 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
957 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
959 if (pc->dts_sync_point > 0)
960 st->reference_dts = pkt->dts; // new reference
964 /* This may be redundant, but it should not hurt. */
965 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
966 presentation_delayed = 1;
968 // 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);
969 /* interpolate PTS and DTS if they are not present */
970 //We skip H264 currently because delay and has_b_frames are not reliably set
971 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
972 if (presentation_delayed) {
973 /* DTS = decompression timestamp */
974 /* PTS = presentation timestamp */
975 if (pkt->dts == AV_NOPTS_VALUE)
976 pkt->dts = st->last_IP_pts;
977 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
978 if (pkt->dts == AV_NOPTS_VALUE)
979 pkt->dts = st->cur_dts;
981 /* this is tricky: the dts must be incremented by the duration
982 of the frame we are displaying, i.e. the last I- or P-frame */
983 if (st->last_IP_duration == 0)
984 st->last_IP_duration = pkt->duration;
985 if(pkt->dts != AV_NOPTS_VALUE)
986 st->cur_dts = pkt->dts + st->last_IP_duration;
987 st->last_IP_duration = pkt->duration;
988 st->last_IP_pts= pkt->pts;
989 /* cannot compute PTS if not present (we can compute it only
990 by knowing the future */
991 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
992 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
993 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
994 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
995 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
996 pkt->pts += pkt->duration;
997 // 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);
1001 /* presentation is not delayed : PTS and DTS are the same */
1002 if(pkt->pts == AV_NOPTS_VALUE)
1003 pkt->pts = pkt->dts;
1004 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1005 if(pkt->pts == AV_NOPTS_VALUE)
1006 pkt->pts = st->cur_dts;
1007 pkt->dts = pkt->pts;
1008 if(pkt->pts != AV_NOPTS_VALUE)
1009 st->cur_dts = pkt->pts + pkt->duration;
1013 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1014 st->pts_buffer[0]= pkt->pts;
1015 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1016 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1017 if(pkt->dts == AV_NOPTS_VALUE)
1018 pkt->dts= st->pts_buffer[0];
1019 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1020 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1022 if(pkt->dts > st->cur_dts)
1023 st->cur_dts = pkt->dts;
1026 // 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);
1029 if(is_intra_only(st->codec))
1030 pkt->flags |= AV_PKT_FLAG_KEY;
1033 /* keyframe computation */
1034 if (pc->key_frame == 1)
1035 pkt->flags |= AV_PKT_FLAG_KEY;
1036 else if (pc->key_frame == -1 && pc->pict_type == FF_I_TYPE)
1037 pkt->flags |= AV_PKT_FLAG_KEY;
1040 pkt->convergence_duration = pc->convergence_duration;
1044 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1049 av_init_packet(pkt);
1052 /* select current input stream component */
1055 if (!st->need_parsing || !st->parser) {
1056 /* no parsing needed: we just output the packet as is */
1057 /* raw data support */
1058 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
1059 compute_pkt_fields(s, st, NULL, pkt);
1061 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1062 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1063 ff_reduce_index(s, st->index);
1064 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1067 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1068 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1069 st->cur_ptr, st->cur_len,
1070 st->cur_pkt.pts, st->cur_pkt.dts,
1072 st->cur_pkt.pts = AV_NOPTS_VALUE;
1073 st->cur_pkt.dts = AV_NOPTS_VALUE;
1074 /* increment read pointer */
1078 /* return packet if any */
1082 pkt->stream_index = st->index;
1083 pkt->pts = st->parser->pts;
1084 pkt->dts = st->parser->dts;
1085 pkt->pos = st->parser->pos;
1086 pkt->destruct = NULL;
1087 compute_pkt_fields(s, st, st->parser, pkt);
1089 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1090 ff_reduce_index(s, st->index);
1091 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1092 0, 0, AVINDEX_KEYFRAME);
1099 av_free_packet(&st->cur_pkt);
1104 /* read next packet */
1105 ret = av_read_packet(s, &cur_pkt);
1107 if (ret == AVERROR(EAGAIN))
1109 /* return the last frames, if any */
1110 for(i = 0; i < s->nb_streams; i++) {
1112 if (st->parser && st->need_parsing) {
1113 av_parser_parse2(st->parser, st->codec,
1114 &pkt->data, &pkt->size,
1116 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1122 /* no more packets: really terminate parsing */
1125 st = s->streams[cur_pkt.stream_index];
1126 st->cur_pkt= cur_pkt;
1128 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1129 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1130 st->cur_pkt.pts < st->cur_pkt.dts){
1131 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1132 st->cur_pkt.stream_index,
1136 // av_free_packet(&st->cur_pkt);
1140 if(s->debug & FF_FDEBUG_TS)
1141 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1142 st->cur_pkt.stream_index,
1146 st->cur_pkt.duration,
1150 st->cur_ptr = st->cur_pkt.data;
1151 st->cur_len = st->cur_pkt.size;
1152 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1153 st->parser = av_parser_init(st->codec->codec_id);
1155 /* no parser available: just output the raw packets */
1156 st->need_parsing = AVSTREAM_PARSE_NONE;
1157 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1158 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1160 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
1161 st->parser->next_frame_offset=
1162 st->parser->cur_offset= st->cur_pkt.pos;
1167 if(s->debug & FF_FDEBUG_TS)
1168 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1179 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1183 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1186 pktl = s->packet_buffer;
1188 AVPacket *next_pkt= &pktl->pkt;
1190 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1191 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1192 if( pktl->pkt.stream_index == next_pkt->stream_index
1193 && next_pkt->dts < pktl->pkt.dts
1194 && pktl->pkt.pts != pktl->pkt.dts //not b frame
1195 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1196 next_pkt->pts= pktl->pkt.dts;
1200 pktl = s->packet_buffer;
1203 if( next_pkt->pts != AV_NOPTS_VALUE
1204 || next_pkt->dts == AV_NOPTS_VALUE
1206 /* read packet from packet buffer, if there is data */
1208 s->packet_buffer = pktl->next;
1214 int ret= av_read_frame_internal(s, pkt);
1216 if(pktl && ret != AVERROR(EAGAIN)){
1223 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1224 &s->packet_buffer_end)) < 0)
1225 return AVERROR(ENOMEM);
1227 assert(!s->packet_buffer);
1228 return av_read_frame_internal(s, pkt);
1233 /* XXX: suppress the packet queue */
1234 static void flush_packet_queue(AVFormatContext *s)
1239 pktl = s->packet_buffer;
1242 s->packet_buffer = pktl->next;
1243 av_free_packet(&pktl->pkt);
1246 while(s->raw_packet_buffer){
1247 pktl = s->raw_packet_buffer;
1248 s->raw_packet_buffer = pktl->next;
1249 av_free_packet(&pktl->pkt);
1252 s->packet_buffer_end=
1253 s->raw_packet_buffer_end= NULL;
1254 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1257 /*******************************************************/
1260 int av_find_default_stream_index(AVFormatContext *s)
1262 int first_audio_index = -1;
1266 if (s->nb_streams <= 0)
1268 for(i = 0; i < s->nb_streams; i++) {
1270 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1273 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1274 first_audio_index = i;
1276 return first_audio_index >= 0 ? first_audio_index : 0;
1280 * Flush the frame reader.
1282 void ff_read_frame_flush(AVFormatContext *s)
1287 flush_packet_queue(s);
1291 /* for each stream, reset read state */
1292 for(i = 0; i < s->nb_streams; i++) {
1296 av_parser_close(st->parser);
1298 av_free_packet(&st->cur_pkt);
1300 st->last_IP_pts = AV_NOPTS_VALUE;
1301 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1302 st->reference_dts = AV_NOPTS_VALUE;
1307 st->probe_packets = MAX_PROBE_PACKETS;
1309 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1310 st->pts_buffer[j]= AV_NOPTS_VALUE;
1314 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1317 for(i = 0; i < s->nb_streams; i++) {
1318 AVStream *st = s->streams[i];
1320 st->cur_dts = av_rescale(timestamp,
1321 st->time_base.den * (int64_t)ref_st->time_base.num,
1322 st->time_base.num * (int64_t)ref_st->time_base.den);
1326 void ff_reduce_index(AVFormatContext *s, int stream_index)
1328 AVStream *st= s->streams[stream_index];
1329 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1331 if((unsigned)st->nb_index_entries >= max_entries){
1333 for(i=0; 2*i<st->nb_index_entries; i++)
1334 st->index_entries[i]= st->index_entries[2*i];
1335 st->nb_index_entries= i;
1339 int av_add_index_entry(AVStream *st,
1340 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1342 AVIndexEntry *entries, *ie;
1345 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1348 entries = av_fast_realloc(st->index_entries,
1349 &st->index_entries_allocated_size,
1350 (st->nb_index_entries + 1) *
1351 sizeof(AVIndexEntry));
1355 st->index_entries= entries;
1357 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1360 index= st->nb_index_entries++;
1361 ie= &entries[index];
1362 assert(index==0 || ie[-1].timestamp < timestamp);
1364 ie= &entries[index];
1365 if(ie->timestamp != timestamp){
1366 if(ie->timestamp <= timestamp)
1368 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1369 st->nb_index_entries++;
1370 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1371 distance= ie->min_distance;
1375 ie->timestamp = timestamp;
1376 ie->min_distance= distance;
1383 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1386 AVIndexEntry *entries= st->index_entries;
1387 int nb_entries= st->nb_index_entries;
1394 //optimize appending index entries at the end
1395 if(b && entries[b-1].timestamp < wanted_timestamp)
1400 timestamp = entries[m].timestamp;
1401 if(timestamp >= wanted_timestamp)
1403 if(timestamp <= wanted_timestamp)
1406 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1408 if(!(flags & AVSEEK_FLAG_ANY)){
1409 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1410 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1421 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1422 AVInputFormat *avif= s->iformat;
1423 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1424 int64_t ts_min, ts_max, ts;
1429 if (stream_index < 0)
1433 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1437 ts_min= AV_NOPTS_VALUE;
1438 pos_limit= -1; //gcc falsely says it may be uninitialized
1440 st= s->streams[stream_index];
1441 if(st->index_entries){
1444 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()
1445 index= FFMAX(index, 0);
1446 e= &st->index_entries[index];
1448 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1450 ts_min= e->timestamp;
1452 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1459 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1460 assert(index < st->nb_index_entries);
1462 e= &st->index_entries[index];
1463 assert(e->timestamp >= target_ts);
1465 ts_max= e->timestamp;
1466 pos_limit= pos_max - e->min_distance;
1468 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1469 pos_max,pos_limit, ts_max);
1474 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1479 if ((ret = url_fseek(s->pb, pos, SEEK_SET)) < 0)
1482 av_update_cur_dts(s, st, ts);
1487 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 )){
1489 int64_t start_pos, filesize;
1493 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1496 if(ts_min == AV_NOPTS_VALUE){
1497 pos_min = s->data_offset;
1498 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1499 if (ts_min == AV_NOPTS_VALUE)
1503 if(ts_max == AV_NOPTS_VALUE){
1505 filesize = url_fsize(s->pb);
1506 pos_max = filesize - 1;
1509 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1511 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1512 if (ts_max == AV_NOPTS_VALUE)
1516 int64_t tmp_pos= pos_max + 1;
1517 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1518 if(tmp_ts == AV_NOPTS_VALUE)
1522 if(tmp_pos >= filesize)
1528 if(ts_min > ts_max){
1530 }else if(ts_min == ts_max){
1535 while (pos_min < pos_limit) {
1537 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1541 assert(pos_limit <= pos_max);
1544 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1545 // interpolate position (better than dichotomy)
1546 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1547 + pos_min - approximate_keyframe_distance;
1548 }else if(no_change==1){
1549 // bisection, if interpolation failed to change min or max pos last time
1550 pos = (pos_min + pos_limit)>>1;
1552 /* linear search if bisection failed, can only happen if there
1553 are very few or no keyframes between min/max */
1558 else if(pos > pos_limit)
1562 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1568 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1569 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit,
1570 start_pos, no_change);
1572 if(ts == AV_NOPTS_VALUE){
1573 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1576 assert(ts != AV_NOPTS_VALUE);
1577 if (target_ts <= ts) {
1578 pos_limit = start_pos - 1;
1582 if (target_ts >= ts) {
1588 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1589 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1592 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1594 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1595 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1596 pos, ts_min, target_ts, ts_max);
1602 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1603 int64_t pos_min, pos_max;
1607 if (stream_index < 0)
1610 st= s->streams[stream_index];
1613 pos_min = s->data_offset;
1614 pos_max = url_fsize(s->pb) - 1;
1616 if (pos < pos_min) pos= pos_min;
1617 else if(pos > pos_max) pos= pos_max;
1619 url_fseek(s->pb, pos, SEEK_SET);
1622 av_update_cur_dts(s, st, ts);
1627 static int av_seek_frame_generic(AVFormatContext *s,
1628 int stream_index, int64_t timestamp, int flags)
1635 st = s->streams[stream_index];
1637 index = av_index_search_timestamp(st, timestamp, flags);
1639 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1642 if(index < 0 || index==st->nb_index_entries-1){
1646 if(st->nb_index_entries){
1647 assert(st->index_entries);
1648 ie= &st->index_entries[st->nb_index_entries-1];
1649 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1651 av_update_cur_dts(s, st, ie->timestamp);
1653 if ((ret = url_fseek(s->pb, s->data_offset, SEEK_SET)) < 0)
1659 ret = av_read_frame(s, &pkt);
1660 }while(ret == AVERROR(EAGAIN));
1663 av_free_packet(&pkt);
1664 if(stream_index == pkt.stream_index){
1665 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1669 index = av_index_search_timestamp(st, timestamp, flags);
1674 ff_read_frame_flush(s);
1675 if (s->iformat->read_seek){
1676 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1679 ie = &st->index_entries[index];
1680 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1682 av_update_cur_dts(s, st, ie->timestamp);
1687 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1692 ff_read_frame_flush(s);
1694 if(flags & AVSEEK_FLAG_BYTE)
1695 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1697 if(stream_index < 0){
1698 stream_index= av_find_default_stream_index(s);
1699 if(stream_index < 0)
1702 st= s->streams[stream_index];
1703 /* timestamp for default must be expressed in AV_TIME_BASE units */
1704 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1707 /* first, we try the format specific seek */
1708 if (s->iformat->read_seek)
1709 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1716 if(s->iformat->read_timestamp)
1717 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1719 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1722 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1724 if(min_ts > ts || max_ts < ts)
1727 ff_read_frame_flush(s);
1729 if (s->iformat->read_seek2)
1730 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1732 if(s->iformat->read_timestamp){
1733 //try to seek via read_timestamp()
1736 //Fallback to old API if new is not implemented but old is
1737 //Note the old has somewat different sematics
1738 if(s->iformat->read_seek || 1)
1739 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1741 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1744 /*******************************************************/
1747 * Returns TRUE if the stream has accurate duration in any stream.
1749 * @return TRUE if the stream has accurate duration for at least one component.
1751 static int av_has_duration(AVFormatContext *ic)
1756 for(i = 0;i < ic->nb_streams; i++) {
1757 st = ic->streams[i];
1758 if (st->duration != AV_NOPTS_VALUE)
1765 * Estimate the stream timings from the one of each components.
1767 * Also computes the global bitrate if possible.
1769 static void av_update_stream_timings(AVFormatContext *ic)
1771 int64_t start_time, start_time1, end_time, end_time1;
1772 int64_t duration, duration1;
1776 start_time = INT64_MAX;
1777 end_time = INT64_MIN;
1778 duration = INT64_MIN;
1779 for(i = 0;i < ic->nb_streams; i++) {
1780 st = ic->streams[i];
1781 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1782 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1783 if (start_time1 < start_time)
1784 start_time = start_time1;
1785 if (st->duration != AV_NOPTS_VALUE) {
1786 end_time1 = start_time1
1787 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1788 if (end_time1 > end_time)
1789 end_time = end_time1;
1792 if (st->duration != AV_NOPTS_VALUE) {
1793 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1794 if (duration1 > duration)
1795 duration = duration1;
1798 if (start_time != INT64_MAX) {
1799 ic->start_time = start_time;
1800 if (end_time != INT64_MIN) {
1801 if (end_time - start_time > duration)
1802 duration = end_time - start_time;
1805 if (duration != INT64_MIN) {
1806 ic->duration = duration;
1807 if (ic->file_size > 0) {
1808 /* compute the bitrate */
1809 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1810 (double)ic->duration;
1815 static void fill_all_stream_timings(AVFormatContext *ic)
1820 av_update_stream_timings(ic);
1821 for(i = 0;i < ic->nb_streams; i++) {
1822 st = ic->streams[i];
1823 if (st->start_time == AV_NOPTS_VALUE) {
1824 if(ic->start_time != AV_NOPTS_VALUE)
1825 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1826 if(ic->duration != AV_NOPTS_VALUE)
1827 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1832 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1834 int64_t filesize, duration;
1838 /* if bit_rate is already set, we believe it */
1839 if (ic->bit_rate == 0) {
1841 for(i=0;i<ic->nb_streams;i++) {
1842 st = ic->streams[i];
1843 bit_rate += st->codec->bit_rate;
1845 ic->bit_rate = bit_rate;
1848 /* if duration is already set, we believe it */
1849 if (ic->duration == AV_NOPTS_VALUE &&
1850 ic->bit_rate != 0 &&
1851 ic->file_size != 0) {
1852 filesize = ic->file_size;
1854 for(i = 0; i < ic->nb_streams; i++) {
1855 st = ic->streams[i];
1856 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1857 if (st->duration == AV_NOPTS_VALUE)
1858 st->duration = duration;
1864 #define DURATION_MAX_READ_SIZE 250000
1865 #define DURATION_MAX_RETRY 3
1867 /* only usable for MPEG-PS streams */
1868 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1870 AVPacket pkt1, *pkt = &pkt1;
1872 int read_size, i, ret;
1873 int64_t end_time, start_time[MAX_STREAMS];
1874 int64_t filesize, offset, duration;
1879 /* flush packet queue */
1880 flush_packet_queue(ic);
1882 for(i=0;i<ic->nb_streams;i++) {
1883 st = ic->streams[i];
1884 if(st->start_time != AV_NOPTS_VALUE){
1885 start_time[i]= st->start_time;
1886 }else if(st->first_dts != AV_NOPTS_VALUE){
1887 start_time[i]= st->first_dts;
1889 av_log(st->codec, AV_LOG_WARNING, "start time is not set in av_estimate_timings_from_pts\n");
1892 av_parser_close(st->parser);
1894 av_free_packet(&st->cur_pkt);
1898 /* estimate the end time (duration) */
1899 /* XXX: may need to support wrapping */
1900 filesize = ic->file_size;
1901 end_time = AV_NOPTS_VALUE;
1903 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
1907 url_fseek(ic->pb, offset, SEEK_SET);
1910 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
1914 ret = av_read_packet(ic, pkt);
1915 }while(ret == AVERROR(EAGAIN));
1918 read_size += pkt->size;
1919 st = ic->streams[pkt->stream_index];
1920 if (pkt->pts != AV_NOPTS_VALUE &&
1921 start_time[pkt->stream_index] != AV_NOPTS_VALUE) {
1922 end_time = pkt->pts;
1923 duration = end_time - start_time[pkt->stream_index];
1925 duration += 1LL<<st->pts_wrap_bits;
1927 if (st->duration == AV_NOPTS_VALUE ||
1928 st->duration < duration)
1929 st->duration = duration;
1932 av_free_packet(pkt);
1934 }while( end_time==AV_NOPTS_VALUE
1935 && filesize > (DURATION_MAX_READ_SIZE<<retry)
1936 && ++retry <= DURATION_MAX_RETRY);
1938 fill_all_stream_timings(ic);
1940 url_fseek(ic->pb, old_offset, SEEK_SET);
1941 for(i=0; i<ic->nb_streams; i++){
1943 st->cur_dts= st->first_dts;
1944 st->last_IP_pts = AV_NOPTS_VALUE;
1948 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
1952 /* get the file size, if possible */
1953 if (ic->iformat->flags & AVFMT_NOFILE) {
1956 file_size = url_fsize(ic->pb);
1960 ic->file_size = file_size;
1962 if ((!strcmp(ic->iformat->name, "mpeg") ||
1963 !strcmp(ic->iformat->name, "mpegts")) &&
1964 file_size && !url_is_streamed(ic->pb)) {
1965 /* get accurate estimate from the PTSes */
1966 av_estimate_timings_from_pts(ic, old_offset);
1967 } else if (av_has_duration(ic)) {
1968 /* at least one component has timings - we use them for all
1970 fill_all_stream_timings(ic);
1972 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
1973 /* less precise: use bitrate info */
1974 av_estimate_timings_from_bit_rate(ic);
1976 av_update_stream_timings(ic);
1982 for(i = 0;i < ic->nb_streams; i++) {
1983 st = ic->streams[i];
1984 printf("%d: start_time: %0.3f duration: %0.3f\n",
1985 i, (double)st->start_time / AV_TIME_BASE,
1986 (double)st->duration / AV_TIME_BASE);
1988 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1989 (double)ic->start_time / AV_TIME_BASE,
1990 (double)ic->duration / AV_TIME_BASE,
1991 ic->bit_rate / 1000);
1996 static int has_codec_parameters(AVCodecContext *enc)
1999 switch(enc->codec_type) {
2000 case AVMEDIA_TYPE_AUDIO:
2001 val = enc->sample_rate && enc->channels && enc->sample_fmt != SAMPLE_FMT_NONE;
2002 if(!enc->frame_size &&
2003 (enc->codec_id == CODEC_ID_VORBIS ||
2004 enc->codec_id == CODEC_ID_AAC ||
2005 enc->codec_id == CODEC_ID_MP1 ||
2006 enc->codec_id == CODEC_ID_MP2 ||
2007 enc->codec_id == CODEC_ID_MP3 ||
2008 enc->codec_id == CODEC_ID_SPEEX))
2011 case AVMEDIA_TYPE_VIDEO:
2012 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
2018 return enc->codec_id != CODEC_ID_NONE && val != 0;
2021 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
2025 int got_picture, data_size, ret=0;
2028 if(!st->codec->codec){
2029 codec = avcodec_find_decoder(st->codec->codec_id);
2032 ret = avcodec_open(st->codec, codec);
2037 if(!has_codec_parameters(st->codec)){
2038 switch(st->codec->codec_type) {
2039 case AVMEDIA_TYPE_VIDEO:
2040 avcodec_get_frame_defaults(&picture);
2041 ret = avcodec_decode_video2(st->codec, &picture,
2042 &got_picture, avpkt);
2044 case AVMEDIA_TYPE_AUDIO:
2045 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2046 samples = av_malloc(data_size);
2049 ret = avcodec_decode_audio3(st->codec, samples,
2061 unsigned int ff_codec_get_tag(const AVCodecTag *tags, int id)
2063 while (tags->id != CODEC_ID_NONE) {
2071 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2074 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2075 if(tag == tags[i].tag)
2078 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2079 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
2080 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
2081 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
2082 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
2085 return CODEC_ID_NONE;
2088 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2091 for(i=0; tags && tags[i]; i++){
2092 int tag= ff_codec_get_tag(tags[i], id);
2098 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2101 for(i=0; tags && tags[i]; i++){
2102 enum CodecID id= ff_codec_get_id(tags[i], tag);
2103 if(id!=CODEC_ID_NONE) return id;
2105 return CODEC_ID_NONE;
2108 static void compute_chapters_end(AVFormatContext *s)
2112 for (i=0; i+1<s->nb_chapters; i++)
2113 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2114 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
2115 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
2116 s->chapters[i]->end = s->chapters[i+1]->start;
2119 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
2120 assert(s->start_time != AV_NOPTS_VALUE);
2121 assert(s->duration > 0);
2122 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
2124 s->chapters[i]->time_base);
2128 #define MAX_STD_TIMEBASES (60*12+5)
2129 static int get_std_framerate(int i){
2130 if(i<60*12) return i*1001;
2131 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2135 * Is the time base unreliable.
2136 * This is a heuristic to balance between quick acceptance of the values in
2137 * the headers vs. some extra checks.
2138 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2139 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2140 * And there are "variable" fps files this needs to detect as well.
2142 static int tb_unreliable(AVCodecContext *c){
2143 if( c->time_base.den >= 101L*c->time_base.num
2144 || c->time_base.den < 5L*c->time_base.num
2145 /* || c->codec_tag == AV_RL32("DIVX")
2146 || c->codec_tag == AV_RL32("XVID")*/
2147 || c->codec_id == CODEC_ID_MPEG2VIDEO
2148 || c->codec_id == CODEC_ID_H264
2154 int av_find_stream_info(AVFormatContext *ic)
2156 int i, count, ret, read_size, j;
2158 AVPacket pkt1, *pkt;
2159 int64_t last_dts[MAX_STREAMS];
2160 int64_t duration_gcd[MAX_STREAMS]={0};
2161 int duration_count[MAX_STREAMS]={0};
2162 double (*duration_error)[MAX_STD_TIMEBASES];
2163 int64_t old_offset = url_ftell(ic->pb);
2164 int64_t codec_info_duration[MAX_STREAMS]={0};
2166 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
2167 if (!duration_error) return AVERROR(ENOMEM);
2169 for(i=0;i<ic->nb_streams;i++) {
2170 st = ic->streams[i];
2171 if (st->codec->codec_id == CODEC_ID_AAC) {
2172 st->codec->sample_rate = 0;
2173 st->codec->frame_size = 0;
2174 st->codec->channels = 0;
2176 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
2177 /* if(!st->time_base.num)
2179 if(!st->codec->time_base.num)
2180 st->codec->time_base= st->time_base;
2182 //only for the split stuff
2183 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2184 st->parser = av_parser_init(st->codec->codec_id);
2185 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2186 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2189 assert(!st->codec->codec);
2190 //try to just open decoders, in case this is enough to get parameters
2191 if(!has_codec_parameters(st->codec)){
2192 AVCodec *codec = avcodec_find_decoder(st->codec->codec_id);
2194 avcodec_open(st->codec, codec);
2198 for(i=0;i<MAX_STREAMS;i++){
2199 last_dts[i]= AV_NOPTS_VALUE;
2205 if(url_interrupt_cb()){
2206 ret= AVERROR(EINTR);
2207 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2211 /* check if one codec still needs to be handled */
2212 for(i=0;i<ic->nb_streams;i++) {
2213 st = ic->streams[i];
2214 if (!has_codec_parameters(st->codec))
2216 /* variable fps and no guess at the real fps */
2217 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2218 && duration_count[i]<20 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2220 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2222 if(st->first_dts == AV_NOPTS_VALUE)
2225 if (i == ic->nb_streams) {
2226 /* NOTE: if the format has no header, then we need to read
2227 some packets to get most of the streams, so we cannot
2229 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2230 /* if we found the info for all the codecs, we can stop */
2232 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2236 /* we did not get all the codec info, but we read too much data */
2237 if (read_size >= ic->probesize) {
2239 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2243 /* NOTE: a new stream can be added there if no header in file
2244 (AVFMTCTX_NOHEADER) */
2245 ret = av_read_frame_internal(ic, &pkt1);
2246 if(ret == AVERROR(EAGAIN))
2250 ret = -1; /* we could not have all the codec parameters before EOF */
2251 for(i=0;i<ic->nb_streams;i++) {
2252 st = ic->streams[i];
2253 if (!has_codec_parameters(st->codec)){
2255 avcodec_string(buf, sizeof(buf), st->codec, 0);
2256 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2264 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2265 if(av_dup_packet(pkt) < 0) {
2266 av_free(duration_error);
2267 return AVERROR(ENOMEM);
2270 read_size += pkt->size;
2272 st = ic->streams[pkt->stream_index];
2273 if(st->codec_info_nb_frames>1) {
2274 if (st->time_base.den > 0 && av_rescale_q(codec_info_duration[st->index], st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration){
2275 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2278 codec_info_duration[st->index] += pkt->duration;
2280 st->codec_info_nb_frames++;
2283 int index= pkt->stream_index;
2284 int64_t last= last_dts[index];
2285 int64_t duration= pkt->dts - last;
2287 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2288 double dur= duration * av_q2d(st->time_base);
2290 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2291 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2292 if(duration_count[index] < 2)
2293 memset(duration_error[index], 0, sizeof(*duration_error));
2294 for(i=1; i<MAX_STD_TIMEBASES; i++){
2295 int framerate= get_std_framerate(i);
2296 int ticks= lrintf(dur*framerate/(1001*12));
2297 double error= dur - ticks*1001*12/(double)framerate;
2298 duration_error[index][i] += error*error;
2300 duration_count[index]++;
2301 // ignore the first 4 values, they might have some random jitter
2302 if (duration_count[index] > 3)
2303 duration_gcd[index] = av_gcd(duration_gcd[index], duration);
2305 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
2306 last_dts[pkt->stream_index]= pkt->dts;
2308 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2309 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2311 st->codec->extradata_size= i;
2312 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2313 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2314 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2318 /* if still no information, we try to open the codec and to
2319 decompress the frame. We try to avoid that in most cases as
2320 it takes longer and uses more memory. For MPEG-4, we need to
2321 decompress for QuickTime. */
2322 if (!has_codec_parameters(st->codec))
2323 try_decode_frame(st, pkt);
2328 // close codecs which were opened in try_decode_frame()
2329 for(i=0;i<ic->nb_streams;i++) {
2330 st = ic->streams[i];
2331 if(st->codec->codec)
2332 avcodec_close(st->codec);
2334 for(i=0;i<ic->nb_streams;i++) {
2335 st = ic->streams[i];
2336 if(st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && codec_info_duration[i])
2337 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2338 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2339 codec_info_duration[i] *(int64_t)st->time_base.num, 60000);
2340 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2341 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
2342 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2344 // the check for tb_unreliable() is not completely correct, since this is not about handling
2345 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2346 // ipmovie.c produces.
2347 if (tb_unreliable(st->codec) && duration_count[i] > 15 && duration_gcd[i] > 1 && !st->r_frame_rate.num)
2348 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * duration_gcd[i], INT_MAX);
2349 if(duration_count[i] && !st->r_frame_rate.num
2350 && tb_unreliable(st->codec) /*&&
2351 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2352 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2354 double best_error= 2*av_q2d(st->time_base);
2355 best_error= best_error*best_error*duration_count[i]*1000*12*30;
2357 for(j=1; j<MAX_STD_TIMEBASES; j++){
2358 double error= duration_error[i][j] * get_std_framerate(j);
2359 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2360 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2361 if(error < best_error){
2363 num = get_std_framerate(j);
2366 // do not increase frame rate by more than 1 % in order to match a standard rate.
2367 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2368 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2371 if (!st->r_frame_rate.num){
2372 if( st->codec->time_base.den * (int64_t)st->time_base.num
2373 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2374 st->r_frame_rate.num = st->codec->time_base.den;
2375 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2377 st->r_frame_rate.num = st->time_base.den;
2378 st->r_frame_rate.den = st->time_base.num;
2381 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2382 if(!st->codec->bits_per_coded_sample)
2383 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2387 av_estimate_timings(ic, old_offset);
2389 compute_chapters_end(ic);
2392 /* correct DTS for B-frame streams with no timestamps */
2393 for(i=0;i<ic->nb_streams;i++) {
2394 st = ic->streams[i];
2395 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2397 ppktl = &ic->packet_buffer;
2399 if(ppkt1->stream_index != i)
2401 if(ppkt1->pkt->dts < 0)
2403 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2405 ppkt1->pkt->dts -= delta;
2410 st->cur_dts -= delta;
2416 av_free(duration_error);
2421 /*******************************************************/
2423 int av_read_play(AVFormatContext *s)
2425 if (s->iformat->read_play)
2426 return s->iformat->read_play(s);
2428 return av_url_read_fpause(s->pb, 0);
2429 return AVERROR(ENOSYS);
2432 int av_read_pause(AVFormatContext *s)
2434 if (s->iformat->read_pause)
2435 return s->iformat->read_pause(s);
2437 return av_url_read_fpause(s->pb, 1);
2438 return AVERROR(ENOSYS);
2441 void av_close_input_stream(AVFormatContext *s)
2446 if (s->iformat->read_close)
2447 s->iformat->read_close(s);
2448 for(i=0;i<s->nb_streams;i++) {
2449 /* free all data in a stream component */
2452 av_parser_close(st->parser);
2453 av_free_packet(&st->cur_pkt);
2455 av_metadata_free(&st->metadata);
2456 av_free(st->index_entries);
2457 av_free(st->codec->extradata);
2459 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2460 av_free(st->filename);
2462 av_free(st->priv_data);
2465 for(i=s->nb_programs-1; i>=0; i--) {
2466 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2467 av_freep(&s->programs[i]->provider_name);
2468 av_freep(&s->programs[i]->name);
2470 av_metadata_free(&s->programs[i]->metadata);
2471 av_freep(&s->programs[i]->stream_index);
2472 av_freep(&s->programs[i]);
2474 av_freep(&s->programs);
2475 flush_packet_queue(s);
2476 av_freep(&s->priv_data);
2477 while(s->nb_chapters--) {
2478 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2479 av_free(s->chapters[s->nb_chapters]->title);
2481 av_metadata_free(&s->chapters[s->nb_chapters]->metadata);
2482 av_free(s->chapters[s->nb_chapters]);
2484 av_freep(&s->chapters);
2485 av_metadata_free(&s->metadata);
2489 void av_close_input_file(AVFormatContext *s)
2491 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2492 av_close_input_stream(s);
2497 AVStream *av_new_stream(AVFormatContext *s, int id)
2502 if (s->nb_streams >= MAX_STREAMS)
2505 st = av_mallocz(sizeof(AVStream));
2509 st->codec= avcodec_alloc_context();
2511 /* no default bitrate if decoding */
2512 st->codec->bit_rate = 0;
2514 st->index = s->nb_streams;
2516 st->start_time = AV_NOPTS_VALUE;
2517 st->duration = AV_NOPTS_VALUE;
2518 /* we set the current DTS to 0 so that formats without any timestamps
2519 but durations get some timestamps, formats with some unknown
2520 timestamps have their first few packets buffered and the
2521 timestamps corrected before they are returned to the user */
2523 st->first_dts = AV_NOPTS_VALUE;
2524 st->probe_packets = MAX_PROBE_PACKETS;
2526 /* default pts setting is MPEG-like */
2527 av_set_pts_info(st, 33, 1, 90000);
2528 st->last_IP_pts = AV_NOPTS_VALUE;
2529 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2530 st->pts_buffer[i]= AV_NOPTS_VALUE;
2531 st->reference_dts = AV_NOPTS_VALUE;
2533 st->sample_aspect_ratio = (AVRational){0,1};
2535 s->streams[s->nb_streams++] = st;
2539 AVProgram *av_new_program(AVFormatContext *ac, int id)
2541 AVProgram *program=NULL;
2545 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2548 for(i=0; i<ac->nb_programs; i++)
2549 if(ac->programs[i]->id == id)
2550 program = ac->programs[i];
2553 program = av_mallocz(sizeof(AVProgram));
2556 dynarray_add(&ac->programs, &ac->nb_programs, program);
2557 program->discard = AVDISCARD_NONE;
2564 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2566 AVChapter *chapter = NULL;
2569 for(i=0; i<s->nb_chapters; i++)
2570 if(s->chapters[i]->id == id)
2571 chapter = s->chapters[i];
2574 chapter= av_mallocz(sizeof(AVChapter));
2577 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2579 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2580 av_free(chapter->title);
2582 av_metadata_set2(&chapter->metadata, "title", title, 0);
2584 chapter->time_base= time_base;
2585 chapter->start = start;
2591 /************************************************************/
2592 /* output media file */
2594 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2598 if (s->oformat->priv_data_size > 0) {
2599 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2601 return AVERROR(ENOMEM);
2603 s->priv_data = NULL;
2605 if (s->oformat->set_parameters) {
2606 ret = s->oformat->set_parameters(s, ap);
2613 int av_write_header(AVFormatContext *s)
2618 // some sanity checks
2619 if (s->nb_streams == 0) {
2620 av_log(s, AV_LOG_ERROR, "no streams\n");
2624 for(i=0;i<s->nb_streams;i++) {
2627 switch (st->codec->codec_type) {
2628 case AVMEDIA_TYPE_AUDIO:
2629 if(st->codec->sample_rate<=0){
2630 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2633 if(!st->codec->block_align)
2634 st->codec->block_align = st->codec->channels *
2635 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2637 case AVMEDIA_TYPE_VIDEO:
2638 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2639 av_log(s, AV_LOG_ERROR, "time base not set\n");
2642 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2643 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2646 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2647 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2653 if(s->oformat->codec_tag){
2654 if(st->codec->codec_tag){
2656 //check that tag + id is in the table
2657 //if neither is in the table -> OK
2658 //if tag is in the table with another id -> FAIL
2659 //if id is in the table with another tag -> FAIL unless strict < ?
2661 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2664 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2665 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2666 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2669 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2670 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2672 return AVERROR(ENOMEM);
2675 #if LIBAVFORMAT_VERSION_MAJOR < 53
2676 ff_metadata_mux_compat(s);
2679 /* set muxer identification string */
2680 if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2684 if (!(m = av_mallocz(sizeof(AVMetadata))))
2685 return AVERROR(ENOMEM);
2686 av_metadata_set2(&m, "encoder", LIBAVFORMAT_IDENT, 0);
2687 metadata_conv(&m, s->oformat->metadata_conv, NULL);
2688 if ((t = av_metadata_get(m, "", NULL, AV_METADATA_IGNORE_SUFFIX)))
2689 av_metadata_set2(&s->metadata, t->key, t->value, 0);
2690 av_metadata_free(&m);
2693 if(s->oformat->write_header){
2694 ret = s->oformat->write_header(s);
2699 /* init PTS generation */
2700 for(i=0;i<s->nb_streams;i++) {
2701 int64_t den = AV_NOPTS_VALUE;
2704 switch (st->codec->codec_type) {
2705 case AVMEDIA_TYPE_AUDIO:
2706 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2708 case AVMEDIA_TYPE_VIDEO:
2709 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2714 if (den != AV_NOPTS_VALUE) {
2716 return AVERROR_INVALIDDATA;
2717 av_frac_init(&st->pts, 0, 0, den);
2723 //FIXME merge with compute_pkt_fields
2724 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
2725 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2726 int num, den, frame_size, i;
2728 // 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);
2730 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2733 /* duration field */
2734 if (pkt->duration == 0) {
2735 compute_frame_duration(&num, &den, st, NULL, pkt);
2737 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2741 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2744 //XXX/FIXME this is a temporary hack until all encoders output pts
2745 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2747 // pkt->pts= st->cur_dts;
2748 pkt->pts= st->pts.val;
2751 //calculate dts from pts
2752 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2753 st->pts_buffer[0]= pkt->pts;
2754 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2755 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
2756 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2757 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2759 pkt->dts= st->pts_buffer[0];
2761 #ifdef GST_EXT_FFMUX_ENHANCEMENT
2763 if (st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts) {
2764 av_log(st->codec, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2765 if (st->cur_dts > pkt->dts) {
2766 av_log(st->codec, AV_LOG_ERROR, "[Drop] error, non monotone timestamps %"PRId64" > %"PRId64"\n", st->cur_dts, pkt->dts);
2770 } else if (st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts) {
2771 av_log(st->codec, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2774 #else /* GST_EXT_FFMUX_ENHANCEMENT */
2775 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2776 av_log(s, AV_LOG_ERROR,
2777 "st:%d error, non monotone timestamps %"PRId64" >= %"PRId64"\n",
2778 st->index, st->cur_dts, pkt->dts);
2781 #endif /* GST_EXT_FFMUX_ENHANCEMENT */
2782 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2783 av_log(s, AV_LOG_ERROR, "st:%d error, pts < dts\n", st->index);
2787 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2788 st->cur_dts= pkt->dts;
2789 st->pts.val= pkt->dts;
2792 switch (st->codec->codec_type) {
2793 case AVMEDIA_TYPE_AUDIO:
2794 frame_size = get_audio_frame_size(st->codec, pkt->size);
2796 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2797 likely equal to the encoder delay, but it would be better if we
2798 had the real timestamps from the encoder */
2799 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2800 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2803 case AVMEDIA_TYPE_VIDEO:
2804 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2812 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2814 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
2816 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2819 ret= s->oformat->write_packet(s, pkt);
2821 ret= url_ferror(s->pb);
2825 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
2826 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
2828 AVPacketList **next_point, *this_pktl;
2830 this_pktl = av_mallocz(sizeof(AVPacketList));
2831 this_pktl->pkt= *pkt;
2832 pkt->destruct= NULL; // do not free original but only the copy
2833 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
2835 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
2836 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
2838 next_point = &s->packet_buffer;
2841 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
2842 while(!compare(s, &(*next_point)->pkt, pkt)){
2843 next_point= &(*next_point)->next;
2847 next_point = &(s->packet_buffer_end->next);
2850 assert(!*next_point);
2852 s->packet_buffer_end= this_pktl;
2855 this_pktl->next= *next_point;
2857 s->streams[pkt->stream_index]->last_in_packet_buffer=
2858 *next_point= this_pktl;
2861 int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
2863 AVStream *st = s->streams[ pkt ->stream_index];
2864 AVStream *st2= s->streams[ next->stream_index];
2865 int64_t a= st2->time_base.num * (int64_t)st ->time_base.den;
2866 int64_t b= st ->time_base.num * (int64_t)st2->time_base.den;
2867 return av_rescale_rnd(pkt->dts, b, a, AV_ROUND_DOWN) < next->dts;
2870 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2876 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
2879 for(i=0; i < s->nb_streams; i++)
2880 stream_count+= !!s->streams[i]->last_in_packet_buffer;
2882 if(stream_count && (s->nb_streams == stream_count || flush)){
2883 pktl= s->packet_buffer;
2886 s->packet_buffer= pktl->next;
2887 if(!s->packet_buffer)
2888 s->packet_buffer_end= NULL;
2890 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
2891 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
2895 av_init_packet(out);
2901 * Interleaves an AVPacket correctly so it can be muxed.
2902 * @param out the interleaved packet will be output here
2903 * @param in the input packet
2904 * @param flush 1 if no further packets are available as input and all
2905 * remaining packets should be output
2906 * @return 1 if a packet was output, 0 if no packet could be output,
2907 * < 0 if an error occurred
2909 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2910 if(s->oformat->interleave_packet)
2911 return s->oformat->interleave_packet(s, out, in, flush);
2913 return av_interleave_packet_per_dts(s, out, in, flush);
2916 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2917 AVStream *st= s->streams[ pkt->stream_index];
2919 //FIXME/XXX/HACK drop zero sized packets
2920 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
2923 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2924 if(compute_pkt_fields2(s, st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2927 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2932 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2933 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2936 ret= s->oformat->write_packet(s, &opkt);
2938 av_free_packet(&opkt);
2943 if(url_ferror(s->pb))
2944 return url_ferror(s->pb);
2948 int av_write_trailer(AVFormatContext *s)
2951 MOVMuxContext *mov = s->priv_data;
2955 ret= av_interleave_packet(s, &pkt, NULL, 1);
2956 if(ret<0) //FIXME cleanup needed for ret<0 ?
2961 ret= s->oformat->write_packet(s, &pkt);
2963 av_free_packet(&pkt);
2967 if(url_ferror(s->pb))
2971 if(s->oformat->write_trailer)
2972 ret = s->oformat->write_trailer(s);
2975 ret=url_ferror(s->pb);
2976 for(i=0;i<s->nb_streams;i++) {
2977 av_freep(&s->streams[i]->priv_data);
2978 av_freep(&s->streams[i]->index_entries);
2979 if(mov && mov->tracks)
2981 MOVTrack *trk = &mov->tracks[i];
2982 if(trk && trk->vosData)
2984 av_free(trk->vosData);
2985 trk->vosData = NULL;
2987 av_free(mov->tracks);
2991 av_freep(&s->priv_data);
2995 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2998 AVProgram *program=NULL;
3001 if (idx >= ac->nb_streams) {
3002 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3006 for(i=0; i<ac->nb_programs; i++){
3007 if(ac->programs[i]->id != progid)
3009 program = ac->programs[i];
3010 for(j=0; j<program->nb_stream_indexes; j++)
3011 if(program->stream_index[j] == idx)
3014 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3017 program->stream_index = tmp;
3018 program->stream_index[program->nb_stream_indexes++] = idx;
3023 static void print_fps(double d, const char *postfix){
3024 uint64_t v= lrintf(d*100);
3025 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3026 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3027 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3030 static void dump_metadata(void *ctx, AVMetadata *m, const char *indent)
3032 if(m && !(m->count == 1 && av_metadata_get(m, "language", NULL, 0))){
3033 AVMetadataTag *tag=NULL;
3035 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3036 while((tag=av_metadata_get(m, "", tag, AV_METADATA_IGNORE_SUFFIX))) {
3037 if(strcmp("language", tag->key))
3038 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
3043 /* "user interface" functions */
3044 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3047 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3048 AVStream *st = ic->streams[i];
3049 int g = av_gcd(st->time_base.num, st->time_base.den);
3050 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0);
3051 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3052 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3053 /* the pid is an important information, so we display it */
3054 /* XXX: add a generic system */
3055 if (flags & AVFMT_SHOW_IDS)
3056 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3058 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3059 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3060 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3061 if (st->sample_aspect_ratio.num && // default
3062 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3063 AVRational display_aspect_ratio;
3064 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3065 st->codec->width*st->sample_aspect_ratio.num,
3066 st->codec->height*st->sample_aspect_ratio.den,
3068 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3069 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3070 display_aspect_ratio.num, display_aspect_ratio.den);
3072 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3073 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3074 print_fps(av_q2d(st->avg_frame_rate), "fps");
3075 if(st->r_frame_rate.den && st->r_frame_rate.num)
3076 print_fps(av_q2d(st->r_frame_rate), "tbr");
3077 if(st->time_base.den && st->time_base.num)
3078 print_fps(1/av_q2d(st->time_base), "tbn");
3079 if(st->codec->time_base.den && st->codec->time_base.num)
3080 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3082 av_log(NULL, AV_LOG_INFO, "\n");
3083 dump_metadata(NULL, st->metadata, " ");
3086 void dump_format(AVFormatContext *ic,
3092 uint8_t *printed = av_mallocz(ic->nb_streams);
3093 if (ic->nb_streams && !printed)
3096 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3097 is_output ? "Output" : "Input",
3099 is_output ? ic->oformat->name : ic->iformat->name,
3100 is_output ? "to" : "from", url);
3101 dump_metadata(NULL, ic->metadata, " ");
3103 av_log(NULL, AV_LOG_INFO, " Duration: ");
3104 if (ic->duration != AV_NOPTS_VALUE) {
3105 int hours, mins, secs, us;
3106 secs = ic->duration / AV_TIME_BASE;
3107 us = ic->duration % AV_TIME_BASE;
3112 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3113 (100 * us) / AV_TIME_BASE);
3115 av_log(NULL, AV_LOG_INFO, "N/A");
3117 if (ic->start_time != AV_NOPTS_VALUE) {
3119 av_log(NULL, AV_LOG_INFO, ", start: ");
3120 secs = ic->start_time / AV_TIME_BASE;
3121 us = ic->start_time % AV_TIME_BASE;
3122 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3123 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3125 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3127 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3129 av_log(NULL, AV_LOG_INFO, "N/A");
3131 av_log(NULL, AV_LOG_INFO, "\n");
3133 for (i = 0; i < ic->nb_chapters; i++) {
3134 AVChapter *ch = ic->chapters[i];
3135 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3136 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3137 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3139 dump_metadata(NULL, ch->metadata, " ");
3141 if(ic->nb_programs) {
3142 int j, k, total = 0;
3143 for(j=0; j<ic->nb_programs; j++) {
3144 AVMetadataTag *name = av_metadata_get(ic->programs[j]->metadata,
3146 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3147 name ? name->value : "");
3148 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3149 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3150 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3151 printed[ic->programs[j]->stream_index[k]] = 1;
3153 total += ic->programs[j]->nb_stream_indexes;
3155 if (total < ic->nb_streams)
3156 av_log(NULL, AV_LOG_INFO, " No Program\n");
3158 for(i=0;i<ic->nb_streams;i++)
3160 dump_stream_format(ic, i, index, is_output);
3165 #if LIBAVFORMAT_VERSION_MAJOR < 53
3166 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
3168 return av_parse_video_frame_size(width_ptr, height_ptr, str);
3171 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
3173 AVRational frame_rate;
3174 int ret = av_parse_video_frame_rate(&frame_rate, arg);
3175 *frame_rate_num= frame_rate.num;
3176 *frame_rate_den= frame_rate.den;
3181 int64_t av_gettime(void)
3184 gettimeofday(&tv,NULL);
3185 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3188 uint64_t ff_ntp_time(void)
3190 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3193 int64_t parse_date(const char *datestr, int duration)
3199 static const char * const date_fmt[] = {
3203 static const char * const time_fmt[] = {
3213 time_t now = time(0);
3215 len = strlen(datestr);
3217 lastch = datestr[len - 1];
3220 is_utc = (lastch == 'z' || lastch == 'Z');
3222 memset(&dt, 0, sizeof(dt));
3227 if (!strncasecmp(datestr, "now", len))
3228 return (int64_t) now * 1000000;
3230 /* parse the year-month-day part */
3231 for (i = 0; i < FF_ARRAY_ELEMS(date_fmt); i++) {
3232 q = small_strptime(p, date_fmt[i], &dt);
3238 /* if the year-month-day part is missing, then take the
3239 * current year-month-day time */
3244 dt = *localtime(&now);
3246 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
3251 if (*p == 'T' || *p == 't' || *p == ' ')
3254 /* parse the hour-minute-second part */
3255 for (i = 0; i < FF_ARRAY_ELEMS(time_fmt); i++) {
3256 q = small_strptime(p, time_fmt[i], &dt);
3262 /* parse datestr as a duration */
3267 /* parse datestr as HH:MM:SS */
3268 q = small_strptime(p, time_fmt[0], &dt);
3270 /* parse datestr as S+ */
3271 dt.tm_sec = strtol(p, (char **)&q, 10);
3273 /* the parsing didn't succeed */
3280 /* Now we have all the fields that we can get */
3286 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
3288 dt.tm_isdst = -1; /* unknown */
3298 /* parse the .m... part */
3302 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
3305 val += n * (*q - '0');
3309 return negative ? -t : t;
3312 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3322 while (*p != '\0' && *p != '=' && *p != '&') {
3323 if ((q - tag) < sizeof(tag) - 1)
3331 while (*p != '&' && *p != '\0') {
3332 if ((q - arg) < arg_size - 1) {
3342 if (!strcmp(tag, tag1))
3351 int av_get_frame_filename(char *buf, int buf_size,
3352 const char *path, int number)
3355 char *q, buf1[20], c;
3356 int nd, len, percentd_found;
3368 while (isdigit(*p)) {
3369 nd = nd * 10 + *p++ - '0';
3372 } while (isdigit(c));
3381 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3383 if ((q - buf + len) > buf_size - 1)
3385 memcpy(q, buf1, len);
3393 if ((q - buf) < buf_size - 1)
3397 if (!percentd_found)
3406 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3410 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3412 for(i=0;i<size;i+=16) {
3419 PRINT(" %02x", buf[i+j]);
3424 for(j=0;j<len;j++) {
3426 if (c < ' ' || c > '~')
3435 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3437 hex_dump_internal(NULL, f, 0, buf, size);
3440 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3442 hex_dump_internal(avcl, NULL, level, buf, size);
3445 //FIXME needs to know the time_base
3446 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
3449 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3450 PRINT("stream #%d:\n", pkt->stream_index);
3451 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3452 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3453 /* DTS is _always_ valid after av_read_frame() */
3455 if (pkt->dts == AV_NOPTS_VALUE)
3458 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
3459 /* PTS may not be known if B-frames are present. */
3461 if (pkt->pts == AV_NOPTS_VALUE)
3464 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
3466 PRINT(" size=%d\n", pkt->size);
3469 av_hex_dump(f, pkt->data, pkt->size);
3472 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3474 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
3477 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3479 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
3482 void ff_url_split(char *proto, int proto_size,
3483 char *authorization, int authorization_size,
3484 char *hostname, int hostname_size,
3486 char *path, int path_size,
3489 const char *p, *ls, *at, *col, *brk;
3491 if (port_ptr) *port_ptr = -1;
3492 if (proto_size > 0) proto[0] = 0;
3493 if (authorization_size > 0) authorization[0] = 0;
3494 if (hostname_size > 0) hostname[0] = 0;
3495 if (path_size > 0) path[0] = 0;
3497 /* parse protocol */
3498 if ((p = strchr(url, ':'))) {
3499 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3504 /* no protocol means plain filename */
3505 av_strlcpy(path, url, path_size);
3509 /* separate path from hostname */
3510 ls = strchr(p, '/');
3512 ls = strchr(p, '?');
3514 av_strlcpy(path, ls, path_size);
3516 ls = &p[strlen(p)]; // XXX
3518 /* the rest is hostname, use that to parse auth/port */
3520 /* authorization (user[:pass]@hostname) */
3521 if ((at = strchr(p, '@')) && at < ls) {
3522 av_strlcpy(authorization, p,
3523 FFMIN(authorization_size, at + 1 - p));
3524 p = at + 1; /* skip '@' */
3527 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3529 av_strlcpy(hostname, p + 1,
3530 FFMIN(hostname_size, brk - p));
3531 if (brk[1] == ':' && port_ptr)
3532 *port_ptr = atoi(brk + 2);
3533 } else if ((col = strchr(p, ':')) && col < ls) {
3534 av_strlcpy(hostname, p,
3535 FFMIN(col + 1 - p, hostname_size));
3536 if (port_ptr) *port_ptr = atoi(col + 1);
3538 av_strlcpy(hostname, p,
3539 FFMIN(ls + 1 - p, hostname_size));
3543 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3546 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3549 'C', 'D', 'E', 'F' };
3550 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3553 'c', 'd', 'e', 'f' };
3554 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3556 for(i = 0; i < s; i++) {
3557 buff[i * 2] = hex_table[src[i] >> 4];
3558 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3564 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3565 unsigned int pts_num, unsigned int pts_den)
3567 s->pts_wrap_bits = pts_wrap_bits;
3569 if(av_reduce(&s->time_base.num, &s->time_base.den, pts_num, pts_den, INT_MAX)){
3570 if(s->time_base.num != pts_num)
3571 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/s->time_base.num);
3573 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3575 if(!s->time_base.num || !s->time_base.den)
3576 s->time_base.num= s->time_base.den= 0;
3579 int ff_url_join(char *str, int size, const char *proto,
3580 const char *authorization, const char *hostname,
3581 int port, const char *fmt, ...)
3584 struct addrinfo hints, *ai;
3589 av_strlcatf(str, size, "%s://", proto);
3591 av_strlcatf(str, size, "%s@", authorization);
3592 #if CONFIG_NETWORK && defined(AF_INET6)
3593 /* Determine if hostname is a numerical IPv6 address,
3594 * properly escape it within [] in that case. */
3595 memset(&hints, 0, sizeof(hints));
3596 hints.ai_flags = AI_NUMERICHOST;
3597 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3598 if (ai->ai_family == AF_INET6) {
3599 av_strlcat(str, "[", size);
3600 av_strlcat(str, hostname, size);
3601 av_strlcat(str, "]", size);
3603 av_strlcat(str, hostname, size);
3608 /* Not an IPv6 address, just output the plain string. */
3609 av_strlcat(str, hostname, size);
3612 av_strlcatf(str, size, ":%d", port);
3615 int len = strlen(str);
3618 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);