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 "libavutil/opt.h"
30 #include "libavutil/dict.h"
31 #include "libavutil/pixdesc.h"
34 #include "libavutil/avstring.h"
35 #include "libavutil/mathematics.h"
36 #include "libavutil/parseutils.h"
38 #include "audiointerleave.h"
52 * various utility functions for use within FFmpeg
55 unsigned avformat_version(void)
57 return LIBAVFORMAT_VERSION_INT;
60 const char *avformat_configuration(void)
62 return FFMPEG_CONFIGURATION;
65 const char *avformat_license(void)
67 #define LICENSE_PREFIX "libavformat license: "
68 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
71 /* fraction handling */
74 * f = val + (num / den) + 0.5.
76 * 'num' is normalized so that it is such as 0 <= num < den.
78 * @param f fractional number
79 * @param val integer value
80 * @param num must be >= 0
81 * @param den must be >= 1
83 static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
96 * Fractional addition to f: f = f + (incr / f->den).
98 * @param f fractional number
99 * @param incr increment, can be positive or negative
101 static void frac_add(AVFrac *f, int64_t incr)
114 } else if (num >= den) {
121 /** head of registered input format linked list */
122 static AVInputFormat *first_iformat = NULL;
123 /** head of registered output format linked list */
124 static AVOutputFormat *first_oformat = NULL;
126 AVInputFormat *av_iformat_next(AVInputFormat *f)
128 if(f) return f->next;
129 else return first_iformat;
132 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
134 if(f) return f->next;
135 else return first_oformat;
138 void av_register_input_format(AVInputFormat *format)
142 while (*p != NULL) p = &(*p)->next;
147 void av_register_output_format(AVOutputFormat *format)
151 while (*p != NULL) p = &(*p)->next;
156 int av_match_ext(const char *filename, const char *extensions)
164 ext = strrchr(filename, '.');
170 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
173 if (!av_strcasecmp(ext1, ext))
183 static int match_format(const char *name, const char *names)
191 namelen = strlen(name);
192 while ((p = strchr(names, ','))) {
193 len = FFMAX(p - names, namelen);
194 if (!av_strncasecmp(name, names, len))
198 return !av_strcasecmp(name, names);
201 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
202 const char *mime_type)
204 AVOutputFormat *fmt = NULL, *fmt_found;
205 int score_max, score;
207 /* specific test for image sequences */
208 #if CONFIG_IMAGE2_MUXER
209 if (!short_name && filename &&
210 av_filename_number_test(filename) &&
211 ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
212 return av_guess_format("image2", NULL, NULL);
215 /* Find the proper file type. */
218 while ((fmt = av_oformat_next(fmt))) {
220 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
222 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
224 if (filename && fmt->extensions &&
225 av_match_ext(filename, fmt->extensions)) {
228 if (score > score_max) {
236 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
237 const char *filename, const char *mime_type, enum AVMediaType type){
238 if(type == AVMEDIA_TYPE_VIDEO){
239 enum CodecID codec_id= CODEC_ID_NONE;
241 #if CONFIG_IMAGE2_MUXER
242 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
243 codec_id= ff_guess_image2_codec(filename);
246 if(codec_id == CODEC_ID_NONE)
247 codec_id= fmt->video_codec;
249 }else if(type == AVMEDIA_TYPE_AUDIO)
250 return fmt->audio_codec;
251 else if (type == AVMEDIA_TYPE_SUBTITLE)
252 return fmt->subtitle_codec;
254 return CODEC_ID_NONE;
257 AVInputFormat *av_find_input_format(const char *short_name)
259 AVInputFormat *fmt = NULL;
260 while ((fmt = av_iformat_next(fmt))) {
261 if (match_format(short_name, fmt->name))
268 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
273 int64_t remaining= s->maxsize - avio_tell(s);
274 if(remaining < size){
275 int64_t newsize= avio_size(s);
276 if(!s->maxsize || s->maxsize<newsize)
278 remaining= s->maxsize - avio_tell(s);
281 if(s->maxsize>=0 && remaining>=0 && remaining+1 < size){
282 av_log(0, AV_LOG_ERROR, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
287 ret= av_new_packet(pkt, size);
292 pkt->pos= avio_tell(s);
294 ret= avio_read(s, pkt->data, size);
298 av_shrink_packet(pkt, ret);
303 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
308 return av_get_packet(s, pkt, size);
309 old_size = pkt->size;
310 ret = av_grow_packet(pkt, size);
313 ret = avio_read(s, pkt->data + old_size, size);
314 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
319 int av_filename_number_test(const char *filename)
322 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
325 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
327 AVProbeData lpd = *pd;
328 AVInputFormat *fmt1 = NULL, *fmt;
329 int score, nodat = 0, score_max=0;
331 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
332 int id3len = ff_id3v2_tag_len(lpd.buf);
333 if (lpd.buf_size > id3len + 16) {
335 lpd.buf_size -= id3len;
341 while ((fmt1 = av_iformat_next(fmt1))) {
342 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
345 if (fmt1->read_probe) {
346 score = fmt1->read_probe(&lpd);
347 if(fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
348 score = FFMAX(score, nodat ? AVPROBE_SCORE_MAX/4-1 : 1);
349 } else if (fmt1->extensions) {
350 if (av_match_ext(lpd.filename, fmt1->extensions)) {
354 if (score > score_max) {
357 }else if (score == score_max)
360 *score_ret= score_max;
365 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
368 AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
369 if(score_ret > *score_max){
370 *score_max= score_ret;
376 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
378 return av_probe_input_format2(pd, is_opened, &score);
381 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
383 static const struct {
384 const char *name; enum CodecID id; enum AVMediaType type;
386 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
387 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
388 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
389 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
390 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
391 { "loas" , CODEC_ID_AAC_LATM , AVMEDIA_TYPE_AUDIO },
392 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
393 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
394 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
398 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
402 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
403 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
404 for (i = 0; fmt_id_type[i].name; i++) {
405 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
406 st->codec->codec_id = fmt_id_type[i].id;
407 st->codec->codec_type = fmt_id_type[i].type;
415 /************************************************************/
416 /* input media file */
418 #if FF_API_FORMAT_PARAMETERS
419 static AVDictionary *convert_format_parameters(AVFormatParameters *ap)
422 AVDictionary *opts = NULL;
427 AV_NOWARN_DEPRECATED(
428 if (ap->time_base.num) {
429 snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
430 av_dict_set(&opts, "framerate", buf, 0);
432 if (ap->sample_rate) {
433 snprintf(buf, sizeof(buf), "%d", ap->sample_rate);
434 av_dict_set(&opts, "sample_rate", buf, 0);
437 snprintf(buf, sizeof(buf), "%d", ap->channels);
438 av_dict_set(&opts, "channels", buf, 0);
440 if (ap->width || ap->height) {
441 snprintf(buf, sizeof(buf), "%dx%d", ap->width, ap->height);
442 av_dict_set(&opts, "video_size", buf, 0);
444 if (ap->pix_fmt != PIX_FMT_NONE) {
445 av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(ap->pix_fmt), 0);
448 snprintf(buf, sizeof(buf), "%d", ap->channel);
449 av_dict_set(&opts, "channel", buf, 0);
452 av_dict_set(&opts, "standard", ap->standard, 0);
454 if (ap->mpeg2ts_compute_pcr) {
455 av_dict_set(&opts, "mpeg2ts_compute_pcr", "1", 0);
457 if (ap->initial_pause) {
458 av_dict_set(&opts, "initial_pause", "1", 0);
465 * Open a media file from an IO stream. 'fmt' must be specified.
467 int av_open_input_stream(AVFormatContext **ic_ptr,
468 AVIOContext *pb, const char *filename,
469 AVInputFormat *fmt, AVFormatParameters *ap)
474 AVFormatParameters default_ap;
478 memset(ap, 0, sizeof(default_ap));
480 opts = convert_format_parameters(ap);
482 AV_NOWARN_DEPRECATED(
483 if(!ap->prealloced_context)
484 *ic_ptr = ic = avformat_alloc_context();
489 err = AVERROR(ENOMEM);
492 if (pb && fmt && fmt->flags & AVFMT_NOFILE)
493 av_log(ic, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
494 "will be ignored with AVFMT_NOFILE format.\n");
498 if ((err = avformat_open_input(&ic, filename, fmt, &opts)) < 0)
500 ic->pb = ic->pb ? ic->pb : pb; // don't leak custom pb if it wasn't set above
509 int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap){
512 if (ic->iformat->read_header) {
513 err = ic->iformat->read_header(ic, ap);
518 if (ic->pb && !ic->data_offset)
519 ic->data_offset = avio_tell(ic->pb);
525 /** size of probe buffer, for guessing file type from file contents */
526 #define PROBE_BUF_MIN 2048
527 #define PROBE_BUF_MAX (1<<20)
529 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
530 const char *filename, void *logctx,
531 unsigned int offset, unsigned int max_probe_size)
533 AVProbeData pd = { filename ? filename : "", NULL, -offset };
534 unsigned char *buf = NULL;
535 int ret = 0, probe_size;
537 if (!max_probe_size) {
538 max_probe_size = PROBE_BUF_MAX;
539 } else if (max_probe_size > PROBE_BUF_MAX) {
540 max_probe_size = PROBE_BUF_MAX;
541 } else if (max_probe_size < PROBE_BUF_MIN) {
542 return AVERROR(EINVAL);
545 if (offset >= max_probe_size) {
546 return AVERROR(EINVAL);
549 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
550 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
551 int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
552 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
555 if (probe_size < offset) {
559 /* read probe data */
560 buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
563 return AVERROR(ENOMEM);
566 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
567 /* fail if error was not end of file, otherwise, lower score */
568 if (ret != AVERROR_EOF) {
573 ret = 0; /* error was end of file, nothing read */
576 pd.buf = &buf[offset];
578 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
580 /* guess file format */
581 *fmt = av_probe_input_format2(&pd, 1, &score);
583 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
584 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
586 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
592 return AVERROR_INVALIDDATA;
595 /* rewind. reuse probe buffer to avoid seeking */
596 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
602 #if FF_API_FORMAT_PARAMETERS
603 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
606 AVFormatParameters *ap)
609 AVDictionary *opts = convert_format_parameters(ap);
611 AV_NOWARN_DEPRECATED(
612 if (!ap || !ap->prealloced_context)
616 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
623 /* open input file and probe the format if necessary */
624 static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)
627 AVProbeData pd = {filename, NULL, 0};
629 if(s->iformat && !strlen(filename))
633 s->flags |= AVFMT_FLAG_CUSTOM_IO;
635 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
636 else if (s->iformat->flags & AVFMT_NOFILE)
637 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
638 "will be ignored with AVFMT_NOFILE format.\n");
642 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
643 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
646 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ,
647 &s->interrupt_callback, options)) < 0)
651 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
654 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
656 AVFormatContext *s = *ps;
658 AVFormatParameters ap = { { 0 } };
659 AVDictionary *tmp = NULL;
661 if (!s && !(s = avformat_alloc_context()))
662 return AVERROR(ENOMEM);
667 av_dict_copy(&tmp, *options, 0);
669 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
672 if ((ret = init_input(s, filename, &tmp)) < 0)
675 /* check filename in case an image number is expected */
676 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
677 if (!av_filename_number_test(filename)) {
678 ret = AVERROR(EINVAL);
683 s->duration = s->start_time = AV_NOPTS_VALUE;
684 av_strlcpy(s->filename, filename, sizeof(s->filename));
686 /* allocate private data */
687 if (s->iformat->priv_data_size > 0) {
688 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
689 ret = AVERROR(ENOMEM);
692 if (s->iformat->priv_class) {
693 *(const AVClass**)s->priv_data = s->iformat->priv_class;
694 av_opt_set_defaults(s->priv_data);
695 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
700 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
702 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
704 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
705 if ((ret = s->iformat->read_header(s, &ap)) < 0)
708 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
709 s->data_offset = avio_tell(s->pb);
711 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
714 av_dict_free(options);
722 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
724 avformat_free_context(s);
729 /*******************************************************/
731 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
732 AVPacketList **plast_pktl){
733 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
738 (*plast_pktl)->next = pktl;
740 *packet_buffer = pktl;
742 /* add the packet in the buffered packet list */
748 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
754 AVPacketList *pktl = s->raw_packet_buffer;
758 if(s->streams[pkt->stream_index]->request_probe <= 0){
759 s->raw_packet_buffer = pktl->next;
760 s->raw_packet_buffer_remaining_size += pkt->size;
767 ret= s->iformat->read_packet(s, pkt);
769 if (!pktl || ret == AVERROR(EAGAIN))
771 for (i = 0; i < s->nb_streams; i++)
772 if(s->streams[i]->request_probe > 0)
773 s->streams[i]->request_probe = -1;
777 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
778 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
779 av_log(s, AV_LOG_WARNING,
780 "Dropped corrupted packet (stream = %d)\n",
786 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
787 av_packet_merge_side_data(pkt);
789 if(pkt->stream_index >= (unsigned)s->nb_streams){
790 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
794 st= s->streams[pkt->stream_index];
796 switch(st->codec->codec_type){
797 case AVMEDIA_TYPE_VIDEO:
798 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
800 case AVMEDIA_TYPE_AUDIO:
801 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
803 case AVMEDIA_TYPE_SUBTITLE:
804 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
808 if(!pktl && st->request_probe <= 0)
811 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
812 s->raw_packet_buffer_remaining_size -= pkt->size;
814 if(st->request_probe>0){
815 AVProbeData *pd = &st->probe_data;
817 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
820 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
821 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
822 pd->buf_size += pkt->size;
823 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
825 end= s->raw_packet_buffer_remaining_size <= 0
826 || st->probe_packets<=0;
828 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
829 int score= set_codec_from_probe_data(s, st, pd);
830 if( (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
834 st->request_probe= -1;
835 if(st->codec->codec_id != CODEC_ID_NONE){
836 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
838 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
845 /**********************************************************/
848 * Get the number of samples of an audio frame. Return -1 on error.
850 static int get_audio_frame_size(AVCodecContext *enc, int size)
854 if(enc->codec_id == CODEC_ID_VORBIS)
857 if (enc->frame_size <= 1) {
858 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
860 if (bits_per_sample) {
861 if (enc->channels == 0)
863 frame_size = (size << 3) / (bits_per_sample * enc->channels);
865 /* used for example by ADPCM codecs */
866 if (enc->bit_rate == 0)
868 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
871 frame_size = enc->frame_size;
878 * Return the frame duration in seconds. Return 0 if not available.
880 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
881 AVCodecParserContext *pc, AVPacket *pkt)
887 switch(st->codec->codec_type) {
888 case AVMEDIA_TYPE_VIDEO:
889 if (st->r_frame_rate.num && !pc) {
890 *pnum = st->r_frame_rate.den;
891 *pden = st->r_frame_rate.num;
892 } else if(st->time_base.num*1000LL > st->time_base.den) {
893 *pnum = st->time_base.num;
894 *pden = st->time_base.den;
895 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
896 *pnum = st->codec->time_base.num;
897 *pden = st->codec->time_base.den;
898 if (pc && pc->repeat_pict) {
899 *pnum = (*pnum) * (1 + pc->repeat_pict);
901 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
902 //Thus if we have no parser in such case leave duration undefined.
903 if(st->codec->ticks_per_frame>1 && !pc){
908 case AVMEDIA_TYPE_AUDIO:
909 frame_size = get_audio_frame_size(st->codec, pkt->size);
910 if (frame_size <= 0 || st->codec->sample_rate <= 0)
913 *pden = st->codec->sample_rate;
920 static int is_intra_only(AVCodecContext *enc){
921 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
923 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
924 switch(enc->codec_id){
926 case CODEC_ID_MJPEGB:
928 case CODEC_ID_PRORES:
929 case CODEC_ID_RAWVIDEO:
930 case CODEC_ID_DVVIDEO:
931 case CODEC_ID_HUFFYUV:
932 case CODEC_ID_FFVHUFF:
937 case CODEC_ID_JPEG2000:
945 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
946 int64_t dts, int64_t pts)
948 AVStream *st= s->streams[stream_index];
949 AVPacketList *pktl= s->packet_buffer;
951 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
954 st->first_dts= dts - st->cur_dts;
957 for(; pktl; pktl= pktl->next){
958 if(pktl->pkt.stream_index != stream_index)
960 //FIXME think more about this check
961 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
962 pktl->pkt.pts += st->first_dts;
964 if(pktl->pkt.dts != AV_NOPTS_VALUE)
965 pktl->pkt.dts += st->first_dts;
967 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
968 st->start_time= pktl->pkt.pts;
970 if (st->start_time == AV_NOPTS_VALUE)
971 st->start_time = pts;
974 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
976 AVPacketList *pktl= s->packet_buffer;
979 if(st->first_dts != AV_NOPTS_VALUE){
980 cur_dts= st->first_dts;
981 for(; pktl; pktl= pktl->next){
982 if(pktl->pkt.stream_index == pkt->stream_index){
983 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
985 cur_dts -= pkt->duration;
988 pktl= s->packet_buffer;
989 st->first_dts = cur_dts;
990 }else if(st->cur_dts)
993 for(; pktl; pktl= pktl->next){
994 if(pktl->pkt.stream_index != pkt->stream_index)
996 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
997 && !pktl->pkt.duration){
998 pktl->pkt.dts= cur_dts;
999 if(!st->codec->has_b_frames)
1000 pktl->pkt.pts= cur_dts;
1001 cur_dts += pkt->duration;
1002 pktl->pkt.duration= pkt->duration;
1006 if(st->first_dts == AV_NOPTS_VALUE)
1007 st->cur_dts= cur_dts;
1010 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1011 AVCodecParserContext *pc, AVPacket *pkt)
1013 int num, den, presentation_delayed, delay, i;
1016 if (s->flags & AVFMT_FLAG_NOFILLIN)
1019 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1020 pkt->dts= AV_NOPTS_VALUE;
1022 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
1023 //FIXME Set low_delay = 0 when has_b_frames = 1
1024 st->codec->has_b_frames = 1;
1026 /* do we have a video B-frame ? */
1027 delay= st->codec->has_b_frames;
1028 presentation_delayed = 0;
1030 /* XXX: need has_b_frame, but cannot get it if the codec is
1033 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1034 presentation_delayed = 1;
1036 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){
1037 pkt->dts -= 1LL<<st->pts_wrap_bits;
1040 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
1041 // we take the conservative approach and discard both
1042 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
1043 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
1044 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1045 pkt->dts= AV_NOPTS_VALUE;
1048 if (pkt->duration == 0) {
1049 compute_frame_duration(&num, &den, st, pc, pkt);
1051 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1053 if(pkt->duration != 0 && s->packet_buffer)
1054 update_initial_durations(s, st, pkt);
1058 /* correct timestamps with byte offset if demuxers only have timestamps
1059 on packet boundaries */
1060 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1061 /* this will estimate bitrate based on this frame's duration and size */
1062 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1063 if(pkt->pts != AV_NOPTS_VALUE)
1065 if(pkt->dts != AV_NOPTS_VALUE)
1069 if (pc && pc->dts_sync_point >= 0) {
1070 // we have synchronization info from the parser
1071 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1073 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1074 if (pkt->dts != AV_NOPTS_VALUE) {
1075 // got DTS from the stream, update reference timestamp
1076 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1077 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1078 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1079 // compute DTS based on reference timestamp
1080 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1081 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1083 if (pc->dts_sync_point > 0)
1084 st->reference_dts = pkt->dts; // new reference
1088 /* This may be redundant, but it should not hurt. */
1089 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1090 presentation_delayed = 1;
1092 // 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);
1093 /* interpolate PTS and DTS if they are not present */
1094 //We skip H264 currently because delay and has_b_frames are not reliably set
1095 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1096 if (presentation_delayed) {
1097 /* DTS = decompression timestamp */
1098 /* PTS = presentation timestamp */
1099 if (pkt->dts == AV_NOPTS_VALUE)
1100 pkt->dts = st->last_IP_pts;
1101 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1102 if (pkt->dts == AV_NOPTS_VALUE)
1103 pkt->dts = st->cur_dts;
1105 /* this is tricky: the dts must be incremented by the duration
1106 of the frame we are displaying, i.e. the last I- or P-frame */
1107 if (st->last_IP_duration == 0)
1108 st->last_IP_duration = pkt->duration;
1109 if(pkt->dts != AV_NOPTS_VALUE)
1110 st->cur_dts = pkt->dts + st->last_IP_duration;
1111 st->last_IP_duration = pkt->duration;
1112 st->last_IP_pts= pkt->pts;
1113 /* cannot compute PTS if not present (we can compute it only
1114 by knowing the future */
1115 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1116 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1117 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1118 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1119 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1120 pkt->pts += pkt->duration;
1121 // 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);
1125 /* presentation is not delayed : PTS and DTS are the same */
1126 if(pkt->pts == AV_NOPTS_VALUE)
1127 pkt->pts = pkt->dts;
1128 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1129 if(pkt->pts == AV_NOPTS_VALUE)
1130 pkt->pts = st->cur_dts;
1131 pkt->dts = pkt->pts;
1132 if(pkt->pts != AV_NOPTS_VALUE)
1133 st->cur_dts = pkt->pts + pkt->duration;
1137 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1138 st->pts_buffer[0]= pkt->pts;
1139 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1140 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1141 if(pkt->dts == AV_NOPTS_VALUE)
1142 pkt->dts= st->pts_buffer[0];
1143 if(st->codec->codec_id == CODEC_ID_H264){ // we skipped it above so we try here
1144 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1146 if(pkt->dts > st->cur_dts)
1147 st->cur_dts = pkt->dts;
1150 // 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);
1153 if(is_intra_only(st->codec))
1154 pkt->flags |= AV_PKT_FLAG_KEY;
1157 /* keyframe computation */
1158 if (pc->key_frame == 1)
1159 pkt->flags |= AV_PKT_FLAG_KEY;
1160 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1161 pkt->flags |= AV_PKT_FLAG_KEY;
1164 pkt->convergence_duration = pc->convergence_duration;
1168 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1173 av_init_packet(pkt);
1176 /* select current input stream component */
1179 if (!st->need_parsing || !st->parser) {
1180 /* no parsing needed: we just output the packet as is */
1181 /* raw data support */
1183 st->cur_pkt.data= NULL;
1184 st->cur_pkt.side_data_elems = 0;
1185 st->cur_pkt.side_data = NULL;
1186 compute_pkt_fields(s, st, NULL, pkt);
1188 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1189 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1190 ff_reduce_index(s, st->index);
1191 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1194 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1195 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1196 st->cur_ptr, st->cur_len,
1197 st->cur_pkt.pts, st->cur_pkt.dts,
1199 st->cur_pkt.pts = AV_NOPTS_VALUE;
1200 st->cur_pkt.dts = AV_NOPTS_VALUE;
1201 /* increment read pointer */
1205 /* return packet if any */
1209 pkt->stream_index = st->index;
1210 pkt->pts = st->parser->pts;
1211 pkt->dts = st->parser->dts;
1212 pkt->pos = st->parser->pos;
1213 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1215 pkt->destruct= st->cur_pkt.destruct;
1216 st->cur_pkt.destruct= NULL;
1217 st->cur_pkt.data = NULL;
1218 assert(st->cur_len == 0);
1220 pkt->destruct = NULL;
1222 compute_pkt_fields(s, st, st->parser, pkt);
1224 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1225 int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
1226 ff_reduce_index(s, st->index);
1227 av_add_index_entry(st, pos, pkt->dts,
1228 0, 0, AVINDEX_KEYFRAME);
1235 av_free_packet(&st->cur_pkt);
1240 /* read next packet */
1241 ret = av_read_packet(s, &cur_pkt);
1243 if (ret == AVERROR(EAGAIN))
1245 /* return the last frames, if any */
1246 for(i = 0; i < s->nb_streams; i++) {
1248 if (st->parser && st->need_parsing) {
1249 av_parser_parse2(st->parser, st->codec,
1250 &pkt->data, &pkt->size,
1252 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1258 /* no more packets: really terminate parsing */
1261 st = s->streams[cur_pkt.stream_index];
1262 st->cur_pkt= cur_pkt;
1264 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1265 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1266 st->cur_pkt.pts < st->cur_pkt.dts){
1267 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1268 st->cur_pkt.stream_index,
1272 // av_free_packet(&st->cur_pkt);
1276 if(s->debug & FF_FDEBUG_TS)
1277 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1278 st->cur_pkt.stream_index,
1282 st->cur_pkt.duration,
1286 st->cur_ptr = st->cur_pkt.data;
1287 st->cur_len = st->cur_pkt.size;
1288 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1289 st->parser = av_parser_init(st->codec->codec_id);
1291 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1292 "%s, packets or times may be invalid.\n",
1293 avcodec_get_name(st->codec->codec_id));
1294 /* no parser available: just output the raw packets */
1295 st->need_parsing = AVSTREAM_PARSE_NONE;
1296 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1297 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1298 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1299 st->parser->flags |= PARSER_FLAG_ONCE;
1304 if(s->debug & FF_FDEBUG_TS)
1305 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1316 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1320 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1323 pktl = s->packet_buffer;
1325 AVPacket *next_pkt= &pktl->pkt;
1327 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1328 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1329 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1330 if( pktl->pkt.stream_index == next_pkt->stream_index
1331 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1332 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1333 next_pkt->pts= pktl->pkt.dts;
1337 pktl = s->packet_buffer;
1340 if( next_pkt->pts != AV_NOPTS_VALUE
1341 || next_pkt->dts == AV_NOPTS_VALUE
1343 /* read packet from packet buffer, if there is data */
1345 s->packet_buffer = pktl->next;
1351 int ret= read_frame_internal(s, pkt);
1353 if(pktl && ret != AVERROR(EAGAIN)){
1360 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1361 &s->packet_buffer_end)) < 0)
1362 return AVERROR(ENOMEM);
1364 assert(!s->packet_buffer);
1365 return read_frame_internal(s, pkt);
1370 /* XXX: suppress the packet queue */
1371 static void flush_packet_queue(AVFormatContext *s)
1376 pktl = s->packet_buffer;
1379 s->packet_buffer = pktl->next;
1380 av_free_packet(&pktl->pkt);
1383 while(s->raw_packet_buffer){
1384 pktl = s->raw_packet_buffer;
1385 s->raw_packet_buffer = pktl->next;
1386 av_free_packet(&pktl->pkt);
1389 s->packet_buffer_end=
1390 s->raw_packet_buffer_end= NULL;
1391 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1394 /*******************************************************/
1397 int av_find_default_stream_index(AVFormatContext *s)
1399 int first_audio_index = -1;
1403 if (s->nb_streams <= 0)
1405 for(i = 0; i < s->nb_streams; i++) {
1407 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1410 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1411 first_audio_index = i;
1413 return first_audio_index >= 0 ? first_audio_index : 0;
1417 * Flush the frame reader.
1419 void ff_read_frame_flush(AVFormatContext *s)
1424 flush_packet_queue(s);
1428 /* for each stream, reset read state */
1429 for(i = 0; i < s->nb_streams; i++) {
1433 av_parser_close(st->parser);
1435 av_free_packet(&st->cur_pkt);
1437 st->last_IP_pts = AV_NOPTS_VALUE;
1438 if(st->first_dts == AV_NOPTS_VALUE) st->cur_dts = 0;
1439 else st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1440 st->reference_dts = AV_NOPTS_VALUE;
1445 st->probe_packets = MAX_PROBE_PACKETS;
1447 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1448 st->pts_buffer[j]= AV_NOPTS_VALUE;
1452 #if FF_API_SEEK_PUBLIC
1453 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1455 ff_update_cur_dts(s, ref_st, timestamp);
1459 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1463 for(i = 0; i < s->nb_streams; i++) {
1464 AVStream *st = s->streams[i];
1466 st->cur_dts = av_rescale(timestamp,
1467 st->time_base.den * (int64_t)ref_st->time_base.num,
1468 st->time_base.num * (int64_t)ref_st->time_base.den);
1472 void ff_reduce_index(AVFormatContext *s, int stream_index)
1474 AVStream *st= s->streams[stream_index];
1475 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1477 if((unsigned)st->nb_index_entries >= max_entries){
1479 for(i=0; 2*i<st->nb_index_entries; i++)
1480 st->index_entries[i]= st->index_entries[2*i];
1481 st->nb_index_entries= i;
1485 int ff_add_index_entry(AVIndexEntry **index_entries,
1486 int *nb_index_entries,
1487 unsigned int *index_entries_allocated_size,
1488 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1490 AVIndexEntry *entries, *ie;
1493 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1496 entries = av_fast_realloc(*index_entries,
1497 index_entries_allocated_size,
1498 (*nb_index_entries + 1) *
1499 sizeof(AVIndexEntry));
1503 *index_entries= entries;
1505 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1508 index= (*nb_index_entries)++;
1509 ie= &entries[index];
1510 assert(index==0 || ie[-1].timestamp < timestamp);
1512 ie= &entries[index];
1513 if(ie->timestamp != timestamp){
1514 if(ie->timestamp <= timestamp)
1516 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1517 (*nb_index_entries)++;
1518 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1519 distance= ie->min_distance;
1523 ie->timestamp = timestamp;
1524 ie->min_distance= distance;
1531 int av_add_index_entry(AVStream *st,
1532 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1534 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1535 &st->index_entries_allocated_size, pos,
1536 timestamp, size, distance, flags);
1539 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1540 int64_t wanted_timestamp, int flags)
1548 //optimize appending index entries at the end
1549 if(b && entries[b-1].timestamp < wanted_timestamp)
1554 timestamp = entries[m].timestamp;
1555 if(timestamp >= wanted_timestamp)
1557 if(timestamp <= wanted_timestamp)
1560 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1562 if(!(flags & AVSEEK_FLAG_ANY)){
1563 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1564 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1573 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1576 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1577 wanted_timestamp, flags);
1580 #if FF_API_SEEK_PUBLIC
1581 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1582 return ff_seek_frame_binary(s, stream_index, target_ts, flags);
1586 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
1588 AVInputFormat *avif= s->iformat;
1589 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1590 int64_t ts_min, ts_max, ts;
1595 if (stream_index < 0)
1598 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1601 ts_min= AV_NOPTS_VALUE;
1602 pos_limit= -1; //gcc falsely says it may be uninitialized
1604 st= s->streams[stream_index];
1605 if(st->index_entries){
1608 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()
1609 index= FFMAX(index, 0);
1610 e= &st->index_entries[index];
1612 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1614 ts_min= e->timestamp;
1615 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1621 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1622 assert(index < st->nb_index_entries);
1624 e= &st->index_entries[index];
1625 assert(e->timestamp >= target_ts);
1627 ts_max= e->timestamp;
1628 pos_limit= pos_max - e->min_distance;
1629 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1630 pos_max,pos_limit, ts_max);
1634 pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1639 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1642 ff_read_frame_flush(s);
1643 ff_update_cur_dts(s, st, ts);
1648 #if FF_API_SEEK_PUBLIC
1649 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1650 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1651 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1652 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1654 return ff_gen_search(s, stream_index, target_ts, pos_min, pos_max,
1655 pos_limit, ts_min, ts_max, flags, ts_ret,
1660 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1661 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1662 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1663 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1666 int64_t start_pos, filesize;
1669 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1671 if(ts_min == AV_NOPTS_VALUE){
1672 pos_min = s->data_offset;
1673 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1674 if (ts_min == AV_NOPTS_VALUE)
1678 if(ts_min >= target_ts){
1683 if(ts_max == AV_NOPTS_VALUE){
1685 filesize = avio_size(s->pb);
1686 pos_max = filesize - 1;
1689 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1691 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1692 if (ts_max == AV_NOPTS_VALUE)
1696 int64_t tmp_pos= pos_max + 1;
1697 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1698 if(tmp_ts == AV_NOPTS_VALUE)
1702 if(tmp_pos >= filesize)
1708 if(ts_max <= target_ts){
1713 if(ts_min > ts_max){
1715 }else if(ts_min == ts_max){
1720 while (pos_min < pos_limit) {
1721 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1722 pos_min, pos_max, ts_min, ts_max);
1723 assert(pos_limit <= pos_max);
1726 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1727 // interpolate position (better than dichotomy)
1728 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1729 + pos_min - approximate_keyframe_distance;
1730 }else if(no_change==1){
1731 // bisection, if interpolation failed to change min or max pos last time
1732 pos = (pos_min + pos_limit)>>1;
1734 /* linear search if bisection failed, can only happen if there
1735 are very few or no keyframes between min/max */
1740 else if(pos > pos_limit)
1744 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1749 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1750 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1751 pos_limit, start_pos, no_change);
1752 if(ts == AV_NOPTS_VALUE){
1753 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1756 assert(ts != AV_NOPTS_VALUE);
1757 if (target_ts <= ts) {
1758 pos_limit = start_pos - 1;
1762 if (target_ts >= ts) {
1768 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1769 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1772 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1774 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1775 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1776 pos, ts_min, target_ts, ts_max);
1782 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1783 int64_t pos_min, pos_max;
1787 if (stream_index < 0)
1790 st= s->streams[stream_index];
1793 pos_min = s->data_offset;
1794 pos_max = avio_size(s->pb) - 1;
1796 if (pos < pos_min) pos= pos_min;
1797 else if(pos > pos_max) pos= pos_max;
1799 avio_seek(s->pb, pos, SEEK_SET);
1802 av_update_cur_dts(s, st, ts);
1807 static int seek_frame_generic(AVFormatContext *s,
1808 int stream_index, int64_t timestamp, int flags)
1815 st = s->streams[stream_index];
1817 index = av_index_search_timestamp(st, timestamp, flags);
1819 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1822 if(index < 0 || index==st->nb_index_entries-1){
1826 if(st->nb_index_entries){
1827 assert(st->index_entries);
1828 ie= &st->index_entries[st->nb_index_entries-1];
1829 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1831 ff_update_cur_dts(s, st, ie->timestamp);
1833 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1839 read_status = av_read_frame(s, &pkt);
1840 } while (read_status == AVERROR(EAGAIN));
1841 if (read_status < 0)
1843 av_free_packet(&pkt);
1844 if(stream_index == pkt.stream_index && pkt.dts > timestamp){
1845 if(pkt.flags & AV_PKT_FLAG_KEY)
1847 if(nonkey++ > 1000 && st->codec->codec_id != CODEC_ID_CDGRAPHICS){
1848 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);
1853 index = av_index_search_timestamp(st, timestamp, flags);
1858 ff_read_frame_flush(s);
1859 AV_NOWARN_DEPRECATED(
1860 if (s->iformat->read_seek){
1861 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1865 ie = &st->index_entries[index];
1866 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1868 ff_update_cur_dts(s, st, ie->timestamp);
1873 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1878 if (flags & AVSEEK_FLAG_BYTE) {
1879 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1881 ff_read_frame_flush(s);
1882 return seek_frame_byte(s, stream_index, timestamp, flags);
1885 if(stream_index < 0){
1886 stream_index= av_find_default_stream_index(s);
1887 if(stream_index < 0)
1890 st= s->streams[stream_index];
1891 /* timestamp for default must be expressed in AV_TIME_BASE units */
1892 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1895 /* first, we try the format specific seek */
1896 AV_NOWARN_DEPRECATED(
1897 if (s->iformat->read_seek) {
1898 ff_read_frame_flush(s);
1899 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1907 if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1908 ff_read_frame_flush(s);
1909 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1910 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1911 ff_read_frame_flush(s);
1912 return seek_frame_generic(s, stream_index, timestamp, flags);
1918 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1920 if(min_ts > ts || max_ts < ts)
1923 if (s->iformat->read_seek2) {
1924 ff_read_frame_flush(s);
1925 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1928 if(s->iformat->read_timestamp){
1929 //try to seek via read_timestamp()
1932 //Fallback to old API if new is not implemented but old is
1933 //Note the old has somewat different sematics
1934 AV_NOWARN_DEPRECATED(
1935 if(s->iformat->read_seek || 1)
1936 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1939 // try some generic seek like seek_frame_generic() but with new ts semantics
1942 /*******************************************************/
1945 * Return TRUE if the stream has accurate duration in any stream.
1947 * @return TRUE if the stream has accurate duration for at least one component.
1949 static int has_duration(AVFormatContext *ic)
1953 if(ic->duration != AV_NOPTS_VALUE)
1956 for(i = 0;i < ic->nb_streams; i++) {
1957 st = ic->streams[i];
1958 if (st->duration != AV_NOPTS_VALUE)
1965 * Estimate the stream timings from the one of each components.
1967 * Also computes the global bitrate if possible.
1969 static void update_stream_timings(AVFormatContext *ic)
1971 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1972 int64_t duration, duration1, filesize;
1976 start_time = INT64_MAX;
1977 start_time_text = INT64_MAX;
1978 end_time = INT64_MIN;
1979 duration = INT64_MIN;
1980 for(i = 0;i < ic->nb_streams; i++) {
1981 st = ic->streams[i];
1982 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1983 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1984 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1985 if (start_time1 < start_time_text)
1986 start_time_text = start_time1;
1988 start_time = FFMIN(start_time, start_time1);
1989 if (st->duration != AV_NOPTS_VALUE) {
1990 end_time1 = start_time1
1991 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1992 end_time = FFMAX(end_time, end_time1);
1995 if (st->duration != AV_NOPTS_VALUE) {
1996 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1997 duration = FFMAX(duration, duration1);
2000 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2001 start_time = start_time_text;
2002 if (start_time != INT64_MAX) {
2003 ic->start_time = start_time;
2004 if (end_time != INT64_MIN)
2005 duration = FFMAX(duration, end_time - start_time);
2007 if (duration != INT64_MIN && ic->duration == AV_NOPTS_VALUE) {
2008 ic->duration = duration;
2010 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
2011 /* compute the bitrate */
2012 ic->bit_rate = (double)filesize * 8.0 * AV_TIME_BASE /
2013 (double)ic->duration;
2017 static void fill_all_stream_timings(AVFormatContext *ic)
2022 update_stream_timings(ic);
2023 for(i = 0;i < ic->nb_streams; i++) {
2024 st = ic->streams[i];
2025 if (st->start_time == AV_NOPTS_VALUE) {
2026 if(ic->start_time != AV_NOPTS_VALUE)
2027 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
2028 if(ic->duration != AV_NOPTS_VALUE)
2029 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
2034 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2036 int64_t filesize, duration;
2040 /* if bit_rate is already set, we believe it */
2041 if (ic->bit_rate <= 0) {
2043 for(i=0;i<ic->nb_streams;i++) {
2044 st = ic->streams[i];
2045 if (st->codec->bit_rate > 0)
2046 bit_rate += st->codec->bit_rate;
2048 ic->bit_rate = bit_rate;
2051 /* if duration is already set, we believe it */
2052 if (ic->duration == AV_NOPTS_VALUE &&
2053 ic->bit_rate != 0) {
2054 filesize = ic->pb ? avio_size(ic->pb) : 0;
2056 for(i = 0; i < ic->nb_streams; i++) {
2057 st = ic->streams[i];
2058 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
2059 if (st->duration == AV_NOPTS_VALUE)
2060 st->duration = duration;
2066 #define DURATION_MAX_READ_SIZE 250000
2067 #define DURATION_MAX_RETRY 3
2069 /* only usable for MPEG-PS streams */
2070 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2072 AVPacket pkt1, *pkt = &pkt1;
2074 int read_size, i, ret;
2076 int64_t filesize, offset, duration;
2081 /* flush packet queue */
2082 flush_packet_queue(ic);
2084 for (i=0; i<ic->nb_streams; i++) {
2085 st = ic->streams[i];
2086 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
2087 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2090 av_parser_close(st->parser);
2092 av_free_packet(&st->cur_pkt);
2096 /* estimate the end time (duration) */
2097 /* XXX: may need to support wrapping */
2098 filesize = ic->pb ? avio_size(ic->pb) : 0;
2099 end_time = AV_NOPTS_VALUE;
2101 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2105 avio_seek(ic->pb, offset, SEEK_SET);
2108 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2112 ret = av_read_packet(ic, pkt);
2113 } while(ret == AVERROR(EAGAIN));
2116 read_size += pkt->size;
2117 st = ic->streams[pkt->stream_index];
2118 if (pkt->pts != AV_NOPTS_VALUE &&
2119 (st->start_time != AV_NOPTS_VALUE ||
2120 st->first_dts != AV_NOPTS_VALUE)) {
2121 duration = end_time = pkt->pts;
2122 if (st->start_time != AV_NOPTS_VALUE)
2123 duration -= st->start_time;
2125 duration -= st->first_dts;
2127 duration += 1LL<<st->pts_wrap_bits;
2129 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2130 st->duration = duration;
2133 av_free_packet(pkt);
2135 }while( end_time==AV_NOPTS_VALUE
2136 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2137 && ++retry <= DURATION_MAX_RETRY);
2139 fill_all_stream_timings(ic);
2141 avio_seek(ic->pb, old_offset, SEEK_SET);
2142 for (i=0; i<ic->nb_streams; i++) {
2144 st->cur_dts= st->first_dts;
2145 st->last_IP_pts = AV_NOPTS_VALUE;
2146 st->reference_dts = AV_NOPTS_VALUE;
2150 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2154 /* get the file size, if possible */
2155 if (ic->iformat->flags & AVFMT_NOFILE) {
2158 file_size = avio_size(ic->pb);
2159 file_size = FFMAX(0, file_size);
2162 if ((!strcmp(ic->iformat->name, "mpeg") ||
2163 !strcmp(ic->iformat->name, "mpegts")) &&
2164 file_size && ic->pb->seekable) {
2165 /* get accurate estimate from the PTSes */
2166 estimate_timings_from_pts(ic, old_offset);
2167 } else if (has_duration(ic)) {
2168 /* at least one component has timings - we use them for all
2170 fill_all_stream_timings(ic);
2172 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2173 /* less precise: use bitrate info */
2174 estimate_timings_from_bit_rate(ic);
2176 update_stream_timings(ic);
2180 AVStream av_unused *st;
2181 for(i = 0;i < ic->nb_streams; i++) {
2182 st = ic->streams[i];
2183 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2184 (double) st->start_time / AV_TIME_BASE,
2185 (double) st->duration / AV_TIME_BASE);
2187 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2188 (double) ic->start_time / AV_TIME_BASE,
2189 (double) ic->duration / AV_TIME_BASE,
2190 ic->bit_rate / 1000);
2194 static int has_codec_parameters(AVCodecContext *avctx)
2197 switch (avctx->codec_type) {
2198 case AVMEDIA_TYPE_AUDIO:
2199 val = avctx->sample_rate && avctx->channels && avctx->sample_fmt != AV_SAMPLE_FMT_NONE;
2200 if (!avctx->frame_size &&
2201 (avctx->codec_id == CODEC_ID_VORBIS ||
2202 avctx->codec_id == CODEC_ID_AAC ||
2203 avctx->codec_id == CODEC_ID_MP1 ||
2204 avctx->codec_id == CODEC_ID_MP2 ||
2205 avctx->codec_id == CODEC_ID_MP3 ||
2206 avctx->codec_id == CODEC_ID_CELT))
2209 case AVMEDIA_TYPE_VIDEO:
2210 val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
2212 case AVMEDIA_TYPE_DATA:
2213 if(avctx->codec_id == CODEC_ID_NONE) return 1;
2218 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2221 static int has_decode_delay_been_guessed(AVStream *st)
2223 return st->codec->codec_id != CODEC_ID_H264 ||
2224 st->info->nb_decoded_frames >= 6;
2227 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2230 int got_picture, ret = 0;
2232 AVPacket pkt = *avpkt;
2234 if(!st->codec->codec){
2235 codec = avcodec_find_decoder(st->codec->codec_id);
2238 ret = avcodec_open2(st->codec, codec, options);
2243 while (pkt.size > 0 && ret >= 0 &&
2244 (!has_codec_parameters(st->codec) ||
2245 !has_decode_delay_been_guessed(st) ||
2246 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2248 avcodec_get_frame_defaults(&picture);
2249 switch(st->codec->codec_type) {
2250 case AVMEDIA_TYPE_VIDEO:
2251 ret = avcodec_decode_video2(st->codec, &picture,
2252 &got_picture, &pkt);
2254 case AVMEDIA_TYPE_AUDIO:
2255 ret = avcodec_decode_audio4(st->codec, &picture, &got_picture, &pkt);
2262 st->info->nb_decoded_frames++;
2270 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2272 while (tags->id != CODEC_ID_NONE) {
2280 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2283 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2284 if(tag == tags[i].tag)
2287 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2288 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2291 return CODEC_ID_NONE;
2294 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2297 for(i=0; tags && tags[i]; i++){
2298 int tag= ff_codec_get_tag(tags[i], id);
2304 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2307 for(i=0; tags && tags[i]; i++){
2308 enum CodecID id= ff_codec_get_id(tags[i], tag);
2309 if(id!=CODEC_ID_NONE) return id;
2311 return CODEC_ID_NONE;
2314 static void compute_chapters_end(AVFormatContext *s)
2317 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2319 for (i = 0; i < s->nb_chapters; i++)
2320 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2321 AVChapter *ch = s->chapters[i];
2322 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2325 for (j = 0; j < s->nb_chapters; j++) {
2326 AVChapter *ch1 = s->chapters[j];
2327 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2328 if (j != i && next_start > ch->start && next_start < end)
2331 ch->end = (end == INT64_MAX) ? ch->start : end;
2335 static int get_std_framerate(int i){
2336 if(i<60*12) return i*1001;
2337 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2341 * Is the time base unreliable.
2342 * This is a heuristic to balance between quick acceptance of the values in
2343 * the headers vs. some extra checks.
2344 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2345 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2346 * And there are "variable" fps files this needs to detect as well.
2348 static int tb_unreliable(AVCodecContext *c){
2349 if( c->time_base.den >= 101L*c->time_base.num
2350 || c->time_base.den < 5L*c->time_base.num
2351 /* || c->codec_tag == AV_RL32("DIVX")
2352 || c->codec_tag == AV_RL32("XVID")*/
2353 || c->codec_id == CODEC_ID_MPEG2VIDEO
2354 || c->codec_id == CODEC_ID_H264
2360 #if FF_API_FORMAT_PARAMETERS
2361 int av_find_stream_info(AVFormatContext *ic)
2363 return avformat_find_stream_info(ic, NULL);
2367 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2369 int i, count, ret, read_size, j;
2371 AVPacket pkt1, *pkt;
2372 int64_t old_offset = avio_tell(ic->pb);
2373 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2375 for(i=0;i<ic->nb_streams;i++) {
2377 st = ic->streams[i];
2379 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2380 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2381 /* if(!st->time_base.num)
2383 if(!st->codec->time_base.num)
2384 st->codec->time_base= st->time_base;
2386 //only for the split stuff
2387 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2388 st->parser = av_parser_init(st->codec->codec_id);
2389 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2390 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2393 assert(!st->codec->codec);
2394 codec = avcodec_find_decoder(st->codec->codec_id);
2396 /* Ensure that subtitle_header is properly set. */
2397 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2398 && codec && !st->codec->codec)
2399 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2401 //try to just open decoders, in case this is enough to get parameters
2402 if(!has_codec_parameters(st->codec)){
2403 if (codec && !st->codec->codec){
2404 AVDictionary *tmp = NULL;
2406 av_dict_copy(&tmp, options[i], 0);
2407 av_dict_set(&tmp, "threads", 0, 0);
2409 avcodec_open2(st->codec, codec, options ? &tmp : NULL);
2415 for (i=0; i<ic->nb_streams; i++) {
2416 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2422 if (ff_check_interrupt(&ic->interrupt_callback)){
2424 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2428 /* check if one codec still needs to be handled */
2429 for(i=0;i<ic->nb_streams;i++) {
2430 int fps_analyze_framecount = 20;
2432 st = ic->streams[i];
2433 if (!has_codec_parameters(st->codec))
2435 /* if the timebase is coarse (like the usual millisecond precision
2436 of mkv), we need to analyze more frames to reliably arrive at
2438 if (av_q2d(st->time_base) > 0.0005)
2439 fps_analyze_framecount *= 2;
2440 if (ic->fps_probe_size >= 0)
2441 fps_analyze_framecount = ic->fps_probe_size;
2442 /* variable fps and no guess at the real fps */
2443 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2444 && st->info->duration_count < fps_analyze_framecount
2445 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2447 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2449 if(st->first_dts == AV_NOPTS_VALUE && (st->codec->codec_type == AVMEDIA_TYPE_VIDEO || st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2452 if (i == ic->nb_streams) {
2453 /* NOTE: if the format has no header, then we need to read
2454 some packets to get most of the streams, so we cannot
2456 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2457 /* if we found the info for all the codecs, we can stop */
2459 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2463 /* we did not get all the codec info, but we read too much data */
2464 if (read_size >= ic->probesize) {
2466 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2470 /* NOTE: a new stream can be added there if no header in file
2471 (AVFMTCTX_NOHEADER) */
2472 ret = read_frame_internal(ic, &pkt1);
2473 if (ret == AVERROR(EAGAIN))
2478 ret = -1; /* we could not have all the codec parameters before EOF */
2479 for(i=0;i<ic->nb_streams;i++) {
2480 st = ic->streams[i];
2481 if (!has_codec_parameters(st->codec)){
2483 avcodec_string(buf, sizeof(buf), st->codec, 0);
2484 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2492 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2493 if ((ret = av_dup_packet(pkt)) < 0)
2494 goto find_stream_info_err;
2496 read_size += pkt->size;
2498 st = ic->streams[pkt->stream_index];
2499 if (st->codec_info_nb_frames>1) {
2501 if (st->time_base.den > 0 && (t=av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q)) >= ic->max_analyze_duration) {
2502 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2505 st->info->codec_info_duration += pkt->duration;
2508 int64_t last = st->info->last_dts;
2510 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2511 double dts= pkt->dts * av_q2d(st->time_base);
2512 int64_t duration= pkt->dts - last;
2514 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2515 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
2516 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) {
2517 int framerate= get_std_framerate(i);
2518 double sdts= dts*framerate/(1001*12);
2520 int ticks= lrintf(sdts+j*0.5);
2521 double error= sdts - ticks + j*0.5;
2522 st->info->duration_error[j][0][i] += error;
2523 st->info->duration_error[j][1][i] += error*error;
2526 st->info->duration_count++;
2527 // ignore the first 4 values, they might have some random jitter
2528 if (st->info->duration_count > 3)
2529 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2531 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2532 st->info->last_dts = pkt->dts;
2534 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2535 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2537 st->codec->extradata_size= i;
2538 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2539 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2540 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2544 /* if still no information, we try to open the codec and to
2545 decompress the frame. We try to avoid that in most cases as
2546 it takes longer and uses more memory. For MPEG-4, we need to
2547 decompress for QuickTime.
2549 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2550 least one frame of codec data, this makes sure the codec initializes
2551 the channel configuration and does not only trust the values from the container.
2553 try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
2555 st->codec_info_nb_frames++;
2559 // close codecs which were opened in try_decode_frame()
2560 for(i=0;i<ic->nb_streams;i++) {
2561 st = ic->streams[i];
2562 if(st->codec->codec)
2563 avcodec_close(st->codec);
2565 for(i=0;i<ic->nb_streams;i++) {
2566 st = ic->streams[i];
2567 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2568 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2569 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2570 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2571 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2572 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2573 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2574 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2575 st->codec->codec_tag= tag;
2578 // the check for tb_unreliable() is not completely correct, since this is not about handling
2579 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2580 // ipmovie.c produces.
2581 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)
2582 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);
2583 if (st->info->duration_count && !st->r_frame_rate.num
2584 && tb_unreliable(st->codec) /*&&
2585 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2586 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2588 double best_error= 0.01;
2590 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) {
2593 if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2595 if(!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
2598 int n= st->info->duration_count;
2599 double a= st->info->duration_error[k][0][j] / n;
2600 double error= st->info->duration_error[k][1][j]/n - a*a;
2602 if(error < best_error && best_error> 0.000000001){
2604 num = get_std_framerate(j);
2607 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2610 // do not increase frame rate by more than 1 % in order to match a standard rate.
2611 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2612 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2615 if (!st->r_frame_rate.num){
2616 if( st->codec->time_base.den * (int64_t)st->time_base.num
2617 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2618 st->r_frame_rate.num = st->codec->time_base.den;
2619 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2621 st->r_frame_rate.num = st->time_base.den;
2622 st->r_frame_rate.den = st->time_base.num;
2625 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2626 if(!st->codec->bits_per_coded_sample)
2627 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2628 // set stream disposition based on audio service type
2629 switch (st->codec->audio_service_type) {
2630 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2631 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2632 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2633 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2634 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2635 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2636 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2637 st->disposition = AV_DISPOSITION_COMMENT; break;
2638 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2639 st->disposition = AV_DISPOSITION_KARAOKE; break;
2644 estimate_timings(ic, old_offset);
2646 compute_chapters_end(ic);
2649 /* correct DTS for B-frame streams with no timestamps */
2650 for(i=0;i<ic->nb_streams;i++) {
2651 st = ic->streams[i];
2652 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2654 ppktl = &ic->packet_buffer;
2656 if(ppkt1->stream_index != i)
2658 if(ppkt1->pkt->dts < 0)
2660 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2662 ppkt1->pkt->dts -= delta;
2667 st->cur_dts -= delta;
2673 find_stream_info_err:
2674 for (i=0; i < ic->nb_streams; i++)
2675 av_freep(&ic->streams[i]->info);
2679 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2683 for (i = 0; i < ic->nb_programs; i++) {
2684 if (ic->programs[i] == last) {
2688 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2689 if (ic->programs[i]->stream_index[j] == s)
2690 return ic->programs[i];
2696 int av_find_best_stream(AVFormatContext *ic,
2697 enum AVMediaType type,
2698 int wanted_stream_nb,
2700 AVCodec **decoder_ret,
2703 int i, nb_streams = ic->nb_streams;
2704 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2705 unsigned *program = NULL;
2706 AVCodec *decoder = NULL, *best_decoder = NULL;
2708 if (related_stream >= 0 && wanted_stream_nb < 0) {
2709 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2711 program = p->stream_index;
2712 nb_streams = p->nb_stream_indexes;
2715 for (i = 0; i < nb_streams; i++) {
2716 int real_stream_index = program ? program[i] : i;
2717 AVStream *st = ic->streams[real_stream_index];
2718 AVCodecContext *avctx = st->codec;
2719 if (avctx->codec_type != type)
2721 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2723 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2726 decoder = avcodec_find_decoder(st->codec->codec_id);
2729 ret = AVERROR_DECODER_NOT_FOUND;
2733 if (best_count >= st->codec_info_nb_frames)
2735 best_count = st->codec_info_nb_frames;
2736 ret = real_stream_index;
2737 best_decoder = decoder;
2738 if (program && i == nb_streams - 1 && ret < 0) {
2740 nb_streams = ic->nb_streams;
2741 i = 0; /* no related stream found, try again with everything */
2745 *decoder_ret = best_decoder;
2749 /*******************************************************/
2751 int av_read_play(AVFormatContext *s)
2753 if (s->iformat->read_play)
2754 return s->iformat->read_play(s);
2756 return avio_pause(s->pb, 0);
2757 return AVERROR(ENOSYS);
2760 int av_read_pause(AVFormatContext *s)
2762 if (s->iformat->read_pause)
2763 return s->iformat->read_pause(s);
2765 return avio_pause(s->pb, 1);
2766 return AVERROR(ENOSYS);
2769 #if FF_API_FORMAT_PARAMETERS
2770 void av_close_input_stream(AVFormatContext *s)
2772 flush_packet_queue(s);
2773 if (s->iformat->read_close)
2774 s->iformat->read_close(s);
2775 avformat_free_context(s);
2779 void avformat_free_context(AVFormatContext *s)
2785 if (s->iformat && s->iformat->priv_class && s->priv_data)
2786 av_opt_free(s->priv_data);
2788 for(i=0;i<s->nb_streams;i++) {
2789 /* free all data in a stream component */
2792 av_parser_close(st->parser);
2793 av_free_packet(&st->cur_pkt);
2795 av_dict_free(&st->metadata);
2796 av_freep(&st->index_entries);
2797 av_freep(&st->codec->extradata);
2798 av_freep(&st->codec->subtitle_header);
2799 av_freep(&st->codec);
2800 av_freep(&st->priv_data);
2801 av_freep(&st->info);
2804 for(i=s->nb_programs-1; i>=0; i--) {
2805 av_dict_free(&s->programs[i]->metadata);
2806 av_freep(&s->programs[i]->stream_index);
2807 av_freep(&s->programs[i]);
2809 av_freep(&s->programs);
2810 av_freep(&s->priv_data);
2811 while(s->nb_chapters--) {
2812 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2813 av_freep(&s->chapters[s->nb_chapters]);
2815 av_freep(&s->chapters);
2816 av_dict_free(&s->metadata);
2817 av_freep(&s->streams);
2821 #if FF_API_CLOSE_INPUT_FILE
2822 void av_close_input_file(AVFormatContext *s)
2824 avformat_close_input(&s);
2828 void avformat_close_input(AVFormatContext **ps)
2830 AVFormatContext *s = *ps;
2831 AVIOContext *pb = (s->iformat && (s->iformat->flags & AVFMT_NOFILE)) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2833 flush_packet_queue(s);
2834 if (s->iformat && (s->iformat->read_close))
2835 s->iformat->read_close(s);
2836 avformat_free_context(s);
2842 #if FF_API_NEW_STREAM
2843 AVStream *av_new_stream(AVFormatContext *s, int id)
2845 AVStream *st = avformat_new_stream(s, NULL);
2852 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
2858 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2860 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2863 s->streams = streams;
2865 st = av_mallocz(sizeof(AVStream));
2868 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2873 st->codec = avcodec_alloc_context3(c);
2875 /* no default bitrate if decoding */
2876 st->codec->bit_rate = 0;
2878 st->index = s->nb_streams;
2879 st->start_time = AV_NOPTS_VALUE;
2880 st->duration = AV_NOPTS_VALUE;
2881 /* we set the current DTS to 0 so that formats without any timestamps
2882 but durations get some timestamps, formats with some unknown
2883 timestamps have their first few packets buffered and the
2884 timestamps corrected before they are returned to the user */
2886 st->first_dts = AV_NOPTS_VALUE;
2887 st->probe_packets = MAX_PROBE_PACKETS;
2889 /* default pts setting is MPEG-like */
2890 avpriv_set_pts_info(st, 33, 1, 90000);
2891 st->last_IP_pts = AV_NOPTS_VALUE;
2892 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2893 st->pts_buffer[i]= AV_NOPTS_VALUE;
2894 st->reference_dts = AV_NOPTS_VALUE;
2896 st->sample_aspect_ratio = (AVRational){0,1};
2898 s->streams[s->nb_streams++] = st;
2902 AVProgram *av_new_program(AVFormatContext *ac, int id)
2904 AVProgram *program=NULL;
2907 av_dlog(ac, "new_program: id=0x%04x\n", id);
2909 for(i=0; i<ac->nb_programs; i++)
2910 if(ac->programs[i]->id == id)
2911 program = ac->programs[i];
2914 program = av_mallocz(sizeof(AVProgram));
2917 dynarray_add(&ac->programs, &ac->nb_programs, program);
2918 program->discard = AVDISCARD_NONE;
2925 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2927 AVChapter *chapter = NULL;
2930 for(i=0; i<s->nb_chapters; i++)
2931 if(s->chapters[i]->id == id)
2932 chapter = s->chapters[i];
2935 chapter= av_mallocz(sizeof(AVChapter));
2938 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2940 av_dict_set(&chapter->metadata, "title", title, 0);
2942 chapter->time_base= time_base;
2943 chapter->start = start;
2949 /************************************************************/
2950 /* output media file */
2952 #if FF_API_FORMAT_PARAMETERS
2953 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2955 if (s->oformat->priv_data_size > 0) {
2956 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2958 return AVERROR(ENOMEM);
2959 if (s->oformat->priv_class) {
2960 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2961 av_opt_set_defaults(s->priv_data);
2964 s->priv_data = NULL;
2970 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
2971 const char *format, const char *filename)
2973 AVFormatContext *s = avformat_alloc_context();
2982 oformat = av_guess_format(format, NULL, NULL);
2984 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
2985 ret = AVERROR(EINVAL);
2989 oformat = av_guess_format(NULL, filename, NULL);
2991 ret = AVERROR(EINVAL);
2992 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
2999 s->oformat = oformat;
3000 if (s->oformat->priv_data_size > 0) {
3001 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3004 if (s->oformat->priv_class) {
3005 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3006 av_opt_set_defaults(s->priv_data);
3009 s->priv_data = NULL;
3012 av_strlcpy(s->filename, filename, sizeof(s->filename));
3016 av_log(s, AV_LOG_ERROR, "Out of memory\n");
3017 ret = AVERROR(ENOMEM);
3019 avformat_free_context(s);
3023 #if FF_API_ALLOC_OUTPUT_CONTEXT
3024 AVFormatContext *avformat_alloc_output_context(const char *format,
3025 AVOutputFormat *oformat, const char *filename)
3027 AVFormatContext *avctx;
3028 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
3029 return ret < 0 ? NULL : avctx;
3033 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
3035 const AVCodecTag *avctag;
3037 enum CodecID id = CODEC_ID_NONE;
3038 unsigned int tag = 0;
3041 * Check that tag + id is in the table
3042 * If neither is in the table -> OK
3043 * If tag is in the table with another id -> FAIL
3044 * If id is in the table with another tag -> FAIL unless strict < normal
3046 for (n = 0; s->oformat->codec_tag[n]; n++) {
3047 avctag = s->oformat->codec_tag[n];
3048 while (avctag->id != CODEC_ID_NONE) {
3049 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
3051 if (id == st->codec->codec_id)
3054 if (avctag->id == st->codec->codec_id)
3059 if (id != CODEC_ID_NONE)
3061 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
3066 #if FF_API_FORMAT_PARAMETERS
3067 int av_write_header(AVFormatContext *s)
3069 return avformat_write_header(s, NULL);
3073 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
3077 AVDictionary *tmp = NULL;
3080 av_dict_copy(&tmp, *options, 0);
3081 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
3083 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
3084 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3087 // some sanity checks
3088 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
3089 av_log(s, AV_LOG_ERROR, "no streams\n");
3090 ret = AVERROR(EINVAL);
3094 for(i=0;i<s->nb_streams;i++) {
3097 switch (st->codec->codec_type) {
3098 case AVMEDIA_TYPE_AUDIO:
3099 if(st->codec->sample_rate<=0){
3100 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
3101 ret = AVERROR(EINVAL);
3104 if(!st->codec->block_align)
3105 st->codec->block_align = st->codec->channels *
3106 av_get_bits_per_sample(st->codec->codec_id) >> 3;
3108 case AVMEDIA_TYPE_VIDEO:
3109 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
3110 av_log(s, AV_LOG_ERROR, "time base not set\n");
3111 ret = AVERROR(EINVAL);
3114 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
3115 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
3116 ret = AVERROR(EINVAL);
3119 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
3120 && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
3122 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
3123 ret = AVERROR(EINVAL);
3129 if(s->oformat->codec_tag){
3130 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)){
3131 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
3132 st->codec->codec_tag= 0;
3134 if(st->codec->codec_tag){
3135 if (!validate_codec_tag(s, st)) {
3137 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
3138 av_log(s, AV_LOG_ERROR,
3139 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
3140 tagbuf, st->codec->codec_tag, st->codec->codec_id);
3141 ret = AVERROR_INVALIDDATA;
3145 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3148 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3149 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3150 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3153 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3154 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3155 if (!s->priv_data) {
3156 ret = AVERROR(ENOMEM);
3159 if (s->oformat->priv_class) {
3160 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3161 av_opt_set_defaults(s->priv_data);
3162 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3167 /* set muxer identification string */
3168 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3169 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3172 if(s->oformat->write_header){
3173 ret = s->oformat->write_header(s);
3178 /* init PTS generation */
3179 for(i=0;i<s->nb_streams;i++) {
3180 int64_t den = AV_NOPTS_VALUE;
3183 switch (st->codec->codec_type) {
3184 case AVMEDIA_TYPE_AUDIO:
3185 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3187 case AVMEDIA_TYPE_VIDEO:
3188 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3193 if (den != AV_NOPTS_VALUE) {
3195 ret = AVERROR_INVALIDDATA;
3198 frac_init(&st->pts, 0, 0, den);
3203 av_dict_free(options);
3212 //FIXME merge with compute_pkt_fields
3213 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3214 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3215 int num, den, frame_size, i;
3217 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3218 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3220 /* duration field */
3221 if (pkt->duration == 0) {
3222 compute_frame_duration(&num, &den, st, NULL, pkt);
3224 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3228 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3231 //XXX/FIXME this is a temporary hack until all encoders output pts
3232 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3234 // pkt->pts= st->cur_dts;
3235 pkt->pts= st->pts.val;
3238 //calculate dts from pts
3239 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3240 st->pts_buffer[0]= pkt->pts;
3241 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3242 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3243 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3244 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3246 pkt->dts= st->pts_buffer[0];
3249 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)){
3250 av_log(s, AV_LOG_ERROR,
3251 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3252 st->index, st->cur_dts, pkt->dts);
3253 return AVERROR(EINVAL);
3255 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3256 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3257 return AVERROR(EINVAL);
3260 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3261 st->cur_dts= pkt->dts;
3262 st->pts.val= pkt->dts;
3265 switch (st->codec->codec_type) {
3266 case AVMEDIA_TYPE_AUDIO:
3267 frame_size = get_audio_frame_size(st->codec, pkt->size);
3269 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3270 likely equal to the encoder delay, but it would be better if we
3271 had the real timestamps from the encoder */
3272 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3273 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3276 case AVMEDIA_TYPE_VIDEO:
3277 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3285 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3287 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3289 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3292 ret= s->oformat->write_packet(s, pkt);
3295 s->streams[pkt->stream_index]->nb_frames++;
3299 #define CHUNK_START 0x1000
3301 int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3302 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3304 AVPacketList **next_point, *this_pktl;
3305 AVStream *st= s->streams[pkt->stream_index];
3306 int chunked= s->max_chunk_size || s->max_chunk_duration;
3308 this_pktl = av_mallocz(sizeof(AVPacketList));
3310 return AVERROR(ENOMEM);
3311 this_pktl->pkt= *pkt;
3312 pkt->destruct= NULL; // do not free original but only the copy
3313 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3315 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3316 next_point = &(st->last_in_packet_buffer->next);
3318 next_point = &s->packet_buffer;
3323 uint64_t max= av_rescale_q(s->max_chunk_duration, AV_TIME_BASE_Q, st->time_base);
3324 if( st->interleaver_chunk_size + pkt->size <= s->max_chunk_size-1U
3325 && st->interleaver_chunk_duration + pkt->duration <= max-1U){
3326 st->interleaver_chunk_size += pkt->size;
3327 st->interleaver_chunk_duration += pkt->duration;
3330 st->interleaver_chunk_size =
3331 st->interleaver_chunk_duration = 0;
3332 this_pktl->pkt.flags |= CHUNK_START;
3336 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3338 && ((chunked && !((*next_point)->pkt.flags&CHUNK_START))
3339 || !compare(s, &(*next_point)->pkt, pkt))){
3340 next_point= &(*next_point)->next;
3345 next_point = &(s->packet_buffer_end->next);
3348 assert(!*next_point);
3350 s->packet_buffer_end= this_pktl;
3353 this_pktl->next= *next_point;
3355 s->streams[pkt->stream_index]->last_in_packet_buffer=
3356 *next_point= this_pktl;
3360 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3362 AVStream *st = s->streams[ pkt ->stream_index];
3363 AVStream *st2= s->streams[ next->stream_index];
3364 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3366 if(s->audio_preload && ((st->codec->codec_type == AVMEDIA_TYPE_AUDIO) != (st2->codec->codec_type == AVMEDIA_TYPE_AUDIO))){
3367 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);
3368 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);
3370 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
3371 -( 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;
3374 comp= (ts>ts2) - (ts<ts2);
3378 return pkt->stream_index < next->stream_index;
3382 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3384 int stream_count=0, noninterleaved_count=0;
3385 int64_t delta_dts_max = 0;
3389 ret = ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3394 for(i=0; i < s->nb_streams; i++) {
3395 if (s->streams[i]->last_in_packet_buffer) {
3397 } else if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3398 ++noninterleaved_count;
3402 if (s->nb_streams == stream_count) {
3405 for(i=0; i < s->nb_streams; i++) {
3406 if (s->streams[i]->last_in_packet_buffer) {
3408 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
3409 s->streams[i]->time_base,
3411 av_rescale_q(s->packet_buffer->pkt.dts,
3412 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
3414 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
3417 if(s->nb_streams == stream_count+noninterleaved_count &&
3418 delta_dts_max > 20*AV_TIME_BASE) {
3419 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
3423 if(stream_count && flush){
3424 pktl= s->packet_buffer;
3427 s->packet_buffer= pktl->next;
3428 if(!s->packet_buffer)
3429 s->packet_buffer_end= NULL;
3431 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3432 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3436 av_init_packet(out);
3442 * Interleave an AVPacket correctly so it can be muxed.
3443 * @param out the interleaved packet will be output here
3444 * @param in the input packet
3445 * @param flush 1 if no further packets are available as input and all
3446 * remaining packets should be output
3447 * @return 1 if a packet was output, 0 if no packet could be output,
3448 * < 0 if an error occurred
3450 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3451 if(s->oformat->interleave_packet)
3452 return s->oformat->interleave_packet(s, out, in, flush);
3454 return av_interleave_packet_per_dts(s, out, in, flush);
3457 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3458 AVStream *st= s->streams[ pkt->stream_index];
3461 //FIXME/XXX/HACK drop zero sized packets
3462 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3465 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3466 pkt->size, pkt->dts, pkt->pts);
3467 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3470 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3471 return AVERROR(EINVAL);
3475 int ret= interleave_packet(s, &opkt, pkt, 0);
3476 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3479 ret= s->oformat->write_packet(s, &opkt);
3481 s->streams[opkt.stream_index]->nb_frames++;
3483 av_free_packet(&opkt);
3488 if(s->pb && s->pb->error)
3489 return s->pb->error;
3493 int av_write_trailer(AVFormatContext *s)
3499 ret= interleave_packet(s, &pkt, NULL, 1);
3500 if(ret<0) //FIXME cleanup needed for ret<0 ?
3505 ret= s->oformat->write_packet(s, &pkt);
3507 s->streams[pkt.stream_index]->nb_frames++;
3509 av_free_packet(&pkt);
3513 if(s->pb && s->pb->error)
3517 if(s->oformat->write_trailer)
3518 ret = s->oformat->write_trailer(s);
3521 ret = s->pb ? s->pb->error : 0;
3522 for(i=0;i<s->nb_streams;i++) {
3523 av_freep(&s->streams[i]->priv_data);
3524 av_freep(&s->streams[i]->index_entries);
3526 if (s->oformat->priv_class)
3527 av_opt_free(s->priv_data);
3528 av_freep(&s->priv_data);
3532 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
3533 int64_t *dts, int64_t *wall)
3535 if (!s->oformat || !s->oformat->get_output_timestamp)
3536 return AVERROR(ENOSYS);
3537 s->oformat->get_output_timestamp(s, stream, dts, wall);
3541 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3544 AVProgram *program=NULL;
3547 if (idx >= ac->nb_streams) {
3548 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3552 for(i=0; i<ac->nb_programs; i++){
3553 if(ac->programs[i]->id != progid)
3555 program = ac->programs[i];
3556 for(j=0; j<program->nb_stream_indexes; j++)
3557 if(program->stream_index[j] == idx)
3560 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3563 program->stream_index = tmp;
3564 program->stream_index[program->nb_stream_indexes++] = idx;
3569 static void print_fps(double d, const char *postfix){
3570 uint64_t v= lrintf(d*100);
3571 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3572 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3573 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3576 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3578 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3579 AVDictionaryEntry *tag=NULL;
3581 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3582 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3583 if(strcmp("language", tag->key)){
3586 av_strlcpy(tmp, tag->value, sizeof(tmp));
3587 for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
3588 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tmp);
3594 /* "user interface" functions */
3595 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3598 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3599 AVStream *st = ic->streams[i];
3600 int g = av_gcd(st->time_base.num, st->time_base.den);
3601 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3602 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3603 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
3604 /* the pid is an important information, so we display it */
3605 /* XXX: add a generic system */
3606 if (flags & AVFMT_SHOW_IDS)
3607 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3609 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3610 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3611 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3612 if (st->sample_aspect_ratio.num && // default
3613 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3614 AVRational display_aspect_ratio;
3615 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3616 st->codec->width*st->sample_aspect_ratio.num,
3617 st->codec->height*st->sample_aspect_ratio.den,
3619 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3620 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3621 display_aspect_ratio.num, display_aspect_ratio.den);
3623 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3624 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3625 print_fps(av_q2d(st->avg_frame_rate), "fps");
3626 if(st->r_frame_rate.den && st->r_frame_rate.num)
3627 print_fps(av_q2d(st->r_frame_rate), "tbr");
3628 if(st->time_base.den && st->time_base.num)
3629 print_fps(1/av_q2d(st->time_base), "tbn");
3630 if(st->codec->time_base.den && st->codec->time_base.num)
3631 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3633 if (st->disposition & AV_DISPOSITION_DEFAULT)
3634 av_log(NULL, AV_LOG_INFO, " (default)");
3635 if (st->disposition & AV_DISPOSITION_DUB)
3636 av_log(NULL, AV_LOG_INFO, " (dub)");
3637 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3638 av_log(NULL, AV_LOG_INFO, " (original)");
3639 if (st->disposition & AV_DISPOSITION_COMMENT)
3640 av_log(NULL, AV_LOG_INFO, " (comment)");
3641 if (st->disposition & AV_DISPOSITION_LYRICS)
3642 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3643 if (st->disposition & AV_DISPOSITION_KARAOKE)
3644 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3645 if (st->disposition & AV_DISPOSITION_FORCED)
3646 av_log(NULL, AV_LOG_INFO, " (forced)");
3647 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3648 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3649 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3650 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3651 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3652 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3653 av_log(NULL, AV_LOG_INFO, "\n");
3654 dump_metadata(NULL, st->metadata, " ");
3657 #if FF_API_DUMP_FORMAT
3658 void dump_format(AVFormatContext *ic,
3663 av_dump_format(ic, index, url, is_output);
3667 void av_dump_format(AVFormatContext *ic,
3673 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3674 if (ic->nb_streams && !printed)
3677 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3678 is_output ? "Output" : "Input",
3680 is_output ? ic->oformat->name : ic->iformat->name,
3681 is_output ? "to" : "from", url);
3682 dump_metadata(NULL, ic->metadata, " ");
3684 av_log(NULL, AV_LOG_INFO, " Duration: ");
3685 if (ic->duration != AV_NOPTS_VALUE) {
3686 int hours, mins, secs, us;
3687 secs = ic->duration / AV_TIME_BASE;
3688 us = ic->duration % AV_TIME_BASE;
3693 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3694 (100 * us) / AV_TIME_BASE);
3696 av_log(NULL, AV_LOG_INFO, "N/A");
3698 if (ic->start_time != AV_NOPTS_VALUE) {
3700 av_log(NULL, AV_LOG_INFO, ", start: ");
3701 secs = ic->start_time / AV_TIME_BASE;
3702 us = abs(ic->start_time % AV_TIME_BASE);
3703 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3704 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3706 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3708 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3710 av_log(NULL, AV_LOG_INFO, "N/A");
3712 av_log(NULL, AV_LOG_INFO, "\n");
3714 for (i = 0; i < ic->nb_chapters; i++) {
3715 AVChapter *ch = ic->chapters[i];
3716 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3717 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3718 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3720 dump_metadata(NULL, ch->metadata, " ");
3722 if(ic->nb_programs) {
3723 int j, k, total = 0;
3724 for(j=0; j<ic->nb_programs; j++) {
3725 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3727 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3728 name ? name->value : "");
3729 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3730 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3731 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3732 printed[ic->programs[j]->stream_index[k]] = 1;
3734 total += ic->programs[j]->nb_stream_indexes;
3736 if (total < ic->nb_streams)
3737 av_log(NULL, AV_LOG_INFO, " No Program\n");
3739 for(i=0;i<ic->nb_streams;i++)
3741 dump_stream_format(ic, i, index, is_output);
3746 int64_t av_gettime(void)
3749 gettimeofday(&tv,NULL);
3750 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3753 uint64_t ff_ntp_time(void)
3755 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3758 #if FF_API_PARSE_DATE
3759 #include "libavutil/parseutils.h"
3761 int64_t parse_date(const char *timestr, int duration)
3764 av_parse_time(&timeval, timestr, duration);
3769 #if FF_API_FIND_INFO_TAG
3770 #include "libavutil/parseutils.h"
3772 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3774 return av_find_info_tag(arg, arg_size, tag1, info);
3778 int av_get_frame_filename(char *buf, int buf_size,
3779 const char *path, int number)
3782 char *q, buf1[20], c;
3783 int nd, len, percentd_found;
3795 while (isdigit(*p)) {
3796 nd = nd * 10 + *p++ - '0';
3799 } while (isdigit(c));
3808 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3810 if ((q - buf + len) > buf_size - 1)
3812 memcpy(q, buf1, len);
3820 if ((q - buf) < buf_size - 1)
3824 if (!percentd_found)
3833 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3837 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3839 for(i=0;i<size;i+=16) {
3846 PRINT(" %02x", buf[i+j]);
3851 for(j=0;j<len;j++) {
3853 if (c < ' ' || c > '~')
3862 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3864 hex_dump_internal(NULL, f, 0, buf, size);
3867 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3869 hex_dump_internal(avcl, NULL, level, buf, size);
3872 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3875 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3876 PRINT("stream #%d:\n", pkt->stream_index);
3877 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3878 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3879 /* DTS is _always_ valid after av_read_frame() */
3881 if (pkt->dts == AV_NOPTS_VALUE)
3884 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3885 /* PTS may not be known if B-frames are present. */
3887 if (pkt->pts == AV_NOPTS_VALUE)
3890 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3892 PRINT(" size=%d\n", pkt->size);
3895 av_hex_dump(f, pkt->data, pkt->size);
3899 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3901 AVRational tb = { 1, AV_TIME_BASE };
3902 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3906 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3908 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3912 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3914 AVRational tb = { 1, AV_TIME_BASE };
3915 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3919 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3922 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3925 void av_url_split(char *proto, int proto_size,
3926 char *authorization, int authorization_size,
3927 char *hostname, int hostname_size,
3929 char *path, int path_size,
3932 const char *p, *ls, *at, *col, *brk;
3934 if (port_ptr) *port_ptr = -1;
3935 if (proto_size > 0) proto[0] = 0;
3936 if (authorization_size > 0) authorization[0] = 0;
3937 if (hostname_size > 0) hostname[0] = 0;
3938 if (path_size > 0) path[0] = 0;
3940 /* parse protocol */
3941 if ((p = strchr(url, ':'))) {
3942 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3947 /* no protocol means plain filename */
3948 av_strlcpy(path, url, path_size);
3952 /* separate path from hostname */
3953 ls = strchr(p, '/');
3955 ls = strchr(p, '?');
3957 av_strlcpy(path, ls, path_size);
3959 ls = &p[strlen(p)]; // XXX
3961 /* the rest is hostname, use that to parse auth/port */
3963 /* authorization (user[:pass]@hostname) */
3964 if ((at = strchr(p, '@')) && at < ls) {
3965 av_strlcpy(authorization, p,
3966 FFMIN(authorization_size, at + 1 - p));
3967 p = at + 1; /* skip '@' */
3970 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3972 av_strlcpy(hostname, p + 1,
3973 FFMIN(hostname_size, brk - p));
3974 if (brk[1] == ':' && port_ptr)
3975 *port_ptr = atoi(brk + 2);
3976 } else if ((col = strchr(p, ':')) && col < ls) {
3977 av_strlcpy(hostname, p,
3978 FFMIN(col + 1 - p, hostname_size));
3979 if (port_ptr) *port_ptr = atoi(col + 1);
3981 av_strlcpy(hostname, p,
3982 FFMIN(ls + 1 - p, hostname_size));
3986 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3989 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3992 'C', 'D', 'E', 'F' };
3993 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3996 'c', 'd', 'e', 'f' };
3997 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3999 for(i = 0; i < s; i++) {
4000 buff[i * 2] = hex_table[src[i] >> 4];
4001 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4007 int ff_hex_to_data(uint8_t *data, const char *p)
4014 p += strspn(p, SPACE_CHARS);
4017 c = toupper((unsigned char) *p++);
4018 if (c >= '0' && c <= '9')
4020 else if (c >= 'A' && c <= 'F')
4035 #if FF_API_SET_PTS_INFO
4036 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
4037 unsigned int pts_num, unsigned int pts_den)
4039 avpriv_set_pts_info(s, pts_wrap_bits, pts_num, pts_den);
4043 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4044 unsigned int pts_num, unsigned int pts_den)
4047 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
4048 if(new_tb.num != pts_num)
4049 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
4051 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
4053 if(new_tb.num <= 0 || new_tb.den <= 0) {
4054 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
4057 s->time_base = new_tb;
4058 s->pts_wrap_bits = pts_wrap_bits;
4061 int ff_url_join(char *str, int size, const char *proto,
4062 const char *authorization, const char *hostname,
4063 int port, const char *fmt, ...)
4066 struct addrinfo hints, *ai;
4071 av_strlcatf(str, size, "%s://", proto);
4072 if (authorization && authorization[0])
4073 av_strlcatf(str, size, "%s@", authorization);
4074 #if CONFIG_NETWORK && defined(AF_INET6)
4075 /* Determine if hostname is a numerical IPv6 address,
4076 * properly escape it within [] in that case. */
4077 memset(&hints, 0, sizeof(hints));
4078 hints.ai_flags = AI_NUMERICHOST;
4079 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
4080 if (ai->ai_family == AF_INET6) {
4081 av_strlcat(str, "[", size);
4082 av_strlcat(str, hostname, size);
4083 av_strlcat(str, "]", size);
4085 av_strlcat(str, hostname, size);
4090 /* Not an IPv6 address, just output the plain string. */
4091 av_strlcat(str, hostname, size);
4094 av_strlcatf(str, size, ":%d", port);
4097 int len = strlen(str);
4100 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
4106 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
4107 AVFormatContext *src)
4112 local_pkt.stream_index = dst_stream;
4113 if (pkt->pts != AV_NOPTS_VALUE)
4114 local_pkt.pts = av_rescale_q(pkt->pts,
4115 src->streams[pkt->stream_index]->time_base,
4116 dst->streams[dst_stream]->time_base);
4117 if (pkt->dts != AV_NOPTS_VALUE)
4118 local_pkt.dts = av_rescale_q(pkt->dts,
4119 src->streams[pkt->stream_index]->time_base,
4120 dst->streams[dst_stream]->time_base);
4121 return av_write_frame(dst, &local_pkt);
4124 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4127 const char *ptr = str;
4129 /* Parse key=value pairs. */
4132 char *dest = NULL, *dest_end;
4133 int key_len, dest_len = 0;
4135 /* Skip whitespace and potential commas. */
4136 while (*ptr && (isspace(*ptr) || *ptr == ','))
4143 if (!(ptr = strchr(key, '=')))
4146 key_len = ptr - key;
4148 callback_get_buf(context, key, key_len, &dest, &dest_len);
4149 dest_end = dest + dest_len - 1;
4153 while (*ptr && *ptr != '\"') {
4157 if (dest && dest < dest_end)
4161 if (dest && dest < dest_end)
4169 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
4170 if (dest && dest < dest_end)
4178 int ff_find_stream_index(AVFormatContext *s, int id)
4181 for (i = 0; i < s->nb_streams; i++) {
4182 if (s->streams[i]->id == id)
4188 void ff_make_absolute_url(char *buf, int size, const char *base,
4192 /* Absolute path, relative to the current server */
4193 if (base && strstr(base, "://") && rel[0] == '/') {
4195 av_strlcpy(buf, base, size);
4196 sep = strstr(buf, "://");
4199 sep = strchr(sep, '/');
4203 av_strlcat(buf, rel, size);
4206 /* If rel actually is an absolute url, just copy it */
4207 if (!base || strstr(rel, "://") || rel[0] == '/') {
4208 av_strlcpy(buf, rel, size);
4212 av_strlcpy(buf, base, size);
4213 /* Remove the file name from the base url */
4214 sep = strrchr(buf, '/');
4219 while (av_strstart(rel, "../", NULL) && sep) {
4220 /* Remove the path delimiter at the end */
4222 sep = strrchr(buf, '/');
4223 /* If the next directory name to pop off is "..", break here */
4224 if (!strcmp(sep ? &sep[1] : buf, "..")) {
4225 /* Readd the slash we just removed */
4226 av_strlcat(buf, "/", size);
4229 /* Cut off the directory name */
4236 av_strlcat(buf, rel, size);
4239 int64_t ff_iso8601_to_unix_time(const char *datestr)
4242 struct tm time1 = {0}, time2 = {0};
4244 ret1 = strptime(datestr, "%Y - %m - %d %T", &time1);
4245 ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2);
4247 return av_timegm(&time2);
4249 return av_timegm(&time1);
4251 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
4252 "the date string.\n");
4257 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
4260 if (ofmt->query_codec)
4261 return ofmt->query_codec(codec_id, std_compliance);
4262 else if (ofmt->codec_tag)
4263 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4264 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4265 codec_id == ofmt->subtitle_codec)
4268 return AVERROR_PATCHWELCOME;
4271 int avformat_network_init(void)
4275 ff_network_inited_globally = 1;
4276 if ((ret = ff_network_init()) < 0)
4283 int avformat_network_deinit(void)