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 "libavcodec/raw.h"
29 #include "libavcodec/bytestream.h"
30 #include "libavutil/avassert.h"
31 #include "libavutil/opt.h"
32 #include "libavutil/dict.h"
33 #include "libavutil/pixdesc.h"
36 #include "libavutil/avstring.h"
37 #include "libavutil/mathematics.h"
38 #include "libavutil/parseutils.h"
40 #include "audiointerleave.h"
54 * various utility functions for use within FFmpeg
57 unsigned avformat_version(void)
59 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
60 return LIBAVFORMAT_VERSION_INT;
63 const char *avformat_configuration(void)
65 return FFMPEG_CONFIGURATION;
68 const char *avformat_license(void)
70 #define LICENSE_PREFIX "libavformat license: "
71 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
74 /* fraction handling */
77 * f = val + (num / den) + 0.5.
79 * 'num' is normalized so that it is such as 0 <= num < den.
81 * @param f fractional number
82 * @param val integer value
83 * @param num must be >= 0
84 * @param den must be >= 1
86 static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
99 * Fractional addition to f: f = f + (incr / f->den).
101 * @param f fractional number
102 * @param incr increment, can be positive or negative
104 static void frac_add(AVFrac *f, int64_t incr)
117 } else if (num >= den) {
124 /** head of registered input format linked list */
125 static AVInputFormat *first_iformat = NULL;
126 /** head of registered output format linked list */
127 static AVOutputFormat *first_oformat = NULL;
129 AVInputFormat *av_iformat_next(AVInputFormat *f)
131 if(f) return f->next;
132 else return first_iformat;
135 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
137 if(f) return f->next;
138 else return first_oformat;
141 void av_register_input_format(AVInputFormat *format)
145 while (*p != NULL) p = &(*p)->next;
150 void av_register_output_format(AVOutputFormat *format)
154 while (*p != NULL) p = &(*p)->next;
159 int av_match_ext(const char *filename, const char *extensions)
167 ext = strrchr(filename, '.');
173 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
176 if (!av_strcasecmp(ext1, ext))
186 static int match_format(const char *name, const char *names)
194 namelen = strlen(name);
195 while ((p = strchr(names, ','))) {
196 len = FFMAX(p - names, namelen);
197 if (!av_strncasecmp(name, names, len))
201 return !av_strcasecmp(name, names);
204 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
205 const char *mime_type)
207 AVOutputFormat *fmt = NULL, *fmt_found;
208 int score_max, score;
210 /* specific test for image sequences */
211 #if CONFIG_IMAGE2_MUXER
212 if (!short_name && filename &&
213 av_filename_number_test(filename) &&
214 ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
215 return av_guess_format("image2", NULL, NULL);
218 /* Find the proper file type. */
221 while ((fmt = av_oformat_next(fmt))) {
223 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
225 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
227 if (filename && fmt->extensions &&
228 av_match_ext(filename, fmt->extensions)) {
231 if (score > score_max) {
239 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
240 const char *filename, const char *mime_type, enum AVMediaType type){
241 if(type == AVMEDIA_TYPE_VIDEO){
242 enum CodecID codec_id= CODEC_ID_NONE;
244 #if CONFIG_IMAGE2_MUXER
245 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
246 codec_id= ff_guess_image2_codec(filename);
249 if(codec_id == CODEC_ID_NONE)
250 codec_id= fmt->video_codec;
252 }else if(type == AVMEDIA_TYPE_AUDIO)
253 return fmt->audio_codec;
254 else if (type == AVMEDIA_TYPE_SUBTITLE)
255 return fmt->subtitle_codec;
257 return CODEC_ID_NONE;
260 AVInputFormat *av_find_input_format(const char *short_name)
262 AVInputFormat *fmt = NULL;
263 while ((fmt = av_iformat_next(fmt))) {
264 if (match_format(short_name, fmt->name))
270 int ffio_limit(AVIOContext *s, int size)
273 int64_t remaining= s->maxsize - avio_tell(s);
274 if(remaining < size){
275 int64_t newsize= avio_size(s);
276 if(!s->maxsize || s->maxsize<newsize)
277 s->maxsize= newsize - !newsize;
278 remaining= s->maxsize - avio_tell(s);
279 remaining= FFMAX(remaining, 0);
282 if(s->maxsize>=0 && remaining+1 < size){
283 av_log(0, AV_LOG_ERROR, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
290 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
293 size= ffio_limit(s, size);
295 ret= av_new_packet(pkt, size);
300 pkt->pos= avio_tell(s);
302 ret= avio_read(s, pkt->data, size);
306 av_shrink_packet(pkt, ret);
311 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
316 return av_get_packet(s, pkt, size);
317 old_size = pkt->size;
318 ret = av_grow_packet(pkt, size);
321 ret = avio_read(s, pkt->data + old_size, size);
322 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
327 int av_filename_number_test(const char *filename)
330 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
333 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
335 AVProbeData lpd = *pd;
336 AVInputFormat *fmt1 = NULL, *fmt;
337 int score, nodat = 0, score_max=0;
339 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
340 int id3len = ff_id3v2_tag_len(lpd.buf);
341 if (lpd.buf_size > id3len + 16) {
343 lpd.buf_size -= id3len;
349 while ((fmt1 = av_iformat_next(fmt1))) {
350 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
353 if (fmt1->read_probe) {
354 score = fmt1->read_probe(&lpd);
355 if(fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
356 score = FFMAX(score, nodat ? AVPROBE_SCORE_MAX/4-1 : 1);
357 } else if (fmt1->extensions) {
358 if (av_match_ext(lpd.filename, fmt1->extensions)) {
362 if (score > score_max) {
365 }else if (score == score_max)
368 *score_ret= score_max;
373 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
376 AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
377 if(score_ret > *score_max){
378 *score_max= score_ret;
384 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
386 return av_probe_input_format2(pd, is_opened, &score);
389 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
391 static const struct {
392 const char *name; enum CodecID id; enum AVMediaType type;
394 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
395 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
396 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
397 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
398 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
399 { "loas" , CODEC_ID_AAC_LATM , AVMEDIA_TYPE_AUDIO },
400 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
401 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
402 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
406 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
410 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
411 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
412 for (i = 0; fmt_id_type[i].name; i++) {
413 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
414 st->codec->codec_id = fmt_id_type[i].id;
415 st->codec->codec_type = fmt_id_type[i].type;
423 /************************************************************/
424 /* input media file */
426 #if FF_API_FORMAT_PARAMETERS
427 static AVDictionary *convert_format_parameters(AVFormatParameters *ap)
430 AVDictionary *opts = NULL;
435 AV_NOWARN_DEPRECATED(
436 if (ap->time_base.num) {
437 snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
438 av_dict_set(&opts, "framerate", buf, 0);
440 if (ap->sample_rate) {
441 snprintf(buf, sizeof(buf), "%d", ap->sample_rate);
442 av_dict_set(&opts, "sample_rate", buf, 0);
445 snprintf(buf, sizeof(buf), "%d", ap->channels);
446 av_dict_set(&opts, "channels", buf, 0);
448 if (ap->width || ap->height) {
449 snprintf(buf, sizeof(buf), "%dx%d", ap->width, ap->height);
450 av_dict_set(&opts, "video_size", buf, 0);
452 if (ap->pix_fmt != PIX_FMT_NONE) {
453 av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(ap->pix_fmt), 0);
456 snprintf(buf, sizeof(buf), "%d", ap->channel);
457 av_dict_set(&opts, "channel", buf, 0);
460 av_dict_set(&opts, "standard", ap->standard, 0);
462 if (ap->mpeg2ts_compute_pcr) {
463 av_dict_set(&opts, "mpeg2ts_compute_pcr", "1", 0);
465 if (ap->initial_pause) {
466 av_dict_set(&opts, "initial_pause", "1", 0);
473 * Open a media file from an IO stream. 'fmt' must be specified.
475 int av_open_input_stream(AVFormatContext **ic_ptr,
476 AVIOContext *pb, const char *filename,
477 AVInputFormat *fmt, AVFormatParameters *ap)
482 AVFormatParameters default_ap;
486 memset(ap, 0, sizeof(default_ap));
488 opts = convert_format_parameters(ap);
490 AV_NOWARN_DEPRECATED(
491 if(!ap->prealloced_context)
492 *ic_ptr = ic = avformat_alloc_context();
497 err = AVERROR(ENOMEM);
500 if (pb && fmt && fmt->flags & AVFMT_NOFILE)
501 av_log(ic, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
502 "will be ignored with AVFMT_NOFILE format.\n");
506 if ((err = avformat_open_input(&ic, filename, fmt, &opts)) < 0)
508 ic->pb = ic->pb ? ic->pb : pb; // don't leak custom pb if it wasn't set above
517 int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap){
520 if (ic->iformat->read_header) {
521 err = ic->iformat->read_header(ic, ap);
526 if (ic->pb && !ic->data_offset)
527 ic->data_offset = avio_tell(ic->pb);
533 /** size of probe buffer, for guessing file type from file contents */
534 #define PROBE_BUF_MIN 2048
535 #define PROBE_BUF_MAX (1<<20)
537 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
538 const char *filename, void *logctx,
539 unsigned int offset, unsigned int max_probe_size)
541 AVProbeData pd = { filename ? filename : "", NULL, -offset };
542 unsigned char *buf = NULL;
543 int ret = 0, probe_size;
545 if (!max_probe_size) {
546 max_probe_size = PROBE_BUF_MAX;
547 } else if (max_probe_size > PROBE_BUF_MAX) {
548 max_probe_size = PROBE_BUF_MAX;
549 } else if (max_probe_size < PROBE_BUF_MIN) {
550 return AVERROR(EINVAL);
553 if (offset >= max_probe_size) {
554 return AVERROR(EINVAL);
557 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
558 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
559 int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
560 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
563 if (probe_size < offset) {
567 /* read probe data */
568 buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
571 return AVERROR(ENOMEM);
574 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
575 /* fail if error was not end of file, otherwise, lower score */
576 if (ret != AVERROR_EOF) {
581 ret = 0; /* error was end of file, nothing read */
584 pd.buf = &buf[offset];
586 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
588 /* guess file format */
589 *fmt = av_probe_input_format2(&pd, 1, &score);
591 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
592 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
594 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
600 return AVERROR_INVALIDDATA;
603 /* rewind. reuse probe buffer to avoid seeking */
604 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
610 #if FF_API_FORMAT_PARAMETERS
611 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
614 AVFormatParameters *ap)
617 AVDictionary *opts = convert_format_parameters(ap);
619 AV_NOWARN_DEPRECATED(
620 if (!ap || !ap->prealloced_context)
624 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
631 /* open input file and probe the format if necessary */
632 static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)
635 AVProbeData pd = {filename, NULL, 0};
638 s->flags |= AVFMT_FLAG_CUSTOM_IO;
640 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
641 else if (s->iformat->flags & AVFMT_NOFILE)
642 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
643 "will be ignored with AVFMT_NOFILE format.\n");
647 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
648 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
651 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ,
652 &s->interrupt_callback, options)) < 0)
656 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
659 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
661 AVFormatContext *s = *ps;
663 AVFormatParameters ap = { { 0 } };
664 AVDictionary *tmp = NULL;
666 if (!s && !(s = avformat_alloc_context()))
667 return AVERROR(ENOMEM);
672 av_dict_copy(&tmp, *options, 0);
674 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
677 if ((ret = init_input(s, filename, &tmp)) < 0)
680 /* check filename in case an image number is expected */
681 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
682 if (!av_filename_number_test(filename)) {
683 ret = AVERROR(EINVAL);
688 s->duration = s->start_time = AV_NOPTS_VALUE;
689 av_strlcpy(s->filename, filename, sizeof(s->filename));
691 /* allocate private data */
692 if (s->iformat->priv_data_size > 0) {
693 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
694 ret = AVERROR(ENOMEM);
697 if (s->iformat->priv_class) {
698 *(const AVClass**)s->priv_data = s->iformat->priv_class;
699 av_opt_set_defaults(s->priv_data);
700 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
705 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
707 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
709 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
710 if ((ret = s->iformat->read_header(s, &ap)) < 0)
713 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
714 s->data_offset = avio_tell(s->pb);
716 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
719 av_dict_free(options);
727 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
729 avformat_free_context(s);
734 /*******************************************************/
736 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
737 AVPacketList **plast_pktl){
738 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
743 (*plast_pktl)->next = pktl;
745 *packet_buffer = pktl;
747 /* add the packet in the buffered packet list */
753 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
759 AVPacketList *pktl = s->raw_packet_buffer;
763 if(s->streams[pkt->stream_index]->request_probe <= 0){
764 s->raw_packet_buffer = pktl->next;
765 s->raw_packet_buffer_remaining_size += pkt->size;
772 ret= s->iformat->read_packet(s, pkt);
774 if (!pktl || ret == AVERROR(EAGAIN))
776 for (i = 0; i < s->nb_streams; i++)
777 if(s->streams[i]->request_probe > 0)
778 s->streams[i]->request_probe = -1;
782 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
783 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
784 av_log(s, AV_LOG_WARNING,
785 "Dropped corrupted packet (stream = %d)\n",
791 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
792 av_packet_merge_side_data(pkt);
794 if(pkt->stream_index >= (unsigned)s->nb_streams){
795 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
799 st= s->streams[pkt->stream_index];
801 switch(st->codec->codec_type){
802 case AVMEDIA_TYPE_VIDEO:
803 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
805 case AVMEDIA_TYPE_AUDIO:
806 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
808 case AVMEDIA_TYPE_SUBTITLE:
809 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
813 if(!pktl && st->request_probe <= 0)
816 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
817 s->raw_packet_buffer_remaining_size -= pkt->size;
819 if(st->request_probe>0){
820 AVProbeData *pd = &st->probe_data;
822 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
825 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
826 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
827 pd->buf_size += pkt->size;
828 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
830 end= s->raw_packet_buffer_remaining_size <= 0
831 || st->probe_packets<=0;
833 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
834 int score= set_codec_from_probe_data(s, st, pd);
835 if( (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
839 st->request_probe= -1;
840 if(st->codec->codec_id != CODEC_ID_NONE){
841 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
843 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
850 /**********************************************************/
853 * Get the number of samples of an audio frame. Return -1 on error.
855 static int get_audio_frame_size(AVCodecContext *enc, int size)
859 if(enc->codec_id == CODEC_ID_VORBIS)
862 if (enc->frame_size <= 1) {
863 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
865 if (bits_per_sample) {
866 if (enc->channels == 0)
868 frame_size = (size << 3) / (bits_per_sample * enc->channels);
870 /* used for example by ADPCM codecs */
871 if (enc->bit_rate == 0)
873 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
876 frame_size = enc->frame_size;
883 * Return the frame duration in seconds. Return 0 if not available.
885 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
886 AVCodecParserContext *pc, AVPacket *pkt)
892 switch(st->codec->codec_type) {
893 case AVMEDIA_TYPE_VIDEO:
894 if (st->r_frame_rate.num && !pc) {
895 *pnum = st->r_frame_rate.den;
896 *pden = st->r_frame_rate.num;
897 } else if(st->time_base.num*1000LL > st->time_base.den) {
898 *pnum = st->time_base.num;
899 *pden = st->time_base.den;
900 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
901 *pnum = st->codec->time_base.num;
902 *pden = st->codec->time_base.den;
903 if (pc && pc->repeat_pict) {
904 *pnum = (*pnum) * (1 + pc->repeat_pict);
906 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
907 //Thus if we have no parser in such case leave duration undefined.
908 if(st->codec->ticks_per_frame>1 && !pc){
913 case AVMEDIA_TYPE_AUDIO:
914 frame_size = get_audio_frame_size(st->codec, pkt->size);
915 if (frame_size <= 0 || st->codec->sample_rate <= 0)
918 *pden = st->codec->sample_rate;
925 static int is_intra_only(AVCodecContext *enc){
926 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
928 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
929 switch(enc->codec_id){
931 case CODEC_ID_MJPEGB:
933 case CODEC_ID_PRORES:
934 case CODEC_ID_RAWVIDEO:
935 case CODEC_ID_DVVIDEO:
936 case CODEC_ID_HUFFYUV:
937 case CODEC_ID_FFVHUFF:
942 case CODEC_ID_JPEG2000:
950 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
951 int64_t dts, int64_t pts)
953 AVStream *st= s->streams[stream_index];
954 AVPacketList *pktl= s->packet_buffer;
956 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
959 st->first_dts= dts - st->cur_dts;
962 for(; pktl; pktl= pktl->next){
963 if(pktl->pkt.stream_index != stream_index)
965 //FIXME think more about this check
966 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
967 pktl->pkt.pts += st->first_dts;
969 if(pktl->pkt.dts != AV_NOPTS_VALUE)
970 pktl->pkt.dts += st->first_dts;
972 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
973 st->start_time= pktl->pkt.pts;
975 if (st->start_time == AV_NOPTS_VALUE)
976 st->start_time = pts;
979 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
981 AVPacketList *pktl= s->packet_buffer;
984 if(st->first_dts != AV_NOPTS_VALUE){
985 cur_dts= st->first_dts;
986 for(; pktl; pktl= pktl->next){
987 if(pktl->pkt.stream_index == pkt->stream_index){
988 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
990 cur_dts -= pkt->duration;
993 pktl= s->packet_buffer;
994 st->first_dts = cur_dts;
995 }else if(st->cur_dts)
998 for(; pktl; pktl= pktl->next){
999 if(pktl->pkt.stream_index != pkt->stream_index)
1001 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
1002 && !pktl->pkt.duration){
1003 pktl->pkt.dts= cur_dts;
1004 if(!st->codec->has_b_frames)
1005 pktl->pkt.pts= cur_dts;
1006 cur_dts += pkt->duration;
1007 pktl->pkt.duration= pkt->duration;
1011 if(st->first_dts == AV_NOPTS_VALUE)
1012 st->cur_dts= cur_dts;
1015 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1016 AVCodecParserContext *pc, AVPacket *pkt)
1018 int num, den, presentation_delayed, delay, i;
1021 if (s->flags & AVFMT_FLAG_NOFILLIN)
1024 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1025 pkt->dts= AV_NOPTS_VALUE;
1027 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
1028 //FIXME Set low_delay = 0 when has_b_frames = 1
1029 st->codec->has_b_frames = 1;
1031 /* do we have a video B-frame ? */
1032 delay= st->codec->has_b_frames;
1033 presentation_delayed = 0;
1035 /* XXX: need has_b_frame, but cannot get it if the codec is
1038 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1039 presentation_delayed = 1;
1041 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts - (1LL<<(st->pts_wrap_bits-1)) > pkt->pts && st->pts_wrap_bits<63){
1042 pkt->dts -= 1LL<<st->pts_wrap_bits;
1045 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
1046 // we take the conservative approach and discard both
1047 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
1048 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
1049 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1050 pkt->dts= AV_NOPTS_VALUE;
1053 if (pkt->duration == 0) {
1054 compute_frame_duration(&num, &den, st, pc, pkt);
1056 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1058 if(pkt->duration != 0 && s->packet_buffer)
1059 update_initial_durations(s, st, pkt);
1063 /* correct timestamps with byte offset if demuxers only have timestamps
1064 on packet boundaries */
1065 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1066 /* this will estimate bitrate based on this frame's duration and size */
1067 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1068 if(pkt->pts != AV_NOPTS_VALUE)
1070 if(pkt->dts != AV_NOPTS_VALUE)
1074 if (pc && pc->dts_sync_point >= 0) {
1075 // we have synchronization info from the parser
1076 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1078 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1079 if (pkt->dts != AV_NOPTS_VALUE) {
1080 // got DTS from the stream, update reference timestamp
1081 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1082 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1083 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1084 // compute DTS based on reference timestamp
1085 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1086 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1088 if (pc->dts_sync_point > 0)
1089 st->reference_dts = pkt->dts; // new reference
1093 /* This may be redundant, but it should not hurt. */
1094 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1095 presentation_delayed = 1;
1097 // 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);
1098 /* interpolate PTS and DTS if they are not present */
1099 //We skip H264 currently because delay and has_b_frames are not reliably set
1100 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1101 if (presentation_delayed) {
1102 /* DTS = decompression timestamp */
1103 /* PTS = presentation timestamp */
1104 if (pkt->dts == AV_NOPTS_VALUE)
1105 pkt->dts = st->last_IP_pts;
1106 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1107 if (pkt->dts == AV_NOPTS_VALUE)
1108 pkt->dts = st->cur_dts;
1110 /* this is tricky: the dts must be incremented by the duration
1111 of the frame we are displaying, i.e. the last I- or P-frame */
1112 if (st->last_IP_duration == 0)
1113 st->last_IP_duration = pkt->duration;
1114 if(pkt->dts != AV_NOPTS_VALUE)
1115 st->cur_dts = pkt->dts + st->last_IP_duration;
1116 st->last_IP_duration = pkt->duration;
1117 st->last_IP_pts= pkt->pts;
1118 /* cannot compute PTS if not present (we can compute it only
1119 by knowing the future */
1120 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1121 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1122 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1123 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1124 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1125 pkt->pts += pkt->duration;
1126 // 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);
1130 /* presentation is not delayed : PTS and DTS are the same */
1131 if(pkt->pts == AV_NOPTS_VALUE)
1132 pkt->pts = pkt->dts;
1133 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1134 if(pkt->pts == AV_NOPTS_VALUE)
1135 pkt->pts = st->cur_dts;
1136 pkt->dts = pkt->pts;
1137 if(pkt->pts != AV_NOPTS_VALUE)
1138 st->cur_dts = pkt->pts + pkt->duration;
1142 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1143 st->pts_buffer[0]= pkt->pts;
1144 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1145 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1146 if(pkt->dts == AV_NOPTS_VALUE)
1147 pkt->dts= st->pts_buffer[0];
1148 if(st->codec->codec_id == CODEC_ID_H264){ // we skipped it above so we try here
1149 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1151 if(pkt->dts > st->cur_dts)
1152 st->cur_dts = pkt->dts;
1155 // 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);
1158 if(is_intra_only(st->codec))
1159 pkt->flags |= AV_PKT_FLAG_KEY;
1162 /* keyframe computation */
1163 if (pc->key_frame == 1)
1164 pkt->flags |= AV_PKT_FLAG_KEY;
1165 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1166 pkt->flags |= AV_PKT_FLAG_KEY;
1169 pkt->convergence_duration = pc->convergence_duration;
1173 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1178 av_init_packet(pkt);
1181 /* select current input stream component */
1184 if (!st->need_parsing || !st->parser) {
1185 /* no parsing needed: we just output the packet as is */
1186 /* raw data support */
1188 st->cur_pkt.data= NULL;
1189 st->cur_pkt.side_data_elems = 0;
1190 st->cur_pkt.side_data = NULL;
1191 compute_pkt_fields(s, st, NULL, pkt);
1193 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1194 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1195 ff_reduce_index(s, st->index);
1196 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1199 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1200 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1201 st->cur_ptr, st->cur_len,
1202 st->cur_pkt.pts, st->cur_pkt.dts,
1204 st->cur_pkt.pts = AV_NOPTS_VALUE;
1205 st->cur_pkt.dts = AV_NOPTS_VALUE;
1206 /* increment read pointer */
1210 /* return packet if any */
1214 pkt->stream_index = st->index;
1215 pkt->pts = st->parser->pts;
1216 pkt->dts = st->parser->dts;
1217 pkt->pos = st->parser->pos;
1218 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1220 pkt->destruct= st->cur_pkt.destruct;
1221 st->cur_pkt.destruct= NULL;
1222 st->cur_pkt.data = NULL;
1223 assert(st->cur_len == 0);
1225 pkt->destruct = NULL;
1227 compute_pkt_fields(s, st, st->parser, pkt);
1229 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1230 int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
1231 ff_reduce_index(s, st->index);
1232 av_add_index_entry(st, pos, pkt->dts,
1233 0, 0, AVINDEX_KEYFRAME);
1240 av_free_packet(&st->cur_pkt);
1245 /* read next packet */
1246 ret = av_read_packet(s, &cur_pkt);
1248 if (ret == AVERROR(EAGAIN))
1250 /* return the last frames, if any */
1251 for(i = 0; i < s->nb_streams; i++) {
1253 if (st->parser && st->need_parsing) {
1254 av_parser_parse2(st->parser, st->codec,
1255 &pkt->data, &pkt->size,
1257 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1263 /* no more packets: really terminate parsing */
1266 st = s->streams[cur_pkt.stream_index];
1267 st->cur_pkt= cur_pkt;
1269 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1270 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1271 st->cur_pkt.pts < st->cur_pkt.dts){
1272 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1273 st->cur_pkt.stream_index,
1277 // av_free_packet(&st->cur_pkt);
1281 if(s->debug & FF_FDEBUG_TS)
1282 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1283 st->cur_pkt.stream_index,
1287 st->cur_pkt.duration,
1291 st->cur_ptr = st->cur_pkt.data;
1292 st->cur_len = st->cur_pkt.size;
1293 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1294 st->parser = av_parser_init(st->codec->codec_id);
1296 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1297 "%s, packets or times may be invalid.\n",
1298 avcodec_get_name(st->codec->codec_id));
1299 /* no parser available: just output the raw packets */
1300 st->need_parsing = AVSTREAM_PARSE_NONE;
1301 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1302 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1303 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1304 st->parser->flags |= PARSER_FLAG_ONCE;
1309 if(s->debug & FF_FDEBUG_TS)
1310 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1321 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1325 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1328 pktl = s->packet_buffer;
1330 AVPacket *next_pkt= &pktl->pkt;
1332 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1333 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1334 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1335 if( pktl->pkt.stream_index == next_pkt->stream_index
1336 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1337 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1338 next_pkt->pts= pktl->pkt.dts;
1342 pktl = s->packet_buffer;
1345 if( next_pkt->pts != AV_NOPTS_VALUE
1346 || next_pkt->dts == AV_NOPTS_VALUE
1348 /* read packet from packet buffer, if there is data */
1350 s->packet_buffer = pktl->next;
1356 int ret= read_frame_internal(s, pkt);
1358 if(pktl && ret != AVERROR(EAGAIN)){
1365 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1366 &s->packet_buffer_end)) < 0)
1367 return AVERROR(ENOMEM);
1369 assert(!s->packet_buffer);
1370 return read_frame_internal(s, pkt);
1375 /* XXX: suppress the packet queue */
1376 static void flush_packet_queue(AVFormatContext *s)
1381 pktl = s->packet_buffer;
1384 s->packet_buffer = pktl->next;
1385 av_free_packet(&pktl->pkt);
1388 while(s->raw_packet_buffer){
1389 pktl = s->raw_packet_buffer;
1390 s->raw_packet_buffer = pktl->next;
1391 av_free_packet(&pktl->pkt);
1394 s->packet_buffer_end=
1395 s->raw_packet_buffer_end= NULL;
1396 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1399 /*******************************************************/
1402 int av_find_default_stream_index(AVFormatContext *s)
1404 int first_audio_index = -1;
1408 if (s->nb_streams <= 0)
1410 for(i = 0; i < s->nb_streams; i++) {
1412 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1415 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1416 first_audio_index = i;
1418 return first_audio_index >= 0 ? first_audio_index : 0;
1422 * Flush the frame reader.
1424 void ff_read_frame_flush(AVFormatContext *s)
1429 flush_packet_queue(s);
1433 /* for each stream, reset read state */
1434 for(i = 0; i < s->nb_streams; i++) {
1438 av_parser_close(st->parser);
1440 av_free_packet(&st->cur_pkt);
1442 st->last_IP_pts = AV_NOPTS_VALUE;
1443 if(st->first_dts == AV_NOPTS_VALUE) st->cur_dts = 0;
1444 else st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1445 st->reference_dts = AV_NOPTS_VALUE;
1450 st->probe_packets = MAX_PROBE_PACKETS;
1452 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1453 st->pts_buffer[j]= AV_NOPTS_VALUE;
1457 #if FF_API_SEEK_PUBLIC
1458 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1460 ff_update_cur_dts(s, ref_st, timestamp);
1464 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1468 for(i = 0; i < s->nb_streams; i++) {
1469 AVStream *st = s->streams[i];
1471 st->cur_dts = av_rescale(timestamp,
1472 st->time_base.den * (int64_t)ref_st->time_base.num,
1473 st->time_base.num * (int64_t)ref_st->time_base.den);
1477 void ff_reduce_index(AVFormatContext *s, int stream_index)
1479 AVStream *st= s->streams[stream_index];
1480 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1482 if((unsigned)st->nb_index_entries >= max_entries){
1484 for(i=0; 2*i<st->nb_index_entries; i++)
1485 st->index_entries[i]= st->index_entries[2*i];
1486 st->nb_index_entries= i;
1490 int ff_add_index_entry(AVIndexEntry **index_entries,
1491 int *nb_index_entries,
1492 unsigned int *index_entries_allocated_size,
1493 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1495 AVIndexEntry *entries, *ie;
1498 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1501 entries = av_fast_realloc(*index_entries,
1502 index_entries_allocated_size,
1503 (*nb_index_entries + 1) *
1504 sizeof(AVIndexEntry));
1508 *index_entries= entries;
1510 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1513 index= (*nb_index_entries)++;
1514 ie= &entries[index];
1515 assert(index==0 || ie[-1].timestamp < timestamp);
1517 ie= &entries[index];
1518 if(ie->timestamp != timestamp){
1519 if(ie->timestamp <= timestamp)
1521 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1522 (*nb_index_entries)++;
1523 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1524 distance= ie->min_distance;
1528 ie->timestamp = timestamp;
1529 ie->min_distance= distance;
1536 int av_add_index_entry(AVStream *st,
1537 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1539 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1540 &st->index_entries_allocated_size, pos,
1541 timestamp, size, distance, flags);
1544 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1545 int64_t wanted_timestamp, int flags)
1553 //optimize appending index entries at the end
1554 if(b && entries[b-1].timestamp < wanted_timestamp)
1559 timestamp = entries[m].timestamp;
1560 if(timestamp >= wanted_timestamp)
1562 if(timestamp <= wanted_timestamp)
1565 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1567 if(!(flags & AVSEEK_FLAG_ANY)){
1568 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1569 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1578 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1581 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1582 wanted_timestamp, flags);
1585 #if FF_API_SEEK_PUBLIC
1586 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1587 return ff_seek_frame_binary(s, stream_index, target_ts, flags);
1591 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
1593 AVInputFormat *avif= s->iformat;
1594 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1595 int64_t ts_min, ts_max, ts;
1600 if (stream_index < 0)
1603 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1606 ts_min= AV_NOPTS_VALUE;
1607 pos_limit= -1; //gcc falsely says it may be uninitialized
1609 st= s->streams[stream_index];
1610 if(st->index_entries){
1613 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()
1614 index= FFMAX(index, 0);
1615 e= &st->index_entries[index];
1617 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1619 ts_min= e->timestamp;
1620 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1626 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1627 assert(index < st->nb_index_entries);
1629 e= &st->index_entries[index];
1630 assert(e->timestamp >= target_ts);
1632 ts_max= e->timestamp;
1633 pos_limit= pos_max - e->min_distance;
1634 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1635 pos_max,pos_limit, ts_max);
1639 pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1644 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1647 ff_read_frame_flush(s);
1648 ff_update_cur_dts(s, st, ts);
1653 #if FF_API_SEEK_PUBLIC
1654 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1655 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1656 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1657 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1659 return ff_gen_search(s, stream_index, target_ts, pos_min, pos_max,
1660 pos_limit, ts_min, ts_max, flags, ts_ret,
1665 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1666 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1667 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1668 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1671 int64_t start_pos, filesize;
1674 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1676 if(ts_min == AV_NOPTS_VALUE){
1677 pos_min = s->data_offset;
1678 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1679 if (ts_min == AV_NOPTS_VALUE)
1683 if(ts_min >= target_ts){
1688 if(ts_max == AV_NOPTS_VALUE){
1690 filesize = avio_size(s->pb);
1691 pos_max = filesize - 1;
1694 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1696 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1697 if (ts_max == AV_NOPTS_VALUE)
1701 int64_t tmp_pos= pos_max + 1;
1702 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1703 if(tmp_ts == AV_NOPTS_VALUE)
1707 if(tmp_pos >= filesize)
1713 if(ts_max <= target_ts){
1718 if(ts_min > ts_max){
1720 }else if(ts_min == ts_max){
1725 while (pos_min < pos_limit) {
1726 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1727 pos_min, pos_max, ts_min, ts_max);
1728 assert(pos_limit <= pos_max);
1731 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1732 // interpolate position (better than dichotomy)
1733 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1734 + pos_min - approximate_keyframe_distance;
1735 }else if(no_change==1){
1736 // bisection, if interpolation failed to change min or max pos last time
1737 pos = (pos_min + pos_limit)>>1;
1739 /* linear search if bisection failed, can only happen if there
1740 are very few or no keyframes between min/max */
1745 else if(pos > pos_limit)
1749 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1754 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1755 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1756 pos_limit, start_pos, no_change);
1757 if(ts == AV_NOPTS_VALUE){
1758 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1761 assert(ts != AV_NOPTS_VALUE);
1762 if (target_ts <= ts) {
1763 pos_limit = start_pos - 1;
1767 if (target_ts >= ts) {
1773 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1774 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1777 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1779 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1780 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1781 pos, ts_min, target_ts, ts_max);
1787 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1788 int64_t pos_min, pos_max;
1792 if (stream_index < 0)
1795 st= s->streams[stream_index];
1798 pos_min = s->data_offset;
1799 pos_max = avio_size(s->pb) - 1;
1801 if (pos < pos_min) pos= pos_min;
1802 else if(pos > pos_max) pos= pos_max;
1804 avio_seek(s->pb, pos, SEEK_SET);
1807 av_update_cur_dts(s, st, ts);
1812 static int seek_frame_generic(AVFormatContext *s,
1813 int stream_index, int64_t timestamp, int flags)
1820 st = s->streams[stream_index];
1822 index = av_index_search_timestamp(st, timestamp, flags);
1824 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1827 if(index < 0 || index==st->nb_index_entries-1){
1831 if(st->nb_index_entries){
1832 assert(st->index_entries);
1833 ie= &st->index_entries[st->nb_index_entries-1];
1834 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1836 ff_update_cur_dts(s, st, ie->timestamp);
1838 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1844 read_status = av_read_frame(s, &pkt);
1845 } while (read_status == AVERROR(EAGAIN));
1846 if (read_status < 0)
1848 av_free_packet(&pkt);
1849 if(stream_index == pkt.stream_index && pkt.dts > timestamp){
1850 if(pkt.flags & AV_PKT_FLAG_KEY)
1852 if(nonkey++ > 1000 && st->codec->codec_id != CODEC_ID_CDGRAPHICS){
1853 av_log(s, AV_LOG_ERROR,"seek_frame_generic failed as this stream seems to contain no keyframes after the target timestamp, %d non keyframes found\n", nonkey);
1858 index = av_index_search_timestamp(st, timestamp, flags);
1863 ff_read_frame_flush(s);
1864 AV_NOWARN_DEPRECATED(
1865 if (s->iformat->read_seek){
1866 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1870 ie = &st->index_entries[index];
1871 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1873 ff_update_cur_dts(s, st, ie->timestamp);
1878 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1883 if (flags & AVSEEK_FLAG_BYTE) {
1884 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1886 ff_read_frame_flush(s);
1887 return seek_frame_byte(s, stream_index, timestamp, flags);
1890 if(stream_index < 0){
1891 stream_index= av_find_default_stream_index(s);
1892 if(stream_index < 0)
1895 st= s->streams[stream_index];
1896 /* timestamp for default must be expressed in AV_TIME_BASE units */
1897 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1900 /* first, we try the format specific seek */
1901 AV_NOWARN_DEPRECATED(
1902 if (s->iformat->read_seek) {
1903 ff_read_frame_flush(s);
1904 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1912 if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1913 ff_read_frame_flush(s);
1914 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1915 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1916 ff_read_frame_flush(s);
1917 return seek_frame_generic(s, stream_index, timestamp, flags);
1923 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1925 if(min_ts > ts || max_ts < ts)
1928 if (s->iformat->read_seek2) {
1929 ff_read_frame_flush(s);
1930 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1933 if(s->iformat->read_timestamp){
1934 //try to seek via read_timestamp()
1937 //Fallback to old API if new is not implemented but old is
1938 //Note the old has somewat different sematics
1939 AV_NOWARN_DEPRECATED(
1940 if(s->iformat->read_seek || 1)
1941 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1944 // try some generic seek like seek_frame_generic() but with new ts semantics
1947 /*******************************************************/
1950 * Return TRUE if the stream has accurate duration in any stream.
1952 * @return TRUE if the stream has accurate duration for at least one component.
1954 static int has_duration(AVFormatContext *ic)
1958 if(ic->duration != AV_NOPTS_VALUE)
1961 for(i = 0;i < ic->nb_streams; i++) {
1962 st = ic->streams[i];
1963 if (st->duration != AV_NOPTS_VALUE)
1970 * Estimate the stream timings from the one of each components.
1972 * Also computes the global bitrate if possible.
1974 static void update_stream_timings(AVFormatContext *ic)
1976 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1977 int64_t duration, duration1, filesize;
1981 start_time = INT64_MAX;
1982 start_time_text = INT64_MAX;
1983 end_time = INT64_MIN;
1984 duration = INT64_MIN;
1985 for(i = 0;i < ic->nb_streams; i++) {
1986 st = ic->streams[i];
1987 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1988 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1989 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1990 if (start_time1 < start_time_text)
1991 start_time_text = start_time1;
1993 start_time = FFMIN(start_time, start_time1);
1994 if (st->duration != AV_NOPTS_VALUE) {
1995 end_time1 = start_time1
1996 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1997 end_time = FFMAX(end_time, end_time1);
2000 if (st->duration != AV_NOPTS_VALUE) {
2001 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
2002 duration = FFMAX(duration, duration1);
2005 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2006 start_time = start_time_text;
2007 if (start_time != INT64_MAX) {
2008 ic->start_time = start_time;
2009 if (end_time != INT64_MIN)
2010 duration = FFMAX(duration, end_time - start_time);
2012 if (duration != INT64_MIN && ic->duration == AV_NOPTS_VALUE) {
2013 ic->duration = duration;
2015 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
2016 /* compute the bitrate */
2017 ic->bit_rate = (double)filesize * 8.0 * AV_TIME_BASE /
2018 (double)ic->duration;
2022 static void fill_all_stream_timings(AVFormatContext *ic)
2027 update_stream_timings(ic);
2028 for(i = 0;i < ic->nb_streams; i++) {
2029 st = ic->streams[i];
2030 if (st->start_time == AV_NOPTS_VALUE) {
2031 if(ic->start_time != AV_NOPTS_VALUE)
2032 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
2033 if(ic->duration != AV_NOPTS_VALUE)
2034 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
2039 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2041 int64_t filesize, duration;
2045 /* if bit_rate is already set, we believe it */
2046 if (ic->bit_rate <= 0) {
2048 for(i=0;i<ic->nb_streams;i++) {
2049 st = ic->streams[i];
2050 if (st->codec->bit_rate > 0)
2051 bit_rate += st->codec->bit_rate;
2053 ic->bit_rate = bit_rate;
2056 /* if duration is already set, we believe it */
2057 if (ic->duration == AV_NOPTS_VALUE &&
2058 ic->bit_rate != 0) {
2059 filesize = ic->pb ? avio_size(ic->pb) : 0;
2061 for(i = 0; i < ic->nb_streams; i++) {
2062 st = ic->streams[i];
2063 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
2064 if (st->duration == AV_NOPTS_VALUE)
2065 st->duration = duration;
2071 #define DURATION_MAX_READ_SIZE 250000
2072 #define DURATION_MAX_RETRY 3
2074 /* only usable for MPEG-PS streams */
2075 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2077 AVPacket pkt1, *pkt = &pkt1;
2079 int read_size, i, ret;
2081 int64_t filesize, offset, duration;
2086 /* flush packet queue */
2087 flush_packet_queue(ic);
2089 for (i=0; i<ic->nb_streams; i++) {
2090 st = ic->streams[i];
2091 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
2092 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2095 av_parser_close(st->parser);
2097 av_free_packet(&st->cur_pkt);
2101 /* estimate the end time (duration) */
2102 /* XXX: may need to support wrapping */
2103 filesize = ic->pb ? avio_size(ic->pb) : 0;
2104 end_time = AV_NOPTS_VALUE;
2106 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2110 avio_seek(ic->pb, offset, SEEK_SET);
2113 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2117 ret = av_read_packet(ic, pkt);
2118 } while(ret == AVERROR(EAGAIN));
2121 read_size += pkt->size;
2122 st = ic->streams[pkt->stream_index];
2123 if (pkt->pts != AV_NOPTS_VALUE &&
2124 (st->start_time != AV_NOPTS_VALUE ||
2125 st->first_dts != AV_NOPTS_VALUE)) {
2126 duration = end_time = pkt->pts;
2127 if (st->start_time != AV_NOPTS_VALUE)
2128 duration -= st->start_time;
2130 duration -= st->first_dts;
2132 duration += 1LL<<st->pts_wrap_bits;
2134 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2135 st->duration = duration;
2138 av_free_packet(pkt);
2140 }while( end_time==AV_NOPTS_VALUE
2141 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2142 && ++retry <= DURATION_MAX_RETRY);
2144 fill_all_stream_timings(ic);
2146 avio_seek(ic->pb, old_offset, SEEK_SET);
2147 for (i=0; i<ic->nb_streams; i++) {
2149 st->cur_dts= st->first_dts;
2150 st->last_IP_pts = AV_NOPTS_VALUE;
2151 st->reference_dts = AV_NOPTS_VALUE;
2155 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2159 /* get the file size, if possible */
2160 if (ic->iformat->flags & AVFMT_NOFILE) {
2163 file_size = avio_size(ic->pb);
2164 file_size = FFMAX(0, file_size);
2167 if ((!strcmp(ic->iformat->name, "mpeg") ||
2168 !strcmp(ic->iformat->name, "mpegts")) &&
2169 file_size && ic->pb->seekable) {
2170 /* get accurate estimate from the PTSes */
2171 estimate_timings_from_pts(ic, old_offset);
2172 } else if (has_duration(ic)) {
2173 /* at least one component has timings - we use them for all
2175 fill_all_stream_timings(ic);
2177 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2178 /* less precise: use bitrate info */
2179 estimate_timings_from_bit_rate(ic);
2181 update_stream_timings(ic);
2185 AVStream av_unused *st;
2186 for(i = 0;i < ic->nb_streams; i++) {
2187 st = ic->streams[i];
2188 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2189 (double) st->start_time / AV_TIME_BASE,
2190 (double) st->duration / AV_TIME_BASE);
2192 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2193 (double) ic->start_time / AV_TIME_BASE,
2194 (double) ic->duration / AV_TIME_BASE,
2195 ic->bit_rate / 1000);
2199 static int has_codec_parameters(AVCodecContext *avctx)
2202 switch (avctx->codec_type) {
2203 case AVMEDIA_TYPE_AUDIO:
2204 val = avctx->sample_rate && avctx->channels && avctx->sample_fmt != AV_SAMPLE_FMT_NONE;
2205 if (!avctx->frame_size &&
2206 (avctx->codec_id == CODEC_ID_VORBIS ||
2207 avctx->codec_id == CODEC_ID_AAC ||
2208 avctx->codec_id == CODEC_ID_MP1 ||
2209 avctx->codec_id == CODEC_ID_MP2 ||
2210 avctx->codec_id == CODEC_ID_MP3 ||
2211 avctx->codec_id == CODEC_ID_CELT))
2214 case AVMEDIA_TYPE_VIDEO:
2215 val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
2217 case AVMEDIA_TYPE_DATA:
2218 if(avctx->codec_id == CODEC_ID_NONE) return 1;
2223 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2226 static int has_decode_delay_been_guessed(AVStream *st)
2228 return st->codec->codec_id != CODEC_ID_H264 ||
2229 st->info->nb_decoded_frames >= 6;
2232 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2235 int got_picture = 1, ret = 0;
2237 AVPacket pkt = *avpkt;
2239 if(!st->codec->codec){
2240 codec = avcodec_find_decoder(st->codec->codec_id);
2243 ret = avcodec_open2(st->codec, codec, options);
2248 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2250 (!has_codec_parameters(st->codec) ||
2251 !has_decode_delay_been_guessed(st) ||
2252 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2254 avcodec_get_frame_defaults(&picture);
2255 switch(st->codec->codec_type) {
2256 case AVMEDIA_TYPE_VIDEO:
2257 ret = avcodec_decode_video2(st->codec, &picture,
2258 &got_picture, &pkt);
2260 case AVMEDIA_TYPE_AUDIO:
2261 ret = avcodec_decode_audio4(st->codec, &picture, &got_picture, &pkt);
2268 st->info->nb_decoded_frames++;
2273 if(!pkt.data && !got_picture)
2278 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2280 while (tags->id != CODEC_ID_NONE) {
2288 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2291 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2292 if(tag == tags[i].tag)
2295 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2296 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2299 return CODEC_ID_NONE;
2302 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2305 for(i=0; tags && tags[i]; i++){
2306 int tag= ff_codec_get_tag(tags[i], id);
2312 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2315 for(i=0; tags && tags[i]; i++){
2316 enum CodecID id= ff_codec_get_id(tags[i], tag);
2317 if(id!=CODEC_ID_NONE) return id;
2319 return CODEC_ID_NONE;
2322 static void compute_chapters_end(AVFormatContext *s)
2325 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2327 for (i = 0; i < s->nb_chapters; i++)
2328 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2329 AVChapter *ch = s->chapters[i];
2330 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2333 for (j = 0; j < s->nb_chapters; j++) {
2334 AVChapter *ch1 = s->chapters[j];
2335 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2336 if (j != i && next_start > ch->start && next_start < end)
2339 ch->end = (end == INT64_MAX) ? ch->start : end;
2343 static int get_std_framerate(int i){
2344 if(i<60*12) return i*1001;
2345 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2349 * Is the time base unreliable.
2350 * This is a heuristic to balance between quick acceptance of the values in
2351 * the headers vs. some extra checks.
2352 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2353 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2354 * And there are "variable" fps files this needs to detect as well.
2356 static int tb_unreliable(AVCodecContext *c){
2357 if( c->time_base.den >= 101L*c->time_base.num
2358 || c->time_base.den < 5L*c->time_base.num
2359 /* || c->codec_tag == AV_RL32("DIVX")
2360 || c->codec_tag == AV_RL32("XVID")*/
2361 || c->codec_id == CODEC_ID_MPEG2VIDEO
2362 || c->codec_id == CODEC_ID_H264
2368 #if FF_API_FORMAT_PARAMETERS
2369 int av_find_stream_info(AVFormatContext *ic)
2371 return avformat_find_stream_info(ic, NULL);
2375 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2377 int i, count, ret, read_size, j;
2379 AVPacket pkt1, *pkt;
2380 int64_t old_offset = avio_tell(ic->pb);
2381 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2383 for(i=0;i<ic->nb_streams;i++) {
2385 st = ic->streams[i];
2387 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2388 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2389 /* if(!st->time_base.num)
2391 if(!st->codec->time_base.num)
2392 st->codec->time_base= st->time_base;
2394 //only for the split stuff
2395 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2396 st->parser = av_parser_init(st->codec->codec_id);
2397 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2398 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2401 assert(!st->codec->codec);
2402 codec = avcodec_find_decoder(st->codec->codec_id);
2404 /* Ensure that subtitle_header is properly set. */
2405 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2406 && codec && !st->codec->codec)
2407 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2409 //try to just open decoders, in case this is enough to get parameters
2410 if(!has_codec_parameters(st->codec)){
2411 if (codec && !st->codec->codec)
2412 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2416 for (i=0; i<ic->nb_streams; i++) {
2417 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2423 if (ff_check_interrupt(&ic->interrupt_callback)){
2425 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2429 /* check if one codec still needs to be handled */
2430 for(i=0;i<ic->nb_streams;i++) {
2431 int fps_analyze_framecount = 20;
2433 st = ic->streams[i];
2434 if (!has_codec_parameters(st->codec))
2436 /* if the timebase is coarse (like the usual millisecond precision
2437 of mkv), we need to analyze more frames to reliably arrive at
2439 if (av_q2d(st->time_base) > 0.0005)
2440 fps_analyze_framecount *= 2;
2441 if (ic->fps_probe_size >= 0)
2442 fps_analyze_framecount = ic->fps_probe_size;
2443 /* variable fps and no guess at the real fps */
2444 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2445 && st->info->duration_count < fps_analyze_framecount
2446 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2448 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2450 if(st->first_dts == AV_NOPTS_VALUE && (st->codec->codec_type == AVMEDIA_TYPE_VIDEO || st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2453 if (i == ic->nb_streams) {
2454 /* NOTE: if the format has no header, then we need to read
2455 some packets to get most of the streams, so we cannot
2457 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2458 /* if we found the info for all the codecs, we can stop */
2460 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2464 /* we did not get all the codec info, but we read too much data */
2465 if (read_size >= ic->probesize) {
2467 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2471 /* NOTE: a new stream can be added there if no header in file
2472 (AVFMTCTX_NOHEADER) */
2473 ret = read_frame_internal(ic, &pkt1);
2474 if (ret == AVERROR(EAGAIN))
2479 AVPacket empty_pkt = { 0 };
2481 av_init_packet(&empty_pkt);
2483 ret = -1; /* we could not have all the codec parameters before EOF */
2484 for(i=0;i<ic->nb_streams;i++) {
2485 st = ic->streams[i];
2487 /* flush the decoders */
2488 while ((err = try_decode_frame(st, &empty_pkt,
2489 (options && i < orig_nb_streams) ?
2490 &options[i] : NULL)) >= 0)
2491 if (has_codec_parameters(st->codec))
2494 if (!has_codec_parameters(st->codec)){
2496 avcodec_string(buf, sizeof(buf), st->codec, 0);
2497 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2505 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2506 if ((ret = av_dup_packet(pkt)) < 0)
2507 goto find_stream_info_err;
2509 read_size += pkt->size;
2511 st = ic->streams[pkt->stream_index];
2512 if (st->codec_info_nb_frames>1) {
2514 if (st->time_base.den > 0)
2515 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
2516 if (st->avg_frame_rate.num > 0)
2517 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, (AVRational){st->avg_frame_rate.den, st->avg_frame_rate.num}, AV_TIME_BASE_Q));
2519 if (t >= ic->max_analyze_duration) {
2520 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2523 st->info->codec_info_duration += pkt->duration;
2526 int64_t last = st->info->last_dts;
2528 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2529 double dts= pkt->dts * av_q2d(st->time_base);
2530 int64_t duration= pkt->dts - last;
2532 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2533 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
2534 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) {
2535 int framerate= get_std_framerate(i);
2536 double sdts= dts*framerate/(1001*12);
2538 int ticks= lrintf(sdts+j*0.5);
2539 double error= sdts - ticks + j*0.5;
2540 st->info->duration_error[j][0][i] += error;
2541 st->info->duration_error[j][1][i] += error*error;
2544 st->info->duration_count++;
2545 // ignore the first 4 values, they might have some random jitter
2546 if (st->info->duration_count > 3)
2547 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2549 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2550 st->info->last_dts = pkt->dts;
2552 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2553 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2555 st->codec->extradata_size= i;
2556 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2557 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2558 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2562 /* if still no information, we try to open the codec and to
2563 decompress the frame. We try to avoid that in most cases as
2564 it takes longer and uses more memory. For MPEG-4, we need to
2565 decompress for QuickTime.
2567 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2568 least one frame of codec data, this makes sure the codec initializes
2569 the channel configuration and does not only trust the values from the container.
2571 try_decode_frame(st, pkt, (options && i < orig_nb_streams ) ? &options[i] : NULL);
2573 st->codec_info_nb_frames++;
2577 // close codecs which were opened in try_decode_frame()
2578 for(i=0;i<ic->nb_streams;i++) {
2579 st = ic->streams[i];
2580 if(st->codec->codec)
2581 avcodec_close(st->codec);
2583 for(i=0;i<ic->nb_streams;i++) {
2584 st = ic->streams[i];
2585 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2586 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2587 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2588 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2589 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2590 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2591 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2592 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2593 st->codec->codec_tag= tag;
2596 // the check for tb_unreliable() is not completely correct, since this is not about handling
2597 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2598 // ipmovie.c produces.
2599 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)
2600 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);
2601 if (st->info->duration_count && !st->r_frame_rate.num
2602 && tb_unreliable(st->codec) /*&&
2603 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2604 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2606 double best_error= 0.01;
2608 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) {
2611 if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2613 if(!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
2616 int n= st->info->duration_count;
2617 double a= st->info->duration_error[k][0][j] / n;
2618 double error= st->info->duration_error[k][1][j]/n - a*a;
2620 if(error < best_error && best_error> 0.000000001){
2622 num = get_std_framerate(j);
2625 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2628 // do not increase frame rate by more than 1 % in order to match a standard rate.
2629 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2630 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2633 if (!st->r_frame_rate.num){
2634 if( st->codec->time_base.den * (int64_t)st->time_base.num
2635 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2636 st->r_frame_rate.num = st->codec->time_base.den;
2637 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2639 st->r_frame_rate.num = st->time_base.den;
2640 st->r_frame_rate.den = st->time_base.num;
2643 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2644 if(!st->codec->bits_per_coded_sample)
2645 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2646 // set stream disposition based on audio service type
2647 switch (st->codec->audio_service_type) {
2648 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2649 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2650 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2651 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2652 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2653 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2654 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2655 st->disposition = AV_DISPOSITION_COMMENT; break;
2656 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2657 st->disposition = AV_DISPOSITION_KARAOKE; break;
2662 estimate_timings(ic, old_offset);
2664 compute_chapters_end(ic);
2667 /* correct DTS for B-frame streams with no timestamps */
2668 for(i=0;i<ic->nb_streams;i++) {
2669 st = ic->streams[i];
2670 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2672 ppktl = &ic->packet_buffer;
2674 if(ppkt1->stream_index != i)
2676 if(ppkt1->pkt->dts < 0)
2678 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2680 ppkt1->pkt->dts -= delta;
2685 st->cur_dts -= delta;
2691 find_stream_info_err:
2692 for (i=0; i < ic->nb_streams; i++) {
2693 if (ic->streams[i]->codec)
2694 ic->streams[i]->codec->thread_count = 0;
2695 av_freep(&ic->streams[i]->info);
2700 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2704 for (i = 0; i < ic->nb_programs; i++) {
2705 if (ic->programs[i] == last) {
2709 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2710 if (ic->programs[i]->stream_index[j] == s)
2711 return ic->programs[i];
2717 int av_find_best_stream(AVFormatContext *ic,
2718 enum AVMediaType type,
2719 int wanted_stream_nb,
2721 AVCodec **decoder_ret,
2724 int i, nb_streams = ic->nb_streams;
2725 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2726 unsigned *program = NULL;
2727 AVCodec *decoder = NULL, *best_decoder = NULL;
2729 if (related_stream >= 0 && wanted_stream_nb < 0) {
2730 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2732 program = p->stream_index;
2733 nb_streams = p->nb_stream_indexes;
2736 for (i = 0; i < nb_streams; i++) {
2737 int real_stream_index = program ? program[i] : i;
2738 AVStream *st = ic->streams[real_stream_index];
2739 AVCodecContext *avctx = st->codec;
2740 if (avctx->codec_type != type)
2742 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2744 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2747 decoder = avcodec_find_decoder(st->codec->codec_id);
2750 ret = AVERROR_DECODER_NOT_FOUND;
2754 if (best_count >= st->codec_info_nb_frames)
2756 best_count = st->codec_info_nb_frames;
2757 ret = real_stream_index;
2758 best_decoder = decoder;
2759 if (program && i == nb_streams - 1 && ret < 0) {
2761 nb_streams = ic->nb_streams;
2762 i = 0; /* no related stream found, try again with everything */
2766 *decoder_ret = best_decoder;
2770 /*******************************************************/
2772 int av_read_play(AVFormatContext *s)
2774 if (s->iformat->read_play)
2775 return s->iformat->read_play(s);
2777 return avio_pause(s->pb, 0);
2778 return AVERROR(ENOSYS);
2781 int av_read_pause(AVFormatContext *s)
2783 if (s->iformat->read_pause)
2784 return s->iformat->read_pause(s);
2786 return avio_pause(s->pb, 1);
2787 return AVERROR(ENOSYS);
2790 #if FF_API_FORMAT_PARAMETERS
2791 void av_close_input_stream(AVFormatContext *s)
2793 flush_packet_queue(s);
2794 if (s->iformat->read_close)
2795 s->iformat->read_close(s);
2796 avformat_free_context(s);
2800 void avformat_free_context(AVFormatContext *s)
2806 if (s->iformat && s->iformat->priv_class && s->priv_data)
2807 av_opt_free(s->priv_data);
2809 for(i=0;i<s->nb_streams;i++) {
2810 /* free all data in a stream component */
2813 av_parser_close(st->parser);
2814 av_free_packet(&st->cur_pkt);
2816 av_dict_free(&st->metadata);
2817 av_freep(&st->index_entries);
2818 av_freep(&st->codec->extradata);
2819 av_freep(&st->codec->subtitle_header);
2820 av_freep(&st->codec);
2821 av_freep(&st->priv_data);
2822 av_freep(&st->info);
2825 for(i=s->nb_programs-1; i>=0; i--) {
2826 av_dict_free(&s->programs[i]->metadata);
2827 av_freep(&s->programs[i]->stream_index);
2828 av_freep(&s->programs[i]);
2830 av_freep(&s->programs);
2831 av_freep(&s->priv_data);
2832 while(s->nb_chapters--) {
2833 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2834 av_freep(&s->chapters[s->nb_chapters]);
2836 av_freep(&s->chapters);
2837 av_dict_free(&s->metadata);
2838 av_freep(&s->streams);
2842 #if FF_API_CLOSE_INPUT_FILE
2843 void av_close_input_file(AVFormatContext *s)
2845 avformat_close_input(&s);
2849 void avformat_close_input(AVFormatContext **ps)
2851 AVFormatContext *s = *ps;
2852 AVIOContext *pb = (s->iformat && (s->iformat->flags & AVFMT_NOFILE)) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2854 flush_packet_queue(s);
2855 if (s->iformat && (s->iformat->read_close))
2856 s->iformat->read_close(s);
2857 avformat_free_context(s);
2863 #if FF_API_NEW_STREAM
2864 AVStream *av_new_stream(AVFormatContext *s, int id)
2866 AVStream *st = avformat_new_stream(s, NULL);
2873 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
2879 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2881 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2884 s->streams = streams;
2886 st = av_mallocz(sizeof(AVStream));
2889 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2894 st->codec = avcodec_alloc_context3(c);
2896 /* no default bitrate if decoding */
2897 st->codec->bit_rate = 0;
2899 st->index = s->nb_streams;
2900 st->start_time = AV_NOPTS_VALUE;
2901 st->duration = AV_NOPTS_VALUE;
2902 /* we set the current DTS to 0 so that formats without any timestamps
2903 but durations get some timestamps, formats with some unknown
2904 timestamps have their first few packets buffered and the
2905 timestamps corrected before they are returned to the user */
2907 st->first_dts = AV_NOPTS_VALUE;
2908 st->probe_packets = MAX_PROBE_PACKETS;
2910 /* default pts setting is MPEG-like */
2911 avpriv_set_pts_info(st, 33, 1, 90000);
2912 st->last_IP_pts = AV_NOPTS_VALUE;
2913 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2914 st->pts_buffer[i]= AV_NOPTS_VALUE;
2915 st->reference_dts = AV_NOPTS_VALUE;
2917 st->sample_aspect_ratio = (AVRational){0,1};
2919 s->streams[s->nb_streams++] = st;
2923 AVProgram *av_new_program(AVFormatContext *ac, int id)
2925 AVProgram *program=NULL;
2928 av_dlog(ac, "new_program: id=0x%04x\n", id);
2930 for(i=0; i<ac->nb_programs; i++)
2931 if(ac->programs[i]->id == id)
2932 program = ac->programs[i];
2935 program = av_mallocz(sizeof(AVProgram));
2938 dynarray_add(&ac->programs, &ac->nb_programs, program);
2939 program->discard = AVDISCARD_NONE;
2946 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2948 AVChapter *chapter = NULL;
2951 for(i=0; i<s->nb_chapters; i++)
2952 if(s->chapters[i]->id == id)
2953 chapter = s->chapters[i];
2956 chapter= av_mallocz(sizeof(AVChapter));
2959 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2961 av_dict_set(&chapter->metadata, "title", title, 0);
2963 chapter->time_base= time_base;
2964 chapter->start = start;
2970 /************************************************************/
2971 /* output media file */
2973 #if FF_API_FORMAT_PARAMETERS
2974 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2976 if (s->oformat->priv_data_size > 0) {
2977 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2979 return AVERROR(ENOMEM);
2980 if (s->oformat->priv_class) {
2981 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2982 av_opt_set_defaults(s->priv_data);
2985 s->priv_data = NULL;
2991 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
2992 const char *format, const char *filename)
2994 AVFormatContext *s = avformat_alloc_context();
3003 oformat = av_guess_format(format, NULL, NULL);
3005 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
3006 ret = AVERROR(EINVAL);
3010 oformat = av_guess_format(NULL, filename, NULL);
3012 ret = AVERROR(EINVAL);
3013 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
3020 s->oformat = oformat;
3021 if (s->oformat->priv_data_size > 0) {
3022 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3025 if (s->oformat->priv_class) {
3026 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3027 av_opt_set_defaults(s->priv_data);
3030 s->priv_data = NULL;
3033 av_strlcpy(s->filename, filename, sizeof(s->filename));
3037 av_log(s, AV_LOG_ERROR, "Out of memory\n");
3038 ret = AVERROR(ENOMEM);
3040 avformat_free_context(s);
3044 #if FF_API_ALLOC_OUTPUT_CONTEXT
3045 AVFormatContext *avformat_alloc_output_context(const char *format,
3046 AVOutputFormat *oformat, const char *filename)
3048 AVFormatContext *avctx;
3049 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
3050 return ret < 0 ? NULL : avctx;
3054 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
3056 const AVCodecTag *avctag;
3058 enum CodecID id = CODEC_ID_NONE;
3059 unsigned int tag = 0;
3062 * Check that tag + id is in the table
3063 * If neither is in the table -> OK
3064 * If tag is in the table with another id -> FAIL
3065 * If id is in the table with another tag -> FAIL unless strict < normal
3067 for (n = 0; s->oformat->codec_tag[n]; n++) {
3068 avctag = s->oformat->codec_tag[n];
3069 while (avctag->id != CODEC_ID_NONE) {
3070 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
3072 if (id == st->codec->codec_id)
3075 if (avctag->id == st->codec->codec_id)
3080 if (id != CODEC_ID_NONE)
3082 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
3087 #if FF_API_FORMAT_PARAMETERS
3088 int av_write_header(AVFormatContext *s)
3090 return avformat_write_header(s, NULL);
3094 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
3098 AVDictionary *tmp = NULL;
3101 av_dict_copy(&tmp, *options, 0);
3102 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
3104 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
3105 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3108 // some sanity checks
3109 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
3110 av_log(s, AV_LOG_ERROR, "no streams\n");
3111 ret = AVERROR(EINVAL);
3115 for(i=0;i<s->nb_streams;i++) {
3118 switch (st->codec->codec_type) {
3119 case AVMEDIA_TYPE_AUDIO:
3120 if(st->codec->sample_rate<=0){
3121 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
3122 ret = AVERROR(EINVAL);
3125 if(!st->codec->block_align)
3126 st->codec->block_align = st->codec->channels *
3127 av_get_bits_per_sample(st->codec->codec_id) >> 3;
3129 case AVMEDIA_TYPE_VIDEO:
3130 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
3131 av_log(s, AV_LOG_ERROR, "time base not set\n");
3132 ret = AVERROR(EINVAL);
3135 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
3136 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
3137 ret = AVERROR(EINVAL);
3140 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
3141 && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
3143 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
3144 ret = AVERROR(EINVAL);
3150 if(s->oformat->codec_tag){
3151 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)){
3152 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
3153 st->codec->codec_tag= 0;
3155 if(st->codec->codec_tag){
3156 if (!validate_codec_tag(s, st)) {
3158 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
3159 av_log(s, AV_LOG_ERROR,
3160 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
3161 tagbuf, st->codec->codec_tag, st->codec->codec_id);
3162 ret = AVERROR_INVALIDDATA;
3166 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3169 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3170 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3171 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3174 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3175 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3176 if (!s->priv_data) {
3177 ret = AVERROR(ENOMEM);
3180 if (s->oformat->priv_class) {
3181 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3182 av_opt_set_defaults(s->priv_data);
3183 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3188 /* set muxer identification string */
3189 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3190 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3193 if(s->oformat->write_header){
3194 ret = s->oformat->write_header(s);
3199 /* init PTS generation */
3200 for(i=0;i<s->nb_streams;i++) {
3201 int64_t den = AV_NOPTS_VALUE;
3204 switch (st->codec->codec_type) {
3205 case AVMEDIA_TYPE_AUDIO:
3206 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3208 case AVMEDIA_TYPE_VIDEO:
3209 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3214 if (den != AV_NOPTS_VALUE) {
3216 ret = AVERROR_INVALIDDATA;
3219 frac_init(&st->pts, 0, 0, den);
3224 av_dict_free(options);
3233 //FIXME merge with compute_pkt_fields
3234 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3235 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3236 int num, den, frame_size, i;
3238 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3239 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3241 /* duration field */
3242 if (pkt->duration == 0) {
3243 compute_frame_duration(&num, &den, st, NULL, pkt);
3245 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3249 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3252 //XXX/FIXME this is a temporary hack until all encoders output pts
3253 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3255 // pkt->pts= st->cur_dts;
3256 pkt->pts= st->pts.val;
3259 //calculate dts from pts
3260 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3261 st->pts_buffer[0]= pkt->pts;
3262 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3263 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3264 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3265 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3267 pkt->dts= st->pts_buffer[0];
3270 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) && st->cur_dts >= pkt->dts) || st->cur_dts > pkt->dts)){
3271 av_log(s, AV_LOG_ERROR,
3272 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3273 st->index, st->cur_dts, pkt->dts);
3274 return AVERROR(EINVAL);
3276 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3277 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3278 return AVERROR(EINVAL);
3281 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3282 st->cur_dts= pkt->dts;
3283 st->pts.val= pkt->dts;
3286 switch (st->codec->codec_type) {
3287 case AVMEDIA_TYPE_AUDIO:
3288 frame_size = get_audio_frame_size(st->codec, pkt->size);
3290 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3291 likely equal to the encoder delay, but it would be better if we
3292 had the real timestamps from the encoder */
3293 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3294 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3297 case AVMEDIA_TYPE_VIDEO:
3298 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3306 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3308 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3310 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3313 ret= s->oformat->write_packet(s, pkt);
3316 s->streams[pkt->stream_index]->nb_frames++;
3320 #define CHUNK_START 0x1000
3322 int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3323 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3325 AVPacketList **next_point, *this_pktl;
3326 AVStream *st= s->streams[pkt->stream_index];
3327 int chunked= s->max_chunk_size || s->max_chunk_duration;
3329 this_pktl = av_mallocz(sizeof(AVPacketList));
3331 return AVERROR(ENOMEM);
3332 this_pktl->pkt= *pkt;
3333 pkt->destruct= NULL; // do not free original but only the copy
3334 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3336 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3337 next_point = &(st->last_in_packet_buffer->next);
3339 next_point = &s->packet_buffer;
3344 uint64_t max= av_rescale_q(s->max_chunk_duration, AV_TIME_BASE_Q, st->time_base);
3345 if( st->interleaver_chunk_size + pkt->size <= s->max_chunk_size-1U
3346 && st->interleaver_chunk_duration + pkt->duration <= max-1U){
3347 st->interleaver_chunk_size += pkt->size;
3348 st->interleaver_chunk_duration += pkt->duration;
3351 st->interleaver_chunk_size =
3352 st->interleaver_chunk_duration = 0;
3353 this_pktl->pkt.flags |= CHUNK_START;
3357 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3359 && ((chunked && !((*next_point)->pkt.flags&CHUNK_START))
3360 || !compare(s, &(*next_point)->pkt, pkt))){
3361 next_point= &(*next_point)->next;
3366 next_point = &(s->packet_buffer_end->next);
3369 assert(!*next_point);
3371 s->packet_buffer_end= this_pktl;
3374 this_pktl->next= *next_point;
3376 s->streams[pkt->stream_index]->last_in_packet_buffer=
3377 *next_point= this_pktl;
3381 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3383 AVStream *st = s->streams[ pkt ->stream_index];
3384 AVStream *st2= s->streams[ next->stream_index];
3385 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3387 if(s->audio_preload && ((st->codec->codec_type == AVMEDIA_TYPE_AUDIO) != (st2->codec->codec_type == AVMEDIA_TYPE_AUDIO))){
3388 int64_t ts = av_rescale_q(pkt ->dts, st ->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st ->codec->codec_type == AVMEDIA_TYPE_AUDIO);
3389 int64_t ts2= av_rescale_q(next->dts, st2->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st2->codec->codec_type == AVMEDIA_TYPE_AUDIO);
3391 ts= ( pkt ->dts* st->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st ->codec->codec_type == AVMEDIA_TYPE_AUDIO)* st->time_base.den)*st2->time_base.den
3392 -( next->dts*st2->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st2->codec->codec_type == AVMEDIA_TYPE_AUDIO)*st2->time_base.den)* st->time_base.den;
3395 comp= (ts>ts2) - (ts<ts2);
3399 return pkt->stream_index < next->stream_index;
3403 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3405 int stream_count=0, noninterleaved_count=0;
3406 int64_t delta_dts_max = 0;
3410 ret = ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3415 for(i=0; i < s->nb_streams; i++) {
3416 if (s->streams[i]->last_in_packet_buffer) {
3418 } else if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3419 ++noninterleaved_count;
3423 if (s->nb_streams == stream_count) {
3426 for(i=0; i < s->nb_streams; i++) {
3427 if (s->streams[i]->last_in_packet_buffer) {
3429 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
3430 s->streams[i]->time_base,
3432 av_rescale_q(s->packet_buffer->pkt.dts,
3433 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
3435 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
3438 if(s->nb_streams == stream_count+noninterleaved_count &&
3439 delta_dts_max > 20*AV_TIME_BASE) {
3440 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
3444 if(stream_count && flush){
3445 pktl= s->packet_buffer;
3448 s->packet_buffer= pktl->next;
3449 if(!s->packet_buffer)
3450 s->packet_buffer_end= NULL;
3452 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3453 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3457 av_init_packet(out);
3463 * Interleave an AVPacket correctly so it can be muxed.
3464 * @param out the interleaved packet will be output here
3465 * @param in the input packet
3466 * @param flush 1 if no further packets are available as input and all
3467 * remaining packets should be output
3468 * @return 1 if a packet was output, 0 if no packet could be output,
3469 * < 0 if an error occurred
3471 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3472 if(s->oformat->interleave_packet)
3473 return s->oformat->interleave_packet(s, out, in, flush);
3475 return av_interleave_packet_per_dts(s, out, in, flush);
3478 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3479 AVStream *st= s->streams[ pkt->stream_index];
3482 //FIXME/XXX/HACK drop zero sized packets
3483 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3486 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3487 pkt->size, pkt->dts, pkt->pts);
3488 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3491 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3492 return AVERROR(EINVAL);
3496 int ret= interleave_packet(s, &opkt, pkt, 0);
3497 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3500 ret= s->oformat->write_packet(s, &opkt);
3502 s->streams[opkt.stream_index]->nb_frames++;
3504 av_free_packet(&opkt);
3509 if(s->pb && s->pb->error)
3510 return s->pb->error;
3514 int av_write_trailer(AVFormatContext *s)
3520 ret= interleave_packet(s, &pkt, NULL, 1);
3521 if(ret<0) //FIXME cleanup needed for ret<0 ?
3526 ret= s->oformat->write_packet(s, &pkt);
3528 s->streams[pkt.stream_index]->nb_frames++;
3530 av_free_packet(&pkt);
3534 if(s->pb && s->pb->error)
3538 if(s->oformat->write_trailer)
3539 ret = s->oformat->write_trailer(s);
3542 ret = s->pb ? s->pb->error : 0;
3543 for(i=0;i<s->nb_streams;i++) {
3544 av_freep(&s->streams[i]->priv_data);
3545 av_freep(&s->streams[i]->index_entries);
3547 if (s->oformat->priv_class)
3548 av_opt_free(s->priv_data);
3549 av_freep(&s->priv_data);
3553 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
3554 int64_t *dts, int64_t *wall)
3556 if (!s->oformat || !s->oformat->get_output_timestamp)
3557 return AVERROR(ENOSYS);
3558 s->oformat->get_output_timestamp(s, stream, dts, wall);
3562 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3565 AVProgram *program=NULL;
3568 if (idx >= ac->nb_streams) {
3569 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3573 for(i=0; i<ac->nb_programs; i++){
3574 if(ac->programs[i]->id != progid)
3576 program = ac->programs[i];
3577 for(j=0; j<program->nb_stream_indexes; j++)
3578 if(program->stream_index[j] == idx)
3581 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3584 program->stream_index = tmp;
3585 program->stream_index[program->nb_stream_indexes++] = idx;
3590 static void print_fps(double d, const char *postfix){
3591 uint64_t v= lrintf(d*100);
3592 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3593 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3594 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3597 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3599 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3600 AVDictionaryEntry *tag=NULL;
3602 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3603 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3604 if(strcmp("language", tag->key)){
3607 av_strlcpy(tmp, tag->value, sizeof(tmp));
3608 for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
3609 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tmp);
3615 /* "user interface" functions */
3616 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3619 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3620 AVStream *st = ic->streams[i];
3621 int g = av_gcd(st->time_base.num, st->time_base.den);
3622 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3623 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3624 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
3625 /* the pid is an important information, so we display it */
3626 /* XXX: add a generic system */
3627 if (flags & AVFMT_SHOW_IDS)
3628 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3630 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3631 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3632 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3633 if (st->sample_aspect_ratio.num && // default
3634 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3635 AVRational display_aspect_ratio;
3636 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3637 st->codec->width*st->sample_aspect_ratio.num,
3638 st->codec->height*st->sample_aspect_ratio.den,
3640 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3641 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3642 display_aspect_ratio.num, display_aspect_ratio.den);
3644 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3645 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3646 print_fps(av_q2d(st->avg_frame_rate), "fps");
3647 if(st->r_frame_rate.den && st->r_frame_rate.num)
3648 print_fps(av_q2d(st->r_frame_rate), "tbr");
3649 if(st->time_base.den && st->time_base.num)
3650 print_fps(1/av_q2d(st->time_base), "tbn");
3651 if(st->codec->time_base.den && st->codec->time_base.num)
3652 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3654 if (st->disposition & AV_DISPOSITION_DEFAULT)
3655 av_log(NULL, AV_LOG_INFO, " (default)");
3656 if (st->disposition & AV_DISPOSITION_DUB)
3657 av_log(NULL, AV_LOG_INFO, " (dub)");
3658 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3659 av_log(NULL, AV_LOG_INFO, " (original)");
3660 if (st->disposition & AV_DISPOSITION_COMMENT)
3661 av_log(NULL, AV_LOG_INFO, " (comment)");
3662 if (st->disposition & AV_DISPOSITION_LYRICS)
3663 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3664 if (st->disposition & AV_DISPOSITION_KARAOKE)
3665 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3666 if (st->disposition & AV_DISPOSITION_FORCED)
3667 av_log(NULL, AV_LOG_INFO, " (forced)");
3668 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3669 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3670 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3671 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3672 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3673 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3674 av_log(NULL, AV_LOG_INFO, "\n");
3675 dump_metadata(NULL, st->metadata, " ");
3678 #if FF_API_DUMP_FORMAT
3679 void dump_format(AVFormatContext *ic,
3684 av_dump_format(ic, index, url, is_output);
3688 void av_dump_format(AVFormatContext *ic,
3694 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3695 if (ic->nb_streams && !printed)
3698 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3699 is_output ? "Output" : "Input",
3701 is_output ? ic->oformat->name : ic->iformat->name,
3702 is_output ? "to" : "from", url);
3703 dump_metadata(NULL, ic->metadata, " ");
3705 av_log(NULL, AV_LOG_INFO, " Duration: ");
3706 if (ic->duration != AV_NOPTS_VALUE) {
3707 int hours, mins, secs, us;
3708 secs = ic->duration / AV_TIME_BASE;
3709 us = ic->duration % AV_TIME_BASE;
3714 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3715 (100 * us) / AV_TIME_BASE);
3717 av_log(NULL, AV_LOG_INFO, "N/A");
3719 if (ic->start_time != AV_NOPTS_VALUE) {
3721 av_log(NULL, AV_LOG_INFO, ", start: ");
3722 secs = ic->start_time / AV_TIME_BASE;
3723 us = abs(ic->start_time % AV_TIME_BASE);
3724 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3725 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3727 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3729 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3731 av_log(NULL, AV_LOG_INFO, "N/A");
3733 av_log(NULL, AV_LOG_INFO, "\n");
3735 for (i = 0; i < ic->nb_chapters; i++) {
3736 AVChapter *ch = ic->chapters[i];
3737 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3738 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3739 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3741 dump_metadata(NULL, ch->metadata, " ");
3743 if(ic->nb_programs) {
3744 int j, k, total = 0;
3745 for(j=0; j<ic->nb_programs; j++) {
3746 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3748 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3749 name ? name->value : "");
3750 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3751 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3752 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3753 printed[ic->programs[j]->stream_index[k]] = 1;
3755 total += ic->programs[j]->nb_stream_indexes;
3757 if (total < ic->nb_streams)
3758 av_log(NULL, AV_LOG_INFO, " No Program\n");
3760 for(i=0;i<ic->nb_streams;i++)
3762 dump_stream_format(ic, i, index, is_output);
3767 int64_t av_gettime(void)
3770 gettimeofday(&tv,NULL);
3771 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3774 uint64_t ff_ntp_time(void)
3776 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3779 #if FF_API_PARSE_DATE
3780 #include "libavutil/parseutils.h"
3782 int64_t parse_date(const char *timestr, int duration)
3785 av_parse_time(&timeval, timestr, duration);
3790 #if FF_API_FIND_INFO_TAG
3791 #include "libavutil/parseutils.h"
3793 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3795 return av_find_info_tag(arg, arg_size, tag1, info);
3799 int av_get_frame_filename(char *buf, int buf_size,
3800 const char *path, int number)
3803 char *q, buf1[20], c;
3804 int nd, len, percentd_found;
3816 while (isdigit(*p)) {
3817 nd = nd * 10 + *p++ - '0';
3820 } while (isdigit(c));
3829 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3831 if ((q - buf + len) > buf_size - 1)
3833 memcpy(q, buf1, len);
3841 if ((q - buf) < buf_size - 1)
3845 if (!percentd_found)
3854 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3858 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3860 for(i=0;i<size;i+=16) {
3867 PRINT(" %02x", buf[i+j]);
3872 for(j=0;j<len;j++) {
3874 if (c < ' ' || c > '~')
3883 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3885 hex_dump_internal(NULL, f, 0, buf, size);
3888 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3890 hex_dump_internal(avcl, NULL, level, buf, size);
3893 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3896 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3897 PRINT("stream #%d:\n", pkt->stream_index);
3898 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3899 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3900 /* DTS is _always_ valid after av_read_frame() */
3902 if (pkt->dts == AV_NOPTS_VALUE)
3905 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3906 /* PTS may not be known if B-frames are present. */
3908 if (pkt->pts == AV_NOPTS_VALUE)
3911 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3913 PRINT(" size=%d\n", pkt->size);
3916 av_hex_dump(f, pkt->data, pkt->size);
3920 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3922 AVRational tb = { 1, AV_TIME_BASE };
3923 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3927 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3929 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3933 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3935 AVRational tb = { 1, AV_TIME_BASE };
3936 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3940 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3943 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3946 void av_url_split(char *proto, int proto_size,
3947 char *authorization, int authorization_size,
3948 char *hostname, int hostname_size,
3950 char *path, int path_size,
3953 const char *p, *ls, *at, *col, *brk;
3955 if (port_ptr) *port_ptr = -1;
3956 if (proto_size > 0) proto[0] = 0;
3957 if (authorization_size > 0) authorization[0] = 0;
3958 if (hostname_size > 0) hostname[0] = 0;
3959 if (path_size > 0) path[0] = 0;
3961 /* parse protocol */
3962 if ((p = strchr(url, ':'))) {
3963 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3968 /* no protocol means plain filename */
3969 av_strlcpy(path, url, path_size);
3973 /* separate path from hostname */
3974 ls = strchr(p, '/');
3976 ls = strchr(p, '?');
3978 av_strlcpy(path, ls, path_size);
3980 ls = &p[strlen(p)]; // XXX
3982 /* the rest is hostname, use that to parse auth/port */
3984 /* authorization (user[:pass]@hostname) */
3985 if ((at = strchr(p, '@')) && at < ls) {
3986 av_strlcpy(authorization, p,
3987 FFMIN(authorization_size, at + 1 - p));
3988 p = at + 1; /* skip '@' */
3991 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3993 av_strlcpy(hostname, p + 1,
3994 FFMIN(hostname_size, brk - p));
3995 if (brk[1] == ':' && port_ptr)
3996 *port_ptr = atoi(brk + 2);
3997 } else if ((col = strchr(p, ':')) && col < ls) {
3998 av_strlcpy(hostname, p,
3999 FFMIN(col + 1 - p, hostname_size));
4000 if (port_ptr) *port_ptr = atoi(col + 1);
4002 av_strlcpy(hostname, p,
4003 FFMIN(ls + 1 - p, hostname_size));
4007 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4010 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4013 'C', 'D', 'E', 'F' };
4014 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4017 'c', 'd', 'e', 'f' };
4018 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4020 for(i = 0; i < s; i++) {
4021 buff[i * 2] = hex_table[src[i] >> 4];
4022 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4028 int ff_hex_to_data(uint8_t *data, const char *p)
4035 p += strspn(p, SPACE_CHARS);
4038 c = toupper((unsigned char) *p++);
4039 if (c >= '0' && c <= '9')
4041 else if (c >= 'A' && c <= 'F')
4056 #if FF_API_SET_PTS_INFO
4057 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
4058 unsigned int pts_num, unsigned int pts_den)
4060 avpriv_set_pts_info(s, pts_wrap_bits, pts_num, pts_den);
4064 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4065 unsigned int pts_num, unsigned int pts_den)
4068 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
4069 if(new_tb.num != pts_num)
4070 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
4072 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
4074 if(new_tb.num <= 0 || new_tb.den <= 0) {
4075 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
4078 s->time_base = new_tb;
4079 s->pts_wrap_bits = pts_wrap_bits;
4082 int ff_url_join(char *str, int size, const char *proto,
4083 const char *authorization, const char *hostname,
4084 int port, const char *fmt, ...)
4087 struct addrinfo hints, *ai;
4092 av_strlcatf(str, size, "%s://", proto);
4093 if (authorization && authorization[0])
4094 av_strlcatf(str, size, "%s@", authorization);
4095 #if CONFIG_NETWORK && defined(AF_INET6)
4096 /* Determine if hostname is a numerical IPv6 address,
4097 * properly escape it within [] in that case. */
4098 memset(&hints, 0, sizeof(hints));
4099 hints.ai_flags = AI_NUMERICHOST;
4100 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
4101 if (ai->ai_family == AF_INET6) {
4102 av_strlcat(str, "[", size);
4103 av_strlcat(str, hostname, size);
4104 av_strlcat(str, "]", size);
4106 av_strlcat(str, hostname, size);
4111 /* Not an IPv6 address, just output the plain string. */
4112 av_strlcat(str, hostname, size);
4115 av_strlcatf(str, size, ":%d", port);
4118 int len = strlen(str);
4121 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
4127 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
4128 AVFormatContext *src)
4133 local_pkt.stream_index = dst_stream;
4134 if (pkt->pts != AV_NOPTS_VALUE)
4135 local_pkt.pts = av_rescale_q(pkt->pts,
4136 src->streams[pkt->stream_index]->time_base,
4137 dst->streams[dst_stream]->time_base);
4138 if (pkt->dts != AV_NOPTS_VALUE)
4139 local_pkt.dts = av_rescale_q(pkt->dts,
4140 src->streams[pkt->stream_index]->time_base,
4141 dst->streams[dst_stream]->time_base);
4142 return av_write_frame(dst, &local_pkt);
4145 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4148 const char *ptr = str;
4150 /* Parse key=value pairs. */
4153 char *dest = NULL, *dest_end;
4154 int key_len, dest_len = 0;
4156 /* Skip whitespace and potential commas. */
4157 while (*ptr && (isspace(*ptr) || *ptr == ','))
4164 if (!(ptr = strchr(key, '=')))
4167 key_len = ptr - key;
4169 callback_get_buf(context, key, key_len, &dest, &dest_len);
4170 dest_end = dest + dest_len - 1;
4174 while (*ptr && *ptr != '\"') {
4178 if (dest && dest < dest_end)
4182 if (dest && dest < dest_end)
4190 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
4191 if (dest && dest < dest_end)
4199 int ff_find_stream_index(AVFormatContext *s, int id)
4202 for (i = 0; i < s->nb_streams; i++) {
4203 if (s->streams[i]->id == id)
4209 void ff_make_absolute_url(char *buf, int size, const char *base,
4213 /* Absolute path, relative to the current server */
4214 if (base && strstr(base, "://") && rel[0] == '/') {
4216 av_strlcpy(buf, base, size);
4217 sep = strstr(buf, "://");
4220 sep = strchr(sep, '/');
4224 av_strlcat(buf, rel, size);
4227 /* If rel actually is an absolute url, just copy it */
4228 if (!base || strstr(rel, "://") || rel[0] == '/') {
4229 av_strlcpy(buf, rel, size);
4233 av_strlcpy(buf, base, size);
4234 /* Remove the file name from the base url */
4235 sep = strrchr(buf, '/');
4240 while (av_strstart(rel, "../", NULL) && sep) {
4241 /* Remove the path delimiter at the end */
4243 sep = strrchr(buf, '/');
4244 /* If the next directory name to pop off is "..", break here */
4245 if (!strcmp(sep ? &sep[1] : buf, "..")) {
4246 /* Readd the slash we just removed */
4247 av_strlcat(buf, "/", size);
4250 /* Cut off the directory name */
4257 av_strlcat(buf, rel, size);
4260 int64_t ff_iso8601_to_unix_time(const char *datestr)
4263 struct tm time1 = {0}, time2 = {0};
4265 ret1 = strptime(datestr, "%Y - %m - %d %T", &time1);
4266 ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2);
4268 return av_timegm(&time2);
4270 return av_timegm(&time1);
4272 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
4273 "the date string.\n");
4278 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
4281 if (ofmt->query_codec)
4282 return ofmt->query_codec(codec_id, std_compliance);
4283 else if (ofmt->codec_tag)
4284 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4285 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4286 codec_id == ofmt->subtitle_codec)
4289 return AVERROR_PATCHWELCOME;
4292 int avformat_network_init(void)
4296 ff_network_inited_globally = 1;
4297 if ((ret = ff_network_init()) < 0)
4304 int avformat_network_deinit(void)
4313 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4314 uint64_t channel_layout, int32_t sample_rate,
4315 int32_t width, int32_t height)
4321 return AVERROR(EINVAL);
4324 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4326 if (channel_layout) {
4328 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4332 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4334 if (width || height) {
4336 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4338 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4340 return AVERROR(ENOMEM);
4341 bytestream_put_le32(&data, flags);
4343 bytestream_put_le32(&data, channels);
4345 bytestream_put_le64(&data, channel_layout);
4347 bytestream_put_le32(&data, sample_rate);
4348 if (width || height) {
4349 bytestream_put_le32(&data, width);
4350 bytestream_put_le32(&data, height);