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 "libavcodec/opt.h"
23 #include "libavutil/avstring.h"
32 * @file libavformat/utils.c
33 * various utility functions for use within FFmpeg
36 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den);
37 static void av_frac_add(AVFrac *f, int64_t incr);
39 /** head of registered input format linked list */
40 AVInputFormat *first_iformat = NULL;
41 /** head of registered output format linked list */
42 AVOutputFormat *first_oformat = NULL;
44 AVInputFormat *av_iformat_next(AVInputFormat *f)
47 else return first_iformat;
50 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
53 else return first_oformat;
56 void av_register_input_format(AVInputFormat *format)
60 while (*p != NULL) p = &(*p)->next;
65 void av_register_output_format(AVOutputFormat *format)
69 while (*p != NULL) p = &(*p)->next;
74 int match_ext(const char *filename, const char *extensions)
82 ext = strrchr(filename, '.');
88 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
91 if (!strcasecmp(ext1, ext))
101 AVOutputFormat *guess_format(const char *short_name, const char *filename,
102 const char *mime_type)
104 AVOutputFormat *fmt, *fmt_found;
105 int score_max, score;
107 /* specific test for image sequences */
108 #ifdef CONFIG_IMAGE2_MUXER
109 if (!short_name && filename &&
110 av_filename_number_test(filename) &&
111 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
112 return guess_format("image2", NULL, NULL);
115 /* Find the proper file type. */
119 while (fmt != NULL) {
121 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
123 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
125 if (filename && fmt->extensions &&
126 match_ext(filename, fmt->extensions)) {
129 if (score > score_max) {
138 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
139 const char *mime_type)
141 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
144 AVOutputFormat *stream_fmt;
145 char stream_format_name[64];
147 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
148 stream_fmt = guess_format(stream_format_name, NULL, NULL);
157 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
158 const char *filename, const char *mime_type, enum CodecType type){
159 if(type == CODEC_TYPE_VIDEO){
160 enum CodecID codec_id= CODEC_ID_NONE;
162 #ifdef CONFIG_IMAGE2_MUXER
163 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
164 codec_id= av_guess_image2_codec(filename);
167 if(codec_id == CODEC_ID_NONE)
168 codec_id= fmt->video_codec;
170 }else if(type == CODEC_TYPE_AUDIO)
171 return fmt->audio_codec;
173 return CODEC_ID_NONE;
176 AVInputFormat *av_find_input_format(const char *short_name)
179 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
180 if (!strcmp(fmt->name, short_name))
186 /* memory handling */
188 void av_destruct_packet(AVPacket *pkt)
191 pkt->data = NULL; pkt->size = 0;
194 void av_init_packet(AVPacket *pkt)
196 pkt->pts = AV_NOPTS_VALUE;
197 pkt->dts = AV_NOPTS_VALUE;
201 pkt->stream_index = 0;
202 pkt->destruct= av_destruct_packet_nofree;
205 int av_new_packet(AVPacket *pkt, int size)
208 if((unsigned)size > (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
209 return AVERROR(ENOMEM);
210 data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
212 return AVERROR(ENOMEM);
213 memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
218 pkt->destruct = av_destruct_packet;
222 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
224 int ret= av_new_packet(pkt, size);
229 pkt->pos= url_ftell(s);
231 ret= get_buffer(s, pkt->data, size);
240 int av_dup_packet(AVPacket *pkt)
242 if (pkt->destruct != av_destruct_packet) {
244 /* We duplicate the packet and don't forget to add the padding again. */
245 if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
246 return AVERROR(ENOMEM);
247 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
249 return AVERROR(ENOMEM);
251 memcpy(data, pkt->data, pkt->size);
252 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
254 pkt->destruct = av_destruct_packet;
259 int av_filename_number_test(const char *filename)
262 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
265 static AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
267 AVInputFormat *fmt1, *fmt;
271 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
272 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
275 if (fmt1->read_probe) {
276 score = fmt1->read_probe(pd);
277 } else if (fmt1->extensions) {
278 if (match_ext(pd->filename, fmt1->extensions)) {
282 if (score > *score_max) {
285 }else if (score == *score_max)
291 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
293 return av_probe_input_format2(pd, is_opened, &score);
296 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
299 fmt = av_probe_input_format2(pd, 1, &score);
302 if (strncmp(fmt->name, "mp3", 3) == 0)
303 st->codec->codec_id = CODEC_ID_MP3;
304 else if (strncmp(fmt->name, "ac3", 3) == 0)
305 st->codec->codec_id = CODEC_ID_AC3;
306 else if (!strcmp(fmt->name, "mpegvideo"))
307 st->codec->codec_id = CODEC_ID_MPEG2VIDEO;
308 else if (!strcmp(fmt->name, "h264"))
309 st->codec->codec_id = CODEC_ID_H264;
314 /************************************************************/
315 /* input media file */
318 * Open a media file from an IO stream. 'fmt' must be specified.
320 static const char* format_to_name(void* ptr)
322 AVFormatContext* fc = (AVFormatContext*) ptr;
323 if(fc->iformat) return fc->iformat->name;
324 else if(fc->oformat) return fc->oformat->name;
328 #define OFFSET(x) offsetof(AVFormatContext,x)
329 #define DEFAULT 0 //should be NAN but it does not work as it is not a constant in glibc as required by ANSI/ISO C
330 //these names are too long to be readable
331 #define E AV_OPT_FLAG_ENCODING_PARAM
332 #define D AV_OPT_FLAG_DECODING_PARAM
334 static const AVOption options[]={
335 {"probesize", NULL, OFFSET(probesize), FF_OPT_TYPE_INT, 32000, 32, INT_MAX, D}, /* 32000 from mpegts.c: 1.0 second at 24Mbit/s */
336 {"muxrate", "set mux rate", OFFSET(mux_rate), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
337 {"packetsize", "set packet size", OFFSET(packet_size), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
338 {"fflags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, D|E, "fflags"},
339 {"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_IGNIDX, INT_MIN, INT_MAX, D, "fflags"},
340 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_GENPTS, INT_MIN, INT_MAX, D, "fflags"},
341 {"track", " set the track number", OFFSET(track), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
342 {"year", "set the year", OFFSET(year), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, E},
343 {"analyzeduration", "how many microseconds are analyzed to estimate duration", OFFSET(max_analyze_duration), FF_OPT_TYPE_INT, 3*AV_TIME_BASE, 0, INT_MAX, D},
344 {"cryptokey", "decryption key", OFFSET(key), FF_OPT_TYPE_BINARY, 0, 0, 0, D},
345 {"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size), FF_OPT_TYPE_INT, 1<<20, 0, INT_MAX, D},
346 {"rtbufsize", "max memory used for buffering real-time frames", OFFSET(max_picture_buffer), FF_OPT_TYPE_INT, 3041280, 0, INT_MAX, D}, /* defaults to 1s of 15fps 352x288 YUYV422 video */
347 {"fdebug", "print specific debug info", OFFSET(debug), FF_OPT_TYPE_FLAGS, DEFAULT, 0, INT_MAX, E|D, "fdebug"},
348 {"ts", NULL, 0, FF_OPT_TYPE_CONST, FF_FDEBUG_TS, INT_MIN, INT_MAX, E|D, "fdebug"},
356 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name, options };
358 static void avformat_get_context_defaults(AVFormatContext *s)
360 memset(s, 0, sizeof(AVFormatContext));
362 s->av_class = &av_format_context_class;
364 av_opt_set_defaults(s);
367 AVFormatContext *av_alloc_format_context(void)
370 ic = av_malloc(sizeof(AVFormatContext));
372 avformat_get_context_defaults(ic);
373 ic->av_class = &av_format_context_class;
377 int av_open_input_stream(AVFormatContext **ic_ptr,
378 ByteIOContext *pb, const char *filename,
379 AVInputFormat *fmt, AVFormatParameters *ap)
383 AVFormatParameters default_ap;
387 memset(ap, 0, sizeof(default_ap));
390 if(!ap->prealloced_context)
391 ic = av_alloc_format_context();
395 err = AVERROR(ENOMEM);
400 ic->duration = AV_NOPTS_VALUE;
401 ic->start_time = AV_NOPTS_VALUE;
402 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
404 /* allocate private data */
405 if (fmt->priv_data_size > 0) {
406 ic->priv_data = av_mallocz(fmt->priv_data_size);
407 if (!ic->priv_data) {
408 err = AVERROR(ENOMEM);
412 ic->priv_data = NULL;
415 if (ic->iformat->read_header) {
416 err = ic->iformat->read_header(ic, ap);
421 if (pb && !ic->data_offset)
422 ic->data_offset = url_ftell(ic->pb);
429 av_freep(&ic->priv_data);
430 for(i=0;i<ic->nb_streams;i++) {
431 AVStream *st = ic->streams[i];
433 av_free(st->priv_data);
434 av_free(st->codec->extradata);
444 /** size of probe buffer, for guessing file type from file contents */
445 #define PROBE_BUF_MIN 2048
446 #define PROBE_BUF_MAX (1<<20)
448 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
451 AVFormatParameters *ap)
454 AVProbeData probe_data, *pd = &probe_data;
455 ByteIOContext *pb = NULL;
459 pd->filename = filename;
464 /* guess format if no file can be opened */
465 fmt = av_probe_input_format(pd, 0);
468 /* Do not open file if the format does not need it. XXX: specific
469 hack needed to handle RTSP/TCP */
470 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
471 /* if no file needed do not try to open one */
472 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
476 url_setbufsize(pb, buf_size);
479 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
480 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
481 /* read probe data */
482 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
483 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
484 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
485 if (url_fseek(pb, 0, SEEK_SET) < 0) {
487 if (url_fopen(&pb, filename, URL_RDONLY) < 0) {
493 /* guess file format */
494 fmt = av_probe_input_format2(pd, 1, &score);
499 /* if still no format found, error */
505 /* check filename in case an image number is expected */
506 if (fmt->flags & AVFMT_NEEDNUMBER) {
507 if (!av_filename_number_test(filename)) {
508 err = AVERROR_NUMEXPECTED;
512 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
525 /*******************************************************/
527 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt){
529 AVPacketList **plast_pktl= packet_buffer;
531 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
533 pktl = av_mallocz(sizeof(AVPacketList));
537 /* add the packet in the buffered packet list */
543 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
549 AVPacketList *pktl = s->raw_packet_buffer;
553 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE){
554 s->raw_packet_buffer = pktl->next;
561 ret= s->iformat->read_packet(s, pkt);
564 st= s->streams[pkt->stream_index];
566 if(!pktl && st->codec->codec_id!=CODEC_ID_PROBE)
569 add_to_pktbuf(&s->raw_packet_buffer, pkt);
571 switch(st->codec->codec_type){
572 case CODEC_TYPE_VIDEO:
573 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
575 case CODEC_TYPE_AUDIO:
576 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
578 case CODEC_TYPE_SUBTITLE:
579 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
583 if(st->codec->codec_id == CODEC_ID_PROBE){
584 AVProbeData *pd = &st->probe_data;
586 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
587 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
588 pd->buf_size += pkt->size;
589 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
591 set_codec_from_probe_data(st, pd, 1);
592 if(st->codec->codec_id != CODEC_ID_PROBE){
600 /**********************************************************/
603 * Get the number of samples of an audio frame. Return -1 on error.
605 static int get_audio_frame_size(AVCodecContext *enc, int size)
609 if(enc->codec_id == CODEC_ID_VORBIS)
612 if (enc->frame_size <= 1) {
613 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
615 if (bits_per_sample) {
616 if (enc->channels == 0)
618 frame_size = (size << 3) / (bits_per_sample * enc->channels);
620 /* used for example by ADPCM codecs */
621 if (enc->bit_rate == 0)
623 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
626 frame_size = enc->frame_size;
633 * Return the frame duration in seconds. Return 0 if not available.
635 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
636 AVCodecParserContext *pc, AVPacket *pkt)
642 switch(st->codec->codec_type) {
643 case CODEC_TYPE_VIDEO:
644 if(st->time_base.num*1000LL > st->time_base.den){
645 *pnum = st->time_base.num;
646 *pden = st->time_base.den;
647 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
648 *pnum = st->codec->time_base.num;
649 *pden = st->codec->time_base.den;
650 if (pc && pc->repeat_pict) {
652 *pnum = (*pnum) * (2 + pc->repeat_pict);
656 case CODEC_TYPE_AUDIO:
657 frame_size = get_audio_frame_size(st->codec, pkt->size);
661 *pden = st->codec->sample_rate;
668 static int is_intra_only(AVCodecContext *enc){
669 if(enc->codec_type == CODEC_TYPE_AUDIO){
671 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
672 switch(enc->codec_id){
674 case CODEC_ID_MJPEGB:
676 case CODEC_ID_RAWVIDEO:
677 case CODEC_ID_DVVIDEO:
678 case CODEC_ID_HUFFYUV:
679 case CODEC_ID_FFVHUFF:
690 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
691 int64_t dts, int64_t pts)
693 AVStream *st= s->streams[stream_index];
694 AVPacketList *pktl= s->packet_buffer;
696 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
699 st->first_dts= dts - st->cur_dts;
702 for(; pktl; pktl= pktl->next){
703 if(pktl->pkt.stream_index != stream_index)
705 //FIXME think more about this check
706 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
707 pktl->pkt.pts += st->first_dts;
709 if(pktl->pkt.dts != AV_NOPTS_VALUE)
710 pktl->pkt.dts += st->first_dts;
712 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
713 st->start_time= pktl->pkt.pts;
715 if (st->start_time == AV_NOPTS_VALUE)
716 st->start_time = pts;
719 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
721 AVPacketList *pktl= s->packet_buffer;
724 if(st->first_dts != AV_NOPTS_VALUE){
725 cur_dts= st->first_dts;
726 for(; pktl; pktl= pktl->next){
727 if(pktl->pkt.stream_index == pkt->stream_index){
728 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
730 cur_dts -= pkt->duration;
733 pktl= s->packet_buffer;
734 st->first_dts = cur_dts;
735 }else if(st->cur_dts)
738 for(; pktl; pktl= pktl->next){
739 if(pktl->pkt.stream_index != pkt->stream_index)
741 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
742 && !pktl->pkt.duration){
743 pktl->pkt.dts= cur_dts;
744 if(!st->codec->has_b_frames)
745 pktl->pkt.pts= cur_dts;
746 cur_dts += pkt->duration;
747 pktl->pkt.duration= pkt->duration;
751 if(st->first_dts == AV_NOPTS_VALUE)
752 st->cur_dts= cur_dts;
755 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
756 AVCodecParserContext *pc, AVPacket *pkt)
758 int num, den, presentation_delayed, delay, i;
761 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
762 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
763 pkt->dts -= 1LL<<st->pts_wrap_bits;
766 if (pkt->duration == 0) {
767 compute_frame_duration(&num, &den, st, pc, pkt);
769 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
771 if(pkt->duration != 0 && s->packet_buffer)
772 update_initial_durations(s, st, pkt);
776 /* correct timestamps with byte offset if demuxers only have timestamps
777 on packet boundaries */
778 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
779 /* this will estimate bitrate based on this frame's duration and size */
780 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
781 if(pkt->pts != AV_NOPTS_VALUE)
783 if(pkt->dts != AV_NOPTS_VALUE)
787 /* do we have a video B-frame ? */
788 delay= st->codec->has_b_frames;
789 presentation_delayed = 0;
790 /* XXX: need has_b_frame, but cannot get it if the codec is
793 pc && pc->pict_type != FF_B_TYPE)
794 presentation_delayed = 1;
795 /* This may be redundant, but it should not hurt. */
796 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
797 presentation_delayed = 1;
799 // 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);
800 /* interpolate PTS and DTS if they are not present */
801 if(delay==0 || (delay==1 && pc)){
802 if (presentation_delayed) {
803 /* DTS = decompression timestamp */
804 /* PTS = presentation timestamp */
805 if (pkt->dts == AV_NOPTS_VALUE)
806 pkt->dts = st->last_IP_pts;
807 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
808 if (pkt->dts == AV_NOPTS_VALUE)
809 pkt->dts = st->cur_dts;
811 /* this is tricky: the dts must be incremented by the duration
812 of the frame we are displaying, i.e. the last I- or P-frame */
813 if (st->last_IP_duration == 0)
814 st->last_IP_duration = pkt->duration;
815 if(pkt->dts != AV_NOPTS_VALUE)
816 st->cur_dts = pkt->dts + st->last_IP_duration;
817 st->last_IP_duration = pkt->duration;
818 st->last_IP_pts= pkt->pts;
819 /* cannot compute PTS if not present (we can compute it only
820 by knowing the future */
821 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
822 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
823 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
824 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
825 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
826 pkt->pts += pkt->duration;
827 // 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);
831 /* presentation is not delayed : PTS and DTS are the same */
832 if(pkt->pts == AV_NOPTS_VALUE)
834 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
835 if(pkt->pts == AV_NOPTS_VALUE)
836 pkt->pts = st->cur_dts;
838 if(pkt->pts != AV_NOPTS_VALUE)
839 st->cur_dts = pkt->pts + pkt->duration;
843 if(pkt->pts != AV_NOPTS_VALUE){
844 st->pts_buffer[0]= pkt->pts;
845 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
846 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
847 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
848 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
849 if(pkt->dts == AV_NOPTS_VALUE)
850 pkt->dts= st->pts_buffer[0];
852 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
854 if(pkt->dts > st->cur_dts)
855 st->cur_dts = pkt->dts;
858 // 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);
861 if(is_intra_only(st->codec))
862 pkt->flags |= PKT_FLAG_KEY;
865 /* keyframe computation */
866 if (pc->pict_type == FF_I_TYPE)
867 pkt->flags |= PKT_FLAG_KEY;
871 void av_destruct_packet_nofree(AVPacket *pkt)
873 pkt->data = NULL; pkt->size = 0;
876 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
884 /* select current input stream component */
887 if (!st->need_parsing || !st->parser) {
888 /* no parsing needed: we just output the packet as is */
889 /* raw data support */
891 compute_pkt_fields(s, st, NULL, pkt);
894 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
895 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
896 s->cur_ptr, s->cur_len,
897 s->cur_pkt.pts, s->cur_pkt.dts);
898 s->cur_pkt.pts = AV_NOPTS_VALUE;
899 s->cur_pkt.dts = AV_NOPTS_VALUE;
900 /* increment read pointer */
904 /* return packet if any */
907 pkt->pos = s->cur_pkt.pos; // Isn't quite accurate but close.
909 pkt->stream_index = st->index;
910 pkt->pts = st->parser->pts;
911 pkt->dts = st->parser->dts;
912 pkt->destruct = av_destruct_packet_nofree;
913 compute_pkt_fields(s, st, st->parser, pkt);
915 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
916 ff_reduce_index(s, st->index);
917 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
918 0, 0, AVINDEX_KEYFRAME);
925 av_free_packet(&s->cur_pkt);
929 /* read next packet */
930 ret = av_read_packet(s, &s->cur_pkt);
932 if (ret == AVERROR(EAGAIN))
934 /* return the last frames, if any */
935 for(i = 0; i < s->nb_streams; i++) {
937 if (st->parser && st->need_parsing) {
938 av_parser_parse(st->parser, st->codec,
939 &pkt->data, &pkt->size,
941 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
946 /* no more packets: really terminate parsing */
950 if(s->cur_pkt.pts != AV_NOPTS_VALUE &&
951 s->cur_pkt.dts != AV_NOPTS_VALUE &&
952 s->cur_pkt.pts < s->cur_pkt.dts){
953 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
954 s->cur_pkt.stream_index,
958 // av_free_packet(&s->cur_pkt);
962 st = s->streams[s->cur_pkt.stream_index];
963 if(s->debug & FF_FDEBUG_TS)
964 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, flags=%d\n",
965 s->cur_pkt.stream_index,
972 s->cur_ptr = s->cur_pkt.data;
973 s->cur_len = s->cur_pkt.size;
974 if (st->need_parsing && !st->parser) {
975 st->parser = av_parser_init(st->codec->codec_id);
977 /* no parser available: just output the raw packets */
978 st->need_parsing = AVSTREAM_PARSE_NONE;
979 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
980 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
982 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
983 st->parser->next_frame_offset=
984 st->parser->cur_offset= s->cur_pkt.pos;
989 if(s->debug & FF_FDEBUG_TS)
990 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, flags=%d\n",
1000 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1004 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1007 pktl = s->packet_buffer;
1009 AVPacket *next_pkt= &pktl->pkt;
1011 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1012 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1013 if( pktl->pkt.stream_index == next_pkt->stream_index
1014 && next_pkt->dts < pktl->pkt.dts
1015 && pktl->pkt.pts != pktl->pkt.dts //not b frame
1016 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1017 next_pkt->pts= pktl->pkt.dts;
1021 pktl = s->packet_buffer;
1024 if( next_pkt->pts != AV_NOPTS_VALUE
1025 || next_pkt->dts == AV_NOPTS_VALUE
1027 /* read packet from packet buffer, if there is data */
1029 s->packet_buffer = pktl->next;
1035 int ret= av_read_frame_internal(s, pkt);
1037 if(pktl && ret != AVERROR(EAGAIN)){
1044 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt)) < 0)
1045 return AVERROR(ENOMEM);
1047 assert(!s->packet_buffer);
1048 return av_read_frame_internal(s, pkt);
1053 /* XXX: suppress the packet queue */
1054 static void flush_packet_queue(AVFormatContext *s)
1059 pktl = s->packet_buffer;
1062 s->packet_buffer = pktl->next;
1063 av_free_packet(&pktl->pkt);
1068 /*******************************************************/
1071 int av_find_default_stream_index(AVFormatContext *s)
1073 int first_audio_index = -1;
1077 if (s->nb_streams <= 0)
1079 for(i = 0; i < s->nb_streams; i++) {
1081 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1084 if (first_audio_index < 0 && st->codec->codec_type == CODEC_TYPE_AUDIO)
1085 first_audio_index = i;
1087 return first_audio_index >= 0 ? first_audio_index : 0;
1091 * Flush the frame reader.
1093 static void av_read_frame_flush(AVFormatContext *s)
1098 flush_packet_queue(s);
1100 /* free previous packet */
1102 if (s->cur_st->parser)
1103 av_free_packet(&s->cur_pkt);
1110 /* for each stream, reset read state */
1111 for(i = 0; i < s->nb_streams; i++) {
1115 av_parser_close(st->parser);
1118 st->last_IP_pts = AV_NOPTS_VALUE;
1119 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1123 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1126 for(i = 0; i < s->nb_streams; i++) {
1127 AVStream *st = s->streams[i];
1129 st->cur_dts = av_rescale(timestamp,
1130 st->time_base.den * (int64_t)ref_st->time_base.num,
1131 st->time_base.num * (int64_t)ref_st->time_base.den);
1135 void ff_reduce_index(AVFormatContext *s, int stream_index)
1137 AVStream *st= s->streams[stream_index];
1138 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1140 if((unsigned)st->nb_index_entries >= max_entries){
1142 for(i=0; 2*i<st->nb_index_entries; i++)
1143 st->index_entries[i]= st->index_entries[2*i];
1144 st->nb_index_entries= i;
1148 int av_add_index_entry(AVStream *st,
1149 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1151 AVIndexEntry *entries, *ie;
1154 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1157 entries = av_fast_realloc(st->index_entries,
1158 &st->index_entries_allocated_size,
1159 (st->nb_index_entries + 1) *
1160 sizeof(AVIndexEntry));
1164 st->index_entries= entries;
1166 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1169 index= st->nb_index_entries++;
1170 ie= &entries[index];
1171 assert(index==0 || ie[-1].timestamp < timestamp);
1173 ie= &entries[index];
1174 if(ie->timestamp != timestamp){
1175 if(ie->timestamp <= timestamp)
1177 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1178 st->nb_index_entries++;
1179 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1180 distance= ie->min_distance;
1184 ie->timestamp = timestamp;
1185 ie->min_distance= distance;
1192 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1195 AVIndexEntry *entries= st->index_entries;
1196 int nb_entries= st->nb_index_entries;
1205 timestamp = entries[m].timestamp;
1206 if(timestamp >= wanted_timestamp)
1208 if(timestamp <= wanted_timestamp)
1211 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1213 if(!(flags & AVSEEK_FLAG_ANY)){
1214 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1215 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1226 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1227 AVInputFormat *avif= s->iformat;
1228 int64_t pos_min, pos_max, pos, pos_limit;
1229 int64_t ts_min, ts_max, ts;
1233 if (stream_index < 0)
1237 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1241 ts_min= AV_NOPTS_VALUE;
1242 pos_limit= -1; //gcc falsely says it may be uninitialized
1244 st= s->streams[stream_index];
1245 if(st->index_entries){
1248 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()
1249 index= FFMAX(index, 0);
1250 e= &st->index_entries[index];
1252 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1254 ts_min= e->timestamp;
1256 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1263 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1264 assert(index < st->nb_index_entries);
1266 e= &st->index_entries[index];
1267 assert(e->timestamp >= target_ts);
1269 ts_max= e->timestamp;
1270 pos_limit= pos_max - e->min_distance;
1272 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1273 pos_max,pos_limit, ts_max);
1278 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1283 url_fseek(s->pb, pos, SEEK_SET);
1285 av_update_cur_dts(s, st, ts);
1290 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 )){
1292 int64_t start_pos, filesize;
1296 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1299 if(ts_min == AV_NOPTS_VALUE){
1300 pos_min = s->data_offset;
1301 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1302 if (ts_min == AV_NOPTS_VALUE)
1306 if(ts_max == AV_NOPTS_VALUE){
1308 filesize = url_fsize(s->pb);
1309 pos_max = filesize - 1;
1312 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1314 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1315 if (ts_max == AV_NOPTS_VALUE)
1319 int64_t tmp_pos= pos_max + 1;
1320 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1321 if(tmp_ts == AV_NOPTS_VALUE)
1325 if(tmp_pos >= filesize)
1331 if(ts_min > ts_max){
1333 }else if(ts_min == ts_max){
1338 while (pos_min < pos_limit) {
1340 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1344 assert(pos_limit <= pos_max);
1347 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1348 // interpolate position (better than dichotomy)
1349 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1350 + pos_min - approximate_keyframe_distance;
1351 }else if(no_change==1){
1352 // bisection, if interpolation failed to change min or max pos last time
1353 pos = (pos_min + pos_limit)>>1;
1355 /* linear search if bisection failed, can only happen if there
1356 are very few or no keyframes between min/max */
1361 else if(pos > pos_limit)
1365 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1371 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n", pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit, start_pos, no_change);
1373 if(ts == AV_NOPTS_VALUE){
1374 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1377 assert(ts != AV_NOPTS_VALUE);
1378 if (target_ts <= ts) {
1379 pos_limit = start_pos - 1;
1383 if (target_ts >= ts) {
1389 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1390 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1393 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1395 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1396 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1397 pos, ts_min, target_ts, ts_max);
1403 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1404 int64_t pos_min, pos_max;
1408 if (stream_index < 0)
1411 st= s->streams[stream_index];
1414 pos_min = s->data_offset;
1415 pos_max = url_fsize(s->pb) - 1;
1417 if (pos < pos_min) pos= pos_min;
1418 else if(pos > pos_max) pos= pos_max;
1420 url_fseek(s->pb, pos, SEEK_SET);
1423 av_update_cur_dts(s, st, ts);
1428 static int av_seek_frame_generic(AVFormatContext *s,
1429 int stream_index, int64_t timestamp, int flags)
1435 st = s->streams[stream_index];
1437 index = av_index_search_timestamp(st, timestamp, flags);
1439 if(index < 0 || index==st->nb_index_entries-1){
1443 if(st->nb_index_entries){
1444 assert(st->index_entries);
1445 ie= &st->index_entries[st->nb_index_entries-1];
1446 url_fseek(s->pb, ie->pos, SEEK_SET);
1447 av_update_cur_dts(s, st, ie->timestamp);
1449 url_fseek(s->pb, 0, SEEK_SET);
1452 int ret = av_read_frame(s, &pkt);
1455 av_free_packet(&pkt);
1456 if(stream_index == pkt.stream_index){
1457 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1461 index = av_index_search_timestamp(st, timestamp, flags);
1466 av_read_frame_flush(s);
1467 if (s->iformat->read_seek){
1468 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1471 ie = &st->index_entries[index];
1472 url_fseek(s->pb, ie->pos, SEEK_SET);
1474 av_update_cur_dts(s, st, ie->timestamp);
1479 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1484 av_read_frame_flush(s);
1486 if(flags & AVSEEK_FLAG_BYTE)
1487 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1489 if(stream_index < 0){
1490 stream_index= av_find_default_stream_index(s);
1491 if(stream_index < 0)
1494 st= s->streams[stream_index];
1495 /* timestamp for default must be expressed in AV_TIME_BASE units */
1496 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1498 st= s->streams[stream_index];
1500 /* first, we try the format specific seek */
1501 if (s->iformat->read_seek)
1502 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1509 if(s->iformat->read_timestamp)
1510 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1512 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1515 /*******************************************************/
1518 * Returns TRUE if the stream has accurate duration in any stream.
1520 * @return TRUE if the stream has accurate duration for at least one component.
1522 static int av_has_duration(AVFormatContext *ic)
1527 for(i = 0;i < ic->nb_streams; i++) {
1528 st = ic->streams[i];
1529 if (st->duration != AV_NOPTS_VALUE)
1536 * Estimate the stream timings from the one of each components.
1538 * Also computes the global bitrate if possible.
1540 static void av_update_stream_timings(AVFormatContext *ic)
1542 int64_t start_time, start_time1, end_time, end_time1;
1543 int64_t duration, duration1;
1547 start_time = INT64_MAX;
1548 end_time = INT64_MIN;
1549 duration = INT64_MIN;
1550 for(i = 0;i < ic->nb_streams; i++) {
1551 st = ic->streams[i];
1552 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1553 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1554 if (start_time1 < start_time)
1555 start_time = start_time1;
1556 if (st->duration != AV_NOPTS_VALUE) {
1557 end_time1 = start_time1
1558 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1559 if (end_time1 > end_time)
1560 end_time = end_time1;
1563 if (st->duration != AV_NOPTS_VALUE) {
1564 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1565 if (duration1 > duration)
1566 duration = duration1;
1569 if (start_time != INT64_MAX) {
1570 ic->start_time = start_time;
1571 if (end_time != INT64_MIN) {
1572 if (end_time - start_time > duration)
1573 duration = end_time - start_time;
1576 if (duration != INT64_MIN) {
1577 ic->duration = duration;
1578 if (ic->file_size > 0) {
1579 /* compute the bitrate */
1580 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1581 (double)ic->duration;
1586 static void fill_all_stream_timings(AVFormatContext *ic)
1591 av_update_stream_timings(ic);
1592 for(i = 0;i < ic->nb_streams; i++) {
1593 st = ic->streams[i];
1594 if (st->start_time == AV_NOPTS_VALUE) {
1595 if(ic->start_time != AV_NOPTS_VALUE)
1596 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1597 if(ic->duration != AV_NOPTS_VALUE)
1598 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1603 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1605 int64_t filesize, duration;
1609 /* if bit_rate is already set, we believe it */
1610 if (ic->bit_rate == 0) {
1612 for(i=0;i<ic->nb_streams;i++) {
1613 st = ic->streams[i];
1614 bit_rate += st->codec->bit_rate;
1616 ic->bit_rate = bit_rate;
1619 /* if duration is already set, we believe it */
1620 if (ic->duration == AV_NOPTS_VALUE &&
1621 ic->bit_rate != 0 &&
1622 ic->file_size != 0) {
1623 filesize = ic->file_size;
1625 for(i = 0; i < ic->nb_streams; i++) {
1626 st = ic->streams[i];
1627 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1628 if (st->duration == AV_NOPTS_VALUE)
1629 st->duration = duration;
1635 #define DURATION_MAX_READ_SIZE 250000
1637 /* only usable for MPEG-PS streams */
1638 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1640 AVPacket pkt1, *pkt = &pkt1;
1642 int read_size, i, ret;
1644 int64_t filesize, offset, duration;
1646 /* free previous packet */
1647 if (ic->cur_st && ic->cur_st->parser)
1648 av_free_packet(&ic->cur_pkt);
1651 /* flush packet queue */
1652 flush_packet_queue(ic);
1654 for(i=0;i<ic->nb_streams;i++) {
1655 st = ic->streams[i];
1657 av_parser_close(st->parser);
1662 /* we read the first packets to get the first PTS (not fully
1663 accurate, but it is enough now) */
1664 url_fseek(ic->pb, 0, SEEK_SET);
1667 if (read_size >= DURATION_MAX_READ_SIZE)
1669 /* if all info is available, we can stop */
1670 for(i = 0;i < ic->nb_streams; i++) {
1671 st = ic->streams[i];
1672 if (st->start_time == AV_NOPTS_VALUE)
1675 if (i == ic->nb_streams)
1678 ret = av_read_packet(ic, pkt);
1681 read_size += pkt->size;
1682 st = ic->streams[pkt->stream_index];
1683 if (pkt->pts != AV_NOPTS_VALUE) {
1684 if (st->start_time == AV_NOPTS_VALUE)
1685 st->start_time = pkt->pts;
1687 av_free_packet(pkt);
1690 /* estimate the end time (duration) */
1691 /* XXX: may need to support wrapping */
1692 filesize = ic->file_size;
1693 offset = filesize - DURATION_MAX_READ_SIZE;
1697 url_fseek(ic->pb, offset, SEEK_SET);
1700 if (read_size >= DURATION_MAX_READ_SIZE)
1703 ret = av_read_packet(ic, pkt);
1706 read_size += pkt->size;
1707 st = ic->streams[pkt->stream_index];
1708 if (pkt->pts != AV_NOPTS_VALUE &&
1709 st->start_time != AV_NOPTS_VALUE) {
1710 end_time = pkt->pts;
1711 duration = end_time - st->start_time;
1713 if (st->duration == AV_NOPTS_VALUE ||
1714 st->duration < duration)
1715 st->duration = duration;
1718 av_free_packet(pkt);
1721 fill_all_stream_timings(ic);
1723 url_fseek(ic->pb, old_offset, SEEK_SET);
1724 for(i=0; i<ic->nb_streams; i++){
1726 st->cur_dts= st->first_dts;
1727 st->last_IP_pts = AV_NOPTS_VALUE;
1731 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1735 /* get the file size, if possible */
1736 if (ic->iformat->flags & AVFMT_NOFILE) {
1739 file_size = url_fsize(ic->pb);
1743 ic->file_size = file_size;
1745 if ((!strcmp(ic->iformat->name, "mpeg") ||
1746 !strcmp(ic->iformat->name, "mpegts")) &&
1747 file_size && !url_is_streamed(ic->pb)) {
1748 /* get accurate estimate from the PTSes */
1749 av_estimate_timings_from_pts(ic, old_offset);
1750 } else if (av_has_duration(ic)) {
1751 /* at least one component has timings - we use them for all
1753 fill_all_stream_timings(ic);
1755 /* less precise: use bitrate info */
1756 av_estimate_timings_from_bit_rate(ic);
1758 av_update_stream_timings(ic);
1764 for(i = 0;i < ic->nb_streams; i++) {
1765 st = ic->streams[i];
1766 printf("%d: start_time: %0.3f duration: %0.3f\n",
1767 i, (double)st->start_time / AV_TIME_BASE,
1768 (double)st->duration / AV_TIME_BASE);
1770 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1771 (double)ic->start_time / AV_TIME_BASE,
1772 (double)ic->duration / AV_TIME_BASE,
1773 ic->bit_rate / 1000);
1778 static int has_codec_parameters(AVCodecContext *enc)
1781 switch(enc->codec_type) {
1782 case CODEC_TYPE_AUDIO:
1783 val = enc->sample_rate && enc->channels;
1784 if(!enc->frame_size &&
1785 (enc->codec_id == CODEC_ID_VORBIS ||
1786 enc->codec_id == CODEC_ID_AAC))
1789 case CODEC_TYPE_VIDEO:
1790 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1796 return enc->codec_id != CODEC_ID_NONE && val != 0;
1799 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1803 int got_picture, data_size, ret=0;
1806 if(!st->codec->codec){
1807 codec = avcodec_find_decoder(st->codec->codec_id);
1810 ret = avcodec_open(st->codec, codec);
1815 if(!has_codec_parameters(st->codec)){
1816 switch(st->codec->codec_type) {
1817 case CODEC_TYPE_VIDEO:
1818 ret = avcodec_decode_video(st->codec, &picture,
1819 &got_picture, data, size);
1821 case CODEC_TYPE_AUDIO:
1822 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1823 samples = av_malloc(data_size);
1826 ret = avcodec_decode_audio2(st->codec, samples,
1827 &data_size, data, size);
1838 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1840 while (tags->id != CODEC_ID_NONE) {
1848 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1851 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1852 if(tag == tags[i].tag)
1855 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1856 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1857 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1858 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1859 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1862 return CODEC_ID_NONE;
1865 unsigned int av_codec_get_tag(const AVCodecTag *tags[4], enum CodecID id)
1868 for(i=0; tags && tags[i]; i++){
1869 int tag= codec_get_tag(tags[i], id);
1875 enum CodecID av_codec_get_id(const AVCodecTag *tags[4], unsigned int tag)
1878 for(i=0; tags && tags[i]; i++){
1879 enum CodecID id= codec_get_id(tags[i], tag);
1880 if(id!=CODEC_ID_NONE) return id;
1882 return CODEC_ID_NONE;
1885 static void compute_chapters_end(AVFormatContext *s)
1889 for (i=0; i+1<s->nb_chapters; i++)
1890 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
1891 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
1892 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
1893 s->chapters[i]->end = s->chapters[i+1]->start;
1896 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
1897 assert(s->start_time != AV_NOPTS_VALUE);
1898 assert(s->duration > 0);
1899 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
1901 s->chapters[i]->time_base);
1905 /* absolute maximum size we read until we abort */
1906 #define MAX_READ_SIZE 5000000
1908 #define MAX_STD_TIMEBASES (60*12+5)
1909 static int get_std_framerate(int i){
1910 if(i<60*12) return i*1001;
1911 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
1915 * Is the time base unreliable.
1916 * This is a heuristic to balance between quick acceptance of the values in
1917 * the headers vs. some extra checks.
1918 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
1919 * MPEG-2 commonly misuses field repeat flags to store different framerates.
1920 * And there are "variable" fps files this needs to detect as well.
1922 static int tb_unreliable(AVCodecContext *c){
1923 if( c->time_base.den >= 101L*c->time_base.num
1924 || c->time_base.den < 5L*c->time_base.num
1925 /* || c->codec_tag == ff_get_fourcc("DIVX")
1926 || c->codec_tag == ff_get_fourcc("XVID")*/
1927 || c->codec_id == CODEC_ID_MPEG2VIDEO)
1932 int av_find_stream_info(AVFormatContext *ic)
1934 int i, count, ret, read_size, j;
1936 AVPacket pkt1, *pkt;
1937 int64_t last_dts[MAX_STREAMS];
1938 int duration_count[MAX_STREAMS]={0};
1939 double (*duration_error)[MAX_STD_TIMEBASES];
1940 offset_t old_offset = url_ftell(ic->pb);
1941 int64_t codec_info_duration[MAX_STREAMS]={0};
1942 int codec_info_nb_frames[MAX_STREAMS]={0};
1943 AVProbeData probe_data[MAX_STREAMS];
1944 int codec_identified[MAX_STREAMS]={0};
1946 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1947 if (!duration_error) return AVERROR(ENOMEM);
1949 for(i=0;i<ic->nb_streams;i++) {
1950 st = ic->streams[i];
1951 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1952 /* if(!st->time_base.num)
1954 if(!st->codec->time_base.num)
1955 st->codec->time_base= st->time_base;
1957 //only for the split stuff
1959 st->parser = av_parser_init(st->codec->codec_id);
1960 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1961 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1966 for(i=0;i<MAX_STREAMS;i++){
1967 last_dts[i]= AV_NOPTS_VALUE;
1970 memset(probe_data, 0, sizeof(probe_data));
1974 /* check if one codec still needs to be handled */
1975 for(i=0;i<ic->nb_streams;i++) {
1976 st = ic->streams[i];
1977 if (!has_codec_parameters(st->codec))
1979 /* variable fps and no guess at the real fps */
1980 if( tb_unreliable(st->codec)
1981 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1983 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1985 if(st->first_dts == AV_NOPTS_VALUE)
1988 if (i == ic->nb_streams) {
1989 /* NOTE: if the format has no header, then we need to read
1990 some packets to get most of the streams, so we cannot
1992 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1993 /* if we found the info for all the codecs, we can stop */
1998 /* we did not get all the codec info, but we read too much data */
1999 if (read_size >= MAX_READ_SIZE) {
2004 /* NOTE: a new stream can be added there if no header in file
2005 (AVFMTCTX_NOHEADER) */
2006 ret = av_read_frame_internal(ic, &pkt1);
2009 ret = -1; /* we could not have all the codec parameters before EOF */
2010 for(i=0;i<ic->nb_streams;i++) {
2011 st = ic->streams[i];
2012 if (!has_codec_parameters(st->codec)){
2014 avcodec_string(buf, sizeof(buf), st->codec, 0);
2015 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
2023 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1);
2024 if(av_dup_packet(pkt) < 0)
2025 return AVERROR(ENOMEM);
2027 read_size += pkt->size;
2029 st = ic->streams[pkt->stream_index];
2030 if(codec_info_nb_frames[st->index]>1)
2031 codec_info_duration[st->index] += pkt->duration;
2032 if (pkt->duration != 0)
2033 codec_info_nb_frames[st->index]++;
2036 int index= pkt->stream_index;
2037 int64_t last= last_dts[index];
2038 int64_t duration= pkt->dts - last;
2040 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2041 double dur= duration * av_q2d(st->time_base);
2043 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2044 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2045 if(duration_count[index] < 2)
2046 memset(duration_error[index], 0, sizeof(*duration_error));
2047 for(i=1; i<MAX_STD_TIMEBASES; i++){
2048 int framerate= get_std_framerate(i);
2049 int ticks= lrintf(dur*framerate/(1001*12));
2050 double error= dur - ticks*1001*12/(double)framerate;
2051 duration_error[index][i] += error*error;
2053 duration_count[index]++;
2055 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
2056 last_dts[pkt->stream_index]= pkt->dts;
2058 if (st->codec->codec_id == CODEC_ID_NONE) {
2059 AVProbeData *pd = &(probe_data[st->index]);
2060 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
2061 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
2062 pd->buf_size += pkt->size;
2063 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
2066 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2067 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2069 st->codec->extradata_size= i;
2070 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2071 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2072 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2076 /* if still no information, we try to open the codec and to
2077 decompress the frame. We try to avoid that in most cases as
2078 it takes longer and uses more memory. For MPEG-4, we need to
2079 decompress for QuickTime. */
2080 if (!has_codec_parameters(st->codec) /*&&
2081 (st->codec->codec_id == CODEC_ID_FLV1 ||
2082 st->codec->codec_id == CODEC_ID_H264 ||
2083 st->codec->codec_id == CODEC_ID_H263 ||
2084 st->codec->codec_id == CODEC_ID_H261 ||
2085 st->codec->codec_id == CODEC_ID_VORBIS ||
2086 st->codec->codec_id == CODEC_ID_MJPEG ||
2087 st->codec->codec_id == CODEC_ID_PNG ||
2088 st->codec->codec_id == CODEC_ID_PAM ||
2089 st->codec->codec_id == CODEC_ID_PGM ||
2090 st->codec->codec_id == CODEC_ID_PGMYUV ||
2091 st->codec->codec_id == CODEC_ID_PBM ||
2092 st->codec->codec_id == CODEC_ID_PPM ||
2093 st->codec->codec_id == CODEC_ID_SHORTEN ||
2094 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2095 try_decode_frame(st, pkt->data, pkt->size);
2097 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) {
2103 // close codecs which were opened in try_decode_frame()
2104 for(i=0;i<ic->nb_streams;i++) {
2105 st = ic->streams[i];
2106 if(st->codec->codec)
2107 avcodec_close(st->codec);
2109 for(i=0;i<ic->nb_streams;i++) {
2110 st = ic->streams[i];
2111 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2112 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
2113 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2115 if(duration_count[i]
2116 && tb_unreliable(st->codec) /*&&
2117 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2118 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2119 double best_error= 2*av_q2d(st->time_base);
2120 best_error= best_error*best_error*duration_count[i]*1000*12*30;
2122 for(j=1; j<MAX_STD_TIMEBASES; j++){
2123 double error= duration_error[i][j] * get_std_framerate(j);
2124 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2125 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2126 if(error < best_error){
2128 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
2133 if (!st->r_frame_rate.num){
2134 if( st->codec->time_base.den * (int64_t)st->time_base.num
2135 <= st->codec->time_base.num * (int64_t)st->time_base.den){
2136 st->r_frame_rate.num = st->codec->time_base.den;
2137 st->r_frame_rate.den = st->codec->time_base.num;
2139 st->r_frame_rate.num = st->time_base.den;
2140 st->r_frame_rate.den = st->time_base.num;
2143 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
2144 if (st->codec->codec_id == CODEC_ID_NONE && probe_data[st->index].buf_size > 0) {
2145 codec_identified[st->index] = set_codec_from_probe_data(st, &(probe_data[st->index]), 1);
2146 if (codec_identified[st->index]) {
2147 st->need_parsing = AVSTREAM_PARSE_FULL;
2150 if(!st->codec->bits_per_sample)
2151 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
2155 av_estimate_timings(ic, old_offset);
2157 for(i=0;i<ic->nb_streams;i++) {
2158 st = ic->streams[i];
2159 if (codec_identified[st->index])
2162 //FIXME this is a mess
2163 if(i!=ic->nb_streams){
2164 av_read_frame_flush(ic);
2165 for(i=0;i<ic->nb_streams;i++) {
2166 st = ic->streams[i];
2167 if (codec_identified[st->index]) {
2168 av_seek_frame(ic, st->index, 0.0, 0);
2170 st->cur_dts= st->first_dts;
2172 url_fseek(ic->pb, ic->data_offset, SEEK_SET);
2175 compute_chapters_end(ic);
2178 /* correct DTS for B-frame streams with no timestamps */
2179 for(i=0;i<ic->nb_streams;i++) {
2180 st = ic->streams[i];
2181 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2183 ppktl = &ic->packet_buffer;
2185 if(ppkt1->stream_index != i)
2187 if(ppkt1->pkt->dts < 0)
2189 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2191 ppkt1->pkt->dts -= delta;
2196 st->cur_dts -= delta;
2202 av_free(duration_error);
2203 for(i=0;i<MAX_STREAMS;i++){
2204 av_freep(&(probe_data[i].buf));
2210 /*******************************************************/
2212 int av_read_play(AVFormatContext *s)
2214 if (s->iformat->read_play)
2215 return s->iformat->read_play(s);
2217 return av_url_read_fpause(s->pb, 0);
2218 return AVERROR(ENOSYS);
2221 int av_read_pause(AVFormatContext *s)
2223 if (s->iformat->read_pause)
2224 return s->iformat->read_pause(s);
2226 return av_url_read_fpause(s->pb, 1);
2227 return AVERROR(ENOSYS);
2230 void av_close_input_stream(AVFormatContext *s)
2235 /* free previous packet */
2236 if (s->cur_st && s->cur_st->parser)
2237 av_free_packet(&s->cur_pkt);
2239 if (s->iformat->read_close)
2240 s->iformat->read_close(s);
2241 for(i=0;i<s->nb_streams;i++) {
2242 /* free all data in a stream component */
2245 av_parser_close(st->parser);
2247 av_free(st->index_entries);
2248 av_free(st->codec->extradata);
2250 av_free(st->filename);
2251 av_free(st->priv_data);
2254 for(i=s->nb_programs-1; i>=0; i--) {
2255 av_freep(&s->programs[i]->provider_name);
2256 av_freep(&s->programs[i]->name);
2257 av_freep(&s->programs[i]->stream_index);
2258 av_freep(&s->programs[i]);
2260 av_freep(&s->programs);
2261 flush_packet_queue(s);
2262 av_freep(&s->priv_data);
2263 while(s->nb_chapters--) {
2264 av_free(s->chapters[s->nb_chapters]->title);
2265 av_free(s->chapters[s->nb_chapters]);
2267 av_freep(&s->chapters);
2271 void av_close_input_file(AVFormatContext *s)
2273 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2274 av_close_input_stream(s);
2279 AVStream *av_new_stream(AVFormatContext *s, int id)
2284 if (s->nb_streams >= MAX_STREAMS)
2287 st = av_mallocz(sizeof(AVStream));
2291 st->codec= avcodec_alloc_context();
2293 /* no default bitrate if decoding */
2294 st->codec->bit_rate = 0;
2296 st->index = s->nb_streams;
2298 st->start_time = AV_NOPTS_VALUE;
2299 st->duration = AV_NOPTS_VALUE;
2300 /* we set the current DTS to 0 so that formats without any timestamps
2301 but durations get some timestamps, formats with some unknown
2302 timestamps have their first few packets buffered and the
2303 timestamps corrected before they are returned to the user */
2305 st->first_dts = AV_NOPTS_VALUE;
2307 /* default pts setting is MPEG-like */
2308 av_set_pts_info(st, 33, 1, 90000);
2309 st->last_IP_pts = AV_NOPTS_VALUE;
2310 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2311 st->pts_buffer[i]= AV_NOPTS_VALUE;
2313 s->streams[s->nb_streams++] = st;
2317 AVProgram *av_new_program(AVFormatContext *ac, int id)
2319 AVProgram *program=NULL;
2323 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2326 for(i=0; i<ac->nb_programs; i++)
2327 if(ac->programs[i]->id == id)
2328 program = ac->programs[i];
2331 program = av_mallocz(sizeof(AVProgram));
2334 dynarray_add(&ac->programs, &ac->nb_programs, program);
2335 program->discard = AVDISCARD_NONE;
2342 void av_set_program_name(AVProgram *program, char *provider_name, char *name)
2344 assert(!provider_name == !name);
2346 av_free(program->provider_name);
2347 av_free(program-> name);
2348 program->provider_name = av_strdup(provider_name);
2349 program-> name = av_strdup( name);
2353 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2355 AVChapter *chapter = NULL;
2358 for(i=0; i<s->nb_chapters; i++)
2359 if(s->chapters[i]->id == id)
2360 chapter = s->chapters[i];
2363 chapter= av_mallocz(sizeof(AVChapter));
2366 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2368 av_free(chapter->title);
2369 chapter->title = av_strdup(title);
2371 chapter->time_base= time_base;
2372 chapter->start = start;
2378 /************************************************************/
2379 /* output media file */
2381 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2385 if (s->oformat->priv_data_size > 0) {
2386 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2388 return AVERROR(ENOMEM);
2390 s->priv_data = NULL;
2392 if (s->oformat->set_parameters) {
2393 ret = s->oformat->set_parameters(s, ap);
2400 int av_write_header(AVFormatContext *s)
2405 // some sanity checks
2406 for(i=0;i<s->nb_streams;i++) {
2409 switch (st->codec->codec_type) {
2410 case CODEC_TYPE_AUDIO:
2411 if(st->codec->sample_rate<=0){
2412 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2416 case CODEC_TYPE_VIDEO:
2417 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2418 av_log(s, AV_LOG_ERROR, "time base not set\n");
2421 if(st->codec->width<=0 || st->codec->height<=0){
2422 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2428 if(s->oformat->codec_tag){
2429 if(st->codec->codec_tag){
2431 //check that tag + id is in the table
2432 //if neither is in the table -> OK
2433 //if tag is in the table with another id -> FAIL
2434 //if id is in the table with another tag -> FAIL unless strict < ?
2436 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2440 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2441 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2443 return AVERROR(ENOMEM);
2446 if(s->oformat->write_header){
2447 ret = s->oformat->write_header(s);
2452 /* init PTS generation */
2453 for(i=0;i<s->nb_streams;i++) {
2454 int64_t den = AV_NOPTS_VALUE;
2457 switch (st->codec->codec_type) {
2458 case CODEC_TYPE_AUDIO:
2459 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2461 case CODEC_TYPE_VIDEO:
2462 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2467 if (den != AV_NOPTS_VALUE) {
2469 return AVERROR_INVALIDDATA;
2470 av_frac_init(&st->pts, 0, 0, den);
2476 //FIXME merge with compute_pkt_fields
2477 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2478 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2479 int num, den, frame_size, i;
2481 // av_log(st->codec, 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);
2483 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2486 /* duration field */
2487 if (pkt->duration == 0) {
2488 compute_frame_duration(&num, &den, st, NULL, pkt);
2490 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2494 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2497 //XXX/FIXME this is a temporary hack until all encoders output pts
2498 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2500 // pkt->pts= st->cur_dts;
2501 pkt->pts= st->pts.val;
2504 //calculate dts from pts
2505 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2506 st->pts_buffer[0]= pkt->pts;
2507 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2508 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2509 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2510 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2512 pkt->dts= st->pts_buffer[0];
2515 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2516 av_log(st->codec, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2519 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2520 av_log(st->codec, AV_LOG_ERROR, "error, pts < dts\n");
2524 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2525 st->cur_dts= pkt->dts;
2526 st->pts.val= pkt->dts;
2529 switch (st->codec->codec_type) {
2530 case CODEC_TYPE_AUDIO:
2531 frame_size = get_audio_frame_size(st->codec, pkt->size);
2533 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2534 likely equal to the encoder delay, but it would be better if we
2535 had the real timestamps from the encoder */
2536 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2537 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2540 case CODEC_TYPE_VIDEO:
2541 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2549 static void truncate_ts(AVStream *st, AVPacket *pkt){
2550 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2553 // pkt->dts= 0; //this happens for low_delay=0 and B-frames, FIXME, needs further investigation about what we should do here
2555 if (pkt->pts != AV_NOPTS_VALUE)
2556 pkt->pts &= pts_mask;
2557 if (pkt->dts != AV_NOPTS_VALUE)
2558 pkt->dts &= pts_mask;
2561 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2563 int ret = compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2565 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2568 truncate_ts(s->streams[pkt->stream_index], pkt);
2570 ret= s->oformat->write_packet(s, pkt);
2572 ret= url_ferror(s->pb);
2576 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2577 AVPacketList *pktl, **next_point, *this_pktl;
2579 int streams[MAX_STREAMS];
2582 AVStream *st= s->streams[ pkt->stream_index];
2584 // assert(pkt->destruct != av_destruct_packet); //FIXME
2586 this_pktl = av_mallocz(sizeof(AVPacketList));
2587 this_pktl->pkt= *pkt;
2588 if(pkt->destruct == av_destruct_packet)
2589 pkt->destruct= NULL; // not shared -> must keep original from being freed
2591 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2593 next_point = &s->packet_buffer;
2595 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2596 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2597 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2598 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2600 next_point= &(*next_point)->next;
2602 this_pktl->next= *next_point;
2603 *next_point= this_pktl;
2606 memset(streams, 0, sizeof(streams));
2607 pktl= s->packet_buffer;
2609 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2610 if(streams[ pktl->pkt.stream_index ] == 0)
2612 streams[ pktl->pkt.stream_index ]++;
2616 if(stream_count && (s->nb_streams == stream_count || flush)){
2617 pktl= s->packet_buffer;
2620 s->packet_buffer= pktl->next;
2624 av_init_packet(out);
2630 * Interleaves an AVPacket correctly so it can be muxed.
2631 * @param out the interleaved packet will be output here
2632 * @param in the input packet
2633 * @param flush 1 if no further packets are available as input and all
2634 * remaining packets should be output
2635 * @return 1 if a packet was output, 0 if no packet could be output,
2636 * < 0 if an error occurred
2638 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2639 if(s->oformat->interleave_packet)
2640 return s->oformat->interleave_packet(s, out, in, flush);
2642 return av_interleave_packet_per_dts(s, out, in, flush);
2645 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2646 AVStream *st= s->streams[ pkt->stream_index];
2648 //FIXME/XXX/HACK drop zero sized packets
2649 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2652 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2653 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2656 if(pkt->dts == AV_NOPTS_VALUE)
2661 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2662 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2665 truncate_ts(s->streams[opkt.stream_index], &opkt);
2666 ret= s->oformat->write_packet(s, &opkt);
2668 av_free_packet(&opkt);
2673 if(url_ferror(s->pb))
2674 return url_ferror(s->pb);
2678 int av_write_trailer(AVFormatContext *s)
2684 ret= av_interleave_packet(s, &pkt, NULL, 1);
2685 if(ret<0) //FIXME cleanup needed for ret<0 ?
2690 truncate_ts(s->streams[pkt.stream_index], &pkt);
2691 ret= s->oformat->write_packet(s, &pkt);
2693 av_free_packet(&pkt);
2697 if(url_ferror(s->pb))
2701 if(s->oformat->write_trailer)
2702 ret = s->oformat->write_trailer(s);
2705 ret=url_ferror(s->pb);
2706 for(i=0;i<s->nb_streams;i++)
2707 av_freep(&s->streams[i]->priv_data);
2708 av_freep(&s->priv_data);
2712 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2715 AVProgram *program=NULL;
2718 for(i=0; i<ac->nb_programs; i++){
2719 if(ac->programs[i]->id != progid)
2721 program = ac->programs[i];
2722 for(j=0; j<program->nb_stream_indexes; j++)
2723 if(program->stream_index[j] == idx)
2726 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2729 program->stream_index = tmp;
2730 program->stream_index[program->nb_stream_indexes++] = idx;
2735 /* "user interface" functions */
2736 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2739 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2740 AVStream *st = ic->streams[i];
2741 int g = ff_gcd(st->time_base.num, st->time_base.den);
2742 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2743 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2744 /* the pid is an important information, so we display it */
2745 /* XXX: add a generic system */
2746 if (flags & AVFMT_SHOW_IDS)
2747 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2748 if (strlen(st->language) > 0)
2749 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2750 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2751 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2752 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2753 if(st->r_frame_rate.den && st->r_frame_rate.num)
2754 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(r)", av_q2d(st->r_frame_rate));
2755 /* else if(st->time_base.den && st->time_base.num)
2756 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(m)", 1/av_q2d(st->time_base));*/
2758 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(c)", 1/av_q2d(st->codec->time_base));
2760 av_log(NULL, AV_LOG_INFO, "\n");
2763 void dump_format(AVFormatContext *ic,
2770 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2771 is_output ? "Output" : "Input",
2773 is_output ? ic->oformat->name : ic->iformat->name,
2774 is_output ? "to" : "from", url);
2776 av_log(NULL, AV_LOG_INFO, " Duration: ");
2777 if (ic->duration != AV_NOPTS_VALUE) {
2778 int hours, mins, secs, us;
2779 secs = ic->duration / AV_TIME_BASE;
2780 us = ic->duration % AV_TIME_BASE;
2785 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
2786 (100 * us) / AV_TIME_BASE);
2788 av_log(NULL, AV_LOG_INFO, "N/A");
2790 if (ic->start_time != AV_NOPTS_VALUE) {
2792 av_log(NULL, AV_LOG_INFO, ", start: ");
2793 secs = ic->start_time / AV_TIME_BASE;
2794 us = ic->start_time % AV_TIME_BASE;
2795 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2796 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2798 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2800 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2802 av_log(NULL, AV_LOG_INFO, "N/A");
2804 av_log(NULL, AV_LOG_INFO, "\n");
2806 if(ic->nb_programs) {
2808 for(j=0; j<ic->nb_programs; j++) {
2809 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2810 ic->programs[j]->name ? ic->programs[j]->name : "");
2811 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++)
2812 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2815 for(i=0;i<ic->nb_streams;i++)
2816 dump_stream_format(ic, i, index, is_output);
2819 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2821 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2824 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2826 AVRational frame_rate;
2827 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2828 *frame_rate_num= frame_rate.num;
2829 *frame_rate_den= frame_rate.den;
2834 * Gets the current time in microseconds.
2836 int64_t av_gettime(void)
2839 gettimeofday(&tv,NULL);
2840 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2843 int64_t parse_date(const char *datestr, int duration)
2849 static const char *date_fmt[] = {
2853 static const char *time_fmt[] = {
2863 time_t now = time(0);
2865 len = strlen(datestr);
2867 lastch = datestr[len - 1];
2870 is_utc = (lastch == 'z' || lastch == 'Z');
2872 memset(&dt, 0, sizeof(dt));
2877 /* parse the year-month-day part */
2878 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2879 q = small_strptime(p, date_fmt[i], &dt);
2885 /* if the year-month-day part is missing, then take the
2886 * current year-month-day time */
2891 dt = *localtime(&now);
2893 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2898 if (*p == 'T' || *p == 't' || *p == ' ')
2901 /* parse the hour-minute-second part */
2902 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2903 q = small_strptime(p, time_fmt[i], &dt);
2909 /* parse datestr as a duration */
2914 /* parse datestr as HH:MM:SS */
2915 q = small_strptime(p, time_fmt[0], &dt);
2917 /* parse datestr as S+ */
2918 dt.tm_sec = strtol(p, (char **)&q, 10);
2920 /* the parsing didn't succeed */
2927 /* Now we have all the fields that we can get */
2933 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2935 dt.tm_isdst = -1; /* unknown */
2945 /* parse the .m... part */
2949 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2952 val += n * (*q - '0');
2956 return negative ? -t : t;
2959 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2969 while (*p != '\0' && *p != '=' && *p != '&') {
2970 if ((q - tag) < sizeof(tag) - 1)
2978 while (*p != '&' && *p != '\0') {
2979 if ((q - arg) < arg_size - 1) {
2989 if (!strcmp(tag, tag1))
2998 int av_get_frame_filename(char *buf, int buf_size,
2999 const char *path, int number)
3002 char *q, buf1[20], c;
3003 int nd, len, percentd_found;
3015 while (isdigit(*p)) {
3016 nd = nd * 10 + *p++ - '0';
3019 } while (isdigit(c));
3028 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3030 if ((q - buf + len) > buf_size - 1)
3032 memcpy(q, buf1, len);
3040 if ((q - buf) < buf_size - 1)
3044 if (!percentd_found)
3053 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3056 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3058 for(i=0;i<size;i+=16) {
3065 PRINT(" %02x", buf[i+j]);
3070 for(j=0;j<len;j++) {
3072 if (c < ' ' || c > '~')
3081 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3083 hex_dump_internal(NULL, f, 0, buf, size);
3086 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3088 hex_dump_internal(avcl, NULL, level, buf, size);
3091 //FIXME needs to know the time_base
3092 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
3094 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3095 PRINT("stream #%d:\n", pkt->stream_index);
3096 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3097 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3098 /* DTS is _always_ valid after av_read_frame() */
3100 if (pkt->dts == AV_NOPTS_VALUE)
3103 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
3104 /* PTS may not be known if B-frames are present. */
3106 if (pkt->pts == AV_NOPTS_VALUE)
3109 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
3111 PRINT(" size=%d\n", pkt->size);
3114 av_hex_dump(f, pkt->data, pkt->size);
3117 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3119 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
3122 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3124 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
3127 void url_split(char *proto, int proto_size,
3128 char *authorization, int authorization_size,
3129 char *hostname, int hostname_size,
3131 char *path, int path_size,
3134 const char *p, *ls, *at, *col, *brk;
3136 if (port_ptr) *port_ptr = -1;
3137 if (proto_size > 0) proto[0] = 0;
3138 if (authorization_size > 0) authorization[0] = 0;
3139 if (hostname_size > 0) hostname[0] = 0;
3140 if (path_size > 0) path[0] = 0;
3142 /* parse protocol */
3143 if ((p = strchr(url, ':'))) {
3144 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3149 /* no protocol means plain filename */
3150 av_strlcpy(path, url, path_size);
3154 /* separate path from hostname */
3155 ls = strchr(p, '/');
3157 ls = strchr(p, '?');
3159 av_strlcpy(path, ls, path_size);
3161 ls = &p[strlen(p)]; // XXX
3163 /* the rest is hostname, use that to parse auth/port */
3165 /* authorization (user[:pass]@hostname) */
3166 if ((at = strchr(p, '@')) && at < ls) {
3167 av_strlcpy(authorization, p,
3168 FFMIN(authorization_size, at + 1 - p));
3169 p = at + 1; /* skip '@' */
3172 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3174 av_strlcpy(hostname, p + 1,
3175 FFMIN(hostname_size, brk - p));
3176 if (brk[1] == ':' && port_ptr)
3177 *port_ptr = atoi(brk + 2);
3178 } else if ((col = strchr(p, ':')) && col < ls) {
3179 av_strlcpy(hostname, p,
3180 FFMIN(col + 1 - p, hostname_size));
3181 if (port_ptr) *port_ptr = atoi(col + 1);
3183 av_strlcpy(hostname, p,
3184 FFMIN(ls + 1 - p, hostname_size));
3188 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3189 int pts_num, int pts_den)
3191 s->pts_wrap_bits = pts_wrap_bits;
3192 s->time_base.num = pts_num;
3193 s->time_base.den = pts_den;
3196 /* fraction handling */
3199 * f = val + (num / den) + 0.5.
3201 * 'num' is normalized so that it is such as 0 <= num < den.
3203 * @param f fractional number
3204 * @param val integer value
3205 * @param num must be >= 0
3206 * @param den must be >= 1
3208 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
3221 * Fractional addition to f: f = f + (incr / f->den).
3223 * @param f fractional number
3224 * @param incr increment, can be positive or negative
3226 static void av_frac_add(AVFrac *f, int64_t incr)
3230 num = f->num + incr;
3233 f->val += num / den;
3239 } else if (num >= den) {
3240 f->val += num / den;