2 * Various utilities for ffmpeg system
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
32 * @file libavformat/utils.c
33 * Various utility functions for using ffmpeg library.
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 put the padding
246 if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
247 return AVERROR(ENOMEM);
248 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
250 return AVERROR(ENOMEM);
252 memcpy(data, pkt->data, pkt->size);
253 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
255 pkt->destruct = av_destruct_packet;
260 int av_filename_number_test(const char *filename)
263 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
266 static AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
268 AVInputFormat *fmt1, *fmt;
272 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
273 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
276 if (fmt1->read_probe) {
277 score = fmt1->read_probe(pd);
278 } else if (fmt1->extensions) {
279 if (match_ext(pd->filename, fmt1->extensions)) {
283 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 /************************************************************/
297 /* input media file */
300 * Open a media file from an IO stream. 'fmt' must be specified.
302 static const char* format_to_name(void* ptr)
304 AVFormatContext* fc = (AVFormatContext*) ptr;
305 if(fc->iformat) return fc->iformat->name;
306 else if(fc->oformat) return fc->oformat->name;
310 #define OFFSET(x) offsetof(AVFormatContext,x)
311 #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
312 //these names are too long to be readable
313 #define E AV_OPT_FLAG_ENCODING_PARAM
314 #define D AV_OPT_FLAG_DECODING_PARAM
316 static const AVOption options[]={
317 {"probesize", NULL, OFFSET(probesize), FF_OPT_TYPE_INT, 32000, 32, INT_MAX, D}, /* 32000 from mpegts.c: 1.0 second at 24Mbit/s */
318 {"muxrate", "set mux rate", OFFSET(mux_rate), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
319 {"packetsize", "set packet size", OFFSET(packet_size), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
320 {"fflags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, D|E, "fflags"},
321 {"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_IGNIDX, INT_MIN, INT_MAX, D, "fflags"},
322 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_GENPTS, INT_MIN, INT_MAX, D, "fflags"},
323 {"track", " set the track number", OFFSET(track), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
324 {"year", "set the year", OFFSET(year), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, E},
325 {"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},
326 {"cryptokey", "decryption key", OFFSET(key), FF_OPT_TYPE_BINARY, 0, 0, 0, D},
334 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name, options };
336 static void avformat_get_context_defaults(AVFormatContext *s)
338 memset(s, 0, sizeof(AVFormatContext));
340 s->av_class = &av_format_context_class;
342 av_opt_set_defaults(s);
345 AVFormatContext *av_alloc_format_context(void)
348 ic = av_malloc(sizeof(AVFormatContext));
350 avformat_get_context_defaults(ic);
351 ic->av_class = &av_format_context_class;
355 int av_open_input_stream(AVFormatContext **ic_ptr,
356 ByteIOContext *pb, const char *filename,
357 AVInputFormat *fmt, AVFormatParameters *ap)
361 AVFormatParameters default_ap;
365 memset(ap, 0, sizeof(default_ap));
368 if(!ap->prealloced_context)
369 ic = av_alloc_format_context();
373 err = AVERROR(ENOMEM);
378 ic->duration = AV_NOPTS_VALUE;
379 ic->start_time = AV_NOPTS_VALUE;
380 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
382 /* allocate private data */
383 if (fmt->priv_data_size > 0) {
384 ic->priv_data = av_mallocz(fmt->priv_data_size);
385 if (!ic->priv_data) {
386 err = AVERROR(ENOMEM);
390 ic->priv_data = NULL;
393 err = ic->iformat->read_header(ic, ap);
397 if (pb && !ic->data_offset)
398 ic->data_offset = url_ftell(ic->pb);
404 av_freep(&ic->priv_data);
411 /** Size of probe buffer, for guessing file type from file contents. */
412 #define PROBE_BUF_MIN 2048
413 #define PROBE_BUF_MAX (1<<20)
415 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
418 AVFormatParameters *ap)
421 AVProbeData probe_data, *pd = &probe_data;
422 ByteIOContext *pb = NULL;
426 pd->filename = filename;
431 /* guess format if no file can be opened */
432 fmt = av_probe_input_format(pd, 0);
435 /* do not open file if the format does not need it. XXX: specific
436 hack needed to handle RTSP/TCP */
437 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
438 /* if no file needed do not try to open one */
439 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
443 url_setbufsize(pb, buf_size);
446 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
447 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
448 /* read probe data */
449 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
450 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
451 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
452 if (url_fseek(pb, 0, SEEK_SET) < 0) {
454 if (url_fopen(&pb, filename, URL_RDONLY) < 0) {
460 /* guess file format */
461 fmt = av_probe_input_format2(pd, 1, &score);
466 /* if still no format found, error */
472 /* check filename in case of an image number is expected */
473 if (fmt->flags & AVFMT_NEEDNUMBER) {
474 if (!av_filename_number_test(filename)) {
475 err = AVERROR_NUMEXPECTED;
479 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
492 /*******************************************************/
494 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
499 ret= s->iformat->read_packet(s, pkt);
502 st= s->streams[pkt->stream_index];
504 switch(st->codec->codec_type){
505 case CODEC_TYPE_VIDEO:
506 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
508 case CODEC_TYPE_AUDIO:
509 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
511 case CODEC_TYPE_SUBTITLE:
512 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
519 /**********************************************************/
522 * Get the number of samples of an audio frame. Return (-1) if error.
524 static int get_audio_frame_size(AVCodecContext *enc, int size)
528 if (enc->frame_size <= 1) {
529 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
531 if (bits_per_sample) {
532 if (enc->channels == 0)
534 frame_size = (size << 3) / (bits_per_sample * enc->channels);
536 /* used for example by ADPCM codecs */
537 if (enc->bit_rate == 0)
539 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
542 frame_size = enc->frame_size;
549 * Return the frame duration in seconds, return 0 if not available.
551 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
552 AVCodecParserContext *pc, AVPacket *pkt)
558 switch(st->codec->codec_type) {
559 case CODEC_TYPE_VIDEO:
560 if(st->time_base.num*1000LL > st->time_base.den){
561 *pnum = st->time_base.num;
562 *pden = st->time_base.den;
563 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
564 *pnum = st->codec->time_base.num;
565 *pden = st->codec->time_base.den;
566 if (pc && pc->repeat_pict) {
568 *pnum = (*pnum) * (2 + pc->repeat_pict);
572 case CODEC_TYPE_AUDIO:
573 frame_size = get_audio_frame_size(st->codec, pkt->size);
577 *pden = st->codec->sample_rate;
584 static int is_intra_only(AVCodecContext *enc){
585 if(enc->codec_type == CODEC_TYPE_AUDIO){
587 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
588 switch(enc->codec_id){
590 case CODEC_ID_MJPEGB:
592 case CODEC_ID_RAWVIDEO:
593 case CODEC_ID_DVVIDEO:
594 case CODEC_ID_HUFFYUV:
595 case CODEC_ID_FFVHUFF:
606 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
607 int64_t dts, int64_t pts)
609 AVStream *st= s->streams[stream_index];
610 AVPacketList *pktl= s->packet_buffer;
612 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE)
615 st->first_dts= dts - st->cur_dts;
618 for(; pktl; pktl= pktl->next){
619 if(pktl->pkt.stream_index != stream_index)
621 //FIXME think more about this check
622 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
623 pktl->pkt.pts += st->first_dts;
625 if(pktl->pkt.dts != AV_NOPTS_VALUE)
626 pktl->pkt.dts += st->first_dts;
628 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
629 st->start_time= pktl->pkt.pts;
631 if (st->start_time == AV_NOPTS_VALUE)
632 st->start_time = pts;
635 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
636 AVCodecParserContext *pc, AVPacket *pkt)
638 int num, den, presentation_delayed, delay, i;
641 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
642 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
643 pkt->dts -= 1LL<<st->pts_wrap_bits;
646 if (pkt->duration == 0) {
647 compute_frame_duration(&num, &den, st, pc, pkt);
649 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
653 /* correct timestamps with byte offset if demuxers only have timestamps on packet boundaries */
654 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
655 /* this will estimate bitrate based on this frame's duration and size */
656 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
657 if(pkt->pts != AV_NOPTS_VALUE)
659 if(pkt->dts != AV_NOPTS_VALUE)
663 /* do we have a video B frame ? */
664 delay= st->codec->has_b_frames;
665 presentation_delayed = 0;
666 /* XXX: need has_b_frame, but cannot get it if the codec is
669 pc && pc->pict_type != FF_B_TYPE)
670 presentation_delayed = 1;
671 /* This may be redundant, but it should not hurt. */
672 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
673 presentation_delayed = 1;
675 if(st->cur_dts == AV_NOPTS_VALUE){
676 st->cur_dts = 0; //FIXME maybe set it to 0 during init
679 // 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);
680 /* interpolate PTS and DTS if they are not present */
682 if (presentation_delayed) {
683 /* DTS = decompression time stamp */
684 /* PTS = presentation time stamp */
685 if (pkt->dts == AV_NOPTS_VALUE)
686 pkt->dts = st->last_IP_pts;
687 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
688 if (pkt->dts == AV_NOPTS_VALUE)
689 pkt->dts = st->cur_dts;
691 /* this is tricky: the dts must be incremented by the duration
692 of the frame we are displaying, i.e. the last I or P frame */
693 if (st->last_IP_duration == 0)
694 st->last_IP_duration = pkt->duration;
695 st->cur_dts = pkt->dts + st->last_IP_duration;
696 st->last_IP_duration = pkt->duration;
697 st->last_IP_pts= pkt->pts;
698 /* cannot compute PTS if not present (we can compute it only
699 by knowing the futur */
700 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
701 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
702 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
703 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
704 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
705 pkt->pts += pkt->duration;
706 // 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);
710 /* presentation is not delayed : PTS and DTS are the same */
711 if(pkt->pts == AV_NOPTS_VALUE)
713 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
714 if(pkt->pts == AV_NOPTS_VALUE)
715 pkt->pts = st->cur_dts;
717 st->cur_dts = pkt->pts + pkt->duration;
721 if(pkt->pts != AV_NOPTS_VALUE){
722 st->pts_buffer[0]= pkt->pts;
723 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
724 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
725 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
726 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
727 if(pkt->dts == AV_NOPTS_VALUE)
728 pkt->dts= st->pts_buffer[0];
730 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
732 if(pkt->dts > st->cur_dts)
733 st->cur_dts = pkt->dts;
736 // 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);
739 if(is_intra_only(st->codec))
740 pkt->flags |= PKT_FLAG_KEY;
743 /* key frame computation */
744 if (pc->pict_type == FF_I_TYPE)
745 pkt->flags |= PKT_FLAG_KEY;
749 void av_destruct_packet_nofree(AVPacket *pkt)
751 pkt->data = NULL; pkt->size = 0;
754 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
762 /* select current input stream component */
765 if (!st->need_parsing || !st->parser) {
766 /* no parsing needed: we just output the packet as is */
767 /* raw data support */
769 compute_pkt_fields(s, st, NULL, pkt);
772 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
773 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
774 s->cur_ptr, s->cur_len,
775 s->cur_pkt.pts, s->cur_pkt.dts);
776 s->cur_pkt.pts = AV_NOPTS_VALUE;
777 s->cur_pkt.dts = AV_NOPTS_VALUE;
778 /* increment read pointer */
782 /* return packet if any */
785 pkt->pos = s->cur_pkt.pos; // Isn't quite accurate but close.
787 pkt->stream_index = st->index;
788 pkt->pts = st->parser->pts;
789 pkt->dts = st->parser->dts;
790 pkt->destruct = av_destruct_packet_nofree;
791 compute_pkt_fields(s, st, st->parser, pkt);
793 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
794 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
795 0, 0, AVINDEX_KEYFRAME);
802 av_free_packet(&s->cur_pkt);
806 /* read next packet */
807 ret = av_read_packet(s, &s->cur_pkt);
809 if (ret == AVERROR(EAGAIN))
811 /* return the last frames, if any */
812 for(i = 0; i < s->nb_streams; i++) {
814 if (st->parser && st->need_parsing) {
815 av_parser_parse(st->parser, st->codec,
816 &pkt->data, &pkt->size,
818 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
823 /* no more packets: really terminates parsing */
827 st = s->streams[s->cur_pkt.stream_index];
828 if(st->codec->debug & FF_DEBUG_PTS)
829 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
830 s->cur_pkt.stream_index,
836 s->cur_ptr = s->cur_pkt.data;
837 s->cur_len = s->cur_pkt.size;
838 if (st->need_parsing && !st->parser) {
839 st->parser = av_parser_init(st->codec->codec_id);
841 /* no parser available : just output the raw packets */
842 st->need_parsing = AVSTREAM_PARSE_NONE;
843 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
844 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
846 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
847 st->parser->last_frame_offset=
848 st->parser->cur_offset= s->cur_pkt.pos;
853 if(st->codec->debug & FF_DEBUG_PTS)
854 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
863 static AVPacket *add_to_pktbuf(AVFormatContext *s, AVPacket *pkt){
864 AVPacketList *pktl= s->packet_buffer;
865 AVPacketList **plast_pktl= &s->packet_buffer;
867 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
869 pktl = av_mallocz(sizeof(AVPacketList));
873 /* add the packet in the buffered packet list */
879 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
883 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
886 pktl = s->packet_buffer;
888 AVPacket *next_pkt= &pktl->pkt;
890 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
891 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
892 if( pktl->pkt.stream_index == next_pkt->stream_index
893 && next_pkt->dts < pktl->pkt.dts
894 && pktl->pkt.pts != pktl->pkt.dts //not b frame
895 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
896 next_pkt->pts= pktl->pkt.dts;
900 pktl = s->packet_buffer;
903 if( next_pkt->pts != AV_NOPTS_VALUE
904 || next_pkt->dts == AV_NOPTS_VALUE
906 /* read packet from packet buffer, if there is data */
908 s->packet_buffer = pktl->next;
914 int ret= av_read_frame_internal(s, pkt);
916 if(pktl && ret != AVERROR(EAGAIN)){
923 if(av_dup_packet(add_to_pktbuf(s, pkt)) < 0)
924 return AVERROR(ENOMEM);
926 assert(!s->packet_buffer);
927 return av_read_frame_internal(s, pkt);
932 /* XXX: suppress the packet queue */
933 static void flush_packet_queue(AVFormatContext *s)
938 pktl = s->packet_buffer;
941 s->packet_buffer = pktl->next;
942 av_free_packet(&pktl->pkt);
947 /*******************************************************/
950 int av_find_default_stream_index(AVFormatContext *s)
955 if (s->nb_streams <= 0)
957 for(i = 0; i < s->nb_streams; i++) {
959 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
967 * Flush the frame reader.
969 static void av_read_frame_flush(AVFormatContext *s)
974 flush_packet_queue(s);
976 /* free previous packet */
978 if (s->cur_st->parser)
979 av_free_packet(&s->cur_pkt);
986 /* for each stream, reset read state */
987 for(i = 0; i < s->nb_streams; i++) {
991 av_parser_close(st->parser);
994 st->last_IP_pts = AV_NOPTS_VALUE;
995 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
999 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1002 for(i = 0; i < s->nb_streams; i++) {
1003 AVStream *st = s->streams[i];
1005 st->cur_dts = av_rescale(timestamp,
1006 st->time_base.den * (int64_t)ref_st->time_base.num,
1007 st->time_base.num * (int64_t)ref_st->time_base.den);
1011 int av_add_index_entry(AVStream *st,
1012 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1014 AVIndexEntry *entries, *ie;
1017 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1020 entries = av_fast_realloc(st->index_entries,
1021 &st->index_entries_allocated_size,
1022 (st->nb_index_entries + 1) *
1023 sizeof(AVIndexEntry));
1027 st->index_entries= entries;
1029 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1032 index= st->nb_index_entries++;
1033 ie= &entries[index];
1034 assert(index==0 || ie[-1].timestamp < timestamp);
1036 ie= &entries[index];
1037 if(ie->timestamp != timestamp){
1038 if(ie->timestamp <= timestamp)
1040 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1041 st->nb_index_entries++;
1042 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1043 distance= ie->min_distance;
1047 ie->timestamp = timestamp;
1048 ie->min_distance= distance;
1055 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1058 AVIndexEntry *entries= st->index_entries;
1059 int nb_entries= st->nb_index_entries;
1068 timestamp = entries[m].timestamp;
1069 if(timestamp >= wanted_timestamp)
1071 if(timestamp <= wanted_timestamp)
1074 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1076 if(!(flags & AVSEEK_FLAG_ANY)){
1077 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1078 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1089 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1090 AVInputFormat *avif= s->iformat;
1091 int64_t pos_min, pos_max, pos, pos_limit;
1092 int64_t ts_min, ts_max, ts;
1096 if (stream_index < 0)
1100 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1104 ts_min= AV_NOPTS_VALUE;
1105 pos_limit= -1; //gcc falsely says it may be uninitialized
1107 st= s->streams[stream_index];
1108 if(st->index_entries){
1111 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()
1112 index= FFMAX(index, 0);
1113 e= &st->index_entries[index];
1115 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1117 ts_min= e->timestamp;
1119 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1126 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1127 assert(index < st->nb_index_entries);
1129 e= &st->index_entries[index];
1130 assert(e->timestamp >= target_ts);
1132 ts_max= e->timestamp;
1133 pos_limit= pos_max - e->min_distance;
1135 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1136 pos_max,pos_limit, ts_max);
1141 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1146 url_fseek(s->pb, pos, SEEK_SET);
1148 av_update_cur_dts(s, st, ts);
1153 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 )){
1155 int64_t start_pos, filesize;
1159 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1162 if(ts_min == AV_NOPTS_VALUE){
1163 pos_min = s->data_offset;
1164 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1165 if (ts_min == AV_NOPTS_VALUE)
1169 if(ts_max == AV_NOPTS_VALUE){
1171 filesize = url_fsize(s->pb);
1172 pos_max = filesize - 1;
1175 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1177 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1178 if (ts_max == AV_NOPTS_VALUE)
1182 int64_t tmp_pos= pos_max + 1;
1183 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1184 if(tmp_ts == AV_NOPTS_VALUE)
1188 if(tmp_pos >= filesize)
1194 if(ts_min > ts_max){
1196 }else if(ts_min == ts_max){
1201 while (pos_min < pos_limit) {
1203 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1207 assert(pos_limit <= pos_max);
1210 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1211 // interpolate position (better than dichotomy)
1212 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1213 + pos_min - approximate_keyframe_distance;
1214 }else if(no_change==1){
1215 // bisection, if interpolation failed to change min or max pos last time
1216 pos = (pos_min + pos_limit)>>1;
1218 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1223 else if(pos > pos_limit)
1227 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1233 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);
1235 if(ts == AV_NOPTS_VALUE){
1236 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1239 assert(ts != AV_NOPTS_VALUE);
1240 if (target_ts <= ts) {
1241 pos_limit = start_pos - 1;
1245 if (target_ts >= ts) {
1251 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1252 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1255 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1257 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1258 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1259 pos, ts_min, target_ts, ts_max);
1265 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1266 int64_t pos_min, pos_max;
1270 if (stream_index < 0)
1273 st= s->streams[stream_index];
1276 pos_min = s->data_offset;
1277 pos_max = url_fsize(s->pb) - 1;
1279 if (pos < pos_min) pos= pos_min;
1280 else if(pos > pos_max) pos= pos_max;
1282 url_fseek(s->pb, pos, SEEK_SET);
1285 av_update_cur_dts(s, st, ts);
1290 static int av_seek_frame_generic(AVFormatContext *s,
1291 int stream_index, int64_t timestamp, int flags)
1297 st = s->streams[stream_index];
1299 index = av_index_search_timestamp(st, timestamp, flags);
1301 if(index < 0 || index==st->nb_index_entries-1){
1305 if(st->index_entries && st->nb_index_entries){
1306 ie= &st->index_entries[st->nb_index_entries-1];
1307 url_fseek(s->pb, ie->pos, SEEK_SET);
1308 av_update_cur_dts(s, st, ie->timestamp);
1310 url_fseek(s->pb, 0, SEEK_SET);
1313 int ret = av_read_frame(s, &pkt);
1316 av_free_packet(&pkt);
1317 if(stream_index == pkt.stream_index){
1318 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1322 index = av_index_search_timestamp(st, timestamp, flags);
1327 av_read_frame_flush(s);
1328 if (s->iformat->read_seek){
1329 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1332 ie = &st->index_entries[index];
1333 url_fseek(s->pb, ie->pos, SEEK_SET);
1335 av_update_cur_dts(s, st, ie->timestamp);
1340 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1345 av_read_frame_flush(s);
1347 if(flags & AVSEEK_FLAG_BYTE)
1348 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1350 if(stream_index < 0){
1351 stream_index= av_find_default_stream_index(s);
1352 if(stream_index < 0)
1355 st= s->streams[stream_index];
1356 /* timestamp for default must be expressed in AV_TIME_BASE units */
1357 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1359 st= s->streams[stream_index];
1361 /* first, we try the format specific seek */
1362 if (s->iformat->read_seek)
1363 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1370 if(s->iformat->read_timestamp)
1371 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1373 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1376 /*******************************************************/
1379 * Returns TRUE if the stream has accurate duration in any stream.
1381 * @return TRUE if the stream has accurate duration for at least one component.
1383 static int av_has_duration(AVFormatContext *ic)
1388 for(i = 0;i < ic->nb_streams; i++) {
1389 st = ic->streams[i];
1390 if (st->duration != AV_NOPTS_VALUE)
1397 * Estimate the stream timings from the one of each components.
1399 * Also computes the global bitrate if possible.
1401 static void av_update_stream_timings(AVFormatContext *ic)
1403 int64_t start_time, start_time1, end_time, end_time1;
1404 int64_t duration, duration1;
1408 start_time = INT64_MAX;
1409 end_time = INT64_MIN;
1410 duration = INT64_MIN;
1411 for(i = 0;i < ic->nb_streams; i++) {
1412 st = ic->streams[i];
1413 if (st->start_time != AV_NOPTS_VALUE) {
1414 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1415 if (start_time1 < start_time)
1416 start_time = start_time1;
1417 if (st->duration != AV_NOPTS_VALUE) {
1418 end_time1 = start_time1
1419 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1420 if (end_time1 > end_time)
1421 end_time = end_time1;
1424 if (st->duration != AV_NOPTS_VALUE) {
1425 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1426 if (duration1 > duration)
1427 duration = duration1;
1430 if (start_time != INT64_MAX) {
1431 ic->start_time = start_time;
1432 if (end_time != INT64_MIN) {
1433 if (end_time - start_time > duration)
1434 duration = end_time - start_time;
1437 if (duration != INT64_MIN) {
1438 ic->duration = duration;
1439 if (ic->file_size > 0) {
1440 /* compute the bit rate */
1441 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1442 (double)ic->duration;
1447 static void fill_all_stream_timings(AVFormatContext *ic)
1452 av_update_stream_timings(ic);
1453 for(i = 0;i < ic->nb_streams; i++) {
1454 st = ic->streams[i];
1455 if (st->start_time == AV_NOPTS_VALUE) {
1456 if(ic->start_time != AV_NOPTS_VALUE)
1457 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1458 if(ic->duration != AV_NOPTS_VALUE)
1459 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1464 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1466 int64_t filesize, duration;
1470 /* if bit_rate is already set, we believe it */
1471 if (ic->bit_rate == 0) {
1473 for(i=0;i<ic->nb_streams;i++) {
1474 st = ic->streams[i];
1475 bit_rate += st->codec->bit_rate;
1477 ic->bit_rate = bit_rate;
1480 /* if duration is already set, we believe it */
1481 if (ic->duration == AV_NOPTS_VALUE &&
1482 ic->bit_rate != 0 &&
1483 ic->file_size != 0) {
1484 filesize = ic->file_size;
1486 for(i = 0; i < ic->nb_streams; i++) {
1487 st = ic->streams[i];
1488 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1489 if (st->duration == AV_NOPTS_VALUE)
1490 st->duration = duration;
1496 #define DURATION_MAX_READ_SIZE 250000
1498 /* only usable for MPEG-PS streams */
1499 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1501 AVPacket pkt1, *pkt = &pkt1;
1503 int read_size, i, ret;
1505 int64_t filesize, offset, duration;
1507 /* free previous packet */
1508 if (ic->cur_st && ic->cur_st->parser)
1509 av_free_packet(&ic->cur_pkt);
1512 /* flush packet queue */
1513 flush_packet_queue(ic);
1515 for(i=0;i<ic->nb_streams;i++) {
1516 st = ic->streams[i];
1518 av_parser_close(st->parser);
1523 /* we read the first packets to get the first PTS (not fully
1524 accurate, but it is enough now) */
1525 url_fseek(ic->pb, 0, SEEK_SET);
1528 if (read_size >= DURATION_MAX_READ_SIZE)
1530 /* if all info is available, we can stop */
1531 for(i = 0;i < ic->nb_streams; i++) {
1532 st = ic->streams[i];
1533 if (st->start_time == AV_NOPTS_VALUE)
1536 if (i == ic->nb_streams)
1539 ret = av_read_packet(ic, pkt);
1542 read_size += pkt->size;
1543 st = ic->streams[pkt->stream_index];
1544 if (pkt->pts != AV_NOPTS_VALUE) {
1545 if (st->start_time == AV_NOPTS_VALUE)
1546 st->start_time = pkt->pts;
1548 av_free_packet(pkt);
1551 /* estimate the end time (duration) */
1552 /* XXX: may need to support wrapping */
1553 filesize = ic->file_size;
1554 offset = filesize - DURATION_MAX_READ_SIZE;
1558 url_fseek(ic->pb, offset, SEEK_SET);
1561 if (read_size >= DURATION_MAX_READ_SIZE)
1564 ret = av_read_packet(ic, pkt);
1567 read_size += pkt->size;
1568 st = ic->streams[pkt->stream_index];
1569 if (pkt->pts != AV_NOPTS_VALUE &&
1570 st->start_time != AV_NOPTS_VALUE) {
1571 end_time = pkt->pts;
1572 duration = end_time - st->start_time;
1574 if (st->duration == AV_NOPTS_VALUE ||
1575 st->duration < duration)
1576 st->duration = duration;
1579 av_free_packet(pkt);
1582 fill_all_stream_timings(ic);
1584 url_fseek(ic->pb, old_offset, SEEK_SET);
1585 for(i=0; i<ic->nb_streams; i++){
1587 st->cur_dts= st->first_dts;
1588 st->last_IP_pts = AV_NOPTS_VALUE;
1592 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1596 /* get the file size, if possible */
1597 if (ic->iformat->flags & AVFMT_NOFILE) {
1600 file_size = url_fsize(ic->pb);
1604 ic->file_size = file_size;
1606 if ((!strcmp(ic->iformat->name, "mpeg") ||
1607 !strcmp(ic->iformat->name, "mpegts")) &&
1608 file_size && !url_is_streamed(ic->pb)) {
1609 /* get accurate estimate from the PTSes */
1610 av_estimate_timings_from_pts(ic, old_offset);
1611 } else if (av_has_duration(ic)) {
1612 /* at least one components has timings - we use them for all
1614 fill_all_stream_timings(ic);
1616 /* less precise: use bit rate info */
1617 av_estimate_timings_from_bit_rate(ic);
1619 av_update_stream_timings(ic);
1625 for(i = 0;i < ic->nb_streams; i++) {
1626 st = ic->streams[i];
1627 printf("%d: start_time: %0.3f duration: %0.3f\n",
1628 i, (double)st->start_time / AV_TIME_BASE,
1629 (double)st->duration / AV_TIME_BASE);
1631 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1632 (double)ic->start_time / AV_TIME_BASE,
1633 (double)ic->duration / AV_TIME_BASE,
1634 ic->bit_rate / 1000);
1639 static int has_codec_parameters(AVCodecContext *enc)
1642 switch(enc->codec_type) {
1643 case CODEC_TYPE_AUDIO:
1644 val = enc->sample_rate;
1646 case CODEC_TYPE_VIDEO:
1647 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1653 return (enc->codec_id != CODEC_ID_NONE && val != 0);
1656 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1660 int got_picture, data_size, ret=0;
1663 if(!st->codec->codec){
1664 codec = avcodec_find_decoder(st->codec->codec_id);
1667 ret = avcodec_open(st->codec, codec);
1672 if(!has_codec_parameters(st->codec)){
1673 switch(st->codec->codec_type) {
1674 case CODEC_TYPE_VIDEO:
1675 ret = avcodec_decode_video(st->codec, &picture,
1676 &got_picture, (uint8_t *)data, size);
1678 case CODEC_TYPE_AUDIO:
1679 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1680 samples = av_malloc(data_size);
1683 ret = avcodec_decode_audio2(st->codec, samples,
1684 &data_size, (uint8_t *)data, size);
1695 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
1698 fmt = av_probe_input_format2(pd, 1, &score);
1701 if (strncmp(fmt->name, "mp3", 3) == 0)
1702 st->codec->codec_id = CODEC_ID_MP3;
1703 else if (strncmp(fmt->name, "ac3", 3) == 0)
1704 st->codec->codec_id = CODEC_ID_AC3;
1709 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1711 while (tags->id != CODEC_ID_NONE) {
1719 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1722 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1723 if(tag == tags[i].tag)
1726 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1727 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1728 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1729 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1730 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1733 return CODEC_ID_NONE;
1736 unsigned int av_codec_get_tag(const AVCodecTag *tags[4], enum CodecID id)
1739 for(i=0; tags && tags[i]; i++){
1740 int tag= codec_get_tag(tags[i], id);
1746 enum CodecID av_codec_get_id(const AVCodecTag *tags[4], unsigned int tag)
1749 for(i=0; tags && tags[i]; i++){
1750 enum CodecID id= codec_get_id(tags[i], tag);
1751 if(id!=CODEC_ID_NONE) return id;
1753 return CODEC_ID_NONE;
1756 /* absolute maximum size we read until we abort */
1757 #define MAX_READ_SIZE 5000000
1759 #define MAX_STD_TIMEBASES (60*12+5)
1760 static int get_std_framerate(int i){
1761 if(i<60*12) return i*1001;
1762 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
1766 * Is the time base unreliable.
1767 * This is a heuristic to balance between quick acceptance of the values in
1768 * the headers vs. some extra checks.
1769 * Old divx and xvid often have nonsense timebases like 1fps or 2fps.
1770 * Mpeg2 commonly misuses field repeat flags to store different framerates.
1771 * And there are "variable" fps files this needs to detect as well.
1773 static int tb_unreliable(AVCodecContext *c){
1774 if( c->time_base.den >= 101L*c->time_base.num
1775 || c->time_base.den < 5L*c->time_base.num
1776 /* || c->codec_tag == ff_get_fourcc("DIVX")
1777 || c->codec_tag == ff_get_fourcc("XVID")*/
1778 || c->codec_id == CODEC_ID_MPEG2VIDEO)
1783 int av_find_stream_info(AVFormatContext *ic)
1785 int i, count, ret, read_size, j;
1787 AVPacket pkt1, *pkt;
1788 int64_t last_dts[MAX_STREAMS];
1789 int duration_count[MAX_STREAMS]={0};
1790 double (*duration_error)[MAX_STD_TIMEBASES];
1791 offset_t old_offset = url_ftell(ic->pb);
1792 int64_t codec_info_duration[MAX_STREAMS]={0};
1793 int codec_info_nb_frames[MAX_STREAMS]={0};
1794 AVProbeData probe_data[MAX_STREAMS];
1795 int codec_identified[MAX_STREAMS]={0};
1797 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1798 if (!duration_error) return AVERROR(ENOMEM);
1800 for(i=0;i<ic->nb_streams;i++) {
1801 st = ic->streams[i];
1802 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1803 /* if(!st->time_base.num)
1805 if(!st->codec->time_base.num)
1806 st->codec->time_base= st->time_base;
1808 //only for the split stuff
1810 st->parser = av_parser_init(st->codec->codec_id);
1811 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1812 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1817 for(i=0;i<MAX_STREAMS;i++){
1818 last_dts[i]= AV_NOPTS_VALUE;
1821 memset(probe_data, 0, sizeof(probe_data));
1825 /* check if one codec still needs to be handled */
1826 for(i=0;i<ic->nb_streams;i++) {
1827 st = ic->streams[i];
1828 if (!has_codec_parameters(st->codec))
1830 /* variable fps and no guess at the real fps */
1831 if( tb_unreliable(st->codec)
1832 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1834 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1836 if(st->first_dts == AV_NOPTS_VALUE)
1839 if (i == ic->nb_streams) {
1840 /* NOTE: if the format has no header, then we need to read
1841 some packets to get most of the streams, so we cannot
1843 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1844 /* if we found the info for all the codecs, we can stop */
1849 /* we did not get all the codec info, but we read too much data */
1850 if (read_size >= MAX_READ_SIZE) {
1855 /* NOTE: a new stream can be added there if no header in file
1856 (AVFMTCTX_NOHEADER) */
1857 ret = av_read_frame_internal(ic, &pkt1);
1860 ret = -1; /* we could not have all the codec parameters before EOF */
1861 for(i=0;i<ic->nb_streams;i++) {
1862 st = ic->streams[i];
1863 if (!has_codec_parameters(st->codec)){
1865 avcodec_string(buf, sizeof(buf), st->codec, 0);
1866 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1874 pkt= add_to_pktbuf(ic, &pkt1);
1875 if(av_dup_packet(pkt) < 0)
1876 return AVERROR(ENOMEM);
1878 read_size += pkt->size;
1880 st = ic->streams[pkt->stream_index];
1881 if(codec_info_nb_frames[st->index]>1)
1882 codec_info_duration[st->index] += pkt->duration;
1883 if (pkt->duration != 0)
1884 codec_info_nb_frames[st->index]++;
1887 int index= pkt->stream_index;
1888 int64_t last= last_dts[index];
1889 int64_t duration= pkt->dts - last;
1891 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
1892 double dur= duration * av_q2d(st->time_base);
1894 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1895 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
1896 if(duration_count[index] < 2)
1897 memset(duration_error, 0, MAX_STREAMS * sizeof(*duration_error));
1898 for(i=1; i<MAX_STD_TIMEBASES; i++){
1899 int framerate= get_std_framerate(i);
1900 int ticks= lrintf(dur*framerate/(1001*12));
1901 double error= dur - ticks*1001*12/(double)framerate;
1902 duration_error[index][i] += error*error;
1904 duration_count[index]++;
1906 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
1907 last_dts[pkt->stream_index]= pkt->dts;
1909 if (st->codec->codec_id == CODEC_ID_NONE) {
1910 AVProbeData *pd = &(probe_data[st->index]);
1911 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
1912 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
1913 pd->buf_size += pkt->size;
1914 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
1917 if(st->parser && st->parser->parser->split && !st->codec->extradata){
1918 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
1920 st->codec->extradata_size= i;
1921 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1922 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
1923 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1927 /* if still no information, we try to open the codec and to
1928 decompress the frame. We try to avoid that in most cases as
1929 it takes longer and uses more memory. For MPEG4, we need to
1930 decompress for Quicktime. */
1931 if (!has_codec_parameters(st->codec) /*&&
1932 (st->codec->codec_id == CODEC_ID_FLV1 ||
1933 st->codec->codec_id == CODEC_ID_H264 ||
1934 st->codec->codec_id == CODEC_ID_H263 ||
1935 st->codec->codec_id == CODEC_ID_H261 ||
1936 st->codec->codec_id == CODEC_ID_VORBIS ||
1937 st->codec->codec_id == CODEC_ID_MJPEG ||
1938 st->codec->codec_id == CODEC_ID_PNG ||
1939 st->codec->codec_id == CODEC_ID_PAM ||
1940 st->codec->codec_id == CODEC_ID_PGM ||
1941 st->codec->codec_id == CODEC_ID_PGMYUV ||
1942 st->codec->codec_id == CODEC_ID_PBM ||
1943 st->codec->codec_id == CODEC_ID_PPM ||
1944 st->codec->codec_id == CODEC_ID_SHORTEN ||
1945 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
1946 try_decode_frame(st, pkt->data, pkt->size);
1948 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) {
1954 // close codecs which where opened in try_decode_frame()
1955 for(i=0;i<ic->nb_streams;i++) {
1956 st = ic->streams[i];
1957 if(st->codec->codec)
1958 avcodec_close(st->codec);
1960 for(i=0;i<ic->nb_streams;i++) {
1961 st = ic->streams[i];
1962 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1963 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
1964 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
1966 if(duration_count[i]
1967 && tb_unreliable(st->codec) /*&&
1968 //FIXME we should not special case mpeg2, but this needs testing with non mpeg2 ...
1969 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
1970 double best_error= 2*av_q2d(st->time_base);
1971 best_error= best_error*best_error*duration_count[i]*1000*12*30;
1973 for(j=1; j<MAX_STD_TIMEBASES; j++){
1974 double error= duration_error[i][j] * get_std_framerate(j);
1975 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1976 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
1977 if(error < best_error){
1979 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
1984 if (!st->r_frame_rate.num){
1985 if( st->codec->time_base.den * (int64_t)st->time_base.num
1986 <= st->codec->time_base.num * (int64_t)st->time_base.den){
1987 st->r_frame_rate.num = st->codec->time_base.den;
1988 st->r_frame_rate.den = st->codec->time_base.num;
1990 st->r_frame_rate.num = st->time_base.den;
1991 st->r_frame_rate.den = st->time_base.num;
1994 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
1995 if (st->codec->codec_id == CODEC_ID_NONE && probe_data[st->index].buf_size > 0) {
1996 codec_identified[st->index] = set_codec_from_probe_data(st, &(probe_data[st->index]), 1);
1997 if (codec_identified[st->index]) {
1998 st->need_parsing = AVSTREAM_PARSE_FULL;
2001 if(!st->codec->bits_per_sample)
2002 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
2006 av_estimate_timings(ic, old_offset);
2008 for(i=0;i<ic->nb_streams;i++) {
2009 st = ic->streams[i];
2010 if (codec_identified[st->index])
2013 //FIXME this is a mess
2014 if(i!=ic->nb_streams){
2015 av_read_frame_flush(ic);
2016 for(i=0;i<ic->nb_streams;i++) {
2017 st = ic->streams[i];
2018 if (codec_identified[st->index]) {
2019 av_seek_frame(ic, st->index, 0.0, 0);
2021 st->cur_dts= st->first_dts;
2023 url_fseek(ic->pb, ic->data_offset, SEEK_SET);
2027 /* correct DTS for b frame streams with no timestamps */
2028 for(i=0;i<ic->nb_streams;i++) {
2029 st = ic->streams[i];
2030 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2032 ppktl = &ic->packet_buffer;
2034 if(ppkt1->stream_index != i)
2036 if(ppkt1->pkt->dts < 0)
2038 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2040 ppkt1->pkt->dts -= delta;
2045 st->cur_dts -= delta;
2051 av_free(duration_error);
2052 for(i=0;i<MAX_STREAMS;i++){
2053 av_freep(&(probe_data[i].buf));
2059 /*******************************************************/
2061 int av_read_play(AVFormatContext *s)
2063 if (s->iformat->read_play)
2064 return s->iformat->read_play(s);
2066 return av_url_read_fpause(s->pb, 0);
2067 return AVERROR(ENOSYS);
2070 int av_read_pause(AVFormatContext *s)
2072 if (s->iformat->read_pause)
2073 return s->iformat->read_pause(s);
2075 return av_url_read_fpause(s->pb, 1);
2076 return AVERROR(ENOSYS);
2079 void av_close_input_stream(AVFormatContext *s)
2084 /* free previous packet */
2085 if (s->cur_st && s->cur_st->parser)
2086 av_free_packet(&s->cur_pkt);
2088 if (s->iformat->read_close)
2089 s->iformat->read_close(s);
2090 for(i=0;i<s->nb_streams;i++) {
2091 /* free all data in a stream component */
2094 av_parser_close(st->parser);
2096 av_free(st->index_entries);
2097 av_free(st->codec->extradata);
2101 for(i=s->nb_programs-1; i>=0; i--) {
2102 av_freep(&s->programs[i]->provider_name);
2103 av_freep(&s->programs[i]->name);
2104 av_freep(&s->programs[i]->stream_index);
2105 av_freep(&s->programs[i]);
2107 flush_packet_queue(s);
2108 av_freep(&s->priv_data);
2112 void av_close_input_file(AVFormatContext *s)
2114 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2115 av_close_input_stream(s);
2120 AVStream *av_new_stream(AVFormatContext *s, int id)
2125 if (s->nb_streams >= MAX_STREAMS)
2128 st = av_mallocz(sizeof(AVStream));
2132 st->codec= avcodec_alloc_context();
2134 /* no default bitrate if decoding */
2135 st->codec->bit_rate = 0;
2137 st->index = s->nb_streams;
2139 st->start_time = AV_NOPTS_VALUE;
2140 st->duration = AV_NOPTS_VALUE;
2141 st->cur_dts = AV_NOPTS_VALUE;
2142 st->first_dts = AV_NOPTS_VALUE;
2144 /* default pts settings is MPEG like */
2145 av_set_pts_info(st, 33, 1, 90000);
2146 st->last_IP_pts = AV_NOPTS_VALUE;
2147 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2148 st->pts_buffer[i]= AV_NOPTS_VALUE;
2150 s->streams[s->nb_streams++] = st;
2154 AVProgram *av_new_program(AVFormatContext *ac, int id)
2156 AVProgram *program=NULL;
2160 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2163 for(i=0; i<ac->nb_programs; i++)
2164 if(ac->programs[i]->id == id)
2165 program = ac->programs[i];
2168 program = av_mallocz(sizeof(AVProgram));
2171 dynarray_add(&ac->programs, &ac->nb_programs, program);
2172 program->discard = AVDISCARD_NONE;
2179 void av_set_program_name(AVProgram *program, char *provider_name, char *name)
2181 assert(!provider_name == !name);
2183 av_free(program->provider_name);
2184 av_free(program-> name);
2185 program->provider_name = av_strdup(provider_name);
2186 program-> name = av_strdup( name);
2191 /************************************************************/
2192 /* output media file */
2194 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2198 if (s->oformat->priv_data_size > 0) {
2199 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2201 return AVERROR(ENOMEM);
2203 s->priv_data = NULL;
2205 if (s->oformat->set_parameters) {
2206 ret = s->oformat->set_parameters(s, ap);
2213 int av_write_header(AVFormatContext *s)
2218 // some sanity checks
2219 for(i=0;i<s->nb_streams;i++) {
2222 switch (st->codec->codec_type) {
2223 case CODEC_TYPE_AUDIO:
2224 if(st->codec->sample_rate<=0){
2225 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2229 case CODEC_TYPE_VIDEO:
2230 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2231 av_log(s, AV_LOG_ERROR, "time base not set\n");
2234 if(st->codec->width<=0 || st->codec->height<=0){
2235 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2241 if(s->oformat->codec_tag){
2242 if(st->codec->codec_tag){
2244 //check that tag + id is in the table
2245 //if neither is in the table -> ok
2246 //if tag is in the table with another id -> FAIL
2247 //if id is in the table with another tag -> FAIL unless strict < ?
2249 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2253 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2254 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2256 return AVERROR(ENOMEM);
2259 if(s->oformat->write_header){
2260 ret = s->oformat->write_header(s);
2265 /* init PTS generation */
2266 for(i=0;i<s->nb_streams;i++) {
2267 int64_t den = AV_NOPTS_VALUE;
2270 switch (st->codec->codec_type) {
2271 case CODEC_TYPE_AUDIO:
2272 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2274 case CODEC_TYPE_VIDEO:
2275 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2280 if (den != AV_NOPTS_VALUE) {
2282 return AVERROR_INVALIDDATA;
2283 av_frac_init(&st->pts, 0, 0, den);
2289 //FIXME merge with compute_pkt_fields
2290 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2291 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2292 int num, den, frame_size, i;
2294 // 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);
2296 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2299 /* duration field */
2300 if (pkt->duration == 0) {
2301 compute_frame_duration(&num, &den, st, NULL, pkt);
2303 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2307 //XXX/FIXME this is a temporary hack until all encoders output pts
2308 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2310 // pkt->pts= st->cur_dts;
2311 pkt->pts= st->pts.val;
2314 //calculate dts from pts
2315 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2316 st->pts_buffer[0]= pkt->pts;
2317 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2318 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2319 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2320 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2322 pkt->dts= st->pts_buffer[0];
2325 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2326 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2329 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2330 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2334 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2335 st->cur_dts= pkt->dts;
2336 st->pts.val= pkt->dts;
2339 switch (st->codec->codec_type) {
2340 case CODEC_TYPE_AUDIO:
2341 frame_size = get_audio_frame_size(st->codec, pkt->size);
2343 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2344 but it would be better if we had the real timestamps from the encoder */
2345 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2346 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2349 case CODEC_TYPE_VIDEO:
2350 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2358 static void truncate_ts(AVStream *st, AVPacket *pkt){
2359 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2362 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2364 if (pkt->pts != AV_NOPTS_VALUE)
2365 pkt->pts &= pts_mask;
2366 if (pkt->dts != AV_NOPTS_VALUE)
2367 pkt->dts &= pts_mask;
2370 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2374 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2375 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2378 truncate_ts(s->streams[pkt->stream_index], pkt);
2380 ret= s->oformat->write_packet(s, pkt);
2382 ret= url_ferror(s->pb);
2386 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2387 AVPacketList *pktl, **next_point, *this_pktl;
2389 int streams[MAX_STREAMS];
2392 AVStream *st= s->streams[ pkt->stream_index];
2394 // assert(pkt->destruct != av_destruct_packet); //FIXME
2396 this_pktl = av_mallocz(sizeof(AVPacketList));
2397 this_pktl->pkt= *pkt;
2398 if(pkt->destruct == av_destruct_packet)
2399 pkt->destruct= NULL; // non shared -> must keep original from being freed
2401 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2403 next_point = &s->packet_buffer;
2405 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2406 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2407 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2408 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2410 next_point= &(*next_point)->next;
2412 this_pktl->next= *next_point;
2413 *next_point= this_pktl;
2416 memset(streams, 0, sizeof(streams));
2417 pktl= s->packet_buffer;
2419 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2420 if(streams[ pktl->pkt.stream_index ] == 0)
2422 streams[ pktl->pkt.stream_index ]++;
2426 if(s->nb_streams == stream_count || (flush && stream_count)){
2427 pktl= s->packet_buffer;
2430 s->packet_buffer= pktl->next;
2434 av_init_packet(out);
2440 * Interleaves a AVPacket correctly so it can be muxed.
2441 * @param out the interleaved packet will be output here
2442 * @param in the input packet
2443 * @param flush 1 if no further packets are available as input and all
2444 * remaining packets should be output
2445 * @return 1 if a packet was output, 0 if no packet could be output,
2446 * < 0 if an error occured
2448 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2449 if(s->oformat->interleave_packet)
2450 return s->oformat->interleave_packet(s, out, in, flush);
2452 return av_interleave_packet_per_dts(s, out, in, flush);
2455 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2456 AVStream *st= s->streams[ pkt->stream_index];
2458 //FIXME/XXX/HACK drop zero sized packets
2459 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2462 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2463 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2466 if(pkt->dts == AV_NOPTS_VALUE)
2471 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2472 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2475 truncate_ts(s->streams[opkt.stream_index], &opkt);
2476 ret= s->oformat->write_packet(s, &opkt);
2478 av_free_packet(&opkt);
2483 if(url_ferror(s->pb))
2484 return url_ferror(s->pb);
2488 int av_write_trailer(AVFormatContext *s)
2494 ret= av_interleave_packet(s, &pkt, NULL, 1);
2495 if(ret<0) //FIXME cleanup needed for ret<0 ?
2500 truncate_ts(s->streams[pkt.stream_index], &pkt);
2501 ret= s->oformat->write_packet(s, &pkt);
2503 av_free_packet(&pkt);
2507 if(url_ferror(s->pb))
2511 if(s->oformat->write_trailer)
2512 ret = s->oformat->write_trailer(s);
2515 ret=url_ferror(s->pb);
2516 for(i=0;i<s->nb_streams;i++)
2517 av_freep(&s->streams[i]->priv_data);
2518 av_freep(&s->priv_data);
2522 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2525 AVProgram *program=NULL;
2528 for(i=0; i<ac->nb_programs; i++){
2529 if(ac->programs[i]->id != progid)
2531 program = ac->programs[i];
2532 for(j=0; j<program->nb_stream_indexes; j++)
2533 if(program->stream_index[j] == idx)
2536 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2539 program->stream_index = tmp;
2540 program->stream_index[program->nb_stream_indexes++] = idx;
2545 /* "user interface" functions */
2546 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2549 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2550 AVStream *st = ic->streams[i];
2551 int g = ff_gcd(st->time_base.num, st->time_base.den);
2552 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2553 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2554 /* the pid is an important information, so we display it */
2555 /* XXX: add a generic system */
2556 if (flags & AVFMT_SHOW_IDS)
2557 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2558 if (strlen(st->language) > 0)
2559 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2560 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2561 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2562 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2563 if(st->r_frame_rate.den && st->r_frame_rate.num)
2564 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(r)", av_q2d(st->r_frame_rate));
2565 /* else if(st->time_base.den && st->time_base.num)
2566 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(m)", 1/av_q2d(st->time_base));*/
2568 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(c)", 1/av_q2d(st->codec->time_base));
2570 av_log(NULL, AV_LOG_INFO, "\n");
2573 void dump_format(AVFormatContext *ic,
2580 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2581 is_output ? "Output" : "Input",
2583 is_output ? ic->oformat->name : ic->iformat->name,
2584 is_output ? "to" : "from", url);
2586 av_log(NULL, AV_LOG_INFO, " Duration: ");
2587 if (ic->duration != AV_NOPTS_VALUE) {
2588 int hours, mins, secs, us;
2589 secs = ic->duration / AV_TIME_BASE;
2590 us = ic->duration % AV_TIME_BASE;
2595 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs,
2596 (10 * us) / AV_TIME_BASE);
2598 av_log(NULL, AV_LOG_INFO, "N/A");
2600 if (ic->start_time != AV_NOPTS_VALUE) {
2602 av_log(NULL, AV_LOG_INFO, ", start: ");
2603 secs = ic->start_time / AV_TIME_BASE;
2604 us = ic->start_time % AV_TIME_BASE;
2605 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2606 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2608 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2610 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2612 av_log(NULL, AV_LOG_INFO, "N/A");
2614 av_log(NULL, AV_LOG_INFO, "\n");
2616 if(ic->nb_programs) {
2618 for(j=0; j<ic->nb_programs; j++) {
2619 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2620 ic->programs[j]->name ? ic->programs[j]->name : "");
2621 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++)
2622 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2625 for(i=0;i<ic->nb_streams;i++)
2626 dump_stream_format(ic, i, index, is_output);
2629 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2631 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2634 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2636 AVRational frame_rate;
2637 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2638 *frame_rate_num= frame_rate.num;
2639 *frame_rate_den= frame_rate.den;
2644 * gets the current time in micro seconds.
2646 int64_t av_gettime(void)
2649 gettimeofday(&tv,NULL);
2650 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2653 int64_t parse_date(const char *datestr, int duration)
2659 static const char *date_fmt[] = {
2663 static const char *time_fmt[] = {
2673 time_t now = time(0);
2675 len = strlen(datestr);
2677 lastch = datestr[len - 1];
2680 is_utc = (lastch == 'z' || lastch == 'Z');
2682 memset(&dt, 0, sizeof(dt));
2687 /* parse the year-month-day part */
2688 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2689 q = small_strptime(p, date_fmt[i], &dt);
2695 /* if the year-month-day part is missing, then take the
2696 * current year-month-day time */
2701 dt = *localtime(&now);
2703 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2708 if (*p == 'T' || *p == 't' || *p == ' ')
2711 /* parse the hour-minute-second part */
2712 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2713 q = small_strptime(p, time_fmt[i], &dt);
2719 /* parse datestr as a duration */
2724 /* parse datestr as HH:MM:SS */
2725 q = small_strptime(p, time_fmt[0], &dt);
2727 /* parse datestr as S+ */
2728 dt.tm_sec = strtol(p, (char **)&q, 10);
2730 /* the parsing didn't succeed */
2737 /* Now we have all the fields that we can get */
2743 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2745 dt.tm_isdst = -1; /* unknown */
2755 /* parse the .m... part */
2759 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2762 val += n * (*q - '0');
2766 return negative ? -t : t;
2769 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2779 while (*p != '\0' && *p != '=' && *p != '&') {
2780 if ((q - tag) < sizeof(tag) - 1)
2788 while (*p != '&' && *p != '\0') {
2789 if ((q - arg) < arg_size - 1) {
2799 if (!strcmp(tag, tag1))
2808 int av_get_frame_filename(char *buf, int buf_size,
2809 const char *path, int number)
2812 char *q, buf1[20], c;
2813 int nd, len, percentd_found;
2825 while (isdigit(*p)) {
2826 nd = nd * 10 + *p++ - '0';
2829 } while (isdigit(c));
2838 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2840 if ((q - buf + len) > buf_size - 1)
2842 memcpy(q, buf1, len);
2850 if ((q - buf) < buf_size - 1)
2854 if (!percentd_found)
2863 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
2866 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2868 for(i=0;i<size;i+=16) {
2875 PRINT(" %02x", buf[i+j]);
2880 for(j=0;j<len;j++) {
2882 if (c < ' ' || c > '~')
2891 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2893 hex_dump_internal(NULL, f, 0, buf, size);
2896 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
2898 hex_dump_internal(avcl, NULL, level, buf, size);
2901 //FIXME needs to know the time_base
2902 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
2904 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2905 PRINT("stream #%d:\n", pkt->stream_index);
2906 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2907 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2908 /* DTS is _always_ valid after av_read_frame() */
2910 if (pkt->dts == AV_NOPTS_VALUE)
2913 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
2914 /* PTS may be not known if B frames are present */
2916 if (pkt->pts == AV_NOPTS_VALUE)
2919 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
2921 PRINT(" size=%d\n", pkt->size);
2924 av_hex_dump(f, pkt->data, pkt->size);
2927 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2929 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
2932 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
2934 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
2937 void url_split(char *proto, int proto_size,
2938 char *authorization, int authorization_size,
2939 char *hostname, int hostname_size,
2941 char *path, int path_size,
2944 const char *p, *ls, *at, *col, *brk, *q;
2946 if (port_ptr) *port_ptr = -1;
2947 if (proto_size > 0) proto[0] = 0;
2948 if (authorization_size > 0) authorization[0] = 0;
2949 if (hostname_size > 0) hostname[0] = 0;
2950 if (path_size > 0) path[0] = 0;
2952 /* parse protocol */
2953 if ((p = strchr(url, ':'))) {
2954 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
2959 /* no protocol means plain filename */
2960 av_strlcpy(path, url, path_size);
2964 /* separate path from hostname */
2965 if ((ls = strchr(p, '/'))) {
2966 if ((q = strchr(ls, '?')))
2967 av_strlcpy(path, ls, FFMIN(path_size, q - ls + 1));
2969 av_strlcpy(path, ls, path_size);
2970 } else if (!(ls = strchr(p, '?')))
2971 ls = &p[strlen(p)]; // XXX
2973 /* the rest is hostname, use that to parse auth/port */
2975 /* authorization (user[:pass]@hostname) */
2976 if ((at = strchr(p, '@')) && at < ls) {
2977 av_strlcpy(authorization, p,
2978 FFMIN(authorization_size, at + 1 - p));
2979 p = at + 1; /* skip '@' */
2982 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
2984 av_strlcpy(hostname, p + 1,
2985 FFMIN(hostname_size, brk - p));
2986 if (brk[1] == ':' && port_ptr)
2987 *port_ptr = atoi(brk + 2);
2988 } else if ((col = strchr(p, ':')) && col < ls) {
2989 av_strlcpy(hostname, p,
2990 FFMIN(col + 1 - p, hostname_size));
2991 if (port_ptr) *port_ptr = atoi(col + 1);
2993 av_strlcpy(hostname, p,
2994 FFMIN(ls + 1 - p, hostname_size));
2998 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
2999 int pts_num, int pts_den)
3001 s->pts_wrap_bits = pts_wrap_bits;
3002 s->time_base.num = pts_num;
3003 s->time_base.den = pts_den;
3006 /* fraction handling */
3009 * f = val + (num / den) + 0.5.
3011 * 'num' is normalized so that it is such as 0 <= num < den.
3013 * @param f fractional number
3014 * @param val integer value
3015 * @param num must be >= 0
3016 * @param den must be >= 1
3018 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
3031 * Fractionnal addition to f: f = f + (incr / f->den).
3033 * @param f fractional number
3034 * @param incr increment, can be positive or negative
3036 static void av_frac_add(AVFrac *f, int64_t incr)
3040 num = f->num + incr;
3043 f->val += num / den;
3049 } else if (num >= den) {
3050 f->val += num / den;