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
22 #include "allformats.h"
29 * @file libavformat/utils.c
30 * Various utility functions for using ffmpeg library.
33 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den);
34 static void av_frac_add(AVFrac *f, int64_t incr);
36 /** head of registered input format linked list. */
37 AVInputFormat *first_iformat = NULL;
38 /** head of registered output format linked list. */
39 AVOutputFormat *first_oformat = NULL;
41 void av_register_input_format(AVInputFormat *format)
45 while (*p != NULL) p = &(*p)->next;
50 void av_register_output_format(AVOutputFormat *format)
54 while (*p != NULL) p = &(*p)->next;
59 int match_ext(const char *filename, const char *extensions)
67 ext = strrchr(filename, '.');
73 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
76 if (!strcasecmp(ext1, ext))
86 AVOutputFormat *guess_format(const char *short_name, const char *filename,
87 const char *mime_type)
89 AVOutputFormat *fmt, *fmt_found;
92 /* specific test for image sequences */
93 #ifdef CONFIG_IMAGE2_MUXER
94 if (!short_name && filename &&
95 av_filename_number_test(filename) &&
96 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
97 return guess_format("image2", NULL, NULL);
100 /* find the proper file type */
104 while (fmt != NULL) {
106 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
108 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
110 if (filename && fmt->extensions &&
111 match_ext(filename, fmt->extensions)) {
114 if (score > score_max) {
123 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
124 const char *mime_type)
126 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
129 AVOutputFormat *stream_fmt;
130 char stream_format_name[64];
132 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
133 stream_fmt = guess_format(stream_format_name, NULL, NULL);
142 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
143 const char *filename, const char *mime_type, enum CodecType type){
144 if(type == CODEC_TYPE_VIDEO){
145 enum CodecID codec_id= CODEC_ID_NONE;
147 #ifdef CONFIG_IMAGE2_MUXER
148 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
149 codec_id= av_guess_image2_codec(filename);
152 if(codec_id == CODEC_ID_NONE)
153 codec_id= fmt->video_codec;
155 }else if(type == CODEC_TYPE_AUDIO)
156 return fmt->audio_codec;
158 return CODEC_ID_NONE;
161 AVInputFormat *av_find_input_format(const char *short_name)
164 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
165 if (!strcmp(fmt->name, short_name))
171 /* memory handling */
173 void av_destruct_packet(AVPacket *pkt)
176 pkt->data = NULL; pkt->size = 0;
179 int av_new_packet(AVPacket *pkt, int size)
182 if((unsigned)size > (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
183 return AVERROR_NOMEM;
184 data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
186 return AVERROR_NOMEM;
187 memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
192 pkt->destruct = av_destruct_packet;
196 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
198 int ret= av_new_packet(pkt, size);
203 pkt->pos= url_ftell(s);
205 ret= get_buffer(s, pkt->data, size);
214 int av_dup_packet(AVPacket *pkt)
216 if (pkt->destruct != av_destruct_packet) {
218 /* we duplicate the packet and don't forget to put the padding
220 if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
221 return AVERROR_NOMEM;
222 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
224 return AVERROR_NOMEM;
226 memcpy(data, pkt->data, pkt->size);
227 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
229 pkt->destruct = av_destruct_packet;
234 int av_filename_number_test(const char *filename)
237 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
240 static AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
242 AVInputFormat *fmt1, *fmt;
246 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
247 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
250 if (fmt1->read_probe) {
251 score = fmt1->read_probe(pd);
252 } else if (fmt1->extensions) {
253 if (match_ext(pd->filename, fmt1->extensions)) {
257 if (score > *score_max) {
265 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
267 return av_probe_input_format2(pd, is_opened, &score);
270 /************************************************************/
271 /* input media file */
274 * Open a media file from an IO stream. 'fmt' must be specified.
276 static const char* format_to_name(void* ptr)
278 AVFormatContext* fc = (AVFormatContext*) ptr;
279 if(fc->iformat) return fc->iformat->name;
280 else if(fc->oformat) return fc->oformat->name;
284 #define OFFSET(x) offsetof(AVFormatContext,x)
285 #define DEFAULT 0 //should be NAN but it doesnt work as its not a constant in glibc as required by ANSI/ISO C
286 //these names are too long to be readable
287 #define E AV_OPT_FLAG_ENCODING_PARAM
288 #define D AV_OPT_FLAG_DECODING_PARAM
290 static const AVOption options[]={
291 {"probesize", NULL, OFFSET(probesize), FF_OPT_TYPE_INT, 32000, 32, INT_MAX, D}, /* 32000 from mpegts.c: 1.0 second at 24Mbit/s */
292 {"muxrate", "set mux rate", OFFSET(mux_rate), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
293 {"packetsize", "set packet size", OFFSET(packet_size), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
294 {"fflags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, D|E, "fflags"},
295 {"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_IGNIDX, INT_MIN, INT_MAX, D, "fflags"},
296 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_GENPTS, INT_MIN, INT_MAX, D, "fflags"},
297 {"track", " set the track number", OFFSET(track), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
298 {"year", "set the year", OFFSET(year), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, E},
299 {"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},
307 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name, options };
309 static void avformat_get_context_defaults(AVFormatContext *s)
311 memset(s, 0, sizeof(AVFormatContext));
313 s->av_class = &av_format_context_class;
315 av_opt_set_defaults(s);
318 AVFormatContext *av_alloc_format_context(void)
321 ic = av_malloc(sizeof(AVFormatContext));
323 avformat_get_context_defaults(ic);
324 ic->av_class = &av_format_context_class;
328 int av_open_input_stream(AVFormatContext **ic_ptr,
329 ByteIOContext *pb, const char *filename,
330 AVInputFormat *fmt, AVFormatParameters *ap)
334 AVFormatParameters default_ap;
338 memset(ap, 0, sizeof(default_ap));
341 if(!ap->prealloced_context)
342 ic = av_alloc_format_context();
352 ic->duration = AV_NOPTS_VALUE;
353 ic->start_time = AV_NOPTS_VALUE;
354 pstrcpy(ic->filename, sizeof(ic->filename), filename);
356 /* allocate private data */
357 if (fmt->priv_data_size > 0) {
358 ic->priv_data = av_mallocz(fmt->priv_data_size);
359 if (!ic->priv_data) {
364 ic->priv_data = NULL;
367 err = ic->iformat->read_header(ic, ap);
371 if (pb && !ic->data_offset)
372 ic->data_offset = url_ftell(&ic->pb);
378 av_freep(&ic->priv_data);
385 /** Size of probe buffer, for guessing file type from file contents. */
386 #define PROBE_BUF_MIN 2048
387 #define PROBE_BUF_MAX (1<<20)
389 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
392 AVFormatParameters *ap)
394 int err, must_open_file, file_opened, probe_size;
395 AVProbeData probe_data, *pd = &probe_data;
396 ByteIOContext pb1, *pb = &pb1;
401 pd->filename = filename;
406 /* guess format if no file can be opened */
407 fmt = av_probe_input_format(pd, 0);
410 /* do not open file if the format does not need it. XXX: specific
411 hack needed to handle RTSP/TCP */
413 if (fmt && (fmt->flags & AVFMT_NOFILE)) {
415 pb= NULL; //FIXME this or memset(pb, 0, sizeof(ByteIOContext)); otherwise its uninitalized
418 if (!fmt || must_open_file) {
419 /* if no file needed do not try to open one */
420 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
426 url_setbufsize(pb, buf_size);
429 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
430 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
431 /* read probe data */
432 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
433 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
434 if (url_fseek(pb, 0, SEEK_SET) < 0) {
436 if (url_fopen(pb, filename, URL_RDONLY) < 0) {
442 /* guess file format */
443 fmt = av_probe_input_format2(pd, 1, &score);
448 /* if still no format found, error */
454 /* XXX: suppress this hack for redirectors */
455 #ifdef CONFIG_NETWORK
456 if (fmt == &redir_demuxer) {
457 err = redir_open(ic_ptr, pb);
463 /* check filename in case of an image number is expected */
464 if (fmt->flags & AVFMT_NEEDNUMBER) {
465 if (!av_filename_number_test(filename)) {
466 err = AVERROR_NUMEXPECTED;
470 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
483 /*******************************************************/
485 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
487 return s->iformat->read_packet(s, pkt);
490 /**********************************************************/
493 * Get the number of samples of an audio frame. Return (-1) if error.
495 static int get_audio_frame_size(AVCodecContext *enc, int size)
499 if (enc->frame_size <= 1) {
500 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
502 if (bits_per_sample) {
503 if (enc->channels == 0)
505 frame_size = (size << 3) / (bits_per_sample * enc->channels);
507 /* used for example by ADPCM codecs */
508 if (enc->bit_rate == 0)
510 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
513 frame_size = enc->frame_size;
520 * Return the frame duration in seconds, return 0 if not available.
522 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
523 AVCodecParserContext *pc, AVPacket *pkt)
529 switch(st->codec->codec_type) {
530 case CODEC_TYPE_VIDEO:
531 if(st->time_base.num*1000LL > st->time_base.den){
532 *pnum = st->time_base.num;
533 *pden = st->time_base.den;
534 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
535 *pnum = st->codec->time_base.num;
536 *pden = st->codec->time_base.den;
537 if (pc && pc->repeat_pict) {
539 *pnum = (*pnum) * (2 + pc->repeat_pict);
543 case CODEC_TYPE_AUDIO:
544 frame_size = get_audio_frame_size(st->codec, pkt->size);
548 *pden = st->codec->sample_rate;
555 static int is_intra_only(AVCodecContext *enc){
556 if(enc->codec_type == CODEC_TYPE_AUDIO){
558 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
559 switch(enc->codec_id){
561 case CODEC_ID_MJPEGB:
563 case CODEC_ID_RAWVIDEO:
564 case CODEC_ID_DVVIDEO:
565 case CODEC_ID_HUFFYUV:
566 case CODEC_ID_FFVHUFF:
577 static int64_t lsb2full(int64_t lsb, int64_t last_ts, int lsb_bits){
578 int64_t mask = lsb_bits < 64 ? (1LL<<lsb_bits)-1 : -1LL;
579 int64_t delta= last_ts - mask/2;
580 return ((lsb - delta)&mask) + delta;
583 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
584 AVCodecParserContext *pc, AVPacket *pkt)
586 int num, den, presentation_delayed, delay, i;
588 /* handle wrapping */
589 if(st->cur_dts != AV_NOPTS_VALUE){
590 if(pkt->pts != AV_NOPTS_VALUE)
591 pkt->pts= lsb2full(pkt->pts, st->cur_dts, st->pts_wrap_bits);
592 if(pkt->dts != AV_NOPTS_VALUE)
593 pkt->dts= lsb2full(pkt->dts, st->cur_dts, st->pts_wrap_bits);
596 if (pkt->duration == 0) {
597 compute_frame_duration(&num, &den, st, pc, pkt);
599 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
603 /* correct timestamps with byte offset if demuxers only have timestamps on packet boundaries */
604 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
605 /* this will estimate bitrate based on this frame's duration and size */
606 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
607 if(pkt->pts != AV_NOPTS_VALUE)
609 if(pkt->dts != AV_NOPTS_VALUE)
613 if(is_intra_only(st->codec))
614 pkt->flags |= PKT_FLAG_KEY;
616 /* do we have a video B frame ? */
617 delay= st->codec->has_b_frames;
618 presentation_delayed = 0;
619 /* XXX: need has_b_frame, but cannot get it if the codec is
622 pc && pc->pict_type != FF_B_TYPE)
623 presentation_delayed = 1;
624 /* this may be redundant, but it shouldnt hurt */
625 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
626 presentation_delayed = 1;
628 if(st->cur_dts == AV_NOPTS_VALUE){
629 st->cur_dts = -delay * pkt->duration;
632 // 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);
633 /* interpolate PTS and DTS if they are not present */
635 if (presentation_delayed) {
636 /* DTS = decompression time stamp */
637 /* PTS = presentation time stamp */
638 if (pkt->dts == AV_NOPTS_VALUE)
639 pkt->dts = st->last_IP_pts;
640 if (pkt->dts == AV_NOPTS_VALUE)
641 pkt->dts = st->cur_dts;
643 /* this is tricky: the dts must be incremented by the duration
644 of the frame we are displaying, i.e. the last I or P frame */
645 if (st->last_IP_duration == 0)
646 st->last_IP_duration = pkt->duration;
647 st->cur_dts = pkt->dts + st->last_IP_duration;
648 st->last_IP_duration = pkt->duration;
649 st->last_IP_pts= pkt->pts;
650 /* cannot compute PTS if not present (we can compute it only
651 by knowing the futur */
652 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
653 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
654 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
655 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
656 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
657 pkt->pts += pkt->duration;
658 // 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);
662 /* presentation is not delayed : PTS and DTS are the same */
663 if(pkt->pts == AV_NOPTS_VALUE)
665 if(pkt->pts == AV_NOPTS_VALUE)
666 pkt->pts = st->cur_dts;
668 st->cur_dts = pkt->pts + pkt->duration;
672 if(pkt->pts != AV_NOPTS_VALUE){
673 st->pts_buffer[0]= pkt->pts;
674 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
675 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
676 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
677 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
678 if(pkt->dts == AV_NOPTS_VALUE)
679 pkt->dts= st->pts_buffer[0];
680 if(pkt->dts > st->cur_dts)
681 st->cur_dts = pkt->dts;
684 // 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);
689 /* key frame computation */
690 if (pc->pict_type == FF_I_TYPE)
691 pkt->flags |= PKT_FLAG_KEY;
695 void av_destruct_packet_nofree(AVPacket *pkt)
697 pkt->data = NULL; pkt->size = 0;
700 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
706 /* select current input stream component */
709 if (!st->need_parsing || !st->parser) {
710 /* no parsing needed: we just output the packet as is */
711 /* raw data support */
713 compute_pkt_fields(s, st, NULL, pkt);
716 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
717 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
718 s->cur_ptr, s->cur_len,
719 s->cur_pkt.pts, s->cur_pkt.dts);
720 s->cur_pkt.pts = AV_NOPTS_VALUE;
721 s->cur_pkt.dts = AV_NOPTS_VALUE;
722 /* increment read pointer */
726 /* return packet if any */
730 pkt->stream_index = st->index;
731 pkt->pts = st->parser->pts;
732 pkt->dts = st->parser->dts;
733 pkt->destruct = av_destruct_packet_nofree;
734 compute_pkt_fields(s, st, st->parser, pkt);
736 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
737 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
738 0, 0, AVINDEX_KEYFRAME);
745 av_free_packet(&s->cur_pkt);
749 /* read next packet */
750 ret = av_read_packet(s, &s->cur_pkt);
752 if (ret == AVERROR(EAGAIN))
754 /* return the last frames, if any */
755 for(i = 0; i < s->nb_streams; i++) {
757 if (st->parser && st->need_parsing) {
758 av_parser_parse(st->parser, st->codec,
759 &pkt->data, &pkt->size,
761 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
766 /* no more packets: really terminates parsing */
770 st = s->streams[s->cur_pkt.stream_index];
771 if(st->codec->debug & FF_DEBUG_PTS)
772 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
773 s->cur_pkt.stream_index,
779 s->cur_ptr = s->cur_pkt.data;
780 s->cur_len = s->cur_pkt.size;
781 if (st->need_parsing && !st->parser) {
782 st->parser = av_parser_init(st->codec->codec_id);
784 /* no parser available : just output the raw packets */
785 st->need_parsing = 0;
786 }else if(st->need_parsing == 2){
787 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
789 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
790 st->parser->last_frame_offset=
791 st->parser->cur_offset= s->cur_pkt.pos;
796 if(st->codec->debug & FF_DEBUG_PTS)
797 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
806 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
810 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
813 pktl = s->packet_buffer;
815 AVPacket *next_pkt= &pktl->pkt;
817 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
818 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
819 if( pktl->pkt.stream_index == next_pkt->stream_index
820 && next_pkt->dts < pktl->pkt.dts
821 && pktl->pkt.pts != pktl->pkt.dts //not b frame
822 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
823 next_pkt->pts= pktl->pkt.dts;
827 pktl = s->packet_buffer;
830 if( next_pkt->pts != AV_NOPTS_VALUE
831 || next_pkt->dts == AV_NOPTS_VALUE
833 /* read packet from packet buffer, if there is data */
835 s->packet_buffer = pktl->next;
841 AVPacketList **plast_pktl= &s->packet_buffer;
842 int ret= av_read_frame_internal(s, pkt);
844 if(pktl && ret != AVERROR(EAGAIN)){
851 /* duplicate the packet */
852 if (av_dup_packet(pkt) < 0)
853 return AVERROR_NOMEM;
855 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
857 pktl = av_mallocz(sizeof(AVPacketList));
859 return AVERROR_NOMEM;
861 /* add the packet in the buffered packet list */
865 assert(!s->packet_buffer);
866 return av_read_frame_internal(s, pkt);
871 /* XXX: suppress the packet queue */
872 static void flush_packet_queue(AVFormatContext *s)
877 pktl = s->packet_buffer;
880 s->packet_buffer = pktl->next;
881 av_free_packet(&pktl->pkt);
886 /*******************************************************/
889 int av_find_default_stream_index(AVFormatContext *s)
894 if (s->nb_streams <= 0)
896 for(i = 0; i < s->nb_streams; i++) {
898 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
906 * Flush the frame reader.
908 static void av_read_frame_flush(AVFormatContext *s)
913 flush_packet_queue(s);
915 /* free previous packet */
917 if (s->cur_st->parser)
918 av_free_packet(&s->cur_pkt);
925 /* for each stream, reset read state */
926 for(i = 0; i < s->nb_streams; i++) {
930 av_parser_close(st->parser);
933 st->last_IP_pts = AV_NOPTS_VALUE;
934 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
938 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
941 for(i = 0; i < s->nb_streams; i++) {
942 AVStream *st = s->streams[i];
944 st->cur_dts = av_rescale(timestamp,
945 st->time_base.den * (int64_t)ref_st->time_base.num,
946 st->time_base.num * (int64_t)ref_st->time_base.den);
950 int av_add_index_entry(AVStream *st,
951 int64_t pos, int64_t timestamp, int size, int distance, int flags)
953 AVIndexEntry *entries, *ie;
956 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
959 entries = av_fast_realloc(st->index_entries,
960 &st->index_entries_allocated_size,
961 (st->nb_index_entries + 1) *
962 sizeof(AVIndexEntry));
966 st->index_entries= entries;
968 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
971 index= st->nb_index_entries++;
973 assert(index==0 || ie[-1].timestamp < timestamp);
976 if(ie->timestamp != timestamp){
977 if(ie->timestamp <= timestamp)
979 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
980 st->nb_index_entries++;
981 }else if(ie->pos == pos && distance < ie->min_distance) //dont reduce the distance
982 distance= ie->min_distance;
986 ie->timestamp = timestamp;
987 ie->min_distance= distance;
995 * build an index for raw streams using a parser.
997 static void av_build_index_raw(AVFormatContext *s)
999 AVPacket pkt1, *pkt = &pkt1;
1004 av_read_frame_flush(s);
1005 url_fseek(&s->pb, s->data_offset, SEEK_SET);
1008 ret = av_read_frame(s, pkt);
1011 if (pkt->stream_index == 0 && st->parser &&
1012 (pkt->flags & PKT_FLAG_KEY)) {
1013 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1014 0, 0, AVINDEX_KEYFRAME);
1016 av_free_packet(pkt);
1021 * Returns TRUE if we deal with a raw stream.
1023 * Raw codec data and parsing needed.
1025 static int is_raw_stream(AVFormatContext *s)
1029 if (s->nb_streams != 1)
1032 if (!st->need_parsing)
1037 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1040 AVIndexEntry *entries= st->index_entries;
1041 int nb_entries= st->nb_index_entries;
1050 timestamp = entries[m].timestamp;
1051 if(timestamp >= wanted_timestamp)
1053 if(timestamp <= wanted_timestamp)
1056 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1058 if(!(flags & AVSEEK_FLAG_ANY)){
1059 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1060 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1071 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1072 AVInputFormat *avif= s->iformat;
1073 int64_t pos_min, pos_max, pos, pos_limit;
1074 int64_t ts_min, ts_max, ts;
1078 if (stream_index < 0)
1082 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1086 ts_min= AV_NOPTS_VALUE;
1087 pos_limit= -1; //gcc falsely says it may be uninitalized
1089 st= s->streams[stream_index];
1090 if(st->index_entries){
1093 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()
1094 index= FFMAX(index, 0);
1095 e= &st->index_entries[index];
1097 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1099 ts_min= e->timestamp;
1101 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1108 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1109 assert(index < st->nb_index_entries);
1111 e= &st->index_entries[index];
1112 assert(e->timestamp >= target_ts);
1114 ts_max= e->timestamp;
1115 pos_limit= pos_max - e->min_distance;
1117 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1118 pos_max,pos_limit, ts_max);
1123 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1128 url_fseek(&s->pb, pos, SEEK_SET);
1130 av_update_cur_dts(s, st, ts);
1135 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 )){
1137 int64_t start_pos, filesize;
1141 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1144 if(ts_min == AV_NOPTS_VALUE){
1145 pos_min = s->data_offset;
1146 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1147 if (ts_min == AV_NOPTS_VALUE)
1151 if(ts_max == AV_NOPTS_VALUE){
1153 filesize = url_fsize(&s->pb);
1154 pos_max = filesize - 1;
1157 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1159 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1160 if (ts_max == AV_NOPTS_VALUE)
1164 int64_t tmp_pos= pos_max + 1;
1165 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1166 if(tmp_ts == AV_NOPTS_VALUE)
1170 if(tmp_pos >= filesize)
1176 if(ts_min > ts_max){
1178 }else if(ts_min == ts_max){
1183 while (pos_min < pos_limit) {
1185 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1189 assert(pos_limit <= pos_max);
1192 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1193 // interpolate position (better than dichotomy)
1194 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1195 + pos_min - approximate_keyframe_distance;
1196 }else if(no_change==1){
1197 // bisection, if interpolation failed to change min or max pos last time
1198 pos = (pos_min + pos_limit)>>1;
1200 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max
1205 else if(pos > pos_limit)
1209 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1215 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);
1217 assert(ts != AV_NOPTS_VALUE);
1218 if (target_ts <= ts) {
1219 pos_limit = start_pos - 1;
1223 if (target_ts >= ts) {
1229 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1230 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1233 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1235 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1236 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1237 pos, ts_min, target_ts, ts_max);
1243 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1244 int64_t pos_min, pos_max;
1248 if (stream_index < 0)
1251 st= s->streams[stream_index];
1254 pos_min = s->data_offset;
1255 pos_max = url_fsize(&s->pb) - 1;
1257 if (pos < pos_min) pos= pos_min;
1258 else if(pos > pos_max) pos= pos_max;
1260 url_fseek(&s->pb, pos, SEEK_SET);
1263 av_update_cur_dts(s, st, ts);
1268 static int av_seek_frame_generic(AVFormatContext *s,
1269 int stream_index, int64_t timestamp, int flags)
1275 st = s->streams[stream_index];
1277 index = av_index_search_timestamp(st, timestamp, flags);
1283 if(st->index_entries && st->nb_index_entries){
1284 ie= &st->index_entries[st->nb_index_entries-1];
1285 url_fseek(&s->pb, ie->pos, SEEK_SET);
1286 av_update_cur_dts(s, st, ie->timestamp);
1288 url_fseek(&s->pb, 0, SEEK_SET);
1291 int ret = av_read_frame(s, &pkt);
1294 av_free_packet(&pkt);
1295 if(stream_index == pkt.stream_index){
1296 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1300 index = av_index_search_timestamp(st, timestamp, flags);
1305 av_read_frame_flush(s);
1306 if (s->iformat->read_seek){
1307 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1310 ie = &st->index_entries[index];
1311 url_fseek(&s->pb, ie->pos, SEEK_SET);
1313 av_update_cur_dts(s, st, ie->timestamp);
1318 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1323 av_read_frame_flush(s);
1325 if(flags & AVSEEK_FLAG_BYTE)
1326 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1328 if(stream_index < 0){
1329 stream_index= av_find_default_stream_index(s);
1330 if(stream_index < 0)
1333 st= s->streams[stream_index];
1334 /* timestamp for default must be expressed in AV_TIME_BASE units */
1335 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1337 st= s->streams[stream_index];
1339 /* first, we try the format specific seek */
1340 if (s->iformat->read_seek)
1341 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1348 if(s->iformat->read_timestamp)
1349 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1351 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1354 /*******************************************************/
1357 * Returns TRUE if the stream has accurate timings in any stream.
1359 * @return TRUE if the stream has accurate timings for at least one component.
1361 static int av_has_timings(AVFormatContext *ic)
1366 for(i = 0;i < ic->nb_streams; i++) {
1367 st = ic->streams[i];
1368 if (st->start_time != AV_NOPTS_VALUE &&
1369 st->duration != AV_NOPTS_VALUE)
1376 * Estimate the stream timings from the one of each components.
1378 * Also computes the global bitrate if possible.
1380 static void av_update_stream_timings(AVFormatContext *ic)
1382 int64_t start_time, start_time1, end_time, end_time1;
1386 start_time = INT64_MAX;
1387 end_time = INT64_MIN;
1388 for(i = 0;i < ic->nb_streams; i++) {
1389 st = ic->streams[i];
1390 if (st->start_time != AV_NOPTS_VALUE) {
1391 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1392 if (start_time1 < start_time)
1393 start_time = start_time1;
1394 if (st->duration != AV_NOPTS_VALUE) {
1395 end_time1 = start_time1
1396 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1397 if (end_time1 > end_time)
1398 end_time = end_time1;
1402 if (start_time != INT64_MAX) {
1403 ic->start_time = start_time;
1404 if (end_time != INT64_MIN) {
1405 ic->duration = end_time - start_time;
1406 if (ic->file_size > 0) {
1407 /* compute the bit rate */
1408 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1409 (double)ic->duration;
1416 static void fill_all_stream_timings(AVFormatContext *ic)
1421 av_update_stream_timings(ic);
1422 for(i = 0;i < ic->nb_streams; i++) {
1423 st = ic->streams[i];
1424 if (st->start_time == AV_NOPTS_VALUE) {
1425 if(ic->start_time != AV_NOPTS_VALUE)
1426 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1427 if(ic->duration != AV_NOPTS_VALUE)
1428 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1433 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1435 int64_t filesize, duration;
1439 /* if bit_rate is already set, we believe it */
1440 if (ic->bit_rate == 0) {
1442 for(i=0;i<ic->nb_streams;i++) {
1443 st = ic->streams[i];
1444 bit_rate += st->codec->bit_rate;
1446 ic->bit_rate = bit_rate;
1449 /* if duration is already set, we believe it */
1450 if (ic->duration == AV_NOPTS_VALUE &&
1451 ic->bit_rate != 0 &&
1452 ic->file_size != 0) {
1453 filesize = ic->file_size;
1455 for(i = 0; i < ic->nb_streams; i++) {
1456 st = ic->streams[i];
1457 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1458 if (st->start_time == AV_NOPTS_VALUE ||
1459 st->duration == AV_NOPTS_VALUE) {
1461 st->duration = duration;
1468 #define DURATION_MAX_READ_SIZE 250000
1470 /* only usable for MPEG-PS streams */
1471 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1473 AVPacket pkt1, *pkt = &pkt1;
1475 int read_size, i, ret;
1477 int64_t filesize, offset, duration;
1479 av_read_frame_flush(ic);
1481 /* we read the first packets to get the first PTS (not fully
1482 accurate, but it is enough now) */
1483 url_fseek(&ic->pb, 0, SEEK_SET);
1486 if (read_size >= DURATION_MAX_READ_SIZE)
1488 /* if all info is available, we can stop */
1489 for(i = 0;i < ic->nb_streams; i++) {
1490 st = ic->streams[i];
1491 if (st->start_time == AV_NOPTS_VALUE)
1494 if (i == ic->nb_streams)
1497 ret = av_read_packet(ic, pkt);
1500 read_size += pkt->size;
1501 st = ic->streams[pkt->stream_index];
1502 if (pkt->pts != AV_NOPTS_VALUE) {
1503 if (st->start_time == AV_NOPTS_VALUE)
1504 st->start_time = pkt->pts;
1506 av_free_packet(pkt);
1509 /* estimate the end time (duration) */
1510 /* XXX: may need to support wrapping */
1511 filesize = ic->file_size;
1512 offset = filesize - DURATION_MAX_READ_SIZE;
1516 url_fseek(&ic->pb, offset, SEEK_SET);
1519 if (read_size >= DURATION_MAX_READ_SIZE)
1521 /* if all info is available, we can stop */
1522 for(i = 0;i < ic->nb_streams; i++) {
1523 st = ic->streams[i];
1524 if (st->duration == AV_NOPTS_VALUE)
1527 if (i == ic->nb_streams)
1530 ret = av_read_packet(ic, pkt);
1533 read_size += pkt->size;
1534 st = ic->streams[pkt->stream_index];
1535 if (pkt->pts != AV_NOPTS_VALUE) {
1536 end_time = pkt->pts;
1537 duration = end_time - st->start_time;
1539 if (st->duration == AV_NOPTS_VALUE ||
1540 st->duration < duration)
1541 st->duration = duration;
1544 av_free_packet(pkt);
1547 fill_all_stream_timings(ic);
1549 url_fseek(&ic->pb, old_offset, SEEK_SET);
1552 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1556 /* get the file size, if possible */
1557 if (ic->iformat->flags & AVFMT_NOFILE) {
1560 file_size = url_fsize(&ic->pb);
1564 ic->file_size = file_size;
1566 if ((!strcmp(ic->iformat->name, "mpeg") ||
1567 !strcmp(ic->iformat->name, "mpegts")) &&
1568 file_size && !ic->pb.is_streamed) {
1569 /* get accurate estimate from the PTSes */
1570 av_estimate_timings_from_pts(ic, old_offset);
1571 } else if (av_has_timings(ic)) {
1572 /* at least one components has timings - we use them for all
1574 fill_all_stream_timings(ic);
1576 /* less precise: use bit rate info */
1577 av_estimate_timings_from_bit_rate(ic);
1579 av_update_stream_timings(ic);
1585 for(i = 0;i < ic->nb_streams; i++) {
1586 st = ic->streams[i];
1587 printf("%d: start_time: %0.3f duration: %0.3f\n",
1588 i, (double)st->start_time / AV_TIME_BASE,
1589 (double)st->duration / AV_TIME_BASE);
1591 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1592 (double)ic->start_time / AV_TIME_BASE,
1593 (double)ic->duration / AV_TIME_BASE,
1594 ic->bit_rate / 1000);
1599 static int has_codec_parameters(AVCodecContext *enc)
1602 switch(enc->codec_type) {
1603 case CODEC_TYPE_AUDIO:
1604 val = enc->sample_rate;
1606 case CODEC_TYPE_VIDEO:
1607 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1616 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1620 int got_picture, data_size, ret=0;
1623 if(!st->codec->codec){
1624 codec = avcodec_find_decoder(st->codec->codec_id);
1627 ret = avcodec_open(st->codec, codec);
1632 if(!has_codec_parameters(st->codec)){
1633 switch(st->codec->codec_type) {
1634 case CODEC_TYPE_VIDEO:
1635 ret = avcodec_decode_video(st->codec, &picture,
1636 &got_picture, (uint8_t *)data, size);
1638 case CODEC_TYPE_AUDIO:
1639 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1640 samples = av_malloc(data_size);
1643 ret = avcodec_decode_audio2(st->codec, samples,
1644 &data_size, (uint8_t *)data, size);
1655 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
1658 fmt = av_probe_input_format2(pd, 1, &score);
1661 if (strncmp(fmt->name, "mp3", 3) == 0)
1662 st->codec->codec_id = CODEC_ID_MP3;
1663 else if (strncmp(fmt->name, "ac3", 3) == 0)
1664 st->codec->codec_id = CODEC_ID_AC3;
1669 /* absolute maximum size we read until we abort */
1670 #define MAX_READ_SIZE 5000000
1672 #define MAX_STD_TIMEBASES (60*12+5)
1673 static int get_std_framerate(int i){
1674 if(i<60*12) return i*1001;
1675 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
1678 int av_find_stream_info(AVFormatContext *ic)
1680 int i, count, ret, read_size, j;
1682 AVPacket pkt1, *pkt;
1683 AVPacketList *pktl=NULL, **ppktl;
1684 int64_t last_dts[MAX_STREAMS];
1685 int duration_count[MAX_STREAMS]={0};
1686 double (*duration_error)[MAX_STD_TIMEBASES];
1687 offset_t old_offset = url_ftell(&ic->pb);
1688 int64_t codec_info_duration[MAX_STREAMS]={0};
1689 int codec_info_nb_frames[MAX_STREAMS]={0};
1690 AVProbeData probe_data[MAX_STREAMS];
1691 int codec_identified[MAX_STREAMS]={0};
1693 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1694 if (!duration_error) return AVERROR_NOMEM;
1696 for(i=0;i<ic->nb_streams;i++) {
1697 st = ic->streams[i];
1698 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1699 /* if(!st->time_base.num)
1701 if(!st->codec->time_base.num)
1702 st->codec->time_base= st->time_base;
1704 //only for the split stuff
1706 st->parser = av_parser_init(st->codec->codec_id);
1707 if(st->need_parsing == 2 && st->parser){
1708 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1713 for(i=0;i<MAX_STREAMS;i++){
1714 last_dts[i]= AV_NOPTS_VALUE;
1717 memset(probe_data, 0, sizeof(probe_data));
1720 ppktl = &ic->packet_buffer;
1722 /* check if one codec still needs to be handled */
1723 for(i=0;i<ic->nb_streams;i++) {
1724 st = ic->streams[i];
1725 if (!has_codec_parameters(st->codec))
1727 /* variable fps and no guess at the real fps */
1728 if( (st->codec->time_base.den >= 101LL*st->codec->time_base.num || st->codec->codec_id == CODEC_ID_MPEG2VIDEO)
1729 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1731 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1733 if (st->codec->codec_type == CODEC_TYPE_AUDIO &&
1734 st->codec->codec_id == CODEC_ID_NONE)
1737 if (i == ic->nb_streams) {
1738 /* NOTE: if the format has no header, then we need to read
1739 some packets to get most of the streams, so we cannot
1741 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1742 /* if we found the info for all the codecs, we can stop */
1747 /* we did not get all the codec info, but we read too much data */
1748 if (read_size >= MAX_READ_SIZE) {
1753 /* NOTE: a new stream can be added there if no header in file
1754 (AVFMTCTX_NOHEADER) */
1755 ret = av_read_frame_internal(ic, &pkt1);
1758 ret = -1; /* we could not have all the codec parameters before EOF */
1759 for(i=0;i<ic->nb_streams;i++) {
1760 st = ic->streams[i];
1761 if (!has_codec_parameters(st->codec)){
1763 avcodec_string(buf, sizeof(buf), st->codec, 0);
1764 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
1772 pktl = av_mallocz(sizeof(AVPacketList));
1774 ret = AVERROR_NOMEM;
1778 /* add the packet in the buffered packet list */
1780 ppktl = &pktl->next;
1785 /* duplicate the packet */
1786 if (av_dup_packet(pkt) < 0) {
1787 ret = AVERROR_NOMEM;
1791 read_size += pkt->size;
1793 st = ic->streams[pkt->stream_index];
1794 if(codec_info_nb_frames[st->index]>1)
1795 codec_info_duration[st->index] += pkt->duration;
1796 if (pkt->duration != 0)
1797 codec_info_nb_frames[st->index]++;
1800 int index= pkt->stream_index;
1801 int64_t last= last_dts[index];
1802 int64_t duration= pkt->dts - last;
1804 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
1805 double dur= duration * av_q2d(st->time_base);
1807 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1808 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
1809 if(duration_count[index] < 2)
1810 memset(duration_error, 0, MAX_STREAMS * sizeof(*duration_error));
1811 for(i=1; i<MAX_STD_TIMEBASES; i++){
1812 int framerate= get_std_framerate(i);
1813 int ticks= lrintf(dur*framerate/(1001*12));
1814 double error= dur - ticks*1001*12/(double)framerate;
1815 duration_error[index][i] += error*error;
1817 duration_count[index]++;
1819 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
1820 last_dts[pkt->stream_index]= pkt->dts;
1822 if (st->codec->codec_id == CODEC_ID_NONE) {
1823 AVProbeData *pd = &(probe_data[st->index]);
1824 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size);
1825 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
1826 pd->buf_size += pkt->size;
1829 if(st->parser && st->parser->parser->split && !st->codec->extradata){
1830 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
1832 st->codec->extradata_size= i;
1833 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1834 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
1835 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1839 /* if still no information, we try to open the codec and to
1840 decompress the frame. We try to avoid that in most cases as
1841 it takes longer and uses more memory. For MPEG4, we need to
1842 decompress for Quicktime. */
1843 if (!has_codec_parameters(st->codec) /*&&
1844 (st->codec->codec_id == CODEC_ID_FLV1 ||
1845 st->codec->codec_id == CODEC_ID_H264 ||
1846 st->codec->codec_id == CODEC_ID_H263 ||
1847 st->codec->codec_id == CODEC_ID_H261 ||
1848 st->codec->codec_id == CODEC_ID_VORBIS ||
1849 st->codec->codec_id == CODEC_ID_MJPEG ||
1850 st->codec->codec_id == CODEC_ID_PNG ||
1851 st->codec->codec_id == CODEC_ID_PAM ||
1852 st->codec->codec_id == CODEC_ID_PGM ||
1853 st->codec->codec_id == CODEC_ID_PGMYUV ||
1854 st->codec->codec_id == CODEC_ID_PBM ||
1855 st->codec->codec_id == CODEC_ID_PPM ||
1856 st->codec->codec_id == CODEC_ID_SHORTEN ||
1857 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
1858 try_decode_frame(st, pkt->data, pkt->size);
1860 if (av_rescale_q(codec_info_duration[st->index], st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
1866 // close codecs which where opened in try_decode_frame()
1867 for(i=0;i<ic->nb_streams;i++) {
1868 st = ic->streams[i];
1869 if(st->codec->codec)
1870 avcodec_close(st->codec);
1872 for(i=0;i<ic->nb_streams;i++) {
1873 st = ic->streams[i];
1874 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1875 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
1876 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
1878 if(duration_count[i]
1879 && (st->codec->time_base.num*101LL <= st->codec->time_base.den || st->codec->codec_id == CODEC_ID_MPEG2VIDEO) /*&&
1880 //FIXME we should not special case mpeg2, but this needs testing with non mpeg2 ...
1881 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
1882 double best_error= 2*av_q2d(st->time_base);
1883 best_error= best_error*best_error*duration_count[i]*1000*12*30;
1885 for(j=1; j<MAX_STD_TIMEBASES; j++){
1886 double error= duration_error[i][j] * get_std_framerate(j);
1887 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1888 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
1889 if(error < best_error){
1891 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
1896 if (!st->r_frame_rate.num){
1897 if( st->codec->time_base.den * (int64_t)st->time_base.num
1898 <= st->codec->time_base.num * (int64_t)st->time_base.den){
1899 st->r_frame_rate.num = st->codec->time_base.den;
1900 st->r_frame_rate.den = st->codec->time_base.num;
1902 st->r_frame_rate.num = st->time_base.den;
1903 st->r_frame_rate.den = st->time_base.num;
1906 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
1907 if (st->codec->codec_id == CODEC_ID_NONE) {
1908 codec_identified[st->index] = set_codec_from_probe_data(st, &(probe_data[st->index]), 0);
1909 if (codec_identified[st->index]) {
1910 st->need_parsing = 1;
1913 if(!st->codec->bits_per_sample)
1914 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
1918 av_estimate_timings(ic, old_offset);
1920 for(i=0;i<ic->nb_streams;i++) {
1921 st = ic->streams[i];
1922 if (codec_identified[st->index]) {
1923 av_read_frame_flush(ic);
1924 av_seek_frame(ic, st->index, 0.0, 0);
1925 url_fseek(&ic->pb, ic->data_offset, SEEK_SET);
1930 /* correct DTS for b frame streams with no timestamps */
1931 for(i=0;i<ic->nb_streams;i++) {
1932 st = ic->streams[i];
1933 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1935 ppktl = &ic->packet_buffer;
1937 if(ppkt1->stream_index != i)
1939 if(ppkt1->pkt->dts < 0)
1941 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
1943 ppkt1->pkt->dts -= delta;
1948 st->cur_dts -= delta;
1954 av_free(duration_error);
1955 for(i=0;i<MAX_STREAMS;i++){
1956 av_freep(&(probe_data[i].buf));
1962 /*******************************************************/
1964 int av_read_play(AVFormatContext *s)
1966 if (!s->iformat->read_play)
1967 return AVERROR_NOTSUPP;
1968 return s->iformat->read_play(s);
1971 int av_read_pause(AVFormatContext *s)
1973 if (!s->iformat->read_pause)
1974 return AVERROR_NOTSUPP;
1975 return s->iformat->read_pause(s);
1978 void av_close_input_file(AVFormatContext *s)
1980 int i, must_open_file;
1983 /* free previous packet */
1984 if (s->cur_st && s->cur_st->parser)
1985 av_free_packet(&s->cur_pkt);
1987 if (s->iformat->read_close)
1988 s->iformat->read_close(s);
1989 for(i=0;i<s->nb_streams;i++) {
1990 /* free all data in a stream component */
1993 av_parser_close(st->parser);
1995 av_free(st->index_entries);
1996 av_free(st->codec->extradata);
2000 flush_packet_queue(s);
2002 if (s->iformat->flags & AVFMT_NOFILE) {
2005 if (must_open_file) {
2008 av_freep(&s->priv_data);
2012 AVStream *av_new_stream(AVFormatContext *s, int id)
2017 if (s->nb_streams >= MAX_STREAMS)
2020 st = av_mallocz(sizeof(AVStream));
2024 st->codec= avcodec_alloc_context();
2026 /* no default bitrate if decoding */
2027 st->codec->bit_rate = 0;
2029 st->index = s->nb_streams;
2031 st->start_time = AV_NOPTS_VALUE;
2032 st->duration = AV_NOPTS_VALUE;
2033 st->cur_dts = AV_NOPTS_VALUE;
2035 /* default pts settings is MPEG like */
2036 av_set_pts_info(st, 33, 1, 90000);
2037 st->last_IP_pts = AV_NOPTS_VALUE;
2038 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2039 st->pts_buffer[i]= AV_NOPTS_VALUE;
2041 s->streams[s->nb_streams++] = st;
2045 /************************************************************/
2046 /* output media file */
2048 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2052 if (s->oformat->priv_data_size > 0) {
2053 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2055 return AVERROR_NOMEM;
2057 s->priv_data = NULL;
2059 if (s->oformat->set_parameters) {
2060 ret = s->oformat->set_parameters(s, ap);
2067 int av_write_header(AVFormatContext *s)
2072 // some sanity checks
2073 for(i=0;i<s->nb_streams;i++) {
2076 switch (st->codec->codec_type) {
2077 case CODEC_TYPE_AUDIO:
2078 if(st->codec->sample_rate<=0){
2079 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2083 case CODEC_TYPE_VIDEO:
2084 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2085 av_log(s, AV_LOG_ERROR, "time base not set\n");
2088 if(st->codec->width<=0 || st->codec->height<=0){
2089 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2095 if(s->oformat->codec_tag){
2096 if(st->codec->codec_tag){
2098 //check that tag + id is in the table
2099 //if neither is in the table -> ok
2100 //if tag is in the table with another id -> FAIL
2101 //if id is in the table with another tag -> FAIL unless strict < ?
2103 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2107 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2108 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2110 return AVERROR_NOMEM;
2113 if(s->oformat->write_header){
2114 ret = s->oformat->write_header(s);
2119 /* init PTS generation */
2120 for(i=0;i<s->nb_streams;i++) {
2121 int64_t den = AV_NOPTS_VALUE;
2124 switch (st->codec->codec_type) {
2125 case CODEC_TYPE_AUDIO:
2126 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2128 case CODEC_TYPE_VIDEO:
2129 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2134 if (den != AV_NOPTS_VALUE) {
2136 return AVERROR_INVALIDDATA;
2137 av_frac_init(&st->pts, 0, 0, den);
2143 //FIXME merge with compute_pkt_fields
2144 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2145 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2146 int num, den, frame_size, i;
2148 // 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);
2150 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2153 /* duration field */
2154 if (pkt->duration == 0) {
2155 compute_frame_duration(&num, &den, st, NULL, pkt);
2157 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2161 //XXX/FIXME this is a temporary hack until all encoders output pts
2162 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2164 // pkt->pts= st->cur_dts;
2165 pkt->pts= st->pts.val;
2168 //calculate dts from pts
2169 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2170 st->pts_buffer[0]= pkt->pts;
2171 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2172 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2173 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2174 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2176 pkt->dts= st->pts_buffer[0];
2179 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2180 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64" st:%d\n", st->cur_dts, pkt->dts, st->index);
2183 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2184 av_log(NULL, AV_LOG_ERROR, "error, pts < dts (%"PRId64" < %"PRId64")\n",
2185 pkt->pts, pkt->dts);
2189 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2190 st->cur_dts= pkt->dts;
2191 st->pts.val= pkt->dts;
2194 switch (st->codec->codec_type) {
2195 case CODEC_TYPE_AUDIO:
2196 frame_size = get_audio_frame_size(st->codec, pkt->size);
2198 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
2199 but it would be better if we had the real timestamps from the encoder */
2200 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2201 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2204 case CODEC_TYPE_VIDEO:
2205 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2213 static void truncate_ts(AVStream *st, AVPacket *pkt){
2214 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2217 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here
2219 if (pkt->pts != AV_NOPTS_VALUE)
2220 pkt->pts &= pts_mask;
2221 if (pkt->dts != AV_NOPTS_VALUE)
2222 pkt->dts &= pts_mask;
2225 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2229 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2230 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2233 truncate_ts(s->streams[pkt->stream_index], pkt);
2235 ret= s->oformat->write_packet(s, pkt);
2237 ret= url_ferror(&s->pb);
2241 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2242 AVPacketList *pktl, **next_point, *this_pktl;
2244 int streams[MAX_STREAMS];
2247 AVStream *st= s->streams[ pkt->stream_index];
2249 // assert(pkt->destruct != av_destruct_packet); //FIXME
2251 this_pktl = av_mallocz(sizeof(AVPacketList));
2252 this_pktl->pkt= *pkt;
2253 if(pkt->destruct == av_destruct_packet)
2254 pkt->destruct= NULL; // non shared -> must keep original from being freed
2256 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2258 next_point = &s->packet_buffer;
2260 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2261 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2262 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2263 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2265 next_point= &(*next_point)->next;
2267 this_pktl->next= *next_point;
2268 *next_point= this_pktl;
2271 memset(streams, 0, sizeof(streams));
2272 pktl= s->packet_buffer;
2274 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2275 if(streams[ pktl->pkt.stream_index ] == 0)
2277 streams[ pktl->pkt.stream_index ]++;
2281 if(s->nb_streams == stream_count || (flush && stream_count)){
2282 pktl= s->packet_buffer;
2285 s->packet_buffer= pktl->next;
2289 av_init_packet(out);
2295 * Interleaves a AVPacket correctly so it can be muxed.
2296 * @param out the interleaved packet will be output here
2297 * @param in the input packet
2298 * @param flush 1 if no further packets are available as input and all
2299 * remaining packets should be output
2300 * @return 1 if a packet was output, 0 if no packet could be output,
2301 * < 0 if an error occured
2303 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2304 if(s->oformat->interleave_packet)
2305 return s->oformat->interleave_packet(s, out, in, flush);
2307 return av_interleave_packet_per_dts(s, out, in, flush);
2310 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2311 AVStream *st= s->streams[ pkt->stream_index];
2313 //FIXME/XXX/HACK drop zero sized packets
2314 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2317 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2318 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2321 if(pkt->dts == AV_NOPTS_VALUE)
2326 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2327 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2330 truncate_ts(s->streams[opkt.stream_index], &opkt);
2331 ret= s->oformat->write_packet(s, &opkt);
2333 av_free_packet(&opkt);
2338 if(url_ferror(&s->pb))
2339 return url_ferror(&s->pb);
2343 int av_write_trailer(AVFormatContext *s)
2349 ret= av_interleave_packet(s, &pkt, NULL, 1);
2350 if(ret<0) //FIXME cleanup needed for ret<0 ?
2355 truncate_ts(s->streams[pkt.stream_index], &pkt);
2356 ret= s->oformat->write_packet(s, &pkt);
2358 av_free_packet(&pkt);
2362 if(url_ferror(&s->pb))
2366 if(s->oformat->write_trailer)
2367 ret = s->oformat->write_trailer(s);
2370 ret=url_ferror(&s->pb);
2371 for(i=0;i<s->nb_streams;i++)
2372 av_freep(&s->streams[i]->priv_data);
2373 av_freep(&s->priv_data);
2377 /* "user interface" functions */
2379 void dump_format(AVFormatContext *ic,
2387 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2388 is_output ? "Output" : "Input",
2390 is_output ? ic->oformat->name : ic->iformat->name,
2391 is_output ? "to" : "from", url);
2393 av_log(NULL, AV_LOG_INFO, " Duration: ");
2394 if (ic->duration != AV_NOPTS_VALUE) {
2395 int hours, mins, secs, us;
2396 secs = ic->duration / AV_TIME_BASE;
2397 us = ic->duration % AV_TIME_BASE;
2402 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs,
2403 (10 * us) / AV_TIME_BASE);
2405 av_log(NULL, AV_LOG_INFO, "N/A");
2407 if (ic->start_time != AV_NOPTS_VALUE) {
2409 av_log(NULL, AV_LOG_INFO, ", start: ");
2410 secs = ic->start_time / AV_TIME_BASE;
2411 us = ic->start_time % AV_TIME_BASE;
2412 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2413 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2415 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2417 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2419 av_log(NULL, AV_LOG_INFO, "N/A");
2421 av_log(NULL, AV_LOG_INFO, "\n");
2423 for(i=0;i<ic->nb_streams;i++) {
2424 AVStream *st = ic->streams[i];
2425 int g= ff_gcd(st->time_base.num, st->time_base.den);
2426 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2427 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2428 /* the pid is an important information, so we display it */
2429 /* XXX: add a generic system */
2431 flags = ic->oformat->flags;
2433 flags = ic->iformat->flags;
2434 if (flags & AVFMT_SHOW_IDS) {
2435 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2437 if (strlen(st->language) > 0) {
2438 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2440 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2441 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2442 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2443 if(st->r_frame_rate.den && st->r_frame_rate.num)
2444 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(r)", av_q2d(st->r_frame_rate));
2445 /* else if(st->time_base.den && st->time_base.num)
2446 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(m)", 1/av_q2d(st->time_base));*/
2448 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(c)", 1/av_q2d(st->codec->time_base));
2450 av_log(NULL, AV_LOG_INFO, "\n");
2457 int frame_rate, frame_rate_base;
2460 static AbvEntry frame_abvs[] = {
2461 { "ntsc", 720, 480, 30000, 1001 },
2462 { "pal", 720, 576, 25, 1 },
2463 { "qntsc", 352, 240, 30000, 1001 }, /* VCD compliant ntsc */
2464 { "qpal", 352, 288, 25, 1 }, /* VCD compliant pal */
2465 { "sntsc", 640, 480, 30000, 1001 }, /* square pixel ntsc */
2466 { "spal", 768, 576, 25, 1 }, /* square pixel pal */
2467 { "film", 352, 240, 24, 1 },
2468 { "ntsc-film", 352, 240, 24000, 1001 },
2469 { "sqcif", 128, 96, 0, 0 },
2470 { "qcif", 176, 144, 0, 0 },
2471 { "cif", 352, 288, 0, 0 },
2472 { "4cif", 704, 576, 0, 0 },
2475 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2478 int n = sizeof(frame_abvs) / sizeof(AbvEntry);
2480 int frame_width = 0, frame_height = 0;
2483 if (!strcmp(frame_abvs[i].abv, str)) {
2484 frame_width = frame_abvs[i].width;
2485 frame_height = frame_abvs[i].height;
2491 frame_width = strtol(p, (char **)&p, 10);
2494 frame_height = strtol(p, (char **)&p, 10);
2496 if (frame_width <= 0 || frame_height <= 0)
2498 *width_ptr = frame_width;
2499 *height_ptr = frame_height;
2503 int parse_frame_rate(int *frame_rate, int *frame_rate_base, const char *arg)
2508 /* First, we check our abbreviation table */
2509 for (i = 0; i < sizeof(frame_abvs)/sizeof(*frame_abvs); ++i)
2510 if (!strcmp(frame_abvs[i].abv, arg)) {
2511 *frame_rate = frame_abvs[i].frame_rate;
2512 *frame_rate_base = frame_abvs[i].frame_rate_base;
2516 /* Then, we try to parse it as fraction */
2517 cp = strchr(arg, '/');
2519 cp = strchr(arg, ':');
2522 *frame_rate = strtol(arg, &cpp, 10);
2523 if (cpp != arg || cpp == cp)
2524 *frame_rate_base = strtol(cp+1, &cpp, 10);
2529 /* Finally we give up and parse it as double */
2530 AVRational time_base = av_d2q(strtod(arg, 0), DEFAULT_FRAME_RATE_BASE);
2531 *frame_rate_base = time_base.den;
2532 *frame_rate = time_base.num;
2534 if (!*frame_rate || !*frame_rate_base)
2540 #ifndef CONFIG_WINCE
2541 int64_t parse_date(const char *datestr, int duration)
2547 static const char *date_fmt[] = {
2551 static const char *time_fmt[] = {
2561 time_t now = time(0);
2563 len = strlen(datestr);
2565 lastch = datestr[len - 1];
2568 is_utc = (lastch == 'z' || lastch == 'Z');
2570 memset(&dt, 0, sizeof(dt));
2575 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2576 q = small_strptime(p, date_fmt[i], &dt);
2586 dt = *localtime(&now);
2588 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2593 if (*p == 'T' || *p == 't' || *p == ' ')
2596 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2597 q = small_strptime(p, time_fmt[i], &dt);
2607 q = small_strptime(p, time_fmt[0], &dt);
2609 dt.tm_sec = strtol(p, (char **)&q, 10);
2615 /* Now we have all the fields that we can get */
2620 return now * INT64_C(1000000);
2624 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2626 dt.tm_isdst = -1; /* unknown */
2639 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2642 val += n * (*q - '0');
2646 return negative ? -t : t;
2648 #endif /* CONFIG_WINCE */
2650 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2660 while (*p != '\0' && *p != '=' && *p != '&') {
2661 if ((q - tag) < sizeof(tag) - 1)
2669 while (*p != '&' && *p != '\0') {
2670 if ((q - arg) < arg_size - 1) {
2680 if (!strcmp(tag, tag1))
2689 int av_get_frame_filename(char *buf, int buf_size,
2690 const char *path, int number)
2693 char *q, buf1[20], c;
2694 int nd, len, percentd_found;
2706 while (isdigit(*p)) {
2707 nd = nd * 10 + *p++ - '0';
2710 } while (isdigit(c));
2719 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2721 if ((q - buf + len) > buf_size - 1)
2723 memcpy(q, buf1, len);
2731 if ((q - buf) < buf_size - 1)
2735 if (!percentd_found)
2744 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
2747 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2749 for(i=0;i<size;i+=16) {
2756 PRINT(" %02x", buf[i+j]);
2761 for(j=0;j<len;j++) {
2763 if (c < ' ' || c > '~')
2772 void av_hex_dump(FILE *f, uint8_t *buf, int size)
2774 hex_dump_internal(NULL, f, 0, buf, size);
2777 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
2779 hex_dump_internal(avcl, NULL, level, buf, size);
2782 //FIXME needs to know the time_base
2783 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
2785 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2786 PRINT("stream #%d:\n", pkt->stream_index);
2787 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
2788 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
2789 /* DTS is _always_ valid after av_read_frame() */
2791 if (pkt->dts == AV_NOPTS_VALUE)
2794 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
2795 /* PTS may be not known if B frames are present */
2797 if (pkt->pts == AV_NOPTS_VALUE)
2800 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
2802 PRINT(" size=%d\n", pkt->size);
2805 av_hex_dump(f, pkt->data, pkt->size);
2808 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
2810 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
2813 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
2815 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
2818 void url_split(char *proto, int proto_size,
2819 char *authorization, int authorization_size,
2820 char *hostname, int hostname_size,
2822 char *path, int path_size,
2833 while (*p != ':' && *p != '\0') {
2834 if ((q - proto) < proto_size - 1)
2840 if (authorization_size > 0)
2841 authorization[0] = '\0';
2845 if (hostname_size > 0)
2849 char *at,*slash; // PETR: position of '@' character and '/' character
2856 at = strchr(p,'@'); // PETR: get the position of '@'
2857 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname
2858 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/'
2860 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth.
2862 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR:
2863 if (*p == '@') { // PETR: passed '@'
2864 if (authorization_size > 0)
2868 } else if (!at) { // PETR: hostname
2869 if ((q - hostname) < hostname_size - 1)
2872 if ((q - authorization) < authorization_size - 1)
2877 if (hostname_size > 0)
2881 port = strtoul(p, (char **)&p, 10);
2886 pstrcpy(path, path_size, p);
2889 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
2890 int pts_num, int pts_den)
2892 s->pts_wrap_bits = pts_wrap_bits;
2893 s->time_base.num = pts_num;
2894 s->time_base.den = pts_den;
2897 /* fraction handling */
2900 * f = val + (num / den) + 0.5.
2902 * 'num' is normalized so that it is such as 0 <= num < den.
2904 * @param f fractional number
2905 * @param val integer value
2906 * @param num must be >= 0
2907 * @param den must be >= 1
2909 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
2922 * Fractionnal addition to f: f = f + (incr / f->den).
2924 * @param f fractional number
2925 * @param incr increment, can be positive or negative
2927 static void av_frac_add(AVFrac *f, int64_t incr)
2931 num = f->num + incr;
2934 f->val += num / den;
2940 } else if (num >= den) {
2941 f->val += num / den;