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/avassert.h"
37 #include "libavutil/avstring.h"
38 #include "libavutil/mathematics.h"
39 #include "libavutil/parseutils.h"
41 #include "audiointerleave.h"
55 * various utility functions for use within FFmpeg
58 unsigned avformat_version(void)
60 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
61 return LIBAVFORMAT_VERSION_INT;
64 const char *avformat_configuration(void)
66 return FFMPEG_CONFIGURATION;
69 const char *avformat_license(void)
71 #define LICENSE_PREFIX "libavformat license: "
72 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
75 /* fraction handling */
78 * f = val + (num / den) + 0.5.
80 * 'num' is normalized so that it is such as 0 <= num < den.
82 * @param f fractional number
83 * @param val integer value
84 * @param num must be >= 0
85 * @param den must be >= 1
87 static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
100 * Fractional addition to f: f = f + (incr / f->den).
102 * @param f fractional number
103 * @param incr increment, can be positive or negative
105 static void frac_add(AVFrac *f, int64_t incr)
118 } else if (num >= den) {
125 /** head of registered input format linked list */
126 static AVInputFormat *first_iformat = NULL;
127 /** head of registered output format linked list */
128 static AVOutputFormat *first_oformat = NULL;
130 AVInputFormat *av_iformat_next(AVInputFormat *f)
132 if(f) return f->next;
133 else return first_iformat;
136 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
138 if(f) return f->next;
139 else return first_oformat;
142 void av_register_input_format(AVInputFormat *format)
146 while (*p != NULL) p = &(*p)->next;
151 void av_register_output_format(AVOutputFormat *format)
155 while (*p != NULL) p = &(*p)->next;
160 int av_match_ext(const char *filename, const char *extensions)
168 ext = strrchr(filename, '.');
174 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
177 if (!av_strcasecmp(ext1, ext))
187 static int match_format(const char *name, const char *names)
195 namelen = strlen(name);
196 while ((p = strchr(names, ','))) {
197 len = FFMAX(p - names, namelen);
198 if (!av_strncasecmp(name, names, len))
202 return !av_strcasecmp(name, names);
205 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
206 const char *mime_type)
208 AVOutputFormat *fmt = NULL, *fmt_found;
209 int score_max, score;
211 /* specific test for image sequences */
212 #if CONFIG_IMAGE2_MUXER
213 if (!short_name && filename &&
214 av_filename_number_test(filename) &&
215 ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
216 return av_guess_format("image2", NULL, NULL);
219 /* Find the proper file type. */
222 while ((fmt = av_oformat_next(fmt))) {
224 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
226 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
228 if (filename && fmt->extensions &&
229 av_match_ext(filename, fmt->extensions)) {
232 if (score > score_max) {
240 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
241 const char *filename, const char *mime_type, enum AVMediaType type){
242 if(type == AVMEDIA_TYPE_VIDEO){
243 enum CodecID codec_id= CODEC_ID_NONE;
245 #if CONFIG_IMAGE2_MUXER
246 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
247 codec_id= ff_guess_image2_codec(filename);
250 if(codec_id == CODEC_ID_NONE)
251 codec_id= fmt->video_codec;
253 }else if(type == AVMEDIA_TYPE_AUDIO)
254 return fmt->audio_codec;
255 else if (type == AVMEDIA_TYPE_SUBTITLE)
256 return fmt->subtitle_codec;
258 return CODEC_ID_NONE;
261 AVInputFormat *av_find_input_format(const char *short_name)
263 AVInputFormat *fmt = NULL;
264 while ((fmt = av_iformat_next(fmt))) {
265 if (match_format(short_name, fmt->name))
271 int ffio_limit(AVIOContext *s, int size)
274 int64_t remaining= s->maxsize - avio_tell(s);
275 if(remaining < size){
276 int64_t newsize= avio_size(s);
277 if(!s->maxsize || s->maxsize<newsize)
278 s->maxsize= newsize - !newsize;
279 remaining= s->maxsize - avio_tell(s);
280 remaining= FFMAX(remaining, 0);
283 if(s->maxsize>=0 && remaining+1 < size){
284 av_log(0, AV_LOG_ERROR, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
291 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
294 size= ffio_limit(s, size);
296 ret= av_new_packet(pkt, size);
301 pkt->pos= avio_tell(s);
303 ret= avio_read(s, pkt->data, size);
307 av_shrink_packet(pkt, ret);
312 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
317 return av_get_packet(s, pkt, size);
318 old_size = pkt->size;
319 ret = av_grow_packet(pkt, size);
322 ret = avio_read(s, pkt->data + old_size, size);
323 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
328 int av_filename_number_test(const char *filename)
331 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
334 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
336 AVProbeData lpd = *pd;
337 AVInputFormat *fmt1 = NULL, *fmt;
338 int score, nodat = 0, score_max=0;
340 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
341 int id3len = ff_id3v2_tag_len(lpd.buf);
342 if (lpd.buf_size > id3len + 16) {
344 lpd.buf_size -= id3len;
350 while ((fmt1 = av_iformat_next(fmt1))) {
351 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
354 if (fmt1->read_probe) {
355 score = fmt1->read_probe(&lpd);
356 if(fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
357 score = FFMAX(score, nodat ? AVPROBE_SCORE_MAX/4-1 : 1);
358 } else if (fmt1->extensions) {
359 if (av_match_ext(lpd.filename, fmt1->extensions)) {
363 if (score > score_max) {
366 }else if (score == score_max)
369 *score_ret= score_max;
374 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
377 AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
378 if(score_ret > *score_max){
379 *score_max= score_ret;
385 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
387 return av_probe_input_format2(pd, is_opened, &score);
390 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
392 static const struct {
393 const char *name; enum CodecID id; enum AVMediaType type;
395 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
396 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
397 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
398 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
399 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
400 { "loas" , CODEC_ID_AAC_LATM , AVMEDIA_TYPE_AUDIO },
401 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
402 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
403 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
407 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
411 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
412 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
413 for (i = 0; fmt_id_type[i].name; i++) {
414 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
415 st->codec->codec_id = fmt_id_type[i].id;
416 st->codec->codec_type = fmt_id_type[i].type;
424 /************************************************************/
425 /* input media file */
427 #if FF_API_FORMAT_PARAMETERS
428 static AVDictionary *convert_format_parameters(AVFormatParameters *ap)
431 AVDictionary *opts = NULL;
436 AV_NOWARN_DEPRECATED(
437 if (ap->time_base.num) {
438 snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
439 av_dict_set(&opts, "framerate", buf, 0);
441 if (ap->sample_rate) {
442 snprintf(buf, sizeof(buf), "%d", ap->sample_rate);
443 av_dict_set(&opts, "sample_rate", buf, 0);
446 snprintf(buf, sizeof(buf), "%d", ap->channels);
447 av_dict_set(&opts, "channels", buf, 0);
449 if (ap->width || ap->height) {
450 snprintf(buf, sizeof(buf), "%dx%d", ap->width, ap->height);
451 av_dict_set(&opts, "video_size", buf, 0);
453 if (ap->pix_fmt != PIX_FMT_NONE) {
454 av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(ap->pix_fmt), 0);
457 snprintf(buf, sizeof(buf), "%d", ap->channel);
458 av_dict_set(&opts, "channel", buf, 0);
461 av_dict_set(&opts, "standard", ap->standard, 0);
463 if (ap->mpeg2ts_compute_pcr) {
464 av_dict_set(&opts, "mpeg2ts_compute_pcr", "1", 0);
466 if (ap->initial_pause) {
467 av_dict_set(&opts, "initial_pause", "1", 0);
474 * Open a media file from an IO stream. 'fmt' must be specified.
476 int av_open_input_stream(AVFormatContext **ic_ptr,
477 AVIOContext *pb, const char *filename,
478 AVInputFormat *fmt, AVFormatParameters *ap)
483 AVFormatParameters default_ap;
487 memset(ap, 0, sizeof(default_ap));
489 opts = convert_format_parameters(ap);
491 AV_NOWARN_DEPRECATED(
492 if(!ap->prealloced_context)
493 *ic_ptr = ic = avformat_alloc_context();
498 err = AVERROR(ENOMEM);
501 if (pb && fmt && fmt->flags & AVFMT_NOFILE)
502 av_log(ic, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
503 "will be ignored with AVFMT_NOFILE format.\n");
507 if ((err = avformat_open_input(&ic, filename, fmt, &opts)) < 0)
509 ic->pb = ic->pb ? ic->pb : pb; // don't leak custom pb if it wasn't set above
518 int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap){
521 if (ic->iformat->read_header) {
522 err = ic->iformat->read_header(ic, ap);
527 if (ic->pb && !ic->data_offset)
528 ic->data_offset = avio_tell(ic->pb);
534 /** size of probe buffer, for guessing file type from file contents */
535 #define PROBE_BUF_MIN 2048
536 #define PROBE_BUF_MAX (1<<20)
538 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
539 const char *filename, void *logctx,
540 unsigned int offset, unsigned int max_probe_size)
542 AVProbeData pd = { filename ? filename : "", NULL, -offset };
543 unsigned char *buf = NULL;
544 int ret = 0, probe_size;
546 if (!max_probe_size) {
547 max_probe_size = PROBE_BUF_MAX;
548 } else if (max_probe_size > PROBE_BUF_MAX) {
549 max_probe_size = PROBE_BUF_MAX;
550 } else if (max_probe_size < PROBE_BUF_MIN) {
551 return AVERROR(EINVAL);
554 if (offset >= max_probe_size) {
555 return AVERROR(EINVAL);
558 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
559 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
560 int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
561 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
564 if (probe_size < offset) {
568 /* read probe data */
569 buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
572 return AVERROR(ENOMEM);
575 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
576 /* fail if error was not end of file, otherwise, lower score */
577 if (ret != AVERROR_EOF) {
582 ret = 0; /* error was end of file, nothing read */
585 pd.buf = &buf[offset];
587 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
589 /* guess file format */
590 *fmt = av_probe_input_format2(&pd, 1, &score);
592 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
593 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
595 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
601 return AVERROR_INVALIDDATA;
604 /* rewind. reuse probe buffer to avoid seeking */
605 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
611 #if FF_API_FORMAT_PARAMETERS
612 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
615 AVFormatParameters *ap)
618 AVDictionary *opts = convert_format_parameters(ap);
620 AV_NOWARN_DEPRECATED(
621 if (!ap || !ap->prealloced_context)
625 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
632 /* open input file and probe the format if necessary */
633 static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)
636 AVProbeData pd = {filename, NULL, 0};
639 s->flags |= AVFMT_FLAG_CUSTOM_IO;
641 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
642 else if (s->iformat->flags & AVFMT_NOFILE)
643 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
644 "will be ignored with AVFMT_NOFILE format.\n");
648 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
649 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
652 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ,
653 &s->interrupt_callback, options)) < 0)
657 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
660 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
662 AVFormatContext *s = *ps;
664 AVFormatParameters ap = { { 0 } };
665 AVDictionary *tmp = NULL;
667 if (!s && !(s = avformat_alloc_context()))
668 return AVERROR(ENOMEM);
673 av_dict_copy(&tmp, *options, 0);
675 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
678 if ((ret = init_input(s, filename, &tmp)) < 0)
681 /* check filename in case an image number is expected */
682 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
683 if (!av_filename_number_test(filename)) {
684 ret = AVERROR(EINVAL);
689 s->duration = s->start_time = AV_NOPTS_VALUE;
690 av_strlcpy(s->filename, filename, sizeof(s->filename));
692 /* allocate private data */
693 if (s->iformat->priv_data_size > 0) {
694 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
695 ret = AVERROR(ENOMEM);
698 if (s->iformat->priv_class) {
699 *(const AVClass**)s->priv_data = s->iformat->priv_class;
700 av_opt_set_defaults(s->priv_data);
701 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
706 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
708 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
710 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
711 if ((ret = s->iformat->read_header(s, &ap)) < 0)
714 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
715 s->data_offset = avio_tell(s->pb);
717 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
720 av_dict_free(options);
728 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
730 avformat_free_context(s);
735 /*******************************************************/
737 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
738 AVPacketList **plast_pktl){
739 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
744 (*plast_pktl)->next = pktl;
746 *packet_buffer = pktl;
748 /* add the packet in the buffered packet list */
754 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
760 AVPacketList *pktl = s->raw_packet_buffer;
764 if(s->streams[pkt->stream_index]->request_probe <= 0){
765 s->raw_packet_buffer = pktl->next;
766 s->raw_packet_buffer_remaining_size += pkt->size;
773 ret= s->iformat->read_packet(s, pkt);
775 if (!pktl || ret == AVERROR(EAGAIN))
777 for (i = 0; i < s->nb_streams; i++)
778 if(s->streams[i]->request_probe > 0)
779 s->streams[i]->request_probe = -1;
783 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
784 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
785 av_log(s, AV_LOG_WARNING,
786 "Dropped corrupted packet (stream = %d)\n",
792 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
793 av_packet_merge_side_data(pkt);
795 if(pkt->stream_index >= (unsigned)s->nb_streams){
796 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
800 st= s->streams[pkt->stream_index];
802 switch(st->codec->codec_type){
803 case AVMEDIA_TYPE_VIDEO:
804 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
806 case AVMEDIA_TYPE_AUDIO:
807 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
809 case AVMEDIA_TYPE_SUBTITLE:
810 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
814 if(!pktl && st->request_probe <= 0)
817 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
818 s->raw_packet_buffer_remaining_size -= pkt->size;
820 if(st->request_probe>0){
821 AVProbeData *pd = &st->probe_data;
823 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
826 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
827 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
828 pd->buf_size += pkt->size;
829 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
831 end= s->raw_packet_buffer_remaining_size <= 0
832 || st->probe_packets<=0;
834 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
835 int score= set_codec_from_probe_data(s, st, pd);
836 if( (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
840 st->request_probe= -1;
841 if(st->codec->codec_id != CODEC_ID_NONE){
842 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
844 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
851 /**********************************************************/
854 * Get the number of samples of an audio frame. Return -1 on error.
856 static int get_audio_frame_size(AVCodecContext *enc, int size)
860 if(enc->codec_id == CODEC_ID_VORBIS)
863 if (enc->frame_size <= 1) {
864 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
866 if (bits_per_sample) {
867 if (enc->channels == 0)
869 frame_size = (size << 3) / (bits_per_sample * enc->channels);
871 /* used for example by ADPCM codecs */
872 if (enc->bit_rate == 0)
874 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
877 frame_size = enc->frame_size;
884 * Return the frame duration in seconds. Return 0 if not available.
886 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
887 AVCodecParserContext *pc, AVPacket *pkt)
893 switch(st->codec->codec_type) {
894 case AVMEDIA_TYPE_VIDEO:
895 if (st->r_frame_rate.num && !pc) {
896 *pnum = st->r_frame_rate.den;
897 *pden = st->r_frame_rate.num;
898 } else if(st->time_base.num*1000LL > st->time_base.den) {
899 *pnum = st->time_base.num;
900 *pden = st->time_base.den;
901 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
902 *pnum = st->codec->time_base.num;
903 *pden = st->codec->time_base.den;
904 if (pc && pc->repeat_pict) {
905 *pnum = (*pnum) * (1 + pc->repeat_pict);
907 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
908 //Thus if we have no parser in such case leave duration undefined.
909 if(st->codec->ticks_per_frame>1 && !pc){
914 case AVMEDIA_TYPE_AUDIO:
915 frame_size = get_audio_frame_size(st->codec, pkt->size);
916 if (frame_size <= 0 || st->codec->sample_rate <= 0)
919 *pden = st->codec->sample_rate;
926 static int is_intra_only(AVCodecContext *enc){
927 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
929 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
930 switch(enc->codec_id){
932 case CODEC_ID_MJPEGB:
934 case CODEC_ID_PRORES:
935 case CODEC_ID_RAWVIDEO:
936 case CODEC_ID_DVVIDEO:
937 case CODEC_ID_HUFFYUV:
938 case CODEC_ID_FFVHUFF:
943 case CODEC_ID_JPEG2000:
951 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
952 int64_t dts, int64_t pts)
954 AVStream *st= s->streams[stream_index];
955 AVPacketList *pktl= s->packet_buffer;
957 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
960 st->first_dts= dts - st->cur_dts;
963 for(; pktl; pktl= pktl->next){
964 if(pktl->pkt.stream_index != stream_index)
966 //FIXME think more about this check
967 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
968 pktl->pkt.pts += st->first_dts;
970 if(pktl->pkt.dts != AV_NOPTS_VALUE)
971 pktl->pkt.dts += st->first_dts;
973 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
974 st->start_time= pktl->pkt.pts;
976 if (st->start_time == AV_NOPTS_VALUE)
977 st->start_time = pts;
980 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
982 AVPacketList *pktl= s->packet_buffer;
985 if(st->first_dts != AV_NOPTS_VALUE){
986 cur_dts= st->first_dts;
987 for(; pktl; pktl= pktl->next){
988 if(pktl->pkt.stream_index == pkt->stream_index){
989 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
991 cur_dts -= pkt->duration;
994 pktl= s->packet_buffer;
995 st->first_dts = cur_dts;
996 }else if(st->cur_dts)
999 for(; pktl; pktl= pktl->next){
1000 if(pktl->pkt.stream_index != pkt->stream_index)
1002 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
1003 && !pktl->pkt.duration){
1004 pktl->pkt.dts= cur_dts;
1005 if(!st->codec->has_b_frames)
1006 pktl->pkt.pts= cur_dts;
1007 cur_dts += pkt->duration;
1008 pktl->pkt.duration= pkt->duration;
1012 if(st->first_dts == AV_NOPTS_VALUE)
1013 st->cur_dts= cur_dts;
1016 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1017 AVCodecParserContext *pc, AVPacket *pkt)
1019 int num, den, presentation_delayed, delay, i;
1022 if (s->flags & AVFMT_FLAG_NOFILLIN)
1025 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1026 pkt->dts= AV_NOPTS_VALUE;
1028 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
1029 //FIXME Set low_delay = 0 when has_b_frames = 1
1030 st->codec->has_b_frames = 1;
1032 /* do we have a video B-frame ? */
1033 delay= st->codec->has_b_frames;
1034 presentation_delayed = 0;
1036 /* XXX: need has_b_frame, but cannot get it if the codec is
1039 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1040 presentation_delayed = 1;
1042 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){
1043 pkt->dts -= 1LL<<st->pts_wrap_bits;
1046 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
1047 // we take the conservative approach and discard both
1048 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
1049 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
1050 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1051 pkt->dts= AV_NOPTS_VALUE;
1054 if (pkt->duration == 0) {
1055 compute_frame_duration(&num, &den, st, pc, pkt);
1057 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1059 if(pkt->duration != 0 && s->packet_buffer)
1060 update_initial_durations(s, st, pkt);
1064 /* correct timestamps with byte offset if demuxers only have timestamps
1065 on packet boundaries */
1066 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1067 /* this will estimate bitrate based on this frame's duration and size */
1068 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1069 if(pkt->pts != AV_NOPTS_VALUE)
1071 if(pkt->dts != AV_NOPTS_VALUE)
1075 if (pc && pc->dts_sync_point >= 0) {
1076 // we have synchronization info from the parser
1077 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1079 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1080 if (pkt->dts != AV_NOPTS_VALUE) {
1081 // got DTS from the stream, update reference timestamp
1082 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1083 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1084 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1085 // compute DTS based on reference timestamp
1086 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1087 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1089 if (pc->dts_sync_point > 0)
1090 st->reference_dts = pkt->dts; // new reference
1094 /* This may be redundant, but it should not hurt. */
1095 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1096 presentation_delayed = 1;
1098 // 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);
1099 /* interpolate PTS and DTS if they are not present */
1100 //We skip H264 currently because delay and has_b_frames are not reliably set
1101 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1102 if (presentation_delayed) {
1103 /* DTS = decompression timestamp */
1104 /* PTS = presentation timestamp */
1105 if (pkt->dts == AV_NOPTS_VALUE)
1106 pkt->dts = st->last_IP_pts;
1107 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1108 if (pkt->dts == AV_NOPTS_VALUE)
1109 pkt->dts = st->cur_dts;
1111 /* this is tricky: the dts must be incremented by the duration
1112 of the frame we are displaying, i.e. the last I- or P-frame */
1113 if (st->last_IP_duration == 0)
1114 st->last_IP_duration = pkt->duration;
1115 if(pkt->dts != AV_NOPTS_VALUE)
1116 st->cur_dts = pkt->dts + st->last_IP_duration;
1117 st->last_IP_duration = pkt->duration;
1118 st->last_IP_pts= pkt->pts;
1119 /* cannot compute PTS if not present (we can compute it only
1120 by knowing the future */
1121 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1122 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1123 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1124 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1125 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1126 pkt->pts += pkt->duration;
1127 // 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);
1131 /* presentation is not delayed : PTS and DTS are the same */
1132 if(pkt->pts == AV_NOPTS_VALUE)
1133 pkt->pts = pkt->dts;
1134 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1135 if(pkt->pts == AV_NOPTS_VALUE)
1136 pkt->pts = st->cur_dts;
1137 pkt->dts = pkt->pts;
1138 if(pkt->pts != AV_NOPTS_VALUE)
1139 st->cur_dts = pkt->pts + pkt->duration;
1143 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1144 st->pts_buffer[0]= pkt->pts;
1145 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1146 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1147 if(pkt->dts == AV_NOPTS_VALUE)
1148 pkt->dts= st->pts_buffer[0];
1149 if(st->codec->codec_id == CODEC_ID_H264){ // we skipped it above so we try here
1150 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1152 if(pkt->dts > st->cur_dts)
1153 st->cur_dts = pkt->dts;
1156 // 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);
1159 if(is_intra_only(st->codec))
1160 pkt->flags |= AV_PKT_FLAG_KEY;
1163 /* keyframe computation */
1164 if (pc->key_frame == 1)
1165 pkt->flags |= AV_PKT_FLAG_KEY;
1166 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1167 pkt->flags |= AV_PKT_FLAG_KEY;
1170 pkt->convergence_duration = pc->convergence_duration;
1174 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1179 av_init_packet(pkt);
1182 /* select current input stream component */
1185 if (!st->need_parsing || !st->parser) {
1186 /* no parsing needed: we just output the packet as is */
1187 /* raw data support */
1189 st->cur_pkt.data= NULL;
1190 st->cur_pkt.side_data_elems = 0;
1191 st->cur_pkt.side_data = NULL;
1192 compute_pkt_fields(s, st, NULL, pkt);
1194 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1195 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1196 ff_reduce_index(s, st->index);
1197 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1200 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1201 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1202 st->cur_ptr, st->cur_len,
1203 st->cur_pkt.pts, st->cur_pkt.dts,
1205 st->cur_pkt.pts = AV_NOPTS_VALUE;
1206 st->cur_pkt.dts = AV_NOPTS_VALUE;
1207 /* increment read pointer */
1211 /* return packet if any */
1215 pkt->stream_index = st->index;
1216 pkt->pts = st->parser->pts;
1217 pkt->dts = st->parser->dts;
1218 pkt->pos = st->parser->pos;
1219 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1221 pkt->destruct= st->cur_pkt.destruct;
1222 st->cur_pkt.destruct= NULL;
1223 st->cur_pkt.data = NULL;
1224 assert(st->cur_len == 0);
1226 pkt->destruct = NULL;
1228 compute_pkt_fields(s, st, st->parser, pkt);
1230 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1231 int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
1232 ff_reduce_index(s, st->index);
1233 av_add_index_entry(st, pos, pkt->dts,
1234 0, 0, AVINDEX_KEYFRAME);
1241 av_free_packet(&st->cur_pkt);
1246 /* read next packet */
1247 ret = av_read_packet(s, &cur_pkt);
1249 if (ret == AVERROR(EAGAIN))
1251 /* return the last frames, if any */
1252 for(i = 0; i < s->nb_streams; i++) {
1254 if (st->parser && st->need_parsing) {
1255 av_parser_parse2(st->parser, st->codec,
1256 &pkt->data, &pkt->size,
1258 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1264 /* no more packets: really terminate parsing */
1267 st = s->streams[cur_pkt.stream_index];
1268 st->cur_pkt= cur_pkt;
1270 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1271 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1272 st->cur_pkt.pts < st->cur_pkt.dts){
1273 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1274 st->cur_pkt.stream_index,
1278 // av_free_packet(&st->cur_pkt);
1282 if(s->debug & FF_FDEBUG_TS)
1283 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1284 st->cur_pkt.stream_index,
1288 st->cur_pkt.duration,
1292 st->cur_ptr = st->cur_pkt.data;
1293 st->cur_len = st->cur_pkt.size;
1294 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1295 st->parser = av_parser_init(st->codec->codec_id);
1297 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1298 "%s, packets or times may be invalid.\n",
1299 avcodec_get_name(st->codec->codec_id));
1300 /* no parser available: just output the raw packets */
1301 st->need_parsing = AVSTREAM_PARSE_NONE;
1302 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1303 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1304 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1305 st->parser->flags |= PARSER_FLAG_ONCE;
1310 if(s->debug & FF_FDEBUG_TS)
1311 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1322 static int read_from_packet_buffer(AVFormatContext *s, AVPacket *pkt)
1324 AVPacketList *pktl = s->packet_buffer;
1327 s->packet_buffer = pktl->next;
1332 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1334 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1338 return s->packet_buffer ? read_from_packet_buffer(s, pkt) :
1339 read_frame_internal(s, pkt);
1343 AVPacketList *pktl = s->packet_buffer;
1346 AVPacket *next_pkt = &pktl->pkt;
1348 if (next_pkt->dts != AV_NOPTS_VALUE) {
1349 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1350 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1351 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1352 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0) &&
1353 av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1354 next_pkt->pts = pktl->pkt.dts;
1358 pktl = s->packet_buffer;
1361 /* read packet from packet buffer, if there is data */
1362 if (!(next_pkt->pts == AV_NOPTS_VALUE &&
1363 next_pkt->dts != AV_NOPTS_VALUE && !eof))
1364 return read_from_packet_buffer(s, pkt);
1367 ret = read_frame_internal(s, pkt);
1369 if (pktl && ret != AVERROR(EAGAIN)) {
1376 if (av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1377 &s->packet_buffer_end)) < 0)
1378 return AVERROR(ENOMEM);
1382 /* XXX: suppress the packet queue */
1383 static void flush_packet_queue(AVFormatContext *s)
1388 pktl = s->packet_buffer;
1391 s->packet_buffer = pktl->next;
1392 av_free_packet(&pktl->pkt);
1395 while(s->raw_packet_buffer){
1396 pktl = s->raw_packet_buffer;
1397 s->raw_packet_buffer = pktl->next;
1398 av_free_packet(&pktl->pkt);
1401 s->packet_buffer_end=
1402 s->raw_packet_buffer_end= NULL;
1403 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1406 /*******************************************************/
1409 int av_find_default_stream_index(AVFormatContext *s)
1411 int first_audio_index = -1;
1415 if (s->nb_streams <= 0)
1417 for(i = 0; i < s->nb_streams; i++) {
1419 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1422 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1423 first_audio_index = i;
1425 return first_audio_index >= 0 ? first_audio_index : 0;
1429 * Flush the frame reader.
1431 void ff_read_frame_flush(AVFormatContext *s)
1436 flush_packet_queue(s);
1440 /* for each stream, reset read state */
1441 for(i = 0; i < s->nb_streams; i++) {
1445 av_parser_close(st->parser);
1447 av_free_packet(&st->cur_pkt);
1449 st->last_IP_pts = AV_NOPTS_VALUE;
1450 if(st->first_dts == AV_NOPTS_VALUE) st->cur_dts = 0;
1451 else st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1452 st->reference_dts = AV_NOPTS_VALUE;
1457 st->probe_packets = MAX_PROBE_PACKETS;
1459 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1460 st->pts_buffer[j]= AV_NOPTS_VALUE;
1464 #if FF_API_SEEK_PUBLIC
1465 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1467 ff_update_cur_dts(s, ref_st, timestamp);
1471 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1475 for(i = 0; i < s->nb_streams; i++) {
1476 AVStream *st = s->streams[i];
1478 st->cur_dts = av_rescale(timestamp,
1479 st->time_base.den * (int64_t)ref_st->time_base.num,
1480 st->time_base.num * (int64_t)ref_st->time_base.den);
1484 void ff_reduce_index(AVFormatContext *s, int stream_index)
1486 AVStream *st= s->streams[stream_index];
1487 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1489 if((unsigned)st->nb_index_entries >= max_entries){
1491 for(i=0; 2*i<st->nb_index_entries; i++)
1492 st->index_entries[i]= st->index_entries[2*i];
1493 st->nb_index_entries= i;
1497 int ff_add_index_entry(AVIndexEntry **index_entries,
1498 int *nb_index_entries,
1499 unsigned int *index_entries_allocated_size,
1500 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1502 AVIndexEntry *entries, *ie;
1505 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1508 entries = av_fast_realloc(*index_entries,
1509 index_entries_allocated_size,
1510 (*nb_index_entries + 1) *
1511 sizeof(AVIndexEntry));
1515 *index_entries= entries;
1517 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1520 index= (*nb_index_entries)++;
1521 ie= &entries[index];
1522 assert(index==0 || ie[-1].timestamp < timestamp);
1524 ie= &entries[index];
1525 if(ie->timestamp != timestamp){
1526 if(ie->timestamp <= timestamp)
1528 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1529 (*nb_index_entries)++;
1530 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1531 distance= ie->min_distance;
1535 ie->timestamp = timestamp;
1536 ie->min_distance= distance;
1543 int av_add_index_entry(AVStream *st,
1544 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1546 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1547 &st->index_entries_allocated_size, pos,
1548 timestamp, size, distance, flags);
1551 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1552 int64_t wanted_timestamp, int flags)
1560 //optimize appending index entries at the end
1561 if(b && entries[b-1].timestamp < wanted_timestamp)
1566 timestamp = entries[m].timestamp;
1567 if(timestamp >= wanted_timestamp)
1569 if(timestamp <= wanted_timestamp)
1572 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1574 if(!(flags & AVSEEK_FLAG_ANY)){
1575 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1576 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1585 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1588 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1589 wanted_timestamp, flags);
1592 #if FF_API_SEEK_PUBLIC
1593 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1594 return ff_seek_frame_binary(s, stream_index, target_ts, flags);
1598 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
1600 AVInputFormat *avif= s->iformat;
1601 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1602 int64_t ts_min, ts_max, ts;
1607 if (stream_index < 0)
1610 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1613 ts_min= AV_NOPTS_VALUE;
1614 pos_limit= -1; //gcc falsely says it may be uninitialized
1616 st= s->streams[stream_index];
1617 if(st->index_entries){
1620 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()
1621 index= FFMAX(index, 0);
1622 e= &st->index_entries[index];
1624 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1626 ts_min= e->timestamp;
1627 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1633 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1634 assert(index < st->nb_index_entries);
1636 e= &st->index_entries[index];
1637 assert(e->timestamp >= target_ts);
1639 ts_max= e->timestamp;
1640 pos_limit= pos_max - e->min_distance;
1641 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1642 pos_max,pos_limit, ts_max);
1646 pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1651 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1654 ff_read_frame_flush(s);
1655 ff_update_cur_dts(s, st, ts);
1660 #if FF_API_SEEK_PUBLIC
1661 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1662 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1663 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1664 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1666 return ff_gen_search(s, stream_index, target_ts, pos_min, pos_max,
1667 pos_limit, ts_min, ts_max, flags, ts_ret,
1672 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1673 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1674 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1675 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1678 int64_t start_pos, filesize;
1681 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1683 if(ts_min == AV_NOPTS_VALUE){
1684 pos_min = s->data_offset;
1685 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1686 if (ts_min == AV_NOPTS_VALUE)
1690 if(ts_min >= target_ts){
1695 if(ts_max == AV_NOPTS_VALUE){
1697 filesize = avio_size(s->pb);
1698 pos_max = filesize - 1;
1701 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1703 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1704 if (ts_max == AV_NOPTS_VALUE)
1708 int64_t tmp_pos= pos_max + 1;
1709 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1710 if(tmp_ts == AV_NOPTS_VALUE)
1714 if(tmp_pos >= filesize)
1720 if(ts_max <= target_ts){
1725 if(ts_min > ts_max){
1727 }else if(ts_min == ts_max){
1732 while (pos_min < pos_limit) {
1733 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1734 pos_min, pos_max, ts_min, ts_max);
1735 assert(pos_limit <= pos_max);
1738 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1739 // interpolate position (better than dichotomy)
1740 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1741 + pos_min - approximate_keyframe_distance;
1742 }else if(no_change==1){
1743 // bisection, if interpolation failed to change min or max pos last time
1744 pos = (pos_min + pos_limit)>>1;
1746 /* linear search if bisection failed, can only happen if there
1747 are very few or no keyframes between min/max */
1752 else if(pos > pos_limit)
1756 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1761 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1762 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1763 pos_limit, start_pos, no_change);
1764 if(ts == AV_NOPTS_VALUE){
1765 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1768 assert(ts != AV_NOPTS_VALUE);
1769 if (target_ts <= ts) {
1770 pos_limit = start_pos - 1;
1774 if (target_ts >= ts) {
1780 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1781 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1784 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1786 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1787 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1788 pos, ts_min, target_ts, ts_max);
1794 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1795 int64_t pos_min, pos_max;
1799 if (stream_index < 0)
1802 st= s->streams[stream_index];
1805 pos_min = s->data_offset;
1806 pos_max = avio_size(s->pb) - 1;
1808 if (pos < pos_min) pos= pos_min;
1809 else if(pos > pos_max) pos= pos_max;
1811 avio_seek(s->pb, pos, SEEK_SET);
1814 av_update_cur_dts(s, st, ts);
1819 static int seek_frame_generic(AVFormatContext *s,
1820 int stream_index, int64_t timestamp, int flags)
1827 st = s->streams[stream_index];
1829 index = av_index_search_timestamp(st, timestamp, flags);
1831 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1834 if(index < 0 || index==st->nb_index_entries-1){
1838 if(st->nb_index_entries){
1839 assert(st->index_entries);
1840 ie= &st->index_entries[st->nb_index_entries-1];
1841 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1843 ff_update_cur_dts(s, st, ie->timestamp);
1845 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1851 read_status = av_read_frame(s, &pkt);
1852 } while (read_status == AVERROR(EAGAIN));
1853 if (read_status < 0)
1855 av_free_packet(&pkt);
1856 if(stream_index == pkt.stream_index && pkt.dts > timestamp){
1857 if(pkt.flags & AV_PKT_FLAG_KEY)
1859 if(nonkey++ > 1000 && st->codec->codec_id != CODEC_ID_CDGRAPHICS){
1860 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);
1865 index = av_index_search_timestamp(st, timestamp, flags);
1870 ff_read_frame_flush(s);
1871 AV_NOWARN_DEPRECATED(
1872 if (s->iformat->read_seek){
1873 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1877 ie = &st->index_entries[index];
1878 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1880 ff_update_cur_dts(s, st, ie->timestamp);
1885 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1890 if (flags & AVSEEK_FLAG_BYTE) {
1891 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1893 ff_read_frame_flush(s);
1894 return seek_frame_byte(s, stream_index, timestamp, flags);
1897 if(stream_index < 0){
1898 stream_index= av_find_default_stream_index(s);
1899 if(stream_index < 0)
1902 st= s->streams[stream_index];
1903 /* timestamp for default must be expressed in AV_TIME_BASE units */
1904 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1907 /* first, we try the format specific seek */
1908 AV_NOWARN_DEPRECATED(
1909 if (s->iformat->read_seek) {
1910 ff_read_frame_flush(s);
1911 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1919 if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1920 ff_read_frame_flush(s);
1921 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1922 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1923 ff_read_frame_flush(s);
1924 return seek_frame_generic(s, stream_index, timestamp, flags);
1930 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1932 if(min_ts > ts || max_ts < ts)
1935 if (s->iformat->read_seek2) {
1936 ff_read_frame_flush(s);
1937 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1940 if(s->iformat->read_timestamp){
1941 //try to seek via read_timestamp()
1944 //Fallback to old API if new is not implemented but old is
1945 //Note the old has somewat different sematics
1946 AV_NOWARN_DEPRECATED(
1947 if(s->iformat->read_seek || 1)
1948 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1951 // try some generic seek like seek_frame_generic() but with new ts semantics
1954 /*******************************************************/
1957 * Return TRUE if the stream has accurate duration in any stream.
1959 * @return TRUE if the stream has accurate duration for at least one component.
1961 static int has_duration(AVFormatContext *ic)
1965 if(ic->duration != AV_NOPTS_VALUE)
1968 for(i = 0;i < ic->nb_streams; i++) {
1969 st = ic->streams[i];
1970 if (st->duration != AV_NOPTS_VALUE)
1977 * Estimate the stream timings from the one of each components.
1979 * Also computes the global bitrate if possible.
1981 static void update_stream_timings(AVFormatContext *ic)
1983 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1984 int64_t duration, duration1, filesize;
1988 start_time = INT64_MAX;
1989 start_time_text = INT64_MAX;
1990 end_time = INT64_MIN;
1991 duration = INT64_MIN;
1992 for(i = 0;i < ic->nb_streams; i++) {
1993 st = ic->streams[i];
1994 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1995 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1996 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1997 if (start_time1 < start_time_text)
1998 start_time_text = start_time1;
2000 start_time = FFMIN(start_time, start_time1);
2001 if (st->duration != AV_NOPTS_VALUE) {
2002 end_time1 = start_time1
2003 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
2004 end_time = FFMAX(end_time, end_time1);
2007 if (st->duration != AV_NOPTS_VALUE) {
2008 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
2009 duration = FFMAX(duration, duration1);
2012 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2013 start_time = start_time_text;
2014 if (start_time != INT64_MAX) {
2015 ic->start_time = start_time;
2016 if (end_time != INT64_MIN)
2017 duration = FFMAX(duration, end_time - start_time);
2019 if (duration != INT64_MIN && ic->duration == AV_NOPTS_VALUE) {
2020 ic->duration = duration;
2022 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
2023 /* compute the bitrate */
2024 ic->bit_rate = (double)filesize * 8.0 * AV_TIME_BASE /
2025 (double)ic->duration;
2029 static void fill_all_stream_timings(AVFormatContext *ic)
2034 update_stream_timings(ic);
2035 for(i = 0;i < ic->nb_streams; i++) {
2036 st = ic->streams[i];
2037 if (st->start_time == AV_NOPTS_VALUE) {
2038 if(ic->start_time != AV_NOPTS_VALUE)
2039 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
2040 if(ic->duration != AV_NOPTS_VALUE)
2041 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
2046 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2048 int64_t filesize, duration;
2052 /* if bit_rate is already set, we believe it */
2053 if (ic->bit_rate <= 0) {
2055 for(i=0;i<ic->nb_streams;i++) {
2056 st = ic->streams[i];
2057 if (st->codec->bit_rate > 0)
2058 bit_rate += st->codec->bit_rate;
2060 ic->bit_rate = bit_rate;
2063 /* if duration is already set, we believe it */
2064 if (ic->duration == AV_NOPTS_VALUE &&
2065 ic->bit_rate != 0) {
2066 filesize = ic->pb ? avio_size(ic->pb) : 0;
2068 for(i = 0; i < ic->nb_streams; i++) {
2069 st = ic->streams[i];
2070 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
2071 if (st->duration == AV_NOPTS_VALUE)
2072 st->duration = duration;
2078 #define DURATION_MAX_READ_SIZE 250000
2079 #define DURATION_MAX_RETRY 3
2081 /* only usable for MPEG-PS streams */
2082 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2084 AVPacket pkt1, *pkt = &pkt1;
2086 int read_size, i, ret;
2088 int64_t filesize, offset, duration;
2093 /* flush packet queue */
2094 flush_packet_queue(ic);
2096 for (i=0; i<ic->nb_streams; i++) {
2097 st = ic->streams[i];
2098 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
2099 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2102 av_parser_close(st->parser);
2104 av_free_packet(&st->cur_pkt);
2108 /* estimate the end time (duration) */
2109 /* XXX: may need to support wrapping */
2110 filesize = ic->pb ? avio_size(ic->pb) : 0;
2111 end_time = AV_NOPTS_VALUE;
2113 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2117 avio_seek(ic->pb, offset, SEEK_SET);
2120 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2124 ret = av_read_packet(ic, pkt);
2125 } while(ret == AVERROR(EAGAIN));
2128 read_size += pkt->size;
2129 st = ic->streams[pkt->stream_index];
2130 if (pkt->pts != AV_NOPTS_VALUE &&
2131 (st->start_time != AV_NOPTS_VALUE ||
2132 st->first_dts != AV_NOPTS_VALUE)) {
2133 duration = end_time = pkt->pts;
2134 if (st->start_time != AV_NOPTS_VALUE)
2135 duration -= st->start_time;
2137 duration -= st->first_dts;
2139 duration += 1LL<<st->pts_wrap_bits;
2141 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2142 st->duration = duration;
2145 av_free_packet(pkt);
2147 }while( end_time==AV_NOPTS_VALUE
2148 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2149 && ++retry <= DURATION_MAX_RETRY);
2151 fill_all_stream_timings(ic);
2153 avio_seek(ic->pb, old_offset, SEEK_SET);
2154 for (i=0; i<ic->nb_streams; i++) {
2156 st->cur_dts= st->first_dts;
2157 st->last_IP_pts = AV_NOPTS_VALUE;
2158 st->reference_dts = AV_NOPTS_VALUE;
2162 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2166 /* get the file size, if possible */
2167 if (ic->iformat->flags & AVFMT_NOFILE) {
2170 file_size = avio_size(ic->pb);
2171 file_size = FFMAX(0, file_size);
2174 if ((!strcmp(ic->iformat->name, "mpeg") ||
2175 !strcmp(ic->iformat->name, "mpegts")) &&
2176 file_size && ic->pb->seekable) {
2177 /* get accurate estimate from the PTSes */
2178 estimate_timings_from_pts(ic, old_offset);
2179 } else if (has_duration(ic)) {
2180 /* at least one component has timings - we use them for all
2182 fill_all_stream_timings(ic);
2184 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2185 /* less precise: use bitrate info */
2186 estimate_timings_from_bit_rate(ic);
2188 update_stream_timings(ic);
2192 AVStream av_unused *st;
2193 for(i = 0;i < ic->nb_streams; i++) {
2194 st = ic->streams[i];
2195 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2196 (double) st->start_time / AV_TIME_BASE,
2197 (double) st->duration / AV_TIME_BASE);
2199 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2200 (double) ic->start_time / AV_TIME_BASE,
2201 (double) ic->duration / AV_TIME_BASE,
2202 ic->bit_rate / 1000);
2206 static int has_codec_parameters(AVCodecContext *avctx)
2209 switch (avctx->codec_type) {
2210 case AVMEDIA_TYPE_AUDIO:
2211 val = avctx->sample_rate && avctx->channels && avctx->sample_fmt != AV_SAMPLE_FMT_NONE;
2212 if (!avctx->frame_size &&
2213 (avctx->codec_id == CODEC_ID_VORBIS ||
2214 avctx->codec_id == CODEC_ID_AAC ||
2215 avctx->codec_id == CODEC_ID_MP1 ||
2216 avctx->codec_id == CODEC_ID_MP2 ||
2217 avctx->codec_id == CODEC_ID_MP3 ||
2218 avctx->codec_id == CODEC_ID_CELT))
2221 case AVMEDIA_TYPE_VIDEO:
2222 val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
2224 case AVMEDIA_TYPE_DATA:
2225 if(avctx->codec_id == CODEC_ID_NONE) return 1;
2230 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2233 static int has_decode_delay_been_guessed(AVStream *st)
2235 return st->codec->codec_id != CODEC_ID_H264 ||
2236 st->info->nb_decoded_frames >= 6;
2239 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2242 int got_picture = 1, ret = 0;
2244 AVPacket pkt = *avpkt;
2246 if(!st->codec->codec){
2247 AVDictionary *thread_opt = NULL;
2249 codec = avcodec_find_decoder(st->codec->codec_id);
2253 /* force thread count to 1 since the h264 decoder will not extract SPS
2254 * and PPS to extradata during multi-threaded decoding */
2255 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2256 ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
2258 av_dict_free(&thread_opt);
2263 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2265 (!has_codec_parameters(st->codec) ||
2266 !has_decode_delay_been_guessed(st) ||
2267 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2269 avcodec_get_frame_defaults(&picture);
2270 switch(st->codec->codec_type) {
2271 case AVMEDIA_TYPE_VIDEO:
2272 ret = avcodec_decode_video2(st->codec, &picture,
2273 &got_picture, &pkt);
2275 case AVMEDIA_TYPE_AUDIO:
2276 ret = avcodec_decode_audio4(st->codec, &picture, &got_picture, &pkt);
2283 st->info->nb_decoded_frames++;
2288 if(!pkt.data && !got_picture)
2293 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2295 while (tags->id != CODEC_ID_NONE) {
2303 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2306 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2307 if(tag == tags[i].tag)
2310 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2311 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2314 return CODEC_ID_NONE;
2317 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2320 for(i=0; tags && tags[i]; i++){
2321 int tag= ff_codec_get_tag(tags[i], id);
2327 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2330 for(i=0; tags && tags[i]; i++){
2331 enum CodecID id= ff_codec_get_id(tags[i], tag);
2332 if(id!=CODEC_ID_NONE) return id;
2334 return CODEC_ID_NONE;
2337 static void compute_chapters_end(AVFormatContext *s)
2340 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2342 for (i = 0; i < s->nb_chapters; i++)
2343 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2344 AVChapter *ch = s->chapters[i];
2345 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2348 for (j = 0; j < s->nb_chapters; j++) {
2349 AVChapter *ch1 = s->chapters[j];
2350 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2351 if (j != i && next_start > ch->start && next_start < end)
2354 ch->end = (end == INT64_MAX) ? ch->start : end;
2358 static int get_std_framerate(int i){
2359 if(i<60*12) return i*1001;
2360 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2364 * Is the time base unreliable.
2365 * This is a heuristic to balance between quick acceptance of the values in
2366 * the headers vs. some extra checks.
2367 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2368 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2369 * And there are "variable" fps files this needs to detect as well.
2371 static int tb_unreliable(AVCodecContext *c){
2372 if( c->time_base.den >= 101L*c->time_base.num
2373 || c->time_base.den < 5L*c->time_base.num
2374 /* || c->codec_tag == AV_RL32("DIVX")
2375 || c->codec_tag == AV_RL32("XVID")*/
2376 || c->codec_id == CODEC_ID_MPEG2VIDEO
2377 || c->codec_id == CODEC_ID_H264
2383 #if FF_API_FORMAT_PARAMETERS
2384 int av_find_stream_info(AVFormatContext *ic)
2386 return avformat_find_stream_info(ic, NULL);
2390 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2392 int i, count, ret, read_size, j;
2394 AVPacket pkt1, *pkt;
2395 int64_t old_offset = avio_tell(ic->pb);
2396 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2397 int flush_codecs = 1;
2399 for(i=0;i<ic->nb_streams;i++) {
2401 AVDictionary *thread_opt = NULL;
2402 st = ic->streams[i];
2404 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2405 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2406 /* if(!st->time_base.num)
2408 if(!st->codec->time_base.num)
2409 st->codec->time_base= st->time_base;
2411 //only for the split stuff
2412 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2413 st->parser = av_parser_init(st->codec->codec_id);
2414 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2415 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2418 assert(!st->codec->codec);
2419 codec = avcodec_find_decoder(st->codec->codec_id);
2421 /* force thread count to 1 since the h264 decoder will not extract SPS
2422 * and PPS to extradata during multi-threaded decoding */
2423 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
2425 /* Ensure that subtitle_header is properly set. */
2426 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2427 && codec && !st->codec->codec)
2428 avcodec_open2(st->codec, codec, options ? &options[i]
2431 //try to just open decoders, in case this is enough to get parameters
2432 if(!has_codec_parameters(st->codec)){
2433 if (codec && !st->codec->codec)
2434 avcodec_open2(st->codec, codec, options ? &options[i]
2438 av_dict_free(&thread_opt);
2441 for (i=0; i<ic->nb_streams; i++) {
2442 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2448 if (ff_check_interrupt(&ic->interrupt_callback)){
2450 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2454 /* check if one codec still needs to be handled */
2455 for(i=0;i<ic->nb_streams;i++) {
2456 int fps_analyze_framecount = 20;
2458 st = ic->streams[i];
2459 if (!has_codec_parameters(st->codec))
2461 /* if the timebase is coarse (like the usual millisecond precision
2462 of mkv), we need to analyze more frames to reliably arrive at
2464 if (av_q2d(st->time_base) > 0.0005)
2465 fps_analyze_framecount *= 2;
2466 if (ic->fps_probe_size >= 0)
2467 fps_analyze_framecount = ic->fps_probe_size;
2468 /* variable fps and no guess at the real fps */
2469 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2470 && st->info->duration_count < fps_analyze_framecount
2471 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2473 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2475 if(st->first_dts == AV_NOPTS_VALUE && (st->codec->codec_type == AVMEDIA_TYPE_VIDEO || st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2478 if (i == ic->nb_streams) {
2479 /* NOTE: if the format has no header, then we need to read
2480 some packets to get most of the streams, so we cannot
2482 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2483 /* if we found the info for all the codecs, we can stop */
2485 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2490 /* we did not get all the codec info, but we read too much data */
2491 if (read_size >= ic->probesize) {
2493 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2497 /* NOTE: a new stream can be added there if no header in file
2498 (AVFMTCTX_NOHEADER) */
2499 ret = read_frame_internal(ic, &pkt1);
2500 if (ret == AVERROR(EAGAIN))
2508 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2509 if ((ret = av_dup_packet(pkt)) < 0)
2510 goto find_stream_info_err;
2512 read_size += pkt->size;
2514 st = ic->streams[pkt->stream_index];
2515 if (st->codec_info_nb_frames>1) {
2517 if (st->time_base.den > 0)
2518 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
2519 if (st->avg_frame_rate.num > 0)
2520 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));
2522 if (t >= ic->max_analyze_duration) {
2523 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2526 st->info->codec_info_duration += pkt->duration;
2529 int64_t last = st->info->last_dts;
2531 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2532 double dts= pkt->dts * av_q2d(st->time_base);
2533 int64_t duration= pkt->dts - last;
2535 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2536 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
2537 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) {
2538 int framerate= get_std_framerate(i);
2539 double sdts= dts*framerate/(1001*12);
2541 int ticks= lrintf(sdts+j*0.5);
2542 double error= sdts - ticks + j*0.5;
2543 st->info->duration_error[j][0][i] += error;
2544 st->info->duration_error[j][1][i] += error*error;
2547 st->info->duration_count++;
2548 // ignore the first 4 values, they might have some random jitter
2549 if (st->info->duration_count > 3)
2550 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2552 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2553 st->info->last_dts = pkt->dts;
2555 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2556 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2557 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
2558 st->codec->extradata_size= i;
2559 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2560 if (!st->codec->extradata)
2561 return AVERROR(ENOMEM);
2562 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2563 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2567 /* if still no information, we try to open the codec and to
2568 decompress the frame. We try to avoid that in most cases as
2569 it takes longer and uses more memory. For MPEG-4, we need to
2570 decompress for QuickTime.
2572 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2573 least one frame of codec data, this makes sure the codec initializes
2574 the channel configuration and does not only trust the values from the container.
2576 try_decode_frame(st, pkt, (options && i < orig_nb_streams ) ? &options[i] : NULL);
2578 st->codec_info_nb_frames++;
2583 AVPacket empty_pkt = { 0 };
2585 av_init_packet(&empty_pkt);
2587 ret = -1; /* we could not have all the codec parameters before EOF */
2588 for(i=0;i<ic->nb_streams;i++) {
2589 st = ic->streams[i];
2591 /* flush the decoders */
2592 while ((err = try_decode_frame(st, &empty_pkt,
2593 (options && i < orig_nb_streams) ?
2594 &options[i] : NULL)) >= 0)
2595 if (has_codec_parameters(st->codec))
2598 if (!has_codec_parameters(st->codec)){
2600 avcodec_string(buf, sizeof(buf), st->codec, 0);
2601 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2608 // close codecs which were opened in try_decode_frame()
2609 for(i=0;i<ic->nb_streams;i++) {
2610 st = ic->streams[i];
2611 if(st->codec->codec)
2612 avcodec_close(st->codec);
2614 for(i=0;i<ic->nb_streams;i++) {
2615 st = ic->streams[i];
2616 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2617 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2618 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2619 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2620 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2621 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2622 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2623 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2624 st->codec->codec_tag= tag;
2627 // the check for tb_unreliable() is not completely correct, since this is not about handling
2628 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2629 // ipmovie.c produces.
2630 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)
2631 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);
2632 if (st->info->duration_count && !st->r_frame_rate.num
2633 && tb_unreliable(st->codec) /*&&
2634 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2635 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2637 double best_error= 0.01;
2639 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) {
2642 if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2644 if(!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
2647 int n= st->info->duration_count;
2648 double a= st->info->duration_error[k][0][j] / n;
2649 double error= st->info->duration_error[k][1][j]/n - a*a;
2651 if(error < best_error && best_error> 0.000000001){
2653 num = get_std_framerate(j);
2656 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2659 // do not increase frame rate by more than 1 % in order to match a standard rate.
2660 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2661 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2664 if (!st->r_frame_rate.num){
2665 if( st->codec->time_base.den * (int64_t)st->time_base.num
2666 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2667 st->r_frame_rate.num = st->codec->time_base.den;
2668 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2670 st->r_frame_rate.num = st->time_base.den;
2671 st->r_frame_rate.den = st->time_base.num;
2674 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2675 if(!st->codec->bits_per_coded_sample)
2676 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2677 // set stream disposition based on audio service type
2678 switch (st->codec->audio_service_type) {
2679 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2680 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2681 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2682 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2683 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2684 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2685 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2686 st->disposition = AV_DISPOSITION_COMMENT; break;
2687 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2688 st->disposition = AV_DISPOSITION_KARAOKE; break;
2693 estimate_timings(ic, old_offset);
2695 compute_chapters_end(ic);
2698 /* correct DTS for B-frame streams with no timestamps */
2699 for(i=0;i<ic->nb_streams;i++) {
2700 st = ic->streams[i];
2701 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2703 ppktl = &ic->packet_buffer;
2705 if(ppkt1->stream_index != i)
2707 if(ppkt1->pkt->dts < 0)
2709 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2711 ppkt1->pkt->dts -= delta;
2716 st->cur_dts -= delta;
2722 find_stream_info_err:
2723 for (i=0; i < ic->nb_streams; i++) {
2724 if (ic->streams[i]->codec)
2725 ic->streams[i]->codec->thread_count = 0;
2726 av_freep(&ic->streams[i]->info);
2731 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2735 for (i = 0; i < ic->nb_programs; i++) {
2736 if (ic->programs[i] == last) {
2740 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2741 if (ic->programs[i]->stream_index[j] == s)
2742 return ic->programs[i];
2748 int av_find_best_stream(AVFormatContext *ic,
2749 enum AVMediaType type,
2750 int wanted_stream_nb,
2752 AVCodec **decoder_ret,
2755 int i, nb_streams = ic->nb_streams;
2756 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2757 unsigned *program = NULL;
2758 AVCodec *decoder = NULL, *best_decoder = NULL;
2760 if (related_stream >= 0 && wanted_stream_nb < 0) {
2761 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2763 program = p->stream_index;
2764 nb_streams = p->nb_stream_indexes;
2767 for (i = 0; i < nb_streams; i++) {
2768 int real_stream_index = program ? program[i] : i;
2769 AVStream *st = ic->streams[real_stream_index];
2770 AVCodecContext *avctx = st->codec;
2771 if (avctx->codec_type != type)
2773 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2775 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2778 decoder = avcodec_find_decoder(st->codec->codec_id);
2781 ret = AVERROR_DECODER_NOT_FOUND;
2785 if (best_count >= st->codec_info_nb_frames)
2787 best_count = st->codec_info_nb_frames;
2788 ret = real_stream_index;
2789 best_decoder = decoder;
2790 if (program && i == nb_streams - 1 && ret < 0) {
2792 nb_streams = ic->nb_streams;
2793 i = 0; /* no related stream found, try again with everything */
2797 *decoder_ret = best_decoder;
2801 /*******************************************************/
2803 int av_read_play(AVFormatContext *s)
2805 if (s->iformat->read_play)
2806 return s->iformat->read_play(s);
2808 return avio_pause(s->pb, 0);
2809 return AVERROR(ENOSYS);
2812 int av_read_pause(AVFormatContext *s)
2814 if (s->iformat->read_pause)
2815 return s->iformat->read_pause(s);
2817 return avio_pause(s->pb, 1);
2818 return AVERROR(ENOSYS);
2821 #if FF_API_FORMAT_PARAMETERS
2822 void av_close_input_stream(AVFormatContext *s)
2824 flush_packet_queue(s);
2825 if (s->iformat->read_close)
2826 s->iformat->read_close(s);
2827 avformat_free_context(s);
2831 void avformat_free_context(AVFormatContext *s)
2837 if (s->iformat && s->iformat->priv_class && s->priv_data)
2838 av_opt_free(s->priv_data);
2840 for(i=0;i<s->nb_streams;i++) {
2841 /* free all data in a stream component */
2844 av_parser_close(st->parser);
2845 av_free_packet(&st->cur_pkt);
2847 av_dict_free(&st->metadata);
2848 av_freep(&st->index_entries);
2849 av_freep(&st->codec->extradata);
2850 av_freep(&st->codec->subtitle_header);
2851 av_freep(&st->codec);
2852 av_freep(&st->priv_data);
2853 av_freep(&st->info);
2856 for(i=s->nb_programs-1; i>=0; i--) {
2857 av_dict_free(&s->programs[i]->metadata);
2858 av_freep(&s->programs[i]->stream_index);
2859 av_freep(&s->programs[i]);
2861 av_freep(&s->programs);
2862 av_freep(&s->priv_data);
2863 while(s->nb_chapters--) {
2864 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2865 av_freep(&s->chapters[s->nb_chapters]);
2867 av_freep(&s->chapters);
2868 av_dict_free(&s->metadata);
2869 av_freep(&s->streams);
2873 #if FF_API_CLOSE_INPUT_FILE
2874 void av_close_input_file(AVFormatContext *s)
2876 avformat_close_input(&s);
2880 void avformat_close_input(AVFormatContext **ps)
2882 AVFormatContext *s = *ps;
2883 AVIOContext *pb = (s->iformat && (s->iformat->flags & AVFMT_NOFILE)) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2885 flush_packet_queue(s);
2886 if (s->iformat && (s->iformat->read_close))
2887 s->iformat->read_close(s);
2888 avformat_free_context(s);
2894 #if FF_API_NEW_STREAM
2895 AVStream *av_new_stream(AVFormatContext *s, int id)
2897 AVStream *st = avformat_new_stream(s, NULL);
2904 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
2910 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2912 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2915 s->streams = streams;
2917 st = av_mallocz(sizeof(AVStream));
2920 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2925 st->codec = avcodec_alloc_context3(c);
2927 /* no default bitrate if decoding */
2928 st->codec->bit_rate = 0;
2930 st->index = s->nb_streams;
2931 st->start_time = AV_NOPTS_VALUE;
2932 st->duration = AV_NOPTS_VALUE;
2933 /* we set the current DTS to 0 so that formats without any timestamps
2934 but durations get some timestamps, formats with some unknown
2935 timestamps have their first few packets buffered and the
2936 timestamps corrected before they are returned to the user */
2938 st->first_dts = AV_NOPTS_VALUE;
2939 st->probe_packets = MAX_PROBE_PACKETS;
2941 /* default pts setting is MPEG-like */
2942 avpriv_set_pts_info(st, 33, 1, 90000);
2943 st->last_IP_pts = AV_NOPTS_VALUE;
2944 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2945 st->pts_buffer[i]= AV_NOPTS_VALUE;
2946 st->reference_dts = AV_NOPTS_VALUE;
2948 st->sample_aspect_ratio = (AVRational){0,1};
2950 s->streams[s->nb_streams++] = st;
2954 AVProgram *av_new_program(AVFormatContext *ac, int id)
2956 AVProgram *program=NULL;
2959 av_dlog(ac, "new_program: id=0x%04x\n", id);
2961 for(i=0; i<ac->nb_programs; i++)
2962 if(ac->programs[i]->id == id)
2963 program = ac->programs[i];
2966 program = av_mallocz(sizeof(AVProgram));
2969 dynarray_add(&ac->programs, &ac->nb_programs, program);
2970 program->discard = AVDISCARD_NONE;
2977 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2979 AVChapter *chapter = NULL;
2982 for(i=0; i<s->nb_chapters; i++)
2983 if(s->chapters[i]->id == id)
2984 chapter = s->chapters[i];
2987 chapter= av_mallocz(sizeof(AVChapter));
2990 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2992 av_dict_set(&chapter->metadata, "title", title, 0);
2994 chapter->time_base= time_base;
2995 chapter->start = start;
3001 /************************************************************/
3002 /* output media file */
3004 #if FF_API_FORMAT_PARAMETERS
3005 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
3007 if (s->oformat->priv_data_size > 0) {
3008 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3010 return AVERROR(ENOMEM);
3011 if (s->oformat->priv_class) {
3012 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3013 av_opt_set_defaults(s->priv_data);
3016 s->priv_data = NULL;
3022 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
3023 const char *format, const char *filename)
3025 AVFormatContext *s = avformat_alloc_context();
3034 oformat = av_guess_format(format, NULL, NULL);
3036 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
3037 ret = AVERROR(EINVAL);
3041 oformat = av_guess_format(NULL, filename, NULL);
3043 ret = AVERROR(EINVAL);
3044 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
3051 s->oformat = oformat;
3052 if (s->oformat->priv_data_size > 0) {
3053 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3056 if (s->oformat->priv_class) {
3057 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3058 av_opt_set_defaults(s->priv_data);
3061 s->priv_data = NULL;
3064 av_strlcpy(s->filename, filename, sizeof(s->filename));
3068 av_log(s, AV_LOG_ERROR, "Out of memory\n");
3069 ret = AVERROR(ENOMEM);
3071 avformat_free_context(s);
3075 #if FF_API_ALLOC_OUTPUT_CONTEXT
3076 AVFormatContext *avformat_alloc_output_context(const char *format,
3077 AVOutputFormat *oformat, const char *filename)
3079 AVFormatContext *avctx;
3080 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
3081 return ret < 0 ? NULL : avctx;
3085 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
3087 const AVCodecTag *avctag;
3089 enum CodecID id = CODEC_ID_NONE;
3090 unsigned int tag = 0;
3093 * Check that tag + id is in the table
3094 * If neither is in the table -> OK
3095 * If tag is in the table with another id -> FAIL
3096 * If id is in the table with another tag -> FAIL unless strict < normal
3098 for (n = 0; s->oformat->codec_tag[n]; n++) {
3099 avctag = s->oformat->codec_tag[n];
3100 while (avctag->id != CODEC_ID_NONE) {
3101 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
3103 if (id == st->codec->codec_id)
3106 if (avctag->id == st->codec->codec_id)
3111 if (id != CODEC_ID_NONE)
3113 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
3118 #if FF_API_FORMAT_PARAMETERS
3119 int av_write_header(AVFormatContext *s)
3121 return avformat_write_header(s, NULL);
3125 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
3129 AVDictionary *tmp = NULL;
3132 av_dict_copy(&tmp, *options, 0);
3133 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
3135 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
3136 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3139 // some sanity checks
3140 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
3141 av_log(s, AV_LOG_ERROR, "no streams\n");
3142 ret = AVERROR(EINVAL);
3146 for(i=0;i<s->nb_streams;i++) {
3149 switch (st->codec->codec_type) {
3150 case AVMEDIA_TYPE_AUDIO:
3151 if(st->codec->sample_rate<=0){
3152 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
3153 ret = AVERROR(EINVAL);
3156 if(!st->codec->block_align)
3157 st->codec->block_align = st->codec->channels *
3158 av_get_bits_per_sample(st->codec->codec_id) >> 3;
3160 case AVMEDIA_TYPE_VIDEO:
3161 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
3162 av_log(s, AV_LOG_ERROR, "time base not set\n");
3163 ret = AVERROR(EINVAL);
3166 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
3167 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
3168 ret = AVERROR(EINVAL);
3171 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
3172 && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
3174 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
3175 ret = AVERROR(EINVAL);
3181 if(s->oformat->codec_tag){
3182 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)){
3183 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
3184 st->codec->codec_tag= 0;
3186 if(st->codec->codec_tag){
3187 if (!validate_codec_tag(s, st)) {
3189 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
3190 av_log(s, AV_LOG_ERROR,
3191 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
3192 tagbuf, st->codec->codec_tag, st->codec->codec_id);
3193 ret = AVERROR_INVALIDDATA;
3197 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3200 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3201 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3202 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3205 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3206 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3207 if (!s->priv_data) {
3208 ret = AVERROR(ENOMEM);
3211 if (s->oformat->priv_class) {
3212 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3213 av_opt_set_defaults(s->priv_data);
3214 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3219 /* set muxer identification string */
3220 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3221 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3224 if(s->oformat->write_header){
3225 ret = s->oformat->write_header(s);
3230 /* init PTS generation */
3231 for(i=0;i<s->nb_streams;i++) {
3232 int64_t den = AV_NOPTS_VALUE;
3235 switch (st->codec->codec_type) {
3236 case AVMEDIA_TYPE_AUDIO:
3237 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3239 case AVMEDIA_TYPE_VIDEO:
3240 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3245 if (den != AV_NOPTS_VALUE) {
3247 ret = AVERROR_INVALIDDATA;
3250 frac_init(&st->pts, 0, 0, den);
3255 av_dict_free(options);
3264 //FIXME merge with compute_pkt_fields
3265 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3266 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3267 int num, den, frame_size, i;
3269 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3270 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3272 /* duration field */
3273 if (pkt->duration == 0) {
3274 compute_frame_duration(&num, &den, st, NULL, pkt);
3276 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3280 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3283 //XXX/FIXME this is a temporary hack until all encoders output pts
3284 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3286 // pkt->pts= st->cur_dts;
3287 pkt->pts= st->pts.val;
3290 //calculate dts from pts
3291 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3292 st->pts_buffer[0]= pkt->pts;
3293 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3294 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3295 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3296 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3298 pkt->dts= st->pts_buffer[0];
3301 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)){
3302 av_log(s, AV_LOG_ERROR,
3303 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3304 st->index, st->cur_dts, pkt->dts);
3305 return AVERROR(EINVAL);
3307 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3308 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3309 return AVERROR(EINVAL);
3312 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3313 st->cur_dts= pkt->dts;
3314 st->pts.val= pkt->dts;
3317 switch (st->codec->codec_type) {
3318 case AVMEDIA_TYPE_AUDIO:
3319 frame_size = get_audio_frame_size(st->codec, pkt->size);
3321 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3322 likely equal to the encoder delay, but it would be better if we
3323 had the real timestamps from the encoder */
3324 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3325 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3328 case AVMEDIA_TYPE_VIDEO:
3329 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3337 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3339 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3341 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3344 ret= s->oformat->write_packet(s, pkt);
3347 s->streams[pkt->stream_index]->nb_frames++;
3351 #define CHUNK_START 0x1000
3353 int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3354 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3356 AVPacketList **next_point, *this_pktl;
3357 AVStream *st= s->streams[pkt->stream_index];
3358 int chunked= s->max_chunk_size || s->max_chunk_duration;
3360 this_pktl = av_mallocz(sizeof(AVPacketList));
3362 return AVERROR(ENOMEM);
3363 this_pktl->pkt= *pkt;
3364 pkt->destruct= NULL; // do not free original but only the copy
3365 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3367 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3368 next_point = &(st->last_in_packet_buffer->next);
3370 next_point = &s->packet_buffer;
3375 uint64_t max= av_rescale_q(s->max_chunk_duration, AV_TIME_BASE_Q, st->time_base);
3376 if( st->interleaver_chunk_size + pkt->size <= s->max_chunk_size-1U
3377 && st->interleaver_chunk_duration + pkt->duration <= max-1U){
3378 st->interleaver_chunk_size += pkt->size;
3379 st->interleaver_chunk_duration += pkt->duration;
3382 st->interleaver_chunk_size =
3383 st->interleaver_chunk_duration = 0;
3384 this_pktl->pkt.flags |= CHUNK_START;
3388 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3390 && ((chunked && !((*next_point)->pkt.flags&CHUNK_START))
3391 || !compare(s, &(*next_point)->pkt, pkt))){
3392 next_point= &(*next_point)->next;
3397 next_point = &(s->packet_buffer_end->next);
3400 assert(!*next_point);
3402 s->packet_buffer_end= this_pktl;
3405 this_pktl->next= *next_point;
3407 s->streams[pkt->stream_index]->last_in_packet_buffer=
3408 *next_point= this_pktl;
3412 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3414 AVStream *st = s->streams[ pkt ->stream_index];
3415 AVStream *st2= s->streams[ next->stream_index];
3416 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3418 if(s->audio_preload && ((st->codec->codec_type == AVMEDIA_TYPE_AUDIO) != (st2->codec->codec_type == AVMEDIA_TYPE_AUDIO))){
3419 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);
3420 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);
3422 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
3423 -( 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;
3426 comp= (ts>ts2) - (ts<ts2);
3430 return pkt->stream_index < next->stream_index;
3434 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3436 int stream_count=0, noninterleaved_count=0;
3437 int64_t delta_dts_max = 0;
3441 ret = ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3446 for(i=0; i < s->nb_streams; i++) {
3447 if (s->streams[i]->last_in_packet_buffer) {
3449 } else if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3450 ++noninterleaved_count;
3454 if (s->nb_streams == stream_count) {
3457 for(i=0; i < s->nb_streams; i++) {
3458 if (s->streams[i]->last_in_packet_buffer) {
3460 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
3461 s->streams[i]->time_base,
3463 av_rescale_q(s->packet_buffer->pkt.dts,
3464 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
3466 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
3469 if(s->nb_streams == stream_count+noninterleaved_count &&
3470 delta_dts_max > 20*AV_TIME_BASE) {
3471 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
3475 if(stream_count && flush){
3476 pktl= s->packet_buffer;
3479 s->packet_buffer= pktl->next;
3480 if(!s->packet_buffer)
3481 s->packet_buffer_end= NULL;
3483 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3484 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3488 av_init_packet(out);
3494 * Interleave an AVPacket correctly so it can be muxed.
3495 * @param out the interleaved packet will be output here
3496 * @param in the input packet
3497 * @param flush 1 if no further packets are available as input and all
3498 * remaining packets should be output
3499 * @return 1 if a packet was output, 0 if no packet could be output,
3500 * < 0 if an error occurred
3502 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3503 if (s->oformat->interleave_packet) {
3504 int ret = s->oformat->interleave_packet(s, out, in, flush);
3509 return av_interleave_packet_per_dts(s, out, in, flush);
3512 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3513 AVStream *st= s->streams[ pkt->stream_index];
3516 //FIXME/XXX/HACK drop zero sized packets
3517 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3520 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3521 pkt->size, pkt->dts, pkt->pts);
3522 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3525 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3526 return AVERROR(EINVAL);
3530 int ret= interleave_packet(s, &opkt, pkt, 0);
3531 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3534 ret= s->oformat->write_packet(s, &opkt);
3536 s->streams[opkt.stream_index]->nb_frames++;
3538 av_free_packet(&opkt);
3543 if(s->pb && s->pb->error)
3544 return s->pb->error;
3548 int av_write_trailer(AVFormatContext *s)
3554 ret= interleave_packet(s, &pkt, NULL, 1);
3555 if(ret<0) //FIXME cleanup needed for ret<0 ?
3560 ret= s->oformat->write_packet(s, &pkt);
3562 s->streams[pkt.stream_index]->nb_frames++;
3564 av_free_packet(&pkt);
3568 if(s->pb && s->pb->error)
3572 if(s->oformat->write_trailer)
3573 ret = s->oformat->write_trailer(s);
3576 ret = s->pb ? s->pb->error : 0;
3577 for(i=0;i<s->nb_streams;i++) {
3578 av_freep(&s->streams[i]->priv_data);
3579 av_freep(&s->streams[i]->index_entries);
3581 if (s->oformat->priv_class)
3582 av_opt_free(s->priv_data);
3583 av_freep(&s->priv_data);
3587 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
3588 int64_t *dts, int64_t *wall)
3590 if (!s->oformat || !s->oformat->get_output_timestamp)
3591 return AVERROR(ENOSYS);
3592 s->oformat->get_output_timestamp(s, stream, dts, wall);
3596 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3599 AVProgram *program=NULL;
3602 if (idx >= ac->nb_streams) {
3603 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3607 for(i=0; i<ac->nb_programs; i++){
3608 if(ac->programs[i]->id != progid)
3610 program = ac->programs[i];
3611 for(j=0; j<program->nb_stream_indexes; j++)
3612 if(program->stream_index[j] == idx)
3615 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3618 program->stream_index = tmp;
3619 program->stream_index[program->nb_stream_indexes++] = idx;
3624 static void print_fps(double d, const char *postfix){
3625 uint64_t v= lrintf(d*100);
3626 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3627 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3628 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3631 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3633 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3634 AVDictionaryEntry *tag=NULL;
3636 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3637 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3638 if(strcmp("language", tag->key)){
3641 av_strlcpy(tmp, tag->value, sizeof(tmp));
3642 for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
3643 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tmp);
3649 /* "user interface" functions */
3650 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3653 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3654 AVStream *st = ic->streams[i];
3655 int g = av_gcd(st->time_base.num, st->time_base.den);
3656 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3657 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3658 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
3659 /* the pid is an important information, so we display it */
3660 /* XXX: add a generic system */
3661 if (flags & AVFMT_SHOW_IDS)
3662 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3664 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3665 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3666 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3667 if (st->sample_aspect_ratio.num && // default
3668 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3669 AVRational display_aspect_ratio;
3670 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3671 st->codec->width*st->sample_aspect_ratio.num,
3672 st->codec->height*st->sample_aspect_ratio.den,
3674 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3675 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3676 display_aspect_ratio.num, display_aspect_ratio.den);
3678 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3679 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3680 print_fps(av_q2d(st->avg_frame_rate), "fps");
3681 if(st->r_frame_rate.den && st->r_frame_rate.num)
3682 print_fps(av_q2d(st->r_frame_rate), "tbr");
3683 if(st->time_base.den && st->time_base.num)
3684 print_fps(1/av_q2d(st->time_base), "tbn");
3685 if(st->codec->time_base.den && st->codec->time_base.num)
3686 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3688 if (st->disposition & AV_DISPOSITION_DEFAULT)
3689 av_log(NULL, AV_LOG_INFO, " (default)");
3690 if (st->disposition & AV_DISPOSITION_DUB)
3691 av_log(NULL, AV_LOG_INFO, " (dub)");
3692 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3693 av_log(NULL, AV_LOG_INFO, " (original)");
3694 if (st->disposition & AV_DISPOSITION_COMMENT)
3695 av_log(NULL, AV_LOG_INFO, " (comment)");
3696 if (st->disposition & AV_DISPOSITION_LYRICS)
3697 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3698 if (st->disposition & AV_DISPOSITION_KARAOKE)
3699 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3700 if (st->disposition & AV_DISPOSITION_FORCED)
3701 av_log(NULL, AV_LOG_INFO, " (forced)");
3702 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3703 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3704 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3705 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3706 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3707 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3708 av_log(NULL, AV_LOG_INFO, "\n");
3709 dump_metadata(NULL, st->metadata, " ");
3712 #if FF_API_DUMP_FORMAT
3713 void dump_format(AVFormatContext *ic,
3718 av_dump_format(ic, index, url, is_output);
3722 void av_dump_format(AVFormatContext *ic,
3728 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3729 if (ic->nb_streams && !printed)
3732 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3733 is_output ? "Output" : "Input",
3735 is_output ? ic->oformat->name : ic->iformat->name,
3736 is_output ? "to" : "from", url);
3737 dump_metadata(NULL, ic->metadata, " ");
3739 av_log(NULL, AV_LOG_INFO, " Duration: ");
3740 if (ic->duration != AV_NOPTS_VALUE) {
3741 int hours, mins, secs, us;
3742 secs = ic->duration / AV_TIME_BASE;
3743 us = ic->duration % AV_TIME_BASE;
3748 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3749 (100 * us) / AV_TIME_BASE);
3751 av_log(NULL, AV_LOG_INFO, "N/A");
3753 if (ic->start_time != AV_NOPTS_VALUE) {
3755 av_log(NULL, AV_LOG_INFO, ", start: ");
3756 secs = ic->start_time / AV_TIME_BASE;
3757 us = abs(ic->start_time % AV_TIME_BASE);
3758 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3759 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3761 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3763 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3765 av_log(NULL, AV_LOG_INFO, "N/A");
3767 av_log(NULL, AV_LOG_INFO, "\n");
3769 for (i = 0; i < ic->nb_chapters; i++) {
3770 AVChapter *ch = ic->chapters[i];
3771 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3772 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3773 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3775 dump_metadata(NULL, ch->metadata, " ");
3777 if(ic->nb_programs) {
3778 int j, k, total = 0;
3779 for(j=0; j<ic->nb_programs; j++) {
3780 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3782 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3783 name ? name->value : "");
3784 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3785 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3786 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3787 printed[ic->programs[j]->stream_index[k]] = 1;
3789 total += ic->programs[j]->nb_stream_indexes;
3791 if (total < ic->nb_streams)
3792 av_log(NULL, AV_LOG_INFO, " No Program\n");
3794 for(i=0;i<ic->nb_streams;i++)
3796 dump_stream_format(ic, i, index, is_output);
3801 int64_t av_gettime(void)
3804 gettimeofday(&tv,NULL);
3805 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3808 uint64_t ff_ntp_time(void)
3810 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3813 #if FF_API_PARSE_DATE
3814 #include "libavutil/parseutils.h"
3816 int64_t parse_date(const char *timestr, int duration)
3819 av_parse_time(&timeval, timestr, duration);
3824 #if FF_API_FIND_INFO_TAG
3825 #include "libavutil/parseutils.h"
3827 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3829 return av_find_info_tag(arg, arg_size, tag1, info);
3833 int av_get_frame_filename(char *buf, int buf_size,
3834 const char *path, int number)
3837 char *q, buf1[20], c;
3838 int nd, len, percentd_found;
3850 while (isdigit(*p)) {
3851 nd = nd * 10 + *p++ - '0';
3854 } while (isdigit(c));
3863 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3865 if ((q - buf + len) > buf_size - 1)
3867 memcpy(q, buf1, len);
3875 if ((q - buf) < buf_size - 1)
3879 if (!percentd_found)
3888 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3892 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3894 for(i=0;i<size;i+=16) {
3901 PRINT(" %02x", buf[i+j]);
3906 for(j=0;j<len;j++) {
3908 if (c < ' ' || c > '~')
3917 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3919 hex_dump_internal(NULL, f, 0, buf, size);
3922 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3924 hex_dump_internal(avcl, NULL, level, buf, size);
3927 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3930 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3931 PRINT("stream #%d:\n", pkt->stream_index);
3932 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3933 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3934 /* DTS is _always_ valid after av_read_frame() */
3936 if (pkt->dts == AV_NOPTS_VALUE)
3939 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3940 /* PTS may not be known if B-frames are present. */
3942 if (pkt->pts == AV_NOPTS_VALUE)
3945 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3947 PRINT(" size=%d\n", pkt->size);
3950 av_hex_dump(f, pkt->data, pkt->size);
3954 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3956 AVRational tb = { 1, AV_TIME_BASE };
3957 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3961 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3963 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3967 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3969 AVRational tb = { 1, AV_TIME_BASE };
3970 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3974 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3977 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3980 void av_url_split(char *proto, int proto_size,
3981 char *authorization, int authorization_size,
3982 char *hostname, int hostname_size,
3984 char *path, int path_size,
3987 const char *p, *ls, *at, *col, *brk;
3989 if (port_ptr) *port_ptr = -1;
3990 if (proto_size > 0) proto[0] = 0;
3991 if (authorization_size > 0) authorization[0] = 0;
3992 if (hostname_size > 0) hostname[0] = 0;
3993 if (path_size > 0) path[0] = 0;
3995 /* parse protocol */
3996 if ((p = strchr(url, ':'))) {
3997 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4002 /* no protocol means plain filename */
4003 av_strlcpy(path, url, path_size);
4007 /* separate path from hostname */
4008 ls = strchr(p, '/');
4010 ls = strchr(p, '?');
4012 av_strlcpy(path, ls, path_size);
4014 ls = &p[strlen(p)]; // XXX
4016 /* the rest is hostname, use that to parse auth/port */
4018 /* authorization (user[:pass]@hostname) */
4019 if ((at = strchr(p, '@')) && at < ls) {
4020 av_strlcpy(authorization, p,
4021 FFMIN(authorization_size, at + 1 - p));
4022 p = at + 1; /* skip '@' */
4025 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4027 av_strlcpy(hostname, p + 1,
4028 FFMIN(hostname_size, brk - p));
4029 if (brk[1] == ':' && port_ptr)
4030 *port_ptr = atoi(brk + 2);
4031 } else if ((col = strchr(p, ':')) && col < ls) {
4032 av_strlcpy(hostname, p,
4033 FFMIN(col + 1 - p, hostname_size));
4034 if (port_ptr) *port_ptr = atoi(col + 1);
4036 av_strlcpy(hostname, p,
4037 FFMIN(ls + 1 - p, hostname_size));
4041 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4044 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4047 'C', 'D', 'E', 'F' };
4048 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4051 'c', 'd', 'e', 'f' };
4052 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4054 for(i = 0; i < s; i++) {
4055 buff[i * 2] = hex_table[src[i] >> 4];
4056 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4062 int ff_hex_to_data(uint8_t *data, const char *p)
4069 p += strspn(p, SPACE_CHARS);
4072 c = toupper((unsigned char) *p++);
4073 if (c >= '0' && c <= '9')
4075 else if (c >= 'A' && c <= 'F')
4090 #if FF_API_SET_PTS_INFO
4091 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
4092 unsigned int pts_num, unsigned int pts_den)
4094 avpriv_set_pts_info(s, pts_wrap_bits, pts_num, pts_den);
4098 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4099 unsigned int pts_num, unsigned int pts_den)
4102 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
4103 if(new_tb.num != pts_num)
4104 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
4106 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
4108 if(new_tb.num <= 0 || new_tb.den <= 0) {
4109 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
4112 s->time_base = new_tb;
4113 s->pts_wrap_bits = pts_wrap_bits;
4116 int ff_url_join(char *str, int size, const char *proto,
4117 const char *authorization, const char *hostname,
4118 int port, const char *fmt, ...)
4121 struct addrinfo hints, *ai;
4126 av_strlcatf(str, size, "%s://", proto);
4127 if (authorization && authorization[0])
4128 av_strlcatf(str, size, "%s@", authorization);
4129 #if CONFIG_NETWORK && defined(AF_INET6)
4130 /* Determine if hostname is a numerical IPv6 address,
4131 * properly escape it within [] in that case. */
4132 memset(&hints, 0, sizeof(hints));
4133 hints.ai_flags = AI_NUMERICHOST;
4134 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
4135 if (ai->ai_family == AF_INET6) {
4136 av_strlcat(str, "[", size);
4137 av_strlcat(str, hostname, size);
4138 av_strlcat(str, "]", size);
4140 av_strlcat(str, hostname, size);
4145 /* Not an IPv6 address, just output the plain string. */
4146 av_strlcat(str, hostname, size);
4149 av_strlcatf(str, size, ":%d", port);
4152 int len = strlen(str);
4155 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
4161 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
4162 AVFormatContext *src)
4167 local_pkt.stream_index = dst_stream;
4168 if (pkt->pts != AV_NOPTS_VALUE)
4169 local_pkt.pts = av_rescale_q(pkt->pts,
4170 src->streams[pkt->stream_index]->time_base,
4171 dst->streams[dst_stream]->time_base);
4172 if (pkt->dts != AV_NOPTS_VALUE)
4173 local_pkt.dts = av_rescale_q(pkt->dts,
4174 src->streams[pkt->stream_index]->time_base,
4175 dst->streams[dst_stream]->time_base);
4176 return av_write_frame(dst, &local_pkt);
4179 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4182 const char *ptr = str;
4184 /* Parse key=value pairs. */
4187 char *dest = NULL, *dest_end;
4188 int key_len, dest_len = 0;
4190 /* Skip whitespace and potential commas. */
4191 while (*ptr && (isspace(*ptr) || *ptr == ','))
4198 if (!(ptr = strchr(key, '=')))
4201 key_len = ptr - key;
4203 callback_get_buf(context, key, key_len, &dest, &dest_len);
4204 dest_end = dest + dest_len - 1;
4208 while (*ptr && *ptr != '\"') {
4212 if (dest && dest < dest_end)
4216 if (dest && dest < dest_end)
4224 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
4225 if (dest && dest < dest_end)
4233 int ff_find_stream_index(AVFormatContext *s, int id)
4236 for (i = 0; i < s->nb_streams; i++) {
4237 if (s->streams[i]->id == id)
4243 void ff_make_absolute_url(char *buf, int size, const char *base,
4247 /* Absolute path, relative to the current server */
4248 if (base && strstr(base, "://") && rel[0] == '/') {
4250 av_strlcpy(buf, base, size);
4251 sep = strstr(buf, "://");
4254 sep = strchr(sep, '/');
4258 av_strlcat(buf, rel, size);
4261 /* If rel actually is an absolute url, just copy it */
4262 if (!base || strstr(rel, "://") || rel[0] == '/') {
4263 av_strlcpy(buf, rel, size);
4267 av_strlcpy(buf, base, size);
4268 /* Remove the file name from the base url */
4269 sep = strrchr(buf, '/');
4274 while (av_strstart(rel, "../", NULL) && sep) {
4275 /* Remove the path delimiter at the end */
4277 sep = strrchr(buf, '/');
4278 /* If the next directory name to pop off is "..", break here */
4279 if (!strcmp(sep ? &sep[1] : buf, "..")) {
4280 /* Readd the slash we just removed */
4281 av_strlcat(buf, "/", size);
4284 /* Cut off the directory name */
4291 av_strlcat(buf, rel, size);
4294 int64_t ff_iso8601_to_unix_time(const char *datestr)
4297 struct tm time1 = {0}, time2 = {0};
4299 ret1 = strptime(datestr, "%Y - %m - %d %T", &time1);
4300 ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2);
4302 return av_timegm(&time2);
4304 return av_timegm(&time1);
4306 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
4307 "the date string.\n");
4312 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
4315 if (ofmt->query_codec)
4316 return ofmt->query_codec(codec_id, std_compliance);
4317 else if (ofmt->codec_tag)
4318 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4319 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4320 codec_id == ofmt->subtitle_codec)
4323 return AVERROR_PATCHWELCOME;
4326 int avformat_network_init(void)
4330 ff_network_inited_globally = 1;
4331 if ((ret = ff_network_init()) < 0)
4338 int avformat_network_deinit(void)
4347 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4348 uint64_t channel_layout, int32_t sample_rate,
4349 int32_t width, int32_t height)
4355 return AVERROR(EINVAL);
4358 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4360 if (channel_layout) {
4362 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4366 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4368 if (width || height) {
4370 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4372 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4374 return AVERROR(ENOMEM);
4375 bytestream_put_le32(&data, flags);
4377 bytestream_put_le32(&data, channels);
4379 bytestream_put_le64(&data, channel_layout);
4381 bytestream_put_le32(&data, sample_rate);
4382 if (width || height) {
4383 bytestream_put_le32(&data, width);
4384 bytestream_put_le32(&data, height);