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)
420 int err, must_open_file, file_opened, probe_size;
421 AVProbeData probe_data, *pd = &probe_data;
427 pd->filename = filename;
432 /* guess format if no file can be opened */
433 fmt = av_probe_input_format(pd, 0);
436 /* do not open file if the format does not need it. XXX: specific
437 hack needed to handle RTSP/TCP */
439 if (fmt && (fmt->flags & AVFMT_NOFILE)) {
441 pb= NULL; //FIXME this or memset(pb, 0, sizeof(ByteIOContext)); otherwise it is uninitialized
444 if (!fmt || must_open_file) {
445 /* if no file needed do not try to open one */
446 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
451 url_setbufsize(pb, buf_size);
454 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
455 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
456 /* read probe data */
457 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
458 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
459 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
460 if (url_fseek(pb, 0, SEEK_SET) < 0) {
462 if (url_fopen(&pb, filename, URL_RDONLY) < 0) {
468 /* guess file format */
469 fmt = av_probe_input_format2(pd, 1, &score);
474 /* if still no format found, error */
480 /* check filename in case of an image number is expected */
481 if (fmt->flags & AVFMT_NEEDNUMBER) {
482 if (!av_filename_number_test(filename)) {
483 err = AVERROR_NUMEXPECTED;
487 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
500 /*******************************************************/
502 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
505 return s->iformat->read_packet(s, pkt);
508 /**********************************************************/
511 * Get the number of samples of an audio frame. Return (-1) if error.
513 static int get_audio_frame_size(AVCodecContext *enc, int size)
517 if (enc->frame_size <= 1) {
518 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
520 if (bits_per_sample) {
521 if (enc->channels == 0)
523 frame_size = (size << 3) / (bits_per_sample * enc->channels);
525 /* used for example by ADPCM codecs */
526 if (enc->bit_rate == 0)
528 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
531 frame_size = enc->frame_size;
538 * Return the frame duration in seconds, return 0 if not available.
540 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
541 AVCodecParserContext *pc, AVPacket *pkt)
547 switch(st->codec->codec_type) {
548 case CODEC_TYPE_VIDEO:
549 if(st->time_base.num*1000LL > st->time_base.den){
550 *pnum = st->time_base.num;
551 *pden = st->time_base.den;
552 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
553 *pnum = st->codec->time_base.num;
554 *pden = st->codec->time_base.den;
555 if (pc && pc->repeat_pict) {
557 *pnum = (*pnum) * (2 + pc->repeat_pict);
561 case CODEC_TYPE_AUDIO:
562 frame_size = get_audio_frame_size(st->codec, pkt->size);
566 *pden = st->codec->sample_rate;
573 static int is_intra_only(AVCodecContext *enc){
574 if(enc->codec_type == CODEC_TYPE_AUDIO){
576 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
577 switch(enc->codec_id){
579 case CODEC_ID_MJPEGB:
581 case CODEC_ID_RAWVIDEO:
582 case CODEC_ID_DVVIDEO:
583 case CODEC_ID_HUFFYUV:
584 case CODEC_ID_FFVHUFF:
595 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
596 int64_t dts, int64_t pts)
598 AVStream *st= s->streams[stream_index];
599 AVPacketList *pktl= s->packet_buffer;
601 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE)
604 st->first_dts= dts - st->cur_dts;
607 for(; pktl; pktl= pktl->next){
608 if(pktl->pkt.stream_index != stream_index)
610 //FIXME think more about this check
611 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
612 pktl->pkt.pts += st->first_dts;
614 if(pktl->pkt.dts != AV_NOPTS_VALUE)
615 pktl->pkt.dts += st->first_dts;
617 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
618 st->start_time= pktl->pkt.pts;
620 if (st->start_time == AV_NOPTS_VALUE)
621 st->start_time = pts;
624 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
625 AVCodecParserContext *pc, AVPacket *pkt)
627 int num, den, presentation_delayed, delay, i;
630 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
631 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
632 pkt->dts -= 1LL<<st->pts_wrap_bits;
635 if (pkt->duration == 0) {
636 compute_frame_duration(&num, &den, st, pc, pkt);
638 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
642 /* correct timestamps with byte offset if demuxers only have timestamps on packet boundaries */
643 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
644 /* this will estimate bitrate based on this frame's duration and size */
645 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
646 if(pkt->pts != AV_NOPTS_VALUE)
648 if(pkt->dts != AV_NOPTS_VALUE)
652 /* do we have a video B frame ? */
653 delay= st->codec->has_b_frames;
654 presentation_delayed = 0;
655 /* XXX: need has_b_frame, but cannot get it if the codec is
658 pc && pc->pict_type != FF_B_TYPE)
659 presentation_delayed = 1;
660 /* This may be redundant, but it should not hurt. */
661 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
662 presentation_delayed = 1;
664 if(st->cur_dts == AV_NOPTS_VALUE){
665 st->cur_dts = 0; //FIXME maybe set it to 0 during init
668 // 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);
669 /* interpolate PTS and DTS if they are not present */
671 if (presentation_delayed) {
672 /* DTS = decompression time stamp */
673 /* PTS = presentation time stamp */
674 if (pkt->dts == AV_NOPTS_VALUE)
675 pkt->dts = st->last_IP_pts;
676 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
677 if (pkt->dts == AV_NOPTS_VALUE)
678 pkt->dts = st->cur_dts;
680 /* this is tricky: the dts must be incremented by the duration
681 of the frame we are displaying, i.e. the last I or P frame */
682 if (st->last_IP_duration == 0)
683 st->last_IP_duration = pkt->duration;
684 st->cur_dts = pkt->dts + st->last_IP_duration;
685 st->last_IP_duration = pkt->duration;
686 st->last_IP_pts= pkt->pts;
687 /* cannot compute PTS if not present (we can compute it only
688 by knowing the futur */
689 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
690 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
691 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
692 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
693 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
694 pkt->pts += pkt->duration;
695 // 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);
699 /* presentation is not delayed : PTS and DTS are the same */
700 if(pkt->pts == AV_NOPTS_VALUE)
702 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
703 if(pkt->pts == AV_NOPTS_VALUE)
704 pkt->pts = st->cur_dts;
706 st->cur_dts = pkt->pts + pkt->duration;
710 if(pkt->pts != AV_NOPTS_VALUE){
711 st->pts_buffer[0]= pkt->pts;
712 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
713 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
714 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
715 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
716 if(pkt->dts == AV_NOPTS_VALUE)
717 pkt->dts= st->pts_buffer[0];
719 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
721 if(pkt->dts > st->cur_dts)
722 st->cur_dts = pkt->dts;
725 // 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);
728 if(is_intra_only(st->codec))
729 pkt->flags |= PKT_FLAG_KEY;
732 /* key frame computation */
733 if (pc->pict_type == FF_I_TYPE)
734 pkt->flags |= PKT_FLAG_KEY;
738 void av_destruct_packet_nofree(AVPacket *pkt)
740 pkt->data = NULL; pkt->size = 0;
743 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
751 /* select current input stream component */
754 if (!st->need_parsing || !st->parser) {
755 /* no parsing needed: we just output the packet as is */
756 /* raw data support */
758 compute_pkt_fields(s, st, NULL, pkt);
761 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
762 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
763 s->cur_ptr, s->cur_len,
764 s->cur_pkt.pts, s->cur_pkt.dts);
765 s->cur_pkt.pts = AV_NOPTS_VALUE;
766 s->cur_pkt.dts = AV_NOPTS_VALUE;
767 /* increment read pointer */
771 /* return packet if any */
774 pkt->pos = s->cur_pkt.pos; // Isn't quite accurate but close.
776 pkt->stream_index = st->index;
777 pkt->pts = st->parser->pts;
778 pkt->dts = st->parser->dts;
779 pkt->destruct = av_destruct_packet_nofree;
780 compute_pkt_fields(s, st, st->parser, pkt);
782 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
783 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
784 0, 0, AVINDEX_KEYFRAME);
791 av_free_packet(&s->cur_pkt);
795 /* read next packet */
796 ret = av_read_packet(s, &s->cur_pkt);
798 if (ret == AVERROR(EAGAIN))
800 /* return the last frames, if any */
801 for(i = 0; i < s->nb_streams; i++) {
803 if (st->parser && st->need_parsing) {
804 av_parser_parse(st->parser, st->codec,
805 &pkt->data, &pkt->size,
807 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
812 /* no more packets: really terminates parsing */
816 st = s->streams[s->cur_pkt.stream_index];
817 if(st->codec->debug & FF_DEBUG_PTS)
818 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
819 s->cur_pkt.stream_index,
825 s->cur_ptr = s->cur_pkt.data;
826 s->cur_len = s->cur_pkt.size;
827 if (st->need_parsing && !st->parser) {
828 st->parser = av_parser_init(st->codec->codec_id);
830 /* no parser available : just output the raw packets */
831 st->need_parsing = AVSTREAM_PARSE_NONE;
832 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
833 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
835 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
836 st->parser->last_frame_offset=
837 st->parser->cur_offset= s->cur_pkt.pos;
842 if(st->codec->debug & FF_DEBUG_PTS)
843 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
852 static AVPacket *add_to_pktbuf(AVFormatContext *s, AVPacket *pkt){
853 AVPacketList *pktl= s->packet_buffer;
854 AVPacketList **plast_pktl= &s->packet_buffer;
856 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
858 pktl = av_mallocz(sizeof(AVPacketList));
862 /* add the packet in the buffered packet list */
868 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
872 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
875 pktl = s->packet_buffer;
877 AVPacket *next_pkt= &pktl->pkt;
879 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
880 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
881 if( pktl->pkt.stream_index == next_pkt->stream_index
882 && next_pkt->dts < pktl->pkt.dts
883 && pktl->pkt.pts != pktl->pkt.dts //not b frame
884 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
885 next_pkt->pts= pktl->pkt.dts;
889 pktl = s->packet_buffer;
892 if( next_pkt->pts != AV_NOPTS_VALUE
893 || next_pkt->dts == AV_NOPTS_VALUE
895 /* read packet from packet buffer, if there is data */
897 s->packet_buffer = pktl->next;
903 int ret= av_read_frame_internal(s, pkt);
905 if(pktl && ret != AVERROR(EAGAIN)){
912 if(av_dup_packet(add_to_pktbuf(s, pkt)) < 0)
913 return AVERROR(ENOMEM);
915 assert(!s->packet_buffer);
916 return av_read_frame_internal(s, pkt);
921 /* XXX: suppress the packet queue */
922 static void flush_packet_queue(AVFormatContext *s)
927 pktl = s->packet_buffer;
930 s->packet_buffer = pktl->next;
931 av_free_packet(&pktl->pkt);
936 /*******************************************************/
939 int av_find_default_stream_index(AVFormatContext *s)
944 if (s->nb_streams <= 0)
946 for(i = 0; i < s->nb_streams; i++) {
948 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
956 * Flush the frame reader.
958 static void av_read_frame_flush(AVFormatContext *s)
963 flush_packet_queue(s);
965 /* free previous packet */
967 if (s->cur_st->parser)
968 av_free_packet(&s->cur_pkt);
975 /* for each stream, reset read state */
976 for(i = 0; i < s->nb_streams; i++) {
980 av_parser_close(st->parser);
983 st->last_IP_pts = AV_NOPTS_VALUE;
984 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
988 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
991 for(i = 0; i < s->nb_streams; i++) {
992 AVStream *st = s->streams[i];
994 st->cur_dts = av_rescale(timestamp,
995 st->time_base.den * (int64_t)ref_st->time_base.num,
996 st->time_base.num * (int64_t)ref_st->time_base.den);
1000 int av_add_index_entry(AVStream *st,
1001 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1003 AVIndexEntry *entries, *ie;
1006 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1009 entries = av_fast_realloc(st->index_entries,
1010 &st->index_entries_allocated_size,
1011 (st->nb_index_entries + 1) *
1012 sizeof(AVIndexEntry));
1016 st->index_entries= entries;
1018 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1021 index= st->nb_index_entries++;
1022 ie= &entries[index];
1023 assert(index==0 || ie[-1].timestamp < timestamp);
1025 ie= &entries[index];
1026 if(ie->timestamp != timestamp){
1027 if(ie->timestamp <= timestamp)
1029 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1030 st->nb_index_entries++;
1031 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1032 distance= ie->min_distance;
1036 ie->timestamp = timestamp;
1037 ie->min_distance= distance;
1044 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1047 AVIndexEntry *entries= st->index_entries;
1048 int nb_entries= st->nb_index_entries;
1057 timestamp = entries[m].timestamp;
1058 if(timestamp >= wanted_timestamp)
1060 if(timestamp <= wanted_timestamp)
1063 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1065 if(!(flags & AVSEEK_FLAG_ANY)){
1066 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1067 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1078 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1079 AVInputFormat *avif= s->iformat;
1080 int64_t pos_min, pos_max, pos, pos_limit;
1081 int64_t ts_min, ts_max, ts;
1085 if (stream_index < 0)
1089 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1093 ts_min= AV_NOPTS_VALUE;
1094 pos_limit= -1; //gcc falsely says it may be uninitialized
1096 st= s->streams[stream_index];
1097 if(st->index_entries){
1100 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()
1101 index= FFMAX(index, 0);
1102 e= &st->index_entries[index];
1104 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1106 ts_min= e->timestamp;
1108 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1115 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1116 assert(index < st->nb_index_entries);
1118 e= &st->index_entries[index];
1119 assert(e->timestamp >= target_ts);
1121 ts_max= e->timestamp;
1122 pos_limit= pos_max - e->min_distance;
1124 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1125 pos_max,pos_limit, ts_max);
1130 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1135 url_fseek(s->pb, pos, SEEK_SET);
1137 av_update_cur_dts(s, st, ts);
1142 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 )){
1144 int64_t start_pos, filesize;
1148 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1151 if(ts_min == AV_NOPTS_VALUE){
1152 pos_min = s->data_offset;
1153 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1154 if (ts_min == AV_NOPTS_VALUE)
1158 if(ts_max == AV_NOPTS_VALUE){
1160 filesize = url_fsize(s->pb);
1161 pos_max = filesize - 1;
1164 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1166 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1167 if (ts_max == AV_NOPTS_VALUE)
1171 int64_t tmp_pos= pos_max + 1;
1172 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1173 if(tmp_ts == AV_NOPTS_VALUE)
1177 if(tmp_pos >= filesize)
1183 if(ts_min > ts_max){
1185 }else if(ts_min == ts_max){
1190 while (pos_min < pos_limit) {
1192 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1196 assert(pos_limit <= pos_max);
1199 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1200 // interpolate position (better than dichotomy)
1201 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1202 + pos_min - approximate_keyframe_distance;
1203 }else if(no_change==1){
1204 // bisection, if interpolation failed to change min or max pos last time
1205 pos = (pos_min + pos_limit)>>1;
1207 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1212 else if(pos > pos_limit)
1216 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1222 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);
1224 if(ts == AV_NOPTS_VALUE){
1225 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1228 assert(ts != AV_NOPTS_VALUE);
1229 if (target_ts <= ts) {
1230 pos_limit = start_pos - 1;
1234 if (target_ts >= ts) {
1240 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1241 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1244 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1246 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1247 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1248 pos, ts_min, target_ts, ts_max);
1254 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1255 int64_t pos_min, pos_max;
1259 if (stream_index < 0)
1262 st= s->streams[stream_index];
1265 pos_min = s->data_offset;
1266 pos_max = url_fsize(s->pb) - 1;
1268 if (pos < pos_min) pos= pos_min;
1269 else if(pos > pos_max) pos= pos_max;
1271 url_fseek(s->pb, pos, SEEK_SET);
1274 av_update_cur_dts(s, st, ts);
1279 static int av_seek_frame_generic(AVFormatContext *s,
1280 int stream_index, int64_t timestamp, int flags)
1286 st = s->streams[stream_index];
1288 index = av_index_search_timestamp(st, timestamp, flags);
1290 if(index < 0 || index==st->nb_index_entries-1){
1294 if(st->index_entries && st->nb_index_entries){
1295 ie= &st->index_entries[st->nb_index_entries-1];
1296 url_fseek(s->pb, ie->pos, SEEK_SET);
1297 av_update_cur_dts(s, st, ie->timestamp);
1299 url_fseek(s->pb, 0, SEEK_SET);
1302 int ret = av_read_frame(s, &pkt);
1305 av_free_packet(&pkt);
1306 if(stream_index == pkt.stream_index){
1307 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1311 index = av_index_search_timestamp(st, timestamp, flags);
1316 av_read_frame_flush(s);
1317 if (s->iformat->read_seek){
1318 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1321 ie = &st->index_entries[index];
1322 url_fseek(s->pb, ie->pos, SEEK_SET);
1324 av_update_cur_dts(s, st, ie->timestamp);
1329 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1334 av_read_frame_flush(s);
1336 if(flags & AVSEEK_FLAG_BYTE)
1337 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1339 if(stream_index < 0){
1340 stream_index= av_find_default_stream_index(s);
1341 if(stream_index < 0)
1344 st= s->streams[stream_index];
1345 /* timestamp for default must be expressed in AV_TIME_BASE units */
1346 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1348 st= s->streams[stream_index];
1350 /* first, we try the format specific seek */
1351 if (s->iformat->read_seek)
1352 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1359 if(s->iformat->read_timestamp)
1360 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1362 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1365 /*******************************************************/
1368 * Returns TRUE if the stream has accurate duration in any stream.
1370 * @return TRUE if the stream has accurate duration for at least one component.
1372 static int av_has_duration(AVFormatContext *ic)
1377 for(i = 0;i < ic->nb_streams; i++) {
1378 st = ic->streams[i];
1379 if (st->duration != AV_NOPTS_VALUE)
1386 * Estimate the stream timings from the one of each components.
1388 * Also computes the global bitrate if possible.
1390 static void av_update_stream_timings(AVFormatContext *ic)
1392 int64_t start_time, start_time1, end_time, end_time1;
1393 int64_t duration, duration1;
1397 start_time = INT64_MAX;
1398 end_time = INT64_MIN;
1399 duration = INT64_MIN;
1400 for(i = 0;i < ic->nb_streams; i++) {
1401 st = ic->streams[i];
1402 if (st->start_time != AV_NOPTS_VALUE) {
1403 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1404 if (start_time1 < start_time)
1405 start_time = start_time1;
1406 if (st->duration != AV_NOPTS_VALUE) {
1407 end_time1 = start_time1
1408 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1409 if (end_time1 > end_time)
1410 end_time = end_time1;
1413 if (st->duration != AV_NOPTS_VALUE) {
1414 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1415 if (duration1 > duration)
1416 duration = duration1;
1419 if (start_time != INT64_MAX) {
1420 ic->start_time = start_time;
1421 if (end_time != INT64_MIN) {
1422 if (end_time - start_time > duration)
1423 duration = end_time - start_time;
1426 if (duration != INT64_MIN) {
1427 ic->duration = duration;
1428 if (ic->file_size > 0) {
1429 /* compute the bit rate */
1430 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1431 (double)ic->duration;
1436 static void fill_all_stream_timings(AVFormatContext *ic)
1441 av_update_stream_timings(ic);
1442 for(i = 0;i < ic->nb_streams; i++) {
1443 st = ic->streams[i];
1444 if (st->start_time == AV_NOPTS_VALUE) {
1445 if(ic->start_time != AV_NOPTS_VALUE)
1446 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1447 if(ic->duration != AV_NOPTS_VALUE)
1448 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1453 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1455 int64_t filesize, duration;
1459 /* if bit_rate is already set, we believe it */
1460 if (ic->bit_rate == 0) {
1462 for(i=0;i<ic->nb_streams;i++) {
1463 st = ic->streams[i];
1464 bit_rate += st->codec->bit_rate;
1466 ic->bit_rate = bit_rate;
1469 /* if duration is already set, we believe it */
1470 if (ic->duration == AV_NOPTS_VALUE &&
1471 ic->bit_rate != 0 &&
1472 ic->file_size != 0) {
1473 filesize = ic->file_size;
1475 for(i = 0; i < ic->nb_streams; i++) {
1476 st = ic->streams[i];
1477 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1478 if (st->duration == AV_NOPTS_VALUE)
1479 st->duration = duration;
1485 #define DURATION_MAX_READ_SIZE 250000
1487 /* only usable for MPEG-PS streams */
1488 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1490 AVPacket pkt1, *pkt = &pkt1;
1492 int read_size, i, ret;
1494 int64_t filesize, offset, duration;
1496 /* free previous packet */
1497 if (ic->cur_st && ic->cur_st->parser)
1498 av_free_packet(&ic->cur_pkt);
1501 /* flush packet queue */
1502 flush_packet_queue(ic);
1504 for(i=0;i<ic->nb_streams;i++) {
1505 st = ic->streams[i];
1507 av_parser_close(st->parser);
1512 /* we read the first packets to get the first PTS (not fully
1513 accurate, but it is enough now) */
1514 url_fseek(ic->pb, 0, SEEK_SET);
1517 if (read_size >= DURATION_MAX_READ_SIZE)
1519 /* if all info is available, we can stop */
1520 for(i = 0;i < ic->nb_streams; i++) {
1521 st = ic->streams[i];
1522 if (st->start_time == AV_NOPTS_VALUE)
1525 if (i == ic->nb_streams)
1528 ret = av_read_packet(ic, pkt);
1531 read_size += pkt->size;
1532 st = ic->streams[pkt->stream_index];
1533 if (pkt->pts != AV_NOPTS_VALUE) {
1534 if (st->start_time == AV_NOPTS_VALUE)
1535 st->start_time = pkt->pts;
1537 av_free_packet(pkt);
1540 /* estimate the end time (duration) */
1541 /* XXX: may need to support wrapping */
1542 filesize = ic->file_size;
1543 offset = filesize - DURATION_MAX_READ_SIZE;
1547 url_fseek(ic->pb, offset, SEEK_SET);
1550 if (read_size >= DURATION_MAX_READ_SIZE)
1553 ret = av_read_packet(ic, pkt);
1556 read_size += pkt->size;
1557 st = ic->streams[pkt->stream_index];
1558 if (pkt->pts != AV_NOPTS_VALUE &&
1559 st->start_time != AV_NOPTS_VALUE) {
1560 end_time = pkt->pts;
1561 duration = end_time - st->start_time;
1563 if (st->duration == AV_NOPTS_VALUE ||
1564 st->duration < duration)
1565 st->duration = duration;
1568 av_free_packet(pkt);
1571 fill_all_stream_timings(ic);
1573 url_fseek(ic->pb, old_offset, SEEK_SET);
1574 for(i=0; i<ic->nb_streams; i++){
1576 st->cur_dts= st->first_dts;
1577 st->last_IP_pts = AV_NOPTS_VALUE;
1581 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1585 /* get the file size, if possible */
1586 if (ic->iformat->flags & AVFMT_NOFILE) {
1589 file_size = url_fsize(ic->pb);
1593 ic->file_size = file_size;
1595 if ((!strcmp(ic->iformat->name, "mpeg") ||
1596 !strcmp(ic->iformat->name, "mpegts")) &&
1597 file_size && !ic->pb->is_streamed) {
1598 /* get accurate estimate from the PTSes */
1599 av_estimate_timings_from_pts(ic, old_offset);
1600 } else if (av_has_duration(ic)) {
1601 /* at least one components has timings - we use them for all
1603 fill_all_stream_timings(ic);
1605 /* less precise: use bit rate info */
1606 av_estimate_timings_from_bit_rate(ic);
1608 av_update_stream_timings(ic);
1614 for(i = 0;i < ic->nb_streams; i++) {
1615 st = ic->streams[i];
1616 printf("%d: start_time: %0.3f duration: %0.3f\n",
1617 i, (double)st->start_time / AV_TIME_BASE,
1618 (double)st->duration / AV_TIME_BASE);
1620 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1621 (double)ic->start_time / AV_TIME_BASE,
1622 (double)ic->duration / AV_TIME_BASE,
1623 ic->bit_rate / 1000);
1628 static int has_codec_parameters(AVCodecContext *enc)
1631 switch(enc->codec_type) {
1632 case CODEC_TYPE_AUDIO:
1633 val = enc->sample_rate;
1635 case CODEC_TYPE_VIDEO:
1636 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1642 return (enc->codec_id != CODEC_ID_NONE && val != 0);
1645 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1649 int got_picture, data_size, ret=0;
1652 if(!st->codec->codec){
1653 codec = avcodec_find_decoder(st->codec->codec_id);
1656 ret = avcodec_open(st->codec, codec);
1661 if(!has_codec_parameters(st->codec)){
1662 switch(st->codec->codec_type) {
1663 case CODEC_TYPE_VIDEO:
1664 ret = avcodec_decode_video(st->codec, &picture,
1665 &got_picture, (uint8_t *)data, size);
1667 case CODEC_TYPE_AUDIO:
1668 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1669 samples = av_malloc(data_size);
1672 ret = avcodec_decode_audio2(st->codec, samples,
1673 &data_size, (uint8_t *)data, size);
1684 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
1687 fmt = av_probe_input_format2(pd, 1, &score);
1690 if (strncmp(fmt->name, "mp3", 3) == 0)
1691 st->codec->codec_id = CODEC_ID_MP3;
1692 else if (strncmp(fmt->name, "ac3", 3) == 0)
1693 st->codec->codec_id = CODEC_ID_AC3;
1698 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1700 while (tags->id != CODEC_ID_NONE) {
1708 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1711 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1712 if(tag == tags[i].tag)
1715 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1716 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1717 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1718 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1719 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1722 return CODEC_ID_NONE;
1725 unsigned int av_codec_get_tag(const AVCodecTag *tags[4], enum CodecID id)
1728 for(i=0; tags && tags[i]; i++){
1729 int tag= codec_get_tag(tags[i], id);
1735 enum CodecID av_codec_get_id(const AVCodecTag *tags[4], unsigned int tag)
1738 for(i=0; tags && tags[i]; i++){
1739 enum CodecID id= codec_get_id(tags[i], tag);
1740 if(id!=CODEC_ID_NONE) return id;
1742 return CODEC_ID_NONE;
1745 /* absolute maximum size we read until we abort */
1746 #define MAX_READ_SIZE 5000000
1748 #define MAX_STD_TIMEBASES (60*12+5)
1749 static int get_std_framerate(int i){
1750 if(i<60*12) return i*1001;
1751 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
1754 int av_find_stream_info(AVFormatContext *ic)
1756 int i, count, ret, read_size, j;
1758 AVPacket pkt1, *pkt;
1759 int64_t last_dts[MAX_STREAMS];
1760 int duration_count[MAX_STREAMS]={0};
1761 double (*duration_error)[MAX_STD_TIMEBASES];
1762 offset_t old_offset = url_ftell(ic->pb);
1763 int64_t codec_info_duration[MAX_STREAMS]={0};
1764 int codec_info_nb_frames[MAX_STREAMS]={0};
1765 AVProbeData probe_data[MAX_STREAMS];
1766 int codec_identified[MAX_STREAMS]={0};
1768 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1769 if (!duration_error) return AVERROR(ENOMEM);
1771 for(i=0;i<ic->nb_streams;i++) {
1772 st = ic->streams[i];
1773 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1774 /* if(!st->time_base.num)
1776 if(!st->codec->time_base.num)
1777 st->codec->time_base= st->time_base;
1779 //only for the split stuff
1781 st->parser = av_parser_init(st->codec->codec_id);
1782 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1783 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1788 for(i=0;i<MAX_STREAMS;i++){
1789 last_dts[i]= AV_NOPTS_VALUE;
1792 memset(probe_data, 0, sizeof(probe_data));
1796 /* check if one codec still needs to be handled */
1797 for(i=0;i<ic->nb_streams;i++) {
1798 st = ic->streams[i];
1799 if (!has_codec_parameters(st->codec))
1801 /* variable fps and no guess at the real fps */
1802 if( (st->codec->time_base.den >= 101LL*st->codec->time_base.num || st->codec->codec_id == CODEC_ID_MPEG2VIDEO)
1803 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1805 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1807 if(st->first_dts == AV_NOPTS_VALUE)
1810 if (i == ic->nb_streams) {
1811 /* NOTE: if the format has no header, then we need to read
1812 some packets to get most of the streams, so we cannot
1814 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1815 /* if we found the info for all the codecs, we can stop */
1820 /* we did not get all the codec info, but we read too much data */
1821 if (read_size >= MAX_READ_SIZE) {
1826 /* NOTE: a new stream can be added there if no header in file
1827 (AVFMTCTX_NOHEADER) */
1828 ret = av_read_frame_internal(ic, &pkt1);
1831 ret = -1; /* we could not have all the codec parameters before EOF */
1832 for(i=0;i<ic->nb_streams;i++) {
1833 st = ic->streams[i];
1834 if (!has_codec_parameters(st->codec)){
1836 avcodec_string(buf, sizeof(buf), st->codec, 0);
1837 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1845 pkt= add_to_pktbuf(ic, &pkt1);
1846 if(av_dup_packet(pkt) < 0)
1847 return AVERROR(ENOMEM);
1849 read_size += pkt->size;
1851 st = ic->streams[pkt->stream_index];
1852 if(codec_info_nb_frames[st->index]>1)
1853 codec_info_duration[st->index] += pkt->duration;
1854 if (pkt->duration != 0)
1855 codec_info_nb_frames[st->index]++;
1858 int index= pkt->stream_index;
1859 int64_t last= last_dts[index];
1860 int64_t duration= pkt->dts - last;
1862 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
1863 double dur= duration * av_q2d(st->time_base);
1865 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1866 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
1867 if(duration_count[index] < 2)
1868 memset(duration_error, 0, MAX_STREAMS * sizeof(*duration_error));
1869 for(i=1; i<MAX_STD_TIMEBASES; i++){
1870 int framerate= get_std_framerate(i);
1871 int ticks= lrintf(dur*framerate/(1001*12));
1872 double error= dur - ticks*1001*12/(double)framerate;
1873 duration_error[index][i] += error*error;
1875 duration_count[index]++;
1877 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
1878 last_dts[pkt->stream_index]= pkt->dts;
1880 if (st->codec->codec_id == CODEC_ID_NONE) {
1881 AVProbeData *pd = &(probe_data[st->index]);
1882 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
1883 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
1884 pd->buf_size += pkt->size;
1885 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
1888 if(st->parser && st->parser->parser->split && !st->codec->extradata){
1889 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
1891 st->codec->extradata_size= i;
1892 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1893 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
1894 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1898 /* if still no information, we try to open the codec and to
1899 decompress the frame. We try to avoid that in most cases as
1900 it takes longer and uses more memory. For MPEG4, we need to
1901 decompress for Quicktime. */
1902 if (!has_codec_parameters(st->codec) /*&&
1903 (st->codec->codec_id == CODEC_ID_FLV1 ||
1904 st->codec->codec_id == CODEC_ID_H264 ||
1905 st->codec->codec_id == CODEC_ID_H263 ||
1906 st->codec->codec_id == CODEC_ID_H261 ||
1907 st->codec->codec_id == CODEC_ID_VORBIS ||
1908 st->codec->codec_id == CODEC_ID_MJPEG ||
1909 st->codec->codec_id == CODEC_ID_PNG ||
1910 st->codec->codec_id == CODEC_ID_PAM ||
1911 st->codec->codec_id == CODEC_ID_PGM ||
1912 st->codec->codec_id == CODEC_ID_PGMYUV ||
1913 st->codec->codec_id == CODEC_ID_PBM ||
1914 st->codec->codec_id == CODEC_ID_PPM ||
1915 st->codec->codec_id == CODEC_ID_SHORTEN ||
1916 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
1917 try_decode_frame(st, pkt->data, pkt->size);
1919 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) {
1925 // close codecs which where opened in try_decode_frame()
1926 for(i=0;i<ic->nb_streams;i++) {
1927 st = ic->streams[i];
1928 if(st->codec->codec)
1929 avcodec_close(st->codec);
1931 for(i=0;i<ic->nb_streams;i++) {
1932 st = ic->streams[i];
1933 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1934 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
1935 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
1937 if(duration_count[i]
1938 && (st->codec->time_base.num*101LL <= st->codec->time_base.den || st->codec->codec_id == CODEC_ID_MPEG2VIDEO) /*&&
1939 //FIXME we should not special case mpeg2, but this needs testing with non mpeg2 ...
1940 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
1941 double best_error= 2*av_q2d(st->time_base);
1942 best_error= best_error*best_error*duration_count[i]*1000*12*30;
1944 for(j=1; j<MAX_STD_TIMEBASES; j++){
1945 double error= duration_error[i][j] * get_std_framerate(j);
1946 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1947 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
1948 if(error < best_error){
1950 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
1955 if (!st->r_frame_rate.num){
1956 if( st->codec->time_base.den * (int64_t)st->time_base.num
1957 <= st->codec->time_base.num * (int64_t)st->time_base.den){
1958 st->r_frame_rate.num = st->codec->time_base.den;
1959 st->r_frame_rate.den = st->codec->time_base.num;
1961 st->r_frame_rate.num = st->time_base.den;
1962 st->r_frame_rate.den = st->time_base.num;
1965 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
1966 if (st->codec->codec_id == CODEC_ID_NONE && probe_data[st->index].buf_size > 0) {
1967 codec_identified[st->index] = set_codec_from_probe_data(st, &(probe_data[st->index]), 1);
1968 if (codec_identified[st->index]) {
1969 st->need_parsing = AVSTREAM_PARSE_FULL;
1972 if(!st->codec->bits_per_sample)
1973 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
1977 av_estimate_timings(ic, old_offset);
1979 for(i=0;i<ic->nb_streams;i++) {
1980 st = ic->streams[i];
1981 if (codec_identified[st->index])
1984 //FIXME this is a mess
1985 if(i!=ic->nb_streams){
1986 av_read_frame_flush(ic);
1987 for(i=0;i<ic->nb_streams;i++) {
1988 st = ic->streams[i];
1989 if (codec_identified[st->index]) {
1990 av_seek_frame(ic, st->index, 0.0, 0);
1992 st->cur_dts= st->first_dts;
1994 url_fseek(ic->pb, ic->data_offset, SEEK_SET);
1998 /* correct DTS for b frame streams with no timestamps */
1999 for(i=0;i<ic->nb_streams;i++) {
2000 st = ic->streams[i];
2001 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2003 ppktl = &ic->packet_buffer;
2005 if(ppkt1->stream_index != i)
2007 if(ppkt1->pkt->dts < 0)
2009 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2011 ppkt1->pkt->dts -= delta;
2016 st->cur_dts -= delta;
2022 av_free(duration_error);
2023 for(i=0;i<MAX_STREAMS;i++){
2024 av_freep(&(probe_data[i].buf));
2030 /*******************************************************/
2032 int av_read_play(AVFormatContext *s)
2034 if (s->iformat->read_play)
2035 return s->iformat->read_play(s);
2036 if (s->pb && s->pb->read_play)
2037 return av_url_read_fplay(s->pb);
2038 return AVERROR(ENOSYS);
2041 int av_read_pause(AVFormatContext *s)
2043 if (s->iformat->read_pause)
2044 return s->iformat->read_pause(s);
2045 if (s->pb && s->pb->read_pause)
2046 return av_url_read_fpause(s->pb);
2047 return AVERROR(ENOSYS);
2050 void av_close_input_file(AVFormatContext *s)
2052 int i, must_open_file;
2055 /* free previous packet */
2056 if (s->cur_st && s->cur_st->parser)
2057 av_free_packet(&s->cur_pkt);
2059 if (s->iformat->read_close)
2060 s->iformat->read_close(s);
2061 for(i=0;i<s->nb_streams;i++) {
2062 /* free all data in a stream component */
2065 av_parser_close(st->parser);
2067 av_free(st->index_entries);
2068 av_free(st->codec->extradata);
2072 for(i=s->nb_programs-1; i>=0; i--) {
2073 av_freep(&s->programs[i]->provider_name);
2074 av_freep(&s->programs[i]->name);
2075 av_freep(&s->programs[i]->stream_index);
2076 av_freep(&s->programs[i]);
2078 flush_packet_queue(s);
2080 if (s->iformat->flags & AVFMT_NOFILE) {
2083 if (must_open_file) {
2086 av_freep(&s->priv_data);
2090 AVStream *av_new_stream(AVFormatContext *s, int id)
2095 if (s->nb_streams >= MAX_STREAMS)
2098 st = av_mallocz(sizeof(AVStream));
2102 st->codec= avcodec_alloc_context();
2104 /* no default bitrate if decoding */
2105 st->codec->bit_rate = 0;
2107 st->index = s->nb_streams;
2109 st->start_time = AV_NOPTS_VALUE;
2110 st->duration = AV_NOPTS_VALUE;
2111 st->cur_dts = AV_NOPTS_VALUE;
2112 st->first_dts = AV_NOPTS_VALUE;
2114 /* default pts settings is MPEG like */
2115 av_set_pts_info(st, 33, 1, 90000);
2116 st->last_IP_pts = AV_NOPTS_VALUE;
2117 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2118 st->pts_buffer[i]= AV_NOPTS_VALUE;
2120 s->streams[s->nb_streams++] = st;
2124 AVProgram *av_new_program(AVFormatContext *ac, int id)
2126 AVProgram *program=NULL;
2130 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2133 for(i=0; i<ac->nb_programs; i++)
2134 if(ac->programs[i]->id == id)
2135 program = ac->programs[i];
2138 program = av_mallocz(sizeof(AVProgram));
2141 dynarray_add(&ac->programs, &ac->nb_programs, program);
2142 program->discard = AVDISCARD_NONE;
2149 void av_set_program_name(AVProgram *program, char *provider_name, char *name)
2151 assert(!provider_name == !name);
2153 av_free(program->provider_name);
2154 av_free(program-> name);
2155 program->provider_name = av_strdup(provider_name);
2156 program-> name = av_strdup( name);
2161 /************************************************************/
2162 /* output media file */
2164 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2168 if (s->oformat->priv_data_size > 0) {
2169 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2171 return AVERROR(ENOMEM);
2173 s->priv_data = NULL;
2175 if (s->oformat->set_parameters) {
2176 ret = s->oformat->set_parameters(s, ap);
2183 int av_write_header(AVFormatContext *s)
2188 // some sanity checks
2189 for(i=0;i<s->nb_streams;i++) {
2192 switch (st->codec->codec_type) {
2193 case CODEC_TYPE_AUDIO:
2194 if(st->codec->sample_rate<=0){
2195 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2199 case CODEC_TYPE_VIDEO:
2200 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2201 av_log(s, AV_LOG_ERROR, "time base not set\n");
2204 if(st->codec->width<=0 || st->codec->height<=0){
2205 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2211 if(s->oformat->codec_tag){
2212 if(st->codec->codec_tag){
2214 //check that tag + id is in the table
2215 //if neither is in the table -> ok
2216 //if tag is in the table with another id -> FAIL
2217 //if id is in the table with another tag -> FAIL unless strict < ?
2219 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2223 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2224 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2226 return AVERROR(ENOMEM);
2229 if(s->oformat->write_header){
2230 ret = s->oformat->write_header(s);
2235 /* init PTS generation */
2236 for(i=0;i<s->nb_streams;i++) {
2237 int64_t den = AV_NOPTS_VALUE;
2240 switch (st->codec->codec_type) {
2241 case CODEC_TYPE_AUDIO:
2242 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2244 case CODEC_TYPE_VIDEO:
2245 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2250 if (den != AV_NOPTS_VALUE) {
2252 return AVERROR_INVALIDDATA;
2253 av_frac_init(&st->pts, 0, 0, den);
2259 //FIXME merge with compute_pkt_fields
2260 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2261 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2262 int num, den, frame_size, i;
2264 // 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);
2266 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2269 /* duration field */
2270 if (pkt->duration == 0) {
2271 compute_frame_duration(&num, &den, st, NULL, pkt);
2273 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2277 //XXX/FIXME this is a temporary hack until all encoders output pts
2278 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2280 // pkt->pts= st->cur_dts;
2281 pkt->pts= st->pts.val;
2284 //calculate dts from pts
2285 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2286 st->pts_buffer[0]= pkt->pts;
2287 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2288 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2289 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2290 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2292 pkt->dts= st->pts_buffer[0];
2295 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2296 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2299 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2300 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2304 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2305 st->cur_dts= pkt->dts;
2306 st->pts.val= pkt->dts;
2309 switch (st->codec->codec_type) {
2310 case CODEC_TYPE_AUDIO:
2311 frame_size = get_audio_frame_size(st->codec, pkt->size);
2313 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2314 but it would be better if we had the real timestamps from the encoder */
2315 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2316 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2319 case CODEC_TYPE_VIDEO:
2320 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2328 static void truncate_ts(AVStream *st, AVPacket *pkt){
2329 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2332 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2334 if (pkt->pts != AV_NOPTS_VALUE)
2335 pkt->pts &= pts_mask;
2336 if (pkt->dts != AV_NOPTS_VALUE)
2337 pkt->dts &= pts_mask;
2340 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2344 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2345 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2348 truncate_ts(s->streams[pkt->stream_index], pkt);
2350 ret= s->oformat->write_packet(s, pkt);
2352 ret= url_ferror(s->pb);
2356 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2357 AVPacketList *pktl, **next_point, *this_pktl;
2359 int streams[MAX_STREAMS];
2362 AVStream *st= s->streams[ pkt->stream_index];
2364 // assert(pkt->destruct != av_destruct_packet); //FIXME
2366 this_pktl = av_mallocz(sizeof(AVPacketList));
2367 this_pktl->pkt= *pkt;
2368 if(pkt->destruct == av_destruct_packet)
2369 pkt->destruct= NULL; // non shared -> must keep original from being freed
2371 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2373 next_point = &s->packet_buffer;
2375 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2376 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2377 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2378 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2380 next_point= &(*next_point)->next;
2382 this_pktl->next= *next_point;
2383 *next_point= this_pktl;
2386 memset(streams, 0, sizeof(streams));
2387 pktl= s->packet_buffer;
2389 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2390 if(streams[ pktl->pkt.stream_index ] == 0)
2392 streams[ pktl->pkt.stream_index ]++;
2396 if(s->nb_streams == stream_count || (flush && stream_count)){
2397 pktl= s->packet_buffer;
2400 s->packet_buffer= pktl->next;
2404 av_init_packet(out);
2410 * Interleaves a AVPacket correctly so it can be muxed.
2411 * @param out the interleaved packet will be output here
2412 * @param in the input packet
2413 * @param flush 1 if no further packets are available as input and all
2414 * remaining packets should be output
2415 * @return 1 if a packet was output, 0 if no packet could be output,
2416 * < 0 if an error occured
2418 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2419 if(s->oformat->interleave_packet)
2420 return s->oformat->interleave_packet(s, out, in, flush);
2422 return av_interleave_packet_per_dts(s, out, in, flush);
2425 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2426 AVStream *st= s->streams[ pkt->stream_index];
2428 //FIXME/XXX/HACK drop zero sized packets
2429 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2432 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2433 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2436 if(pkt->dts == AV_NOPTS_VALUE)
2441 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2442 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2445 truncate_ts(s->streams[opkt.stream_index], &opkt);
2446 ret= s->oformat->write_packet(s, &opkt);
2448 av_free_packet(&opkt);
2453 if(url_ferror(s->pb))
2454 return url_ferror(s->pb);
2458 int av_write_trailer(AVFormatContext *s)
2464 ret= av_interleave_packet(s, &pkt, NULL, 1);
2465 if(ret<0) //FIXME cleanup needed for ret<0 ?
2470 truncate_ts(s->streams[pkt.stream_index], &pkt);
2471 ret= s->oformat->write_packet(s, &pkt);
2473 av_free_packet(&pkt);
2477 if(url_ferror(s->pb))
2481 if(s->oformat->write_trailer)
2482 ret = s->oformat->write_trailer(s);
2485 ret=url_ferror(s->pb);
2486 for(i=0;i<s->nb_streams;i++)
2487 av_freep(&s->streams[i]->priv_data);
2488 av_freep(&s->priv_data);
2492 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2495 AVProgram *program=NULL;
2498 for(i=0; i<ac->nb_programs; i++){
2499 if(ac->programs[i]->id != progid)
2501 program = ac->programs[i];
2502 for(j=0; j<program->nb_stream_indexes; j++)
2503 if(program->stream_index[j] == idx)
2506 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2509 program->stream_index = tmp;
2510 program->stream_index[program->nb_stream_indexes++] = idx;
2515 /* "user interface" functions */
2516 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2519 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2520 AVStream *st = ic->streams[i];
2521 int g = ff_gcd(st->time_base.num, st->time_base.den);
2522 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2523 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2524 /* the pid is an important information, so we display it */
2525 /* XXX: add a generic system */
2526 if (flags & AVFMT_SHOW_IDS)
2527 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2528 if (strlen(st->language) > 0)
2529 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2530 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2531 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2532 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2533 if(st->r_frame_rate.den && st->r_frame_rate.num)
2534 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(r)", av_q2d(st->r_frame_rate));
2535 /* else if(st->time_base.den && st->time_base.num)
2536 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(m)", 1/av_q2d(st->time_base));*/
2538 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(c)", 1/av_q2d(st->codec->time_base));
2540 av_log(NULL, AV_LOG_INFO, "\n");
2543 void dump_format(AVFormatContext *ic,
2550 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2551 is_output ? "Output" : "Input",
2553 is_output ? ic->oformat->name : ic->iformat->name,
2554 is_output ? "to" : "from", url);
2556 av_log(NULL, AV_LOG_INFO, " Duration: ");
2557 if (ic->duration != AV_NOPTS_VALUE) {
2558 int hours, mins, secs, us;
2559 secs = ic->duration / AV_TIME_BASE;
2560 us = ic->duration % AV_TIME_BASE;
2565 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs,
2566 (10 * us) / AV_TIME_BASE);
2568 av_log(NULL, AV_LOG_INFO, "N/A");
2570 if (ic->start_time != AV_NOPTS_VALUE) {
2572 av_log(NULL, AV_LOG_INFO, ", start: ");
2573 secs = ic->start_time / AV_TIME_BASE;
2574 us = ic->start_time % AV_TIME_BASE;
2575 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2576 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2578 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2580 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2582 av_log(NULL, AV_LOG_INFO, "N/A");
2584 av_log(NULL, AV_LOG_INFO, "\n");
2586 if(ic->nb_programs) {
2588 for(j=0; j<ic->nb_programs; j++) {
2589 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2590 ic->programs[j]->name ? ic->programs[j]->name : "");
2591 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++)
2592 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2595 for(i=0;i<ic->nb_streams;i++)
2596 dump_stream_format(ic, i, index, is_output);
2599 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2601 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2604 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2606 AVRational frame_rate;
2607 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2608 *frame_rate_num= frame_rate.num;
2609 *frame_rate_den= frame_rate.den;
2614 * gets the current time in micro seconds.
2616 int64_t av_gettime(void)
2619 gettimeofday(&tv,NULL);
2620 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2623 int64_t parse_date(const char *datestr, int duration)
2629 static const char *date_fmt[] = {
2633 static const char *time_fmt[] = {
2643 time_t now = time(0);
2645 len = strlen(datestr);
2647 lastch = datestr[len - 1];
2650 is_utc = (lastch == 'z' || lastch == 'Z');
2652 memset(&dt, 0, sizeof(dt));
2657 /* parse the year-month-day part */
2658 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2659 q = small_strptime(p, date_fmt[i], &dt);
2665 /* if the year-month-day part is missing, then take the
2666 * current year-month-day time */
2671 dt = *localtime(&now);
2673 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2678 if (*p == 'T' || *p == 't' || *p == ' ')
2681 /* parse the hour-minute-second part */
2682 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2683 q = small_strptime(p, time_fmt[i], &dt);
2689 /* parse datestr as a duration */
2694 /* parse datestr as HH:MM:SS */
2695 q = small_strptime(p, time_fmt[0], &dt);
2697 /* parse datestr as S+ */
2698 dt.tm_sec = strtol(p, (char **)&q, 10);
2700 /* the parsing didn't succeed */
2707 /* Now we have all the fields that we can get */
2713 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2715 dt.tm_isdst = -1; /* unknown */
2725 /* parse the .m... part */
2729 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2732 val += n * (*q - '0');
2736 return negative ? -t : t;
2739 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2749 while (*p != '\0' && *p != '=' && *p != '&') {
2750 if ((q - tag) < sizeof(tag) - 1)
2758 while (*p != '&' && *p != '\0') {
2759 if ((q - arg) < arg_size - 1) {
2769 if (!strcmp(tag, tag1))
2778 int av_get_frame_filename(char *buf, int buf_size,
2779 const char *path, int number)
2782 char *q, buf1[20], c;
2783 int nd, len, percentd_found;
2795 while (isdigit(*p)) {
2796 nd = nd * 10 + *p++ - '0';
2799 } while (isdigit(c));
2808 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2810 if ((q - buf + len) > buf_size - 1)
2812 memcpy(q, buf1, len);
2820 if ((q - buf) < buf_size - 1)
2824 if (!percentd_found)
2833 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
2836 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2838 for(i=0;i<size;i+=16) {
2845 PRINT(" %02x", buf[i+j]);
2850 for(j=0;j<len;j++) {
2852 if (c < ' ' || c > '~')
2861 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2863 hex_dump_internal(NULL, f, 0, buf, size);
2866 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
2868 hex_dump_internal(avcl, NULL, level, buf, size);
2871 //FIXME needs to know the time_base
2872 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
2874 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2875 PRINT("stream #%d:\n", pkt->stream_index);
2876 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2877 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2878 /* DTS is _always_ valid after av_read_frame() */
2880 if (pkt->dts == AV_NOPTS_VALUE)
2883 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
2884 /* PTS may be not known if B frames are present */
2886 if (pkt->pts == AV_NOPTS_VALUE)
2889 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
2891 PRINT(" size=%d\n", pkt->size);
2894 av_hex_dump(f, pkt->data, pkt->size);
2897 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2899 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
2902 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
2904 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
2907 void url_split(char *proto, int proto_size,
2908 char *authorization, int authorization_size,
2909 char *hostname, int hostname_size,
2911 char *path, int path_size,
2914 const char *p, *ls, *at, *col, *brk, *q;
2916 if (port_ptr) *port_ptr = -1;
2917 if (proto_size > 0) proto[0] = 0;
2918 if (authorization_size > 0) authorization[0] = 0;
2919 if (hostname_size > 0) hostname[0] = 0;
2920 if (path_size > 0) path[0] = 0;
2922 /* parse protocol */
2923 if ((p = strchr(url, ':'))) {
2924 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
2929 /* no protocol means plain filename */
2930 av_strlcpy(path, url, path_size);
2934 /* separate path from hostname */
2935 if ((ls = strchr(p, '/'))) {
2936 if ((q = strchr(ls, '?')))
2937 av_strlcpy(path, ls, FFMIN(path_size, q - ls + 1));
2939 av_strlcpy(path, ls, path_size);
2940 } else if (!(ls = strchr(p, '?')))
2941 ls = &p[strlen(p)]; // XXX
2943 /* the rest is hostname, use that to parse auth/port */
2945 /* authorization (user[:pass]@hostname) */
2946 if ((at = strchr(p, '@')) && at < ls) {
2947 av_strlcpy(authorization, p,
2948 FFMIN(authorization_size, at + 1 - p));
2949 p = at + 1; /* skip '@' */
2952 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
2954 av_strlcpy(hostname, p + 1,
2955 FFMIN(hostname_size, brk - p));
2956 if (brk[1] == ':' && port_ptr)
2957 *port_ptr = atoi(brk + 2);
2958 } else if ((col = strchr(p, ':')) && col < ls) {
2959 av_strlcpy(hostname, p,
2960 FFMIN(col + 1 - p, hostname_size));
2961 if (port_ptr) *port_ptr = atoi(col + 1);
2963 av_strlcpy(hostname, p,
2964 FFMIN(ls + 1 - p, hostname_size));
2968 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
2969 int pts_num, int pts_den)
2971 s->pts_wrap_bits = pts_wrap_bits;
2972 s->time_base.num = pts_num;
2973 s->time_base.den = pts_den;
2976 /* fraction handling */
2979 * f = val + (num / den) + 0.5.
2981 * 'num' is normalized so that it is such as 0 <= num < den.
2983 * @param f fractional number
2984 * @param val integer value
2985 * @param num must be >= 0
2986 * @param den must be >= 1
2988 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
3001 * Fractionnal addition to f: f = f + (incr / f->den).
3003 * @param f fractional number
3004 * @param incr increment, can be positive or negative
3006 static void av_frac_add(AVFrac *f, int64_t incr)
3010 num = f->num + incr;
3013 f->val += num / den;
3019 } else if (num >= den) {
3020 f->val += num / den;