Change return type of main function to int to avoid a warning.
[FFMpeg-mirror/ffmpeg-vdpau.git] / libavformat / utils.c
blob44299f9f60a85c6e26b7e40e23e96c3872c46a35
1 /*
2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #include "avformat.h"
22 #include "libavcodec/opt.h"
23 #include "libavutil/avstring.h"
24 #include "riff.h"
25 #include <sys/time.h>
26 #include <time.h>
28 #undef NDEBUG
29 #include <assert.h>
31 /**
32 * @file libavformat/utils.c
33 * various utility functions for use within FFmpeg
36 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den);
37 static void av_frac_add(AVFrac *f, int64_t incr);
39 /** head of registered input format linked list */
40 AVInputFormat *first_iformat = NULL;
41 /** head of registered output format linked list */
42 AVOutputFormat *first_oformat = NULL;
44 AVInputFormat *av_iformat_next(AVInputFormat *f)
46 if(f) return f->next;
47 else return first_iformat;
50 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
52 if(f) return f->next;
53 else return first_oformat;
56 void av_register_input_format(AVInputFormat *format)
58 AVInputFormat **p;
59 p = &first_iformat;
60 while (*p != NULL) p = &(*p)->next;
61 *p = format;
62 format->next = NULL;
65 void av_register_output_format(AVOutputFormat *format)
67 AVOutputFormat **p;
68 p = &first_oformat;
69 while (*p != NULL) p = &(*p)->next;
70 *p = format;
71 format->next = NULL;
74 int match_ext(const char *filename, const char *extensions)
76 const char *ext, *p;
77 char ext1[32], *q;
79 if(!filename)
80 return 0;
82 ext = strrchr(filename, '.');
83 if (ext) {
84 ext++;
85 p = extensions;
86 for(;;) {
87 q = ext1;
88 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
89 *q++ = *p++;
90 *q = '\0';
91 if (!strcasecmp(ext1, ext))
92 return 1;
93 if (*p == '\0')
94 break;
95 p++;
98 return 0;
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);
114 #endif
115 /* Find the proper file type. */
116 fmt_found = NULL;
117 score_max = 0;
118 fmt = first_oformat;
119 while (fmt != NULL) {
120 score = 0;
121 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
122 score += 100;
123 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
124 score += 10;
125 if (filename && fmt->extensions &&
126 match_ext(filename, fmt->extensions)) {
127 score += 5;
129 if (score > score_max) {
130 score_max = score;
131 fmt_found = fmt;
133 fmt = fmt->next;
135 return fmt_found;
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);
143 if (fmt) {
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);
150 if (stream_fmt)
151 fmt = stream_fmt;
154 return fmt;
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);
166 #endif
167 if(codec_id == CODEC_ID_NONE)
168 codec_id= fmt->video_codec;
169 return codec_id;
170 }else if(type == CODEC_TYPE_AUDIO)
171 return fmt->audio_codec;
172 else
173 return CODEC_ID_NONE;
176 AVInputFormat *av_find_input_format(const char *short_name)
178 AVInputFormat *fmt;
179 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
180 if (!strcmp(fmt->name, short_name))
181 return fmt;
183 return NULL;
186 /* memory handling */
188 void av_destruct_packet(AVPacket *pkt)
190 av_free(pkt->data);
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;
198 pkt->pos = -1;
199 pkt->duration = 0;
200 pkt->flags = 0;
201 pkt->stream_index = 0;
202 pkt->destruct= av_destruct_packet_nofree;
205 int av_new_packet(AVPacket *pkt, int size)
207 uint8_t *data;
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);
211 if (!data)
212 return AVERROR(ENOMEM);
213 memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
215 av_init_packet(pkt);
216 pkt->data = data;
217 pkt->size = size;
218 pkt->destruct = av_destruct_packet;
219 return 0;
222 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
224 int ret= av_new_packet(pkt, size);
226 if(ret<0)
227 return ret;
229 pkt->pos= url_ftell(s);
231 ret= get_buffer(s, pkt->data, size);
232 if(ret<=0)
233 av_free_packet(pkt);
234 else
235 pkt->size= ret;
237 return ret;
240 int av_dup_packet(AVPacket *pkt)
242 if (pkt->destruct != av_destruct_packet) {
243 uint8_t *data;
244 /* We duplicate the packet and don't forget to add the padding again. */
245 if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
246 return AVERROR(ENOMEM);
247 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
248 if (!data) {
249 return AVERROR(ENOMEM);
251 memcpy(data, pkt->data, pkt->size);
252 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
253 pkt->data = data;
254 pkt->destruct = av_destruct_packet;
256 return 0;
259 int av_filename_number_test(const char *filename)
261 char buf[1024];
262 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
265 static AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
267 AVInputFormat *fmt1, *fmt;
268 int score;
270 fmt = NULL;
271 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
272 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
273 continue;
274 score = 0;
275 if (fmt1->read_probe) {
276 score = fmt1->read_probe(pd);
277 } else if (fmt1->extensions) {
278 if (match_ext(pd->filename, fmt1->extensions)) {
279 score = 50;
282 if (score > *score_max) {
283 *score_max = score;
284 fmt = fmt1;
285 }else if (score == *score_max)
286 fmt = NULL;
288 return fmt;
291 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
292 int score=0;
293 return av_probe_input_format2(pd, is_opened, &score);
296 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
298 AVInputFormat *fmt;
299 fmt = av_probe_input_format2(pd, 1, &score);
301 if (fmt) {
302 if (!strcmp(fmt->name, "mp3"))
303 st->codec->codec_id = CODEC_ID_MP3;
304 else if (!strcmp(fmt->name, "ac3"))
305 st->codec->codec_id = CODEC_ID_AC3;
306 else if (!strcmp(fmt->name, "mpegvideo"))
307 st->codec->codec_id = CODEC_ID_MPEG2VIDEO;
308 else if (!strcmp(fmt->name, "h264"))
309 st->codec->codec_id = CODEC_ID_H264;
311 return !!fmt;
314 /************************************************************/
315 /* input media file */
318 * Open a media file from an IO stream. 'fmt' must be specified.
320 static const char* format_to_name(void* ptr)
322 AVFormatContext* fc = (AVFormatContext*) ptr;
323 if(fc->iformat) return fc->iformat->name;
324 else if(fc->oformat) return fc->oformat->name;
325 else return "NULL";
328 #define OFFSET(x) offsetof(AVFormatContext,x)
329 #define DEFAULT 0 //should be NAN but it does not work as it is not a constant in glibc as required by ANSI/ISO C
330 //these names are too long to be readable
331 #define E AV_OPT_FLAG_ENCODING_PARAM
332 #define D AV_OPT_FLAG_DECODING_PARAM
334 static const AVOption options[]={
335 {"probesize", NULL, OFFSET(probesize), FF_OPT_TYPE_INT, 32000, 32, INT_MAX, D}, /* 32000 from mpegts.c: 1.0 second at 24Mbit/s */
336 {"muxrate", "set mux rate", OFFSET(mux_rate), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
337 {"packetsize", "set packet size", OFFSET(packet_size), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
338 {"fflags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, D|E, "fflags"},
339 {"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_IGNIDX, INT_MIN, INT_MAX, D, "fflags"},
340 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_GENPTS, INT_MIN, INT_MAX, D, "fflags"},
341 {"track", " set the track number", OFFSET(track), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
342 {"year", "set the year", OFFSET(year), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, E},
343 {"analyzeduration", "how many microseconds are analyzed to estimate duration", OFFSET(max_analyze_duration), FF_OPT_TYPE_INT, 3*AV_TIME_BASE, 0, INT_MAX, D},
344 {"cryptokey", "decryption key", OFFSET(key), FF_OPT_TYPE_BINARY, 0, 0, 0, D},
345 {"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size), FF_OPT_TYPE_INT, 1<<20, 0, INT_MAX, D},
346 {"rtbufsize", "max memory used for buffering real-time frames", OFFSET(max_picture_buffer), FF_OPT_TYPE_INT, 3041280, 0, INT_MAX, D}, /* defaults to 1s of 15fps 352x288 YUYV422 video */
347 {"fdebug", "print specific debug info", OFFSET(debug), FF_OPT_TYPE_FLAGS, DEFAULT, 0, INT_MAX, E|D, "fdebug"},
348 {"ts", NULL, 0, FF_OPT_TYPE_CONST, FF_FDEBUG_TS, INT_MIN, INT_MAX, E|D, "fdebug"},
349 {NULL},
352 #undef E
353 #undef D
354 #undef DEFAULT
356 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name, options };
358 static void avformat_get_context_defaults(AVFormatContext *s)
360 memset(s, 0, sizeof(AVFormatContext));
362 s->av_class = &av_format_context_class;
364 av_opt_set_defaults(s);
367 AVFormatContext *av_alloc_format_context(void)
369 AVFormatContext *ic;
370 ic = av_malloc(sizeof(AVFormatContext));
371 if (!ic) return ic;
372 avformat_get_context_defaults(ic);
373 ic->av_class = &av_format_context_class;
374 return ic;
377 int av_open_input_stream(AVFormatContext **ic_ptr,
378 ByteIOContext *pb, const char *filename,
379 AVInputFormat *fmt, AVFormatParameters *ap)
381 int err;
382 AVFormatContext *ic;
383 AVFormatParameters default_ap;
385 if(!ap){
386 ap=&default_ap;
387 memset(ap, 0, sizeof(default_ap));
390 if(!ap->prealloced_context)
391 ic = av_alloc_format_context();
392 else
393 ic = *ic_ptr;
394 if (!ic) {
395 err = AVERROR(ENOMEM);
396 goto fail;
398 ic->iformat = fmt;
399 ic->pb = pb;
400 ic->duration = AV_NOPTS_VALUE;
401 ic->start_time = AV_NOPTS_VALUE;
402 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
404 /* allocate private data */
405 if (fmt->priv_data_size > 0) {
406 ic->priv_data = av_mallocz(fmt->priv_data_size);
407 if (!ic->priv_data) {
408 err = AVERROR(ENOMEM);
409 goto fail;
411 } else {
412 ic->priv_data = NULL;
415 if (ic->iformat->read_header) {
416 err = ic->iformat->read_header(ic, ap);
417 if (err < 0)
418 goto fail;
421 if (pb && !ic->data_offset)
422 ic->data_offset = url_ftell(ic->pb);
424 *ic_ptr = ic;
425 return 0;
426 fail:
427 if (ic) {
428 int i;
429 av_freep(&ic->priv_data);
430 for(i=0;i<ic->nb_streams;i++) {
431 AVStream *st = ic->streams[i];
432 if (st) {
433 av_free(st->priv_data);
434 av_free(st->codec->extradata);
436 av_free(st);
439 av_free(ic);
440 *ic_ptr = NULL;
441 return err;
444 /** size of probe buffer, for guessing file type from file contents */
445 #define PROBE_BUF_MIN 2048
446 #define PROBE_BUF_MAX (1<<20)
448 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
449 AVInputFormat *fmt,
450 int buf_size,
451 AVFormatParameters *ap)
453 int err, probe_size;
454 AVProbeData probe_data, *pd = &probe_data;
455 ByteIOContext *pb = NULL;
457 pd->filename = "";
458 if (filename)
459 pd->filename = filename;
460 pd->buf = NULL;
461 pd->buf_size = 0;
463 if (!fmt) {
464 /* guess format if no file can be opened */
465 fmt = av_probe_input_format(pd, 0);
468 /* Do not open file if the format does not need it. XXX: specific
469 hack needed to handle RTSP/TCP */
470 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
471 /* if no file needed do not try to open one */
472 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
473 goto fail;
475 if (buf_size > 0) {
476 url_setbufsize(pb, buf_size);
479 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
480 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
481 /* read probe data */
482 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
483 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
484 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
485 if (url_fseek(pb, 0, SEEK_SET) < 0) {
486 url_fclose(pb);
487 if (url_fopen(&pb, filename, URL_RDONLY) < 0) {
488 pb = NULL;
489 err = AVERROR(EIO);
490 goto fail;
493 /* guess file format */
494 fmt = av_probe_input_format2(pd, 1, &score);
496 av_freep(&pd->buf);
499 /* if still no format found, error */
500 if (!fmt) {
501 err = AVERROR_NOFMT;
502 goto fail;
505 /* check filename in case an image number is expected */
506 if (fmt->flags & AVFMT_NEEDNUMBER) {
507 if (!av_filename_number_test(filename)) {
508 err = AVERROR_NUMEXPECTED;
509 goto fail;
512 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
513 if (err)
514 goto fail;
515 return 0;
516 fail:
517 av_freep(&pd->buf);
518 if (pb)
519 url_fclose(pb);
520 *ic_ptr = NULL;
521 return err;
525 /*******************************************************/
527 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt){
528 AVPacketList *pktl;
529 AVPacketList **plast_pktl= packet_buffer;
531 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last?
533 pktl = av_mallocz(sizeof(AVPacketList));
534 if (!pktl)
535 return NULL;
537 /* add the packet in the buffered packet list */
538 *plast_pktl = pktl;
539 pktl->pkt= *pkt;
540 return &pktl->pkt;
543 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
545 int ret;
546 AVStream *st;
548 for(;;){
549 AVPacketList *pktl = s->raw_packet_buffer;
551 if (pktl) {
552 *pkt = pktl->pkt;
553 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE){
554 s->raw_packet_buffer = pktl->next;
555 av_free(pktl);
556 return 0;
560 av_init_packet(pkt);
561 ret= s->iformat->read_packet(s, pkt);
562 if (ret < 0)
563 return ret;
564 st= s->streams[pkt->stream_index];
566 switch(st->codec->codec_type){
567 case CODEC_TYPE_VIDEO:
568 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
569 break;
570 case CODEC_TYPE_AUDIO:
571 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
572 break;
573 case CODEC_TYPE_SUBTITLE:
574 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
575 break;
578 if(!pktl && st->codec->codec_id!=CODEC_ID_PROBE)
579 return ret;
581 add_to_pktbuf(&s->raw_packet_buffer, pkt);
583 if(st->codec->codec_id == CODEC_ID_PROBE){
584 AVProbeData *pd = &st->probe_data;
586 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
587 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
588 pd->buf_size += pkt->size;
589 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
591 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
592 set_codec_from_probe_data(st, pd, 1);
593 if(st->codec->codec_id != CODEC_ID_PROBE){
594 pd->buf_size=0;
595 av_freep(&pd->buf);
602 /**********************************************************/
605 * Get the number of samples of an audio frame. Return -1 on error.
607 static int get_audio_frame_size(AVCodecContext *enc, int size)
609 int frame_size;
611 if(enc->codec_id == CODEC_ID_VORBIS)
612 return -1;
614 if (enc->frame_size <= 1) {
615 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
617 if (bits_per_sample) {
618 if (enc->channels == 0)
619 return -1;
620 frame_size = (size << 3) / (bits_per_sample * enc->channels);
621 } else {
622 /* used for example by ADPCM codecs */
623 if (enc->bit_rate == 0)
624 return -1;
625 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
627 } else {
628 frame_size = enc->frame_size;
630 return frame_size;
635 * Return the frame duration in seconds. Return 0 if not available.
637 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
638 AVCodecParserContext *pc, AVPacket *pkt)
640 int frame_size;
642 *pnum = 0;
643 *pden = 0;
644 switch(st->codec->codec_type) {
645 case CODEC_TYPE_VIDEO:
646 if(st->time_base.num*1000LL > st->time_base.den){
647 *pnum = st->time_base.num;
648 *pden = st->time_base.den;
649 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
650 *pnum = st->codec->time_base.num;
651 *pden = st->codec->time_base.den;
652 if (pc && pc->repeat_pict) {
653 *pden *= 2;
654 *pnum = (*pnum) * (2 + pc->repeat_pict);
657 break;
658 case CODEC_TYPE_AUDIO:
659 frame_size = get_audio_frame_size(st->codec, pkt->size);
660 if (frame_size < 0)
661 break;
662 *pnum = frame_size;
663 *pden = st->codec->sample_rate;
664 break;
665 default:
666 break;
670 static int is_intra_only(AVCodecContext *enc){
671 if(enc->codec_type == CODEC_TYPE_AUDIO){
672 return 1;
673 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
674 switch(enc->codec_id){
675 case CODEC_ID_MJPEG:
676 case CODEC_ID_MJPEGB:
677 case CODEC_ID_LJPEG:
678 case CODEC_ID_RAWVIDEO:
679 case CODEC_ID_DVVIDEO:
680 case CODEC_ID_HUFFYUV:
681 case CODEC_ID_FFVHUFF:
682 case CODEC_ID_ASV1:
683 case CODEC_ID_ASV2:
684 case CODEC_ID_VCR1:
685 return 1;
686 default: break;
689 return 0;
692 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
693 int64_t dts, int64_t pts)
695 AVStream *st= s->streams[stream_index];
696 AVPacketList *pktl= s->packet_buffer;
698 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
699 return;
701 st->first_dts= dts - st->cur_dts;
702 st->cur_dts= dts;
704 for(; pktl; pktl= pktl->next){
705 if(pktl->pkt.stream_index != stream_index)
706 continue;
707 //FIXME think more about this check
708 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
709 pktl->pkt.pts += st->first_dts;
711 if(pktl->pkt.dts != AV_NOPTS_VALUE)
712 pktl->pkt.dts += st->first_dts;
714 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
715 st->start_time= pktl->pkt.pts;
717 if (st->start_time == AV_NOPTS_VALUE)
718 st->start_time = pts;
721 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
723 AVPacketList *pktl= s->packet_buffer;
724 int64_t cur_dts= 0;
726 if(st->first_dts != AV_NOPTS_VALUE){
727 cur_dts= st->first_dts;
728 for(; pktl; pktl= pktl->next){
729 if(pktl->pkt.stream_index == pkt->stream_index){
730 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
731 break;
732 cur_dts -= pkt->duration;
735 pktl= s->packet_buffer;
736 st->first_dts = cur_dts;
737 }else if(st->cur_dts)
738 return;
740 for(; pktl; pktl= pktl->next){
741 if(pktl->pkt.stream_index != pkt->stream_index)
742 continue;
743 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
744 && !pktl->pkt.duration){
745 pktl->pkt.dts= cur_dts;
746 if(!st->codec->has_b_frames)
747 pktl->pkt.pts= cur_dts;
748 cur_dts += pkt->duration;
749 pktl->pkt.duration= pkt->duration;
750 }else
751 break;
753 if(st->first_dts == AV_NOPTS_VALUE)
754 st->cur_dts= cur_dts;
757 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
758 AVCodecParserContext *pc, AVPacket *pkt)
760 int num, den, presentation_delayed, delay, i;
761 int64_t offset;
763 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
764 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
765 pkt->dts -= 1LL<<st->pts_wrap_bits;
768 if (pkt->duration == 0) {
769 compute_frame_duration(&num, &den, st, pc, pkt);
770 if (den && num) {
771 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
773 if(pkt->duration != 0 && s->packet_buffer)
774 update_initial_durations(s, st, pkt);
778 /* correct timestamps with byte offset if demuxers only have timestamps
779 on packet boundaries */
780 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
781 /* this will estimate bitrate based on this frame's duration and size */
782 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
783 if(pkt->pts != AV_NOPTS_VALUE)
784 pkt->pts += offset;
785 if(pkt->dts != AV_NOPTS_VALUE)
786 pkt->dts += offset;
789 /* do we have a video B-frame ? */
790 delay= st->codec->has_b_frames;
791 presentation_delayed = 0;
792 /* XXX: need has_b_frame, but cannot get it if the codec is
793 not initialized */
794 if (delay &&
795 pc && pc->pict_type != FF_B_TYPE)
796 presentation_delayed = 1;
797 /* This may be redundant, but it should not hurt. */
798 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
799 presentation_delayed = 1;
801 // 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);
802 /* interpolate PTS and DTS if they are not present */
803 if(delay==0 || (delay==1 && pc)){
804 if (presentation_delayed) {
805 /* DTS = decompression timestamp */
806 /* PTS = presentation timestamp */
807 if (pkt->dts == AV_NOPTS_VALUE)
808 pkt->dts = st->last_IP_pts;
809 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
810 if (pkt->dts == AV_NOPTS_VALUE)
811 pkt->dts = st->cur_dts;
813 /* this is tricky: the dts must be incremented by the duration
814 of the frame we are displaying, i.e. the last I- or P-frame */
815 if (st->last_IP_duration == 0)
816 st->last_IP_duration = pkt->duration;
817 if(pkt->dts != AV_NOPTS_VALUE)
818 st->cur_dts = pkt->dts + st->last_IP_duration;
819 st->last_IP_duration = pkt->duration;
820 st->last_IP_pts= pkt->pts;
821 /* cannot compute PTS if not present (we can compute it only
822 by knowing the future */
823 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
824 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
825 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
826 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
827 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
828 pkt->pts += pkt->duration;
829 // 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);
833 /* presentation is not delayed : PTS and DTS are the same */
834 if(pkt->pts == AV_NOPTS_VALUE)
835 pkt->pts = pkt->dts;
836 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
837 if(pkt->pts == AV_NOPTS_VALUE)
838 pkt->pts = st->cur_dts;
839 pkt->dts = pkt->pts;
840 if(pkt->pts != AV_NOPTS_VALUE)
841 st->cur_dts = pkt->pts + pkt->duration;
845 if(pkt->pts != AV_NOPTS_VALUE){
846 st->pts_buffer[0]= pkt->pts;
847 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
848 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
849 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
850 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
851 if(pkt->dts == AV_NOPTS_VALUE)
852 pkt->dts= st->pts_buffer[0];
853 if(delay>1){
854 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
856 if(pkt->dts > st->cur_dts)
857 st->cur_dts = pkt->dts;
860 // 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);
862 /* update flags */
863 if(is_intra_only(st->codec))
864 pkt->flags |= PKT_FLAG_KEY;
865 else if (pc) {
866 pkt->flags = 0;
867 /* keyframe computation */
868 if (pc->pict_type == FF_I_TYPE)
869 pkt->flags |= PKT_FLAG_KEY;
873 void av_destruct_packet_nofree(AVPacket *pkt)
875 pkt->data = NULL; pkt->size = 0;
878 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
880 AVStream *st;
881 int len, ret, i;
883 av_init_packet(pkt);
885 for(;;) {
886 /* select current input stream component */
887 st = s->cur_st;
888 if (st) {
889 if (!st->need_parsing || !st->parser) {
890 /* no parsing needed: we just output the packet as is */
891 /* raw data support */
892 *pkt = s->cur_pkt;
893 compute_pkt_fields(s, st, NULL, pkt);
894 s->cur_st = NULL;
895 break;
896 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
897 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
898 s->cur_ptr, s->cur_len,
899 s->cur_pkt.pts, s->cur_pkt.dts);
900 s->cur_pkt.pts = AV_NOPTS_VALUE;
901 s->cur_pkt.dts = AV_NOPTS_VALUE;
902 /* increment read pointer */
903 s->cur_ptr += len;
904 s->cur_len -= len;
906 /* return packet if any */
907 if (pkt->size) {
908 got_packet:
909 pkt->pos = s->cur_pkt.pos; // Isn't quite accurate but close.
910 pkt->duration = 0;
911 pkt->stream_index = st->index;
912 pkt->pts = st->parser->pts;
913 pkt->dts = st->parser->dts;
914 pkt->destruct = av_destruct_packet_nofree;
915 compute_pkt_fields(s, st, st->parser, pkt);
917 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
918 ff_reduce_index(s, st->index);
919 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
920 0, 0, AVINDEX_KEYFRAME);
923 break;
925 } else {
926 /* free packet */
927 av_free_packet(&s->cur_pkt);
928 s->cur_st = NULL;
930 } else {
931 /* read next packet */
932 ret = av_read_packet(s, &s->cur_pkt);
933 if (ret < 0) {
934 if (ret == AVERROR(EAGAIN))
935 return ret;
936 /* return the last frames, if any */
937 for(i = 0; i < s->nb_streams; i++) {
938 st = s->streams[i];
939 if (st->parser && st->need_parsing) {
940 av_parser_parse(st->parser, st->codec,
941 &pkt->data, &pkt->size,
942 NULL, 0,
943 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
944 if (pkt->size)
945 goto got_packet;
948 /* no more packets: really terminate parsing */
949 return ret;
952 if(s->cur_pkt.pts != AV_NOPTS_VALUE &&
953 s->cur_pkt.dts != AV_NOPTS_VALUE &&
954 s->cur_pkt.pts < s->cur_pkt.dts){
955 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
956 s->cur_pkt.stream_index,
957 s->cur_pkt.pts,
958 s->cur_pkt.dts,
959 s->cur_pkt.size);
960 // av_free_packet(&s->cur_pkt);
961 // return -1;
964 st = s->streams[s->cur_pkt.stream_index];
965 if(s->debug & FF_FDEBUG_TS)
966 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, flags=%d\n",
967 s->cur_pkt.stream_index,
968 s->cur_pkt.pts,
969 s->cur_pkt.dts,
970 s->cur_pkt.size,
971 s->cur_pkt.flags);
973 s->cur_st = st;
974 s->cur_ptr = s->cur_pkt.data;
975 s->cur_len = s->cur_pkt.size;
976 if (st->need_parsing && !st->parser) {
977 st->parser = av_parser_init(st->codec->codec_id);
978 if (!st->parser) {
979 /* no parser available: just output the raw packets */
980 st->need_parsing = AVSTREAM_PARSE_NONE;
981 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
982 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
984 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
985 st->parser->next_frame_offset=
986 st->parser->cur_offset= s->cur_pkt.pos;
991 if(s->debug & FF_FDEBUG_TS)
992 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, flags=%d\n",
993 pkt->stream_index,
994 pkt->pts,
995 pkt->dts,
996 pkt->size,
997 pkt->flags);
999 return 0;
1002 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1004 AVPacketList *pktl;
1005 int eof=0;
1006 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1008 for(;;){
1009 pktl = s->packet_buffer;
1010 if (pktl) {
1011 AVPacket *next_pkt= &pktl->pkt;
1013 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1014 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1015 if( pktl->pkt.stream_index == next_pkt->stream_index
1016 && next_pkt->dts < pktl->pkt.dts
1017 && pktl->pkt.pts != pktl->pkt.dts //not b frame
1018 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1019 next_pkt->pts= pktl->pkt.dts;
1021 pktl= pktl->next;
1023 pktl = s->packet_buffer;
1026 if( next_pkt->pts != AV_NOPTS_VALUE
1027 || next_pkt->dts == AV_NOPTS_VALUE
1028 || !genpts || eof){
1029 /* read packet from packet buffer, if there is data */
1030 *pkt = *next_pkt;
1031 s->packet_buffer = pktl->next;
1032 av_free(pktl);
1033 return 0;
1036 if(genpts){
1037 int ret= av_read_frame_internal(s, pkt);
1038 if(ret<0){
1039 if(pktl && ret != AVERROR(EAGAIN)){
1040 eof=1;
1041 continue;
1042 }else
1043 return ret;
1046 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt)) < 0)
1047 return AVERROR(ENOMEM);
1048 }else{
1049 assert(!s->packet_buffer);
1050 return av_read_frame_internal(s, pkt);
1055 /* XXX: suppress the packet queue */
1056 static void flush_packet_queue(AVFormatContext *s)
1058 AVPacketList *pktl;
1060 for(;;) {
1061 pktl = s->packet_buffer;
1062 if (!pktl)
1063 break;
1064 s->packet_buffer = pktl->next;
1065 av_free_packet(&pktl->pkt);
1066 av_free(pktl);
1070 /*******************************************************/
1071 /* seek support */
1073 int av_find_default_stream_index(AVFormatContext *s)
1075 int first_audio_index = -1;
1076 int i;
1077 AVStream *st;
1079 if (s->nb_streams <= 0)
1080 return -1;
1081 for(i = 0; i < s->nb_streams; i++) {
1082 st = s->streams[i];
1083 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1084 return i;
1086 if (first_audio_index < 0 && st->codec->codec_type == CODEC_TYPE_AUDIO)
1087 first_audio_index = i;
1089 return first_audio_index >= 0 ? first_audio_index : 0;
1093 * Flush the frame reader.
1095 static void av_read_frame_flush(AVFormatContext *s)
1097 AVStream *st;
1098 int i;
1100 flush_packet_queue(s);
1102 /* free previous packet */
1103 if (s->cur_st) {
1104 if (s->cur_st->parser)
1105 av_free_packet(&s->cur_pkt);
1106 s->cur_st = NULL;
1108 /* fail safe */
1109 s->cur_ptr = NULL;
1110 s->cur_len = 0;
1112 /* for each stream, reset read state */
1113 for(i = 0; i < s->nb_streams; i++) {
1114 st = s->streams[i];
1116 if (st->parser) {
1117 av_parser_close(st->parser);
1118 st->parser = NULL;
1120 st->last_IP_pts = AV_NOPTS_VALUE;
1121 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1125 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1126 int i;
1128 for(i = 0; i < s->nb_streams; i++) {
1129 AVStream *st = s->streams[i];
1131 st->cur_dts = av_rescale(timestamp,
1132 st->time_base.den * (int64_t)ref_st->time_base.num,
1133 st->time_base.num * (int64_t)ref_st->time_base.den);
1137 void ff_reduce_index(AVFormatContext *s, int stream_index)
1139 AVStream *st= s->streams[stream_index];
1140 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1142 if((unsigned)st->nb_index_entries >= max_entries){
1143 int i;
1144 for(i=0; 2*i<st->nb_index_entries; i++)
1145 st->index_entries[i]= st->index_entries[2*i];
1146 st->nb_index_entries= i;
1150 int av_add_index_entry(AVStream *st,
1151 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1153 AVIndexEntry *entries, *ie;
1154 int index;
1156 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1157 return -1;
1159 entries = av_fast_realloc(st->index_entries,
1160 &st->index_entries_allocated_size,
1161 (st->nb_index_entries + 1) *
1162 sizeof(AVIndexEntry));
1163 if(!entries)
1164 return -1;
1166 st->index_entries= entries;
1168 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1170 if(index<0){
1171 index= st->nb_index_entries++;
1172 ie= &entries[index];
1173 assert(index==0 || ie[-1].timestamp < timestamp);
1174 }else{
1175 ie= &entries[index];
1176 if(ie->timestamp != timestamp){
1177 if(ie->timestamp <= timestamp)
1178 return -1;
1179 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1180 st->nb_index_entries++;
1181 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1182 distance= ie->min_distance;
1185 ie->pos = pos;
1186 ie->timestamp = timestamp;
1187 ie->min_distance= distance;
1188 ie->size= size;
1189 ie->flags = flags;
1191 return index;
1194 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1195 int flags)
1197 AVIndexEntry *entries= st->index_entries;
1198 int nb_entries= st->nb_index_entries;
1199 int a, b, m;
1200 int64_t timestamp;
1202 a = - 1;
1203 b = nb_entries;
1205 while (b - a > 1) {
1206 m = (a + b) >> 1;
1207 timestamp = entries[m].timestamp;
1208 if(timestamp >= wanted_timestamp)
1209 b = m;
1210 if(timestamp <= wanted_timestamp)
1211 a = m;
1213 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1215 if(!(flags & AVSEEK_FLAG_ANY)){
1216 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1217 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1221 if(m == nb_entries)
1222 return -1;
1223 return m;
1226 #define DEBUG_SEEK
1228 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1229 AVInputFormat *avif= s->iformat;
1230 int64_t pos_min, pos_max, pos, pos_limit;
1231 int64_t ts_min, ts_max, ts;
1232 int index;
1233 AVStream *st;
1235 if (stream_index < 0)
1236 return -1;
1238 #ifdef DEBUG_SEEK
1239 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1240 #endif
1242 ts_max=
1243 ts_min= AV_NOPTS_VALUE;
1244 pos_limit= -1; //gcc falsely says it may be uninitialized
1246 st= s->streams[stream_index];
1247 if(st->index_entries){
1248 AVIndexEntry *e;
1250 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()
1251 index= FFMAX(index, 0);
1252 e= &st->index_entries[index];
1254 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1255 pos_min= e->pos;
1256 ts_min= e->timestamp;
1257 #ifdef DEBUG_SEEK
1258 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1259 pos_min,ts_min);
1260 #endif
1261 }else{
1262 assert(index==0);
1265 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1266 assert(index < st->nb_index_entries);
1267 if(index >= 0){
1268 e= &st->index_entries[index];
1269 assert(e->timestamp >= target_ts);
1270 pos_max= e->pos;
1271 ts_max= e->timestamp;
1272 pos_limit= pos_max - e->min_distance;
1273 #ifdef DEBUG_SEEK
1274 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1275 pos_max,pos_limit, ts_max);
1276 #endif
1280 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1281 if(pos<0)
1282 return -1;
1284 /* do the seek */
1285 url_fseek(s->pb, pos, SEEK_SET);
1287 av_update_cur_dts(s, st, ts);
1289 return 0;
1292 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 )){
1293 int64_t pos, ts;
1294 int64_t start_pos, filesize;
1295 int no_change;
1297 #ifdef DEBUG_SEEK
1298 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1299 #endif
1301 if(ts_min == AV_NOPTS_VALUE){
1302 pos_min = s->data_offset;
1303 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1304 if (ts_min == AV_NOPTS_VALUE)
1305 return -1;
1308 if(ts_max == AV_NOPTS_VALUE){
1309 int step= 1024;
1310 filesize = url_fsize(s->pb);
1311 pos_max = filesize - 1;
1313 pos_max -= step;
1314 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1315 step += step;
1316 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1317 if (ts_max == AV_NOPTS_VALUE)
1318 return -1;
1320 for(;;){
1321 int64_t tmp_pos= pos_max + 1;
1322 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1323 if(tmp_ts == AV_NOPTS_VALUE)
1324 break;
1325 ts_max= tmp_ts;
1326 pos_max= tmp_pos;
1327 if(tmp_pos >= filesize)
1328 break;
1330 pos_limit= pos_max;
1333 if(ts_min > ts_max){
1334 return -1;
1335 }else if(ts_min == ts_max){
1336 pos_limit= pos_min;
1339 no_change=0;
1340 while (pos_min < pos_limit) {
1341 #ifdef DEBUG_SEEK
1342 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1343 pos_min, pos_max,
1344 ts_min, ts_max);
1345 #endif
1346 assert(pos_limit <= pos_max);
1348 if(no_change==0){
1349 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1350 // interpolate position (better than dichotomy)
1351 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1352 + pos_min - approximate_keyframe_distance;
1353 }else if(no_change==1){
1354 // bisection, if interpolation failed to change min or max pos last time
1355 pos = (pos_min + pos_limit)>>1;
1356 }else{
1357 /* linear search if bisection failed, can only happen if there
1358 are very few or no keyframes between min/max */
1359 pos=pos_min;
1361 if(pos <= pos_min)
1362 pos= pos_min + 1;
1363 else if(pos > pos_limit)
1364 pos= pos_limit;
1365 start_pos= pos;
1367 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1368 if(pos == pos_max)
1369 no_change++;
1370 else
1371 no_change=0;
1372 #ifdef DEBUG_SEEK
1373 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);
1374 #endif
1375 if(ts == AV_NOPTS_VALUE){
1376 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1377 return -1;
1379 assert(ts != AV_NOPTS_VALUE);
1380 if (target_ts <= ts) {
1381 pos_limit = start_pos - 1;
1382 pos_max = pos;
1383 ts_max = ts;
1385 if (target_ts >= ts) {
1386 pos_min = pos;
1387 ts_min = ts;
1391 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1392 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1393 #ifdef DEBUG_SEEK
1394 pos_min = pos;
1395 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1396 pos_min++;
1397 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1398 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1399 pos, ts_min, target_ts, ts_max);
1400 #endif
1401 *ts_ret= ts;
1402 return pos;
1405 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1406 int64_t pos_min, pos_max;
1407 #if 0
1408 AVStream *st;
1410 if (stream_index < 0)
1411 return -1;
1413 st= s->streams[stream_index];
1414 #endif
1416 pos_min = s->data_offset;
1417 pos_max = url_fsize(s->pb) - 1;
1419 if (pos < pos_min) pos= pos_min;
1420 else if(pos > pos_max) pos= pos_max;
1422 url_fseek(s->pb, pos, SEEK_SET);
1424 #if 0
1425 av_update_cur_dts(s, st, ts);
1426 #endif
1427 return 0;
1430 static int av_seek_frame_generic(AVFormatContext *s,
1431 int stream_index, int64_t timestamp, int flags)
1433 int index;
1434 AVStream *st;
1435 AVIndexEntry *ie;
1437 st = s->streams[stream_index];
1439 index = av_index_search_timestamp(st, timestamp, flags);
1441 if(index < 0 || index==st->nb_index_entries-1){
1442 int i;
1443 AVPacket pkt;
1445 if(st->nb_index_entries){
1446 assert(st->index_entries);
1447 ie= &st->index_entries[st->nb_index_entries-1];
1448 url_fseek(s->pb, ie->pos, SEEK_SET);
1449 av_update_cur_dts(s, st, ie->timestamp);
1450 }else
1451 url_fseek(s->pb, 0, SEEK_SET);
1453 for(i=0;; i++) {
1454 int ret = av_read_frame(s, &pkt);
1455 if(ret<0)
1456 break;
1457 av_free_packet(&pkt);
1458 if(stream_index == pkt.stream_index){
1459 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1460 break;
1463 index = av_index_search_timestamp(st, timestamp, flags);
1465 if (index < 0)
1466 return -1;
1468 av_read_frame_flush(s);
1469 if (s->iformat->read_seek){
1470 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1471 return 0;
1473 ie = &st->index_entries[index];
1474 url_fseek(s->pb, ie->pos, SEEK_SET);
1476 av_update_cur_dts(s, st, ie->timestamp);
1478 return 0;
1481 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1483 int ret;
1484 AVStream *st;
1486 av_read_frame_flush(s);
1488 if(flags & AVSEEK_FLAG_BYTE)
1489 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1491 if(stream_index < 0){
1492 stream_index= av_find_default_stream_index(s);
1493 if(stream_index < 0)
1494 return -1;
1496 st= s->streams[stream_index];
1497 /* timestamp for default must be expressed in AV_TIME_BASE units */
1498 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1500 st= s->streams[stream_index];
1502 /* first, we try the format specific seek */
1503 if (s->iformat->read_seek)
1504 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1505 else
1506 ret = -1;
1507 if (ret >= 0) {
1508 return 0;
1511 if(s->iformat->read_timestamp)
1512 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1513 else
1514 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1517 /*******************************************************/
1520 * Returns TRUE if the stream has accurate duration in any stream.
1522 * @return TRUE if the stream has accurate duration for at least one component.
1524 static int av_has_duration(AVFormatContext *ic)
1526 int i;
1527 AVStream *st;
1529 for(i = 0;i < ic->nb_streams; i++) {
1530 st = ic->streams[i];
1531 if (st->duration != AV_NOPTS_VALUE)
1532 return 1;
1534 return 0;
1538 * Estimate the stream timings from the one of each components.
1540 * Also computes the global bitrate if possible.
1542 static void av_update_stream_timings(AVFormatContext *ic)
1544 int64_t start_time, start_time1, end_time, end_time1;
1545 int64_t duration, duration1;
1546 int i;
1547 AVStream *st;
1549 start_time = INT64_MAX;
1550 end_time = INT64_MIN;
1551 duration = INT64_MIN;
1552 for(i = 0;i < ic->nb_streams; i++) {
1553 st = ic->streams[i];
1554 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1555 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1556 if (start_time1 < start_time)
1557 start_time = start_time1;
1558 if (st->duration != AV_NOPTS_VALUE) {
1559 end_time1 = start_time1
1560 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1561 if (end_time1 > end_time)
1562 end_time = end_time1;
1565 if (st->duration != AV_NOPTS_VALUE) {
1566 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1567 if (duration1 > duration)
1568 duration = duration1;
1571 if (start_time != INT64_MAX) {
1572 ic->start_time = start_time;
1573 if (end_time != INT64_MIN) {
1574 if (end_time - start_time > duration)
1575 duration = end_time - start_time;
1578 if (duration != INT64_MIN) {
1579 ic->duration = duration;
1580 if (ic->file_size > 0) {
1581 /* compute the bitrate */
1582 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1583 (double)ic->duration;
1588 static void fill_all_stream_timings(AVFormatContext *ic)
1590 int i;
1591 AVStream *st;
1593 av_update_stream_timings(ic);
1594 for(i = 0;i < ic->nb_streams; i++) {
1595 st = ic->streams[i];
1596 if (st->start_time == AV_NOPTS_VALUE) {
1597 if(ic->start_time != AV_NOPTS_VALUE)
1598 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1599 if(ic->duration != AV_NOPTS_VALUE)
1600 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1605 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1607 int64_t filesize, duration;
1608 int bit_rate, i;
1609 AVStream *st;
1611 /* if bit_rate is already set, we believe it */
1612 if (ic->bit_rate == 0) {
1613 bit_rate = 0;
1614 for(i=0;i<ic->nb_streams;i++) {
1615 st = ic->streams[i];
1616 bit_rate += st->codec->bit_rate;
1618 ic->bit_rate = bit_rate;
1621 /* if duration is already set, we believe it */
1622 if (ic->duration == AV_NOPTS_VALUE &&
1623 ic->bit_rate != 0 &&
1624 ic->file_size != 0) {
1625 filesize = ic->file_size;
1626 if (filesize > 0) {
1627 for(i = 0; i < ic->nb_streams; i++) {
1628 st = ic->streams[i];
1629 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1630 if (st->duration == AV_NOPTS_VALUE)
1631 st->duration = duration;
1637 #define DURATION_MAX_READ_SIZE 250000
1639 /* only usable for MPEG-PS streams */
1640 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
1642 AVPacket pkt1, *pkt = &pkt1;
1643 AVStream *st;
1644 int read_size, i, ret;
1645 int64_t end_time;
1646 int64_t filesize, offset, duration;
1648 /* free previous packet */
1649 if (ic->cur_st && ic->cur_st->parser)
1650 av_free_packet(&ic->cur_pkt);
1651 ic->cur_st = NULL;
1653 /* flush packet queue */
1654 flush_packet_queue(ic);
1656 for(i=0;i<ic->nb_streams;i++) {
1657 st = ic->streams[i];
1658 if (st->parser) {
1659 av_parser_close(st->parser);
1660 st->parser= NULL;
1664 /* we read the first packets to get the first PTS (not fully
1665 accurate, but it is enough now) */
1666 url_fseek(ic->pb, 0, SEEK_SET);
1667 read_size = 0;
1668 for(;;) {
1669 if (read_size >= DURATION_MAX_READ_SIZE)
1670 break;
1671 /* if all info is available, we can stop */
1672 for(i = 0;i < ic->nb_streams; i++) {
1673 st = ic->streams[i];
1674 if (st->start_time == AV_NOPTS_VALUE)
1675 break;
1677 if (i == ic->nb_streams)
1678 break;
1680 ret = av_read_packet(ic, pkt);
1681 if (ret != 0)
1682 break;
1683 read_size += pkt->size;
1684 st = ic->streams[pkt->stream_index];
1685 if (pkt->pts != AV_NOPTS_VALUE) {
1686 if (st->start_time == AV_NOPTS_VALUE)
1687 st->start_time = pkt->pts;
1689 av_free_packet(pkt);
1692 /* estimate the end time (duration) */
1693 /* XXX: may need to support wrapping */
1694 filesize = ic->file_size;
1695 offset = filesize - DURATION_MAX_READ_SIZE;
1696 if (offset < 0)
1697 offset = 0;
1699 url_fseek(ic->pb, offset, SEEK_SET);
1700 read_size = 0;
1701 for(;;) {
1702 if (read_size >= DURATION_MAX_READ_SIZE)
1703 break;
1705 ret = av_read_packet(ic, pkt);
1706 if (ret != 0)
1707 break;
1708 read_size += pkt->size;
1709 st = ic->streams[pkt->stream_index];
1710 if (pkt->pts != AV_NOPTS_VALUE &&
1711 st->start_time != AV_NOPTS_VALUE) {
1712 end_time = pkt->pts;
1713 duration = end_time - st->start_time;
1714 if (duration > 0) {
1715 if (st->duration == AV_NOPTS_VALUE ||
1716 st->duration < duration)
1717 st->duration = duration;
1720 av_free_packet(pkt);
1723 fill_all_stream_timings(ic);
1725 url_fseek(ic->pb, old_offset, SEEK_SET);
1726 for(i=0; i<ic->nb_streams; i++){
1727 st= ic->streams[i];
1728 st->cur_dts= st->first_dts;
1729 st->last_IP_pts = AV_NOPTS_VALUE;
1733 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
1735 int64_t file_size;
1737 /* get the file size, if possible */
1738 if (ic->iformat->flags & AVFMT_NOFILE) {
1739 file_size = 0;
1740 } else {
1741 file_size = url_fsize(ic->pb);
1742 if (file_size < 0)
1743 file_size = 0;
1745 ic->file_size = file_size;
1747 if ((!strcmp(ic->iformat->name, "mpeg") ||
1748 !strcmp(ic->iformat->name, "mpegts")) &&
1749 file_size && !url_is_streamed(ic->pb)) {
1750 /* get accurate estimate from the PTSes */
1751 av_estimate_timings_from_pts(ic, old_offset);
1752 } else if (av_has_duration(ic)) {
1753 /* at least one component has timings - we use them for all
1754 the components */
1755 fill_all_stream_timings(ic);
1756 } else {
1757 /* less precise: use bitrate info */
1758 av_estimate_timings_from_bit_rate(ic);
1760 av_update_stream_timings(ic);
1762 #if 0
1764 int i;
1765 AVStream *st;
1766 for(i = 0;i < ic->nb_streams; i++) {
1767 st = ic->streams[i];
1768 printf("%d: start_time: %0.3f duration: %0.3f\n",
1769 i, (double)st->start_time / AV_TIME_BASE,
1770 (double)st->duration / AV_TIME_BASE);
1772 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1773 (double)ic->start_time / AV_TIME_BASE,
1774 (double)ic->duration / AV_TIME_BASE,
1775 ic->bit_rate / 1000);
1777 #endif
1780 static int has_codec_parameters(AVCodecContext *enc)
1782 int val;
1783 switch(enc->codec_type) {
1784 case CODEC_TYPE_AUDIO:
1785 val = enc->sample_rate && enc->channels;
1786 if(!enc->frame_size &&
1787 (enc->codec_id == CODEC_ID_VORBIS ||
1788 enc->codec_id == CODEC_ID_AAC))
1789 return 0;
1790 break;
1791 case CODEC_TYPE_VIDEO:
1792 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1793 break;
1794 default:
1795 val = 1;
1796 break;
1798 return enc->codec_id != CODEC_ID_NONE && val != 0;
1801 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1803 int16_t *samples;
1804 AVCodec *codec;
1805 int got_picture, data_size, ret=0;
1806 AVFrame picture;
1808 if(!st->codec->codec){
1809 codec = avcodec_find_decoder(st->codec->codec_id);
1810 if (!codec)
1811 return -1;
1812 ret = avcodec_open(st->codec, codec);
1813 if (ret < 0)
1814 return ret;
1817 if(!has_codec_parameters(st->codec)){
1818 switch(st->codec->codec_type) {
1819 case CODEC_TYPE_VIDEO:
1820 ret = avcodec_decode_video(st->codec, &picture,
1821 &got_picture, data, size);
1822 break;
1823 case CODEC_TYPE_AUDIO:
1824 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1825 samples = av_malloc(data_size);
1826 if (!samples)
1827 goto fail;
1828 ret = avcodec_decode_audio2(st->codec, samples,
1829 &data_size, data, size);
1830 av_free(samples);
1831 break;
1832 default:
1833 break;
1836 fail:
1837 return ret;
1840 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1842 while (tags->id != CODEC_ID_NONE) {
1843 if (tags->id == id)
1844 return tags->tag;
1845 tags++;
1847 return 0;
1850 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1852 int i;
1853 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1854 if(tag == tags[i].tag)
1855 return tags[i].id;
1857 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1858 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1859 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1860 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1861 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1862 return tags[i].id;
1864 return CODEC_ID_NONE;
1867 unsigned int av_codec_get_tag(const AVCodecTag *tags[4], enum CodecID id)
1869 int i;
1870 for(i=0; tags && tags[i]; i++){
1871 int tag= codec_get_tag(tags[i], id);
1872 if(tag) return tag;
1874 return 0;
1877 enum CodecID av_codec_get_id(const AVCodecTag *tags[4], unsigned int tag)
1879 int i;
1880 for(i=0; tags && tags[i]; i++){
1881 enum CodecID id= codec_get_id(tags[i], tag);
1882 if(id!=CODEC_ID_NONE) return id;
1884 return CODEC_ID_NONE;
1887 static void compute_chapters_end(AVFormatContext *s)
1889 unsigned int i;
1891 for (i=0; i+1<s->nb_chapters; i++)
1892 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
1893 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
1894 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
1895 s->chapters[i]->end = s->chapters[i+1]->start;
1898 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
1899 assert(s->start_time != AV_NOPTS_VALUE);
1900 assert(s->duration > 0);
1901 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
1902 AV_TIME_BASE_Q,
1903 s->chapters[i]->time_base);
1907 /* absolute maximum size we read until we abort */
1908 #define MAX_READ_SIZE 5000000
1910 #define MAX_STD_TIMEBASES (60*12+5)
1911 static int get_std_framerate(int i){
1912 if(i<60*12) return i*1001;
1913 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12;
1917 * Is the time base unreliable.
1918 * This is a heuristic to balance between quick acceptance of the values in
1919 * the headers vs. some extra checks.
1920 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
1921 * MPEG-2 commonly misuses field repeat flags to store different framerates.
1922 * And there are "variable" fps files this needs to detect as well.
1924 static int tb_unreliable(AVCodecContext *c){
1925 if( c->time_base.den >= 101L*c->time_base.num
1926 || c->time_base.den < 5L*c->time_base.num
1927 /* || c->codec_tag == ff_get_fourcc("DIVX")
1928 || c->codec_tag == ff_get_fourcc("XVID")*/
1929 || c->codec_id == CODEC_ID_MPEG2VIDEO)
1930 return 1;
1931 return 0;
1934 int av_find_stream_info(AVFormatContext *ic)
1936 int i, count, ret, read_size, j;
1937 AVStream *st;
1938 AVPacket pkt1, *pkt;
1939 int64_t last_dts[MAX_STREAMS];
1940 int duration_count[MAX_STREAMS]={0};
1941 double (*duration_error)[MAX_STD_TIMEBASES];
1942 offset_t old_offset = url_ftell(ic->pb);
1943 int64_t codec_info_duration[MAX_STREAMS]={0};
1944 int codec_info_nb_frames[MAX_STREAMS]={0};
1946 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1947 if (!duration_error) return AVERROR(ENOMEM);
1949 for(i=0;i<ic->nb_streams;i++) {
1950 st = ic->streams[i];
1951 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1952 /* if(!st->time_base.num)
1953 st->time_base= */
1954 if(!st->codec->time_base.num)
1955 st->codec->time_base= st->time_base;
1957 //only for the split stuff
1958 if (!st->parser) {
1959 st->parser = av_parser_init(st->codec->codec_id);
1960 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1961 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1966 for(i=0;i<MAX_STREAMS;i++){
1967 last_dts[i]= AV_NOPTS_VALUE;
1970 count = 0;
1971 read_size = 0;
1972 for(;;) {
1973 /* check if one codec still needs to be handled */
1974 for(i=0;i<ic->nb_streams;i++) {
1975 st = ic->streams[i];
1976 if (!has_codec_parameters(st->codec))
1977 break;
1978 /* variable fps and no guess at the real fps */
1979 if( tb_unreliable(st->codec)
1980 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
1981 break;
1982 if(st->parser && st->parser->parser->split && !st->codec->extradata)
1983 break;
1984 if(st->first_dts == AV_NOPTS_VALUE)
1985 break;
1987 if (i == ic->nb_streams) {
1988 /* NOTE: if the format has no header, then we need to read
1989 some packets to get most of the streams, so we cannot
1990 stop here */
1991 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
1992 /* if we found the info for all the codecs, we can stop */
1993 ret = count;
1994 break;
1997 /* we did not get all the codec info, but we read too much data */
1998 if (read_size >= MAX_READ_SIZE) {
1999 ret = count;
2000 break;
2003 /* NOTE: a new stream can be added there if no header in file
2004 (AVFMTCTX_NOHEADER) */
2005 ret = av_read_frame_internal(ic, &pkt1);
2006 if (ret < 0) {
2007 /* EOF or error */
2008 ret = -1; /* we could not have all the codec parameters before EOF */
2009 for(i=0;i<ic->nb_streams;i++) {
2010 st = ic->streams[i];
2011 if (!has_codec_parameters(st->codec)){
2012 char buf[256];
2013 avcodec_string(buf, sizeof(buf), st->codec, 0);
2014 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
2015 } else {
2016 ret = 0;
2019 break;
2022 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1);
2023 if(av_dup_packet(pkt) < 0) {
2024 av_free(duration_error);
2025 return AVERROR(ENOMEM);
2028 read_size += pkt->size;
2030 st = ic->streams[pkt->stream_index];
2031 if(codec_info_nb_frames[st->index]>1)
2032 codec_info_duration[st->index] += pkt->duration;
2033 if (pkt->duration != 0)
2034 codec_info_nb_frames[st->index]++;
2037 int index= pkt->stream_index;
2038 int64_t last= last_dts[index];
2039 int64_t duration= pkt->dts - last;
2041 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2042 double dur= duration * av_q2d(st->time_base);
2044 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2045 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2046 if(duration_count[index] < 2)
2047 memset(duration_error[index], 0, sizeof(*duration_error));
2048 for(i=1; i<MAX_STD_TIMEBASES; i++){
2049 int framerate= get_std_framerate(i);
2050 int ticks= lrintf(dur*framerate/(1001*12));
2051 double error= dur - ticks*1001*12/(double)framerate;
2052 duration_error[index][i] += error*error;
2054 duration_count[index]++;
2056 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
2057 last_dts[pkt->stream_index]= pkt->dts;
2059 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2060 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2061 if(i){
2062 st->codec->extradata_size= i;
2063 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2064 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2065 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2069 /* if still no information, we try to open the codec and to
2070 decompress the frame. We try to avoid that in most cases as
2071 it takes longer and uses more memory. For MPEG-4, we need to
2072 decompress for QuickTime. */
2073 if (!has_codec_parameters(st->codec) /*&&
2074 (st->codec->codec_id == CODEC_ID_FLV1 ||
2075 st->codec->codec_id == CODEC_ID_H264 ||
2076 st->codec->codec_id == CODEC_ID_H263 ||
2077 st->codec->codec_id == CODEC_ID_H261 ||
2078 st->codec->codec_id == CODEC_ID_VORBIS ||
2079 st->codec->codec_id == CODEC_ID_MJPEG ||
2080 st->codec->codec_id == CODEC_ID_PNG ||
2081 st->codec->codec_id == CODEC_ID_PAM ||
2082 st->codec->codec_id == CODEC_ID_PGM ||
2083 st->codec->codec_id == CODEC_ID_PGMYUV ||
2084 st->codec->codec_id == CODEC_ID_PBM ||
2085 st->codec->codec_id == CODEC_ID_PPM ||
2086 st->codec->codec_id == CODEC_ID_SHORTEN ||
2087 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2088 try_decode_frame(st, pkt->data, pkt->size);
2090 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) {
2091 break;
2093 count++;
2096 // close codecs which were opened in try_decode_frame()
2097 for(i=0;i<ic->nb_streams;i++) {
2098 st = ic->streams[i];
2099 if(st->codec->codec)
2100 avcodec_close(st->codec);
2102 for(i=0;i<ic->nb_streams;i++) {
2103 st = ic->streams[i];
2104 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2105 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample)
2106 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2108 if(duration_count[i]
2109 && tb_unreliable(st->codec) /*&&
2110 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2111 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2112 double best_error= 2*av_q2d(st->time_base);
2113 best_error= best_error*best_error*duration_count[i]*1000*12*30;
2115 for(j=1; j<MAX_STD_TIMEBASES; j++){
2116 double error= duration_error[i][j] * get_std_framerate(j);
2117 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2118 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2119 if(error < best_error){
2120 best_error= error;
2121 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
2126 if (!st->r_frame_rate.num){
2127 if( st->codec->time_base.den * (int64_t)st->time_base.num
2128 <= st->codec->time_base.num * (int64_t)st->time_base.den){
2129 st->r_frame_rate.num = st->codec->time_base.den;
2130 st->r_frame_rate.den = st->codec->time_base.num;
2131 }else{
2132 st->r_frame_rate.num = st->time_base.den;
2133 st->r_frame_rate.den = st->time_base.num;
2136 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
2137 if(!st->codec->bits_per_sample)
2138 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id);
2142 av_estimate_timings(ic, old_offset);
2144 compute_chapters_end(ic);
2146 #if 0
2147 /* correct DTS for B-frame streams with no timestamps */
2148 for(i=0;i<ic->nb_streams;i++) {
2149 st = ic->streams[i];
2150 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2151 if(b-frames){
2152 ppktl = &ic->packet_buffer;
2153 while(ppkt1){
2154 if(ppkt1->stream_index != i)
2155 continue;
2156 if(ppkt1->pkt->dts < 0)
2157 break;
2158 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2159 break;
2160 ppkt1->pkt->dts -= delta;
2161 ppkt1= ppkt1->next;
2163 if(ppkt1)
2164 continue;
2165 st->cur_dts -= delta;
2169 #endif
2171 av_free(duration_error);
2173 return ret;
2176 /*******************************************************/
2178 int av_read_play(AVFormatContext *s)
2180 if (s->iformat->read_play)
2181 return s->iformat->read_play(s);
2182 if (s->pb)
2183 return av_url_read_fpause(s->pb, 0);
2184 return AVERROR(ENOSYS);
2187 int av_read_pause(AVFormatContext *s)
2189 if (s->iformat->read_pause)
2190 return s->iformat->read_pause(s);
2191 if (s->pb)
2192 return av_url_read_fpause(s->pb, 1);
2193 return AVERROR(ENOSYS);
2196 void av_close_input_stream(AVFormatContext *s)
2198 int i;
2199 AVStream *st;
2201 /* free previous packet */
2202 if (s->cur_st && s->cur_st->parser)
2203 av_free_packet(&s->cur_pkt);
2205 if (s->iformat->read_close)
2206 s->iformat->read_close(s);
2207 for(i=0;i<s->nb_streams;i++) {
2208 /* free all data in a stream component */
2209 st = s->streams[i];
2210 if (st->parser) {
2211 av_parser_close(st->parser);
2213 av_free(st->index_entries);
2214 av_free(st->codec->extradata);
2215 av_free(st->codec);
2216 av_free(st->filename);
2217 av_free(st->priv_data);
2218 av_free(st);
2220 for(i=s->nb_programs-1; i>=0; i--) {
2221 av_freep(&s->programs[i]->provider_name);
2222 av_freep(&s->programs[i]->name);
2223 av_freep(&s->programs[i]->stream_index);
2224 av_freep(&s->programs[i]);
2226 av_freep(&s->programs);
2227 flush_packet_queue(s);
2228 av_freep(&s->priv_data);
2229 while(s->nb_chapters--) {
2230 av_free(s->chapters[s->nb_chapters]->title);
2231 av_free(s->chapters[s->nb_chapters]);
2233 av_freep(&s->chapters);
2234 av_free(s);
2237 void av_close_input_file(AVFormatContext *s)
2239 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2240 av_close_input_stream(s);
2241 if (pb)
2242 url_fclose(pb);
2245 AVStream *av_new_stream(AVFormatContext *s, int id)
2247 AVStream *st;
2248 int i;
2250 if (s->nb_streams >= MAX_STREAMS)
2251 return NULL;
2253 st = av_mallocz(sizeof(AVStream));
2254 if (!st)
2255 return NULL;
2257 st->codec= avcodec_alloc_context();
2258 if (s->iformat) {
2259 /* no default bitrate if decoding */
2260 st->codec->bit_rate = 0;
2262 st->index = s->nb_streams;
2263 st->id = id;
2264 st->start_time = AV_NOPTS_VALUE;
2265 st->duration = AV_NOPTS_VALUE;
2266 /* we set the current DTS to 0 so that formats without any timestamps
2267 but durations get some timestamps, formats with some unknown
2268 timestamps have their first few packets buffered and the
2269 timestamps corrected before they are returned to the user */
2270 st->cur_dts = 0;
2271 st->first_dts = AV_NOPTS_VALUE;
2273 /* default pts setting is MPEG-like */
2274 av_set_pts_info(st, 33, 1, 90000);
2275 st->last_IP_pts = AV_NOPTS_VALUE;
2276 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2277 st->pts_buffer[i]= AV_NOPTS_VALUE;
2279 s->streams[s->nb_streams++] = st;
2280 return st;
2283 AVProgram *av_new_program(AVFormatContext *ac, int id)
2285 AVProgram *program=NULL;
2286 int i;
2288 #ifdef DEBUG_SI
2289 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2290 #endif
2292 for(i=0; i<ac->nb_programs; i++)
2293 if(ac->programs[i]->id == id)
2294 program = ac->programs[i];
2296 if(!program){
2297 program = av_mallocz(sizeof(AVProgram));
2298 if (!program)
2299 return NULL;
2300 dynarray_add(&ac->programs, &ac->nb_programs, program);
2301 program->discard = AVDISCARD_NONE;
2303 program->id = id;
2305 return program;
2308 void av_set_program_name(AVProgram *program, char *provider_name, char *name)
2310 assert(!provider_name == !name);
2311 if(name){
2312 av_free(program->provider_name);
2313 av_free(program-> name);
2314 program->provider_name = av_strdup(provider_name);
2315 program-> name = av_strdup( name);
2319 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2321 AVChapter *chapter = NULL;
2322 int i;
2324 for(i=0; i<s->nb_chapters; i++)
2325 if(s->chapters[i]->id == id)
2326 chapter = s->chapters[i];
2328 if(!chapter){
2329 chapter= av_mallocz(sizeof(AVChapter));
2330 if(!chapter)
2331 return NULL;
2332 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2334 av_free(chapter->title);
2335 chapter->title = av_strdup(title);
2336 chapter->id = id;
2337 chapter->time_base= time_base;
2338 chapter->start = start;
2339 chapter->end = end;
2341 return chapter;
2344 /************************************************************/
2345 /* output media file */
2347 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2349 int ret;
2351 if (s->oformat->priv_data_size > 0) {
2352 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2353 if (!s->priv_data)
2354 return AVERROR(ENOMEM);
2355 } else
2356 s->priv_data = NULL;
2358 if (s->oformat->set_parameters) {
2359 ret = s->oformat->set_parameters(s, ap);
2360 if (ret < 0)
2361 return ret;
2363 return 0;
2366 int av_write_header(AVFormatContext *s)
2368 int ret, i;
2369 AVStream *st;
2371 // some sanity checks
2372 for(i=0;i<s->nb_streams;i++) {
2373 st = s->streams[i];
2375 switch (st->codec->codec_type) {
2376 case CODEC_TYPE_AUDIO:
2377 if(st->codec->sample_rate<=0){
2378 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2379 return -1;
2381 break;
2382 case CODEC_TYPE_VIDEO:
2383 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2384 av_log(s, AV_LOG_ERROR, "time base not set\n");
2385 return -1;
2387 if(st->codec->width<=0 || st->codec->height<=0){
2388 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2389 return -1;
2391 break;
2394 if(s->oformat->codec_tag){
2395 if(st->codec->codec_tag){
2396 //FIXME
2397 //check that tag + id is in the table
2398 //if neither is in the table -> OK
2399 //if tag is in the table with another id -> FAIL
2400 //if id is in the table with another tag -> FAIL unless strict < ?
2401 }else
2402 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2406 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2407 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2408 if (!s->priv_data)
2409 return AVERROR(ENOMEM);
2412 if(s->oformat->write_header){
2413 ret = s->oformat->write_header(s);
2414 if (ret < 0)
2415 return ret;
2418 /* init PTS generation */
2419 for(i=0;i<s->nb_streams;i++) {
2420 int64_t den = AV_NOPTS_VALUE;
2421 st = s->streams[i];
2423 switch (st->codec->codec_type) {
2424 case CODEC_TYPE_AUDIO:
2425 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2426 break;
2427 case CODEC_TYPE_VIDEO:
2428 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2429 break;
2430 default:
2431 break;
2433 if (den != AV_NOPTS_VALUE) {
2434 if (den <= 0)
2435 return AVERROR_INVALIDDATA;
2436 av_frac_init(&st->pts, 0, 0, den);
2439 return 0;
2442 //FIXME merge with compute_pkt_fields
2443 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2444 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2445 int num, den, frame_size, i;
2447 // 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);
2449 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2450 return -1;*/
2452 /* duration field */
2453 if (pkt->duration == 0) {
2454 compute_frame_duration(&num, &den, st, NULL, pkt);
2455 if (den && num) {
2456 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2460 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2461 pkt->pts= pkt->dts;
2463 //XXX/FIXME this is a temporary hack until all encoders output pts
2464 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2465 pkt->dts=
2466 // pkt->pts= st->cur_dts;
2467 pkt->pts= st->pts.val;
2470 //calculate dts from pts
2471 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){
2472 st->pts_buffer[0]= pkt->pts;
2473 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2474 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2475 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2476 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2478 pkt->dts= st->pts_buffer[0];
2481 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2482 av_log(st->codec, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2483 return -1;
2485 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2486 av_log(st->codec, AV_LOG_ERROR, "error, pts < dts\n");
2487 return -1;
2490 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2491 st->cur_dts= pkt->dts;
2492 st->pts.val= pkt->dts;
2494 /* update pts */
2495 switch (st->codec->codec_type) {
2496 case CODEC_TYPE_AUDIO:
2497 frame_size = get_audio_frame_size(st->codec, pkt->size);
2499 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2500 likely equal to the encoder delay, but it would be better if we
2501 had the real timestamps from the encoder */
2502 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2503 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2505 break;
2506 case CODEC_TYPE_VIDEO:
2507 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2508 break;
2509 default:
2510 break;
2512 return 0;
2515 static void truncate_ts(AVStream *st, AVPacket *pkt){
2516 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1;
2518 // if(pkt->dts < 0)
2519 // pkt->dts= 0; //this happens for low_delay=0 and B-frames, FIXME, needs further investigation about what we should do here
2521 if (pkt->pts != AV_NOPTS_VALUE)
2522 pkt->pts &= pts_mask;
2523 if (pkt->dts != AV_NOPTS_VALUE)
2524 pkt->dts &= pts_mask;
2527 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2529 int ret = compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2531 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2532 return ret;
2534 truncate_ts(s->streams[pkt->stream_index], pkt);
2536 ret= s->oformat->write_packet(s, pkt);
2537 if(!ret)
2538 ret= url_ferror(s->pb);
2539 return ret;
2542 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2543 AVPacketList *pktl, **next_point, *this_pktl;
2544 int stream_count=0;
2545 int streams[MAX_STREAMS];
2547 if(pkt){
2548 AVStream *st= s->streams[ pkt->stream_index];
2550 // assert(pkt->destruct != av_destruct_packet); //FIXME
2552 this_pktl = av_mallocz(sizeof(AVPacketList));
2553 this_pktl->pkt= *pkt;
2554 if(pkt->destruct == av_destruct_packet)
2555 pkt->destruct= NULL; // not shared -> must keep original from being freed
2556 else
2557 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2559 next_point = &s->packet_buffer;
2560 while(*next_point){
2561 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2562 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2563 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2564 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2565 break;
2566 next_point= &(*next_point)->next;
2568 this_pktl->next= *next_point;
2569 *next_point= this_pktl;
2572 memset(streams, 0, sizeof(streams));
2573 pktl= s->packet_buffer;
2574 while(pktl){
2575 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2576 if(streams[ pktl->pkt.stream_index ] == 0)
2577 stream_count++;
2578 streams[ pktl->pkt.stream_index ]++;
2579 pktl= pktl->next;
2582 if(stream_count && (s->nb_streams == stream_count || flush)){
2583 pktl= s->packet_buffer;
2584 *out= pktl->pkt;
2586 s->packet_buffer= pktl->next;
2587 av_freep(&pktl);
2588 return 1;
2589 }else{
2590 av_init_packet(out);
2591 return 0;
2596 * Interleaves an AVPacket correctly so it can be muxed.
2597 * @param out the interleaved packet will be output here
2598 * @param in the input packet
2599 * @param flush 1 if no further packets are available as input and all
2600 * remaining packets should be output
2601 * @return 1 if a packet was output, 0 if no packet could be output,
2602 * < 0 if an error occurred
2604 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2605 if(s->oformat->interleave_packet)
2606 return s->oformat->interleave_packet(s, out, in, flush);
2607 else
2608 return av_interleave_packet_per_dts(s, out, in, flush);
2611 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2612 AVStream *st= s->streams[ pkt->stream_index];
2614 //FIXME/XXX/HACK drop zero sized packets
2615 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2616 return 0;
2618 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2619 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2620 return -1;
2622 if(pkt->dts == AV_NOPTS_VALUE)
2623 return -1;
2625 for(;;){
2626 AVPacket opkt;
2627 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2628 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2629 return ret;
2631 truncate_ts(s->streams[opkt.stream_index], &opkt);
2632 ret= s->oformat->write_packet(s, &opkt);
2634 av_free_packet(&opkt);
2635 pkt= NULL;
2637 if(ret<0)
2638 return ret;
2639 if(url_ferror(s->pb))
2640 return url_ferror(s->pb);
2644 int av_write_trailer(AVFormatContext *s)
2646 int ret, i;
2648 for(;;){
2649 AVPacket pkt;
2650 ret= av_interleave_packet(s, &pkt, NULL, 1);
2651 if(ret<0) //FIXME cleanup needed for ret<0 ?
2652 goto fail;
2653 if(!ret)
2654 break;
2656 truncate_ts(s->streams[pkt.stream_index], &pkt);
2657 ret= s->oformat->write_packet(s, &pkt);
2659 av_free_packet(&pkt);
2661 if(ret<0)
2662 goto fail;
2663 if(url_ferror(s->pb))
2664 goto fail;
2667 if(s->oformat->write_trailer)
2668 ret = s->oformat->write_trailer(s);
2669 fail:
2670 if(ret == 0)
2671 ret=url_ferror(s->pb);
2672 for(i=0;i<s->nb_streams;i++)
2673 av_freep(&s->streams[i]->priv_data);
2674 av_freep(&s->priv_data);
2675 return ret;
2678 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2680 int i, j;
2681 AVProgram *program=NULL;
2682 void *tmp;
2684 for(i=0; i<ac->nb_programs; i++){
2685 if(ac->programs[i]->id != progid)
2686 continue;
2687 program = ac->programs[i];
2688 for(j=0; j<program->nb_stream_indexes; j++)
2689 if(program->stream_index[j] == idx)
2690 return;
2692 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2693 if(!tmp)
2694 return;
2695 program->stream_index = tmp;
2696 program->stream_index[program->nb_stream_indexes++] = idx;
2697 return;
2701 /* "user interface" functions */
2702 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2704 char buf[256];
2705 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2706 AVStream *st = ic->streams[i];
2707 int g = ff_gcd(st->time_base.num, st->time_base.den);
2708 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2709 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2710 /* the pid is an important information, so we display it */
2711 /* XXX: add a generic system */
2712 if (flags & AVFMT_SHOW_IDS)
2713 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2714 if (strlen(st->language) > 0)
2715 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2716 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2717 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2718 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2719 if(st->r_frame_rate.den && st->r_frame_rate.num)
2720 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(r)", av_q2d(st->r_frame_rate));
2721 /* else if(st->time_base.den && st->time_base.num)
2722 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(m)", 1/av_q2d(st->time_base));*/
2723 else
2724 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(c)", 1/av_q2d(st->codec->time_base));
2726 av_log(NULL, AV_LOG_INFO, "\n");
2729 void dump_format(AVFormatContext *ic,
2730 int index,
2731 const char *url,
2732 int is_output)
2734 int i;
2736 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2737 is_output ? "Output" : "Input",
2738 index,
2739 is_output ? ic->oformat->name : ic->iformat->name,
2740 is_output ? "to" : "from", url);
2741 if (!is_output) {
2742 av_log(NULL, AV_LOG_INFO, " Duration: ");
2743 if (ic->duration != AV_NOPTS_VALUE) {
2744 int hours, mins, secs, us;
2745 secs = ic->duration / AV_TIME_BASE;
2746 us = ic->duration % AV_TIME_BASE;
2747 mins = secs / 60;
2748 secs %= 60;
2749 hours = mins / 60;
2750 mins %= 60;
2751 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
2752 (100 * us) / AV_TIME_BASE);
2753 } else {
2754 av_log(NULL, AV_LOG_INFO, "N/A");
2756 if (ic->start_time != AV_NOPTS_VALUE) {
2757 int secs, us;
2758 av_log(NULL, AV_LOG_INFO, ", start: ");
2759 secs = ic->start_time / AV_TIME_BASE;
2760 us = ic->start_time % AV_TIME_BASE;
2761 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2762 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2764 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2765 if (ic->bit_rate) {
2766 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2767 } else {
2768 av_log(NULL, AV_LOG_INFO, "N/A");
2770 av_log(NULL, AV_LOG_INFO, "\n");
2772 if(ic->nb_programs) {
2773 int j, k;
2774 for(j=0; j<ic->nb_programs; j++) {
2775 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2776 ic->programs[j]->name ? ic->programs[j]->name : "");
2777 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++)
2778 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2780 } else
2781 for(i=0;i<ic->nb_streams;i++)
2782 dump_stream_format(ic, i, index, is_output);
2785 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2787 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2790 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2792 AVRational frame_rate;
2793 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2794 *frame_rate_num= frame_rate.num;
2795 *frame_rate_den= frame_rate.den;
2796 return ret;
2800 * Gets the current time in microseconds.
2802 int64_t av_gettime(void)
2804 struct timeval tv;
2805 gettimeofday(&tv,NULL);
2806 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2809 int64_t parse_date(const char *datestr, int duration)
2811 const char *p;
2812 int64_t t;
2813 struct tm dt;
2814 int i;
2815 static const char *date_fmt[] = {
2816 "%Y-%m-%d",
2817 "%Y%m%d",
2819 static const char *time_fmt[] = {
2820 "%H:%M:%S",
2821 "%H%M%S",
2823 const char *q;
2824 int is_utc, len;
2825 char lastch;
2826 int negative = 0;
2828 #undef time
2829 time_t now = time(0);
2831 len = strlen(datestr);
2832 if (len > 0)
2833 lastch = datestr[len - 1];
2834 else
2835 lastch = '\0';
2836 is_utc = (lastch == 'z' || lastch == 'Z');
2838 memset(&dt, 0, sizeof(dt));
2840 p = datestr;
2841 q = NULL;
2842 if (!duration) {
2843 /* parse the year-month-day part */
2844 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
2845 q = small_strptime(p, date_fmt[i], &dt);
2846 if (q) {
2847 break;
2851 /* if the year-month-day part is missing, then take the
2852 * current year-month-day time */
2853 if (!q) {
2854 if (is_utc) {
2855 dt = *gmtime(&now);
2856 } else {
2857 dt = *localtime(&now);
2859 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2860 } else {
2861 p = q;
2864 if (*p == 'T' || *p == 't' || *p == ' ')
2865 p++;
2867 /* parse the hour-minute-second part */
2868 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
2869 q = small_strptime(p, time_fmt[i], &dt);
2870 if (q) {
2871 break;
2874 } else {
2875 /* parse datestr as a duration */
2876 if (p[0] == '-') {
2877 negative = 1;
2878 ++p;
2880 /* parse datestr as HH:MM:SS */
2881 q = small_strptime(p, time_fmt[0], &dt);
2882 if (!q) {
2883 /* parse datestr as S+ */
2884 dt.tm_sec = strtol(p, (char **)&q, 10);
2885 if (q == p)
2886 /* the parsing didn't succeed */
2887 return INT64_MIN;
2888 dt.tm_min = 0;
2889 dt.tm_hour = 0;
2893 /* Now we have all the fields that we can get */
2894 if (!q) {
2895 return INT64_MIN;
2898 if (duration) {
2899 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2900 } else {
2901 dt.tm_isdst = -1; /* unknown */
2902 if (is_utc) {
2903 t = mktimegm(&dt);
2904 } else {
2905 t = mktime(&dt);
2909 t *= 1000000;
2911 /* parse the .m... part */
2912 if (*q == '.') {
2913 int val, n;
2914 q++;
2915 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2916 if (!isdigit(*q))
2917 break;
2918 val += n * (*q - '0');
2920 t += val;
2922 return negative ? -t : t;
2925 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2927 const char *p;
2928 char tag[128], *q;
2930 p = info;
2931 if (*p == '?')
2932 p++;
2933 for(;;) {
2934 q = tag;
2935 while (*p != '\0' && *p != '=' && *p != '&') {
2936 if ((q - tag) < sizeof(tag) - 1)
2937 *q++ = *p;
2938 p++;
2940 *q = '\0';
2941 q = arg;
2942 if (*p == '=') {
2943 p++;
2944 while (*p != '&' && *p != '\0') {
2945 if ((q - arg) < arg_size - 1) {
2946 if (*p == '+')
2947 *q++ = ' ';
2948 else
2949 *q++ = *p;
2951 p++;
2953 *q = '\0';
2955 if (!strcmp(tag, tag1))
2956 return 1;
2957 if (*p != '&')
2958 break;
2959 p++;
2961 return 0;
2964 int av_get_frame_filename(char *buf, int buf_size,
2965 const char *path, int number)
2967 const char *p;
2968 char *q, buf1[20], c;
2969 int nd, len, percentd_found;
2971 q = buf;
2972 p = path;
2973 percentd_found = 0;
2974 for(;;) {
2975 c = *p++;
2976 if (c == '\0')
2977 break;
2978 if (c == '%') {
2979 do {
2980 nd = 0;
2981 while (isdigit(*p)) {
2982 nd = nd * 10 + *p++ - '0';
2984 c = *p++;
2985 } while (isdigit(c));
2987 switch(c) {
2988 case '%':
2989 goto addchar;
2990 case 'd':
2991 if (percentd_found)
2992 goto fail;
2993 percentd_found = 1;
2994 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
2995 len = strlen(buf1);
2996 if ((q - buf + len) > buf_size - 1)
2997 goto fail;
2998 memcpy(q, buf1, len);
2999 q += len;
3000 break;
3001 default:
3002 goto fail;
3004 } else {
3005 addchar:
3006 if ((q - buf) < buf_size - 1)
3007 *q++ = c;
3010 if (!percentd_found)
3011 goto fail;
3012 *q = '\0';
3013 return 0;
3014 fail:
3015 *q = '\0';
3016 return -1;
3019 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3021 int len, i, j, c;
3022 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3024 for(i=0;i<size;i+=16) {
3025 len = size - i;
3026 if (len > 16)
3027 len = 16;
3028 PRINT("%08x ", i);
3029 for(j=0;j<16;j++) {
3030 if (j < len)
3031 PRINT(" %02x", buf[i+j]);
3032 else
3033 PRINT(" ");
3035 PRINT(" ");
3036 for(j=0;j<len;j++) {
3037 c = buf[i+j];
3038 if (c < ' ' || c > '~')
3039 c = '.';
3040 PRINT("%c", c);
3042 PRINT("\n");
3044 #undef PRINT
3047 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3049 hex_dump_internal(NULL, f, 0, buf, size);
3052 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3054 hex_dump_internal(avcl, NULL, level, buf, size);
3057 //FIXME needs to know the time_base
3058 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
3060 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3061 PRINT("stream #%d:\n", pkt->stream_index);
3062 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3063 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3064 /* DTS is _always_ valid after av_read_frame() */
3065 PRINT(" dts=");
3066 if (pkt->dts == AV_NOPTS_VALUE)
3067 PRINT("N/A");
3068 else
3069 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
3070 /* PTS may not be known if B-frames are present. */
3071 PRINT(" pts=");
3072 if (pkt->pts == AV_NOPTS_VALUE)
3073 PRINT("N/A");
3074 else
3075 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
3076 PRINT("\n");
3077 PRINT(" size=%d\n", pkt->size);
3078 #undef PRINT
3079 if (dump_payload)
3080 av_hex_dump(f, pkt->data, pkt->size);
3083 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3085 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
3088 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3090 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
3093 void url_split(char *proto, int proto_size,
3094 char *authorization, int authorization_size,
3095 char *hostname, int hostname_size,
3096 int *port_ptr,
3097 char *path, int path_size,
3098 const char *url)
3100 const char *p, *ls, *at, *col, *brk;
3102 if (port_ptr) *port_ptr = -1;
3103 if (proto_size > 0) proto[0] = 0;
3104 if (authorization_size > 0) authorization[0] = 0;
3105 if (hostname_size > 0) hostname[0] = 0;
3106 if (path_size > 0) path[0] = 0;
3108 /* parse protocol */
3109 if ((p = strchr(url, ':'))) {
3110 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3111 p++; /* skip ':' */
3112 if (*p == '/') p++;
3113 if (*p == '/') p++;
3114 } else {
3115 /* no protocol means plain filename */
3116 av_strlcpy(path, url, path_size);
3117 return;
3120 /* separate path from hostname */
3121 ls = strchr(p, '/');
3122 if(!ls)
3123 ls = strchr(p, '?');
3124 if(ls)
3125 av_strlcpy(path, ls, path_size);
3126 else
3127 ls = &p[strlen(p)]; // XXX
3129 /* the rest is hostname, use that to parse auth/port */
3130 if (ls != p) {
3131 /* authorization (user[:pass]@hostname) */
3132 if ((at = strchr(p, '@')) && at < ls) {
3133 av_strlcpy(authorization, p,
3134 FFMIN(authorization_size, at + 1 - p));
3135 p = at + 1; /* skip '@' */
3138 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3139 /* [host]:port */
3140 av_strlcpy(hostname, p + 1,
3141 FFMIN(hostname_size, brk - p));
3142 if (brk[1] == ':' && port_ptr)
3143 *port_ptr = atoi(brk + 2);
3144 } else if ((col = strchr(p, ':')) && col < ls) {
3145 av_strlcpy(hostname, p,
3146 FFMIN(col + 1 - p, hostname_size));
3147 if (port_ptr) *port_ptr = atoi(col + 1);
3148 } else
3149 av_strlcpy(hostname, p,
3150 FFMIN(ls + 1 - p, hostname_size));
3154 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3155 int pts_num, int pts_den)
3157 unsigned int gcd= ff_gcd(pts_num, pts_den);
3158 s->pts_wrap_bits = pts_wrap_bits;
3159 s->time_base.num = pts_num/gcd;
3160 s->time_base.den = pts_den/gcd;
3162 if(gcd>1)
3163 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, gcd);
3166 /* fraction handling */
3169 * f = val + (num / den) + 0.5.
3171 * 'num' is normalized so that it is such as 0 <= num < den.
3173 * @param f fractional number
3174 * @param val integer value
3175 * @param num must be >= 0
3176 * @param den must be >= 1
3178 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
3180 num += (den >> 1);
3181 if (num >= den) {
3182 val += num / den;
3183 num = num % den;
3185 f->val = val;
3186 f->num = num;
3187 f->den = den;
3191 * Fractional addition to f: f = f + (incr / f->den).
3193 * @param f fractional number
3194 * @param incr increment, can be positive or negative
3196 static void av_frac_add(AVFrac *f, int64_t incr)
3198 int64_t num, den;
3200 num = f->num + incr;
3201 den = f->den;
3202 if (num < 0) {
3203 f->val += num / den;
3204 num = num % den;
3205 if (num < 0) {
3206 num += den;
3207 f->val--;
3209 } else if (num >= den) {
3210 f->val += num / den;
3211 num = num % den;
3213 f->num = num;