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},
327 {"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size), FF_OPT_TYPE_INT, INT_MAX, 0, INT_MAX, D},
335 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name, options };
337 static void avformat_get_context_defaults(AVFormatContext *s)
339 memset(s, 0, sizeof(AVFormatContext));
341 s->av_class = &av_format_context_class;
343 av_opt_set_defaults(s);
346 AVFormatContext *av_alloc_format_context(void)
349 ic = av_malloc(sizeof(AVFormatContext));
351 avformat_get_context_defaults(ic);
352 ic->av_class = &av_format_context_class;
356 int av_open_input_stream(AVFormatContext **ic_ptr,
357 ByteIOContext *pb, const char *filename,
358 AVInputFormat *fmt, AVFormatParameters *ap)
362 AVFormatParameters default_ap;
366 memset(ap, 0, sizeof(default_ap));
369 if(!ap->prealloced_context)
370 ic = av_alloc_format_context();
374 err = AVERROR(ENOMEM);
379 ic->duration = AV_NOPTS_VALUE;
380 ic->start_time = AV_NOPTS_VALUE;
381 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
383 /* allocate private data */
384 if (fmt->priv_data_size > 0) {
385 ic->priv_data = av_mallocz(fmt->priv_data_size);
386 if (!ic->priv_data) {
387 err = AVERROR(ENOMEM);
391 ic->priv_data = NULL;
394 err = ic->iformat->read_header(ic, ap);
398 if (pb && !ic->data_offset)
399 ic->data_offset = url_ftell(ic->pb);
405 av_freep(&ic->priv_data);
412 /** Size of probe buffer, for guessing file type from file contents. */
413 #define PROBE_BUF_MIN 2048
414 #define PROBE_BUF_MAX (1<<20)
416 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
419 AVFormatParameters *ap)
422 AVProbeData probe_data, *pd = &probe_data;
423 ByteIOContext *pb = NULL;
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 */
438 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
439 /* if no file needed do not try to open one */
440 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
444 url_setbufsize(pb, buf_size);
447 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
448 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
449 /* read probe data */
450 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
451 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
452 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
453 if (url_fseek(pb, 0, SEEK_SET) < 0) {
455 if (url_fopen(&pb, filename, URL_RDONLY) < 0) {
461 /* guess file format */
462 fmt = av_probe_input_format2(pd, 1, &score);
467 /* if still no format found, error */
473 /* check filename in case of an image number is expected */
474 if (fmt->flags & AVFMT_NEEDNUMBER) {
475 if (!av_filename_number_test(filename)) {
476 err = AVERROR_NUMEXPECTED;
480 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
493 /*******************************************************/
495 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
500 ret= s->iformat->read_packet(s, pkt);
503 st= s->streams[pkt->stream_index];
505 switch(st->codec->codec_type){
506 case CODEC_TYPE_VIDEO:
507 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
509 case CODEC_TYPE_AUDIO:
510 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
512 case CODEC_TYPE_SUBTITLE:
513 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
520 /**********************************************************/
523 * Get the number of samples of an audio frame. Return (-1) if error.
525 static int get_audio_frame_size(AVCodecContext *enc, int size)
529 if (enc->frame_size <= 1) {
530 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
532 if (bits_per_sample) {
533 if (enc->channels == 0)
535 frame_size = (size << 3) / (bits_per_sample * enc->channels);
537 /* used for example by ADPCM codecs */
538 if (enc->bit_rate == 0)
540 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
543 frame_size = enc->frame_size;
550 * Return the frame duration in seconds, return 0 if not available.
552 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
553 AVCodecParserContext *pc, AVPacket *pkt)
559 switch(st->codec->codec_type) {
560 case CODEC_TYPE_VIDEO:
561 if(st->time_base.num*1000LL > st->time_base.den){
562 *pnum = st->time_base.num;
563 *pden = st->time_base.den;
564 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
565 *pnum = st->codec->time_base.num;
566 *pden = st->codec->time_base.den;
567 if (pc && pc->repeat_pict) {
569 *pnum = (*pnum) * (2 + pc->repeat_pict);
573 case CODEC_TYPE_AUDIO:
574 frame_size = get_audio_frame_size(st->codec, pkt->size);
578 *pden = st->codec->sample_rate;
585 static int is_intra_only(AVCodecContext *enc){
586 if(enc->codec_type == CODEC_TYPE_AUDIO){
588 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
589 switch(enc->codec_id){
591 case CODEC_ID_MJPEGB:
593 case CODEC_ID_RAWVIDEO:
594 case CODEC_ID_DVVIDEO:
595 case CODEC_ID_HUFFYUV:
596 case CODEC_ID_FFVHUFF:
607 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
608 int64_t dts, int64_t pts)
610 AVStream *st= s->streams[stream_index];
611 AVPacketList *pktl= s->packet_buffer;
613 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE)
616 st->first_dts= dts - st->cur_dts;
619 for(; pktl; pktl= pktl->next){
620 if(pktl->pkt.stream_index != stream_index)
622 //FIXME think more about this check
623 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
624 pktl->pkt.pts += st->first_dts;
626 if(pktl->pkt.dts != AV_NOPTS_VALUE)
627 pktl->pkt.dts += st->first_dts;
629 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
630 st->start_time= pktl->pkt.pts;
632 if (st->start_time == AV_NOPTS_VALUE)
633 st->start_time = pts;
636 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
637 AVCodecParserContext *pc, AVPacket *pkt)
639 int num, den, presentation_delayed, delay, i;
642 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
643 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
644 pkt->dts -= 1LL<<st->pts_wrap_bits;
647 if (pkt->duration == 0) {
648 compute_frame_duration(&num, &den, st, pc, pkt);
650 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
654 /* correct timestamps with byte offset if demuxers only have timestamps on packet boundaries */
655 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
656 /* this will estimate bitrate based on this frame's duration and size */
657 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
658 if(pkt->pts != AV_NOPTS_VALUE)
660 if(pkt->dts != AV_NOPTS_VALUE)
664 /* do we have a video B frame ? */
665 delay= st->codec->has_b_frames;
666 presentation_delayed = 0;
667 /* XXX: need has_b_frame, but cannot get it if the codec is
670 pc && pc->pict_type != FF_B_TYPE)
671 presentation_delayed = 1;
672 /* This may be redundant, but it should not hurt. */
673 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
674 presentation_delayed = 1;
676 if(st->cur_dts == AV_NOPTS_VALUE){
677 st->cur_dts = 0; //FIXME maybe set it to 0 during init
680 // 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);
681 /* interpolate PTS and DTS if they are not present */
683 if (presentation_delayed) {
684 /* DTS = decompression time stamp */
685 /* PTS = presentation time stamp */
686 if (pkt->dts == AV_NOPTS_VALUE)
687 pkt->dts = st->last_IP_pts;
688 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
689 if (pkt->dts == AV_NOPTS_VALUE)
690 pkt->dts = st->cur_dts;
692 /* this is tricky: the dts must be incremented by the duration
693 of the frame we are displaying, i.e. the last I or P frame */
694 if (st->last_IP_duration == 0)
695 st->last_IP_duration = pkt->duration;
696 st->cur_dts = pkt->dts + st->last_IP_duration;
697 st->last_IP_duration = pkt->duration;
698 st->last_IP_pts= pkt->pts;
699 /* cannot compute PTS if not present (we can compute it only
700 by knowing the futur */
701 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
702 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
703 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
704 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
705 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
706 pkt->pts += pkt->duration;
707 // 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);
711 /* presentation is not delayed : PTS and DTS are the same */
712 if(pkt->pts == AV_NOPTS_VALUE)
714 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
715 if(pkt->pts == AV_NOPTS_VALUE)
716 pkt->pts = st->cur_dts;
718 st->cur_dts = pkt->pts + pkt->duration;
722 if(pkt->pts != AV_NOPTS_VALUE){
723 st->pts_buffer[0]= pkt->pts;
724 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
725 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
726 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
727 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
728 if(pkt->dts == AV_NOPTS_VALUE)
729 pkt->dts= st->pts_buffer[0];
731 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
733 if(pkt->dts > st->cur_dts)
734 st->cur_dts = pkt->dts;
737 // 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);
740 if(is_intra_only(st->codec))
741 pkt->flags |= PKT_FLAG_KEY;
744 /* key frame computation */
745 if (pc->pict_type == FF_I_TYPE)
746 pkt->flags |= PKT_FLAG_KEY;
750 void av_destruct_packet_nofree(AVPacket *pkt)
752 pkt->data = NULL; pkt->size = 0;
755 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
763 /* select current input stream component */
766 if (!st->need_parsing || !st->parser) {
767 /* no parsing needed: we just output the packet as is */
768 /* raw data support */
770 compute_pkt_fields(s, st, NULL, pkt);
773 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
774 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
775 s->cur_ptr, s->cur_len,
776 s->cur_pkt.pts, s->cur_pkt.dts);
777 s->cur_pkt.pts = AV_NOPTS_VALUE;
778 s->cur_pkt.dts = AV_NOPTS_VALUE;
779 /* increment read pointer */
783 /* return packet if any */
786 pkt->pos = s->cur_pkt.pos; // Isn't quite accurate but close.
788 pkt->stream_index = st->index;
789 pkt->pts = st->parser->pts;
790 pkt->dts = st->parser->dts;
791 pkt->destruct = av_destruct_packet_nofree;
792 compute_pkt_fields(s, st, st->parser, pkt);
794 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
795 ff_reduce_index(s, st->index);
796 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
797 0, 0, AVINDEX_KEYFRAME);
804 av_free_packet(&s->cur_pkt);
808 /* read next packet */
809 ret = av_read_packet(s, &s->cur_pkt);
811 if (ret == AVERROR(EAGAIN))
813 /* return the last frames, if any */
814 for(i = 0; i < s->nb_streams; i++) {
816 if (st->parser && st->need_parsing) {
817 av_parser_parse(st->parser, st->codec,
818 &pkt->data, &pkt->size,
820 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
825 /* no more packets: really terminates parsing */
829 st = s->streams[s->cur_pkt.stream_index];
830 if(st->codec->debug & FF_DEBUG_PTS)
831 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
832 s->cur_pkt.stream_index,
838 s->cur_ptr = s->cur_pkt.data;
839 s->cur_len = s->cur_pkt.size;
840 if (st->need_parsing && !st->parser) {
841 st->parser = av_parser_init(st->codec->codec_id);
843 /* no parser available : just output the raw packets */
844 st->need_parsing = AVSTREAM_PARSE_NONE;
845 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
846 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
848 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
849 st->parser->last_frame_offset=
850 st->parser->cur_offset= s->cur_pkt.pos;
855 if(st->codec->debug & FF_DEBUG_PTS)
856 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
865 static AVPacket *add_to_pktbuf(AVFormatContext *s, AVPacket *pkt){
866 AVPacketList *pktl= s->packet_buffer;
867 AVPacketList **plast_pktl= &s->packet_buffer;
869 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
871 pktl = av_mallocz(sizeof(AVPacketList));
875 /* add the packet in the buffered packet list */
881 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
885 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
888 pktl = s->packet_buffer;
890 AVPacket *next_pkt= &pktl->pkt;
892 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
893 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
894 if( pktl->pkt.stream_index == next_pkt->stream_index
895 && next_pkt->dts < pktl->pkt.dts
896 && pktl->pkt.pts != pktl->pkt.dts //not b frame
897 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
898 next_pkt->pts= pktl->pkt.dts;
902 pktl = s->packet_buffer;
905 if( next_pkt->pts != AV_NOPTS_VALUE
906 || next_pkt->dts == AV_NOPTS_VALUE
908 /* read packet from packet buffer, if there is data */
910 s->packet_buffer = pktl->next;
916 int ret= av_read_frame_internal(s, pkt);
918 if(pktl && ret != AVERROR(EAGAIN)){
925 if(av_dup_packet(add_to_pktbuf(s, pkt)) < 0)
926 return AVERROR(ENOMEM);
928 assert(!s->packet_buffer);
929 return av_read_frame_internal(s, pkt);
934 /* XXX: suppress the packet queue */
935 static void flush_packet_queue(AVFormatContext *s)
940 pktl = s->packet_buffer;
943 s->packet_buffer = pktl->next;
944 av_free_packet(&pktl->pkt);
949 /*******************************************************/
952 int av_find_default_stream_index(AVFormatContext *s)
957 if (s->nb_streams <= 0)
959 for(i = 0; i < s->nb_streams; i++) {
961 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
969 * Flush the frame reader.
971 static void av_read_frame_flush(AVFormatContext *s)
976 flush_packet_queue(s);
978 /* free previous packet */
980 if (s->cur_st->parser)
981 av_free_packet(&s->cur_pkt);
988 /* for each stream, reset read state */
989 for(i = 0; i < s->nb_streams; i++) {
993 av_parser_close(st->parser);
996 st->last_IP_pts = AV_NOPTS_VALUE;
997 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1001 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1004 for(i = 0; i < s->nb_streams; i++) {
1005 AVStream *st = s->streams[i];
1007 st->cur_dts = av_rescale(timestamp,
1008 st->time_base.den * (int64_t)ref_st->time_base.num,
1009 st->time_base.num * (int64_t)ref_st->time_base.den);
1013 void ff_reduce_index(AVFormatContext *s, int stream_index)
1015 AVStream *st= s->streams[stream_index];
1016 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1018 if((unsigned)st->nb_index_entries >= max_entries){
1020 for(i=0; 2*i<st->nb_index_entries; i++)
1021 st->index_entries[i]= st->index_entries[2*i];
1022 st->nb_index_entries= i;
1026 int av_add_index_entry(AVStream *st,
1027 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1029 AVIndexEntry *entries, *ie;
1032 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1035 entries = av_fast_realloc(st->index_entries,
1036 &st->index_entries_allocated_size,
1037 (st->nb_index_entries + 1) *
1038 sizeof(AVIndexEntry));
1042 st->index_entries= entries;
1044 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1047 index= st->nb_index_entries++;
1048 ie= &entries[index];
1049 assert(index==0 || ie[-1].timestamp < timestamp);
1051 ie= &entries[index];
1052 if(ie->timestamp != timestamp){
1053 if(ie->timestamp <= timestamp)
1055 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1056 st->nb_index_entries++;
1057 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1058 distance= ie->min_distance;
1062 ie->timestamp = timestamp;
1063 ie->min_distance= distance;
1070 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1073 AVIndexEntry *entries= st->index_entries;
1074 int nb_entries= st->nb_index_entries;
1083 timestamp = entries[m].timestamp;
1084 if(timestamp >= wanted_timestamp)
1086 if(timestamp <= wanted_timestamp)
1089 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1091 if(!(flags & AVSEEK_FLAG_ANY)){
1092 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1093 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1104 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1105 AVInputFormat *avif= s->iformat;
1106 int64_t pos_min, pos_max, pos, pos_limit;
1107 int64_t ts_min, ts_max, ts;
1111 if (stream_index < 0)
1115 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1119 ts_min= AV_NOPTS_VALUE;
1120 pos_limit= -1; //gcc falsely says it may be uninitialized
1122 st= s->streams[stream_index];
1123 if(st->index_entries){
1126 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()
1127 index= FFMAX(index, 0);
1128 e= &st->index_entries[index];
1130 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1132 ts_min= e->timestamp;
1134 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1141 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1142 assert(index < st->nb_index_entries);
1144 e= &st->index_entries[index];
1145 assert(e->timestamp >= target_ts);
1147 ts_max= e->timestamp;
1148 pos_limit= pos_max - e->min_distance;
1150 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1151 pos_max,pos_limit, ts_max);
1156 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1161 url_fseek(s->pb, pos, SEEK_SET);
1163 av_update_cur_dts(s, st, ts);
1168 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 )){
1170 int64_t start_pos, filesize;
1174 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1177 if(ts_min == AV_NOPTS_VALUE){
1178 pos_min = s->data_offset;
1179 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1180 if (ts_min == AV_NOPTS_VALUE)
1184 if(ts_max == AV_NOPTS_VALUE){
1186 filesize = url_fsize(s->pb);
1187 pos_max = filesize - 1;
1190 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1192 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1193 if (ts_max == AV_NOPTS_VALUE)
1197 int64_t tmp_pos= pos_max + 1;
1198 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1199 if(tmp_ts == AV_NOPTS_VALUE)
1203 if(tmp_pos >= filesize)
1209 if(ts_min > ts_max){
1211 }else if(ts_min == ts_max){
1216 while (pos_min < pos_limit) {
1218 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1222 assert(pos_limit <= pos_max);
1225 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1226 // interpolate position (better than dichotomy)
1227 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1228 + pos_min - approximate_keyframe_distance;
1229 }else if(no_change==1){
1230 // bisection, if interpolation failed to change min or max pos last time
1231 pos = (pos_min + pos_limit)>>1;
1233 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1238 else if(pos > pos_limit)
1242 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1248 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);
1250 if(ts == AV_NOPTS_VALUE){
1251 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1254 assert(ts != AV_NOPTS_VALUE);
1255 if (target_ts <= ts) {
1256 pos_limit = start_pos - 1;
1260 if (target_ts >= ts) {
1266 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1267 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1270 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1272 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1273 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1274 pos, ts_min, target_ts, ts_max);
1280 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1281 int64_t pos_min, pos_max;
1285 if (stream_index < 0)
1288 st= s->streams[stream_index];
1291 pos_min = s->data_offset;
1292 pos_max = url_fsize(s->pb) - 1;
1294 if (pos < pos_min) pos= pos_min;
1295 else if(pos > pos_max) pos= pos_max;
1297 url_fseek(s->pb, pos, SEEK_SET);
1300 av_update_cur_dts(s, st, ts);
1305 static int av_seek_frame_generic(AVFormatContext *s,
1306 int stream_index, int64_t timestamp, int flags)
1312 st = s->streams[stream_index];
1314 index = av_index_search_timestamp(st, timestamp, flags);
1316 if(index < 0 || index==st->nb_index_entries-1){
1320 if(st->index_entries && st->nb_index_entries){
1321 ie= &st->index_entries[st->nb_index_entries-1];
1322 url_fseek(s->pb, ie->pos, SEEK_SET);
1323 av_update_cur_dts(s, st, ie->timestamp);
1325 url_fseek(s->pb, 0, SEEK_SET);
1328 int ret = av_read_frame(s, &pkt);
1331 av_free_packet(&pkt);
1332 if(stream_index == pkt.stream_index){
1333 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1337 index = av_index_search_timestamp(st, timestamp, flags);
1342 av_read_frame_flush(s);
1343 if (s->iformat->read_seek){
1344 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1347 ie = &st->index_entries[index];
1348 url_fseek(s->pb, ie->pos, SEEK_SET);
1350 av_update_cur_dts(s, st, ie->timestamp);
1355 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1360 av_read_frame_flush(s);
1362 if(flags & AVSEEK_FLAG_BYTE)
1363 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1365 if(stream_index < 0){
1366 stream_index= av_find_default_stream_index(s);
1367 if(stream_index < 0)
1370 st= s->streams[stream_index];
1371 /* timestamp for default must be expressed in AV_TIME_BASE units */
1372 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1374 st= s->streams[stream_index];
1376 /* first, we try the format specific seek */
1377 if (s->iformat->read_seek)
1378 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1385 if(s->iformat->read_timestamp)
1386 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1388 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1391 /*******************************************************/
1394 * Returns TRUE if the stream has accurate duration in any stream.
1396 * @return TRUE if the stream has accurate duration for at least one component.
1398 static int av_has_duration(AVFormatContext *ic)
1403 for(i = 0;i < ic->nb_streams; i++) {
1404 st = ic->streams[i];
1405 if (st->duration != AV_NOPTS_VALUE)
1412 * Estimate the stream timings from the one of each components.
1414 * Also computes the global bitrate if possible.
1416 static void av_update_stream_timings(AVFormatContext *ic)
1418 int64_t start_time, start_time1, end_time, end_time1;
1419 int64_t duration, duration1;
1423 start_time = INT64_MAX;
1424 end_time = INT64_MIN;
1425 duration = INT64_MIN;
1426 for(i = 0;i < ic->nb_streams; i++) {
1427 st = ic->streams[i];
1428 if (st->start_time != AV_NOPTS_VALUE) {
1429 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1430 if (start_time1 < start_time)
1431 start_time = start_time1;
1432 if (st->duration != AV_NOPTS_VALUE) {
1433 end_time1 = start_time1
1434 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1435 if (end_time1 > end_time)
1436 end_time = end_time1;
1439 if (st->duration != AV_NOPTS_VALUE) {
1440 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1441 if (duration1 > duration)
1442 duration = duration1;
1445 if (start_time != INT64_MAX) {
1446 ic->start_time = start_time;
1447 if (end_time != INT64_MIN) {
1448 if (end_time - start_time > duration)
1449 duration = end_time - start_time;
1452 if (duration != INT64_MIN) {
1453 ic->duration = duration;
1454 if (ic->file_size > 0) {
1455 /* compute the bit rate */
1456 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1457 (double)ic->duration;
1462 static void fill_all_stream_timings(AVFormatContext *ic)
1467 av_update_stream_timings(ic);
1468 for(i = 0;i < ic->nb_streams; i++) {
1469 st = ic->streams[i];
1470 if (st->start_time == AV_NOPTS_VALUE) {
1471 if(ic->start_time != AV_NOPTS_VALUE)
1472 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1473 if(ic->duration != AV_NOPTS_VALUE)
1474 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1479 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1481 int64_t filesize, duration;
1485 /* if bit_rate is already set, we believe it */
1486 if (ic->bit_rate == 0) {
1488 for(i=0;i<ic->nb_streams;i++) {
1489 st = ic->streams[i];
1490 bit_rate += st->codec->bit_rate;
1492 ic->bit_rate = bit_rate;
1495 /* if duration is already set, we believe it */
1496 if (ic->duration == AV_NOPTS_VALUE &&
1497 ic->bit_rate != 0 &&
1498 ic->file_size != 0) {
1499 filesize = ic->file_size;
1501 for(i = 0; i < ic->nb_streams; i++) {
1502 st = ic->streams[i];
1503 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1504 if (st->duration == AV_NOPTS_VALUE)
1505 st->duration = duration;
1511 #define DURATION_MAX_READ_SIZE 250000
1513 /* only usable for MPEG-PS streams */
1514 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1516 AVPacket pkt1, *pkt = &pkt1;
1518 int read_size, i, ret;
1520 int64_t filesize, offset, duration;
1522 /* free previous packet */
1523 if (ic->cur_st && ic->cur_st->parser)
1524 av_free_packet(&ic->cur_pkt);
1527 /* flush packet queue */
1528 flush_packet_queue(ic);
1530 for(i=0;i<ic->nb_streams;i++) {
1531 st = ic->streams[i];
1533 av_parser_close(st->parser);
1538 /* we read the first packets to get the first PTS (not fully
1539 accurate, but it is enough now) */
1540 url_fseek(ic->pb, 0, SEEK_SET);
1543 if (read_size >= DURATION_MAX_READ_SIZE)
1545 /* if all info is available, we can stop */
1546 for(i = 0;i < ic->nb_streams; i++) {
1547 st = ic->streams[i];
1548 if (st->start_time == AV_NOPTS_VALUE)
1551 if (i == ic->nb_streams)
1554 ret = av_read_packet(ic, pkt);
1557 read_size += pkt->size;
1558 st = ic->streams[pkt->stream_index];
1559 if (pkt->pts != AV_NOPTS_VALUE) {
1560 if (st->start_time == AV_NOPTS_VALUE)
1561 st->start_time = pkt->pts;
1563 av_free_packet(pkt);
1566 /* estimate the end time (duration) */
1567 /* XXX: may need to support wrapping */
1568 filesize = ic->file_size;
1569 offset = filesize - DURATION_MAX_READ_SIZE;
1573 url_fseek(ic->pb, offset, SEEK_SET);
1576 if (read_size >= DURATION_MAX_READ_SIZE)
1579 ret = av_read_packet(ic, pkt);
1582 read_size += pkt->size;
1583 st = ic->streams[pkt->stream_index];
1584 if (pkt->pts != AV_NOPTS_VALUE &&
1585 st->start_time != AV_NOPTS_VALUE) {
1586 end_time = pkt->pts;
1587 duration = end_time - st->start_time;
1589 if (st->duration == AV_NOPTS_VALUE ||
1590 st->duration < duration)
1591 st->duration = duration;
1594 av_free_packet(pkt);
1597 fill_all_stream_timings(ic);
1599 url_fseek(ic->pb, old_offset, SEEK_SET);
1600 for(i=0; i<ic->nb_streams; i++){
1602 st->cur_dts= st->first_dts;
1603 st->last_IP_pts = AV_NOPTS_VALUE;
1607 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1611 /* get the file size, if possible */
1612 if (ic->iformat->flags & AVFMT_NOFILE) {
1615 file_size = url_fsize(ic->pb);
1619 ic->file_size = file_size;
1621 if ((!strcmp(ic->iformat->name, "mpeg") ||
1622 !strcmp(ic->iformat->name, "mpegts")) &&
1623 file_size && !url_is_streamed(ic->pb)) {
1624 /* get accurate estimate from the PTSes */
1625 av_estimate_timings_from_pts(ic, old_offset);
1626 } else if (av_has_duration(ic)) {
1627 /* at least one components has timings - we use them for all
1629 fill_all_stream_timings(ic);
1631 /* less precise: use bit rate info */
1632 av_estimate_timings_from_bit_rate(ic);
1634 av_update_stream_timings(ic);
1640 for(i = 0;i < ic->nb_streams; i++) {
1641 st = ic->streams[i];
1642 printf("%d: start_time: %0.3f duration: %0.3f\n",
1643 i, (double)st->start_time / AV_TIME_BASE,
1644 (double)st->duration / AV_TIME_BASE);
1646 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1647 (double)ic->start_time / AV_TIME_BASE,
1648 (double)ic->duration / AV_TIME_BASE,
1649 ic->bit_rate / 1000);
1654 static int has_codec_parameters(AVCodecContext *enc)
1657 switch(enc->codec_type) {
1658 case CODEC_TYPE_AUDIO:
1659 val = enc->sample_rate;
1661 case CODEC_TYPE_VIDEO:
1662 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1668 return (enc->codec_id != CODEC_ID_NONE && val != 0);
1671 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1675 int got_picture, data_size, ret=0;
1678 if(!st->codec->codec){
1679 codec = avcodec_find_decoder(st->codec->codec_id);
1682 ret = avcodec_open(st->codec, codec);
1687 if(!has_codec_parameters(st->codec)){
1688 switch(st->codec->codec_type) {
1689 case CODEC_TYPE_VIDEO:
1690 ret = avcodec_decode_video(st->codec, &picture,
1691 &got_picture, (uint8_t *)data, size);
1693 case CODEC_TYPE_AUDIO:
1694 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1695 samples = av_malloc(data_size);
1698 ret = avcodec_decode_audio2(st->codec, samples,
1699 &data_size, (uint8_t *)data, size);
1710 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
1713 fmt = av_probe_input_format2(pd, 1, &score);
1716 if (strncmp(fmt->name, "mp3", 3) == 0)
1717 st->codec->codec_id = CODEC_ID_MP3;
1718 else if (strncmp(fmt->name, "ac3", 3) == 0)
1719 st->codec->codec_id = CODEC_ID_AC3;
1724 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1726 while (tags->id != CODEC_ID_NONE) {
1734 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1737 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1738 if(tag == tags[i].tag)
1741 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1742 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1743 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1744 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1745 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1748 return CODEC_ID_NONE;
1751 unsigned int av_codec_get_tag(const AVCodecTag *tags[4], enum CodecID id)
1754 for(i=0; tags && tags[i]; i++){
1755 int tag= codec_get_tag(tags[i], id);
1761 enum CodecID av_codec_get_id(const AVCodecTag *tags[4], unsigned int tag)
1764 for(i=0; tags && tags[i]; i++){
1765 enum CodecID id= codec_get_id(tags[i], tag);
1766 if(id!=CODEC_ID_NONE) return id;
1768 return CODEC_ID_NONE;
1771 /* absolute maximum size we read until we abort */
1772 #define MAX_READ_SIZE 5000000
1774 #define MAX_STD_TIMEBASES (60*12+5)
1775 static int get_std_framerate(int i){
1776 if(i<60*12) return i*1001;
1777 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
1781 * Is the time base unreliable.
1782 * This is a heuristic to balance between quick acceptance of the values in
1783 * the headers vs. some extra checks.
1784 * Old divx and xvid often have nonsense timebases like 1fps or 2fps.
1785 * Mpeg2 commonly misuses field repeat flags to store different framerates.
1786 * And there are "variable" fps files this needs to detect as well.
1788 static int tb_unreliable(AVCodecContext *c){
1789 if( c->time_base.den >= 101L*c->time_base.num
1790 || c->time_base.den < 5L*c->time_base.num
1791 /* || c->codec_tag == ff_get_fourcc("DIVX")
1792 || c->codec_tag == ff_get_fourcc("XVID")*/
1793 || c->codec_id == CODEC_ID_MPEG2VIDEO)
1798 int av_find_stream_info(AVFormatContext *ic)
1800 int i, count, ret, read_size, j;
1802 AVPacket pkt1, *pkt;
1803 int64_t last_dts[MAX_STREAMS];
1804 int duration_count[MAX_STREAMS]={0};
1805 double (*duration_error)[MAX_STD_TIMEBASES];
1806 offset_t old_offset = url_ftell(ic->pb);
1807 int64_t codec_info_duration[MAX_STREAMS]={0};
1808 int codec_info_nb_frames[MAX_STREAMS]={0};
1809 AVProbeData probe_data[MAX_STREAMS];
1810 int codec_identified[MAX_STREAMS]={0};
1812 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1813 if (!duration_error) return AVERROR(ENOMEM);
1815 for(i=0;i<ic->nb_streams;i++) {
1816 st = ic->streams[i];
1817 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1818 /* if(!st->time_base.num)
1820 if(!st->codec->time_base.num)
1821 st->codec->time_base= st->time_base;
1823 //only for the split stuff
1825 st->parser = av_parser_init(st->codec->codec_id);
1826 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1827 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1832 for(i=0;i<MAX_STREAMS;i++){
1833 last_dts[i]= AV_NOPTS_VALUE;
1836 memset(probe_data, 0, sizeof(probe_data));
1840 /* check if one codec still needs to be handled */
1841 for(i=0;i<ic->nb_streams;i++) {
1842 st = ic->streams[i];
1843 if (!has_codec_parameters(st->codec))
1845 /* variable fps and no guess at the real fps */
1846 if( tb_unreliable(st->codec)
1847 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1849 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1851 if(st->first_dts == AV_NOPTS_VALUE)
1854 if (i == ic->nb_streams) {
1855 /* NOTE: if the format has no header, then we need to read
1856 some packets to get most of the streams, so we cannot
1858 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1859 /* if we found the info for all the codecs, we can stop */
1864 /* we did not get all the codec info, but we read too much data */
1865 if (read_size >= MAX_READ_SIZE) {
1870 /* NOTE: a new stream can be added there if no header in file
1871 (AVFMTCTX_NOHEADER) */
1872 ret = av_read_frame_internal(ic, &pkt1);
1875 ret = -1; /* we could not have all the codec parameters before EOF */
1876 for(i=0;i<ic->nb_streams;i++) {
1877 st = ic->streams[i];
1878 if (!has_codec_parameters(st->codec)){
1880 avcodec_string(buf, sizeof(buf), st->codec, 0);
1881 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1889 pkt= add_to_pktbuf(ic, &pkt1);
1890 if(av_dup_packet(pkt) < 0)
1891 return AVERROR(ENOMEM);
1893 read_size += pkt->size;
1895 st = ic->streams[pkt->stream_index];
1896 if(codec_info_nb_frames[st->index]>1)
1897 codec_info_duration[st->index] += pkt->duration;
1898 if (pkt->duration != 0)
1899 codec_info_nb_frames[st->index]++;
1902 int index= pkt->stream_index;
1903 int64_t last= last_dts[index];
1904 int64_t duration= pkt->dts - last;
1906 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
1907 double dur= duration * av_q2d(st->time_base);
1909 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1910 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
1911 if(duration_count[index] < 2)
1912 memset(duration_error, 0, MAX_STREAMS * sizeof(*duration_error));
1913 for(i=1; i<MAX_STD_TIMEBASES; i++){
1914 int framerate= get_std_framerate(i);
1915 int ticks= lrintf(dur*framerate/(1001*12));
1916 double error= dur - ticks*1001*12/(double)framerate;
1917 duration_error[index][i] += error*error;
1919 duration_count[index]++;
1921 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
1922 last_dts[pkt->stream_index]= pkt->dts;
1924 if (st->codec->codec_id == CODEC_ID_NONE) {
1925 AVProbeData *pd = &(probe_data[st->index]);
1926 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
1927 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
1928 pd->buf_size += pkt->size;
1929 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
1932 if(st->parser && st->parser->parser->split && !st->codec->extradata){
1933 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
1935 st->codec->extradata_size= i;
1936 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1937 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
1938 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1942 /* if still no information, we try to open the codec and to
1943 decompress the frame. We try to avoid that in most cases as
1944 it takes longer and uses more memory. For MPEG4, we need to
1945 decompress for Quicktime. */
1946 if (!has_codec_parameters(st->codec) /*&&
1947 (st->codec->codec_id == CODEC_ID_FLV1 ||
1948 st->codec->codec_id == CODEC_ID_H264 ||
1949 st->codec->codec_id == CODEC_ID_H263 ||
1950 st->codec->codec_id == CODEC_ID_H261 ||
1951 st->codec->codec_id == CODEC_ID_VORBIS ||
1952 st->codec->codec_id == CODEC_ID_MJPEG ||
1953 st->codec->codec_id == CODEC_ID_PNG ||
1954 st->codec->codec_id == CODEC_ID_PAM ||
1955 st->codec->codec_id == CODEC_ID_PGM ||
1956 st->codec->codec_id == CODEC_ID_PGMYUV ||
1957 st->codec->codec_id == CODEC_ID_PBM ||
1958 st->codec->codec_id == CODEC_ID_PPM ||
1959 st->codec->codec_id == CODEC_ID_SHORTEN ||
1960 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
1961 try_decode_frame(st, pkt->data, pkt->size);
1963 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) {
1969 // close codecs which where opened in try_decode_frame()
1970 for(i=0;i<ic->nb_streams;i++) {
1971 st = ic->streams[i];
1972 if(st->codec->codec)
1973 avcodec_close(st->codec);
1975 for(i=0;i<ic->nb_streams;i++) {
1976 st = ic->streams[i];
1977 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1978 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
1979 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
1981 if(duration_count[i]
1982 && tb_unreliable(st->codec) /*&&
1983 //FIXME we should not special case mpeg2, but this needs testing with non mpeg2 ...
1984 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
1985 double best_error= 2*av_q2d(st->time_base);
1986 best_error= best_error*best_error*duration_count[i]*1000*12*30;
1988 for(j=1; j<MAX_STD_TIMEBASES; j++){
1989 double error= duration_error[i][j] * get_std_framerate(j);
1990 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1991 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
1992 if(error < best_error){
1994 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
1999 if (!st->r_frame_rate.num){
2000 if( st->codec->time_base.den * (int64_t)st->time_base.num
2001 <= st->codec->time_base.num * (int64_t)st->time_base.den){
2002 st->r_frame_rate.num = st->codec->time_base.den;
2003 st->r_frame_rate.den = st->codec->time_base.num;
2005 st->r_frame_rate.num = st->time_base.den;
2006 st->r_frame_rate.den = st->time_base.num;
2009 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
2010 if (st->codec->codec_id == CODEC_ID_NONE && probe_data[st->index].buf_size > 0) {
2011 codec_identified[st->index] = set_codec_from_probe_data(st, &(probe_data[st->index]), 1);
2012 if (codec_identified[st->index]) {
2013 st->need_parsing = AVSTREAM_PARSE_FULL;
2016 if(!st->codec->bits_per_sample)
2017 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
2021 av_estimate_timings(ic, old_offset);
2023 for(i=0;i<ic->nb_streams;i++) {
2024 st = ic->streams[i];
2025 if (codec_identified[st->index])
2028 //FIXME this is a mess
2029 if(i!=ic->nb_streams){
2030 av_read_frame_flush(ic);
2031 for(i=0;i<ic->nb_streams;i++) {
2032 st = ic->streams[i];
2033 if (codec_identified[st->index]) {
2034 av_seek_frame(ic, st->index, 0.0, 0);
2036 st->cur_dts= st->first_dts;
2038 url_fseek(ic->pb, ic->data_offset, SEEK_SET);
2042 /* correct DTS for b frame streams with no timestamps */
2043 for(i=0;i<ic->nb_streams;i++) {
2044 st = ic->streams[i];
2045 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2047 ppktl = &ic->packet_buffer;
2049 if(ppkt1->stream_index != i)
2051 if(ppkt1->pkt->dts < 0)
2053 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2055 ppkt1->pkt->dts -= delta;
2060 st->cur_dts -= delta;
2066 av_free(duration_error);
2067 for(i=0;i<MAX_STREAMS;i++){
2068 av_freep(&(probe_data[i].buf));
2074 /*******************************************************/
2076 int av_read_play(AVFormatContext *s)
2078 if (s->iformat->read_play)
2079 return s->iformat->read_play(s);
2081 return av_url_read_fpause(s->pb, 0);
2082 return AVERROR(ENOSYS);
2085 int av_read_pause(AVFormatContext *s)
2087 if (s->iformat->read_pause)
2088 return s->iformat->read_pause(s);
2090 return av_url_read_fpause(s->pb, 1);
2091 return AVERROR(ENOSYS);
2094 void av_close_input_stream(AVFormatContext *s)
2099 /* free previous packet */
2100 if (s->cur_st && s->cur_st->parser)
2101 av_free_packet(&s->cur_pkt);
2103 if (s->iformat->read_close)
2104 s->iformat->read_close(s);
2105 for(i=0;i<s->nb_streams;i++) {
2106 /* free all data in a stream component */
2109 av_parser_close(st->parser);
2111 av_free(st->index_entries);
2112 av_free(st->codec->extradata);
2116 for(i=s->nb_programs-1; i>=0; i--) {
2117 av_freep(&s->programs[i]->provider_name);
2118 av_freep(&s->programs[i]->name);
2119 av_freep(&s->programs[i]->stream_index);
2120 av_freep(&s->programs[i]);
2122 flush_packet_queue(s);
2123 av_freep(&s->priv_data);
2127 void av_close_input_file(AVFormatContext *s)
2129 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2130 av_close_input_stream(s);
2135 AVStream *av_new_stream(AVFormatContext *s, int id)
2140 if (s->nb_streams >= MAX_STREAMS)
2143 st = av_mallocz(sizeof(AVStream));
2147 st->codec= avcodec_alloc_context();
2149 /* no default bitrate if decoding */
2150 st->codec->bit_rate = 0;
2152 st->index = s->nb_streams;
2154 st->start_time = AV_NOPTS_VALUE;
2155 st->duration = AV_NOPTS_VALUE;
2156 st->cur_dts = AV_NOPTS_VALUE;
2157 st->first_dts = AV_NOPTS_VALUE;
2159 /* default pts settings is MPEG like */
2160 av_set_pts_info(st, 33, 1, 90000);
2161 st->last_IP_pts = AV_NOPTS_VALUE;
2162 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2163 st->pts_buffer[i]= AV_NOPTS_VALUE;
2165 s->streams[s->nb_streams++] = st;
2169 AVProgram *av_new_program(AVFormatContext *ac, int id)
2171 AVProgram *program=NULL;
2175 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2178 for(i=0; i<ac->nb_programs; i++)
2179 if(ac->programs[i]->id == id)
2180 program = ac->programs[i];
2183 program = av_mallocz(sizeof(AVProgram));
2186 dynarray_add(&ac->programs, &ac->nb_programs, program);
2187 program->discard = AVDISCARD_NONE;
2194 void av_set_program_name(AVProgram *program, char *provider_name, char *name)
2196 assert(!provider_name == !name);
2198 av_free(program->provider_name);
2199 av_free(program-> name);
2200 program->provider_name = av_strdup(provider_name);
2201 program-> name = av_strdup( name);
2206 /************************************************************/
2207 /* output media file */
2209 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2213 if (s->oformat->priv_data_size > 0) {
2214 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2216 return AVERROR(ENOMEM);
2218 s->priv_data = NULL;
2220 if (s->oformat->set_parameters) {
2221 ret = s->oformat->set_parameters(s, ap);
2228 int av_write_header(AVFormatContext *s)
2233 // some sanity checks
2234 for(i=0;i<s->nb_streams;i++) {
2237 switch (st->codec->codec_type) {
2238 case CODEC_TYPE_AUDIO:
2239 if(st->codec->sample_rate<=0){
2240 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2244 case CODEC_TYPE_VIDEO:
2245 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2246 av_log(s, AV_LOG_ERROR, "time base not set\n");
2249 if(st->codec->width<=0 || st->codec->height<=0){
2250 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2256 if(s->oformat->codec_tag){
2257 if(st->codec->codec_tag){
2259 //check that tag + id is in the table
2260 //if neither is in the table -> ok
2261 //if tag is in the table with another id -> FAIL
2262 //if id is in the table with another tag -> FAIL unless strict < ?
2264 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2268 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2269 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2271 return AVERROR(ENOMEM);
2274 if(s->oformat->write_header){
2275 ret = s->oformat->write_header(s);
2280 /* init PTS generation */
2281 for(i=0;i<s->nb_streams;i++) {
2282 int64_t den = AV_NOPTS_VALUE;
2285 switch (st->codec->codec_type) {
2286 case CODEC_TYPE_AUDIO:
2287 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2289 case CODEC_TYPE_VIDEO:
2290 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2295 if (den != AV_NOPTS_VALUE) {
2297 return AVERROR_INVALIDDATA;
2298 av_frac_init(&st->pts, 0, 0, den);
2304 //FIXME merge with compute_pkt_fields
2305 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2306 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2307 int num, den, frame_size, i;
2309 // 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);
2311 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2314 /* duration field */
2315 if (pkt->duration == 0) {
2316 compute_frame_duration(&num, &den, st, NULL, pkt);
2318 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2322 //XXX/FIXME this is a temporary hack until all encoders output pts
2323 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2325 // pkt->pts= st->cur_dts;
2326 pkt->pts= st->pts.val;
2329 //calculate dts from pts
2330 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2331 st->pts_buffer[0]= pkt->pts;
2332 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2333 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2334 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2335 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2337 pkt->dts= st->pts_buffer[0];
2340 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2341 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2344 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2345 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n");
2349 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2350 st->cur_dts= pkt->dts;
2351 st->pts.val= pkt->dts;
2354 switch (st->codec->codec_type) {
2355 case CODEC_TYPE_AUDIO:
2356 frame_size = get_audio_frame_size(st->codec, pkt->size);
2358 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2359 but it would be better if we had the real timestamps from the encoder */
2360 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2361 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2364 case CODEC_TYPE_VIDEO:
2365 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2373 static void truncate_ts(AVStream *st, AVPacket *pkt){
2374 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2377 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2379 if (pkt->pts != AV_NOPTS_VALUE)
2380 pkt->pts &= pts_mask;
2381 if (pkt->dts != AV_NOPTS_VALUE)
2382 pkt->dts &= pts_mask;
2385 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2389 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2390 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2393 truncate_ts(s->streams[pkt->stream_index], pkt);
2395 ret= s->oformat->write_packet(s, pkt);
2397 ret= url_ferror(s->pb);
2401 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2402 AVPacketList *pktl, **next_point, *this_pktl;
2404 int streams[MAX_STREAMS];
2407 AVStream *st= s->streams[ pkt->stream_index];
2409 // assert(pkt->destruct != av_destruct_packet); //FIXME
2411 this_pktl = av_mallocz(sizeof(AVPacketList));
2412 this_pktl->pkt= *pkt;
2413 if(pkt->destruct == av_destruct_packet)
2414 pkt->destruct= NULL; // non shared -> must keep original from being freed
2416 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2418 next_point = &s->packet_buffer;
2420 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2421 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2422 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2423 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2425 next_point= &(*next_point)->next;
2427 this_pktl->next= *next_point;
2428 *next_point= this_pktl;
2431 memset(streams, 0, sizeof(streams));
2432 pktl= s->packet_buffer;
2434 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2435 if(streams[ pktl->pkt.stream_index ] == 0)
2437 streams[ pktl->pkt.stream_index ]++;
2441 if(s->nb_streams == stream_count || (flush && stream_count)){
2442 pktl= s->packet_buffer;
2445 s->packet_buffer= pktl->next;
2449 av_init_packet(out);
2455 * Interleaves a AVPacket correctly so it can be muxed.
2456 * @param out the interleaved packet will be output here
2457 * @param in the input packet
2458 * @param flush 1 if no further packets are available as input and all
2459 * remaining packets should be output
2460 * @return 1 if a packet was output, 0 if no packet could be output,
2461 * < 0 if an error occured
2463 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2464 if(s->oformat->interleave_packet)
2465 return s->oformat->interleave_packet(s, out, in, flush);
2467 return av_interleave_packet_per_dts(s, out, in, flush);
2470 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2471 AVStream *st= s->streams[ pkt->stream_index];
2473 //FIXME/XXX/HACK drop zero sized packets
2474 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2477 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2478 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2481 if(pkt->dts == AV_NOPTS_VALUE)
2486 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2487 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2490 truncate_ts(s->streams[opkt.stream_index], &opkt);
2491 ret= s->oformat->write_packet(s, &opkt);
2493 av_free_packet(&opkt);
2498 if(url_ferror(s->pb))
2499 return url_ferror(s->pb);
2503 int av_write_trailer(AVFormatContext *s)
2509 ret= av_interleave_packet(s, &pkt, NULL, 1);
2510 if(ret<0) //FIXME cleanup needed for ret<0 ?
2515 truncate_ts(s->streams[pkt.stream_index], &pkt);
2516 ret= s->oformat->write_packet(s, &pkt);
2518 av_free_packet(&pkt);
2522 if(url_ferror(s->pb))
2526 if(s->oformat->write_trailer)
2527 ret = s->oformat->write_trailer(s);
2530 ret=url_ferror(s->pb);
2531 for(i=0;i<s->nb_streams;i++)
2532 av_freep(&s->streams[i]->priv_data);
2533 av_freep(&s->priv_data);
2537 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2540 AVProgram *program=NULL;
2543 for(i=0; i<ac->nb_programs; i++){
2544 if(ac->programs[i]->id != progid)
2546 program = ac->programs[i];
2547 for(j=0; j<program->nb_stream_indexes; j++)
2548 if(program->stream_index[j] == idx)
2551 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2554 program->stream_index = tmp;
2555 program->stream_index[program->nb_stream_indexes++] = idx;
2560 /* "user interface" functions */
2561 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2564 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2565 AVStream *st = ic->streams[i];
2566 int g = ff_gcd(st->time_base.num, st->time_base.den);
2567 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2568 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2569 /* the pid is an important information, so we display it */
2570 /* XXX: add a generic system */
2571 if (flags & AVFMT_SHOW_IDS)
2572 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2573 if (strlen(st->language) > 0)
2574 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2575 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2576 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2577 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2578 if(st->r_frame_rate.den && st->r_frame_rate.num)
2579 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(r)", av_q2d(st->r_frame_rate));
2580 /* else if(st->time_base.den && st->time_base.num)
2581 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(m)", 1/av_q2d(st->time_base));*/
2583 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(c)", 1/av_q2d(st->codec->time_base));
2585 av_log(NULL, AV_LOG_INFO, "\n");
2588 void dump_format(AVFormatContext *ic,
2595 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2596 is_output ? "Output" : "Input",
2598 is_output ? ic->oformat->name : ic->iformat->name,
2599 is_output ? "to" : "from", url);
2601 av_log(NULL, AV_LOG_INFO, " Duration: ");
2602 if (ic->duration != AV_NOPTS_VALUE) {
2603 int hours, mins, secs, us;
2604 secs = ic->duration / AV_TIME_BASE;
2605 us = ic->duration % AV_TIME_BASE;
2610 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs,
2611 (10 * us) / AV_TIME_BASE);
2613 av_log(NULL, AV_LOG_INFO, "N/A");
2615 if (ic->start_time != AV_NOPTS_VALUE) {
2617 av_log(NULL, AV_LOG_INFO, ", start: ");
2618 secs = ic->start_time / AV_TIME_BASE;
2619 us = ic->start_time % AV_TIME_BASE;
2620 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2621 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2623 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2625 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2627 av_log(NULL, AV_LOG_INFO, "N/A");
2629 av_log(NULL, AV_LOG_INFO, "\n");
2631 if(ic->nb_programs) {
2633 for(j=0; j<ic->nb_programs; j++) {
2634 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2635 ic->programs[j]->name ? ic->programs[j]->name : "");
2636 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++)
2637 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2640 for(i=0;i<ic->nb_streams;i++)
2641 dump_stream_format(ic, i, index, is_output);
2644 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2646 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2649 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2651 AVRational frame_rate;
2652 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2653 *frame_rate_num= frame_rate.num;
2654 *frame_rate_den= frame_rate.den;
2659 * gets the current time in micro seconds.
2661 int64_t av_gettime(void)
2664 gettimeofday(&tv,NULL);
2665 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2668 int64_t parse_date(const char *datestr, int duration)
2674 static const char *date_fmt[] = {
2678 static const char *time_fmt[] = {
2688 time_t now = time(0);
2690 len = strlen(datestr);
2692 lastch = datestr[len - 1];
2695 is_utc = (lastch == 'z' || lastch == 'Z');
2697 memset(&dt, 0, sizeof(dt));
2702 /* parse the year-month-day part */
2703 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2704 q = small_strptime(p, date_fmt[i], &dt);
2710 /* if the year-month-day part is missing, then take the
2711 * current year-month-day time */
2716 dt = *localtime(&now);
2718 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2723 if (*p == 'T' || *p == 't' || *p == ' ')
2726 /* parse the hour-minute-second part */
2727 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2728 q = small_strptime(p, time_fmt[i], &dt);
2734 /* parse datestr as a duration */
2739 /* parse datestr as HH:MM:SS */
2740 q = small_strptime(p, time_fmt[0], &dt);
2742 /* parse datestr as S+ */
2743 dt.tm_sec = strtol(p, (char **)&q, 10);
2745 /* the parsing didn't succeed */
2752 /* Now we have all the fields that we can get */
2758 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2760 dt.tm_isdst = -1; /* unknown */
2770 /* parse the .m... part */
2774 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2777 val += n * (*q - '0');
2781 return negative ? -t : t;
2784 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2794 while (*p != '\0' && *p != '=' && *p != '&') {
2795 if ((q - tag) < sizeof(tag) - 1)
2803 while (*p != '&' && *p != '\0') {
2804 if ((q - arg) < arg_size - 1) {
2814 if (!strcmp(tag, tag1))
2823 int av_get_frame_filename(char *buf, int buf_size,
2824 const char *path, int number)
2827 char *q, buf1[20], c;
2828 int nd, len, percentd_found;
2840 while (isdigit(*p)) {
2841 nd = nd * 10 + *p++ - '0';
2844 } while (isdigit(c));
2853 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2855 if ((q - buf + len) > buf_size - 1)
2857 memcpy(q, buf1, len);
2865 if ((q - buf) < buf_size - 1)
2869 if (!percentd_found)
2878 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
2881 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2883 for(i=0;i<size;i+=16) {
2890 PRINT(" %02x", buf[i+j]);
2895 for(j=0;j<len;j++) {
2897 if (c < ' ' || c > '~')
2906 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2908 hex_dump_internal(NULL, f, 0, buf, size);
2911 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
2913 hex_dump_internal(avcl, NULL, level, buf, size);
2916 //FIXME needs to know the time_base
2917 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
2919 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2920 PRINT("stream #%d:\n", pkt->stream_index);
2921 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2922 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2923 /* DTS is _always_ valid after av_read_frame() */
2925 if (pkt->dts == AV_NOPTS_VALUE)
2928 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
2929 /* PTS may be not known if B frames are present */
2931 if (pkt->pts == AV_NOPTS_VALUE)
2934 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
2936 PRINT(" size=%d\n", pkt->size);
2939 av_hex_dump(f, pkt->data, pkt->size);
2942 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2944 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
2947 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
2949 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
2952 void url_split(char *proto, int proto_size,
2953 char *authorization, int authorization_size,
2954 char *hostname, int hostname_size,
2956 char *path, int path_size,
2959 const char *p, *ls, *at, *col, *brk;
2961 if (port_ptr) *port_ptr = -1;
2962 if (proto_size > 0) proto[0] = 0;
2963 if (authorization_size > 0) authorization[0] = 0;
2964 if (hostname_size > 0) hostname[0] = 0;
2965 if (path_size > 0) path[0] = 0;
2967 /* parse protocol */
2968 if ((p = strchr(url, ':'))) {
2969 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
2974 /* no protocol means plain filename */
2975 av_strlcpy(path, url, path_size);
2979 /* separate path from hostname */
2980 ls = strchr(p, '/');
2982 ls = strchr(p, '?');
2984 av_strlcpy(path, ls, path_size);
2986 ls = &p[strlen(p)]; // XXX
2988 /* the rest is hostname, use that to parse auth/port */
2990 /* authorization (user[:pass]@hostname) */
2991 if ((at = strchr(p, '@')) && at < ls) {
2992 av_strlcpy(authorization, p,
2993 FFMIN(authorization_size, at + 1 - p));
2994 p = at + 1; /* skip '@' */
2997 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
2999 av_strlcpy(hostname, p + 1,
3000 FFMIN(hostname_size, brk - p));
3001 if (brk[1] == ':' && port_ptr)
3002 *port_ptr = atoi(brk + 2);
3003 } else if ((col = strchr(p, ':')) && col < ls) {
3004 av_strlcpy(hostname, p,
3005 FFMIN(col + 1 - p, hostname_size));
3006 if (port_ptr) *port_ptr = atoi(col + 1);
3008 av_strlcpy(hostname, p,
3009 FFMIN(ls + 1 - p, hostname_size));
3013 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3014 int pts_num, int pts_den)
3016 s->pts_wrap_bits = pts_wrap_bits;
3017 s->time_base.num = pts_num;
3018 s->time_base.den = pts_den;
3021 /* fraction handling */
3024 * f = val + (num / den) + 0.5.
3026 * 'num' is normalized so that it is such as 0 <= num < den.
3028 * @param f fractional number
3029 * @param val integer value
3030 * @param num must be >= 0
3031 * @param den must be >= 1
3033 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
3046 * Fractionnal addition to f: f = f + (incr / f->den).
3048 * @param f fractional number
3049 * @param incr increment, can be positive or negative
3051 static void av_frac_add(AVFrac *f, int64_t incr)
3055 num = f->num + incr;
3058 f->val += num / den;
3064 } else if (num >= den) {
3065 f->val += num / den;