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
25 #include "avio_internal.h"
27 #include "libavcodec/internal.h"
28 #include "libavutil/opt.h"
31 #include "libavutil/avstring.h"
33 #include "audiointerleave.h"
47 * various utility functions for use within FFmpeg
50 unsigned avformat_version(void)
52 return LIBAVFORMAT_VERSION_INT;
55 const char *avformat_configuration(void)
57 return FFMPEG_CONFIGURATION;
60 const char *avformat_license(void)
62 #define LICENSE_PREFIX "libavformat license: "
63 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
66 /* fraction handling */
69 * f = val + (num / den) + 0.5.
71 * 'num' is normalized so that it is such as 0 <= num < den.
73 * @param f fractional number
74 * @param val integer value
75 * @param num must be >= 0
76 * @param den must be >= 1
78 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
91 * Fractional addition to f: f = f + (incr / f->den).
93 * @param f fractional number
94 * @param incr increment, can be positive or negative
96 static void av_frac_add(AVFrac *f, int64_t incr)
109 } else if (num >= den) {
116 /** head of registered input format linked list */
117 #if !FF_API_FIRST_FORMAT
120 AVInputFormat *first_iformat = NULL;
121 /** head of registered output format linked list */
122 #if !FF_API_FIRST_FORMAT
125 AVOutputFormat *first_oformat = NULL;
127 AVInputFormat *av_iformat_next(AVInputFormat *f)
129 if(f) return f->next;
130 else return first_iformat;
133 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
135 if(f) return f->next;
136 else return first_oformat;
139 void av_register_input_format(AVInputFormat *format)
143 while (*p != NULL) p = &(*p)->next;
148 void av_register_output_format(AVOutputFormat *format)
152 while (*p != NULL) p = &(*p)->next;
157 int av_match_ext(const char *filename, const char *extensions)
165 ext = strrchr(filename, '.');
171 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
174 if (!strcasecmp(ext1, ext))
184 static int match_format(const char *name, const char *names)
192 namelen = strlen(name);
193 while ((p = strchr(names, ','))) {
194 len = FFMAX(p - names, namelen);
195 if (!strncasecmp(name, names, len))
199 return !strcasecmp(name, names);
202 #if FF_API_GUESS_FORMAT
203 AVOutputFormat *guess_format(const char *short_name, const char *filename,
204 const char *mime_type)
206 return av_guess_format(short_name, filename, mime_type);
210 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
211 const char *mime_type)
213 AVOutputFormat *fmt = NULL, *fmt_found;
214 int score_max, score;
216 /* specific test for image sequences */
217 #if CONFIG_IMAGE2_MUXER
218 if (!short_name && filename &&
219 av_filename_number_test(filename) &&
220 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
221 return av_guess_format("image2", NULL, NULL);
224 /* Find the proper file type. */
227 while ((fmt = av_oformat_next(fmt))) {
229 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
231 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
233 if (filename && fmt->extensions &&
234 av_match_ext(filename, fmt->extensions)) {
237 if (score > score_max) {
245 #if FF_API_GUESS_FORMAT
246 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
247 const char *mime_type)
249 AVOutputFormat *fmt = av_guess_format(short_name, filename, mime_type);
252 AVOutputFormat *stream_fmt;
253 char stream_format_name[64];
255 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
256 stream_fmt = av_guess_format(stream_format_name, NULL, NULL);
266 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
267 const char *filename, const char *mime_type, enum AVMediaType type){
268 if(type == AVMEDIA_TYPE_VIDEO){
269 enum CodecID codec_id= CODEC_ID_NONE;
271 #if CONFIG_IMAGE2_MUXER
272 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
273 codec_id= av_guess_image2_codec(filename);
276 if(codec_id == CODEC_ID_NONE)
277 codec_id= fmt->video_codec;
279 }else if(type == AVMEDIA_TYPE_AUDIO)
280 return fmt->audio_codec;
281 else if (type == AVMEDIA_TYPE_SUBTITLE)
282 return fmt->subtitle_codec;
284 return CODEC_ID_NONE;
287 AVInputFormat *av_find_input_format(const char *short_name)
289 AVInputFormat *fmt = NULL;
290 while ((fmt = av_iformat_next(fmt))) {
291 if (match_format(short_name, fmt->name))
297 #if FF_API_SYMVER && CONFIG_SHARED && HAVE_SYMVER
298 FF_SYMVER(void, av_destruct_packet_nofree, (AVPacket *pkt), "LIBAVFORMAT_52")
300 av_destruct_packet_nofree(pkt);
303 FF_SYMVER(void, av_destruct_packet, (AVPacket *pkt), "LIBAVFORMAT_52")
305 av_destruct_packet(pkt);
308 FF_SYMVER(int, av_new_packet, (AVPacket *pkt, int size), "LIBAVFORMAT_52")
310 return av_new_packet(pkt, size);
313 FF_SYMVER(int, av_dup_packet, (AVPacket *pkt), "LIBAVFORMAT_52")
315 return av_dup_packet(pkt);
318 FF_SYMVER(void, av_free_packet, (AVPacket *pkt), "LIBAVFORMAT_52")
323 FF_SYMVER(void, av_init_packet, (AVPacket *pkt), "LIBAVFORMAT_52")
325 av_log(NULL, AV_LOG_WARNING, "Diverting av_*_packet function calls to libavcodec. Recompile to improve performance\n");
330 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
332 int ret= av_new_packet(pkt, size);
337 pkt->pos= avio_tell(s);
339 ret= avio_read(s, pkt->data, size);
343 av_shrink_packet(pkt, ret);
348 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
353 return av_get_packet(s, pkt, size);
354 old_size = pkt->size;
355 ret = av_grow_packet(pkt, size);
358 ret = avio_read(s, pkt->data + old_size, size);
359 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
364 int av_filename_number_test(const char *filename)
367 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
370 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
372 AVProbeData lpd = *pd;
373 AVInputFormat *fmt1 = NULL, *fmt;
376 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
377 int id3len = ff_id3v2_tag_len(lpd.buf);
378 if (lpd.buf_size > id3len + 16) {
380 lpd.buf_size -= id3len;
385 while ((fmt1 = av_iformat_next(fmt1))) {
386 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
389 if (fmt1->read_probe) {
390 score = fmt1->read_probe(&lpd);
391 } else if (fmt1->extensions) {
392 if (av_match_ext(lpd.filename, fmt1->extensions)) {
396 if (score > *score_max) {
399 }else if (score == *score_max)
405 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
407 return av_probe_input_format2(pd, is_opened, &score);
410 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
412 static const struct {
413 const char *name; enum CodecID id; enum AVMediaType type;
415 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
416 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
417 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
418 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
419 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
420 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
421 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
422 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
425 AVInputFormat *fmt = av_probe_input_format2(pd, 1, &score);
429 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
430 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
431 for (i = 0; fmt_id_type[i].name; i++) {
432 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
433 st->codec->codec_id = fmt_id_type[i].id;
434 st->codec->codec_type = fmt_id_type[i].type;
442 /************************************************************/
443 /* input media file */
446 * Open a media file from an IO stream. 'fmt' must be specified.
448 int av_open_input_stream(AVFormatContext **ic_ptr,
449 AVIOContext *pb, const char *filename,
450 AVInputFormat *fmt, AVFormatParameters *ap)
454 AVFormatParameters default_ap;
458 memset(ap, 0, sizeof(default_ap));
461 if(!ap->prealloced_context)
462 ic = avformat_alloc_context();
466 err = AVERROR(ENOMEM);
471 ic->duration = AV_NOPTS_VALUE;
472 ic->start_time = AV_NOPTS_VALUE;
473 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
475 /* allocate private data */
476 if (fmt->priv_data_size > 0) {
477 ic->priv_data = av_mallocz(fmt->priv_data_size);
478 if (!ic->priv_data) {
479 err = AVERROR(ENOMEM);
483 ic->priv_data = NULL;
486 // e.g. AVFMT_NOFILE formats will not have a AVIOContext
488 ff_id3v2_read(ic, ID3v2_DEFAULT_MAGIC);
490 if (ic->iformat->read_header) {
491 err = ic->iformat->read_header(ic, ap);
496 if (pb && !ic->data_offset)
497 ic->data_offset = avio_tell(ic->pb);
499 #if FF_API_OLD_METADATA
500 ff_metadata_demux_compat(ic);
503 ic->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
510 av_freep(&ic->priv_data);
511 for(i=0;i<ic->nb_streams;i++) {
512 AVStream *st = ic->streams[i];
514 av_free(st->priv_data);
515 av_free(st->codec->extradata);
527 /** size of probe buffer, for guessing file type from file contents */
528 #define PROBE_BUF_MIN 2048
529 #define PROBE_BUF_MAX (1<<20)
531 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
532 const char *filename, void *logctx,
533 unsigned int offset, unsigned int max_probe_size)
535 AVProbeData pd = { filename ? filename : "", NULL, -offset };
536 unsigned char *buf = NULL;
537 int ret = 0, probe_size;
539 if (!max_probe_size) {
540 max_probe_size = PROBE_BUF_MAX;
541 } else if (max_probe_size > PROBE_BUF_MAX) {
542 max_probe_size = PROBE_BUF_MAX;
543 } else if (max_probe_size < PROBE_BUF_MIN) {
544 return AVERROR(EINVAL);
547 if (offset >= max_probe_size) {
548 return AVERROR(EINVAL);
551 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt && ret >= 0;
552 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
553 int ret, score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
554 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
556 if (probe_size < offset) {
560 /* read probe data */
561 buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
562 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
563 /* fail if error was not end of file, otherwise, lower score */
564 if (ret != AVERROR_EOF) {
569 ret = 0; /* error was end of file, nothing read */
572 pd.buf = &buf[offset];
574 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
576 /* guess file format */
577 *fmt = av_probe_input_format2(&pd, 1, &score);
579 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
580 av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
582 av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
588 return AVERROR_INVALIDDATA;
591 /* rewind. reuse probe buffer to avoid seeking */
592 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
598 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
601 AVFormatParameters *ap)
604 AVProbeData probe_data, *pd = &probe_data;
605 AVIOContext *pb = NULL;
606 void *logctx= ap && ap->prealloced_context ? *ic_ptr : NULL;
610 pd->filename = filename;
615 /* guess format if no file can be opened */
616 fmt = av_probe_input_format(pd, 0);
619 /* Do not open file if the format does not need it. XXX: specific
620 hack needed to handle RTSP/TCP */
621 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
622 /* if no file needed do not try to open one */
623 if ((err=avio_open(&pb, filename, URL_RDONLY)) < 0) {
627 ffio_set_buf_size(pb, buf_size);
629 if (!fmt && (err = av_probe_input_buffer(pb, &fmt, filename, logctx, 0, logctx ? (*ic_ptr)->probesize : 0)) < 0) {
634 /* if still no format found, error */
636 err = AVERROR_INVALIDDATA;
640 /* check filename in case an image number is expected */
641 if (fmt->flags & AVFMT_NEEDNUMBER) {
642 if (!av_filename_number_test(filename)) {
643 err = AVERROR_NUMEXPECTED;
647 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
655 if (ap && ap->prealloced_context)
662 /*******************************************************/
664 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
665 AVPacketList **plast_pktl){
666 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
671 (*plast_pktl)->next = pktl;
673 *packet_buffer = pktl;
675 /* add the packet in the buffered packet list */
681 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
687 AVPacketList *pktl = s->raw_packet_buffer;
691 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
692 !s->streams[pkt->stream_index]->probe_packets){
693 s->raw_packet_buffer = pktl->next;
694 s->raw_packet_buffer_remaining_size += pkt->size;
701 ret= s->iformat->read_packet(s, pkt);
703 if (!pktl || ret == AVERROR(EAGAIN))
705 for (i = 0; i < s->nb_streams; i++)
706 s->streams[i]->probe_packets = 0;
709 st= s->streams[pkt->stream_index];
711 switch(st->codec->codec_type){
712 case AVMEDIA_TYPE_VIDEO:
713 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
715 case AVMEDIA_TYPE_AUDIO:
716 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
718 case AVMEDIA_TYPE_SUBTITLE:
719 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
723 if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
727 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
728 s->raw_packet_buffer_remaining_size -= pkt->size;
730 if(st->codec->codec_id == CODEC_ID_PROBE && st->probe_packets){
731 AVProbeData *pd = &st->probe_data;
733 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
736 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
737 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
738 pd->buf_size += pkt->size;
739 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
741 end= s->raw_packet_buffer_remaining_size <= 0
742 || st->probe_packets<=0;
744 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
745 set_codec_from_probe_data(s, st, pd, end ? 0 : AVPROBE_SCORE_MAX/4);
746 if(st->codec->codec_id != CODEC_ID_PROBE || end){
749 st->probe_packets= 0;
750 if(st->codec->codec_id != CODEC_ID_PROBE){
751 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
753 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
760 /**********************************************************/
763 * Get the number of samples of an audio frame. Return -1 on error.
765 static int get_audio_frame_size(AVCodecContext *enc, int size)
769 if(enc->codec_id == CODEC_ID_VORBIS)
772 if (enc->frame_size <= 1) {
773 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
775 if (bits_per_sample) {
776 if (enc->channels == 0)
778 frame_size = (size << 3) / (bits_per_sample * enc->channels);
780 /* used for example by ADPCM codecs */
781 if (enc->bit_rate == 0)
783 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
786 frame_size = enc->frame_size;
793 * Return the frame duration in seconds. Return 0 if not available.
795 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
796 AVCodecParserContext *pc, AVPacket *pkt)
802 switch(st->codec->codec_type) {
803 case AVMEDIA_TYPE_VIDEO:
804 if(st->time_base.num*1000LL > st->time_base.den){
805 *pnum = st->time_base.num;
806 *pden = st->time_base.den;
807 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
808 *pnum = st->codec->time_base.num;
809 *pden = st->codec->time_base.den;
810 if (pc && pc->repeat_pict) {
811 *pnum = (*pnum) * (1 + pc->repeat_pict);
813 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
814 //Thus if we have no parser in such case leave duration undefined.
815 if(st->codec->ticks_per_frame>1 && !pc){
820 case AVMEDIA_TYPE_AUDIO:
821 frame_size = get_audio_frame_size(st->codec, pkt->size);
822 if (frame_size <= 0 || st->codec->sample_rate <= 0)
825 *pden = st->codec->sample_rate;
832 static int is_intra_only(AVCodecContext *enc){
833 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
835 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
836 switch(enc->codec_id){
838 case CODEC_ID_MJPEGB:
840 case CODEC_ID_RAWVIDEO:
841 case CODEC_ID_DVVIDEO:
842 case CODEC_ID_HUFFYUV:
843 case CODEC_ID_FFVHUFF:
848 case CODEC_ID_JPEG2000:
856 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
857 int64_t dts, int64_t pts)
859 AVStream *st= s->streams[stream_index];
860 AVPacketList *pktl= s->packet_buffer;
862 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
865 st->first_dts= dts - st->cur_dts;
868 for(; pktl; pktl= pktl->next){
869 if(pktl->pkt.stream_index != stream_index)
871 //FIXME think more about this check
872 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
873 pktl->pkt.pts += st->first_dts;
875 if(pktl->pkt.dts != AV_NOPTS_VALUE)
876 pktl->pkt.dts += st->first_dts;
878 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
879 st->start_time= pktl->pkt.pts;
881 if (st->start_time == AV_NOPTS_VALUE)
882 st->start_time = pts;
885 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
887 AVPacketList *pktl= s->packet_buffer;
890 if(st->first_dts != AV_NOPTS_VALUE){
891 cur_dts= st->first_dts;
892 for(; pktl; pktl= pktl->next){
893 if(pktl->pkt.stream_index == pkt->stream_index){
894 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
896 cur_dts -= pkt->duration;
899 pktl= s->packet_buffer;
900 st->first_dts = cur_dts;
901 }else if(st->cur_dts)
904 for(; pktl; pktl= pktl->next){
905 if(pktl->pkt.stream_index != pkt->stream_index)
907 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
908 && !pktl->pkt.duration){
909 pktl->pkt.dts= cur_dts;
910 if(!st->codec->has_b_frames)
911 pktl->pkt.pts= cur_dts;
912 cur_dts += pkt->duration;
913 pktl->pkt.duration= pkt->duration;
917 if(st->first_dts == AV_NOPTS_VALUE)
918 st->cur_dts= cur_dts;
921 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
922 AVCodecParserContext *pc, AVPacket *pkt)
924 int num, den, presentation_delayed, delay, i;
927 if (s->flags & AVFMT_FLAG_NOFILLIN)
930 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
931 pkt->dts= AV_NOPTS_VALUE;
933 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == FF_B_TYPE)
934 //FIXME Set low_delay = 0 when has_b_frames = 1
935 st->codec->has_b_frames = 1;
937 /* do we have a video B-frame ? */
938 delay= st->codec->has_b_frames;
939 presentation_delayed = 0;
941 // ignore delay caused by frame threading so that the mpeg2-without-dts
942 // warning will not trigger
943 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
944 delay -= st->codec->thread_count-1;
946 /* XXX: need has_b_frame, but cannot get it if the codec is
949 pc && pc->pict_type != FF_B_TYPE)
950 presentation_delayed = 1;
952 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
953 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
954 pkt->dts -= 1LL<<st->pts_wrap_bits;
957 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
958 // we take the conservative approach and discard both
959 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
960 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
961 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
962 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
965 if (pkt->duration == 0) {
966 compute_frame_duration(&num, &den, st, pc, pkt);
968 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
970 if(pkt->duration != 0 && s->packet_buffer)
971 update_initial_durations(s, st, pkt);
975 /* correct timestamps with byte offset if demuxers only have timestamps
976 on packet boundaries */
977 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
978 /* this will estimate bitrate based on this frame's duration and size */
979 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
980 if(pkt->pts != AV_NOPTS_VALUE)
982 if(pkt->dts != AV_NOPTS_VALUE)
986 if (pc && pc->dts_sync_point >= 0) {
987 // we have synchronization info from the parser
988 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
990 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
991 if (pkt->dts != AV_NOPTS_VALUE) {
992 // got DTS from the stream, update reference timestamp
993 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
994 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
995 } else if (st->reference_dts != AV_NOPTS_VALUE) {
996 // compute DTS based on reference timestamp
997 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
998 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1000 if (pc->dts_sync_point > 0)
1001 st->reference_dts = pkt->dts; // new reference
1005 /* This may be redundant, but it should not hurt. */
1006 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1007 presentation_delayed = 1;
1009 // 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);
1010 /* interpolate PTS and DTS if they are not present */
1011 //We skip H264 currently because delay and has_b_frames are not reliably set
1012 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1013 if (presentation_delayed) {
1014 /* DTS = decompression timestamp */
1015 /* PTS = presentation timestamp */
1016 if (pkt->dts == AV_NOPTS_VALUE)
1017 pkt->dts = st->last_IP_pts;
1018 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1019 if (pkt->dts == AV_NOPTS_VALUE)
1020 pkt->dts = st->cur_dts;
1022 /* this is tricky: the dts must be incremented by the duration
1023 of the frame we are displaying, i.e. the last I- or P-frame */
1024 if (st->last_IP_duration == 0)
1025 st->last_IP_duration = pkt->duration;
1026 if(pkt->dts != AV_NOPTS_VALUE)
1027 st->cur_dts = pkt->dts + st->last_IP_duration;
1028 st->last_IP_duration = pkt->duration;
1029 st->last_IP_pts= pkt->pts;
1030 /* cannot compute PTS if not present (we can compute it only
1031 by knowing the future */
1032 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1033 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1034 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1035 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1036 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1037 pkt->pts += pkt->duration;
1038 // 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);
1042 /* presentation is not delayed : PTS and DTS are the same */
1043 if(pkt->pts == AV_NOPTS_VALUE)
1044 pkt->pts = pkt->dts;
1045 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1046 if(pkt->pts == AV_NOPTS_VALUE)
1047 pkt->pts = st->cur_dts;
1048 pkt->dts = pkt->pts;
1049 if(pkt->pts != AV_NOPTS_VALUE)
1050 st->cur_dts = pkt->pts + pkt->duration;
1054 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1055 st->pts_buffer[0]= pkt->pts;
1056 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1057 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1058 if(pkt->dts == AV_NOPTS_VALUE)
1059 pkt->dts= st->pts_buffer[0];
1060 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1061 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1063 if(pkt->dts > st->cur_dts)
1064 st->cur_dts = pkt->dts;
1067 // 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);
1070 if(is_intra_only(st->codec))
1071 pkt->flags |= AV_PKT_FLAG_KEY;
1074 /* keyframe computation */
1075 if (pc->key_frame == 1)
1076 pkt->flags |= AV_PKT_FLAG_KEY;
1077 else if (pc->key_frame == -1 && pc->pict_type == FF_I_TYPE)
1078 pkt->flags |= AV_PKT_FLAG_KEY;
1081 pkt->convergence_duration = pc->convergence_duration;
1085 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1090 av_init_packet(pkt);
1093 /* select current input stream component */
1096 if (!st->need_parsing || !st->parser) {
1097 /* no parsing needed: we just output the packet as is */
1098 /* raw data support */
1099 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
1100 compute_pkt_fields(s, st, NULL, pkt);
1102 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1103 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1104 ff_reduce_index(s, st->index);
1105 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1108 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1109 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1110 st->cur_ptr, st->cur_len,
1111 st->cur_pkt.pts, st->cur_pkt.dts,
1113 st->cur_pkt.pts = AV_NOPTS_VALUE;
1114 st->cur_pkt.dts = AV_NOPTS_VALUE;
1115 /* increment read pointer */
1119 /* return packet if any */
1123 pkt->stream_index = st->index;
1124 pkt->pts = st->parser->pts;
1125 pkt->dts = st->parser->dts;
1126 pkt->pos = st->parser->pos;
1127 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1129 pkt->destruct= st->cur_pkt.destruct;
1130 st->cur_pkt.destruct= NULL;
1131 st->cur_pkt.data = NULL;
1132 assert(st->cur_len == 0);
1134 pkt->destruct = NULL;
1136 compute_pkt_fields(s, st, st->parser, pkt);
1138 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1139 ff_reduce_index(s, st->index);
1140 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1141 0, 0, AVINDEX_KEYFRAME);
1148 av_free_packet(&st->cur_pkt);
1153 /* read next packet */
1154 ret = av_read_packet(s, &cur_pkt);
1156 if (ret == AVERROR(EAGAIN))
1158 /* return the last frames, if any */
1159 for(i = 0; i < s->nb_streams; i++) {
1161 if (st->parser && st->need_parsing) {
1162 av_parser_parse2(st->parser, st->codec,
1163 &pkt->data, &pkt->size,
1165 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1171 /* no more packets: really terminate parsing */
1174 st = s->streams[cur_pkt.stream_index];
1175 st->cur_pkt= cur_pkt;
1177 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1178 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1179 st->cur_pkt.pts < st->cur_pkt.dts){
1180 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1181 st->cur_pkt.stream_index,
1185 // av_free_packet(&st->cur_pkt);
1189 if(s->debug & FF_FDEBUG_TS)
1190 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1191 st->cur_pkt.stream_index,
1195 st->cur_pkt.duration,
1199 st->cur_ptr = st->cur_pkt.data;
1200 st->cur_len = st->cur_pkt.size;
1201 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1202 st->parser = av_parser_init(st->codec->codec_id);
1204 /* no parser available: just output the raw packets */
1205 st->need_parsing = AVSTREAM_PARSE_NONE;
1206 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1207 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1208 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1209 st->parser->flags |= PARSER_FLAG_ONCE;
1214 if(s->debug & FF_FDEBUG_TS)
1215 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1226 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1230 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1233 pktl = s->packet_buffer;
1235 AVPacket *next_pkt= &pktl->pkt;
1237 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1238 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1239 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1240 if( pktl->pkt.stream_index == next_pkt->stream_index
1241 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1242 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1243 next_pkt->pts= pktl->pkt.dts;
1247 pktl = s->packet_buffer;
1250 if( next_pkt->pts != AV_NOPTS_VALUE
1251 || next_pkt->dts == AV_NOPTS_VALUE
1253 /* read packet from packet buffer, if there is data */
1255 s->packet_buffer = pktl->next;
1261 int ret= av_read_frame_internal(s, pkt);
1263 if(pktl && ret != AVERROR(EAGAIN)){
1270 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1271 &s->packet_buffer_end)) < 0)
1272 return AVERROR(ENOMEM);
1274 assert(!s->packet_buffer);
1275 return av_read_frame_internal(s, pkt);
1280 /* XXX: suppress the packet queue */
1281 static void flush_packet_queue(AVFormatContext *s)
1286 pktl = s->packet_buffer;
1289 s->packet_buffer = pktl->next;
1290 av_free_packet(&pktl->pkt);
1293 while(s->raw_packet_buffer){
1294 pktl = s->raw_packet_buffer;
1295 s->raw_packet_buffer = pktl->next;
1296 av_free_packet(&pktl->pkt);
1299 s->packet_buffer_end=
1300 s->raw_packet_buffer_end= NULL;
1301 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1304 /*******************************************************/
1307 int av_find_default_stream_index(AVFormatContext *s)
1309 int first_audio_index = -1;
1313 if (s->nb_streams <= 0)
1315 for(i = 0; i < s->nb_streams; i++) {
1317 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1320 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1321 first_audio_index = i;
1323 return first_audio_index >= 0 ? first_audio_index : 0;
1327 * Flush the frame reader.
1329 void ff_read_frame_flush(AVFormatContext *s)
1334 flush_packet_queue(s);
1338 /* for each stream, reset read state */
1339 for(i = 0; i < s->nb_streams; i++) {
1343 av_parser_close(st->parser);
1345 av_free_packet(&st->cur_pkt);
1347 st->last_IP_pts = AV_NOPTS_VALUE;
1348 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1349 st->reference_dts = AV_NOPTS_VALUE;
1354 st->probe_packets = MAX_PROBE_PACKETS;
1356 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1357 st->pts_buffer[j]= AV_NOPTS_VALUE;
1361 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1364 for(i = 0; i < s->nb_streams; i++) {
1365 AVStream *st = s->streams[i];
1367 st->cur_dts = av_rescale(timestamp,
1368 st->time_base.den * (int64_t)ref_st->time_base.num,
1369 st->time_base.num * (int64_t)ref_st->time_base.den);
1373 void ff_reduce_index(AVFormatContext *s, int stream_index)
1375 AVStream *st= s->streams[stream_index];
1376 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1378 if((unsigned)st->nb_index_entries >= max_entries){
1380 for(i=0; 2*i<st->nb_index_entries; i++)
1381 st->index_entries[i]= st->index_entries[2*i];
1382 st->nb_index_entries= i;
1386 int ff_add_index_entry(AVIndexEntry **index_entries,
1387 int *nb_index_entries,
1388 unsigned int *index_entries_allocated_size,
1389 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1391 AVIndexEntry *entries, *ie;
1394 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1397 entries = av_fast_realloc(*index_entries,
1398 index_entries_allocated_size,
1399 (*nb_index_entries + 1) *
1400 sizeof(AVIndexEntry));
1404 *index_entries= entries;
1406 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1409 index= (*nb_index_entries)++;
1410 ie= &entries[index];
1411 assert(index==0 || ie[-1].timestamp < timestamp);
1413 ie= &entries[index];
1414 if(ie->timestamp != timestamp){
1415 if(ie->timestamp <= timestamp)
1417 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1418 (*nb_index_entries)++;
1419 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1420 distance= ie->min_distance;
1424 ie->timestamp = timestamp;
1425 ie->min_distance= distance;
1432 int av_add_index_entry(AVStream *st,
1433 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1435 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1436 &st->index_entries_allocated_size, pos,
1437 timestamp, size, distance, flags);
1440 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1441 int64_t wanted_timestamp, int flags)
1449 //optimize appending index entries at the end
1450 if(b && entries[b-1].timestamp < wanted_timestamp)
1455 timestamp = entries[m].timestamp;
1456 if(timestamp >= wanted_timestamp)
1458 if(timestamp <= wanted_timestamp)
1461 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1463 if(!(flags & AVSEEK_FLAG_ANY)){
1464 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1465 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1474 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1477 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1478 wanted_timestamp, flags);
1483 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1484 AVInputFormat *avif= s->iformat;
1485 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1486 int64_t ts_min, ts_max, ts;
1491 if (stream_index < 0)
1495 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1499 ts_min= AV_NOPTS_VALUE;
1500 pos_limit= -1; //gcc falsely says it may be uninitialized
1502 st= s->streams[stream_index];
1503 if(st->index_entries){
1506 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()
1507 index= FFMAX(index, 0);
1508 e= &st->index_entries[index];
1510 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1512 ts_min= e->timestamp;
1514 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1521 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1522 assert(index < st->nb_index_entries);
1524 e= &st->index_entries[index];
1525 assert(e->timestamp >= target_ts);
1527 ts_max= e->timestamp;
1528 pos_limit= pos_max - e->min_distance;
1530 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1531 pos_max,pos_limit, ts_max);
1536 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1541 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1544 av_update_cur_dts(s, st, ts);
1549 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 )){
1551 int64_t start_pos, filesize;
1555 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1558 if(ts_min == AV_NOPTS_VALUE){
1559 pos_min = s->data_offset;
1560 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1561 if (ts_min == AV_NOPTS_VALUE)
1565 if(ts_max == AV_NOPTS_VALUE){
1567 filesize = avio_size(s->pb);
1568 pos_max = filesize - 1;
1571 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1573 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1574 if (ts_max == AV_NOPTS_VALUE)
1578 int64_t tmp_pos= pos_max + 1;
1579 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1580 if(tmp_ts == AV_NOPTS_VALUE)
1584 if(tmp_pos >= filesize)
1590 if(ts_min > ts_max){
1592 }else if(ts_min == ts_max){
1597 while (pos_min < pos_limit) {
1599 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1603 assert(pos_limit <= pos_max);
1606 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1607 // interpolate position (better than dichotomy)
1608 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1609 + pos_min - approximate_keyframe_distance;
1610 }else if(no_change==1){
1611 // bisection, if interpolation failed to change min or max pos last time
1612 pos = (pos_min + pos_limit)>>1;
1614 /* linear search if bisection failed, can only happen if there
1615 are very few or no keyframes between min/max */
1620 else if(pos > pos_limit)
1624 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1630 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1631 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit,
1632 start_pos, no_change);
1634 if(ts == AV_NOPTS_VALUE){
1635 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1638 assert(ts != AV_NOPTS_VALUE);
1639 if (target_ts <= ts) {
1640 pos_limit = start_pos - 1;
1644 if (target_ts >= ts) {
1650 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1651 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1654 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1656 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1657 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1658 pos, ts_min, target_ts, ts_max);
1664 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1665 int64_t pos_min, pos_max;
1669 if (stream_index < 0)
1672 st= s->streams[stream_index];
1675 pos_min = s->data_offset;
1676 pos_max = avio_size(s->pb) - 1;
1678 if (pos < pos_min) pos= pos_min;
1679 else if(pos > pos_max) pos= pos_max;
1681 avio_seek(s->pb, pos, SEEK_SET);
1684 av_update_cur_dts(s, st, ts);
1689 static int av_seek_frame_generic(AVFormatContext *s,
1690 int stream_index, int64_t timestamp, int flags)
1697 st = s->streams[stream_index];
1699 index = av_index_search_timestamp(st, timestamp, flags);
1701 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1704 if(index < 0 || index==st->nb_index_entries-1){
1708 if(st->nb_index_entries){
1709 assert(st->index_entries);
1710 ie= &st->index_entries[st->nb_index_entries-1];
1711 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1713 av_update_cur_dts(s, st, ie->timestamp);
1715 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1721 ret = av_read_frame(s, &pkt);
1722 }while(ret == AVERROR(EAGAIN));
1725 av_free_packet(&pkt);
1726 if(stream_index == pkt.stream_index){
1727 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1731 index = av_index_search_timestamp(st, timestamp, flags);
1736 ff_read_frame_flush(s);
1737 if (s->iformat->read_seek){
1738 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1741 ie = &st->index_entries[index];
1742 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1744 av_update_cur_dts(s, st, ie->timestamp);
1749 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1754 ff_read_frame_flush(s);
1756 if(flags & AVSEEK_FLAG_BYTE)
1757 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1759 if(stream_index < 0){
1760 stream_index= av_find_default_stream_index(s);
1761 if(stream_index < 0)
1764 st= s->streams[stream_index];
1765 /* timestamp for default must be expressed in AV_TIME_BASE units */
1766 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1769 /* first, we try the format specific seek */
1770 if (s->iformat->read_seek)
1771 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1778 if(s->iformat->read_timestamp)
1779 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1781 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1784 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1786 if(min_ts > ts || max_ts < ts)
1789 ff_read_frame_flush(s);
1791 if (s->iformat->read_seek2)
1792 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1794 if(s->iformat->read_timestamp){
1795 //try to seek via read_timestamp()
1798 //Fallback to old API if new is not implemented but old is
1799 //Note the old has somewat different sematics
1800 if(s->iformat->read_seek || 1)
1801 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1803 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1806 /*******************************************************/
1809 * Return TRUE if the stream has accurate duration in any stream.
1811 * @return TRUE if the stream has accurate duration for at least one component.
1813 static int av_has_duration(AVFormatContext *ic)
1818 for(i = 0;i < ic->nb_streams; i++) {
1819 st = ic->streams[i];
1820 if (st->duration != AV_NOPTS_VALUE)
1827 * Estimate the stream timings from the one of each components.
1829 * Also computes the global bitrate if possible.
1831 static void av_update_stream_timings(AVFormatContext *ic)
1833 int64_t start_time, start_time1, end_time, end_time1;
1834 int64_t duration, duration1;
1838 start_time = INT64_MAX;
1839 end_time = INT64_MIN;
1840 duration = INT64_MIN;
1841 for(i = 0;i < ic->nb_streams; i++) {
1842 st = ic->streams[i];
1843 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1844 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1845 if (start_time1 < start_time)
1846 start_time = start_time1;
1847 if (st->duration != AV_NOPTS_VALUE) {
1848 end_time1 = start_time1
1849 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1850 if (end_time1 > end_time)
1851 end_time = end_time1;
1854 if (st->duration != AV_NOPTS_VALUE) {
1855 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1856 if (duration1 > duration)
1857 duration = duration1;
1860 if (start_time != INT64_MAX) {
1861 ic->start_time = start_time;
1862 if (end_time != INT64_MIN) {
1863 if (end_time - start_time > duration)
1864 duration = end_time - start_time;
1867 if (duration != INT64_MIN) {
1868 ic->duration = duration;
1869 if (ic->file_size > 0) {
1870 /* compute the bitrate */
1871 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1872 (double)ic->duration;
1877 static void fill_all_stream_timings(AVFormatContext *ic)
1882 av_update_stream_timings(ic);
1883 for(i = 0;i < ic->nb_streams; i++) {
1884 st = ic->streams[i];
1885 if (st->start_time == AV_NOPTS_VALUE) {
1886 if(ic->start_time != AV_NOPTS_VALUE)
1887 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1888 if(ic->duration != AV_NOPTS_VALUE)
1889 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1894 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1896 int64_t filesize, duration;
1900 /* if bit_rate is already set, we believe it */
1901 if (ic->bit_rate <= 0) {
1903 for(i=0;i<ic->nb_streams;i++) {
1904 st = ic->streams[i];
1905 if (st->codec->bit_rate > 0)
1906 bit_rate += st->codec->bit_rate;
1908 ic->bit_rate = bit_rate;
1911 /* if duration is already set, we believe it */
1912 if (ic->duration == AV_NOPTS_VALUE &&
1913 ic->bit_rate != 0 &&
1914 ic->file_size != 0) {
1915 filesize = ic->file_size;
1917 for(i = 0; i < ic->nb_streams; i++) {
1918 st = ic->streams[i];
1919 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1920 if (st->duration == AV_NOPTS_VALUE)
1921 st->duration = duration;
1927 #define DURATION_MAX_READ_SIZE 250000
1928 #define DURATION_MAX_RETRY 3
1930 /* only usable for MPEG-PS streams */
1931 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1933 AVPacket pkt1, *pkt = &pkt1;
1935 int read_size, i, ret;
1937 int64_t filesize, offset, duration;
1942 /* flush packet queue */
1943 flush_packet_queue(ic);
1945 for (i=0; i<ic->nb_streams; i++) {
1946 st = ic->streams[i];
1947 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1948 av_log(st->codec, AV_LOG_WARNING, "start time is not set in av_estimate_timings_from_pts\n");
1951 av_parser_close(st->parser);
1953 av_free_packet(&st->cur_pkt);
1957 /* estimate the end time (duration) */
1958 /* XXX: may need to support wrapping */
1959 filesize = ic->file_size;
1960 end_time = AV_NOPTS_VALUE;
1962 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
1966 avio_seek(ic->pb, offset, SEEK_SET);
1969 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
1973 ret = av_read_packet(ic, pkt);
1974 }while(ret == AVERROR(EAGAIN));
1977 read_size += pkt->size;
1978 st = ic->streams[pkt->stream_index];
1979 if (pkt->pts != AV_NOPTS_VALUE &&
1980 (st->start_time != AV_NOPTS_VALUE ||
1981 st->first_dts != AV_NOPTS_VALUE)) {
1982 duration = end_time = pkt->pts;
1983 if (st->start_time != AV_NOPTS_VALUE) duration -= st->start_time;
1984 else duration -= st->first_dts;
1986 duration += 1LL<<st->pts_wrap_bits;
1988 if (st->duration == AV_NOPTS_VALUE ||
1989 st->duration < duration)
1990 st->duration = duration;
1993 av_free_packet(pkt);
1995 }while( end_time==AV_NOPTS_VALUE
1996 && filesize > (DURATION_MAX_READ_SIZE<<retry)
1997 && ++retry <= DURATION_MAX_RETRY);
1999 fill_all_stream_timings(ic);
2001 avio_seek(ic->pb, old_offset, SEEK_SET);
2002 for (i=0; i<ic->nb_streams; i++) {
2004 st->cur_dts= st->first_dts;
2005 st->last_IP_pts = AV_NOPTS_VALUE;
2009 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
2013 /* get the file size, if possible */
2014 if (ic->iformat->flags & AVFMT_NOFILE) {
2017 file_size = avio_size(ic->pb);
2021 ic->file_size = file_size;
2023 if ((!strcmp(ic->iformat->name, "mpeg") ||
2024 !strcmp(ic->iformat->name, "mpegts")) &&
2025 file_size && !url_is_streamed(ic->pb)) {
2026 /* get accurate estimate from the PTSes */
2027 av_estimate_timings_from_pts(ic, old_offset);
2028 } else if (av_has_duration(ic)) {
2029 /* at least one component has timings - we use them for all
2031 fill_all_stream_timings(ic);
2033 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2034 /* less precise: use bitrate info */
2035 av_estimate_timings_from_bit_rate(ic);
2037 av_update_stream_timings(ic);
2043 for(i = 0;i < ic->nb_streams; i++) {
2044 st = ic->streams[i];
2045 printf("%d: start_time: %0.3f duration: %0.3f\n",
2046 i, (double)st->start_time / AV_TIME_BASE,
2047 (double)st->duration / AV_TIME_BASE);
2049 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2050 (double)ic->start_time / AV_TIME_BASE,
2051 (double)ic->duration / AV_TIME_BASE,
2052 ic->bit_rate / 1000);
2057 static int has_codec_parameters(AVCodecContext *enc)
2060 switch(enc->codec_type) {
2061 case AVMEDIA_TYPE_AUDIO:
2062 val = enc->sample_rate && enc->channels && enc->sample_fmt != AV_SAMPLE_FMT_NONE;
2063 if(!enc->frame_size &&
2064 (enc->codec_id == CODEC_ID_VORBIS ||
2065 enc->codec_id == CODEC_ID_AAC ||
2066 enc->codec_id == CODEC_ID_MP1 ||
2067 enc->codec_id == CODEC_ID_MP2 ||
2068 enc->codec_id == CODEC_ID_MP3 ||
2069 enc->codec_id == CODEC_ID_SPEEX))
2072 case AVMEDIA_TYPE_VIDEO:
2073 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
2079 return enc->codec_id != CODEC_ID_NONE && val != 0;
2082 static int has_decode_delay_been_guessed(AVStream *st)
2084 return st->codec->codec_id != CODEC_ID_H264 ||
2085 st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2088 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
2092 int got_picture, data_size, ret=0;
2095 if(!st->codec->codec){
2096 codec = avcodec_find_decoder(st->codec->codec_id);
2099 ret = avcodec_open(st->codec, codec);
2104 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st)){
2105 switch(st->codec->codec_type) {
2106 case AVMEDIA_TYPE_VIDEO:
2107 avcodec_get_frame_defaults(&picture);
2108 ret = avcodec_decode_video2(st->codec, &picture,
2109 &got_picture, avpkt);
2111 case AVMEDIA_TYPE_AUDIO:
2112 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2113 samples = av_malloc(data_size);
2116 ret = avcodec_decode_audio3(st->codec, samples,
2128 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2130 while (tags->id != CODEC_ID_NONE) {
2138 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2141 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2142 if(tag == tags[i].tag)
2145 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2146 if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2149 return CODEC_ID_NONE;
2152 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2155 for(i=0; tags && tags[i]; i++){
2156 int tag= ff_codec_get_tag(tags[i], id);
2162 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2165 for(i=0; tags && tags[i]; i++){
2166 enum CodecID id= ff_codec_get_id(tags[i], tag);
2167 if(id!=CODEC_ID_NONE) return id;
2169 return CODEC_ID_NONE;
2172 static void compute_chapters_end(AVFormatContext *s)
2175 int64_t max_time = s->duration + (s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time;
2177 for (i = 0; i < s->nb_chapters; i++)
2178 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2179 AVChapter *ch = s->chapters[i];
2180 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2183 for (j = 0; j < s->nb_chapters; j++) {
2184 AVChapter *ch1 = s->chapters[j];
2185 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2186 if (j != i && next_start > ch->start && next_start < end)
2189 ch->end = (end == INT64_MAX) ? ch->start : end;
2193 static int get_std_framerate(int i){
2194 if(i<60*12) return i*1001;
2195 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2199 * Is the time base unreliable.
2200 * This is a heuristic to balance between quick acceptance of the values in
2201 * the headers vs. some extra checks.
2202 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2203 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2204 * And there are "variable" fps files this needs to detect as well.
2206 static int tb_unreliable(AVCodecContext *c){
2207 if( c->time_base.den >= 101L*c->time_base.num
2208 || c->time_base.den < 5L*c->time_base.num
2209 /* || c->codec_tag == AV_RL32("DIVX")
2210 || c->codec_tag == AV_RL32("XVID")*/
2211 || c->codec_id == CODEC_ID_MPEG2VIDEO
2212 || c->codec_id == CODEC_ID_H264
2218 int av_find_stream_info(AVFormatContext *ic)
2220 int i, count, ret, read_size, j;
2222 AVPacket pkt1, *pkt;
2223 int64_t old_offset = avio_tell(ic->pb);
2225 for(i=0;i<ic->nb_streams;i++) {
2227 st = ic->streams[i];
2228 if (st->codec->codec_id == CODEC_ID_AAC) {
2229 st->codec->sample_rate = 0;
2230 st->codec->frame_size = 0;
2231 st->codec->channels = 0;
2233 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2234 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2235 /* if(!st->time_base.num)
2237 if(!st->codec->time_base.num)
2238 st->codec->time_base= st->time_base;
2240 //only for the split stuff
2241 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2242 st->parser = av_parser_init(st->codec->codec_id);
2243 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2244 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2247 assert(!st->codec->codec);
2248 codec = avcodec_find_decoder(st->codec->codec_id);
2250 /* Force decoding of at least one frame of codec data
2251 * this makes sure the codec initializes the channel configuration
2252 * and does not trust the values from the container.
2254 if (codec && codec->capabilities & CODEC_CAP_CHANNEL_CONF)
2255 st->codec->channels = 0;
2257 /* Ensure that subtitle_header is properly set. */
2258 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2259 && codec && !st->codec->codec)
2260 avcodec_open(st->codec, codec);
2262 //try to just open decoders, in case this is enough to get parameters
2263 if(!has_codec_parameters(st->codec)){
2264 if (codec && !st->codec->codec)
2265 avcodec_open(st->codec, codec);
2269 for (i=0; i<ic->nb_streams; i++) {
2270 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2276 if(url_interrupt_cb()){
2278 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2282 /* check if one codec still needs to be handled */
2283 for(i=0;i<ic->nb_streams;i++) {
2284 int fps_analyze_framecount = 20;
2286 st = ic->streams[i];
2287 if (!has_codec_parameters(st->codec))
2289 /* if the timebase is coarse (like the usual millisecond precision
2290 of mkv), we need to analyze more frames to reliably arrive at
2292 if (av_q2d(st->time_base) > 0.0005)
2293 fps_analyze_framecount *= 2;
2294 /* variable fps and no guess at the real fps */
2295 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2296 && st->info->duration_count < fps_analyze_framecount
2297 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2299 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2301 if(st->first_dts == AV_NOPTS_VALUE)
2304 if (i == ic->nb_streams) {
2305 /* NOTE: if the format has no header, then we need to read
2306 some packets to get most of the streams, so we cannot
2308 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2309 /* if we found the info for all the codecs, we can stop */
2311 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2315 /* we did not get all the codec info, but we read too much data */
2316 if (read_size >= ic->probesize) {
2318 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2322 /* NOTE: a new stream can be added there if no header in file
2323 (AVFMTCTX_NOHEADER) */
2324 ret = av_read_frame_internal(ic, &pkt1);
2325 if (ret < 0 && ret != AVERROR(EAGAIN)) {
2327 ret = -1; /* we could not have all the codec parameters before EOF */
2328 for(i=0;i<ic->nb_streams;i++) {
2329 st = ic->streams[i];
2330 if (!has_codec_parameters(st->codec)){
2332 avcodec_string(buf, sizeof(buf), st->codec, 0);
2333 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2341 if (ret == AVERROR(EAGAIN))
2344 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2345 if ((ret = av_dup_packet(pkt)) < 0)
2346 goto find_stream_info_err;
2348 read_size += pkt->size;
2350 st = ic->streams[pkt->stream_index];
2351 if (st->codec_info_nb_frames>1) {
2352 if (st->time_base.den > 0 && av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
2353 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2356 st->info->codec_info_duration += pkt->duration;
2359 int64_t last = st->info->last_dts;
2360 int64_t duration= pkt->dts - last;
2362 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2363 double dur= duration * av_q2d(st->time_base);
2365 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2366 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2367 if (st->info->duration_count < 2)
2368 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2369 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2370 int framerate= get_std_framerate(i);
2371 int ticks= lrintf(dur*framerate/(1001*12));
2372 double error= dur - ticks*1001*12/(double)framerate;
2373 st->info->duration_error[i] += error*error;
2375 st->info->duration_count++;
2376 // ignore the first 4 values, they might have some random jitter
2377 if (st->info->duration_count > 3)
2378 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2380 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2381 st->info->last_dts = pkt->dts;
2383 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2384 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2386 st->codec->extradata_size= i;
2387 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2388 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2389 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2393 /* if still no information, we try to open the codec and to
2394 decompress the frame. We try to avoid that in most cases as
2395 it takes longer and uses more memory. For MPEG-4, we need to
2396 decompress for QuickTime. */
2397 if (!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st))
2398 try_decode_frame(st, pkt);
2400 st->codec_info_nb_frames++;
2404 // close codecs which were opened in try_decode_frame()
2405 for(i=0;i<ic->nb_streams;i++) {
2406 st = ic->streams[i];
2407 if(st->codec->codec)
2408 avcodec_close(st->codec);
2410 for(i=0;i<ic->nb_streams;i++) {
2411 st = ic->streams[i];
2412 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2413 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2414 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2415 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2416 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2417 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
2418 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2420 // the check for tb_unreliable() is not completely correct, since this is not about handling
2421 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2422 // ipmovie.c produces.
2423 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
2424 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->info->duration_gcd, INT_MAX);
2425 if (st->info->duration_count && !st->r_frame_rate.num
2426 && tb_unreliable(st->codec) /*&&
2427 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2428 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2430 double best_error= 2*av_q2d(st->time_base);
2431 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2433 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2434 double error = st->info->duration_error[j] * get_std_framerate(j);
2435 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2436 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2437 if(error < best_error){
2439 num = get_std_framerate(j);
2442 // do not increase frame rate by more than 1 % in order to match a standard rate.
2443 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2444 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2447 if (!st->r_frame_rate.num){
2448 if( st->codec->time_base.den * (int64_t)st->time_base.num
2449 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2450 st->r_frame_rate.num = st->codec->time_base.den;
2451 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2453 st->r_frame_rate.num = st->time_base.den;
2454 st->r_frame_rate.den = st->time_base.num;
2457 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2458 if(!st->codec->bits_per_coded_sample)
2459 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2460 // set stream disposition based on audio service type
2461 switch (st->codec->audio_service_type) {
2462 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2463 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2464 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2465 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2466 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2467 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2468 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2469 st->disposition = AV_DISPOSITION_COMMENT; break;
2470 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2471 st->disposition = AV_DISPOSITION_KARAOKE; break;
2476 av_estimate_timings(ic, old_offset);
2478 compute_chapters_end(ic);
2481 /* correct DTS for B-frame streams with no timestamps */
2482 for(i=0;i<ic->nb_streams;i++) {
2483 st = ic->streams[i];
2484 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2486 ppktl = &ic->packet_buffer;
2488 if(ppkt1->stream_index != i)
2490 if(ppkt1->pkt->dts < 0)
2492 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2494 ppkt1->pkt->dts -= delta;
2499 st->cur_dts -= delta;
2505 find_stream_info_err:
2506 for (i=0; i < ic->nb_streams; i++)
2507 av_freep(&ic->streams[i]->info);
2511 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2515 for (i = 0; i < ic->nb_programs; i++)
2516 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2517 if (ic->programs[i]->stream_index[j] == s)
2518 return ic->programs[i];
2522 int av_find_best_stream(AVFormatContext *ic,
2523 enum AVMediaType type,
2524 int wanted_stream_nb,
2526 AVCodec **decoder_ret,
2529 int i, nb_streams = ic->nb_streams;
2530 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2531 unsigned *program = NULL;
2532 AVCodec *decoder = NULL, *best_decoder = NULL;
2534 if (related_stream >= 0 && wanted_stream_nb < 0) {
2535 AVProgram *p = find_program_from_stream(ic, related_stream);
2537 program = p->stream_index;
2538 nb_streams = p->nb_stream_indexes;
2541 for (i = 0; i < nb_streams; i++) {
2542 int real_stream_index = program ? program[i] : i;
2543 AVStream *st = ic->streams[real_stream_index];
2544 AVCodecContext *avctx = st->codec;
2545 if (avctx->codec_type != type)
2547 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2549 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2552 decoder = avcodec_find_decoder(st->codec->codec_id);
2555 ret = AVERROR_DECODER_NOT_FOUND;
2559 if (best_count >= st->codec_info_nb_frames)
2561 best_count = st->codec_info_nb_frames;
2562 ret = real_stream_index;
2563 best_decoder = decoder;
2564 if (program && i == nb_streams - 1 && ret < 0) {
2566 nb_streams = ic->nb_streams;
2567 i = 0; /* no related stream found, try again with everything */
2571 *decoder_ret = best_decoder;
2575 /*******************************************************/
2577 int av_read_play(AVFormatContext *s)
2579 if (s->iformat->read_play)
2580 return s->iformat->read_play(s);
2582 return ffio_read_pause(s->pb, 0);
2583 return AVERROR(ENOSYS);
2586 int av_read_pause(AVFormatContext *s)
2588 if (s->iformat->read_pause)
2589 return s->iformat->read_pause(s);
2591 return ffio_read_pause(s->pb, 1);
2592 return AVERROR(ENOSYS);
2595 void av_close_input_stream(AVFormatContext *s)
2597 flush_packet_queue(s);
2598 if (s->iformat->read_close)
2599 s->iformat->read_close(s);
2600 avformat_free_context(s);
2603 void avformat_free_context(AVFormatContext *s)
2608 for(i=0;i<s->nb_streams;i++) {
2609 /* free all data in a stream component */
2612 av_parser_close(st->parser);
2613 av_free_packet(&st->cur_pkt);
2615 av_metadata_free(&st->metadata);
2616 av_free(st->index_entries);
2617 av_free(st->codec->extradata);
2618 av_free(st->codec->subtitle_header);
2620 #if FF_API_OLD_METADATA
2621 av_free(st->filename);
2623 av_free(st->priv_data);
2627 for(i=s->nb_programs-1; i>=0; i--) {
2628 #if FF_API_OLD_METADATA
2629 av_freep(&s->programs[i]->provider_name);
2630 av_freep(&s->programs[i]->name);
2632 av_metadata_free(&s->programs[i]->metadata);
2633 av_freep(&s->programs[i]->stream_index);
2634 av_freep(&s->programs[i]);
2636 av_freep(&s->programs);
2637 av_freep(&s->priv_data);
2638 while(s->nb_chapters--) {
2639 #if FF_API_OLD_METADATA
2640 av_free(s->chapters[s->nb_chapters]->title);
2642 av_metadata_free(&s->chapters[s->nb_chapters]->metadata);
2643 av_free(s->chapters[s->nb_chapters]);
2645 av_freep(&s->chapters);
2646 av_metadata_free(&s->metadata);
2651 void av_close_input_file(AVFormatContext *s)
2653 AVIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2654 av_close_input_stream(s);
2659 AVStream *av_new_stream(AVFormatContext *s, int id)
2664 #if FF_API_MAX_STREAMS
2665 if (s->nb_streams >= MAX_STREAMS){
2666 av_log(s, AV_LOG_ERROR, "Too many streams\n");
2672 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2674 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2677 s->streams = streams;
2680 st = av_mallocz(sizeof(AVStream));
2683 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2688 st->codec= avcodec_alloc_context();
2690 /* no default bitrate if decoding */
2691 st->codec->bit_rate = 0;
2693 st->index = s->nb_streams;
2695 st->start_time = AV_NOPTS_VALUE;
2696 st->duration = AV_NOPTS_VALUE;
2697 /* we set the current DTS to 0 so that formats without any timestamps
2698 but durations get some timestamps, formats with some unknown
2699 timestamps have their first few packets buffered and the
2700 timestamps corrected before they are returned to the user */
2702 st->first_dts = AV_NOPTS_VALUE;
2703 st->probe_packets = MAX_PROBE_PACKETS;
2705 /* default pts setting is MPEG-like */
2706 av_set_pts_info(st, 33, 1, 90000);
2707 st->last_IP_pts = AV_NOPTS_VALUE;
2708 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2709 st->pts_buffer[i]= AV_NOPTS_VALUE;
2710 st->reference_dts = AV_NOPTS_VALUE;
2712 st->sample_aspect_ratio = (AVRational){0,1};
2714 s->streams[s->nb_streams++] = st;
2718 AVProgram *av_new_program(AVFormatContext *ac, int id)
2720 AVProgram *program=NULL;
2724 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2727 for(i=0; i<ac->nb_programs; i++)
2728 if(ac->programs[i]->id == id)
2729 program = ac->programs[i];
2732 program = av_mallocz(sizeof(AVProgram));
2735 dynarray_add(&ac->programs, &ac->nb_programs, program);
2736 program->discard = AVDISCARD_NONE;
2743 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2745 AVChapter *chapter = NULL;
2748 for(i=0; i<s->nb_chapters; i++)
2749 if(s->chapters[i]->id == id)
2750 chapter = s->chapters[i];
2753 chapter= av_mallocz(sizeof(AVChapter));
2756 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2758 #if FF_API_OLD_METADATA
2759 av_free(chapter->title);
2761 av_metadata_set2(&chapter->metadata, "title", title, 0);
2763 chapter->time_base= time_base;
2764 chapter->start = start;
2770 /************************************************************/
2771 /* output media file */
2773 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2777 if (s->oformat->priv_data_size > 0) {
2778 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2780 return AVERROR(ENOMEM);
2781 if (s->oformat->priv_class) {
2782 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2783 av_opt_set_defaults(s->priv_data);
2786 s->priv_data = NULL;
2788 if (s->oformat->set_parameters) {
2789 ret = s->oformat->set_parameters(s, ap);
2796 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2798 const AVCodecTag *avctag;
2800 enum CodecID id = CODEC_ID_NONE;
2801 unsigned int tag = 0;
2804 * Check that tag + id is in the table
2805 * If neither is in the table -> OK
2806 * If tag is in the table with another id -> FAIL
2807 * If id is in the table with another tag -> FAIL unless strict < normal
2809 for (n = 0; s->oformat->codec_tag[n]; n++) {
2810 avctag = s->oformat->codec_tag[n];
2811 while (avctag->id != CODEC_ID_NONE) {
2812 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2814 if (id == st->codec->codec_id)
2817 if (avctag->id == st->codec->codec_id)
2822 if (id != CODEC_ID_NONE)
2824 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2829 int av_write_header(AVFormatContext *s)
2834 // some sanity checks
2835 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2836 av_log(s, AV_LOG_ERROR, "no streams\n");
2837 return AVERROR(EINVAL);
2840 for(i=0;i<s->nb_streams;i++) {
2843 switch (st->codec->codec_type) {
2844 case AVMEDIA_TYPE_AUDIO:
2845 if(st->codec->sample_rate<=0){
2846 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2847 return AVERROR(EINVAL);
2849 if(!st->codec->block_align)
2850 st->codec->block_align = st->codec->channels *
2851 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2853 case AVMEDIA_TYPE_VIDEO:
2854 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2855 av_log(s, AV_LOG_ERROR, "time base not set\n");
2856 return AVERROR(EINVAL);
2858 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2859 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2860 return AVERROR(EINVAL);
2862 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2863 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2864 return AVERROR(EINVAL);
2869 if(s->oformat->codec_tag){
2870 if(st->codec->codec_tag && st->codec->codec_id == CODEC_ID_RAWVIDEO && av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id) == 0 && !validate_codec_tag(s, st)){
2871 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2872 st->codec->codec_tag= 0;
2874 if(st->codec->codec_tag){
2875 if (!validate_codec_tag(s, st)) {
2877 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2878 av_log(s, AV_LOG_ERROR,
2879 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
2880 tagbuf, st->codec->codec_tag, st->codec->codec_id);
2881 return AVERROR_INVALIDDATA;
2884 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2887 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2888 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2889 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2892 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2893 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2895 return AVERROR(ENOMEM);
2898 #if FF_API_OLD_METADATA
2899 ff_metadata_mux_compat(s);
2902 /* set muxer identification string */
2903 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2904 av_metadata_set2(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
2907 if(s->oformat->write_header){
2908 ret = s->oformat->write_header(s);
2913 /* init PTS generation */
2914 for(i=0;i<s->nb_streams;i++) {
2915 int64_t den = AV_NOPTS_VALUE;
2918 switch (st->codec->codec_type) {
2919 case AVMEDIA_TYPE_AUDIO:
2920 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2922 case AVMEDIA_TYPE_VIDEO:
2923 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2928 if (den != AV_NOPTS_VALUE) {
2930 return AVERROR_INVALIDDATA;
2931 av_frac_init(&st->pts, 0, 0, den);
2937 //FIXME merge with compute_pkt_fields
2938 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
2939 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2940 int num, den, frame_size, i;
2942 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
2943 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
2945 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2946 return AVERROR(EINVAL);*/
2948 /* duration field */
2949 if (pkt->duration == 0) {
2950 compute_frame_duration(&num, &den, st, NULL, pkt);
2952 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2956 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2959 //XXX/FIXME this is a temporary hack until all encoders output pts
2960 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2962 // pkt->pts= st->cur_dts;
2963 pkt->pts= st->pts.val;
2966 //calculate dts from pts
2967 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2968 st->pts_buffer[0]= pkt->pts;
2969 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2970 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
2971 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2972 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2974 pkt->dts= st->pts_buffer[0];
2977 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2978 av_log(s, AV_LOG_ERROR,
2979 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
2980 st->index, st->cur_dts, pkt->dts);
2981 return AVERROR(EINVAL);
2983 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2984 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
2985 return AVERROR(EINVAL);
2988 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2989 st->cur_dts= pkt->dts;
2990 st->pts.val= pkt->dts;
2993 switch (st->codec->codec_type) {
2994 case AVMEDIA_TYPE_AUDIO:
2995 frame_size = get_audio_frame_size(st->codec, pkt->size);
2997 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2998 likely equal to the encoder delay, but it would be better if we
2999 had the real timestamps from the encoder */
3000 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3001 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3004 case AVMEDIA_TYPE_VIDEO:
3005 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3013 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3015 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3017 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3020 ret= s->oformat->write_packet(s, pkt);
3022 ret= url_ferror(s->pb);
3026 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3027 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3029 AVPacketList **next_point, *this_pktl;
3031 this_pktl = av_mallocz(sizeof(AVPacketList));
3032 this_pktl->pkt= *pkt;
3033 pkt->destruct= NULL; // do not free original but only the copy
3034 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3036 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3037 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3039 next_point = &s->packet_buffer;
3042 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3043 while(!compare(s, &(*next_point)->pkt, pkt)){
3044 next_point= &(*next_point)->next;
3048 next_point = &(s->packet_buffer_end->next);
3051 assert(!*next_point);
3053 s->packet_buffer_end= this_pktl;
3056 this_pktl->next= *next_point;
3058 s->streams[pkt->stream_index]->last_in_packet_buffer=
3059 *next_point= this_pktl;
3062 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3064 AVStream *st = s->streams[ pkt ->stream_index];
3065 AVStream *st2= s->streams[ next->stream_index];
3066 int64_t a= st2->time_base.num * (int64_t)st ->time_base.den;
3067 int64_t b= st ->time_base.num * (int64_t)st2->time_base.den;
3068 return av_rescale_rnd(pkt->dts, b, a, AV_ROUND_DOWN) < next->dts;
3071 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3077 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3080 for(i=0; i < s->nb_streams; i++)
3081 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3083 if(stream_count && (s->nb_streams == stream_count || flush)){
3084 pktl= s->packet_buffer;
3087 s->packet_buffer= pktl->next;
3088 if(!s->packet_buffer)
3089 s->packet_buffer_end= NULL;
3091 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3092 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3096 av_init_packet(out);
3102 * Interleave an AVPacket correctly so it can be muxed.
3103 * @param out the interleaved packet will be output here
3104 * @param in the input packet
3105 * @param flush 1 if no further packets are available as input and all
3106 * remaining packets should be output
3107 * @return 1 if a packet was output, 0 if no packet could be output,
3108 * < 0 if an error occurred
3110 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3111 if(s->oformat->interleave_packet)
3112 return s->oformat->interleave_packet(s, out, in, flush);
3114 return av_interleave_packet_per_dts(s, out, in, flush);
3117 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3118 AVStream *st= s->streams[ pkt->stream_index];
3121 //FIXME/XXX/HACK drop zero sized packets
3122 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3125 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3126 pkt->size, pkt->dts, pkt->pts);
3127 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3130 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3131 return AVERROR(EINVAL);
3135 int ret= av_interleave_packet(s, &opkt, pkt, 0);
3136 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3139 ret= s->oformat->write_packet(s, &opkt);
3141 av_free_packet(&opkt);
3146 if(url_ferror(s->pb))
3147 return url_ferror(s->pb);
3151 int av_write_trailer(AVFormatContext *s)
3157 ret= av_interleave_packet(s, &pkt, NULL, 1);
3158 if(ret<0) //FIXME cleanup needed for ret<0 ?
3163 ret= s->oformat->write_packet(s, &pkt);
3165 av_free_packet(&pkt);
3169 if(url_ferror(s->pb))
3173 if(s->oformat->write_trailer)
3174 ret = s->oformat->write_trailer(s);
3177 ret=url_ferror(s->pb);
3178 for(i=0;i<s->nb_streams;i++) {
3179 av_freep(&s->streams[i]->priv_data);
3180 av_freep(&s->streams[i]->index_entries);
3182 av_freep(&s->priv_data);
3186 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3189 AVProgram *program=NULL;
3192 if (idx >= ac->nb_streams) {
3193 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3197 for(i=0; i<ac->nb_programs; i++){
3198 if(ac->programs[i]->id != progid)
3200 program = ac->programs[i];
3201 for(j=0; j<program->nb_stream_indexes; j++)
3202 if(program->stream_index[j] == idx)
3205 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3208 program->stream_index = tmp;
3209 program->stream_index[program->nb_stream_indexes++] = idx;
3214 static void print_fps(double d, const char *postfix){
3215 uint64_t v= lrintf(d*100);
3216 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3217 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3218 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3221 static void dump_metadata(void *ctx, AVMetadata *m, const char *indent)
3223 if(m && !(m->count == 1 && av_metadata_get(m, "language", NULL, 0))){
3224 AVMetadataTag *tag=NULL;
3226 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3227 while((tag=av_metadata_get(m, "", tag, AV_METADATA_IGNORE_SUFFIX))) {
3228 if(strcmp("language", tag->key))
3229 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
3234 /* "user interface" functions */
3235 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3238 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3239 AVStream *st = ic->streams[i];
3240 int g = av_gcd(st->time_base.num, st->time_base.den);
3241 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0);
3242 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3243 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3244 /* the pid is an important information, so we display it */
3245 /* XXX: add a generic system */
3246 if (flags & AVFMT_SHOW_IDS)
3247 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3249 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3250 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3251 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3252 if (st->sample_aspect_ratio.num && // default
3253 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3254 AVRational display_aspect_ratio;
3255 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3256 st->codec->width*st->sample_aspect_ratio.num,
3257 st->codec->height*st->sample_aspect_ratio.den,
3259 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3260 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3261 display_aspect_ratio.num, display_aspect_ratio.den);
3263 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3264 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3265 print_fps(av_q2d(st->avg_frame_rate), "fps");
3266 if(st->r_frame_rate.den && st->r_frame_rate.num)
3267 print_fps(av_q2d(st->r_frame_rate), "tbr");
3268 if(st->time_base.den && st->time_base.num)
3269 print_fps(1/av_q2d(st->time_base), "tbn");
3270 if(st->codec->time_base.den && st->codec->time_base.num)
3271 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3273 if (st->disposition & AV_DISPOSITION_DEFAULT)
3274 av_log(NULL, AV_LOG_INFO, " (default)");
3275 if (st->disposition & AV_DISPOSITION_DUB)
3276 av_log(NULL, AV_LOG_INFO, " (dub)");
3277 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3278 av_log(NULL, AV_LOG_INFO, " (original)");
3279 if (st->disposition & AV_DISPOSITION_COMMENT)
3280 av_log(NULL, AV_LOG_INFO, " (comment)");
3281 if (st->disposition & AV_DISPOSITION_LYRICS)
3282 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3283 if (st->disposition & AV_DISPOSITION_KARAOKE)
3284 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3285 if (st->disposition & AV_DISPOSITION_FORCED)
3286 av_log(NULL, AV_LOG_INFO, " (forced)");
3287 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3288 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3289 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3290 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3291 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3292 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3293 av_log(NULL, AV_LOG_INFO, "\n");
3294 dump_metadata(NULL, st->metadata, " ");
3297 #if FF_API_DUMP_FORMAT
3298 void dump_format(AVFormatContext *ic,
3303 av_dump_format(ic, index, url, is_output);
3307 void av_dump_format(AVFormatContext *ic,
3313 uint8_t *printed = av_mallocz(ic->nb_streams);
3314 if (ic->nb_streams && !printed)
3317 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3318 is_output ? "Output" : "Input",
3320 is_output ? ic->oformat->name : ic->iformat->name,
3321 is_output ? "to" : "from", url);
3322 dump_metadata(NULL, ic->metadata, " ");
3324 av_log(NULL, AV_LOG_INFO, " Duration: ");
3325 if (ic->duration != AV_NOPTS_VALUE) {
3326 int hours, mins, secs, us;
3327 secs = ic->duration / AV_TIME_BASE;
3328 us = ic->duration % AV_TIME_BASE;
3333 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3334 (100 * us) / AV_TIME_BASE);
3336 av_log(NULL, AV_LOG_INFO, "N/A");
3338 if (ic->start_time != AV_NOPTS_VALUE) {
3340 av_log(NULL, AV_LOG_INFO, ", start: ");
3341 secs = ic->start_time / AV_TIME_BASE;
3342 us = abs(ic->start_time % AV_TIME_BASE);
3343 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3344 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3346 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3348 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3350 av_log(NULL, AV_LOG_INFO, "N/A");
3352 av_log(NULL, AV_LOG_INFO, "\n");
3354 for (i = 0; i < ic->nb_chapters; i++) {
3355 AVChapter *ch = ic->chapters[i];
3356 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3357 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3358 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3360 dump_metadata(NULL, ch->metadata, " ");
3362 if(ic->nb_programs) {
3363 int j, k, total = 0;
3364 for(j=0; j<ic->nb_programs; j++) {
3365 AVMetadataTag *name = av_metadata_get(ic->programs[j]->metadata,
3367 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3368 name ? name->value : "");
3369 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3370 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3371 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3372 printed[ic->programs[j]->stream_index[k]] = 1;
3374 total += ic->programs[j]->nb_stream_indexes;
3376 if (total < ic->nb_streams)
3377 av_log(NULL, AV_LOG_INFO, " No Program\n");
3379 for(i=0;i<ic->nb_streams;i++)
3381 dump_stream_format(ic, i, index, is_output);
3386 #if FF_API_PARSE_FRAME_PARAM
3387 #include "libavutil/parseutils.h"
3389 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
3391 return av_parse_video_size(width_ptr, height_ptr, str);
3394 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
3396 AVRational frame_rate;
3397 int ret = av_parse_video_rate(&frame_rate, arg);
3398 *frame_rate_num= frame_rate.num;
3399 *frame_rate_den= frame_rate.den;
3404 int64_t av_gettime(void)
3407 gettimeofday(&tv,NULL);
3408 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3411 uint64_t ff_ntp_time(void)
3413 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3416 #if FF_API_PARSE_DATE
3417 #include "libavutil/parseutils.h"
3419 int64_t parse_date(const char *timestr, int duration)
3422 av_parse_time(&timeval, timestr, duration);
3427 #if FF_API_FIND_INFO_TAG
3428 #include "libavutil/parseutils.h"
3430 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3432 return av_find_info_tag(arg, arg_size, tag1, info);
3436 int av_get_frame_filename(char *buf, int buf_size,
3437 const char *path, int number)
3440 char *q, buf1[20], c;
3441 int nd, len, percentd_found;
3453 while (isdigit(*p)) {
3454 nd = nd * 10 + *p++ - '0';
3457 } while (isdigit(c));
3466 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3468 if ((q - buf + len) > buf_size - 1)
3470 memcpy(q, buf1, len);
3478 if ((q - buf) < buf_size - 1)
3482 if (!percentd_found)
3491 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3495 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3497 for(i=0;i<size;i+=16) {
3504 PRINT(" %02x", buf[i+j]);
3509 for(j=0;j<len;j++) {
3511 if (c < ' ' || c > '~')
3520 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3522 hex_dump_internal(NULL, f, 0, buf, size);
3525 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3527 hex_dump_internal(avcl, NULL, level, buf, size);
3530 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3533 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3534 PRINT("stream #%d:\n", pkt->stream_index);
3535 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3536 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3537 /* DTS is _always_ valid after av_read_frame() */
3539 if (pkt->dts == AV_NOPTS_VALUE)
3542 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3543 /* PTS may not be known if B-frames are present. */
3545 if (pkt->pts == AV_NOPTS_VALUE)
3548 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3550 PRINT(" size=%d\n", pkt->size);
3553 av_hex_dump(f, pkt->data, pkt->size);
3556 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3558 AVRational tb = { 1, AV_TIME_BASE };
3559 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3562 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3564 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3567 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3569 AVRational tb = { 1, AV_TIME_BASE };
3570 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3573 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3576 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3579 #if FF_API_URL_SPLIT
3580 attribute_deprecated
3581 void ff_url_split(char *proto, int proto_size,
3582 char *authorization, int authorization_size,
3583 char *hostname, int hostname_size,
3585 char *path, int path_size,
3588 av_url_split(proto, proto_size,
3589 authorization, authorization_size,
3590 hostname, hostname_size,
3597 void av_url_split(char *proto, int proto_size,
3598 char *authorization, int authorization_size,
3599 char *hostname, int hostname_size,
3601 char *path, int path_size,
3604 const char *p, *ls, *at, *col, *brk;
3606 if (port_ptr) *port_ptr = -1;
3607 if (proto_size > 0) proto[0] = 0;
3608 if (authorization_size > 0) authorization[0] = 0;
3609 if (hostname_size > 0) hostname[0] = 0;
3610 if (path_size > 0) path[0] = 0;
3612 /* parse protocol */
3613 if ((p = strchr(url, ':'))) {
3614 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3619 /* no protocol means plain filename */
3620 av_strlcpy(path, url, path_size);
3624 /* separate path from hostname */
3625 ls = strchr(p, '/');
3627 ls = strchr(p, '?');
3629 av_strlcpy(path, ls, path_size);
3631 ls = &p[strlen(p)]; // XXX
3633 /* the rest is hostname, use that to parse auth/port */
3635 /* authorization (user[:pass]@hostname) */
3636 if ((at = strchr(p, '@')) && at < ls) {
3637 av_strlcpy(authorization, p,
3638 FFMIN(authorization_size, at + 1 - p));
3639 p = at + 1; /* skip '@' */
3642 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3644 av_strlcpy(hostname, p + 1,
3645 FFMIN(hostname_size, brk - p));
3646 if (brk[1] == ':' && port_ptr)
3647 *port_ptr = atoi(brk + 2);
3648 } else if ((col = strchr(p, ':')) && col < ls) {
3649 av_strlcpy(hostname, p,
3650 FFMIN(col + 1 - p, hostname_size));
3651 if (port_ptr) *port_ptr = atoi(col + 1);
3653 av_strlcpy(hostname, p,
3654 FFMIN(ls + 1 - p, hostname_size));
3658 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3661 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3664 'C', 'D', 'E', 'F' };
3665 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3668 'c', 'd', 'e', 'f' };
3669 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3671 for(i = 0; i < s; i++) {
3672 buff[i * 2] = hex_table[src[i] >> 4];
3673 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3679 int ff_hex_to_data(uint8_t *data, const char *p)
3686 p += strspn(p, SPACE_CHARS);
3689 c = toupper((unsigned char) *p++);
3690 if (c >= '0' && c <= '9')
3692 else if (c >= 'A' && c <= 'F')
3707 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3708 unsigned int pts_num, unsigned int pts_den)
3711 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3712 if(new_tb.num != pts_num)
3713 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3715 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3717 if(new_tb.num <= 0 || new_tb.den <= 0) {
3718 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3721 s->time_base = new_tb;
3722 s->pts_wrap_bits = pts_wrap_bits;
3725 int ff_url_join(char *str, int size, const char *proto,
3726 const char *authorization, const char *hostname,
3727 int port, const char *fmt, ...)
3730 struct addrinfo hints, *ai;
3735 av_strlcatf(str, size, "%s://", proto);
3736 if (authorization && authorization[0])
3737 av_strlcatf(str, size, "%s@", authorization);
3738 #if CONFIG_NETWORK && defined(AF_INET6)
3739 /* Determine if hostname is a numerical IPv6 address,
3740 * properly escape it within [] in that case. */
3741 memset(&hints, 0, sizeof(hints));
3742 hints.ai_flags = AI_NUMERICHOST;
3743 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3744 if (ai->ai_family == AF_INET6) {
3745 av_strlcat(str, "[", size);
3746 av_strlcat(str, hostname, size);
3747 av_strlcat(str, "]", size);
3749 av_strlcat(str, hostname, size);
3754 /* Not an IPv6 address, just output the plain string. */
3755 av_strlcat(str, hostname, size);
3758 av_strlcatf(str, size, ":%d", port);
3761 int len = strlen(str);
3764 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3770 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3771 AVFormatContext *src)
3776 local_pkt.stream_index = dst_stream;
3777 if (pkt->pts != AV_NOPTS_VALUE)
3778 local_pkt.pts = av_rescale_q(pkt->pts,
3779 src->streams[pkt->stream_index]->time_base,
3780 dst->streams[dst_stream]->time_base);
3781 if (pkt->dts != AV_NOPTS_VALUE)
3782 local_pkt.dts = av_rescale_q(pkt->dts,
3783 src->streams[pkt->stream_index]->time_base,
3784 dst->streams[dst_stream]->time_base);
3785 return av_write_frame(dst, &local_pkt);
3788 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3791 const char *ptr = str;
3793 /* Parse key=value pairs. */
3796 char *dest = NULL, *dest_end;
3797 int key_len, dest_len = 0;
3799 /* Skip whitespace and potential commas. */
3800 while (*ptr && (isspace(*ptr) || *ptr == ','))
3807 if (!(ptr = strchr(key, '=')))
3810 key_len = ptr - key;
3812 callback_get_buf(context, key, key_len, &dest, &dest_len);
3813 dest_end = dest + dest_len - 1;
3817 while (*ptr && *ptr != '\"') {
3821 if (dest && dest < dest_end)
3825 if (dest && dest < dest_end)
3833 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3834 if (dest && dest < dest_end)
3842 int ff_find_stream_index(AVFormatContext *s, int id)
3845 for (i = 0; i < s->nb_streams; i++) {
3846 if (s->streams[i]->id == id)
3852 void ff_make_absolute_url(char *buf, int size, const char *base,
3856 /* Absolute path, relative to the current server */
3857 if (base && strstr(base, "://") && rel[0] == '/') {
3859 av_strlcpy(buf, base, size);
3860 sep = strstr(buf, "://");
3863 sep = strchr(sep, '/');
3867 av_strlcat(buf, rel, size);
3870 /* If rel actually is an absolute url, just copy it */
3871 if (!base || strstr(rel, "://") || rel[0] == '/') {
3872 av_strlcpy(buf, rel, size);
3876 av_strlcpy(buf, base, size);
3877 /* Remove the file name from the base url */
3878 sep = strrchr(buf, '/');
3883 while (av_strstart(rel, "../", NULL) && sep) {
3884 /* Remove the path delimiter at the end */
3886 sep = strrchr(buf, '/');
3887 /* If the next directory name to pop off is "..", break here */
3888 if (!strcmp(sep ? &sep[1] : buf, "..")) {
3889 /* Readd the slash we just removed */
3890 av_strlcat(buf, "/", size);
3893 /* Cut off the directory name */
3900 av_strlcat(buf, rel, size);