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"
37 #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 (!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 (!strncasecmp(name, names, len))
198 return !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, 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;
323 while ((fmt1 = av_iformat_next(fmt1))) {
324 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
327 if (fmt1->read_probe) {
328 score = fmt1->read_probe(&lpd);
329 if(!score && fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
331 } else if (fmt1->extensions) {
332 if (av_match_ext(lpd.filename, fmt1->extensions)) {
336 if (score > score_max) {
339 }else if (score == score_max)
342 *score_ret= score_max;
346 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
349 AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
350 if(score_ret > *score_max){
351 *score_max= score_ret;
357 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
359 return av_probe_input_format2(pd, is_opened, &score);
362 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
364 static const struct {
365 const char *name; enum CodecID id; enum AVMediaType type;
367 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
368 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
369 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
370 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
371 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
372 { "loas" , CODEC_ID_AAC_LATM , AVMEDIA_TYPE_AUDIO },
373 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
374 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
375 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
379 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
383 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
384 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
385 for (i = 0; fmt_id_type[i].name; i++) {
386 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
387 st->codec->codec_id = fmt_id_type[i].id;
388 st->codec->codec_type = fmt_id_type[i].type;
396 /************************************************************/
397 /* input media file */
399 #if FF_API_FORMAT_PARAMETERS
400 static AVDictionary *convert_format_parameters(AVFormatParameters *ap)
403 AVDictionary *opts = NULL;
408 AV_NOWARN_DEPRECATED(
409 if (ap->time_base.num) {
410 snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
411 av_dict_set(&opts, "framerate", buf, 0);
413 if (ap->sample_rate) {
414 snprintf(buf, sizeof(buf), "%d", ap->sample_rate);
415 av_dict_set(&opts, "sample_rate", buf, 0);
418 snprintf(buf, sizeof(buf), "%d", ap->channels);
419 av_dict_set(&opts, "channels", buf, 0);
421 if (ap->width || ap->height) {
422 snprintf(buf, sizeof(buf), "%dx%d", ap->width, ap->height);
423 av_dict_set(&opts, "video_size", buf, 0);
425 if (ap->pix_fmt != PIX_FMT_NONE) {
426 av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(ap->pix_fmt), 0);
429 snprintf(buf, sizeof(buf), "%d", ap->channel);
430 av_dict_set(&opts, "channel", buf, 0);
433 av_dict_set(&opts, "standard", ap->standard, 0);
435 if (ap->mpeg2ts_compute_pcr) {
436 av_dict_set(&opts, "mpeg2ts_compute_pcr", "1", 0);
438 if (ap->initial_pause) {
439 av_dict_set(&opts, "initial_pause", "1", 0);
446 * Open a media file from an IO stream. 'fmt' must be specified.
448 int av_open_input_stream(AVFormatContext **ic_ptr,
449 AVIOContext *pb, const char *filename,
450 AVInputFormat *fmt, AVFormatParameters *ap)
455 AVFormatParameters default_ap;
459 memset(ap, 0, sizeof(default_ap));
461 opts = convert_format_parameters(ap);
463 AV_NOWARN_DEPRECATED(
464 if(!ap->prealloced_context)
465 *ic_ptr = ic = avformat_alloc_context();
470 err = AVERROR(ENOMEM);
473 if (pb && fmt && fmt->flags & AVFMT_NOFILE)
474 av_log(ic, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
475 "will be ignored with AVFMT_NOFILE format.\n");
479 if ((err = avformat_open_input(&ic, filename, fmt, &opts)) < 0)
481 ic->pb = ic->pb ? ic->pb : pb; // don't leak custom pb if it wasn't set above
490 int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap){
493 if (ic->iformat->read_header) {
494 err = ic->iformat->read_header(ic, ap);
499 if (ic->pb && !ic->data_offset)
500 ic->data_offset = avio_tell(ic->pb);
506 /** size of probe buffer, for guessing file type from file contents */
507 #define PROBE_BUF_MIN 2048
508 #define PROBE_BUF_MAX (1<<20)
510 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
511 const char *filename, void *logctx,
512 unsigned int offset, unsigned int max_probe_size)
514 AVProbeData pd = { filename ? filename : "", NULL, -offset };
515 unsigned char *buf = NULL;
516 int ret = 0, probe_size;
518 if (!max_probe_size) {
519 max_probe_size = PROBE_BUF_MAX;
520 } else if (max_probe_size > PROBE_BUF_MAX) {
521 max_probe_size = PROBE_BUF_MAX;
522 } else if (max_probe_size < PROBE_BUF_MIN) {
523 return AVERROR(EINVAL);
526 if (offset >= max_probe_size) {
527 return AVERROR(EINVAL);
530 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
531 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
532 int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
533 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
536 if (probe_size < offset) {
540 /* read probe data */
541 buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
544 return AVERROR(ENOMEM);
547 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
548 /* fail if error was not end of file, otherwise, lower score */
549 if (ret != AVERROR_EOF) {
554 ret = 0; /* error was end of file, nothing read */
557 pd.buf = &buf[offset];
559 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
561 /* guess file format */
562 *fmt = av_probe_input_format2(&pd, 1, &score);
564 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
565 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
567 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
573 return AVERROR_INVALIDDATA;
576 /* rewind. reuse probe buffer to avoid seeking */
577 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
583 #if FF_API_FORMAT_PARAMETERS
584 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
587 AVFormatParameters *ap)
590 AVDictionary *opts = convert_format_parameters(ap);
592 AV_NOWARN_DEPRECATED(
593 if (!ap || !ap->prealloced_context)
597 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
604 /* open input file and probe the format if necessary */
605 static int init_input(AVFormatContext *s, const char *filename)
608 AVProbeData pd = {filename, NULL, 0};
611 s->flags |= AVFMT_FLAG_CUSTOM_IO;
613 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
614 else if (s->iformat->flags & AVFMT_NOFILE)
615 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
616 "will be ignored with AVFMT_NOFILE format.\n");
620 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
621 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
624 if ((ret = avio_open(&s->pb, filename, AVIO_FLAG_READ)) < 0)
628 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
631 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
633 AVFormatContext *s = *ps;
635 AVFormatParameters ap = { { 0 } };
636 AVDictionary *tmp = NULL;
638 if (!s && !(s = avformat_alloc_context()))
639 return AVERROR(ENOMEM);
644 av_dict_copy(&tmp, *options, 0);
646 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
649 if ((ret = init_input(s, filename)) < 0)
652 /* check filename in case an image number is expected */
653 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
654 if (!av_filename_number_test(filename)) {
655 ret = AVERROR(EINVAL);
660 s->duration = s->start_time = AV_NOPTS_VALUE;
661 av_strlcpy(s->filename, filename, sizeof(s->filename));
663 /* allocate private data */
664 if (s->iformat->priv_data_size > 0) {
665 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
666 ret = AVERROR(ENOMEM);
669 if (s->iformat->priv_class) {
670 *(const AVClass**)s->priv_data = s->iformat->priv_class;
671 av_opt_set_defaults(s->priv_data);
672 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
677 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
679 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
681 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
682 if ((ret = s->iformat->read_header(s, &ap)) < 0)
685 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
686 s->data_offset = avio_tell(s->pb);
688 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
691 av_dict_free(options);
699 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
701 avformat_free_context(s);
706 /*******************************************************/
708 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
709 AVPacketList **plast_pktl){
710 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
715 (*plast_pktl)->next = pktl;
717 *packet_buffer = pktl;
719 /* add the packet in the buffered packet list */
725 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
731 AVPacketList *pktl = s->raw_packet_buffer;
735 if(s->streams[pkt->stream_index]->request_probe <= 0){
736 s->raw_packet_buffer = pktl->next;
737 s->raw_packet_buffer_remaining_size += pkt->size;
744 ret= s->iformat->read_packet(s, pkt);
746 if (!pktl || ret == AVERROR(EAGAIN))
748 for (i = 0; i < s->nb_streams; i++)
749 if(s->streams[i]->request_probe > 0)
750 s->streams[i]->request_probe = -1;
754 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
755 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
756 av_log(s, AV_LOG_WARNING,
757 "Dropped corrupted packet (stream = %d)\n",
762 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
763 av_packet_merge_side_data(pkt);
765 st= s->streams[pkt->stream_index];
767 switch(st->codec->codec_type){
768 case AVMEDIA_TYPE_VIDEO:
769 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
771 case AVMEDIA_TYPE_AUDIO:
772 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
774 case AVMEDIA_TYPE_SUBTITLE:
775 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
779 if(!pktl && st->request_probe <= 0)
782 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
783 s->raw_packet_buffer_remaining_size -= pkt->size;
785 if(st->request_probe>0){
786 AVProbeData *pd = &st->probe_data;
788 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
791 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
792 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
793 pd->buf_size += pkt->size;
794 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
796 end= s->raw_packet_buffer_remaining_size <= 0
797 || st->probe_packets<=0;
799 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
800 int score= set_codec_from_probe_data(s, st, pd);
801 if( (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
805 st->request_probe= -1;
806 if(st->codec->codec_id != CODEC_ID_NONE){
807 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
809 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
816 /**********************************************************/
819 * Get the number of samples of an audio frame. Return -1 on error.
821 static int get_audio_frame_size(AVCodecContext *enc, int size)
825 if(enc->codec_id == CODEC_ID_VORBIS)
828 if (enc->frame_size <= 1) {
829 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
831 if (bits_per_sample) {
832 if (enc->channels == 0)
834 frame_size = (size << 3) / (bits_per_sample * enc->channels);
836 /* used for example by ADPCM codecs */
837 if (enc->bit_rate == 0)
839 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
842 frame_size = enc->frame_size;
849 * Return the frame duration in seconds. Return 0 if not available.
851 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
852 AVCodecParserContext *pc, AVPacket *pkt)
858 switch(st->codec->codec_type) {
859 case AVMEDIA_TYPE_VIDEO:
860 if(st->time_base.num*1000LL > st->time_base.den){
861 *pnum = st->time_base.num;
862 *pden = st->time_base.den;
863 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
864 *pnum = st->codec->time_base.num;
865 *pden = st->codec->time_base.den;
866 if (pc && pc->repeat_pict) {
867 *pnum = (*pnum) * (1 + pc->repeat_pict);
869 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
870 //Thus if we have no parser in such case leave duration undefined.
871 if(st->codec->ticks_per_frame>1 && !pc){
876 case AVMEDIA_TYPE_AUDIO:
877 frame_size = get_audio_frame_size(st->codec, pkt->size);
878 if (frame_size <= 0 || st->codec->sample_rate <= 0)
881 *pden = st->codec->sample_rate;
888 static int is_intra_only(AVCodecContext *enc){
889 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
891 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
892 switch(enc->codec_id){
894 case CODEC_ID_MJPEGB:
896 case CODEC_ID_PRORES:
897 case CODEC_ID_RAWVIDEO:
898 case CODEC_ID_DVVIDEO:
899 case CODEC_ID_HUFFYUV:
900 case CODEC_ID_FFVHUFF:
905 case CODEC_ID_JPEG2000:
913 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
914 int64_t dts, int64_t pts)
916 AVStream *st= s->streams[stream_index];
917 AVPacketList *pktl= s->packet_buffer;
919 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
922 st->first_dts= dts - st->cur_dts;
925 for(; pktl; pktl= pktl->next){
926 if(pktl->pkt.stream_index != stream_index)
928 //FIXME think more about this check
929 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
930 pktl->pkt.pts += st->first_dts;
932 if(pktl->pkt.dts != AV_NOPTS_VALUE)
933 pktl->pkt.dts += st->first_dts;
935 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
936 st->start_time= pktl->pkt.pts;
938 if (st->start_time == AV_NOPTS_VALUE)
939 st->start_time = pts;
942 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
944 AVPacketList *pktl= s->packet_buffer;
947 if(st->first_dts != AV_NOPTS_VALUE){
948 cur_dts= st->first_dts;
949 for(; pktl; pktl= pktl->next){
950 if(pktl->pkt.stream_index == pkt->stream_index){
951 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
953 cur_dts -= pkt->duration;
956 pktl= s->packet_buffer;
957 st->first_dts = cur_dts;
958 }else if(st->cur_dts)
961 for(; pktl; pktl= pktl->next){
962 if(pktl->pkt.stream_index != pkt->stream_index)
964 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
965 && !pktl->pkt.duration){
966 pktl->pkt.dts= cur_dts;
967 if(!st->codec->has_b_frames)
968 pktl->pkt.pts= cur_dts;
969 cur_dts += pkt->duration;
970 pktl->pkt.duration= pkt->duration;
974 if(st->first_dts == AV_NOPTS_VALUE)
975 st->cur_dts= cur_dts;
978 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
979 AVCodecParserContext *pc, AVPacket *pkt)
981 int num, den, presentation_delayed, delay, i;
984 if (s->flags & AVFMT_FLAG_NOFILLIN)
987 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
988 pkt->dts= AV_NOPTS_VALUE;
990 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
991 //FIXME Set low_delay = 0 when has_b_frames = 1
992 st->codec->has_b_frames = 1;
994 /* do we have a video B-frame ? */
995 delay= st->codec->has_b_frames;
996 presentation_delayed = 0;
998 // ignore delay caused by frame threading so that the mpeg2-without-dts
999 // warning will not trigger
1000 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
1001 delay -= st->codec->thread_count-1;
1003 /* XXX: need has_b_frame, but cannot get it if the codec is
1006 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1007 presentation_delayed = 1;
1009 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){
1010 pkt->dts -= 1LL<<st->pts_wrap_bits;
1013 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
1014 // we take the conservative approach and discard both
1015 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
1016 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
1017 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1018 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
1021 if (pkt->duration == 0) {
1022 compute_frame_duration(&num, &den, st, pc, pkt);
1024 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1026 if(pkt->duration != 0 && s->packet_buffer)
1027 update_initial_durations(s, st, pkt);
1031 /* correct timestamps with byte offset if demuxers only have timestamps
1032 on packet boundaries */
1033 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1034 /* this will estimate bitrate based on this frame's duration and size */
1035 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1036 if(pkt->pts != AV_NOPTS_VALUE)
1038 if(pkt->dts != AV_NOPTS_VALUE)
1042 if (pc && pc->dts_sync_point >= 0) {
1043 // we have synchronization info from the parser
1044 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1046 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1047 if (pkt->dts != AV_NOPTS_VALUE) {
1048 // got DTS from the stream, update reference timestamp
1049 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1050 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1051 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1052 // compute DTS based on reference timestamp
1053 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1054 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1056 if (pc->dts_sync_point > 0)
1057 st->reference_dts = pkt->dts; // new reference
1061 /* This may be redundant, but it should not hurt. */
1062 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1063 presentation_delayed = 1;
1065 // 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);
1066 /* interpolate PTS and DTS if they are not present */
1067 //We skip H264 currently because delay and has_b_frames are not reliably set
1068 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1069 if (presentation_delayed) {
1070 /* DTS = decompression timestamp */
1071 /* PTS = presentation timestamp */
1072 if (pkt->dts == AV_NOPTS_VALUE)
1073 pkt->dts = st->last_IP_pts;
1074 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1075 if (pkt->dts == AV_NOPTS_VALUE)
1076 pkt->dts = st->cur_dts;
1078 /* this is tricky: the dts must be incremented by the duration
1079 of the frame we are displaying, i.e. the last I- or P-frame */
1080 if (st->last_IP_duration == 0)
1081 st->last_IP_duration = pkt->duration;
1082 if(pkt->dts != AV_NOPTS_VALUE)
1083 st->cur_dts = pkt->dts + st->last_IP_duration;
1084 st->last_IP_duration = pkt->duration;
1085 st->last_IP_pts= pkt->pts;
1086 /* cannot compute PTS if not present (we can compute it only
1087 by knowing the future */
1088 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1089 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1090 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1091 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1092 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1093 pkt->pts += pkt->duration;
1094 // 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);
1098 /* presentation is not delayed : PTS and DTS are the same */
1099 if(pkt->pts == AV_NOPTS_VALUE)
1100 pkt->pts = pkt->dts;
1101 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1102 if(pkt->pts == AV_NOPTS_VALUE)
1103 pkt->pts = st->cur_dts;
1104 pkt->dts = pkt->pts;
1105 if(pkt->pts != AV_NOPTS_VALUE)
1106 st->cur_dts = pkt->pts + pkt->duration;
1110 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1111 st->pts_buffer[0]= pkt->pts;
1112 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1113 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1114 if(pkt->dts == AV_NOPTS_VALUE)
1115 pkt->dts= st->pts_buffer[0];
1116 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1117 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1119 if(pkt->dts > st->cur_dts)
1120 st->cur_dts = pkt->dts;
1123 // 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);
1126 if(is_intra_only(st->codec))
1127 pkt->flags |= AV_PKT_FLAG_KEY;
1130 /* keyframe computation */
1131 if (pc->key_frame == 1)
1132 pkt->flags |= AV_PKT_FLAG_KEY;
1133 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1134 pkt->flags |= AV_PKT_FLAG_KEY;
1137 pkt->convergence_duration = pc->convergence_duration;
1141 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1146 av_init_packet(pkt);
1149 /* select current input stream component */
1152 if (!st->need_parsing || !st->parser) {
1153 /* no parsing needed: we just output the packet as is */
1154 /* raw data support */
1156 st->cur_pkt.data= NULL;
1157 st->cur_pkt.side_data_elems = 0;
1158 st->cur_pkt.side_data = NULL;
1159 compute_pkt_fields(s, st, NULL, pkt);
1161 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1162 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1163 ff_reduce_index(s, st->index);
1164 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1167 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1168 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1169 st->cur_ptr, st->cur_len,
1170 st->cur_pkt.pts, st->cur_pkt.dts,
1172 st->cur_pkt.pts = AV_NOPTS_VALUE;
1173 st->cur_pkt.dts = AV_NOPTS_VALUE;
1174 /* increment read pointer */
1178 /* return packet if any */
1182 pkt->stream_index = st->index;
1183 pkt->pts = st->parser->pts;
1184 pkt->dts = st->parser->dts;
1185 pkt->pos = st->parser->pos;
1186 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1188 pkt->destruct= st->cur_pkt.destruct;
1189 st->cur_pkt.destruct= NULL;
1190 st->cur_pkt.data = NULL;
1191 assert(st->cur_len == 0);
1193 pkt->destruct = NULL;
1195 compute_pkt_fields(s, st, st->parser, pkt);
1197 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1198 int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
1199 ff_reduce_index(s, st->index);
1200 av_add_index_entry(st, pos, pkt->dts,
1201 0, 0, AVINDEX_KEYFRAME);
1208 av_free_packet(&st->cur_pkt);
1213 /* read next packet */
1214 ret = av_read_packet(s, &cur_pkt);
1216 if (ret == AVERROR(EAGAIN))
1218 /* return the last frames, if any */
1219 for(i = 0; i < s->nb_streams; i++) {
1221 if (st->parser && st->need_parsing) {
1222 av_parser_parse2(st->parser, st->codec,
1223 &pkt->data, &pkt->size,
1225 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1231 /* no more packets: really terminate parsing */
1234 st = s->streams[cur_pkt.stream_index];
1235 st->cur_pkt= cur_pkt;
1237 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1238 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1239 st->cur_pkt.pts < st->cur_pkt.dts){
1240 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1241 st->cur_pkt.stream_index,
1245 // av_free_packet(&st->cur_pkt);
1249 if(s->debug & FF_FDEBUG_TS)
1250 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1251 st->cur_pkt.stream_index,
1255 st->cur_pkt.duration,
1259 st->cur_ptr = st->cur_pkt.data;
1260 st->cur_len = st->cur_pkt.size;
1261 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1262 st->parser = av_parser_init(st->codec->codec_id);
1264 av_log(s, AV_LOG_WARNING, "parser not found for codec "
1265 "%s, packets or times may be invalid.\n",
1266 avcodec_get_name(st->codec->codec_id));
1267 /* no parser available: just output the raw packets */
1268 st->need_parsing = AVSTREAM_PARSE_NONE;
1269 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1270 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1271 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1272 st->parser->flags |= PARSER_FLAG_ONCE;
1277 if(s->debug & FF_FDEBUG_TS)
1278 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1289 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1293 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1296 pktl = s->packet_buffer;
1298 AVPacket *next_pkt= &pktl->pkt;
1300 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1301 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1302 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1303 if( pktl->pkt.stream_index == next_pkt->stream_index
1304 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1305 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1306 next_pkt->pts= pktl->pkt.dts;
1310 pktl = s->packet_buffer;
1313 if( next_pkt->pts != AV_NOPTS_VALUE
1314 || next_pkt->dts == AV_NOPTS_VALUE
1316 /* read packet from packet buffer, if there is data */
1318 s->packet_buffer = pktl->next;
1324 int ret= read_frame_internal(s, pkt);
1326 if(pktl && ret != AVERROR(EAGAIN)){
1333 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1334 &s->packet_buffer_end)) < 0)
1335 return AVERROR(ENOMEM);
1337 assert(!s->packet_buffer);
1338 return read_frame_internal(s, pkt);
1343 /* XXX: suppress the packet queue */
1344 static void flush_packet_queue(AVFormatContext *s)
1349 pktl = s->packet_buffer;
1352 s->packet_buffer = pktl->next;
1353 av_free_packet(&pktl->pkt);
1356 while(s->raw_packet_buffer){
1357 pktl = s->raw_packet_buffer;
1358 s->raw_packet_buffer = pktl->next;
1359 av_free_packet(&pktl->pkt);
1362 s->packet_buffer_end=
1363 s->raw_packet_buffer_end= NULL;
1364 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1367 /*******************************************************/
1370 int av_find_default_stream_index(AVFormatContext *s)
1372 int first_audio_index = -1;
1376 if (s->nb_streams <= 0)
1378 for(i = 0; i < s->nb_streams; i++) {
1380 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1383 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1384 first_audio_index = i;
1386 return first_audio_index >= 0 ? first_audio_index : 0;
1390 * Flush the frame reader.
1392 void ff_read_frame_flush(AVFormatContext *s)
1397 flush_packet_queue(s);
1401 /* for each stream, reset read state */
1402 for(i = 0; i < s->nb_streams; i++) {
1406 av_parser_close(st->parser);
1408 av_free_packet(&st->cur_pkt);
1410 st->last_IP_pts = AV_NOPTS_VALUE;
1411 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1412 st->reference_dts = AV_NOPTS_VALUE;
1417 st->probe_packets = MAX_PROBE_PACKETS;
1419 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1420 st->pts_buffer[j]= AV_NOPTS_VALUE;
1424 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1427 for(i = 0; i < s->nb_streams; i++) {
1428 AVStream *st = s->streams[i];
1430 st->cur_dts = av_rescale(timestamp,
1431 st->time_base.den * (int64_t)ref_st->time_base.num,
1432 st->time_base.num * (int64_t)ref_st->time_base.den);
1436 void ff_reduce_index(AVFormatContext *s, int stream_index)
1438 AVStream *st= s->streams[stream_index];
1439 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1441 if((unsigned)st->nb_index_entries >= max_entries){
1443 for(i=0; 2*i<st->nb_index_entries; i++)
1444 st->index_entries[i]= st->index_entries[2*i];
1445 st->nb_index_entries= i;
1449 int ff_add_index_entry(AVIndexEntry **index_entries,
1450 int *nb_index_entries,
1451 unsigned int *index_entries_allocated_size,
1452 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1454 AVIndexEntry *entries, *ie;
1457 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1460 entries = av_fast_realloc(*index_entries,
1461 index_entries_allocated_size,
1462 (*nb_index_entries + 1) *
1463 sizeof(AVIndexEntry));
1467 *index_entries= entries;
1469 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1472 index= (*nb_index_entries)++;
1473 ie= &entries[index];
1474 assert(index==0 || ie[-1].timestamp < timestamp);
1476 ie= &entries[index];
1477 if(ie->timestamp != timestamp){
1478 if(ie->timestamp <= timestamp)
1480 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1481 (*nb_index_entries)++;
1482 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1483 distance= ie->min_distance;
1487 ie->timestamp = timestamp;
1488 ie->min_distance= distance;
1495 int av_add_index_entry(AVStream *st,
1496 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1498 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1499 &st->index_entries_allocated_size, pos,
1500 timestamp, size, distance, flags);
1503 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1504 int64_t wanted_timestamp, int flags)
1512 //optimize appending index entries at the end
1513 if(b && entries[b-1].timestamp < wanted_timestamp)
1518 timestamp = entries[m].timestamp;
1519 if(timestamp >= wanted_timestamp)
1521 if(timestamp <= wanted_timestamp)
1524 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1526 if(!(flags & AVSEEK_FLAG_ANY)){
1527 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1528 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1537 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1540 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1541 wanted_timestamp, flags);
1544 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1545 AVInputFormat *avif= s->iformat;
1546 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1547 int64_t ts_min, ts_max, ts;
1552 if (stream_index < 0)
1555 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1558 ts_min= AV_NOPTS_VALUE;
1559 pos_limit= -1; //gcc falsely says it may be uninitialized
1561 st= s->streams[stream_index];
1562 if(st->index_entries){
1565 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()
1566 index= FFMAX(index, 0);
1567 e= &st->index_entries[index];
1569 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1571 ts_min= e->timestamp;
1572 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1578 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1579 assert(index < st->nb_index_entries);
1581 e= &st->index_entries[index];
1582 assert(e->timestamp >= target_ts);
1584 ts_max= e->timestamp;
1585 pos_limit= pos_max - e->min_distance;
1586 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1587 pos_max,pos_limit, ts_max);
1591 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1596 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1599 av_update_cur_dts(s, st, ts);
1604 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, int64_t pos_min, int64_t pos_max, int64_t pos_limit, int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret, int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t )){
1606 int64_t start_pos, filesize;
1609 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1611 if(ts_min == AV_NOPTS_VALUE){
1612 pos_min = s->data_offset;
1613 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1614 if (ts_min == AV_NOPTS_VALUE)
1618 if(ts_max == AV_NOPTS_VALUE){
1620 filesize = avio_size(s->pb);
1621 pos_max = filesize - 1;
1624 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1626 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1627 if (ts_max == AV_NOPTS_VALUE)
1631 int64_t tmp_pos= pos_max + 1;
1632 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1633 if(tmp_ts == AV_NOPTS_VALUE)
1637 if(tmp_pos >= filesize)
1643 if(ts_min > ts_max){
1645 }else if(ts_min == ts_max){
1650 while (pos_min < pos_limit) {
1651 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1652 pos_min, pos_max, ts_min, ts_max);
1653 assert(pos_limit <= pos_max);
1656 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1657 // interpolate position (better than dichotomy)
1658 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1659 + pos_min - approximate_keyframe_distance;
1660 }else if(no_change==1){
1661 // bisection, if interpolation failed to change min or max pos last time
1662 pos = (pos_min + pos_limit)>>1;
1664 /* linear search if bisection failed, can only happen if there
1665 are very few or no keyframes between min/max */
1670 else if(pos > pos_limit)
1674 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1679 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1680 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1681 pos_limit, start_pos, no_change);
1682 if(ts == AV_NOPTS_VALUE){
1683 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1686 assert(ts != AV_NOPTS_VALUE);
1687 if (target_ts <= ts) {
1688 pos_limit = start_pos - 1;
1692 if (target_ts >= ts) {
1698 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1699 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1701 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1703 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1704 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1705 pos, ts_min, target_ts, ts_max);
1710 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1711 int64_t pos_min, pos_max;
1715 if (stream_index < 0)
1718 st= s->streams[stream_index];
1721 pos_min = s->data_offset;
1722 pos_max = avio_size(s->pb) - 1;
1724 if (pos < pos_min) pos= pos_min;
1725 else if(pos > pos_max) pos= pos_max;
1727 avio_seek(s->pb, pos, SEEK_SET);
1730 av_update_cur_dts(s, st, ts);
1735 static int seek_frame_generic(AVFormatContext *s,
1736 int stream_index, int64_t timestamp, int flags)
1743 st = s->streams[stream_index];
1745 index = av_index_search_timestamp(st, timestamp, flags);
1747 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1750 if(index < 0 || index==st->nb_index_entries-1){
1753 if(st->nb_index_entries){
1754 assert(st->index_entries);
1755 ie= &st->index_entries[st->nb_index_entries-1];
1756 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1758 av_update_cur_dts(s, st, ie->timestamp);
1760 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1766 read_status = av_read_frame(s, &pkt);
1767 } while (read_status == AVERROR(EAGAIN));
1768 if (read_status < 0)
1770 av_free_packet(&pkt);
1771 if(stream_index == pkt.stream_index){
1772 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1776 index = av_index_search_timestamp(st, timestamp, flags);
1781 ff_read_frame_flush(s);
1782 AV_NOWARN_DEPRECATED(
1783 if (s->iformat->read_seek){
1784 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1788 ie = &st->index_entries[index];
1789 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1791 av_update_cur_dts(s, st, ie->timestamp);
1796 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1801 ff_read_frame_flush(s);
1803 if(flags & AVSEEK_FLAG_BYTE)
1804 return seek_frame_byte(s, stream_index, timestamp, flags);
1806 if(stream_index < 0){
1807 stream_index= av_find_default_stream_index(s);
1808 if(stream_index < 0)
1811 st= s->streams[stream_index];
1812 /* timestamp for default must be expressed in AV_TIME_BASE units */
1813 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1816 /* first, we try the format specific seek */
1817 AV_NOWARN_DEPRECATED(
1818 if (s->iformat->read_seek)
1819 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1827 if(s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH))
1828 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1829 else if (!(s->iformat->flags & AVFMT_NOGENSEARCH))
1830 return seek_frame_generic(s, stream_index, timestamp, flags);
1835 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1837 if(min_ts > ts || max_ts < ts)
1840 ff_read_frame_flush(s);
1842 if (s->iformat->read_seek2)
1843 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1845 if(s->iformat->read_timestamp){
1846 //try to seek via read_timestamp()
1849 //Fallback to old API if new is not implemented but old is
1850 //Note the old has somewat different sematics
1851 AV_NOWARN_DEPRECATED(
1852 if(s->iformat->read_seek || 1)
1853 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1856 // try some generic seek like seek_frame_generic() but with new ts semantics
1859 /*******************************************************/
1862 * Return TRUE if the stream has accurate duration in any stream.
1864 * @return TRUE if the stream has accurate duration for at least one component.
1866 static int has_duration(AVFormatContext *ic)
1870 if(ic->duration != AV_NOPTS_VALUE)
1873 for(i = 0;i < ic->nb_streams; i++) {
1874 st = ic->streams[i];
1875 if (st->duration != AV_NOPTS_VALUE)
1882 * Estimate the stream timings from the one of each components.
1884 * Also computes the global bitrate if possible.
1886 static void update_stream_timings(AVFormatContext *ic)
1888 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1889 int64_t duration, duration1;
1893 start_time = INT64_MAX;
1894 start_time_text = INT64_MAX;
1895 end_time = INT64_MIN;
1896 duration = INT64_MIN;
1897 for(i = 0;i < ic->nb_streams; i++) {
1898 st = ic->streams[i];
1899 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1900 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1901 if (st->codec->codec_id == CODEC_ID_DVB_TELETEXT || st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1902 if (start_time1 < start_time_text)
1903 start_time_text = start_time1;
1905 if (start_time1 < start_time)
1906 start_time = start_time1;
1907 if (st->duration != AV_NOPTS_VALUE) {
1908 end_time1 = start_time1
1909 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1910 if (end_time1 > end_time)
1911 end_time = end_time1;
1914 if (st->duration != AV_NOPTS_VALUE) {
1915 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1916 if (duration1 > duration)
1917 duration = duration1;
1920 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
1921 start_time = start_time_text;
1922 if (start_time != INT64_MAX) {
1923 ic->start_time = start_time;
1924 if (end_time != INT64_MIN) {
1925 if (end_time - start_time > duration)
1926 duration = end_time - start_time;
1929 if (duration != INT64_MIN && ic->duration == AV_NOPTS_VALUE) {
1930 ic->duration = duration;
1932 if (ic->file_size > 0 && ic->duration != AV_NOPTS_VALUE) {
1933 /* compute the bitrate */
1934 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1935 (double)ic->duration;
1939 static void fill_all_stream_timings(AVFormatContext *ic)
1944 update_stream_timings(ic);
1945 for(i = 0;i < ic->nb_streams; i++) {
1946 st = ic->streams[i];
1947 if (st->start_time == AV_NOPTS_VALUE) {
1948 if(ic->start_time != AV_NOPTS_VALUE)
1949 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1950 if(ic->duration != AV_NOPTS_VALUE)
1951 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1956 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
1958 int64_t filesize, duration;
1962 /* if bit_rate is already set, we believe it */
1963 if (ic->bit_rate <= 0) {
1965 for(i=0;i<ic->nb_streams;i++) {
1966 st = ic->streams[i];
1967 if (st->codec->bit_rate > 0)
1968 bit_rate += st->codec->bit_rate;
1970 ic->bit_rate = bit_rate;
1973 /* if duration is already set, we believe it */
1974 if (ic->duration == AV_NOPTS_VALUE &&
1975 ic->bit_rate != 0 &&
1976 ic->file_size != 0) {
1977 filesize = ic->file_size;
1979 for(i = 0; i < ic->nb_streams; i++) {
1980 st = ic->streams[i];
1981 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1982 if (st->duration == AV_NOPTS_VALUE)
1983 st->duration = duration;
1989 #define DURATION_MAX_READ_SIZE 250000
1990 #define DURATION_MAX_RETRY 3
1992 /* only usable for MPEG-PS streams */
1993 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1995 AVPacket pkt1, *pkt = &pkt1;
1997 int read_size, i, ret;
1999 int64_t filesize, offset, duration;
2004 /* flush packet queue */
2005 flush_packet_queue(ic);
2007 for (i=0; i<ic->nb_streams; i++) {
2008 st = ic->streams[i];
2009 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
2010 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2013 av_parser_close(st->parser);
2015 av_free_packet(&st->cur_pkt);
2019 /* estimate the end time (duration) */
2020 /* XXX: may need to support wrapping */
2021 filesize = ic->file_size;
2022 end_time = AV_NOPTS_VALUE;
2024 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2028 avio_seek(ic->pb, offset, SEEK_SET);
2031 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2035 ret = av_read_packet(ic, pkt);
2036 } while(ret == AVERROR(EAGAIN));
2039 read_size += pkt->size;
2040 st = ic->streams[pkt->stream_index];
2041 if (pkt->pts != AV_NOPTS_VALUE &&
2042 (st->start_time != AV_NOPTS_VALUE ||
2043 st->first_dts != AV_NOPTS_VALUE)) {
2044 duration = end_time = pkt->pts;
2045 if (st->start_time != AV_NOPTS_VALUE)
2046 duration -= st->start_time;
2048 duration -= st->first_dts;
2050 duration += 1LL<<st->pts_wrap_bits;
2052 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2053 st->duration = duration;
2056 av_free_packet(pkt);
2058 }while( end_time==AV_NOPTS_VALUE
2059 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2060 && ++retry <= DURATION_MAX_RETRY);
2062 fill_all_stream_timings(ic);
2064 avio_seek(ic->pb, old_offset, SEEK_SET);
2065 for (i=0; i<ic->nb_streams; i++) {
2067 st->cur_dts= st->first_dts;
2068 st->last_IP_pts = AV_NOPTS_VALUE;
2069 st->reference_dts = AV_NOPTS_VALUE;
2073 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2077 /* get the file size, if possible */
2078 if (ic->iformat->flags & AVFMT_NOFILE) {
2081 file_size = avio_size(ic->pb);
2085 ic->file_size = file_size;
2087 if ((!strcmp(ic->iformat->name, "mpeg") ||
2088 !strcmp(ic->iformat->name, "mpegts")) &&
2089 file_size && ic->pb->seekable) {
2090 /* get accurate estimate from the PTSes */
2091 estimate_timings_from_pts(ic, old_offset);
2092 } else if (has_duration(ic)) {
2093 /* at least one component has timings - we use them for all
2095 fill_all_stream_timings(ic);
2097 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2098 /* less precise: use bitrate info */
2099 estimate_timings_from_bit_rate(ic);
2101 update_stream_timings(ic);
2105 AVStream av_unused *st;
2106 for(i = 0;i < ic->nb_streams; i++) {
2107 st = ic->streams[i];
2108 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2109 (double) st->start_time / AV_TIME_BASE,
2110 (double) st->duration / AV_TIME_BASE);
2112 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2113 (double) ic->start_time / AV_TIME_BASE,
2114 (double) ic->duration / AV_TIME_BASE,
2115 ic->bit_rate / 1000);
2119 static int has_codec_parameters(AVCodecContext *avctx)
2122 switch (avctx->codec_type) {
2123 case AVMEDIA_TYPE_AUDIO:
2124 val = avctx->sample_rate && avctx->channels && avctx->sample_fmt != AV_SAMPLE_FMT_NONE;
2125 if (!avctx->frame_size &&
2126 (avctx->codec_id == CODEC_ID_VORBIS ||
2127 avctx->codec_id == CODEC_ID_AAC ||
2128 avctx->codec_id == CODEC_ID_MP1 ||
2129 avctx->codec_id == CODEC_ID_MP2 ||
2130 avctx->codec_id == CODEC_ID_MP3 ||
2131 avctx->codec_id == CODEC_ID_SPEEX ||
2132 avctx->codec_id == CODEC_ID_CELT))
2135 case AVMEDIA_TYPE_VIDEO:
2136 val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
2138 case AVMEDIA_TYPE_DATA:
2139 if(avctx->codec_id == CODEC_ID_NONE) return 1;
2144 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2147 static int has_decode_delay_been_guessed(AVStream *st)
2149 return st->codec->codec_id != CODEC_ID_H264 ||
2150 st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2153 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2157 int got_picture, data_size, ret=0;
2160 if(!st->codec->codec){
2161 codec = avcodec_find_decoder(st->codec->codec_id);
2164 ret = avcodec_open2(st->codec, codec, options);
2169 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st) ||
2170 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF)) {
2171 switch(st->codec->codec_type) {
2172 case AVMEDIA_TYPE_VIDEO:
2173 avcodec_get_frame_defaults(&picture);
2174 ret = avcodec_decode_video2(st->codec, &picture,
2175 &got_picture, avpkt);
2177 case AVMEDIA_TYPE_AUDIO:
2178 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2179 samples = av_malloc(data_size);
2182 ret = avcodec_decode_audio3(st->codec, samples,
2194 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2196 while (tags->id != CODEC_ID_NONE) {
2204 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2207 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2208 if(tag == tags[i].tag)
2211 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2212 if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2215 return CODEC_ID_NONE;
2218 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2221 for(i=0; tags && tags[i]; i++){
2222 int tag= ff_codec_get_tag(tags[i], id);
2228 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2231 for(i=0; tags && tags[i]; i++){
2232 enum CodecID id= ff_codec_get_id(tags[i], tag);
2233 if(id!=CODEC_ID_NONE) return id;
2235 return CODEC_ID_NONE;
2238 static void compute_chapters_end(AVFormatContext *s)
2241 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2243 for (i = 0; i < s->nb_chapters; i++)
2244 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2245 AVChapter *ch = s->chapters[i];
2246 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2249 for (j = 0; j < s->nb_chapters; j++) {
2250 AVChapter *ch1 = s->chapters[j];
2251 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2252 if (j != i && next_start > ch->start && next_start < end)
2255 ch->end = (end == INT64_MAX) ? ch->start : end;
2259 static int get_std_framerate(int i){
2260 if(i<60*12) return i*1001;
2261 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2265 * Is the time base unreliable.
2266 * This is a heuristic to balance between quick acceptance of the values in
2267 * the headers vs. some extra checks.
2268 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2269 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2270 * And there are "variable" fps files this needs to detect as well.
2272 static int tb_unreliable(AVCodecContext *c){
2273 if( c->time_base.den >= 101L*c->time_base.num
2274 || c->time_base.den < 5L*c->time_base.num
2275 /* || c->codec_tag == AV_RL32("DIVX")
2276 || c->codec_tag == AV_RL32("XVID")*/
2277 || c->codec_id == CODEC_ID_MPEG2VIDEO
2278 || c->codec_id == CODEC_ID_H264
2284 #if FF_API_FORMAT_PARAMETERS
2285 int av_find_stream_info(AVFormatContext *ic)
2287 return avformat_find_stream_info(ic, NULL);
2291 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2293 int i, count, ret, read_size, j;
2295 AVPacket pkt1, *pkt;
2296 int64_t old_offset = avio_tell(ic->pb);
2297 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2299 for(i=0;i<ic->nb_streams;i++) {
2301 st = ic->streams[i];
2303 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2304 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2305 /* if(!st->time_base.num)
2307 if(!st->codec->time_base.num)
2308 st->codec->time_base= st->time_base;
2310 //only for the split stuff
2311 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2312 st->parser = av_parser_init(st->codec->codec_id);
2313 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2314 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2317 assert(!st->codec->codec);
2318 codec = avcodec_find_decoder(st->codec->codec_id);
2320 /* Ensure that subtitle_header is properly set. */
2321 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2322 && codec && !st->codec->codec)
2323 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2325 //try to just open decoders, in case this is enough to get parameters
2326 if(!has_codec_parameters(st->codec)){
2327 if (codec && !st->codec->codec){
2328 AVDictionary *tmp = NULL;
2330 av_dict_copy(&tmp, options[i], 0);
2331 av_dict_set(&tmp, "threads", 0, 0);
2333 avcodec_open2(st->codec, codec, options ? &tmp : NULL);
2339 for (i=0; i<ic->nb_streams; i++) {
2340 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2346 if(url_interrupt_cb()){
2348 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2352 /* check if one codec still needs to be handled */
2353 for(i=0;i<ic->nb_streams;i++) {
2354 int fps_analyze_framecount = 20;
2356 st = ic->streams[i];
2357 if (!has_codec_parameters(st->codec))
2359 /* if the timebase is coarse (like the usual millisecond precision
2360 of mkv), we need to analyze more frames to reliably arrive at
2362 if (av_q2d(st->time_base) > 0.0005)
2363 fps_analyze_framecount *= 2;
2364 if (ic->fps_probe_size >= 0)
2365 fps_analyze_framecount = ic->fps_probe_size;
2366 /* variable fps and no guess at the real fps */
2367 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2368 && st->info->duration_count < fps_analyze_framecount
2369 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2371 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2373 if(st->first_dts == AV_NOPTS_VALUE && (st->codec->codec_type == AVMEDIA_TYPE_VIDEO || st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2376 if (i == ic->nb_streams) {
2377 /* NOTE: if the format has no header, then we need to read
2378 some packets to get most of the streams, so we cannot
2380 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2381 /* if we found the info for all the codecs, we can stop */
2383 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2387 /* we did not get all the codec info, but we read too much data */
2388 if (read_size >= ic->probesize) {
2390 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2394 /* NOTE: a new stream can be added there if no header in file
2395 (AVFMTCTX_NOHEADER) */
2396 ret = read_frame_internal(ic, &pkt1);
2397 if (ret == AVERROR(EAGAIN))
2402 ret = -1; /* we could not have all the codec parameters before EOF */
2403 for(i=0;i<ic->nb_streams;i++) {
2404 st = ic->streams[i];
2405 if (!has_codec_parameters(st->codec)){
2407 avcodec_string(buf, sizeof(buf), st->codec, 0);
2408 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2416 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2417 if ((ret = av_dup_packet(pkt)) < 0)
2418 goto find_stream_info_err;
2420 read_size += pkt->size;
2422 st = ic->streams[pkt->stream_index];
2423 if (st->codec_info_nb_frames>1) {
2425 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) {
2426 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2429 st->info->codec_info_duration += pkt->duration;
2432 int64_t last = st->info->last_dts;
2433 int64_t duration= pkt->dts - last;
2435 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2436 double dts= pkt->dts * av_q2d(st->time_base);
2438 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2439 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2440 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) {
2441 int framerate= get_std_framerate(i);
2442 double sdts= dts*framerate/(1001*12);
2444 int ticks= lrintf(sdts+j*0.5);
2445 double error= sdts - ticks + j*0.5;
2446 st->info->duration_error[j][0][i] += error;
2447 st->info->duration_error[j][1][i] += error*error;
2450 st->info->duration_count++;
2451 // ignore the first 4 values, they might have some random jitter
2452 if (st->info->duration_count > 3)
2453 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2455 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2456 st->info->last_dts = pkt->dts;
2458 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2459 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2461 st->codec->extradata_size= i;
2462 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2463 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2464 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2468 /* if still no information, we try to open the codec and to
2469 decompress the frame. We try to avoid that in most cases as
2470 it takes longer and uses more memory. For MPEG-4, we need to
2471 decompress for QuickTime.
2473 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2474 least one frame of codec data, this makes sure the codec initializes
2475 the channel configuration and does not only trust the values from the container.
2477 try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
2479 st->codec_info_nb_frames++;
2483 // close codecs which were opened in try_decode_frame()
2484 for(i=0;i<ic->nb_streams;i++) {
2485 st = ic->streams[i];
2486 if(st->codec->codec)
2487 avcodec_close(st->codec);
2489 for(i=0;i<ic->nb_streams;i++) {
2490 st = ic->streams[i];
2491 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2492 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2493 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2494 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2495 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2496 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2497 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2498 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2499 st->codec->codec_tag= tag;
2502 // the check for tb_unreliable() is not completely correct, since this is not about handling
2503 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2504 // ipmovie.c produces.
2505 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)
2506 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);
2507 if (st->info->duration_count && !st->r_frame_rate.num
2508 && tb_unreliable(st->codec) /*&&
2509 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2510 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2512 double best_error= 0.01;
2514 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) {
2517 if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2520 int n= st->info->duration_count;
2521 double a= st->info->duration_error[k][0][j] / n;
2522 double error= st->info->duration_error[k][1][j]/n - a*a;
2524 if(error < best_error && best_error> 0.000000001){
2526 num = get_std_framerate(j);
2529 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2532 // do not increase frame rate by more than 1 % in order to match a standard rate.
2533 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2534 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2537 if (!st->r_frame_rate.num){
2538 if( st->codec->time_base.den * (int64_t)st->time_base.num
2539 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2540 st->r_frame_rate.num = st->codec->time_base.den;
2541 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2543 st->r_frame_rate.num = st->time_base.den;
2544 st->r_frame_rate.den = st->time_base.num;
2547 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2548 if(!st->codec->bits_per_coded_sample)
2549 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2550 // set stream disposition based on audio service type
2551 switch (st->codec->audio_service_type) {
2552 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2553 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2554 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2555 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2556 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2557 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2558 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2559 st->disposition = AV_DISPOSITION_COMMENT; break;
2560 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2561 st->disposition = AV_DISPOSITION_KARAOKE; break;
2566 estimate_timings(ic, old_offset);
2568 compute_chapters_end(ic);
2571 /* correct DTS for B-frame streams with no timestamps */
2572 for(i=0;i<ic->nb_streams;i++) {
2573 st = ic->streams[i];
2574 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2576 ppktl = &ic->packet_buffer;
2578 if(ppkt1->stream_index != i)
2580 if(ppkt1->pkt->dts < 0)
2582 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2584 ppkt1->pkt->dts -= delta;
2589 st->cur_dts -= delta;
2595 find_stream_info_err:
2596 for (i=0; i < ic->nb_streams; i++)
2597 av_freep(&ic->streams[i]->info);
2601 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2605 for (i = 0; i < ic->nb_programs; i++) {
2606 if (ic->programs[i] == last) {
2610 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2611 if (ic->programs[i]->stream_index[j] == s)
2612 return ic->programs[i];
2618 int av_find_best_stream(AVFormatContext *ic,
2619 enum AVMediaType type,
2620 int wanted_stream_nb,
2622 AVCodec **decoder_ret,
2625 int i, nb_streams = ic->nb_streams;
2626 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2627 unsigned *program = NULL;
2628 AVCodec *decoder = NULL, *best_decoder = NULL;
2630 if (related_stream >= 0 && wanted_stream_nb < 0) {
2631 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2633 program = p->stream_index;
2634 nb_streams = p->nb_stream_indexes;
2637 for (i = 0; i < nb_streams; i++) {
2638 int real_stream_index = program ? program[i] : i;
2639 AVStream *st = ic->streams[real_stream_index];
2640 AVCodecContext *avctx = st->codec;
2641 if (avctx->codec_type != type)
2643 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2645 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2648 decoder = avcodec_find_decoder(st->codec->codec_id);
2651 ret = AVERROR_DECODER_NOT_FOUND;
2655 if (best_count >= st->codec_info_nb_frames)
2657 best_count = st->codec_info_nb_frames;
2658 ret = real_stream_index;
2659 best_decoder = decoder;
2660 if (program && i == nb_streams - 1 && ret < 0) {
2662 nb_streams = ic->nb_streams;
2663 i = 0; /* no related stream found, try again with everything */
2667 *decoder_ret = best_decoder;
2671 /*******************************************************/
2673 int av_read_play(AVFormatContext *s)
2675 if (s->iformat->read_play)
2676 return s->iformat->read_play(s);
2678 return avio_pause(s->pb, 0);
2679 return AVERROR(ENOSYS);
2682 int av_read_pause(AVFormatContext *s)
2684 if (s->iformat->read_pause)
2685 return s->iformat->read_pause(s);
2687 return avio_pause(s->pb, 1);
2688 return AVERROR(ENOSYS);
2691 void av_close_input_stream(AVFormatContext *s)
2693 flush_packet_queue(s);
2694 if (s->iformat->read_close)
2695 s->iformat->read_close(s);
2696 avformat_free_context(s);
2699 void avformat_free_context(AVFormatContext *s)
2705 if (s->iformat && s->iformat->priv_class && s->priv_data)
2706 av_opt_free(s->priv_data);
2708 for(i=0;i<s->nb_streams;i++) {
2709 /* free all data in a stream component */
2712 av_parser_close(st->parser);
2713 av_free_packet(&st->cur_pkt);
2715 av_dict_free(&st->metadata);
2716 av_freep(&st->index_entries);
2717 av_freep(&st->codec->extradata);
2718 av_freep(&st->codec->subtitle_header);
2719 av_freep(&st->codec);
2720 av_freep(&st->priv_data);
2721 av_freep(&st->info);
2724 for(i=s->nb_programs-1; i>=0; i--) {
2725 av_dict_free(&s->programs[i]->metadata);
2726 av_freep(&s->programs[i]->stream_index);
2727 av_freep(&s->programs[i]);
2729 av_freep(&s->programs);
2730 av_freep(&s->priv_data);
2731 while(s->nb_chapters--) {
2732 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2733 av_freep(&s->chapters[s->nb_chapters]);
2735 av_freep(&s->chapters);
2736 av_dict_free(&s->metadata);
2737 av_freep(&s->streams);
2741 void av_close_input_file(AVFormatContext *s)
2743 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2745 av_close_input_stream(s);
2750 AVStream *av_new_stream(AVFormatContext *s, int id)
2756 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2758 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2761 s->streams = streams;
2763 st = av_mallocz(sizeof(AVStream));
2766 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2771 st->codec = avcodec_alloc_context3(NULL);
2773 /* no default bitrate if decoding */
2774 st->codec->bit_rate = 0;
2776 st->index = s->nb_streams;
2778 st->start_time = AV_NOPTS_VALUE;
2779 st->duration = AV_NOPTS_VALUE;
2780 /* we set the current DTS to 0 so that formats without any timestamps
2781 but durations get some timestamps, formats with some unknown
2782 timestamps have their first few packets buffered and the
2783 timestamps corrected before they are returned to the user */
2785 st->first_dts = AV_NOPTS_VALUE;
2786 st->probe_packets = MAX_PROBE_PACKETS;
2788 /* default pts setting is MPEG-like */
2789 av_set_pts_info(st, 33, 1, 90000);
2790 st->last_IP_pts = AV_NOPTS_VALUE;
2791 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2792 st->pts_buffer[i]= AV_NOPTS_VALUE;
2793 st->reference_dts = AV_NOPTS_VALUE;
2795 st->sample_aspect_ratio = (AVRational){0,1};
2797 s->streams[s->nb_streams++] = st;
2801 AVProgram *av_new_program(AVFormatContext *ac, int id)
2803 AVProgram *program=NULL;
2806 av_dlog(ac, "new_program: id=0x%04x\n", id);
2808 for(i=0; i<ac->nb_programs; i++)
2809 if(ac->programs[i]->id == id)
2810 program = ac->programs[i];
2813 program = av_mallocz(sizeof(AVProgram));
2816 dynarray_add(&ac->programs, &ac->nb_programs, program);
2817 program->discard = AVDISCARD_NONE;
2824 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2826 AVChapter *chapter = NULL;
2829 for(i=0; i<s->nb_chapters; i++)
2830 if(s->chapters[i]->id == id)
2831 chapter = s->chapters[i];
2834 chapter= av_mallocz(sizeof(AVChapter));
2837 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2839 av_dict_set(&chapter->metadata, "title", title, 0);
2841 chapter->time_base= time_base;
2842 chapter->start = start;
2848 /************************************************************/
2849 /* output media file */
2851 #if FF_API_FORMAT_PARAMETERS
2852 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2854 if (s->oformat->priv_data_size > 0) {
2855 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2857 return AVERROR(ENOMEM);
2858 if (s->oformat->priv_class) {
2859 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2860 av_opt_set_defaults(s->priv_data);
2863 s->priv_data = NULL;
2869 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
2870 const char *format, const char *filename)
2872 AVFormatContext *s = avformat_alloc_context();
2881 oformat = av_guess_format(format, NULL, NULL);
2883 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
2884 ret = AVERROR(EINVAL);
2888 oformat = av_guess_format(NULL, filename, NULL);
2890 ret = AVERROR(EINVAL);
2891 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
2898 s->oformat = oformat;
2899 if (s->oformat->priv_data_size > 0) {
2900 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2903 if (s->oformat->priv_class) {
2904 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2905 av_opt_set_defaults(s->priv_data);
2908 s->priv_data = NULL;
2911 av_strlcpy(s->filename, filename, sizeof(s->filename));
2915 av_log(s, AV_LOG_ERROR, "Out of memory\n");
2916 ret = AVERROR(ENOMEM);
2918 avformat_free_context(s);
2922 #if FF_API_ALLOC_OUTPUT_CONTEXT
2923 AVFormatContext *avformat_alloc_output_context(const char *format,
2924 AVOutputFormat *oformat, const char *filename)
2926 AVFormatContext *avctx;
2927 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
2928 return ret < 0 ? NULL : avctx;
2932 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2934 const AVCodecTag *avctag;
2936 enum CodecID id = CODEC_ID_NONE;
2937 unsigned int tag = 0;
2940 * Check that tag + id is in the table
2941 * If neither is in the table -> OK
2942 * If tag is in the table with another id -> FAIL
2943 * If id is in the table with another tag -> FAIL unless strict < normal
2945 for (n = 0; s->oformat->codec_tag[n]; n++) {
2946 avctag = s->oformat->codec_tag[n];
2947 while (avctag->id != CODEC_ID_NONE) {
2948 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2950 if (id == st->codec->codec_id)
2953 if (avctag->id == st->codec->codec_id)
2958 if (id != CODEC_ID_NONE)
2960 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2965 #if FF_API_FORMAT_PARAMETERS
2966 int av_write_header(AVFormatContext *s)
2968 return avformat_write_header(s, NULL);
2972 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2976 AVDictionary *tmp = NULL;
2979 av_dict_copy(&tmp, *options, 0);
2980 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2982 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
2983 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2986 // some sanity checks
2987 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2988 av_log(s, AV_LOG_ERROR, "no streams\n");
2989 ret = AVERROR(EINVAL);
2993 for(i=0;i<s->nb_streams;i++) {
2996 switch (st->codec->codec_type) {
2997 case AVMEDIA_TYPE_AUDIO:
2998 if(st->codec->sample_rate<=0){
2999 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
3000 ret = AVERROR(EINVAL);
3003 if(!st->codec->block_align)
3004 st->codec->block_align = st->codec->channels *
3005 av_get_bits_per_sample(st->codec->codec_id) >> 3;
3007 case AVMEDIA_TYPE_VIDEO:
3008 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
3009 av_log(s, AV_LOG_ERROR, "time base not set\n");
3010 ret = AVERROR(EINVAL);
3013 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
3014 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
3015 ret = AVERROR(EINVAL);
3018 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
3019 && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
3021 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
3022 ret = AVERROR(EINVAL);
3028 if(s->oformat->codec_tag){
3029 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)){
3030 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
3031 st->codec->codec_tag= 0;
3033 if(st->codec->codec_tag){
3034 if (!validate_codec_tag(s, st)) {
3036 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
3037 av_log(s, AV_LOG_ERROR,
3038 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
3039 tagbuf, st->codec->codec_tag, st->codec->codec_id);
3040 ret = AVERROR_INVALIDDATA;
3044 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3047 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3048 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3049 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3052 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3053 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3054 if (!s->priv_data) {
3055 ret = AVERROR(ENOMEM);
3058 if (s->oformat->priv_class) {
3059 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3060 av_opt_set_defaults(s->priv_data);
3061 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3066 /* set muxer identification string */
3067 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3068 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3071 if(s->oformat->write_header){
3072 ret = s->oformat->write_header(s);
3077 /* init PTS generation */
3078 for(i=0;i<s->nb_streams;i++) {
3079 int64_t den = AV_NOPTS_VALUE;
3082 switch (st->codec->codec_type) {
3083 case AVMEDIA_TYPE_AUDIO:
3084 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3086 case AVMEDIA_TYPE_VIDEO:
3087 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3092 if (den != AV_NOPTS_VALUE) {
3094 ret = AVERROR_INVALIDDATA;
3097 frac_init(&st->pts, 0, 0, den);
3102 av_dict_free(options);
3111 //FIXME merge with compute_pkt_fields
3112 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3113 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3114 int num, den, frame_size, i;
3116 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3117 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3119 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
3120 return AVERROR(EINVAL);*/
3122 /* duration field */
3123 if (pkt->duration == 0) {
3124 compute_frame_duration(&num, &den, st, NULL, pkt);
3126 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3130 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3133 //XXX/FIXME this is a temporary hack until all encoders output pts
3134 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3136 // pkt->pts= st->cur_dts;
3137 pkt->pts= st->pts.val;
3140 //calculate dts from pts
3141 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3142 st->pts_buffer[0]= pkt->pts;
3143 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3144 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3145 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3146 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3148 pkt->dts= st->pts_buffer[0];
3151 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)){
3152 av_log(s, AV_LOG_ERROR,
3153 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3154 st->index, st->cur_dts, pkt->dts);
3155 return AVERROR(EINVAL);
3157 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3158 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3159 return AVERROR(EINVAL);
3162 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3163 st->cur_dts= pkt->dts;
3164 st->pts.val= pkt->dts;
3167 switch (st->codec->codec_type) {
3168 case AVMEDIA_TYPE_AUDIO:
3169 frame_size = get_audio_frame_size(st->codec, pkt->size);
3171 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3172 likely equal to the encoder delay, but it would be better if we
3173 had the real timestamps from the encoder */
3174 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3175 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3178 case AVMEDIA_TYPE_VIDEO:
3179 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3187 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3189 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3191 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3194 ret= s->oformat->write_packet(s, pkt);
3197 s->streams[pkt->stream_index]->nb_frames++;
3201 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3202 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3204 AVPacketList **next_point, *this_pktl;
3206 this_pktl = av_mallocz(sizeof(AVPacketList));
3207 this_pktl->pkt= *pkt;
3208 pkt->destruct= NULL; // do not free original but only the copy
3209 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3211 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3212 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3214 next_point = &s->packet_buffer;
3217 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3218 while(!compare(s, &(*next_point)->pkt, pkt)){
3219 next_point= &(*next_point)->next;
3223 next_point = &(s->packet_buffer_end->next);
3226 assert(!*next_point);
3228 s->packet_buffer_end= this_pktl;
3231 this_pktl->next= *next_point;
3233 s->streams[pkt->stream_index]->last_in_packet_buffer=
3234 *next_point= this_pktl;
3237 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3239 AVStream *st = s->streams[ pkt ->stream_index];
3240 AVStream *st2= s->streams[ next->stream_index];
3241 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3245 return pkt->stream_index < next->stream_index;
3249 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3251 int stream_count=0, noninterleaved_count=0;
3252 int64_t delta_dts_max = 0;
3256 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3259 for(i=0; i < s->nb_streams; i++) {
3260 if (s->streams[i]->last_in_packet_buffer) {
3262 } else if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3263 ++noninterleaved_count;
3267 if (s->nb_streams == stream_count) {
3270 for(i=0; i < s->nb_streams; i++) {
3271 if (s->streams[i]->last_in_packet_buffer) {
3273 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
3274 s->streams[i]->time_base,
3276 av_rescale_q(s->packet_buffer->pkt.dts,
3277 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
3279 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
3282 if(s->nb_streams == stream_count+noninterleaved_count &&
3283 delta_dts_max > 20*AV_TIME_BASE) {
3284 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
3288 if(stream_count && flush){
3289 pktl= s->packet_buffer;
3292 s->packet_buffer= pktl->next;
3293 if(!s->packet_buffer)
3294 s->packet_buffer_end= NULL;
3296 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3297 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3301 av_init_packet(out);
3307 * Interleave an AVPacket correctly so it can be muxed.
3308 * @param out the interleaved packet will be output here
3309 * @param in the input packet
3310 * @param flush 1 if no further packets are available as input and all
3311 * remaining packets should be output
3312 * @return 1 if a packet was output, 0 if no packet could be output,
3313 * < 0 if an error occurred
3315 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3316 if(s->oformat->interleave_packet)
3317 return s->oformat->interleave_packet(s, out, in, flush);
3319 return av_interleave_packet_per_dts(s, out, in, flush);
3322 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3323 AVStream *st= s->streams[ pkt->stream_index];
3326 //FIXME/XXX/HACK drop zero sized packets
3327 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3330 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3331 pkt->size, pkt->dts, pkt->pts);
3332 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3335 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3336 return AVERROR(EINVAL);
3340 int ret= interleave_packet(s, &opkt, pkt, 0);
3341 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3344 ret= s->oformat->write_packet(s, &opkt);
3346 s->streams[opkt.stream_index]->nb_frames++;
3348 av_free_packet(&opkt);
3353 if(s->pb && s->pb->error)
3354 return s->pb->error;
3358 int av_write_trailer(AVFormatContext *s)
3364 ret= interleave_packet(s, &pkt, NULL, 1);
3365 if(ret<0) //FIXME cleanup needed for ret<0 ?
3370 ret= s->oformat->write_packet(s, &pkt);
3372 s->streams[pkt.stream_index]->nb_frames++;
3374 av_free_packet(&pkt);
3378 if(s->pb && s->pb->error)
3382 if(s->oformat->write_trailer)
3383 ret = s->oformat->write_trailer(s);
3386 ret = s->pb ? s->pb->error : 0;
3387 for(i=0;i<s->nb_streams;i++) {
3388 av_freep(&s->streams[i]->priv_data);
3389 av_freep(&s->streams[i]->index_entries);
3391 if (s->iformat && s->iformat->priv_class)
3392 av_opt_free(s->priv_data);
3393 av_freep(&s->priv_data);
3397 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
3398 int64_t *dts, int64_t *wall)
3400 if (!s->oformat || !s->oformat->get_output_timestamp)
3401 return AVERROR(ENOSYS);
3402 s->oformat->get_output_timestamp(s, stream, dts, wall);
3406 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3409 AVProgram *program=NULL;
3412 if (idx >= ac->nb_streams) {
3413 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3417 for(i=0; i<ac->nb_programs; i++){
3418 if(ac->programs[i]->id != progid)
3420 program = ac->programs[i];
3421 for(j=0; j<program->nb_stream_indexes; j++)
3422 if(program->stream_index[j] == idx)
3425 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3428 program->stream_index = tmp;
3429 program->stream_index[program->nb_stream_indexes++] = idx;
3434 static void print_fps(double d, const char *postfix){
3435 uint64_t v= lrintf(d*100);
3436 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3437 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3438 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3441 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3443 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3444 AVDictionaryEntry *tag=NULL;
3446 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3447 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3448 if(strcmp("language", tag->key)){
3451 av_strlcpy(tmp, tag->value, sizeof(tmp));
3452 for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
3453 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tmp);
3459 /* "user interface" functions */
3460 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3463 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3464 AVStream *st = ic->streams[i];
3465 int g = av_gcd(st->time_base.num, st->time_base.den);
3466 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3467 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3468 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
3469 /* the pid is an important information, so we display it */
3470 /* XXX: add a generic system */
3471 if (flags & AVFMT_SHOW_IDS)
3472 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3474 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3475 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3476 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3477 if (st->sample_aspect_ratio.num && // default
3478 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3479 AVRational display_aspect_ratio;
3480 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3481 st->codec->width*st->sample_aspect_ratio.num,
3482 st->codec->height*st->sample_aspect_ratio.den,
3484 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3485 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3486 display_aspect_ratio.num, display_aspect_ratio.den);
3488 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3489 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3490 print_fps(av_q2d(st->avg_frame_rate), "fps");
3491 if(st->r_frame_rate.den && st->r_frame_rate.num)
3492 print_fps(av_q2d(st->r_frame_rate), "tbr");
3493 if(st->time_base.den && st->time_base.num)
3494 print_fps(1/av_q2d(st->time_base), "tbn");
3495 if(st->codec->time_base.den && st->codec->time_base.num)
3496 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3498 if (st->disposition & AV_DISPOSITION_DEFAULT)
3499 av_log(NULL, AV_LOG_INFO, " (default)");
3500 if (st->disposition & AV_DISPOSITION_DUB)
3501 av_log(NULL, AV_LOG_INFO, " (dub)");
3502 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3503 av_log(NULL, AV_LOG_INFO, " (original)");
3504 if (st->disposition & AV_DISPOSITION_COMMENT)
3505 av_log(NULL, AV_LOG_INFO, " (comment)");
3506 if (st->disposition & AV_DISPOSITION_LYRICS)
3507 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3508 if (st->disposition & AV_DISPOSITION_KARAOKE)
3509 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3510 if (st->disposition & AV_DISPOSITION_FORCED)
3511 av_log(NULL, AV_LOG_INFO, " (forced)");
3512 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3513 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3514 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3515 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3516 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3517 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3518 av_log(NULL, AV_LOG_INFO, "\n");
3519 dump_metadata(NULL, st->metadata, " ");
3522 #if FF_API_DUMP_FORMAT
3523 void dump_format(AVFormatContext *ic,
3528 av_dump_format(ic, index, url, is_output);
3532 void av_dump_format(AVFormatContext *ic,
3538 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3539 if (ic->nb_streams && !printed)
3542 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3543 is_output ? "Output" : "Input",
3545 is_output ? ic->oformat->name : ic->iformat->name,
3546 is_output ? "to" : "from", url);
3547 dump_metadata(NULL, ic->metadata, " ");
3549 av_log(NULL, AV_LOG_INFO, " Duration: ");
3550 if (ic->duration != AV_NOPTS_VALUE) {
3551 int hours, mins, secs, us;
3552 secs = ic->duration / AV_TIME_BASE;
3553 us = ic->duration % AV_TIME_BASE;
3558 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3559 (100 * us) / AV_TIME_BASE);
3561 av_log(NULL, AV_LOG_INFO, "N/A");
3563 if (ic->start_time != AV_NOPTS_VALUE) {
3565 av_log(NULL, AV_LOG_INFO, ", start: ");
3566 secs = ic->start_time / AV_TIME_BASE;
3567 us = abs(ic->start_time % AV_TIME_BASE);
3568 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3569 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3571 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3573 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3575 av_log(NULL, AV_LOG_INFO, "N/A");
3577 av_log(NULL, AV_LOG_INFO, "\n");
3579 for (i = 0; i < ic->nb_chapters; i++) {
3580 AVChapter *ch = ic->chapters[i];
3581 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3582 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3583 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3585 dump_metadata(NULL, ch->metadata, " ");
3587 if(ic->nb_programs) {
3588 int j, k, total = 0;
3589 for(j=0; j<ic->nb_programs; j++) {
3590 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3592 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3593 name ? name->value : "");
3594 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3595 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3596 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3597 printed[ic->programs[j]->stream_index[k]] = 1;
3599 total += ic->programs[j]->nb_stream_indexes;
3601 if (total < ic->nb_streams)
3602 av_log(NULL, AV_LOG_INFO, " No Program\n");
3604 for(i=0;i<ic->nb_streams;i++)
3606 dump_stream_format(ic, i, index, is_output);
3611 int64_t av_gettime(void)
3614 gettimeofday(&tv,NULL);
3615 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3618 uint64_t ff_ntp_time(void)
3620 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3623 #if FF_API_PARSE_DATE
3624 #include "libavutil/parseutils.h"
3626 int64_t parse_date(const char *timestr, int duration)
3629 av_parse_time(&timeval, timestr, duration);
3634 #if FF_API_FIND_INFO_TAG
3635 #include "libavutil/parseutils.h"
3637 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3639 return av_find_info_tag(arg, arg_size, tag1, info);
3643 int av_get_frame_filename(char *buf, int buf_size,
3644 const char *path, int number)
3647 char *q, buf1[20], c;
3648 int nd, len, percentd_found;
3660 while (isdigit(*p)) {
3661 nd = nd * 10 + *p++ - '0';
3664 } while (isdigit(c));
3673 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3675 if ((q - buf + len) > buf_size - 1)
3677 memcpy(q, buf1, len);
3685 if ((q - buf) < buf_size - 1)
3689 if (!percentd_found)
3698 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3702 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3704 for(i=0;i<size;i+=16) {
3711 PRINT(" %02x", buf[i+j]);
3716 for(j=0;j<len;j++) {
3718 if (c < ' ' || c > '~')
3727 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3729 hex_dump_internal(NULL, f, 0, buf, size);
3732 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3734 hex_dump_internal(avcl, NULL, level, buf, size);
3737 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3740 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3741 PRINT("stream #%d:\n", pkt->stream_index);
3742 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3743 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3744 /* DTS is _always_ valid after av_read_frame() */
3746 if (pkt->dts == AV_NOPTS_VALUE)
3749 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3750 /* PTS may not be known if B-frames are present. */
3752 if (pkt->pts == AV_NOPTS_VALUE)
3755 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3757 PRINT(" size=%d\n", pkt->size);
3760 av_hex_dump(f, pkt->data, pkt->size);
3764 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3766 AVRational tb = { 1, AV_TIME_BASE };
3767 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3771 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3773 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3777 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3779 AVRational tb = { 1, AV_TIME_BASE };
3780 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3784 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3787 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3790 void av_url_split(char *proto, int proto_size,
3791 char *authorization, int authorization_size,
3792 char *hostname, int hostname_size,
3794 char *path, int path_size,
3797 const char *p, *ls, *at, *col, *brk;
3799 if (port_ptr) *port_ptr = -1;
3800 if (proto_size > 0) proto[0] = 0;
3801 if (authorization_size > 0) authorization[0] = 0;
3802 if (hostname_size > 0) hostname[0] = 0;
3803 if (path_size > 0) path[0] = 0;
3805 /* parse protocol */
3806 if ((p = strchr(url, ':'))) {
3807 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3812 /* no protocol means plain filename */
3813 av_strlcpy(path, url, path_size);
3817 /* separate path from hostname */
3818 ls = strchr(p, '/');
3820 ls = strchr(p, '?');
3822 av_strlcpy(path, ls, path_size);
3824 ls = &p[strlen(p)]; // XXX
3826 /* the rest is hostname, use that to parse auth/port */
3828 /* authorization (user[:pass]@hostname) */
3829 if ((at = strchr(p, '@')) && at < ls) {
3830 av_strlcpy(authorization, p,
3831 FFMIN(authorization_size, at + 1 - p));
3832 p = at + 1; /* skip '@' */
3835 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3837 av_strlcpy(hostname, p + 1,
3838 FFMIN(hostname_size, brk - p));
3839 if (brk[1] == ':' && port_ptr)
3840 *port_ptr = atoi(brk + 2);
3841 } else if ((col = strchr(p, ':')) && col < ls) {
3842 av_strlcpy(hostname, p,
3843 FFMIN(col + 1 - p, hostname_size));
3844 if (port_ptr) *port_ptr = atoi(col + 1);
3846 av_strlcpy(hostname, p,
3847 FFMIN(ls + 1 - p, hostname_size));
3851 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3854 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3857 'C', 'D', 'E', 'F' };
3858 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3861 'c', 'd', 'e', 'f' };
3862 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3864 for(i = 0; i < s; i++) {
3865 buff[i * 2] = hex_table[src[i] >> 4];
3866 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3872 int ff_hex_to_data(uint8_t *data, const char *p)
3879 p += strspn(p, SPACE_CHARS);
3882 c = toupper((unsigned char) *p++);
3883 if (c >= '0' && c <= '9')
3885 else if (c >= 'A' && c <= 'F')
3900 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3901 unsigned int pts_num, unsigned int pts_den)
3904 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3905 if(new_tb.num != pts_num)
3906 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3908 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3910 if(new_tb.num <= 0 || new_tb.den <= 0) {
3911 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3914 s->time_base = new_tb;
3915 s->pts_wrap_bits = pts_wrap_bits;
3918 int ff_url_join(char *str, int size, const char *proto,
3919 const char *authorization, const char *hostname,
3920 int port, const char *fmt, ...)
3923 struct addrinfo hints, *ai;
3928 av_strlcatf(str, size, "%s://", proto);
3929 if (authorization && authorization[0])
3930 av_strlcatf(str, size, "%s@", authorization);
3931 #if CONFIG_NETWORK && defined(AF_INET6)
3932 /* Determine if hostname is a numerical IPv6 address,
3933 * properly escape it within [] in that case. */
3934 memset(&hints, 0, sizeof(hints));
3935 hints.ai_flags = AI_NUMERICHOST;
3936 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3937 if (ai->ai_family == AF_INET6) {
3938 av_strlcat(str, "[", size);
3939 av_strlcat(str, hostname, size);
3940 av_strlcat(str, "]", size);
3942 av_strlcat(str, hostname, size);
3947 /* Not an IPv6 address, just output the plain string. */
3948 av_strlcat(str, hostname, size);
3951 av_strlcatf(str, size, ":%d", port);
3954 int len = strlen(str);
3957 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3963 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3964 AVFormatContext *src)
3969 local_pkt.stream_index = dst_stream;
3970 if (pkt->pts != AV_NOPTS_VALUE)
3971 local_pkt.pts = av_rescale_q(pkt->pts,
3972 src->streams[pkt->stream_index]->time_base,
3973 dst->streams[dst_stream]->time_base);
3974 if (pkt->dts != AV_NOPTS_VALUE)
3975 local_pkt.dts = av_rescale_q(pkt->dts,
3976 src->streams[pkt->stream_index]->time_base,
3977 dst->streams[dst_stream]->time_base);
3978 return av_write_frame(dst, &local_pkt);
3981 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3984 const char *ptr = str;
3986 /* Parse key=value pairs. */
3989 char *dest = NULL, *dest_end;
3990 int key_len, dest_len = 0;
3992 /* Skip whitespace and potential commas. */
3993 while (*ptr && (isspace(*ptr) || *ptr == ','))
4000 if (!(ptr = strchr(key, '=')))
4003 key_len = ptr - key;
4005 callback_get_buf(context, key, key_len, &dest, &dest_len);
4006 dest_end = dest + dest_len - 1;
4010 while (*ptr && *ptr != '\"') {
4014 if (dest && dest < dest_end)
4018 if (dest && dest < dest_end)
4026 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
4027 if (dest && dest < dest_end)
4035 int ff_find_stream_index(AVFormatContext *s, int id)
4038 for (i = 0; i < s->nb_streams; i++) {
4039 if (s->streams[i]->id == id)
4045 void ff_make_absolute_url(char *buf, int size, const char *base,
4049 /* Absolute path, relative to the current server */
4050 if (base && strstr(base, "://") && rel[0] == '/') {
4052 av_strlcpy(buf, base, size);
4053 sep = strstr(buf, "://");
4056 sep = strchr(sep, '/');
4060 av_strlcat(buf, rel, size);
4063 /* If rel actually is an absolute url, just copy it */
4064 if (!base || strstr(rel, "://") || rel[0] == '/') {
4065 av_strlcpy(buf, rel, size);
4069 av_strlcpy(buf, base, size);
4070 /* Remove the file name from the base url */
4071 sep = strrchr(buf, '/');
4076 while (av_strstart(rel, "../", NULL) && sep) {
4077 /* Remove the path delimiter at the end */
4079 sep = strrchr(buf, '/');
4080 /* If the next directory name to pop off is "..", break here */
4081 if (!strcmp(sep ? &sep[1] : buf, "..")) {
4082 /* Readd the slash we just removed */
4083 av_strlcat(buf, "/", size);
4086 /* Cut off the directory name */
4093 av_strlcat(buf, rel, size);
4096 int64_t ff_iso8601_to_unix_time(const char *datestr)
4099 struct tm time = {0};
4100 strptime(datestr, "%Y - %m - %dT%T", &time);
4101 return mktime(&time);
4103 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
4104 "the date string.\n");
4109 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
4112 if (ofmt->query_codec)
4113 return ofmt->query_codec(codec_id, std_compliance);
4114 else if (ofmt->codec_tag)
4115 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4116 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4117 codec_id == ofmt->subtitle_codec)
4120 return AVERROR_PATCHWELCOME;