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)
270 int ret= av_new_packet(pkt, size);
275 pkt->pos= avio_tell(s);
277 ret= avio_read(s, pkt->data, size);
281 av_shrink_packet(pkt, ret);
286 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
291 return av_get_packet(s, pkt, size);
292 old_size = pkt->size;
293 ret = av_grow_packet(pkt, size);
296 ret = avio_read(s, pkt->data + old_size, size);
297 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
302 int av_filename_number_test(const char *filename)
305 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
308 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
310 AVProbeData lpd = *pd;
311 AVInputFormat *fmt1 = NULL, *fmt;
312 int score, nodat = 0, score_max=0;
314 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
315 int id3len = ff_id3v2_tag_len(lpd.buf);
316 if (lpd.buf_size > id3len + 16) {
318 lpd.buf_size -= id3len;
324 while ((fmt1 = av_iformat_next(fmt1))) {
325 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
328 if (fmt1->read_probe) {
329 score = fmt1->read_probe(&lpd);
330 if(fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
331 score = FFMAX(score, nodat ? AVPROBE_SCORE_MAX/4-1 : 1);
332 } else if (fmt1->extensions) {
333 if (av_match_ext(lpd.filename, fmt1->extensions)) {
337 if (score > score_max) {
340 }else if (score == score_max)
343 *score_ret= score_max;
348 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
351 AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
352 if(score_ret > *score_max){
353 *score_max= score_ret;
359 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
361 return av_probe_input_format2(pd, is_opened, &score);
364 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
366 static const struct {
367 const char *name; enum CodecID id; enum AVMediaType type;
369 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
370 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
371 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
372 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
373 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
374 { "loas" , CODEC_ID_AAC_LATM , AVMEDIA_TYPE_AUDIO },
375 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
376 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
377 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
381 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
385 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
386 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
387 for (i = 0; fmt_id_type[i].name; i++) {
388 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
389 st->codec->codec_id = fmt_id_type[i].id;
390 st->codec->codec_type = fmt_id_type[i].type;
398 /************************************************************/
399 /* input media file */
401 #if FF_API_FORMAT_PARAMETERS
402 static AVDictionary *convert_format_parameters(AVFormatParameters *ap)
405 AVDictionary *opts = NULL;
410 AV_NOWARN_DEPRECATED(
411 if (ap->time_base.num) {
412 snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
413 av_dict_set(&opts, "framerate", buf, 0);
415 if (ap->sample_rate) {
416 snprintf(buf, sizeof(buf), "%d", ap->sample_rate);
417 av_dict_set(&opts, "sample_rate", buf, 0);
420 snprintf(buf, sizeof(buf), "%d", ap->channels);
421 av_dict_set(&opts, "channels", buf, 0);
423 if (ap->width || ap->height) {
424 snprintf(buf, sizeof(buf), "%dx%d", ap->width, ap->height);
425 av_dict_set(&opts, "video_size", buf, 0);
427 if (ap->pix_fmt != PIX_FMT_NONE) {
428 av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(ap->pix_fmt), 0);
431 snprintf(buf, sizeof(buf), "%d", ap->channel);
432 av_dict_set(&opts, "channel", buf, 0);
435 av_dict_set(&opts, "standard", ap->standard, 0);
437 if (ap->mpeg2ts_compute_pcr) {
438 av_dict_set(&opts, "mpeg2ts_compute_pcr", "1", 0);
440 if (ap->initial_pause) {
441 av_dict_set(&opts, "initial_pause", "1", 0);
448 * Open a media file from an IO stream. 'fmt' must be specified.
450 int av_open_input_stream(AVFormatContext **ic_ptr,
451 AVIOContext *pb, const char *filename,
452 AVInputFormat *fmt, AVFormatParameters *ap)
457 AVFormatParameters default_ap;
461 memset(ap, 0, sizeof(default_ap));
463 opts = convert_format_parameters(ap);
465 AV_NOWARN_DEPRECATED(
466 if(!ap->prealloced_context)
467 *ic_ptr = ic = avformat_alloc_context();
472 err = AVERROR(ENOMEM);
475 if (pb && fmt && fmt->flags & AVFMT_NOFILE)
476 av_log(ic, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
477 "will be ignored with AVFMT_NOFILE format.\n");
481 if ((err = avformat_open_input(&ic, filename, fmt, &opts)) < 0)
483 ic->pb = ic->pb ? ic->pb : pb; // don't leak custom pb if it wasn't set above
492 int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap){
495 if (ic->iformat->read_header) {
496 err = ic->iformat->read_header(ic, ap);
501 if (ic->pb && !ic->data_offset)
502 ic->data_offset = avio_tell(ic->pb);
508 /** size of probe buffer, for guessing file type from file contents */
509 #define PROBE_BUF_MIN 2048
510 #define PROBE_BUF_MAX (1<<20)
512 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
513 const char *filename, void *logctx,
514 unsigned int offset, unsigned int max_probe_size)
516 AVProbeData pd = { filename ? filename : "", NULL, -offset };
517 unsigned char *buf = NULL;
518 int ret = 0, probe_size;
520 if (!max_probe_size) {
521 max_probe_size = PROBE_BUF_MAX;
522 } else if (max_probe_size > PROBE_BUF_MAX) {
523 max_probe_size = PROBE_BUF_MAX;
524 } else if (max_probe_size < PROBE_BUF_MIN) {
525 return AVERROR(EINVAL);
528 if (offset >= max_probe_size) {
529 return AVERROR(EINVAL);
532 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
533 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
534 int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
535 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
538 if (probe_size < offset) {
542 /* read probe data */
543 buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
546 return AVERROR(ENOMEM);
549 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
550 /* fail if error was not end of file, otherwise, lower score */
551 if (ret != AVERROR_EOF) {
556 ret = 0; /* error was end of file, nothing read */
559 pd.buf = &buf[offset];
561 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
563 /* guess file format */
564 *fmt = av_probe_input_format2(&pd, 1, &score);
566 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
567 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
569 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
575 return AVERROR_INVALIDDATA;
578 /* rewind. reuse probe buffer to avoid seeking */
579 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
585 #if FF_API_FORMAT_PARAMETERS
586 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
589 AVFormatParameters *ap)
592 AVDictionary *opts = convert_format_parameters(ap);
594 AV_NOWARN_DEPRECATED(
595 if (!ap || !ap->prealloced_context)
599 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
606 /* open input file and probe the format if necessary */
607 static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)
610 AVProbeData pd = {filename, NULL, 0};
612 if(s->iformat && !strlen(filename))
616 s->flags |= AVFMT_FLAG_CUSTOM_IO;
618 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
619 else if (s->iformat->flags & AVFMT_NOFILE)
620 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
621 "will be ignored with AVFMT_NOFILE format.\n");
625 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
626 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
629 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ,
630 &s->interrupt_callback, options)) < 0)
634 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
637 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
639 AVFormatContext *s = *ps;
641 AVFormatParameters ap = { { 0 } };
642 AVDictionary *tmp = NULL;
644 if (!s && !(s = avformat_alloc_context()))
645 return AVERROR(ENOMEM);
650 av_dict_copy(&tmp, *options, 0);
652 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
655 if ((ret = init_input(s, filename, &tmp)) < 0)
658 /* check filename in case an image number is expected */
659 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
660 if (!av_filename_number_test(filename)) {
661 ret = AVERROR(EINVAL);
666 s->duration = s->start_time = AV_NOPTS_VALUE;
667 av_strlcpy(s->filename, filename, sizeof(s->filename));
669 /* allocate private data */
670 if (s->iformat->priv_data_size > 0) {
671 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
672 ret = AVERROR(ENOMEM);
675 if (s->iformat->priv_class) {
676 *(const AVClass**)s->priv_data = s->iformat->priv_class;
677 av_opt_set_defaults(s->priv_data);
678 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
683 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
685 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
687 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
688 if ((ret = s->iformat->read_header(s, &ap)) < 0)
691 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
692 s->data_offset = avio_tell(s->pb);
694 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
697 av_dict_free(options);
705 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
707 avformat_free_context(s);
712 /*******************************************************/
714 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
715 AVPacketList **plast_pktl){
716 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
721 (*plast_pktl)->next = pktl;
723 *packet_buffer = pktl;
725 /* add the packet in the buffered packet list */
731 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
737 AVPacketList *pktl = s->raw_packet_buffer;
741 if(s->streams[pkt->stream_index]->request_probe <= 0){
742 s->raw_packet_buffer = pktl->next;
743 s->raw_packet_buffer_remaining_size += pkt->size;
750 ret= s->iformat->read_packet(s, pkt);
752 if (!pktl || ret == AVERROR(EAGAIN))
754 for (i = 0; i < s->nb_streams; i++)
755 if(s->streams[i]->request_probe > 0)
756 s->streams[i]->request_probe = -1;
760 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
761 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
762 av_log(s, AV_LOG_WARNING,
763 "Dropped corrupted packet (stream = %d)\n",
769 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
770 av_packet_merge_side_data(pkt);
772 if(pkt->stream_index >= (unsigned)s->nb_streams){
773 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
777 st= s->streams[pkt->stream_index];
779 switch(st->codec->codec_type){
780 case AVMEDIA_TYPE_VIDEO:
781 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
783 case AVMEDIA_TYPE_AUDIO:
784 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
786 case AVMEDIA_TYPE_SUBTITLE:
787 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
791 if(!pktl && st->request_probe <= 0)
794 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
795 s->raw_packet_buffer_remaining_size -= pkt->size;
797 if(st->request_probe>0){
798 AVProbeData *pd = &st->probe_data;
800 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
803 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
804 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
805 pd->buf_size += pkt->size;
806 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
808 end= s->raw_packet_buffer_remaining_size <= 0
809 || st->probe_packets<=0;
811 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
812 int score= set_codec_from_probe_data(s, st, pd);
813 if( (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
817 st->request_probe= -1;
818 if(st->codec->codec_id != CODEC_ID_NONE){
819 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
821 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
828 /**********************************************************/
831 * Get the number of samples of an audio frame. Return -1 on error.
833 static int get_audio_frame_size(AVCodecContext *enc, int size)
837 if(enc->codec_id == CODEC_ID_VORBIS)
840 if (enc->frame_size <= 1) {
841 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
843 if (bits_per_sample) {
844 if (enc->channels == 0)
846 frame_size = (size << 3) / (bits_per_sample * enc->channels);
848 /* used for example by ADPCM codecs */
849 if (enc->bit_rate == 0)
851 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
854 frame_size = enc->frame_size;
861 * Return the frame duration in seconds. Return 0 if not available.
863 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
864 AVCodecParserContext *pc, AVPacket *pkt)
870 switch(st->codec->codec_type) {
871 case AVMEDIA_TYPE_VIDEO:
872 if (st->r_frame_rate.num && !pc) {
873 *pnum = st->r_frame_rate.den;
874 *pden = st->r_frame_rate.num;
875 } else if(st->time_base.num*1000LL > st->time_base.den) {
876 *pnum = st->time_base.num;
877 *pden = st->time_base.den;
878 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
879 *pnum = st->codec->time_base.num;
880 *pden = st->codec->time_base.den;
881 if (pc && pc->repeat_pict) {
882 *pnum = (*pnum) * (1 + pc->repeat_pict);
884 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
885 //Thus if we have no parser in such case leave duration undefined.
886 if(st->codec->ticks_per_frame>1 && !pc){
891 case AVMEDIA_TYPE_AUDIO:
892 frame_size = get_audio_frame_size(st->codec, pkt->size);
893 if (frame_size <= 0 || st->codec->sample_rate <= 0)
896 *pden = st->codec->sample_rate;
903 static int is_intra_only(AVCodecContext *enc){
904 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
906 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
907 switch(enc->codec_id){
909 case CODEC_ID_MJPEGB:
911 case CODEC_ID_PRORES:
912 case CODEC_ID_RAWVIDEO:
913 case CODEC_ID_DVVIDEO:
914 case CODEC_ID_HUFFYUV:
915 case CODEC_ID_FFVHUFF:
920 case CODEC_ID_JPEG2000:
928 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
929 int64_t dts, int64_t pts)
931 AVStream *st= s->streams[stream_index];
932 AVPacketList *pktl= s->packet_buffer;
934 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
937 st->first_dts= dts - st->cur_dts;
940 for(; pktl; pktl= pktl->next){
941 if(pktl->pkt.stream_index != stream_index)
943 //FIXME think more about this check
944 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
945 pktl->pkt.pts += st->first_dts;
947 if(pktl->pkt.dts != AV_NOPTS_VALUE)
948 pktl->pkt.dts += st->first_dts;
950 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
951 st->start_time= pktl->pkt.pts;
953 if (st->start_time == AV_NOPTS_VALUE)
954 st->start_time = pts;
957 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
959 AVPacketList *pktl= s->packet_buffer;
962 if(st->first_dts != AV_NOPTS_VALUE){
963 cur_dts= st->first_dts;
964 for(; pktl; pktl= pktl->next){
965 if(pktl->pkt.stream_index == pkt->stream_index){
966 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
968 cur_dts -= pkt->duration;
971 pktl= s->packet_buffer;
972 st->first_dts = cur_dts;
973 }else if(st->cur_dts)
976 for(; pktl; pktl= pktl->next){
977 if(pktl->pkt.stream_index != pkt->stream_index)
979 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
980 && !pktl->pkt.duration){
981 pktl->pkt.dts= cur_dts;
982 if(!st->codec->has_b_frames)
983 pktl->pkt.pts= cur_dts;
984 cur_dts += pkt->duration;
985 pktl->pkt.duration= pkt->duration;
989 if(st->first_dts == AV_NOPTS_VALUE)
990 st->cur_dts= cur_dts;
993 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
994 AVCodecParserContext *pc, AVPacket *pkt)
996 int num, den, presentation_delayed, delay, i;
999 if (s->flags & AVFMT_FLAG_NOFILLIN)
1002 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1003 pkt->dts= AV_NOPTS_VALUE;
1005 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
1006 //FIXME Set low_delay = 0 when has_b_frames = 1
1007 st->codec->has_b_frames = 1;
1009 /* do we have a video B-frame ? */
1010 delay= st->codec->has_b_frames;
1011 presentation_delayed = 0;
1013 /* XXX: need has_b_frame, but cannot get it if the codec is
1016 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1017 presentation_delayed = 1;
1019 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){
1020 pkt->dts -= 1LL<<st->pts_wrap_bits;
1023 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
1024 // we take the conservative approach and discard both
1025 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
1026 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
1027 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1028 pkt->dts= AV_NOPTS_VALUE;
1031 if (pkt->duration == 0) {
1032 compute_frame_duration(&num, &den, st, pc, pkt);
1034 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1036 if(pkt->duration != 0 && s->packet_buffer)
1037 update_initial_durations(s, st, pkt);
1041 /* correct timestamps with byte offset if demuxers only have timestamps
1042 on packet boundaries */
1043 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1044 /* this will estimate bitrate based on this frame's duration and size */
1045 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1046 if(pkt->pts != AV_NOPTS_VALUE)
1048 if(pkt->dts != AV_NOPTS_VALUE)
1052 if (pc && pc->dts_sync_point >= 0) {
1053 // we have synchronization info from the parser
1054 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1056 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1057 if (pkt->dts != AV_NOPTS_VALUE) {
1058 // got DTS from the stream, update reference timestamp
1059 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1060 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1061 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1062 // compute DTS based on reference timestamp
1063 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1064 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1066 if (pc->dts_sync_point > 0)
1067 st->reference_dts = pkt->dts; // new reference
1071 /* This may be redundant, but it should not hurt. */
1072 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1073 presentation_delayed = 1;
1075 // 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);
1076 /* interpolate PTS and DTS if they are not present */
1077 //We skip H264 currently because delay and has_b_frames are not reliably set
1078 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1079 if (presentation_delayed) {
1080 /* DTS = decompression timestamp */
1081 /* PTS = presentation timestamp */
1082 if (pkt->dts == AV_NOPTS_VALUE)
1083 pkt->dts = st->last_IP_pts;
1084 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1085 if (pkt->dts == AV_NOPTS_VALUE)
1086 pkt->dts = st->cur_dts;
1088 /* this is tricky: the dts must be incremented by the duration
1089 of the frame we are displaying, i.e. the last I- or P-frame */
1090 if (st->last_IP_duration == 0)
1091 st->last_IP_duration = pkt->duration;
1092 if(pkt->dts != AV_NOPTS_VALUE)
1093 st->cur_dts = pkt->dts + st->last_IP_duration;
1094 st->last_IP_duration = pkt->duration;
1095 st->last_IP_pts= pkt->pts;
1096 /* cannot compute PTS if not present (we can compute it only
1097 by knowing the future */
1098 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1099 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1100 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1101 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1102 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1103 pkt->pts += pkt->duration;
1104 // 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);
1108 /* presentation is not delayed : PTS and DTS are the same */
1109 if(pkt->pts == AV_NOPTS_VALUE)
1110 pkt->pts = pkt->dts;
1111 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1112 if(pkt->pts == AV_NOPTS_VALUE)
1113 pkt->pts = st->cur_dts;
1114 pkt->dts = pkt->pts;
1115 if(pkt->pts != AV_NOPTS_VALUE)
1116 st->cur_dts = pkt->pts + pkt->duration;
1120 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1121 st->pts_buffer[0]= pkt->pts;
1122 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1123 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1124 if(pkt->dts == AV_NOPTS_VALUE)
1125 pkt->dts= st->pts_buffer[0];
1126 if(st->codec->codec_id == CODEC_ID_H264){ // we skipped it above so we try here
1127 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1129 if(pkt->dts > st->cur_dts)
1130 st->cur_dts = pkt->dts;
1133 // 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);
1136 if(is_intra_only(st->codec))
1137 pkt->flags |= AV_PKT_FLAG_KEY;
1140 /* keyframe computation */
1141 if (pc->key_frame == 1)
1142 pkt->flags |= AV_PKT_FLAG_KEY;
1143 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1144 pkt->flags |= AV_PKT_FLAG_KEY;
1147 pkt->convergence_duration = pc->convergence_duration;
1151 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1156 av_init_packet(pkt);
1159 /* select current input stream component */
1162 if (!st->need_parsing || !st->parser) {
1163 /* no parsing needed: we just output the packet as is */
1164 /* raw data support */
1166 st->cur_pkt.data= NULL;
1167 st->cur_pkt.side_data_elems = 0;
1168 st->cur_pkt.side_data = NULL;
1169 compute_pkt_fields(s, st, NULL, pkt);
1171 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1172 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1173 ff_reduce_index(s, st->index);
1174 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1177 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1178 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1179 st->cur_ptr, st->cur_len,
1180 st->cur_pkt.pts, st->cur_pkt.dts,
1182 st->cur_pkt.pts = AV_NOPTS_VALUE;
1183 st->cur_pkt.dts = AV_NOPTS_VALUE;
1184 /* increment read pointer */
1188 /* return packet if any */
1192 pkt->stream_index = st->index;
1193 pkt->pts = st->parser->pts;
1194 pkt->dts = st->parser->dts;
1195 pkt->pos = st->parser->pos;
1196 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1198 pkt->destruct= st->cur_pkt.destruct;
1199 st->cur_pkt.destruct= NULL;
1200 st->cur_pkt.data = NULL;
1201 assert(st->cur_len == 0);
1203 pkt->destruct = NULL;
1205 compute_pkt_fields(s, st, st->parser, pkt);
1207 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1208 int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
1209 ff_reduce_index(s, st->index);
1210 av_add_index_entry(st, pos, pkt->dts,
1211 0, 0, AVINDEX_KEYFRAME);
1218 av_free_packet(&st->cur_pkt);
1223 /* read next packet */
1224 ret = av_read_packet(s, &cur_pkt);
1226 if (ret == AVERROR(EAGAIN))
1228 /* return the last frames, if any */
1229 for(i = 0; i < s->nb_streams; i++) {
1231 if (st->parser && st->need_parsing) {
1232 av_parser_parse2(st->parser, st->codec,
1233 &pkt->data, &pkt->size,
1235 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1241 /* no more packets: really terminate parsing */
1244 st = s->streams[cur_pkt.stream_index];
1245 st->cur_pkt= cur_pkt;
1247 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1248 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1249 st->cur_pkt.pts < st->cur_pkt.dts){
1250 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1251 st->cur_pkt.stream_index,
1255 // av_free_packet(&st->cur_pkt);
1259 if(s->debug & FF_FDEBUG_TS)
1260 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1261 st->cur_pkt.stream_index,
1265 st->cur_pkt.duration,
1269 st->cur_ptr = st->cur_pkt.data;
1270 st->cur_len = st->cur_pkt.size;
1271 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1272 st->parser = av_parser_init(st->codec->codec_id);
1274 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1275 "%s, packets or times may be invalid.\n",
1276 avcodec_get_name(st->codec->codec_id));
1277 /* no parser available: just output the raw packets */
1278 st->need_parsing = AVSTREAM_PARSE_NONE;
1279 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1280 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1281 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1282 st->parser->flags |= PARSER_FLAG_ONCE;
1287 if(s->debug & FF_FDEBUG_TS)
1288 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1299 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1303 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1306 pktl = s->packet_buffer;
1308 AVPacket *next_pkt= &pktl->pkt;
1310 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1311 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1312 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1313 if( pktl->pkt.stream_index == next_pkt->stream_index
1314 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1315 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1316 next_pkt->pts= pktl->pkt.dts;
1320 pktl = s->packet_buffer;
1323 if( next_pkt->pts != AV_NOPTS_VALUE
1324 || next_pkt->dts == AV_NOPTS_VALUE
1326 /* read packet from packet buffer, if there is data */
1328 s->packet_buffer = pktl->next;
1334 int ret= read_frame_internal(s, pkt);
1336 if(pktl && ret != AVERROR(EAGAIN)){
1343 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1344 &s->packet_buffer_end)) < 0)
1345 return AVERROR(ENOMEM);
1347 assert(!s->packet_buffer);
1348 return read_frame_internal(s, pkt);
1353 /* XXX: suppress the packet queue */
1354 static void flush_packet_queue(AVFormatContext *s)
1359 pktl = s->packet_buffer;
1362 s->packet_buffer = pktl->next;
1363 av_free_packet(&pktl->pkt);
1366 while(s->raw_packet_buffer){
1367 pktl = s->raw_packet_buffer;
1368 s->raw_packet_buffer = pktl->next;
1369 av_free_packet(&pktl->pkt);
1372 s->packet_buffer_end=
1373 s->raw_packet_buffer_end= NULL;
1374 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1377 /*******************************************************/
1380 int av_find_default_stream_index(AVFormatContext *s)
1382 int first_audio_index = -1;
1386 if (s->nb_streams <= 0)
1388 for(i = 0; i < s->nb_streams; i++) {
1390 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1393 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1394 first_audio_index = i;
1396 return first_audio_index >= 0 ? first_audio_index : 0;
1400 * Flush the frame reader.
1402 void ff_read_frame_flush(AVFormatContext *s)
1407 flush_packet_queue(s);
1411 /* for each stream, reset read state */
1412 for(i = 0; i < s->nb_streams; i++) {
1416 av_parser_close(st->parser);
1418 av_free_packet(&st->cur_pkt);
1420 st->last_IP_pts = AV_NOPTS_VALUE;
1421 if(st->first_dts == AV_NOPTS_VALUE) st->cur_dts = 0;
1422 else st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1423 st->reference_dts = AV_NOPTS_VALUE;
1428 st->probe_packets = MAX_PROBE_PACKETS;
1430 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1431 st->pts_buffer[j]= AV_NOPTS_VALUE;
1435 #if FF_API_SEEK_PUBLIC
1436 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1438 ff_update_cur_dts(s, ref_st, timestamp);
1442 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1446 for(i = 0; i < s->nb_streams; i++) {
1447 AVStream *st = s->streams[i];
1449 st->cur_dts = av_rescale(timestamp,
1450 st->time_base.den * (int64_t)ref_st->time_base.num,
1451 st->time_base.num * (int64_t)ref_st->time_base.den);
1455 void ff_reduce_index(AVFormatContext *s, int stream_index)
1457 AVStream *st= s->streams[stream_index];
1458 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1460 if((unsigned)st->nb_index_entries >= max_entries){
1462 for(i=0; 2*i<st->nb_index_entries; i++)
1463 st->index_entries[i]= st->index_entries[2*i];
1464 st->nb_index_entries= i;
1468 int ff_add_index_entry(AVIndexEntry **index_entries,
1469 int *nb_index_entries,
1470 unsigned int *index_entries_allocated_size,
1471 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1473 AVIndexEntry *entries, *ie;
1476 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1479 entries = av_fast_realloc(*index_entries,
1480 index_entries_allocated_size,
1481 (*nb_index_entries + 1) *
1482 sizeof(AVIndexEntry));
1486 *index_entries= entries;
1488 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1491 index= (*nb_index_entries)++;
1492 ie= &entries[index];
1493 assert(index==0 || ie[-1].timestamp < timestamp);
1495 ie= &entries[index];
1496 if(ie->timestamp != timestamp){
1497 if(ie->timestamp <= timestamp)
1499 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1500 (*nb_index_entries)++;
1501 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1502 distance= ie->min_distance;
1506 ie->timestamp = timestamp;
1507 ie->min_distance= distance;
1514 int av_add_index_entry(AVStream *st,
1515 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1517 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1518 &st->index_entries_allocated_size, pos,
1519 timestamp, size, distance, flags);
1522 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1523 int64_t wanted_timestamp, int flags)
1531 //optimize appending index entries at the end
1532 if(b && entries[b-1].timestamp < wanted_timestamp)
1537 timestamp = entries[m].timestamp;
1538 if(timestamp >= wanted_timestamp)
1540 if(timestamp <= wanted_timestamp)
1543 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1545 if(!(flags & AVSEEK_FLAG_ANY)){
1546 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1547 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1556 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1559 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1560 wanted_timestamp, flags);
1563 #if FF_API_SEEK_PUBLIC
1564 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1565 return ff_seek_frame_binary(s, stream_index, target_ts, flags);
1569 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
1571 AVInputFormat *avif= s->iformat;
1572 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1573 int64_t ts_min, ts_max, ts;
1578 if (stream_index < 0)
1581 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1584 ts_min= AV_NOPTS_VALUE;
1585 pos_limit= -1; //gcc falsely says it may be uninitialized
1587 st= s->streams[stream_index];
1588 if(st->index_entries){
1591 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()
1592 index= FFMAX(index, 0);
1593 e= &st->index_entries[index];
1595 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1597 ts_min= e->timestamp;
1598 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1604 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1605 assert(index < st->nb_index_entries);
1607 e= &st->index_entries[index];
1608 assert(e->timestamp >= target_ts);
1610 ts_max= e->timestamp;
1611 pos_limit= pos_max - e->min_distance;
1612 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1613 pos_max,pos_limit, ts_max);
1617 pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1622 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1625 ff_read_frame_flush(s);
1626 ff_update_cur_dts(s, st, ts);
1631 #if FF_API_SEEK_PUBLIC
1632 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1633 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1634 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1635 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1637 return ff_gen_search(s, stream_index, target_ts, pos_min, pos_max,
1638 pos_limit, ts_min, ts_max, flags, ts_ret,
1643 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1644 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1645 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1646 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1649 int64_t start_pos, filesize;
1652 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1654 if(ts_min == AV_NOPTS_VALUE){
1655 pos_min = s->data_offset;
1656 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1657 if (ts_min == AV_NOPTS_VALUE)
1661 if(ts_min >= target_ts){
1666 if(ts_max == AV_NOPTS_VALUE){
1668 filesize = avio_size(s->pb);
1669 pos_max = filesize - 1;
1672 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1674 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1675 if (ts_max == AV_NOPTS_VALUE)
1679 int64_t tmp_pos= pos_max + 1;
1680 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1681 if(tmp_ts == AV_NOPTS_VALUE)
1685 if(tmp_pos >= filesize)
1691 if(ts_max <= target_ts){
1696 if(ts_min > ts_max){
1698 }else if(ts_min == ts_max){
1703 while (pos_min < pos_limit) {
1704 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1705 pos_min, pos_max, ts_min, ts_max);
1706 assert(pos_limit <= pos_max);
1709 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1710 // interpolate position (better than dichotomy)
1711 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1712 + pos_min - approximate_keyframe_distance;
1713 }else if(no_change==1){
1714 // bisection, if interpolation failed to change min or max pos last time
1715 pos = (pos_min + pos_limit)>>1;
1717 /* linear search if bisection failed, can only happen if there
1718 are very few or no keyframes between min/max */
1723 else if(pos > pos_limit)
1727 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1732 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1733 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1734 pos_limit, start_pos, no_change);
1735 if(ts == AV_NOPTS_VALUE){
1736 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1739 assert(ts != AV_NOPTS_VALUE);
1740 if (target_ts <= ts) {
1741 pos_limit = start_pos - 1;
1745 if (target_ts >= ts) {
1751 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1752 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1755 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1757 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1758 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1759 pos, ts_min, target_ts, ts_max);
1765 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1766 int64_t pos_min, pos_max;
1770 if (stream_index < 0)
1773 st= s->streams[stream_index];
1776 pos_min = s->data_offset;
1777 pos_max = avio_size(s->pb) - 1;
1779 if (pos < pos_min) pos= pos_min;
1780 else if(pos > pos_max) pos= pos_max;
1782 avio_seek(s->pb, pos, SEEK_SET);
1785 av_update_cur_dts(s, st, ts);
1790 static int seek_frame_generic(AVFormatContext *s,
1791 int stream_index, int64_t timestamp, int flags)
1798 st = s->streams[stream_index];
1800 index = av_index_search_timestamp(st, timestamp, flags);
1802 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1805 if(index < 0 || index==st->nb_index_entries-1){
1809 if(st->nb_index_entries){
1810 assert(st->index_entries);
1811 ie= &st->index_entries[st->nb_index_entries-1];
1812 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1814 ff_update_cur_dts(s, st, ie->timestamp);
1816 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1822 read_status = av_read_frame(s, &pkt);
1823 } while (read_status == AVERROR(EAGAIN));
1824 if (read_status < 0)
1826 av_free_packet(&pkt);
1827 if(stream_index == pkt.stream_index && pkt.dts > timestamp){
1828 if(pkt.flags & AV_PKT_FLAG_KEY)
1830 if(nonkey++ > 1000 && st->codec->codec_id != CODEC_ID_CDGRAPHICS){
1831 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);
1836 index = av_index_search_timestamp(st, timestamp, flags);
1841 ff_read_frame_flush(s);
1842 AV_NOWARN_DEPRECATED(
1843 if (s->iformat->read_seek){
1844 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1848 ie = &st->index_entries[index];
1849 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1851 ff_update_cur_dts(s, st, ie->timestamp);
1856 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1861 if (flags & AVSEEK_FLAG_BYTE) {
1862 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1864 ff_read_frame_flush(s);
1865 return seek_frame_byte(s, stream_index, timestamp, flags);
1868 if(stream_index < 0){
1869 stream_index= av_find_default_stream_index(s);
1870 if(stream_index < 0)
1873 st= s->streams[stream_index];
1874 /* timestamp for default must be expressed in AV_TIME_BASE units */
1875 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1878 /* first, we try the format specific seek */
1879 AV_NOWARN_DEPRECATED(
1880 if (s->iformat->read_seek) {
1881 ff_read_frame_flush(s);
1882 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1890 if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1891 ff_read_frame_flush(s);
1892 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1893 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1894 ff_read_frame_flush(s);
1895 return seek_frame_generic(s, stream_index, timestamp, flags);
1901 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1903 if(min_ts > ts || max_ts < ts)
1906 if (s->iformat->read_seek2) {
1907 ff_read_frame_flush(s);
1908 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1911 if(s->iformat->read_timestamp){
1912 //try to seek via read_timestamp()
1915 //Fallback to old API if new is not implemented but old is
1916 //Note the old has somewat different sematics
1917 AV_NOWARN_DEPRECATED(
1918 if(s->iformat->read_seek || 1)
1919 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1922 // try some generic seek like seek_frame_generic() but with new ts semantics
1925 /*******************************************************/
1928 * Return TRUE if the stream has accurate duration in any stream.
1930 * @return TRUE if the stream has accurate duration for at least one component.
1932 static int has_duration(AVFormatContext *ic)
1936 if(ic->duration != AV_NOPTS_VALUE)
1939 for(i = 0;i < ic->nb_streams; i++) {
1940 st = ic->streams[i];
1941 if (st->duration != AV_NOPTS_VALUE)
1948 * Estimate the stream timings from the one of each components.
1950 * Also computes the global bitrate if possible.
1952 static void update_stream_timings(AVFormatContext *ic)
1954 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1955 int64_t duration, duration1, filesize;
1959 start_time = INT64_MAX;
1960 start_time_text = INT64_MAX;
1961 end_time = INT64_MIN;
1962 duration = INT64_MIN;
1963 for(i = 0;i < ic->nb_streams; i++) {
1964 st = ic->streams[i];
1965 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1966 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1967 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1968 if (start_time1 < start_time_text)
1969 start_time_text = start_time1;
1971 start_time = FFMIN(start_time, start_time1);
1972 if (st->duration != AV_NOPTS_VALUE) {
1973 end_time1 = start_time1
1974 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1975 end_time = FFMAX(end_time, end_time1);
1978 if (st->duration != AV_NOPTS_VALUE) {
1979 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1980 duration = FFMAX(duration, duration1);
1983 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
1984 start_time = start_time_text;
1985 if (start_time != INT64_MAX) {
1986 ic->start_time = start_time;
1987 if (end_time != INT64_MIN)
1988 duration = FFMAX(duration, end_time - start_time);
1990 if (duration != INT64_MIN && ic->duration == AV_NOPTS_VALUE) {
1991 ic->duration = duration;
1993 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
1994 /* compute the bitrate */
1995 ic->bit_rate = (double)filesize * 8.0 * AV_TIME_BASE /
1996 (double)ic->duration;
2000 static void fill_all_stream_timings(AVFormatContext *ic)
2005 update_stream_timings(ic);
2006 for(i = 0;i < ic->nb_streams; i++) {
2007 st = ic->streams[i];
2008 if (st->start_time == AV_NOPTS_VALUE) {
2009 if(ic->start_time != AV_NOPTS_VALUE)
2010 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
2011 if(ic->duration != AV_NOPTS_VALUE)
2012 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
2017 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2019 int64_t filesize, duration;
2023 /* if bit_rate is already set, we believe it */
2024 if (ic->bit_rate <= 0) {
2026 for(i=0;i<ic->nb_streams;i++) {
2027 st = ic->streams[i];
2028 if (st->codec->bit_rate > 0)
2029 bit_rate += st->codec->bit_rate;
2031 ic->bit_rate = bit_rate;
2034 /* if duration is already set, we believe it */
2035 if (ic->duration == AV_NOPTS_VALUE &&
2036 ic->bit_rate != 0) {
2037 filesize = ic->pb ? avio_size(ic->pb) : 0;
2039 for(i = 0; i < ic->nb_streams; i++) {
2040 st = ic->streams[i];
2041 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
2042 if (st->duration == AV_NOPTS_VALUE)
2043 st->duration = duration;
2049 #define DURATION_MAX_READ_SIZE 250000
2050 #define DURATION_MAX_RETRY 3
2052 /* only usable for MPEG-PS streams */
2053 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2055 AVPacket pkt1, *pkt = &pkt1;
2057 int read_size, i, ret;
2059 int64_t filesize, offset, duration;
2064 /* flush packet queue */
2065 flush_packet_queue(ic);
2067 for (i=0; i<ic->nb_streams; i++) {
2068 st = ic->streams[i];
2069 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
2070 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2073 av_parser_close(st->parser);
2075 av_free_packet(&st->cur_pkt);
2079 /* estimate the end time (duration) */
2080 /* XXX: may need to support wrapping */
2081 filesize = ic->pb ? avio_size(ic->pb) : 0;
2082 end_time = AV_NOPTS_VALUE;
2084 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2088 avio_seek(ic->pb, offset, SEEK_SET);
2091 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2095 ret = av_read_packet(ic, pkt);
2096 } while(ret == AVERROR(EAGAIN));
2099 read_size += pkt->size;
2100 st = ic->streams[pkt->stream_index];
2101 if (pkt->pts != AV_NOPTS_VALUE &&
2102 (st->start_time != AV_NOPTS_VALUE ||
2103 st->first_dts != AV_NOPTS_VALUE)) {
2104 duration = end_time = pkt->pts;
2105 if (st->start_time != AV_NOPTS_VALUE)
2106 duration -= st->start_time;
2108 duration -= st->first_dts;
2110 duration += 1LL<<st->pts_wrap_bits;
2112 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2113 st->duration = duration;
2116 av_free_packet(pkt);
2118 }while( end_time==AV_NOPTS_VALUE
2119 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2120 && ++retry <= DURATION_MAX_RETRY);
2122 fill_all_stream_timings(ic);
2124 avio_seek(ic->pb, old_offset, SEEK_SET);
2125 for (i=0; i<ic->nb_streams; i++) {
2127 st->cur_dts= st->first_dts;
2128 st->last_IP_pts = AV_NOPTS_VALUE;
2129 st->reference_dts = AV_NOPTS_VALUE;
2133 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2137 /* get the file size, if possible */
2138 if (ic->iformat->flags & AVFMT_NOFILE) {
2141 file_size = avio_size(ic->pb);
2142 file_size = FFMAX(0, file_size);
2145 if ((!strcmp(ic->iformat->name, "mpeg") ||
2146 !strcmp(ic->iformat->name, "mpegts")) &&
2147 file_size && ic->pb->seekable) {
2148 /* get accurate estimate from the PTSes */
2149 estimate_timings_from_pts(ic, old_offset);
2150 } else if (has_duration(ic)) {
2151 /* at least one component has timings - we use them for all
2153 fill_all_stream_timings(ic);
2155 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2156 /* less precise: use bitrate info */
2157 estimate_timings_from_bit_rate(ic);
2159 update_stream_timings(ic);
2163 AVStream av_unused *st;
2164 for(i = 0;i < ic->nb_streams; i++) {
2165 st = ic->streams[i];
2166 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2167 (double) st->start_time / AV_TIME_BASE,
2168 (double) st->duration / AV_TIME_BASE);
2170 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2171 (double) ic->start_time / AV_TIME_BASE,
2172 (double) ic->duration / AV_TIME_BASE,
2173 ic->bit_rate / 1000);
2177 static int has_codec_parameters(AVCodecContext *avctx)
2180 switch (avctx->codec_type) {
2181 case AVMEDIA_TYPE_AUDIO:
2182 val = avctx->sample_rate && avctx->channels && avctx->sample_fmt != AV_SAMPLE_FMT_NONE;
2183 if (!avctx->frame_size &&
2184 (avctx->codec_id == CODEC_ID_VORBIS ||
2185 avctx->codec_id == CODEC_ID_AAC ||
2186 avctx->codec_id == CODEC_ID_MP1 ||
2187 avctx->codec_id == CODEC_ID_MP2 ||
2188 avctx->codec_id == CODEC_ID_MP3 ||
2189 avctx->codec_id == CODEC_ID_CELT))
2192 case AVMEDIA_TYPE_VIDEO:
2193 val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
2195 case AVMEDIA_TYPE_DATA:
2196 if(avctx->codec_id == CODEC_ID_NONE) return 1;
2201 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2204 static int has_decode_delay_been_guessed(AVStream *st)
2206 return st->codec->codec_id != CODEC_ID_H264 ||
2207 st->info->nb_decoded_frames >= 6;
2210 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2213 int got_picture, ret = 0;
2215 AVPacket pkt = *avpkt;
2217 if(!st->codec->codec){
2218 codec = avcodec_find_decoder(st->codec->codec_id);
2221 ret = avcodec_open2(st->codec, codec, options);
2226 while (pkt.size > 0 && ret >= 0 &&
2227 (!has_codec_parameters(st->codec) ||
2228 !has_decode_delay_been_guessed(st) ||
2229 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2231 avcodec_get_frame_defaults(&picture);
2232 switch(st->codec->codec_type) {
2233 case AVMEDIA_TYPE_VIDEO:
2234 ret = avcodec_decode_video2(st->codec, &picture,
2235 &got_picture, &pkt);
2237 case AVMEDIA_TYPE_AUDIO:
2238 ret = avcodec_decode_audio4(st->codec, &picture, &got_picture, &pkt);
2245 st->info->nb_decoded_frames++;
2253 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2255 while (tags->id != CODEC_ID_NONE) {
2263 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2266 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2267 if(tag == tags[i].tag)
2270 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2271 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2274 return CODEC_ID_NONE;
2277 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2280 for(i=0; tags && tags[i]; i++){
2281 int tag= ff_codec_get_tag(tags[i], id);
2287 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2290 for(i=0; tags && tags[i]; i++){
2291 enum CodecID id= ff_codec_get_id(tags[i], tag);
2292 if(id!=CODEC_ID_NONE) return id;
2294 return CODEC_ID_NONE;
2297 static void compute_chapters_end(AVFormatContext *s)
2300 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2302 for (i = 0; i < s->nb_chapters; i++)
2303 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2304 AVChapter *ch = s->chapters[i];
2305 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2308 for (j = 0; j < s->nb_chapters; j++) {
2309 AVChapter *ch1 = s->chapters[j];
2310 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2311 if (j != i && next_start > ch->start && next_start < end)
2314 ch->end = (end == INT64_MAX) ? ch->start : end;
2318 static int get_std_framerate(int i){
2319 if(i<60*12) return i*1001;
2320 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2324 * Is the time base unreliable.
2325 * This is a heuristic to balance between quick acceptance of the values in
2326 * the headers vs. some extra checks.
2327 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2328 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2329 * And there are "variable" fps files this needs to detect as well.
2331 static int tb_unreliable(AVCodecContext *c){
2332 if( c->time_base.den >= 101L*c->time_base.num
2333 || c->time_base.den < 5L*c->time_base.num
2334 /* || c->codec_tag == AV_RL32("DIVX")
2335 || c->codec_tag == AV_RL32("XVID")*/
2336 || c->codec_id == CODEC_ID_MPEG2VIDEO
2337 || c->codec_id == CODEC_ID_H264
2343 #if FF_API_FORMAT_PARAMETERS
2344 int av_find_stream_info(AVFormatContext *ic)
2346 return avformat_find_stream_info(ic, NULL);
2350 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2352 int i, count, ret, read_size, j;
2354 AVPacket pkt1, *pkt;
2355 int64_t old_offset = avio_tell(ic->pb);
2356 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2358 for(i=0;i<ic->nb_streams;i++) {
2360 st = ic->streams[i];
2362 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2363 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2364 /* if(!st->time_base.num)
2366 if(!st->codec->time_base.num)
2367 st->codec->time_base= st->time_base;
2369 //only for the split stuff
2370 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2371 st->parser = av_parser_init(st->codec->codec_id);
2372 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2373 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2376 assert(!st->codec->codec);
2377 codec = avcodec_find_decoder(st->codec->codec_id);
2379 /* Ensure that subtitle_header is properly set. */
2380 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2381 && codec && !st->codec->codec)
2382 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2384 //try to just open decoders, in case this is enough to get parameters
2385 if(!has_codec_parameters(st->codec)){
2386 if (codec && !st->codec->codec){
2387 AVDictionary *tmp = NULL;
2389 av_dict_copy(&tmp, options[i], 0);
2390 av_dict_set(&tmp, "threads", 0, 0);
2392 avcodec_open2(st->codec, codec, options ? &tmp : NULL);
2398 for (i=0; i<ic->nb_streams; i++) {
2399 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2405 if (ff_check_interrupt(&ic->interrupt_callback)){
2407 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2411 /* check if one codec still needs to be handled */
2412 for(i=0;i<ic->nb_streams;i++) {
2413 int fps_analyze_framecount = 20;
2415 st = ic->streams[i];
2416 if (!has_codec_parameters(st->codec))
2418 /* if the timebase is coarse (like the usual millisecond precision
2419 of mkv), we need to analyze more frames to reliably arrive at
2421 if (av_q2d(st->time_base) > 0.0005)
2422 fps_analyze_framecount *= 2;
2423 if (ic->fps_probe_size >= 0)
2424 fps_analyze_framecount = ic->fps_probe_size;
2425 /* variable fps and no guess at the real fps */
2426 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2427 && st->info->duration_count < fps_analyze_framecount
2428 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2430 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2432 if(st->first_dts == AV_NOPTS_VALUE && (st->codec->codec_type == AVMEDIA_TYPE_VIDEO || st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2435 if (i == ic->nb_streams) {
2436 /* NOTE: if the format has no header, then we need to read
2437 some packets to get most of the streams, so we cannot
2439 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2440 /* if we found the info for all the codecs, we can stop */
2442 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2446 /* we did not get all the codec info, but we read too much data */
2447 if (read_size >= ic->probesize) {
2449 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2453 /* NOTE: a new stream can be added there if no header in file
2454 (AVFMTCTX_NOHEADER) */
2455 ret = read_frame_internal(ic, &pkt1);
2456 if (ret == AVERROR(EAGAIN))
2461 ret = -1; /* we could not have all the codec parameters before EOF */
2462 for(i=0;i<ic->nb_streams;i++) {
2463 st = ic->streams[i];
2464 if (!has_codec_parameters(st->codec)){
2466 avcodec_string(buf, sizeof(buf), st->codec, 0);
2467 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2475 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2476 if ((ret = av_dup_packet(pkt)) < 0)
2477 goto find_stream_info_err;
2479 read_size += pkt->size;
2481 st = ic->streams[pkt->stream_index];
2482 if (st->codec_info_nb_frames>1) {
2484 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) {
2485 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2488 st->info->codec_info_duration += pkt->duration;
2491 int64_t last = st->info->last_dts;
2493 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2494 double dts= pkt->dts * av_q2d(st->time_base);
2495 int64_t duration= pkt->dts - last;
2497 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2498 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2499 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) {
2500 int framerate= get_std_framerate(i);
2501 double sdts= dts*framerate/(1001*12);
2503 int ticks= lrintf(sdts+j*0.5);
2504 double error= sdts - ticks + j*0.5;
2505 st->info->duration_error[j][0][i] += error;
2506 st->info->duration_error[j][1][i] += error*error;
2509 st->info->duration_count++;
2510 // ignore the first 4 values, they might have some random jitter
2511 if (st->info->duration_count > 3)
2512 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2514 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2515 st->info->last_dts = pkt->dts;
2517 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2518 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2520 st->codec->extradata_size= i;
2521 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2522 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2523 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2527 /* if still no information, we try to open the codec and to
2528 decompress the frame. We try to avoid that in most cases as
2529 it takes longer and uses more memory. For MPEG-4, we need to
2530 decompress for QuickTime.
2532 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2533 least one frame of codec data, this makes sure the codec initializes
2534 the channel configuration and does not only trust the values from the container.
2536 try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
2538 st->codec_info_nb_frames++;
2542 // close codecs which were opened in try_decode_frame()
2543 for(i=0;i<ic->nb_streams;i++) {
2544 st = ic->streams[i];
2545 if(st->codec->codec)
2546 avcodec_close(st->codec);
2548 for(i=0;i<ic->nb_streams;i++) {
2549 st = ic->streams[i];
2550 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2551 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2552 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2553 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2554 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2555 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2556 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2557 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2558 st->codec->codec_tag= tag;
2561 // the check for tb_unreliable() is not completely correct, since this is not about handling
2562 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2563 // ipmovie.c produces.
2564 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)
2565 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);
2566 if (st->info->duration_count && !st->r_frame_rate.num
2567 && tb_unreliable(st->codec) /*&&
2568 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2569 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2571 double best_error= 0.01;
2573 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) {
2576 if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2579 int n= st->info->duration_count;
2580 double a= st->info->duration_error[k][0][j] / n;
2581 double error= st->info->duration_error[k][1][j]/n - a*a;
2583 if(error < best_error && best_error> 0.000000001){
2585 num = get_std_framerate(j);
2588 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2591 // do not increase frame rate by more than 1 % in order to match a standard rate.
2592 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2593 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2596 if (!st->r_frame_rate.num){
2597 if( st->codec->time_base.den * (int64_t)st->time_base.num
2598 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2599 st->r_frame_rate.num = st->codec->time_base.den;
2600 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2602 st->r_frame_rate.num = st->time_base.den;
2603 st->r_frame_rate.den = st->time_base.num;
2606 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2607 if(!st->codec->bits_per_coded_sample)
2608 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2609 // set stream disposition based on audio service type
2610 switch (st->codec->audio_service_type) {
2611 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2612 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2613 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2614 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2615 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2616 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2617 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2618 st->disposition = AV_DISPOSITION_COMMENT; break;
2619 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2620 st->disposition = AV_DISPOSITION_KARAOKE; break;
2625 estimate_timings(ic, old_offset);
2627 compute_chapters_end(ic);
2630 /* correct DTS for B-frame streams with no timestamps */
2631 for(i=0;i<ic->nb_streams;i++) {
2632 st = ic->streams[i];
2633 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2635 ppktl = &ic->packet_buffer;
2637 if(ppkt1->stream_index != i)
2639 if(ppkt1->pkt->dts < 0)
2641 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2643 ppkt1->pkt->dts -= delta;
2648 st->cur_dts -= delta;
2654 find_stream_info_err:
2655 for (i=0; i < ic->nb_streams; i++)
2656 av_freep(&ic->streams[i]->info);
2660 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2664 for (i = 0; i < ic->nb_programs; i++) {
2665 if (ic->programs[i] == last) {
2669 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2670 if (ic->programs[i]->stream_index[j] == s)
2671 return ic->programs[i];
2677 int av_find_best_stream(AVFormatContext *ic,
2678 enum AVMediaType type,
2679 int wanted_stream_nb,
2681 AVCodec **decoder_ret,
2684 int i, nb_streams = ic->nb_streams;
2685 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2686 unsigned *program = NULL;
2687 AVCodec *decoder = NULL, *best_decoder = NULL;
2689 if (related_stream >= 0 && wanted_stream_nb < 0) {
2690 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2692 program = p->stream_index;
2693 nb_streams = p->nb_stream_indexes;
2696 for (i = 0; i < nb_streams; i++) {
2697 int real_stream_index = program ? program[i] : i;
2698 AVStream *st = ic->streams[real_stream_index];
2699 AVCodecContext *avctx = st->codec;
2700 if (avctx->codec_type != type)
2702 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2704 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2707 decoder = avcodec_find_decoder(st->codec->codec_id);
2710 ret = AVERROR_DECODER_NOT_FOUND;
2714 if (best_count >= st->codec_info_nb_frames)
2716 best_count = st->codec_info_nb_frames;
2717 ret = real_stream_index;
2718 best_decoder = decoder;
2719 if (program && i == nb_streams - 1 && ret < 0) {
2721 nb_streams = ic->nb_streams;
2722 i = 0; /* no related stream found, try again with everything */
2726 *decoder_ret = best_decoder;
2730 /*******************************************************/
2732 int av_read_play(AVFormatContext *s)
2734 if (s->iformat->read_play)
2735 return s->iformat->read_play(s);
2737 return avio_pause(s->pb, 0);
2738 return AVERROR(ENOSYS);
2741 int av_read_pause(AVFormatContext *s)
2743 if (s->iformat->read_pause)
2744 return s->iformat->read_pause(s);
2746 return avio_pause(s->pb, 1);
2747 return AVERROR(ENOSYS);
2750 #if FF_API_FORMAT_PARAMETERS
2751 void av_close_input_stream(AVFormatContext *s)
2753 flush_packet_queue(s);
2754 if (s->iformat->read_close)
2755 s->iformat->read_close(s);
2756 avformat_free_context(s);
2760 void avformat_free_context(AVFormatContext *s)
2766 if (s->iformat && s->iformat->priv_class && s->priv_data)
2767 av_opt_free(s->priv_data);
2769 for(i=0;i<s->nb_streams;i++) {
2770 /* free all data in a stream component */
2773 av_parser_close(st->parser);
2774 av_free_packet(&st->cur_pkt);
2776 av_dict_free(&st->metadata);
2777 av_freep(&st->index_entries);
2778 av_freep(&st->codec->extradata);
2779 av_freep(&st->codec->subtitle_header);
2780 av_freep(&st->codec);
2781 av_freep(&st->priv_data);
2782 av_freep(&st->info);
2785 for(i=s->nb_programs-1; i>=0; i--) {
2786 av_dict_free(&s->programs[i]->metadata);
2787 av_freep(&s->programs[i]->stream_index);
2788 av_freep(&s->programs[i]);
2790 av_freep(&s->programs);
2791 av_freep(&s->priv_data);
2792 while(s->nb_chapters--) {
2793 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2794 av_freep(&s->chapters[s->nb_chapters]);
2796 av_freep(&s->chapters);
2797 av_dict_free(&s->metadata);
2798 av_freep(&s->streams);
2802 #if FF_API_CLOSE_INPUT_FILE
2803 void av_close_input_file(AVFormatContext *s)
2805 avformat_close_input(&s);
2809 void avformat_close_input(AVFormatContext **ps)
2811 AVFormatContext *s = *ps;
2812 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2814 flush_packet_queue(s);
2815 if (s->iformat->read_close)
2816 s->iformat->read_close(s);
2817 avformat_free_context(s);
2823 #if FF_API_NEW_STREAM
2824 AVStream *av_new_stream(AVFormatContext *s, int id)
2826 AVStream *st = avformat_new_stream(s, NULL);
2833 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
2839 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2841 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2844 s->streams = streams;
2846 st = av_mallocz(sizeof(AVStream));
2849 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2854 st->codec = avcodec_alloc_context3(c);
2856 /* no default bitrate if decoding */
2857 st->codec->bit_rate = 0;
2859 st->index = s->nb_streams;
2860 st->start_time = AV_NOPTS_VALUE;
2861 st->duration = AV_NOPTS_VALUE;
2862 /* we set the current DTS to 0 so that formats without any timestamps
2863 but durations get some timestamps, formats with some unknown
2864 timestamps have their first few packets buffered and the
2865 timestamps corrected before they are returned to the user */
2867 st->first_dts = AV_NOPTS_VALUE;
2868 st->probe_packets = MAX_PROBE_PACKETS;
2870 /* default pts setting is MPEG-like */
2871 avpriv_set_pts_info(st, 33, 1, 90000);
2872 st->last_IP_pts = AV_NOPTS_VALUE;
2873 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2874 st->pts_buffer[i]= AV_NOPTS_VALUE;
2875 st->reference_dts = AV_NOPTS_VALUE;
2877 st->sample_aspect_ratio = (AVRational){0,1};
2879 s->streams[s->nb_streams++] = st;
2883 AVProgram *av_new_program(AVFormatContext *ac, int id)
2885 AVProgram *program=NULL;
2888 av_dlog(ac, "new_program: id=0x%04x\n", id);
2890 for(i=0; i<ac->nb_programs; i++)
2891 if(ac->programs[i]->id == id)
2892 program = ac->programs[i];
2895 program = av_mallocz(sizeof(AVProgram));
2898 dynarray_add(&ac->programs, &ac->nb_programs, program);
2899 program->discard = AVDISCARD_NONE;
2906 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2908 AVChapter *chapter = NULL;
2911 for(i=0; i<s->nb_chapters; i++)
2912 if(s->chapters[i]->id == id)
2913 chapter = s->chapters[i];
2916 chapter= av_mallocz(sizeof(AVChapter));
2919 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2921 av_dict_set(&chapter->metadata, "title", title, 0);
2923 chapter->time_base= time_base;
2924 chapter->start = start;
2930 /************************************************************/
2931 /* output media file */
2933 #if FF_API_FORMAT_PARAMETERS
2934 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2936 if (s->oformat->priv_data_size > 0) {
2937 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2939 return AVERROR(ENOMEM);
2940 if (s->oformat->priv_class) {
2941 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2942 av_opt_set_defaults(s->priv_data);
2945 s->priv_data = NULL;
2951 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
2952 const char *format, const char *filename)
2954 AVFormatContext *s = avformat_alloc_context();
2963 oformat = av_guess_format(format, NULL, NULL);
2965 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
2966 ret = AVERROR(EINVAL);
2970 oformat = av_guess_format(NULL, filename, NULL);
2972 ret = AVERROR(EINVAL);
2973 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
2980 s->oformat = oformat;
2981 if (s->oformat->priv_data_size > 0) {
2982 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2985 if (s->oformat->priv_class) {
2986 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2987 av_opt_set_defaults(s->priv_data);
2990 s->priv_data = NULL;
2993 av_strlcpy(s->filename, filename, sizeof(s->filename));
2997 av_log(s, AV_LOG_ERROR, "Out of memory\n");
2998 ret = AVERROR(ENOMEM);
3000 avformat_free_context(s);
3004 #if FF_API_ALLOC_OUTPUT_CONTEXT
3005 AVFormatContext *avformat_alloc_output_context(const char *format,
3006 AVOutputFormat *oformat, const char *filename)
3008 AVFormatContext *avctx;
3009 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
3010 return ret < 0 ? NULL : avctx;
3014 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
3016 const AVCodecTag *avctag;
3018 enum CodecID id = CODEC_ID_NONE;
3019 unsigned int tag = 0;
3022 * Check that tag + id is in the table
3023 * If neither is in the table -> OK
3024 * If tag is in the table with another id -> FAIL
3025 * If id is in the table with another tag -> FAIL unless strict < normal
3027 for (n = 0; s->oformat->codec_tag[n]; n++) {
3028 avctag = s->oformat->codec_tag[n];
3029 while (avctag->id != CODEC_ID_NONE) {
3030 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
3032 if (id == st->codec->codec_id)
3035 if (avctag->id == st->codec->codec_id)
3040 if (id != CODEC_ID_NONE)
3042 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
3047 #if FF_API_FORMAT_PARAMETERS
3048 int av_write_header(AVFormatContext *s)
3050 return avformat_write_header(s, NULL);
3054 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
3058 AVDictionary *tmp = NULL;
3061 av_dict_copy(&tmp, *options, 0);
3062 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
3064 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
3065 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3068 // some sanity checks
3069 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
3070 av_log(s, AV_LOG_ERROR, "no streams\n");
3071 ret = AVERROR(EINVAL);
3075 for(i=0;i<s->nb_streams;i++) {
3078 switch (st->codec->codec_type) {
3079 case AVMEDIA_TYPE_AUDIO:
3080 if(st->codec->sample_rate<=0){
3081 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
3082 ret = AVERROR(EINVAL);
3085 if(!st->codec->block_align)
3086 st->codec->block_align = st->codec->channels *
3087 av_get_bits_per_sample(st->codec->codec_id) >> 3;
3089 case AVMEDIA_TYPE_VIDEO:
3090 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
3091 av_log(s, AV_LOG_ERROR, "time base not set\n");
3092 ret = AVERROR(EINVAL);
3095 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
3096 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
3097 ret = AVERROR(EINVAL);
3100 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
3101 && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
3103 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
3104 ret = AVERROR(EINVAL);
3110 if(s->oformat->codec_tag){
3111 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)){
3112 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
3113 st->codec->codec_tag= 0;
3115 if(st->codec->codec_tag){
3116 if (!validate_codec_tag(s, st)) {
3118 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
3119 av_log(s, AV_LOG_ERROR,
3120 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
3121 tagbuf, st->codec->codec_tag, st->codec->codec_id);
3122 ret = AVERROR_INVALIDDATA;
3126 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3129 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3130 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3131 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3134 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3135 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3136 if (!s->priv_data) {
3137 ret = AVERROR(ENOMEM);
3140 if (s->oformat->priv_class) {
3141 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3142 av_opt_set_defaults(s->priv_data);
3143 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3148 /* set muxer identification string */
3149 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3150 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3153 if(s->oformat->write_header){
3154 ret = s->oformat->write_header(s);
3159 /* init PTS generation */
3160 for(i=0;i<s->nb_streams;i++) {
3161 int64_t den = AV_NOPTS_VALUE;
3164 switch (st->codec->codec_type) {
3165 case AVMEDIA_TYPE_AUDIO:
3166 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3168 case AVMEDIA_TYPE_VIDEO:
3169 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3174 if (den != AV_NOPTS_VALUE) {
3176 ret = AVERROR_INVALIDDATA;
3179 frac_init(&st->pts, 0, 0, den);
3184 av_dict_free(options);
3193 //FIXME merge with compute_pkt_fields
3194 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3195 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3196 int num, den, frame_size, i;
3198 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3199 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3201 /* duration field */
3202 if (pkt->duration == 0) {
3203 compute_frame_duration(&num, &den, st, NULL, pkt);
3205 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3209 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3212 //XXX/FIXME this is a temporary hack until all encoders output pts
3213 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3215 // pkt->pts= st->cur_dts;
3216 pkt->pts= st->pts.val;
3219 //calculate dts from pts
3220 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3221 st->pts_buffer[0]= pkt->pts;
3222 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3223 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3224 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3225 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3227 pkt->dts= st->pts_buffer[0];
3230 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)){
3231 av_log(s, AV_LOG_ERROR,
3232 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3233 st->index, st->cur_dts, pkt->dts);
3234 return AVERROR(EINVAL);
3236 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3237 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3238 return AVERROR(EINVAL);
3241 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3242 st->cur_dts= pkt->dts;
3243 st->pts.val= pkt->dts;
3246 switch (st->codec->codec_type) {
3247 case AVMEDIA_TYPE_AUDIO:
3248 frame_size = get_audio_frame_size(st->codec, pkt->size);
3250 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3251 likely equal to the encoder delay, but it would be better if we
3252 had the real timestamps from the encoder */
3253 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3254 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3257 case AVMEDIA_TYPE_VIDEO:
3258 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3266 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3268 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3270 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3273 ret= s->oformat->write_packet(s, pkt);
3276 s->streams[pkt->stream_index]->nb_frames++;
3280 #define CHUNK_START 0x1000
3282 int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3283 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3285 AVPacketList **next_point, *this_pktl;
3286 AVStream *st= s->streams[pkt->stream_index];
3287 int chunked= s->max_chunk_size || s->max_chunk_duration;
3289 this_pktl = av_mallocz(sizeof(AVPacketList));
3291 return AVERROR(ENOMEM);
3292 this_pktl->pkt= *pkt;
3293 pkt->destruct= NULL; // do not free original but only the copy
3294 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3296 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3297 next_point = &(st->last_in_packet_buffer->next);
3299 next_point = &s->packet_buffer;
3304 uint64_t max= av_rescale_q(s->max_chunk_duration, AV_TIME_BASE_Q, st->time_base);
3305 if( st->interleaver_chunk_size + pkt->size <= s->max_chunk_size-1U
3306 && st->interleaver_chunk_duration + pkt->duration <= max-1U){
3307 st->interleaver_chunk_size += pkt->size;
3308 st->interleaver_chunk_duration += pkt->duration;
3311 st->interleaver_chunk_size =
3312 st->interleaver_chunk_duration = 0;
3313 this_pktl->pkt.flags |= CHUNK_START;
3317 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3319 && ((chunked && !((*next_point)->pkt.flags&CHUNK_START))
3320 || !compare(s, &(*next_point)->pkt, pkt))){
3321 next_point= &(*next_point)->next;
3326 next_point = &(s->packet_buffer_end->next);
3329 assert(!*next_point);
3331 s->packet_buffer_end= this_pktl;
3334 this_pktl->next= *next_point;
3336 s->streams[pkt->stream_index]->last_in_packet_buffer=
3337 *next_point= this_pktl;
3341 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3343 AVStream *st = s->streams[ pkt ->stream_index];
3344 AVStream *st2= s->streams[ next->stream_index];
3345 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3347 if(s->audio_preload && ((st->codec->codec_type == AVMEDIA_TYPE_AUDIO) != (st2->codec->codec_type == AVMEDIA_TYPE_AUDIO))){
3348 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);
3349 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);
3351 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
3352 -( 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;
3355 comp= (ts>ts2) - (ts<ts2);
3359 return pkt->stream_index < next->stream_index;
3363 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3365 int stream_count=0, noninterleaved_count=0;
3366 int64_t delta_dts_max = 0;
3370 ret = ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3375 for(i=0; i < s->nb_streams; i++) {
3376 if (s->streams[i]->last_in_packet_buffer) {
3378 } else if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3379 ++noninterleaved_count;
3383 if (s->nb_streams == stream_count) {
3386 for(i=0; i < s->nb_streams; i++) {
3387 if (s->streams[i]->last_in_packet_buffer) {
3389 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
3390 s->streams[i]->time_base,
3392 av_rescale_q(s->packet_buffer->pkt.dts,
3393 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
3395 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
3398 if(s->nb_streams == stream_count+noninterleaved_count &&
3399 delta_dts_max > 20*AV_TIME_BASE) {
3400 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
3404 if(stream_count && flush){
3405 pktl= s->packet_buffer;
3408 s->packet_buffer= pktl->next;
3409 if(!s->packet_buffer)
3410 s->packet_buffer_end= NULL;
3412 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3413 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3417 av_init_packet(out);
3423 * Interleave an AVPacket correctly so it can be muxed.
3424 * @param out the interleaved packet will be output here
3425 * @param in the input packet
3426 * @param flush 1 if no further packets are available as input and all
3427 * remaining packets should be output
3428 * @return 1 if a packet was output, 0 if no packet could be output,
3429 * < 0 if an error occurred
3431 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3432 if(s->oformat->interleave_packet)
3433 return s->oformat->interleave_packet(s, out, in, flush);
3435 return av_interleave_packet_per_dts(s, out, in, flush);
3438 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3439 AVStream *st= s->streams[ pkt->stream_index];
3442 //FIXME/XXX/HACK drop zero sized packets
3443 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3446 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3447 pkt->size, pkt->dts, pkt->pts);
3448 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3451 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3452 return AVERROR(EINVAL);
3456 int ret= interleave_packet(s, &opkt, pkt, 0);
3457 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3460 ret= s->oformat->write_packet(s, &opkt);
3462 s->streams[opkt.stream_index]->nb_frames++;
3464 av_free_packet(&opkt);
3469 if(s->pb && s->pb->error)
3470 return s->pb->error;
3474 int av_write_trailer(AVFormatContext *s)
3480 ret= interleave_packet(s, &pkt, NULL, 1);
3481 if(ret<0) //FIXME cleanup needed for ret<0 ?
3486 ret= s->oformat->write_packet(s, &pkt);
3488 s->streams[pkt.stream_index]->nb_frames++;
3490 av_free_packet(&pkt);
3494 if(s->pb && s->pb->error)
3498 if(s->oformat->write_trailer)
3499 ret = s->oformat->write_trailer(s);
3502 ret = s->pb ? s->pb->error : 0;
3503 for(i=0;i<s->nb_streams;i++) {
3504 av_freep(&s->streams[i]->priv_data);
3505 av_freep(&s->streams[i]->index_entries);
3507 if (s->iformat && s->iformat->priv_class)
3508 av_opt_free(s->priv_data);
3509 av_freep(&s->priv_data);
3513 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
3514 int64_t *dts, int64_t *wall)
3516 if (!s->oformat || !s->oformat->get_output_timestamp)
3517 return AVERROR(ENOSYS);
3518 s->oformat->get_output_timestamp(s, stream, dts, wall);
3522 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3525 AVProgram *program=NULL;
3528 if (idx >= ac->nb_streams) {
3529 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3533 for(i=0; i<ac->nb_programs; i++){
3534 if(ac->programs[i]->id != progid)
3536 program = ac->programs[i];
3537 for(j=0; j<program->nb_stream_indexes; j++)
3538 if(program->stream_index[j] == idx)
3541 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3544 program->stream_index = tmp;
3545 program->stream_index[program->nb_stream_indexes++] = idx;
3550 static void print_fps(double d, const char *postfix){
3551 uint64_t v= lrintf(d*100);
3552 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3553 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3554 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3557 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3559 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3560 AVDictionaryEntry *tag=NULL;
3562 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3563 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3564 if(strcmp("language", tag->key)){
3567 av_strlcpy(tmp, tag->value, sizeof(tmp));
3568 for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
3569 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tmp);
3575 /* "user interface" functions */
3576 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3579 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3580 AVStream *st = ic->streams[i];
3581 int g = av_gcd(st->time_base.num, st->time_base.den);
3582 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3583 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3584 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
3585 /* the pid is an important information, so we display it */
3586 /* XXX: add a generic system */
3587 if (flags & AVFMT_SHOW_IDS)
3588 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3590 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3591 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3592 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3593 if (st->sample_aspect_ratio.num && // default
3594 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3595 AVRational display_aspect_ratio;
3596 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3597 st->codec->width*st->sample_aspect_ratio.num,
3598 st->codec->height*st->sample_aspect_ratio.den,
3600 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3601 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3602 display_aspect_ratio.num, display_aspect_ratio.den);
3604 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3605 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3606 print_fps(av_q2d(st->avg_frame_rate), "fps");
3607 if(st->r_frame_rate.den && st->r_frame_rate.num)
3608 print_fps(av_q2d(st->r_frame_rate), "tbr");
3609 if(st->time_base.den && st->time_base.num)
3610 print_fps(1/av_q2d(st->time_base), "tbn");
3611 if(st->codec->time_base.den && st->codec->time_base.num)
3612 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3614 if (st->disposition & AV_DISPOSITION_DEFAULT)
3615 av_log(NULL, AV_LOG_INFO, " (default)");
3616 if (st->disposition & AV_DISPOSITION_DUB)
3617 av_log(NULL, AV_LOG_INFO, " (dub)");
3618 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3619 av_log(NULL, AV_LOG_INFO, " (original)");
3620 if (st->disposition & AV_DISPOSITION_COMMENT)
3621 av_log(NULL, AV_LOG_INFO, " (comment)");
3622 if (st->disposition & AV_DISPOSITION_LYRICS)
3623 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3624 if (st->disposition & AV_DISPOSITION_KARAOKE)
3625 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3626 if (st->disposition & AV_DISPOSITION_FORCED)
3627 av_log(NULL, AV_LOG_INFO, " (forced)");
3628 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3629 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3630 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3631 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3632 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3633 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3634 av_log(NULL, AV_LOG_INFO, "\n");
3635 dump_metadata(NULL, st->metadata, " ");
3638 #if FF_API_DUMP_FORMAT
3639 void dump_format(AVFormatContext *ic,
3644 av_dump_format(ic, index, url, is_output);
3648 void av_dump_format(AVFormatContext *ic,
3654 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3655 if (ic->nb_streams && !printed)
3658 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3659 is_output ? "Output" : "Input",
3661 is_output ? ic->oformat->name : ic->iformat->name,
3662 is_output ? "to" : "from", url);
3663 dump_metadata(NULL, ic->metadata, " ");
3665 av_log(NULL, AV_LOG_INFO, " Duration: ");
3666 if (ic->duration != AV_NOPTS_VALUE) {
3667 int hours, mins, secs, us;
3668 secs = ic->duration / AV_TIME_BASE;
3669 us = ic->duration % AV_TIME_BASE;
3674 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3675 (100 * us) / AV_TIME_BASE);
3677 av_log(NULL, AV_LOG_INFO, "N/A");
3679 if (ic->start_time != AV_NOPTS_VALUE) {
3681 av_log(NULL, AV_LOG_INFO, ", start: ");
3682 secs = ic->start_time / AV_TIME_BASE;
3683 us = abs(ic->start_time % AV_TIME_BASE);
3684 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3685 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3687 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3689 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3691 av_log(NULL, AV_LOG_INFO, "N/A");
3693 av_log(NULL, AV_LOG_INFO, "\n");
3695 for (i = 0; i < ic->nb_chapters; i++) {
3696 AVChapter *ch = ic->chapters[i];
3697 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3698 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3699 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3701 dump_metadata(NULL, ch->metadata, " ");
3703 if(ic->nb_programs) {
3704 int j, k, total = 0;
3705 for(j=0; j<ic->nb_programs; j++) {
3706 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3708 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3709 name ? name->value : "");
3710 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3711 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3712 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3713 printed[ic->programs[j]->stream_index[k]] = 1;
3715 total += ic->programs[j]->nb_stream_indexes;
3717 if (total < ic->nb_streams)
3718 av_log(NULL, AV_LOG_INFO, " No Program\n");
3720 for(i=0;i<ic->nb_streams;i++)
3722 dump_stream_format(ic, i, index, is_output);
3727 int64_t av_gettime(void)
3730 gettimeofday(&tv,NULL);
3731 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3734 uint64_t ff_ntp_time(void)
3736 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3739 #if FF_API_PARSE_DATE
3740 #include "libavutil/parseutils.h"
3742 int64_t parse_date(const char *timestr, int duration)
3745 av_parse_time(&timeval, timestr, duration);
3750 #if FF_API_FIND_INFO_TAG
3751 #include "libavutil/parseutils.h"
3753 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3755 return av_find_info_tag(arg, arg_size, tag1, info);
3759 int av_get_frame_filename(char *buf, int buf_size,
3760 const char *path, int number)
3763 char *q, buf1[20], c;
3764 int nd, len, percentd_found;
3776 while (isdigit(*p)) {
3777 nd = nd * 10 + *p++ - '0';
3780 } while (isdigit(c));
3789 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3791 if ((q - buf + len) > buf_size - 1)
3793 memcpy(q, buf1, len);
3801 if ((q - buf) < buf_size - 1)
3805 if (!percentd_found)
3814 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3818 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3820 for(i=0;i<size;i+=16) {
3827 PRINT(" %02x", buf[i+j]);
3832 for(j=0;j<len;j++) {
3834 if (c < ' ' || c > '~')
3843 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3845 hex_dump_internal(NULL, f, 0, buf, size);
3848 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3850 hex_dump_internal(avcl, NULL, level, buf, size);
3853 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3856 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3857 PRINT("stream #%d:\n", pkt->stream_index);
3858 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3859 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3860 /* DTS is _always_ valid after av_read_frame() */
3862 if (pkt->dts == AV_NOPTS_VALUE)
3865 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3866 /* PTS may not be known if B-frames are present. */
3868 if (pkt->pts == AV_NOPTS_VALUE)
3871 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3873 PRINT(" size=%d\n", pkt->size);
3876 av_hex_dump(f, pkt->data, pkt->size);
3880 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3882 AVRational tb = { 1, AV_TIME_BASE };
3883 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3887 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3889 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3893 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3895 AVRational tb = { 1, AV_TIME_BASE };
3896 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3900 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3903 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3906 void av_url_split(char *proto, int proto_size,
3907 char *authorization, int authorization_size,
3908 char *hostname, int hostname_size,
3910 char *path, int path_size,
3913 const char *p, *ls, *at, *col, *brk;
3915 if (port_ptr) *port_ptr = -1;
3916 if (proto_size > 0) proto[0] = 0;
3917 if (authorization_size > 0) authorization[0] = 0;
3918 if (hostname_size > 0) hostname[0] = 0;
3919 if (path_size > 0) path[0] = 0;
3921 /* parse protocol */
3922 if ((p = strchr(url, ':'))) {
3923 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3928 /* no protocol means plain filename */
3929 av_strlcpy(path, url, path_size);
3933 /* separate path from hostname */
3934 ls = strchr(p, '/');
3936 ls = strchr(p, '?');
3938 av_strlcpy(path, ls, path_size);
3940 ls = &p[strlen(p)]; // XXX
3942 /* the rest is hostname, use that to parse auth/port */
3944 /* authorization (user[:pass]@hostname) */
3945 if ((at = strchr(p, '@')) && at < ls) {
3946 av_strlcpy(authorization, p,
3947 FFMIN(authorization_size, at + 1 - p));
3948 p = at + 1; /* skip '@' */
3951 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3953 av_strlcpy(hostname, p + 1,
3954 FFMIN(hostname_size, brk - p));
3955 if (brk[1] == ':' && port_ptr)
3956 *port_ptr = atoi(brk + 2);
3957 } else if ((col = strchr(p, ':')) && col < ls) {
3958 av_strlcpy(hostname, p,
3959 FFMIN(col + 1 - p, hostname_size));
3960 if (port_ptr) *port_ptr = atoi(col + 1);
3962 av_strlcpy(hostname, p,
3963 FFMIN(ls + 1 - p, hostname_size));
3967 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3970 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3973 'C', 'D', 'E', 'F' };
3974 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3977 'c', 'd', 'e', 'f' };
3978 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3980 for(i = 0; i < s; i++) {
3981 buff[i * 2] = hex_table[src[i] >> 4];
3982 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3988 int ff_hex_to_data(uint8_t *data, const char *p)
3995 p += strspn(p, SPACE_CHARS);
3998 c = toupper((unsigned char) *p++);
3999 if (c >= '0' && c <= '9')
4001 else if (c >= 'A' && c <= 'F')
4016 #if FF_API_SET_PTS_INFO
4017 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
4018 unsigned int pts_num, unsigned int pts_den)
4020 avpriv_set_pts_info(s, pts_wrap_bits, pts_num, pts_den);
4024 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4025 unsigned int pts_num, unsigned int pts_den)
4028 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
4029 if(new_tb.num != pts_num)
4030 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
4032 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
4034 if(new_tb.num <= 0 || new_tb.den <= 0) {
4035 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
4038 s->time_base = new_tb;
4039 s->pts_wrap_bits = pts_wrap_bits;
4042 int ff_url_join(char *str, int size, const char *proto,
4043 const char *authorization, const char *hostname,
4044 int port, const char *fmt, ...)
4047 struct addrinfo hints, *ai;
4052 av_strlcatf(str, size, "%s://", proto);
4053 if (authorization && authorization[0])
4054 av_strlcatf(str, size, "%s@", authorization);
4055 #if CONFIG_NETWORK && defined(AF_INET6)
4056 /* Determine if hostname is a numerical IPv6 address,
4057 * properly escape it within [] in that case. */
4058 memset(&hints, 0, sizeof(hints));
4059 hints.ai_flags = AI_NUMERICHOST;
4060 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
4061 if (ai->ai_family == AF_INET6) {
4062 av_strlcat(str, "[", size);
4063 av_strlcat(str, hostname, size);
4064 av_strlcat(str, "]", size);
4066 av_strlcat(str, hostname, size);
4071 /* Not an IPv6 address, just output the plain string. */
4072 av_strlcat(str, hostname, size);
4075 av_strlcatf(str, size, ":%d", port);
4078 int len = strlen(str);
4081 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
4087 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
4088 AVFormatContext *src)
4093 local_pkt.stream_index = dst_stream;
4094 if (pkt->pts != AV_NOPTS_VALUE)
4095 local_pkt.pts = av_rescale_q(pkt->pts,
4096 src->streams[pkt->stream_index]->time_base,
4097 dst->streams[dst_stream]->time_base);
4098 if (pkt->dts != AV_NOPTS_VALUE)
4099 local_pkt.dts = av_rescale_q(pkt->dts,
4100 src->streams[pkt->stream_index]->time_base,
4101 dst->streams[dst_stream]->time_base);
4102 return av_write_frame(dst, &local_pkt);
4105 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4108 const char *ptr = str;
4110 /* Parse key=value pairs. */
4113 char *dest = NULL, *dest_end;
4114 int key_len, dest_len = 0;
4116 /* Skip whitespace and potential commas. */
4117 while (*ptr && (isspace(*ptr) || *ptr == ','))
4124 if (!(ptr = strchr(key, '=')))
4127 key_len = ptr - key;
4129 callback_get_buf(context, key, key_len, &dest, &dest_len);
4130 dest_end = dest + dest_len - 1;
4134 while (*ptr && *ptr != '\"') {
4138 if (dest && dest < dest_end)
4142 if (dest && dest < dest_end)
4150 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
4151 if (dest && dest < dest_end)
4159 int ff_find_stream_index(AVFormatContext *s, int id)
4162 for (i = 0; i < s->nb_streams; i++) {
4163 if (s->streams[i]->id == id)
4169 void ff_make_absolute_url(char *buf, int size, const char *base,
4173 /* Absolute path, relative to the current server */
4174 if (base && strstr(base, "://") && rel[0] == '/') {
4176 av_strlcpy(buf, base, size);
4177 sep = strstr(buf, "://");
4180 sep = strchr(sep, '/');
4184 av_strlcat(buf, rel, size);
4187 /* If rel actually is an absolute url, just copy it */
4188 if (!base || strstr(rel, "://") || rel[0] == '/') {
4189 av_strlcpy(buf, rel, size);
4193 av_strlcpy(buf, base, size);
4194 /* Remove the file name from the base url */
4195 sep = strrchr(buf, '/');
4200 while (av_strstart(rel, "../", NULL) && sep) {
4201 /* Remove the path delimiter at the end */
4203 sep = strrchr(buf, '/');
4204 /* If the next directory name to pop off is "..", break here */
4205 if (!strcmp(sep ? &sep[1] : buf, "..")) {
4206 /* Readd the slash we just removed */
4207 av_strlcat(buf, "/", size);
4210 /* Cut off the directory name */
4217 av_strlcat(buf, rel, size);
4220 int64_t ff_iso8601_to_unix_time(const char *datestr)
4223 struct tm time1 = {0}, time2 = {0};
4225 ret1 = strptime(datestr, "%Y - %m - %d %T", &time1);
4226 ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2);
4228 return av_timegm(&time2);
4230 return av_timegm(&time1);
4232 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
4233 "the date string.\n");
4238 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
4241 if (ofmt->query_codec)
4242 return ofmt->query_codec(codec_id, std_compliance);
4243 else if (ofmt->codec_tag)
4244 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4245 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4246 codec_id == ofmt->subtitle_codec)
4249 return AVERROR_PATCHWELCOME;
4252 int avformat_network_init(void)
4256 ff_network_inited_globally = 1;
4257 if ((ret = ff_network_init()) < 0)
4264 int avformat_network_deinit(void)