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 if(pkt->stream_index >= (unsigned)s->nb_streams){
766 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
770 st= s->streams[pkt->stream_index];
772 switch(st->codec->codec_type){
773 case AVMEDIA_TYPE_VIDEO:
774 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
776 case AVMEDIA_TYPE_AUDIO:
777 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
779 case AVMEDIA_TYPE_SUBTITLE:
780 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
784 if(!pktl && st->request_probe <= 0)
787 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
788 s->raw_packet_buffer_remaining_size -= pkt->size;
790 if(st->request_probe>0){
791 AVProbeData *pd = &st->probe_data;
793 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
796 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
797 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
798 pd->buf_size += pkt->size;
799 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
801 end= s->raw_packet_buffer_remaining_size <= 0
802 || st->probe_packets<=0;
804 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
805 int score= set_codec_from_probe_data(s, st, pd);
806 if( (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
810 st->request_probe= -1;
811 if(st->codec->codec_id != CODEC_ID_NONE){
812 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
814 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
821 /**********************************************************/
824 * Get the number of samples of an audio frame. Return -1 on error.
826 static int get_audio_frame_size(AVCodecContext *enc, int size)
830 if(enc->codec_id == CODEC_ID_VORBIS)
833 if (enc->frame_size <= 1) {
834 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
836 if (bits_per_sample) {
837 if (enc->channels == 0)
839 frame_size = (size << 3) / (bits_per_sample * enc->channels);
841 /* used for example by ADPCM codecs */
842 if (enc->bit_rate == 0)
844 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
847 frame_size = enc->frame_size;
854 * Return the frame duration in seconds. Return 0 if not available.
856 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
857 AVCodecParserContext *pc, AVPacket *pkt)
863 switch(st->codec->codec_type) {
864 case AVMEDIA_TYPE_VIDEO:
865 if(st->time_base.num*1000LL > st->time_base.den){
866 *pnum = st->time_base.num;
867 *pden = st->time_base.den;
868 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
869 *pnum = st->codec->time_base.num;
870 *pden = st->codec->time_base.den;
871 if (pc && pc->repeat_pict) {
872 *pnum = (*pnum) * (1 + pc->repeat_pict);
874 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
875 //Thus if we have no parser in such case leave duration undefined.
876 if(st->codec->ticks_per_frame>1 && !pc){
881 case AVMEDIA_TYPE_AUDIO:
882 frame_size = get_audio_frame_size(st->codec, pkt->size);
883 if (frame_size <= 0 || st->codec->sample_rate <= 0)
886 *pden = st->codec->sample_rate;
893 static int is_intra_only(AVCodecContext *enc){
894 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
896 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
897 switch(enc->codec_id){
899 case CODEC_ID_MJPEGB:
901 case CODEC_ID_PRORES:
902 case CODEC_ID_RAWVIDEO:
903 case CODEC_ID_DVVIDEO:
904 case CODEC_ID_HUFFYUV:
905 case CODEC_ID_FFVHUFF:
910 case CODEC_ID_JPEG2000:
918 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
919 int64_t dts, int64_t pts)
921 AVStream *st= s->streams[stream_index];
922 AVPacketList *pktl= s->packet_buffer;
924 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
927 st->first_dts= dts - st->cur_dts;
930 for(; pktl; pktl= pktl->next){
931 if(pktl->pkt.stream_index != stream_index)
933 //FIXME think more about this check
934 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
935 pktl->pkt.pts += st->first_dts;
937 if(pktl->pkt.dts != AV_NOPTS_VALUE)
938 pktl->pkt.dts += st->first_dts;
940 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
941 st->start_time= pktl->pkt.pts;
943 if (st->start_time == AV_NOPTS_VALUE)
944 st->start_time = pts;
947 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
949 AVPacketList *pktl= s->packet_buffer;
952 if(st->first_dts != AV_NOPTS_VALUE){
953 cur_dts= st->first_dts;
954 for(; pktl; pktl= pktl->next){
955 if(pktl->pkt.stream_index == pkt->stream_index){
956 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
958 cur_dts -= pkt->duration;
961 pktl= s->packet_buffer;
962 st->first_dts = cur_dts;
963 }else if(st->cur_dts)
966 for(; pktl; pktl= pktl->next){
967 if(pktl->pkt.stream_index != pkt->stream_index)
969 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
970 && !pktl->pkt.duration){
971 pktl->pkt.dts= cur_dts;
972 if(!st->codec->has_b_frames)
973 pktl->pkt.pts= cur_dts;
974 cur_dts += pkt->duration;
975 pktl->pkt.duration= pkt->duration;
979 if(st->first_dts == AV_NOPTS_VALUE)
980 st->cur_dts= cur_dts;
983 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
984 AVCodecParserContext *pc, AVPacket *pkt)
986 int num, den, presentation_delayed, delay, i;
989 if (s->flags & AVFMT_FLAG_NOFILLIN)
992 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
993 pkt->dts= AV_NOPTS_VALUE;
995 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
996 //FIXME Set low_delay = 0 when has_b_frames = 1
997 st->codec->has_b_frames = 1;
999 /* do we have a video B-frame ? */
1000 delay= st->codec->has_b_frames;
1001 presentation_delayed = 0;
1003 // ignore delay caused by frame threading so that the mpeg2-without-dts
1004 // warning will not trigger
1005 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
1006 delay -= st->codec->thread_count-1;
1008 /* XXX: need has_b_frame, but cannot get it if the codec is
1011 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1012 presentation_delayed = 1;
1014 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){
1015 pkt->dts -= 1LL<<st->pts_wrap_bits;
1018 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
1019 // we take the conservative approach and discard both
1020 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
1021 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
1022 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1023 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
1026 if (pkt->duration == 0) {
1027 compute_frame_duration(&num, &den, st, pc, pkt);
1029 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1031 if(pkt->duration != 0 && s->packet_buffer)
1032 update_initial_durations(s, st, pkt);
1036 /* correct timestamps with byte offset if demuxers only have timestamps
1037 on packet boundaries */
1038 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1039 /* this will estimate bitrate based on this frame's duration and size */
1040 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1041 if(pkt->pts != AV_NOPTS_VALUE)
1043 if(pkt->dts != AV_NOPTS_VALUE)
1047 if (pc && pc->dts_sync_point >= 0) {
1048 // we have synchronization info from the parser
1049 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1051 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1052 if (pkt->dts != AV_NOPTS_VALUE) {
1053 // got DTS from the stream, update reference timestamp
1054 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1055 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1056 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1057 // compute DTS based on reference timestamp
1058 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1059 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1061 if (pc->dts_sync_point > 0)
1062 st->reference_dts = pkt->dts; // new reference
1066 /* This may be redundant, but it should not hurt. */
1067 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1068 presentation_delayed = 1;
1070 // 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);
1071 /* interpolate PTS and DTS if they are not present */
1072 //We skip H264 currently because delay and has_b_frames are not reliably set
1073 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1074 if (presentation_delayed) {
1075 /* DTS = decompression timestamp */
1076 /* PTS = presentation timestamp */
1077 if (pkt->dts == AV_NOPTS_VALUE)
1078 pkt->dts = st->last_IP_pts;
1079 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1080 if (pkt->dts == AV_NOPTS_VALUE)
1081 pkt->dts = st->cur_dts;
1083 /* this is tricky: the dts must be incremented by the duration
1084 of the frame we are displaying, i.e. the last I- or P-frame */
1085 if (st->last_IP_duration == 0)
1086 st->last_IP_duration = pkt->duration;
1087 if(pkt->dts != AV_NOPTS_VALUE)
1088 st->cur_dts = pkt->dts + st->last_IP_duration;
1089 st->last_IP_duration = pkt->duration;
1090 st->last_IP_pts= pkt->pts;
1091 /* cannot compute PTS if not present (we can compute it only
1092 by knowing the future */
1093 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1094 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1095 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1096 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1097 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1098 pkt->pts += pkt->duration;
1099 // 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);
1103 /* presentation is not delayed : PTS and DTS are the same */
1104 if(pkt->pts == AV_NOPTS_VALUE)
1105 pkt->pts = pkt->dts;
1106 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1107 if(pkt->pts == AV_NOPTS_VALUE)
1108 pkt->pts = st->cur_dts;
1109 pkt->dts = pkt->pts;
1110 if(pkt->pts != AV_NOPTS_VALUE)
1111 st->cur_dts = pkt->pts + pkt->duration;
1115 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1116 st->pts_buffer[0]= pkt->pts;
1117 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1118 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1119 if(pkt->dts == AV_NOPTS_VALUE)
1120 pkt->dts= st->pts_buffer[0];
1121 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1122 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1124 if(pkt->dts > st->cur_dts)
1125 st->cur_dts = pkt->dts;
1128 // 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);
1131 if(is_intra_only(st->codec))
1132 pkt->flags |= AV_PKT_FLAG_KEY;
1135 /* keyframe computation */
1136 if (pc->key_frame == 1)
1137 pkt->flags |= AV_PKT_FLAG_KEY;
1138 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1139 pkt->flags |= AV_PKT_FLAG_KEY;
1142 pkt->convergence_duration = pc->convergence_duration;
1146 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1151 av_init_packet(pkt);
1154 /* select current input stream component */
1157 if (!st->need_parsing || !st->parser) {
1158 /* no parsing needed: we just output the packet as is */
1159 /* raw data support */
1161 st->cur_pkt.data= NULL;
1162 st->cur_pkt.side_data_elems = 0;
1163 st->cur_pkt.side_data = NULL;
1164 compute_pkt_fields(s, st, NULL, pkt);
1166 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1167 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1168 ff_reduce_index(s, st->index);
1169 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1172 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1173 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1174 st->cur_ptr, st->cur_len,
1175 st->cur_pkt.pts, st->cur_pkt.dts,
1177 st->cur_pkt.pts = AV_NOPTS_VALUE;
1178 st->cur_pkt.dts = AV_NOPTS_VALUE;
1179 /* increment read pointer */
1183 /* return packet if any */
1187 pkt->stream_index = st->index;
1188 pkt->pts = st->parser->pts;
1189 pkt->dts = st->parser->dts;
1190 pkt->pos = st->parser->pos;
1191 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1193 pkt->destruct= st->cur_pkt.destruct;
1194 st->cur_pkt.destruct= NULL;
1195 st->cur_pkt.data = NULL;
1196 assert(st->cur_len == 0);
1198 pkt->destruct = NULL;
1200 compute_pkt_fields(s, st, st->parser, pkt);
1202 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1203 int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
1204 ff_reduce_index(s, st->index);
1205 av_add_index_entry(st, pos, pkt->dts,
1206 0, 0, AVINDEX_KEYFRAME);
1213 av_free_packet(&st->cur_pkt);
1218 /* read next packet */
1219 ret = av_read_packet(s, &cur_pkt);
1221 if (ret == AVERROR(EAGAIN))
1223 /* return the last frames, if any */
1224 for(i = 0; i < s->nb_streams; i++) {
1226 if (st->parser && st->need_parsing) {
1227 av_parser_parse2(st->parser, st->codec,
1228 &pkt->data, &pkt->size,
1230 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1236 /* no more packets: really terminate parsing */
1239 st = s->streams[cur_pkt.stream_index];
1240 st->cur_pkt= cur_pkt;
1242 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1243 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1244 st->cur_pkt.pts < st->cur_pkt.dts){
1245 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1246 st->cur_pkt.stream_index,
1250 // av_free_packet(&st->cur_pkt);
1254 if(s->debug & FF_FDEBUG_TS)
1255 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1256 st->cur_pkt.stream_index,
1260 st->cur_pkt.duration,
1264 st->cur_ptr = st->cur_pkt.data;
1265 st->cur_len = st->cur_pkt.size;
1266 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1267 st->parser = av_parser_init(st->codec->codec_id);
1269 av_log(s, AV_LOG_WARNING, "parser not found for codec "
1270 "%s, packets or times may be invalid.\n",
1271 avcodec_get_name(st->codec->codec_id));
1272 /* no parser available: just output the raw packets */
1273 st->need_parsing = AVSTREAM_PARSE_NONE;
1274 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1275 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1276 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1277 st->parser->flags |= PARSER_FLAG_ONCE;
1282 if(s->debug & FF_FDEBUG_TS)
1283 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1294 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1298 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1301 pktl = s->packet_buffer;
1303 AVPacket *next_pkt= &pktl->pkt;
1305 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1306 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1307 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1308 if( pktl->pkt.stream_index == next_pkt->stream_index
1309 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1310 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1311 next_pkt->pts= pktl->pkt.dts;
1315 pktl = s->packet_buffer;
1318 if( next_pkt->pts != AV_NOPTS_VALUE
1319 || next_pkt->dts == AV_NOPTS_VALUE
1321 /* read packet from packet buffer, if there is data */
1323 s->packet_buffer = pktl->next;
1329 int ret= read_frame_internal(s, pkt);
1331 if(pktl && ret != AVERROR(EAGAIN)){
1338 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1339 &s->packet_buffer_end)) < 0)
1340 return AVERROR(ENOMEM);
1342 assert(!s->packet_buffer);
1343 return read_frame_internal(s, pkt);
1348 /* XXX: suppress the packet queue */
1349 static void flush_packet_queue(AVFormatContext *s)
1354 pktl = s->packet_buffer;
1357 s->packet_buffer = pktl->next;
1358 av_free_packet(&pktl->pkt);
1361 while(s->raw_packet_buffer){
1362 pktl = s->raw_packet_buffer;
1363 s->raw_packet_buffer = pktl->next;
1364 av_free_packet(&pktl->pkt);
1367 s->packet_buffer_end=
1368 s->raw_packet_buffer_end= NULL;
1369 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1372 /*******************************************************/
1375 int av_find_default_stream_index(AVFormatContext *s)
1377 int first_audio_index = -1;
1381 if (s->nb_streams <= 0)
1383 for(i = 0; i < s->nb_streams; i++) {
1385 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1388 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1389 first_audio_index = i;
1391 return first_audio_index >= 0 ? first_audio_index : 0;
1395 * Flush the frame reader.
1397 void ff_read_frame_flush(AVFormatContext *s)
1402 flush_packet_queue(s);
1406 /* for each stream, reset read state */
1407 for(i = 0; i < s->nb_streams; i++) {
1411 av_parser_close(st->parser);
1413 av_free_packet(&st->cur_pkt);
1415 st->last_IP_pts = AV_NOPTS_VALUE;
1416 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1417 st->reference_dts = AV_NOPTS_VALUE;
1422 st->probe_packets = MAX_PROBE_PACKETS;
1424 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1425 st->pts_buffer[j]= AV_NOPTS_VALUE;
1429 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1432 for(i = 0; i < s->nb_streams; i++) {
1433 AVStream *st = s->streams[i];
1435 st->cur_dts = av_rescale(timestamp,
1436 st->time_base.den * (int64_t)ref_st->time_base.num,
1437 st->time_base.num * (int64_t)ref_st->time_base.den);
1441 void ff_reduce_index(AVFormatContext *s, int stream_index)
1443 AVStream *st= s->streams[stream_index];
1444 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1446 if((unsigned)st->nb_index_entries >= max_entries){
1448 for(i=0; 2*i<st->nb_index_entries; i++)
1449 st->index_entries[i]= st->index_entries[2*i];
1450 st->nb_index_entries= i;
1454 int ff_add_index_entry(AVIndexEntry **index_entries,
1455 int *nb_index_entries,
1456 unsigned int *index_entries_allocated_size,
1457 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1459 AVIndexEntry *entries, *ie;
1462 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1465 entries = av_fast_realloc(*index_entries,
1466 index_entries_allocated_size,
1467 (*nb_index_entries + 1) *
1468 sizeof(AVIndexEntry));
1472 *index_entries= entries;
1474 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1477 index= (*nb_index_entries)++;
1478 ie= &entries[index];
1479 assert(index==0 || ie[-1].timestamp < timestamp);
1481 ie= &entries[index];
1482 if(ie->timestamp != timestamp){
1483 if(ie->timestamp <= timestamp)
1485 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1486 (*nb_index_entries)++;
1487 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1488 distance= ie->min_distance;
1492 ie->timestamp = timestamp;
1493 ie->min_distance= distance;
1500 int av_add_index_entry(AVStream *st,
1501 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1503 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1504 &st->index_entries_allocated_size, pos,
1505 timestamp, size, distance, flags);
1508 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1509 int64_t wanted_timestamp, int flags)
1517 //optimize appending index entries at the end
1518 if(b && entries[b-1].timestamp < wanted_timestamp)
1523 timestamp = entries[m].timestamp;
1524 if(timestamp >= wanted_timestamp)
1526 if(timestamp <= wanted_timestamp)
1529 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1531 if(!(flags & AVSEEK_FLAG_ANY)){
1532 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1533 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1542 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1545 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1546 wanted_timestamp, flags);
1549 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1550 AVInputFormat *avif= s->iformat;
1551 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1552 int64_t ts_min, ts_max, ts;
1557 if (stream_index < 0)
1560 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1563 ts_min= AV_NOPTS_VALUE;
1564 pos_limit= -1; //gcc falsely says it may be uninitialized
1566 st= s->streams[stream_index];
1567 if(st->index_entries){
1570 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()
1571 index= FFMAX(index, 0);
1572 e= &st->index_entries[index];
1574 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1576 ts_min= e->timestamp;
1577 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1583 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1584 assert(index < st->nb_index_entries);
1586 e= &st->index_entries[index];
1587 assert(e->timestamp >= target_ts);
1589 ts_max= e->timestamp;
1590 pos_limit= pos_max - e->min_distance;
1591 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1592 pos_max,pos_limit, ts_max);
1596 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1601 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1604 av_update_cur_dts(s, st, ts);
1609 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 )){
1611 int64_t start_pos, filesize;
1614 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1616 if(ts_min == AV_NOPTS_VALUE){
1617 pos_min = s->data_offset;
1618 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1619 if (ts_min == AV_NOPTS_VALUE)
1623 if(ts_max == AV_NOPTS_VALUE){
1625 filesize = avio_size(s->pb);
1626 pos_max = filesize - 1;
1629 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1631 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1632 if (ts_max == AV_NOPTS_VALUE)
1636 int64_t tmp_pos= pos_max + 1;
1637 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1638 if(tmp_ts == AV_NOPTS_VALUE)
1642 if(tmp_pos >= filesize)
1648 if(ts_min > ts_max){
1650 }else if(ts_min == ts_max){
1655 while (pos_min < pos_limit) {
1656 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1657 pos_min, pos_max, ts_min, ts_max);
1658 assert(pos_limit <= pos_max);
1661 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1662 // interpolate position (better than dichotomy)
1663 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1664 + pos_min - approximate_keyframe_distance;
1665 }else if(no_change==1){
1666 // bisection, if interpolation failed to change min or max pos last time
1667 pos = (pos_min + pos_limit)>>1;
1669 /* linear search if bisection failed, can only happen if there
1670 are very few or no keyframes between min/max */
1675 else if(pos > pos_limit)
1679 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1684 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1685 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1686 pos_limit, start_pos, no_change);
1687 if(ts == AV_NOPTS_VALUE){
1688 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1691 assert(ts != AV_NOPTS_VALUE);
1692 if (target_ts <= ts) {
1693 pos_limit = start_pos - 1;
1697 if (target_ts >= ts) {
1703 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1704 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1706 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1708 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1709 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1710 pos, ts_min, target_ts, ts_max);
1715 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1716 int64_t pos_min, pos_max;
1720 if (stream_index < 0)
1723 st= s->streams[stream_index];
1726 pos_min = s->data_offset;
1727 pos_max = avio_size(s->pb) - 1;
1729 if (pos < pos_min) pos= pos_min;
1730 else if(pos > pos_max) pos= pos_max;
1732 avio_seek(s->pb, pos, SEEK_SET);
1735 av_update_cur_dts(s, st, ts);
1740 static int seek_frame_generic(AVFormatContext *s,
1741 int stream_index, int64_t timestamp, int flags)
1748 st = s->streams[stream_index];
1750 index = av_index_search_timestamp(st, timestamp, flags);
1752 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1755 if(index < 0 || index==st->nb_index_entries-1){
1759 if(st->nb_index_entries){
1760 assert(st->index_entries);
1761 ie= &st->index_entries[st->nb_index_entries-1];
1762 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1764 av_update_cur_dts(s, st, ie->timestamp);
1766 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1772 read_status = av_read_frame(s, &pkt);
1773 } while (read_status == AVERROR(EAGAIN));
1774 if (read_status < 0)
1776 av_free_packet(&pkt);
1777 if(stream_index == pkt.stream_index && pkt.dts > timestamp){
1778 if(pkt.flags & AV_PKT_FLAG_KEY)
1780 if(nonkey++ > 1000){
1781 av_log(s, AV_LOG_ERROR,"seek_frame_generic failed as this stream seems to contain no keyframes after the target timestamp, %d non keyframes found\n", nonkey);
1786 index = av_index_search_timestamp(st, timestamp, flags);
1791 ff_read_frame_flush(s);
1792 AV_NOWARN_DEPRECATED(
1793 if (s->iformat->read_seek){
1794 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1798 ie = &st->index_entries[index];
1799 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1801 av_update_cur_dts(s, st, ie->timestamp);
1806 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1811 ff_read_frame_flush(s);
1813 if(flags & AVSEEK_FLAG_BYTE)
1814 return seek_frame_byte(s, stream_index, timestamp, flags);
1816 if(stream_index < 0){
1817 stream_index= av_find_default_stream_index(s);
1818 if(stream_index < 0)
1821 st= s->streams[stream_index];
1822 /* timestamp for default must be expressed in AV_TIME_BASE units */
1823 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1826 /* first, we try the format specific seek */
1827 AV_NOWARN_DEPRECATED(
1828 if (s->iformat->read_seek)
1829 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1837 if(s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH))
1838 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1839 else if (!(s->iformat->flags & AVFMT_NOGENSEARCH))
1840 return seek_frame_generic(s, stream_index, timestamp, flags);
1845 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1847 if(min_ts > ts || max_ts < ts)
1850 ff_read_frame_flush(s);
1852 if (s->iformat->read_seek2)
1853 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1855 if(s->iformat->read_timestamp){
1856 //try to seek via read_timestamp()
1859 //Fallback to old API if new is not implemented but old is
1860 //Note the old has somewat different sematics
1861 AV_NOWARN_DEPRECATED(
1862 if(s->iformat->read_seek || 1)
1863 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1866 // try some generic seek like seek_frame_generic() but with new ts semantics
1869 /*******************************************************/
1872 * Return TRUE if the stream has accurate duration in any stream.
1874 * @return TRUE if the stream has accurate duration for at least one component.
1876 static int has_duration(AVFormatContext *ic)
1880 if(ic->duration != AV_NOPTS_VALUE)
1883 for(i = 0;i < ic->nb_streams; i++) {
1884 st = ic->streams[i];
1885 if (st->duration != AV_NOPTS_VALUE)
1892 * Estimate the stream timings from the one of each components.
1894 * Also computes the global bitrate if possible.
1896 static void update_stream_timings(AVFormatContext *ic)
1898 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1899 int64_t duration, duration1;
1903 start_time = INT64_MAX;
1904 start_time_text = INT64_MAX;
1905 end_time = INT64_MIN;
1906 duration = INT64_MIN;
1907 for(i = 0;i < ic->nb_streams; i++) {
1908 st = ic->streams[i];
1909 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1910 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1911 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1912 if (start_time1 < start_time_text)
1913 start_time_text = start_time1;
1915 if (start_time1 < start_time)
1916 start_time = start_time1;
1917 if (st->duration != AV_NOPTS_VALUE) {
1918 end_time1 = start_time1
1919 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1920 if (end_time1 > end_time)
1921 end_time = end_time1;
1924 if (st->duration != AV_NOPTS_VALUE) {
1925 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1926 if (duration1 > duration)
1927 duration = duration1;
1930 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
1931 start_time = start_time_text;
1932 if (start_time != INT64_MAX) {
1933 ic->start_time = start_time;
1934 if (end_time != INT64_MIN) {
1935 if (end_time - start_time > duration)
1936 duration = end_time - start_time;
1939 if (duration != INT64_MIN && ic->duration == AV_NOPTS_VALUE) {
1940 ic->duration = duration;
1942 if (ic->file_size > 0 && ic->duration != AV_NOPTS_VALUE) {
1943 /* compute the bitrate */
1944 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1945 (double)ic->duration;
1949 static void fill_all_stream_timings(AVFormatContext *ic)
1954 update_stream_timings(ic);
1955 for(i = 0;i < ic->nb_streams; i++) {
1956 st = ic->streams[i];
1957 if (st->start_time == AV_NOPTS_VALUE) {
1958 if(ic->start_time != AV_NOPTS_VALUE)
1959 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1960 if(ic->duration != AV_NOPTS_VALUE)
1961 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1966 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
1968 int64_t filesize, duration;
1972 /* if bit_rate is already set, we believe it */
1973 if (ic->bit_rate <= 0) {
1975 for(i=0;i<ic->nb_streams;i++) {
1976 st = ic->streams[i];
1977 if (st->codec->bit_rate > 0)
1978 bit_rate += st->codec->bit_rate;
1980 ic->bit_rate = bit_rate;
1983 /* if duration is already set, we believe it */
1984 if (ic->duration == AV_NOPTS_VALUE &&
1985 ic->bit_rate != 0 &&
1986 ic->file_size != 0) {
1987 filesize = ic->file_size;
1989 for(i = 0; i < ic->nb_streams; i++) {
1990 st = ic->streams[i];
1991 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1992 if (st->duration == AV_NOPTS_VALUE)
1993 st->duration = duration;
1999 #define DURATION_MAX_READ_SIZE 250000
2000 #define DURATION_MAX_RETRY 3
2002 /* only usable for MPEG-PS streams */
2003 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2005 AVPacket pkt1, *pkt = &pkt1;
2007 int read_size, i, ret;
2009 int64_t filesize, offset, duration;
2014 /* flush packet queue */
2015 flush_packet_queue(ic);
2017 for (i=0; i<ic->nb_streams; i++) {
2018 st = ic->streams[i];
2019 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
2020 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2023 av_parser_close(st->parser);
2025 av_free_packet(&st->cur_pkt);
2029 /* estimate the end time (duration) */
2030 /* XXX: may need to support wrapping */
2031 filesize = ic->file_size;
2032 end_time = AV_NOPTS_VALUE;
2034 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2038 avio_seek(ic->pb, offset, SEEK_SET);
2041 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2045 ret = av_read_packet(ic, pkt);
2046 } while(ret == AVERROR(EAGAIN));
2049 read_size += pkt->size;
2050 st = ic->streams[pkt->stream_index];
2051 if (pkt->pts != AV_NOPTS_VALUE &&
2052 (st->start_time != AV_NOPTS_VALUE ||
2053 st->first_dts != AV_NOPTS_VALUE)) {
2054 duration = end_time = pkt->pts;
2055 if (st->start_time != AV_NOPTS_VALUE)
2056 duration -= st->start_time;
2058 duration -= st->first_dts;
2060 duration += 1LL<<st->pts_wrap_bits;
2062 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2063 st->duration = duration;
2066 av_free_packet(pkt);
2068 }while( end_time==AV_NOPTS_VALUE
2069 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2070 && ++retry <= DURATION_MAX_RETRY);
2072 fill_all_stream_timings(ic);
2074 avio_seek(ic->pb, old_offset, SEEK_SET);
2075 for (i=0; i<ic->nb_streams; i++) {
2077 st->cur_dts= st->first_dts;
2078 st->last_IP_pts = AV_NOPTS_VALUE;
2079 st->reference_dts = AV_NOPTS_VALUE;
2083 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2087 /* get the file size, if possible */
2088 if (ic->iformat->flags & AVFMT_NOFILE) {
2091 file_size = avio_size(ic->pb);
2095 ic->file_size = file_size;
2097 if ((!strcmp(ic->iformat->name, "mpeg") ||
2098 !strcmp(ic->iformat->name, "mpegts")) &&
2099 file_size && ic->pb->seekable) {
2100 /* get accurate estimate from the PTSes */
2101 estimate_timings_from_pts(ic, old_offset);
2102 } else if (has_duration(ic)) {
2103 /* at least one component has timings - we use them for all
2105 fill_all_stream_timings(ic);
2107 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2108 /* less precise: use bitrate info */
2109 estimate_timings_from_bit_rate(ic);
2111 update_stream_timings(ic);
2115 AVStream av_unused *st;
2116 for(i = 0;i < ic->nb_streams; i++) {
2117 st = ic->streams[i];
2118 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2119 (double) st->start_time / AV_TIME_BASE,
2120 (double) st->duration / AV_TIME_BASE);
2122 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2123 (double) ic->start_time / AV_TIME_BASE,
2124 (double) ic->duration / AV_TIME_BASE,
2125 ic->bit_rate / 1000);
2129 static int has_codec_parameters(AVCodecContext *avctx)
2132 switch (avctx->codec_type) {
2133 case AVMEDIA_TYPE_AUDIO:
2134 val = avctx->sample_rate && avctx->channels && avctx->sample_fmt != AV_SAMPLE_FMT_NONE;
2135 if (!avctx->frame_size &&
2136 (avctx->codec_id == CODEC_ID_VORBIS ||
2137 avctx->codec_id == CODEC_ID_AAC ||
2138 avctx->codec_id == CODEC_ID_MP1 ||
2139 avctx->codec_id == CODEC_ID_MP2 ||
2140 avctx->codec_id == CODEC_ID_MP3 ||
2141 avctx->codec_id == CODEC_ID_SPEEX ||
2142 avctx->codec_id == CODEC_ID_CELT))
2145 case AVMEDIA_TYPE_VIDEO:
2146 val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
2148 case AVMEDIA_TYPE_DATA:
2149 if(avctx->codec_id == CODEC_ID_NONE) return 1;
2154 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2157 static int has_decode_delay_been_guessed(AVStream *st)
2159 return st->codec->codec_id != CODEC_ID_H264 ||
2160 st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2163 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2167 int got_picture, data_size, ret=0;
2170 if(!st->codec->codec){
2171 codec = avcodec_find_decoder(st->codec->codec_id);
2174 ret = avcodec_open2(st->codec, codec, options);
2179 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st) ||
2180 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF)) {
2181 switch(st->codec->codec_type) {
2182 case AVMEDIA_TYPE_VIDEO:
2183 avcodec_get_frame_defaults(&picture);
2184 ret = avcodec_decode_video2(st->codec, &picture,
2185 &got_picture, avpkt);
2187 case AVMEDIA_TYPE_AUDIO:
2188 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2189 samples = av_malloc(data_size);
2192 ret = avcodec_decode_audio3(st->codec, samples,
2204 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2206 while (tags->id != CODEC_ID_NONE) {
2214 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2217 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2218 if(tag == tags[i].tag)
2221 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2222 if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2225 return CODEC_ID_NONE;
2228 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2231 for(i=0; tags && tags[i]; i++){
2232 int tag= ff_codec_get_tag(tags[i], id);
2238 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2241 for(i=0; tags && tags[i]; i++){
2242 enum CodecID id= ff_codec_get_id(tags[i], tag);
2243 if(id!=CODEC_ID_NONE) return id;
2245 return CODEC_ID_NONE;
2248 static void compute_chapters_end(AVFormatContext *s)
2251 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2253 for (i = 0; i < s->nb_chapters; i++)
2254 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2255 AVChapter *ch = s->chapters[i];
2256 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2259 for (j = 0; j < s->nb_chapters; j++) {
2260 AVChapter *ch1 = s->chapters[j];
2261 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2262 if (j != i && next_start > ch->start && next_start < end)
2265 ch->end = (end == INT64_MAX) ? ch->start : end;
2269 static int get_std_framerate(int i){
2270 if(i<60*12) return i*1001;
2271 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2275 * Is the time base unreliable.
2276 * This is a heuristic to balance between quick acceptance of the values in
2277 * the headers vs. some extra checks.
2278 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2279 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2280 * And there are "variable" fps files this needs to detect as well.
2282 static int tb_unreliable(AVCodecContext *c){
2283 if( c->time_base.den >= 101L*c->time_base.num
2284 || c->time_base.den < 5L*c->time_base.num
2285 /* || c->codec_tag == AV_RL32("DIVX")
2286 || c->codec_tag == AV_RL32("XVID")*/
2287 || c->codec_id == CODEC_ID_MPEG2VIDEO
2288 || c->codec_id == CODEC_ID_H264
2294 #if FF_API_FORMAT_PARAMETERS
2295 int av_find_stream_info(AVFormatContext *ic)
2297 return avformat_find_stream_info(ic, NULL);
2301 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2303 int i, count, ret, read_size, j;
2305 AVPacket pkt1, *pkt;
2306 int64_t old_offset = avio_tell(ic->pb);
2307 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2309 for(i=0;i<ic->nb_streams;i++) {
2311 st = ic->streams[i];
2313 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2314 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2315 /* if(!st->time_base.num)
2317 if(!st->codec->time_base.num)
2318 st->codec->time_base= st->time_base;
2320 //only for the split stuff
2321 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2322 st->parser = av_parser_init(st->codec->codec_id);
2323 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2324 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2327 assert(!st->codec->codec);
2328 codec = avcodec_find_decoder(st->codec->codec_id);
2330 /* Ensure that subtitle_header is properly set. */
2331 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2332 && codec && !st->codec->codec)
2333 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2335 //try to just open decoders, in case this is enough to get parameters
2336 if(!has_codec_parameters(st->codec)){
2337 if (codec && !st->codec->codec){
2338 AVDictionary *tmp = NULL;
2340 av_dict_copy(&tmp, options[i], 0);
2341 av_dict_set(&tmp, "threads", 0, 0);
2343 avcodec_open2(st->codec, codec, options ? &tmp : NULL);
2349 for (i=0; i<ic->nb_streams; i++) {
2350 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2356 if(url_interrupt_cb()){
2358 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2362 /* check if one codec still needs to be handled */
2363 for(i=0;i<ic->nb_streams;i++) {
2364 int fps_analyze_framecount = 20;
2366 st = ic->streams[i];
2367 if (!has_codec_parameters(st->codec))
2369 /* if the timebase is coarse (like the usual millisecond precision
2370 of mkv), we need to analyze more frames to reliably arrive at
2372 if (av_q2d(st->time_base) > 0.0005)
2373 fps_analyze_framecount *= 2;
2374 if (ic->fps_probe_size >= 0)
2375 fps_analyze_framecount = ic->fps_probe_size;
2376 /* variable fps and no guess at the real fps */
2377 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2378 && st->info->duration_count < fps_analyze_framecount
2379 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2381 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2383 if(st->first_dts == AV_NOPTS_VALUE && (st->codec->codec_type == AVMEDIA_TYPE_VIDEO || st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2386 if (i == ic->nb_streams) {
2387 /* NOTE: if the format has no header, then we need to read
2388 some packets to get most of the streams, so we cannot
2390 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2391 /* if we found the info for all the codecs, we can stop */
2393 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2397 /* we did not get all the codec info, but we read too much data */
2398 if (read_size >= ic->probesize) {
2400 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2404 /* NOTE: a new stream can be added there if no header in file
2405 (AVFMTCTX_NOHEADER) */
2406 ret = read_frame_internal(ic, &pkt1);
2407 if (ret == AVERROR(EAGAIN))
2412 ret = -1; /* we could not have all the codec parameters before EOF */
2413 for(i=0;i<ic->nb_streams;i++) {
2414 st = ic->streams[i];
2415 if (!has_codec_parameters(st->codec)){
2417 avcodec_string(buf, sizeof(buf), st->codec, 0);
2418 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2426 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2427 if ((ret = av_dup_packet(pkt)) < 0)
2428 goto find_stream_info_err;
2430 read_size += pkt->size;
2432 st = ic->streams[pkt->stream_index];
2433 if (st->codec_info_nb_frames>1) {
2435 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) {
2436 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2439 st->info->codec_info_duration += pkt->duration;
2442 int64_t last = st->info->last_dts;
2444 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2445 double dts= pkt->dts * av_q2d(st->time_base);
2446 int64_t duration= pkt->dts - last;
2448 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2449 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2450 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) {
2451 int framerate= get_std_framerate(i);
2452 double sdts= dts*framerate/(1001*12);
2454 int ticks= lrintf(sdts+j*0.5);
2455 double error= sdts - ticks + j*0.5;
2456 st->info->duration_error[j][0][i] += error;
2457 st->info->duration_error[j][1][i] += error*error;
2460 st->info->duration_count++;
2461 // ignore the first 4 values, they might have some random jitter
2462 if (st->info->duration_count > 3)
2463 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2465 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2466 st->info->last_dts = pkt->dts;
2468 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2469 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2471 st->codec->extradata_size= i;
2472 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2473 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2474 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2478 /* if still no information, we try to open the codec and to
2479 decompress the frame. We try to avoid that in most cases as
2480 it takes longer and uses more memory. For MPEG-4, we need to
2481 decompress for QuickTime.
2483 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2484 least one frame of codec data, this makes sure the codec initializes
2485 the channel configuration and does not only trust the values from the container.
2487 try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
2489 st->codec_info_nb_frames++;
2493 // close codecs which were opened in try_decode_frame()
2494 for(i=0;i<ic->nb_streams;i++) {
2495 st = ic->streams[i];
2496 if(st->codec->codec)
2497 avcodec_close(st->codec);
2499 for(i=0;i<ic->nb_streams;i++) {
2500 st = ic->streams[i];
2501 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2502 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2503 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2504 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2505 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2506 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2507 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2508 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2509 st->codec->codec_tag= tag;
2512 // the check for tb_unreliable() is not completely correct, since this is not about handling
2513 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2514 // ipmovie.c produces.
2515 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)
2516 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);
2517 if (st->info->duration_count && !st->r_frame_rate.num
2518 && tb_unreliable(st->codec) /*&&
2519 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2520 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2522 double best_error= 0.01;
2524 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) {
2527 if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2530 int n= st->info->duration_count;
2531 double a= st->info->duration_error[k][0][j] / n;
2532 double error= st->info->duration_error[k][1][j]/n - a*a;
2534 if(error < best_error && best_error> 0.000000001){
2536 num = get_std_framerate(j);
2539 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2542 // do not increase frame rate by more than 1 % in order to match a standard rate.
2543 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2544 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2547 if (!st->r_frame_rate.num){
2548 if( st->codec->time_base.den * (int64_t)st->time_base.num
2549 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2550 st->r_frame_rate.num = st->codec->time_base.den;
2551 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2553 st->r_frame_rate.num = st->time_base.den;
2554 st->r_frame_rate.den = st->time_base.num;
2557 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2558 if(!st->codec->bits_per_coded_sample)
2559 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2560 // set stream disposition based on audio service type
2561 switch (st->codec->audio_service_type) {
2562 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2563 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2564 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2565 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2566 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2567 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2568 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2569 st->disposition = AV_DISPOSITION_COMMENT; break;
2570 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2571 st->disposition = AV_DISPOSITION_KARAOKE; break;
2576 estimate_timings(ic, old_offset);
2578 compute_chapters_end(ic);
2581 /* correct DTS for B-frame streams with no timestamps */
2582 for(i=0;i<ic->nb_streams;i++) {
2583 st = ic->streams[i];
2584 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2586 ppktl = &ic->packet_buffer;
2588 if(ppkt1->stream_index != i)
2590 if(ppkt1->pkt->dts < 0)
2592 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2594 ppkt1->pkt->dts -= delta;
2599 st->cur_dts -= delta;
2605 find_stream_info_err:
2606 for (i=0; i < ic->nb_streams; i++)
2607 av_freep(&ic->streams[i]->info);
2611 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2615 for (i = 0; i < ic->nb_programs; i++) {
2616 if (ic->programs[i] == last) {
2620 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2621 if (ic->programs[i]->stream_index[j] == s)
2622 return ic->programs[i];
2628 int av_find_best_stream(AVFormatContext *ic,
2629 enum AVMediaType type,
2630 int wanted_stream_nb,
2632 AVCodec **decoder_ret,
2635 int i, nb_streams = ic->nb_streams;
2636 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2637 unsigned *program = NULL;
2638 AVCodec *decoder = NULL, *best_decoder = NULL;
2640 if (related_stream >= 0 && wanted_stream_nb < 0) {
2641 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2643 program = p->stream_index;
2644 nb_streams = p->nb_stream_indexes;
2647 for (i = 0; i < nb_streams; i++) {
2648 int real_stream_index = program ? program[i] : i;
2649 AVStream *st = ic->streams[real_stream_index];
2650 AVCodecContext *avctx = st->codec;
2651 if (avctx->codec_type != type)
2653 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2655 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2658 decoder = avcodec_find_decoder(st->codec->codec_id);
2661 ret = AVERROR_DECODER_NOT_FOUND;
2665 if (best_count >= st->codec_info_nb_frames)
2667 best_count = st->codec_info_nb_frames;
2668 ret = real_stream_index;
2669 best_decoder = decoder;
2670 if (program && i == nb_streams - 1 && ret < 0) {
2672 nb_streams = ic->nb_streams;
2673 i = 0; /* no related stream found, try again with everything */
2677 *decoder_ret = best_decoder;
2681 /*******************************************************/
2683 int av_read_play(AVFormatContext *s)
2685 if (s->iformat->read_play)
2686 return s->iformat->read_play(s);
2688 return avio_pause(s->pb, 0);
2689 return AVERROR(ENOSYS);
2692 int av_read_pause(AVFormatContext *s)
2694 if (s->iformat->read_pause)
2695 return s->iformat->read_pause(s);
2697 return avio_pause(s->pb, 1);
2698 return AVERROR(ENOSYS);
2701 void av_close_input_stream(AVFormatContext *s)
2703 flush_packet_queue(s);
2704 if (s->iformat->read_close)
2705 s->iformat->read_close(s);
2706 avformat_free_context(s);
2709 void avformat_free_context(AVFormatContext *s)
2715 if (s->iformat && s->iformat->priv_class && s->priv_data)
2716 av_opt_free(s->priv_data);
2718 for(i=0;i<s->nb_streams;i++) {
2719 /* free all data in a stream component */
2722 av_parser_close(st->parser);
2723 av_free_packet(&st->cur_pkt);
2725 av_dict_free(&st->metadata);
2726 av_freep(&st->index_entries);
2727 av_freep(&st->codec->extradata);
2728 av_freep(&st->codec->subtitle_header);
2729 av_freep(&st->codec);
2730 av_freep(&st->priv_data);
2731 av_freep(&st->info);
2734 for(i=s->nb_programs-1; i>=0; i--) {
2735 av_dict_free(&s->programs[i]->metadata);
2736 av_freep(&s->programs[i]->stream_index);
2737 av_freep(&s->programs[i]);
2739 av_freep(&s->programs);
2740 av_freep(&s->priv_data);
2741 while(s->nb_chapters--) {
2742 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2743 av_freep(&s->chapters[s->nb_chapters]);
2745 av_freep(&s->chapters);
2746 av_dict_free(&s->metadata);
2747 av_freep(&s->streams);
2751 void av_close_input_file(AVFormatContext *s)
2753 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2755 av_close_input_stream(s);
2760 AVStream *av_new_stream(AVFormatContext *s, int id)
2766 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2768 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2771 s->streams = streams;
2773 st = av_mallocz(sizeof(AVStream));
2776 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2781 st->codec = avcodec_alloc_context3(NULL);
2783 /* no default bitrate if decoding */
2784 st->codec->bit_rate = 0;
2786 st->index = s->nb_streams;
2788 st->start_time = AV_NOPTS_VALUE;
2789 st->duration = AV_NOPTS_VALUE;
2790 /* we set the current DTS to 0 so that formats without any timestamps
2791 but durations get some timestamps, formats with some unknown
2792 timestamps have their first few packets buffered and the
2793 timestamps corrected before they are returned to the user */
2795 st->first_dts = AV_NOPTS_VALUE;
2796 st->probe_packets = MAX_PROBE_PACKETS;
2798 /* default pts setting is MPEG-like */
2799 av_set_pts_info(st, 33, 1, 90000);
2800 st->last_IP_pts = AV_NOPTS_VALUE;
2801 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2802 st->pts_buffer[i]= AV_NOPTS_VALUE;
2803 st->reference_dts = AV_NOPTS_VALUE;
2805 st->sample_aspect_ratio = (AVRational){0,1};
2807 s->streams[s->nb_streams++] = st;
2811 AVProgram *av_new_program(AVFormatContext *ac, int id)
2813 AVProgram *program=NULL;
2816 av_dlog(ac, "new_program: id=0x%04x\n", id);
2818 for(i=0; i<ac->nb_programs; i++)
2819 if(ac->programs[i]->id == id)
2820 program = ac->programs[i];
2823 program = av_mallocz(sizeof(AVProgram));
2826 dynarray_add(&ac->programs, &ac->nb_programs, program);
2827 program->discard = AVDISCARD_NONE;
2834 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2836 AVChapter *chapter = NULL;
2839 for(i=0; i<s->nb_chapters; i++)
2840 if(s->chapters[i]->id == id)
2841 chapter = s->chapters[i];
2844 chapter= av_mallocz(sizeof(AVChapter));
2847 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2849 av_dict_set(&chapter->metadata, "title", title, 0);
2851 chapter->time_base= time_base;
2852 chapter->start = start;
2858 /************************************************************/
2859 /* output media file */
2861 #if FF_API_FORMAT_PARAMETERS
2862 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2864 if (s->oformat->priv_data_size > 0) {
2865 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2867 return AVERROR(ENOMEM);
2868 if (s->oformat->priv_class) {
2869 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2870 av_opt_set_defaults(s->priv_data);
2873 s->priv_data = NULL;
2879 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
2880 const char *format, const char *filename)
2882 AVFormatContext *s = avformat_alloc_context();
2891 oformat = av_guess_format(format, NULL, NULL);
2893 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
2894 ret = AVERROR(EINVAL);
2898 oformat = av_guess_format(NULL, filename, NULL);
2900 ret = AVERROR(EINVAL);
2901 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
2908 s->oformat = oformat;
2909 if (s->oformat->priv_data_size > 0) {
2910 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2913 if (s->oformat->priv_class) {
2914 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2915 av_opt_set_defaults(s->priv_data);
2918 s->priv_data = NULL;
2921 av_strlcpy(s->filename, filename, sizeof(s->filename));
2925 av_log(s, AV_LOG_ERROR, "Out of memory\n");
2926 ret = AVERROR(ENOMEM);
2928 avformat_free_context(s);
2932 #if FF_API_ALLOC_OUTPUT_CONTEXT
2933 AVFormatContext *avformat_alloc_output_context(const char *format,
2934 AVOutputFormat *oformat, const char *filename)
2936 AVFormatContext *avctx;
2937 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
2938 return ret < 0 ? NULL : avctx;
2942 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2944 const AVCodecTag *avctag;
2946 enum CodecID id = CODEC_ID_NONE;
2947 unsigned int tag = 0;
2950 * Check that tag + id is in the table
2951 * If neither is in the table -> OK
2952 * If tag is in the table with another id -> FAIL
2953 * If id is in the table with another tag -> FAIL unless strict < normal
2955 for (n = 0; s->oformat->codec_tag[n]; n++) {
2956 avctag = s->oformat->codec_tag[n];
2957 while (avctag->id != CODEC_ID_NONE) {
2958 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2960 if (id == st->codec->codec_id)
2963 if (avctag->id == st->codec->codec_id)
2968 if (id != CODEC_ID_NONE)
2970 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2975 #if FF_API_FORMAT_PARAMETERS
2976 int av_write_header(AVFormatContext *s)
2978 return avformat_write_header(s, NULL);
2982 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2986 AVDictionary *tmp = NULL;
2989 av_dict_copy(&tmp, *options, 0);
2990 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2992 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
2993 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2996 // some sanity checks
2997 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2998 av_log(s, AV_LOG_ERROR, "no streams\n");
2999 ret = AVERROR(EINVAL);
3003 for(i=0;i<s->nb_streams;i++) {
3006 switch (st->codec->codec_type) {
3007 case AVMEDIA_TYPE_AUDIO:
3008 if(st->codec->sample_rate<=0){
3009 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
3010 ret = AVERROR(EINVAL);
3013 if(!st->codec->block_align)
3014 st->codec->block_align = st->codec->channels *
3015 av_get_bits_per_sample(st->codec->codec_id) >> 3;
3017 case AVMEDIA_TYPE_VIDEO:
3018 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
3019 av_log(s, AV_LOG_ERROR, "time base not set\n");
3020 ret = AVERROR(EINVAL);
3023 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
3024 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
3025 ret = AVERROR(EINVAL);
3028 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
3029 && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
3031 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
3032 ret = AVERROR(EINVAL);
3038 if(s->oformat->codec_tag){
3039 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)){
3040 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
3041 st->codec->codec_tag= 0;
3043 if(st->codec->codec_tag){
3044 if (!validate_codec_tag(s, st)) {
3046 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
3047 av_log(s, AV_LOG_ERROR,
3048 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
3049 tagbuf, st->codec->codec_tag, st->codec->codec_id);
3050 ret = AVERROR_INVALIDDATA;
3054 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3057 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3058 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3059 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3062 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3063 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3064 if (!s->priv_data) {
3065 ret = AVERROR(ENOMEM);
3068 if (s->oformat->priv_class) {
3069 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3070 av_opt_set_defaults(s->priv_data);
3071 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3076 /* set muxer identification string */
3077 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3078 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3081 if(s->oformat->write_header){
3082 ret = s->oformat->write_header(s);
3087 /* init PTS generation */
3088 for(i=0;i<s->nb_streams;i++) {
3089 int64_t den = AV_NOPTS_VALUE;
3092 switch (st->codec->codec_type) {
3093 case AVMEDIA_TYPE_AUDIO:
3094 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3096 case AVMEDIA_TYPE_VIDEO:
3097 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3102 if (den != AV_NOPTS_VALUE) {
3104 ret = AVERROR_INVALIDDATA;
3107 frac_init(&st->pts, 0, 0, den);
3112 av_dict_free(options);
3121 //FIXME merge with compute_pkt_fields
3122 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3123 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3124 int num, den, frame_size, i;
3126 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3127 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3129 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
3130 return AVERROR(EINVAL);*/
3132 /* duration field */
3133 if (pkt->duration == 0) {
3134 compute_frame_duration(&num, &den, st, NULL, pkt);
3136 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3140 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3143 //XXX/FIXME this is a temporary hack until all encoders output pts
3144 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3146 // pkt->pts= st->cur_dts;
3147 pkt->pts= st->pts.val;
3150 //calculate dts from pts
3151 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3152 st->pts_buffer[0]= pkt->pts;
3153 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3154 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3155 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3156 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3158 pkt->dts= st->pts_buffer[0];
3161 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)){
3162 av_log(s, AV_LOG_ERROR,
3163 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3164 st->index, st->cur_dts, pkt->dts);
3165 return AVERROR(EINVAL);
3167 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3168 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3169 return AVERROR(EINVAL);
3172 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3173 st->cur_dts= pkt->dts;
3174 st->pts.val= pkt->dts;
3177 switch (st->codec->codec_type) {
3178 case AVMEDIA_TYPE_AUDIO:
3179 frame_size = get_audio_frame_size(st->codec, pkt->size);
3181 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3182 likely equal to the encoder delay, but it would be better if we
3183 had the real timestamps from the encoder */
3184 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3185 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3188 case AVMEDIA_TYPE_VIDEO:
3189 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3197 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3199 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3201 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3204 ret= s->oformat->write_packet(s, pkt);
3207 s->streams[pkt->stream_index]->nb_frames++;
3211 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3212 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3214 AVPacketList **next_point, *this_pktl;
3216 this_pktl = av_mallocz(sizeof(AVPacketList));
3217 this_pktl->pkt= *pkt;
3218 pkt->destruct= NULL; // do not free original but only the copy
3219 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3221 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3222 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3224 next_point = &s->packet_buffer;
3227 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3228 while(!compare(s, &(*next_point)->pkt, pkt)){
3229 next_point= &(*next_point)->next;
3233 next_point = &(s->packet_buffer_end->next);
3236 assert(!*next_point);
3238 s->packet_buffer_end= this_pktl;
3241 this_pktl->next= *next_point;
3243 s->streams[pkt->stream_index]->last_in_packet_buffer=
3244 *next_point= this_pktl;
3247 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3249 AVStream *st = s->streams[ pkt ->stream_index];
3250 AVStream *st2= s->streams[ next->stream_index];
3251 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3255 return pkt->stream_index < next->stream_index;
3259 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3261 int stream_count=0, noninterleaved_count=0;
3262 int64_t delta_dts_max = 0;
3266 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3269 for(i=0; i < s->nb_streams; i++) {
3270 if (s->streams[i]->last_in_packet_buffer) {
3272 } else if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3273 ++noninterleaved_count;
3277 if (s->nb_streams == stream_count) {
3280 for(i=0; i < s->nb_streams; i++) {
3281 if (s->streams[i]->last_in_packet_buffer) {
3283 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
3284 s->streams[i]->time_base,
3286 av_rescale_q(s->packet_buffer->pkt.dts,
3287 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
3289 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
3292 if(s->nb_streams == stream_count+noninterleaved_count &&
3293 delta_dts_max > 20*AV_TIME_BASE) {
3294 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
3298 if(stream_count && flush){
3299 pktl= s->packet_buffer;
3302 s->packet_buffer= pktl->next;
3303 if(!s->packet_buffer)
3304 s->packet_buffer_end= NULL;
3306 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3307 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3311 av_init_packet(out);
3317 * Interleave an AVPacket correctly so it can be muxed.
3318 * @param out the interleaved packet will be output here
3319 * @param in the input packet
3320 * @param flush 1 if no further packets are available as input and all
3321 * remaining packets should be output
3322 * @return 1 if a packet was output, 0 if no packet could be output,
3323 * < 0 if an error occurred
3325 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3326 if(s->oformat->interleave_packet)
3327 return s->oformat->interleave_packet(s, out, in, flush);
3329 return av_interleave_packet_per_dts(s, out, in, flush);
3332 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3333 AVStream *st= s->streams[ pkt->stream_index];
3336 //FIXME/XXX/HACK drop zero sized packets
3337 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3340 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3341 pkt->size, pkt->dts, pkt->pts);
3342 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3345 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3346 return AVERROR(EINVAL);
3350 int ret= interleave_packet(s, &opkt, pkt, 0);
3351 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3354 ret= s->oformat->write_packet(s, &opkt);
3356 s->streams[opkt.stream_index]->nb_frames++;
3358 av_free_packet(&opkt);
3363 if(s->pb && s->pb->error)
3364 return s->pb->error;
3368 int av_write_trailer(AVFormatContext *s)
3374 ret= interleave_packet(s, &pkt, NULL, 1);
3375 if(ret<0) //FIXME cleanup needed for ret<0 ?
3380 ret= s->oformat->write_packet(s, &pkt);
3382 s->streams[pkt.stream_index]->nb_frames++;
3384 av_free_packet(&pkt);
3388 if(s->pb && s->pb->error)
3392 if(s->oformat->write_trailer)
3393 ret = s->oformat->write_trailer(s);
3396 ret = s->pb ? s->pb->error : 0;
3397 for(i=0;i<s->nb_streams;i++) {
3398 av_freep(&s->streams[i]->priv_data);
3399 av_freep(&s->streams[i]->index_entries);
3401 if (s->iformat && s->iformat->priv_class)
3402 av_opt_free(s->priv_data);
3403 av_freep(&s->priv_data);
3407 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
3408 int64_t *dts, int64_t *wall)
3410 if (!s->oformat || !s->oformat->get_output_timestamp)
3411 return AVERROR(ENOSYS);
3412 s->oformat->get_output_timestamp(s, stream, dts, wall);
3416 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3419 AVProgram *program=NULL;
3422 if (idx >= ac->nb_streams) {
3423 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3427 for(i=0; i<ac->nb_programs; i++){
3428 if(ac->programs[i]->id != progid)
3430 program = ac->programs[i];
3431 for(j=0; j<program->nb_stream_indexes; j++)
3432 if(program->stream_index[j] == idx)
3435 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3438 program->stream_index = tmp;
3439 program->stream_index[program->nb_stream_indexes++] = idx;
3444 static void print_fps(double d, const char *postfix){
3445 uint64_t v= lrintf(d*100);
3446 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3447 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3448 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3451 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3453 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3454 AVDictionaryEntry *tag=NULL;
3456 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3457 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3458 if(strcmp("language", tag->key)){
3461 av_strlcpy(tmp, tag->value, sizeof(tmp));
3462 for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
3463 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tmp);
3469 /* "user interface" functions */
3470 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3473 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3474 AVStream *st = ic->streams[i];
3475 int g = av_gcd(st->time_base.num, st->time_base.den);
3476 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3477 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3478 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
3479 /* the pid is an important information, so we display it */
3480 /* XXX: add a generic system */
3481 if (flags & AVFMT_SHOW_IDS)
3482 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3484 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3485 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3486 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3487 if (st->sample_aspect_ratio.num && // default
3488 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3489 AVRational display_aspect_ratio;
3490 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3491 st->codec->width*st->sample_aspect_ratio.num,
3492 st->codec->height*st->sample_aspect_ratio.den,
3494 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3495 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3496 display_aspect_ratio.num, display_aspect_ratio.den);
3498 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3499 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3500 print_fps(av_q2d(st->avg_frame_rate), "fps");
3501 if(st->r_frame_rate.den && st->r_frame_rate.num)
3502 print_fps(av_q2d(st->r_frame_rate), "tbr");
3503 if(st->time_base.den && st->time_base.num)
3504 print_fps(1/av_q2d(st->time_base), "tbn");
3505 if(st->codec->time_base.den && st->codec->time_base.num)
3506 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3508 if (st->disposition & AV_DISPOSITION_DEFAULT)
3509 av_log(NULL, AV_LOG_INFO, " (default)");
3510 if (st->disposition & AV_DISPOSITION_DUB)
3511 av_log(NULL, AV_LOG_INFO, " (dub)");
3512 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3513 av_log(NULL, AV_LOG_INFO, " (original)");
3514 if (st->disposition & AV_DISPOSITION_COMMENT)
3515 av_log(NULL, AV_LOG_INFO, " (comment)");
3516 if (st->disposition & AV_DISPOSITION_LYRICS)
3517 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3518 if (st->disposition & AV_DISPOSITION_KARAOKE)
3519 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3520 if (st->disposition & AV_DISPOSITION_FORCED)
3521 av_log(NULL, AV_LOG_INFO, " (forced)");
3522 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3523 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3524 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3525 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3526 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3527 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3528 av_log(NULL, AV_LOG_INFO, "\n");
3529 dump_metadata(NULL, st->metadata, " ");
3532 #if FF_API_DUMP_FORMAT
3533 void dump_format(AVFormatContext *ic,
3538 av_dump_format(ic, index, url, is_output);
3542 void av_dump_format(AVFormatContext *ic,
3548 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3549 if (ic->nb_streams && !printed)
3552 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3553 is_output ? "Output" : "Input",
3555 is_output ? ic->oformat->name : ic->iformat->name,
3556 is_output ? "to" : "from", url);
3557 dump_metadata(NULL, ic->metadata, " ");
3559 av_log(NULL, AV_LOG_INFO, " Duration: ");
3560 if (ic->duration != AV_NOPTS_VALUE) {
3561 int hours, mins, secs, us;
3562 secs = ic->duration / AV_TIME_BASE;
3563 us = ic->duration % AV_TIME_BASE;
3568 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3569 (100 * us) / AV_TIME_BASE);
3571 av_log(NULL, AV_LOG_INFO, "N/A");
3573 if (ic->start_time != AV_NOPTS_VALUE) {
3575 av_log(NULL, AV_LOG_INFO, ", start: ");
3576 secs = ic->start_time / AV_TIME_BASE;
3577 us = abs(ic->start_time % AV_TIME_BASE);
3578 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3579 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3581 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3583 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3585 av_log(NULL, AV_LOG_INFO, "N/A");
3587 av_log(NULL, AV_LOG_INFO, "\n");
3589 for (i = 0; i < ic->nb_chapters; i++) {
3590 AVChapter *ch = ic->chapters[i];
3591 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3592 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3593 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3595 dump_metadata(NULL, ch->metadata, " ");
3597 if(ic->nb_programs) {
3598 int j, k, total = 0;
3599 for(j=0; j<ic->nb_programs; j++) {
3600 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3602 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3603 name ? name->value : "");
3604 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3605 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3606 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3607 printed[ic->programs[j]->stream_index[k]] = 1;
3609 total += ic->programs[j]->nb_stream_indexes;
3611 if (total < ic->nb_streams)
3612 av_log(NULL, AV_LOG_INFO, " No Program\n");
3614 for(i=0;i<ic->nb_streams;i++)
3616 dump_stream_format(ic, i, index, is_output);
3621 int64_t av_gettime(void)
3624 gettimeofday(&tv,NULL);
3625 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3628 uint64_t ff_ntp_time(void)
3630 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3633 #if FF_API_PARSE_DATE
3634 #include "libavutil/parseutils.h"
3636 int64_t parse_date(const char *timestr, int duration)
3639 av_parse_time(&timeval, timestr, duration);
3644 #if FF_API_FIND_INFO_TAG
3645 #include "libavutil/parseutils.h"
3647 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3649 return av_find_info_tag(arg, arg_size, tag1, info);
3653 int av_get_frame_filename(char *buf, int buf_size,
3654 const char *path, int number)
3657 char *q, buf1[20], c;
3658 int nd, len, percentd_found;
3670 while (isdigit(*p)) {
3671 nd = nd * 10 + *p++ - '0';
3674 } while (isdigit(c));
3683 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3685 if ((q - buf + len) > buf_size - 1)
3687 memcpy(q, buf1, len);
3695 if ((q - buf) < buf_size - 1)
3699 if (!percentd_found)
3708 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3712 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3714 for(i=0;i<size;i+=16) {
3721 PRINT(" %02x", buf[i+j]);
3726 for(j=0;j<len;j++) {
3728 if (c < ' ' || c > '~')
3737 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3739 hex_dump_internal(NULL, f, 0, buf, size);
3742 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3744 hex_dump_internal(avcl, NULL, level, buf, size);
3747 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3750 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3751 PRINT("stream #%d:\n", pkt->stream_index);
3752 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3753 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3754 /* DTS is _always_ valid after av_read_frame() */
3756 if (pkt->dts == AV_NOPTS_VALUE)
3759 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3760 /* PTS may not be known if B-frames are present. */
3762 if (pkt->pts == AV_NOPTS_VALUE)
3765 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3767 PRINT(" size=%d\n", pkt->size);
3770 av_hex_dump(f, pkt->data, pkt->size);
3774 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3776 AVRational tb = { 1, AV_TIME_BASE };
3777 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3781 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3783 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3787 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3789 AVRational tb = { 1, AV_TIME_BASE };
3790 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3794 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3797 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3800 void av_url_split(char *proto, int proto_size,
3801 char *authorization, int authorization_size,
3802 char *hostname, int hostname_size,
3804 char *path, int path_size,
3807 const char *p, *ls, *at, *col, *brk;
3809 if (port_ptr) *port_ptr = -1;
3810 if (proto_size > 0) proto[0] = 0;
3811 if (authorization_size > 0) authorization[0] = 0;
3812 if (hostname_size > 0) hostname[0] = 0;
3813 if (path_size > 0) path[0] = 0;
3815 /* parse protocol */
3816 if ((p = strchr(url, ':'))) {
3817 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3822 /* no protocol means plain filename */
3823 av_strlcpy(path, url, path_size);
3827 /* separate path from hostname */
3828 ls = strchr(p, '/');
3830 ls = strchr(p, '?');
3832 av_strlcpy(path, ls, path_size);
3834 ls = &p[strlen(p)]; // XXX
3836 /* the rest is hostname, use that to parse auth/port */
3838 /* authorization (user[:pass]@hostname) */
3839 if ((at = strchr(p, '@')) && at < ls) {
3840 av_strlcpy(authorization, p,
3841 FFMIN(authorization_size, at + 1 - p));
3842 p = at + 1; /* skip '@' */
3845 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3847 av_strlcpy(hostname, p + 1,
3848 FFMIN(hostname_size, brk - p));
3849 if (brk[1] == ':' && port_ptr)
3850 *port_ptr = atoi(brk + 2);
3851 } else if ((col = strchr(p, ':')) && col < ls) {
3852 av_strlcpy(hostname, p,
3853 FFMIN(col + 1 - p, hostname_size));
3854 if (port_ptr) *port_ptr = atoi(col + 1);
3856 av_strlcpy(hostname, p,
3857 FFMIN(ls + 1 - p, hostname_size));
3861 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3864 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3867 'C', 'D', 'E', 'F' };
3868 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3871 'c', 'd', 'e', 'f' };
3872 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3874 for(i = 0; i < s; i++) {
3875 buff[i * 2] = hex_table[src[i] >> 4];
3876 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3882 int ff_hex_to_data(uint8_t *data, const char *p)
3889 p += strspn(p, SPACE_CHARS);
3892 c = toupper((unsigned char) *p++);
3893 if (c >= '0' && c <= '9')
3895 else if (c >= 'A' && c <= 'F')
3910 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3911 unsigned int pts_num, unsigned int pts_den)
3914 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3915 if(new_tb.num != pts_num)
3916 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3918 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3920 if(new_tb.num <= 0 || new_tb.den <= 0) {
3921 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3924 s->time_base = new_tb;
3925 s->pts_wrap_bits = pts_wrap_bits;
3928 int ff_url_join(char *str, int size, const char *proto,
3929 const char *authorization, const char *hostname,
3930 int port, const char *fmt, ...)
3933 struct addrinfo hints, *ai;
3938 av_strlcatf(str, size, "%s://", proto);
3939 if (authorization && authorization[0])
3940 av_strlcatf(str, size, "%s@", authorization);
3941 #if CONFIG_NETWORK && defined(AF_INET6)
3942 /* Determine if hostname is a numerical IPv6 address,
3943 * properly escape it within [] in that case. */
3944 memset(&hints, 0, sizeof(hints));
3945 hints.ai_flags = AI_NUMERICHOST;
3946 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3947 if (ai->ai_family == AF_INET6) {
3948 av_strlcat(str, "[", size);
3949 av_strlcat(str, hostname, size);
3950 av_strlcat(str, "]", size);
3952 av_strlcat(str, hostname, size);
3957 /* Not an IPv6 address, just output the plain string. */
3958 av_strlcat(str, hostname, size);
3961 av_strlcatf(str, size, ":%d", port);
3964 int len = strlen(str);
3967 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3973 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3974 AVFormatContext *src)
3979 local_pkt.stream_index = dst_stream;
3980 if (pkt->pts != AV_NOPTS_VALUE)
3981 local_pkt.pts = av_rescale_q(pkt->pts,
3982 src->streams[pkt->stream_index]->time_base,
3983 dst->streams[dst_stream]->time_base);
3984 if (pkt->dts != AV_NOPTS_VALUE)
3985 local_pkt.dts = av_rescale_q(pkt->dts,
3986 src->streams[pkt->stream_index]->time_base,
3987 dst->streams[dst_stream]->time_base);
3988 return av_write_frame(dst, &local_pkt);
3991 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3994 const char *ptr = str;
3996 /* Parse key=value pairs. */
3999 char *dest = NULL, *dest_end;
4000 int key_len, dest_len = 0;
4002 /* Skip whitespace and potential commas. */
4003 while (*ptr && (isspace(*ptr) || *ptr == ','))
4010 if (!(ptr = strchr(key, '=')))
4013 key_len = ptr - key;
4015 callback_get_buf(context, key, key_len, &dest, &dest_len);
4016 dest_end = dest + dest_len - 1;
4020 while (*ptr && *ptr != '\"') {
4024 if (dest && dest < dest_end)
4028 if (dest && dest < dest_end)
4036 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
4037 if (dest && dest < dest_end)
4045 int ff_find_stream_index(AVFormatContext *s, int id)
4048 for (i = 0; i < s->nb_streams; i++) {
4049 if (s->streams[i]->id == id)
4055 void ff_make_absolute_url(char *buf, int size, const char *base,
4059 /* Absolute path, relative to the current server */
4060 if (base && strstr(base, "://") && rel[0] == '/') {
4062 av_strlcpy(buf, base, size);
4063 sep = strstr(buf, "://");
4066 sep = strchr(sep, '/');
4070 av_strlcat(buf, rel, size);
4073 /* If rel actually is an absolute url, just copy it */
4074 if (!base || strstr(rel, "://") || rel[0] == '/') {
4075 av_strlcpy(buf, rel, size);
4079 av_strlcpy(buf, base, size);
4080 /* Remove the file name from the base url */
4081 sep = strrchr(buf, '/');
4086 while (av_strstart(rel, "../", NULL) && sep) {
4087 /* Remove the path delimiter at the end */
4089 sep = strrchr(buf, '/');
4090 /* If the next directory name to pop off is "..", break here */
4091 if (!strcmp(sep ? &sep[1] : buf, "..")) {
4092 /* Readd the slash we just removed */
4093 av_strlcat(buf, "/", size);
4096 /* Cut off the directory name */
4103 av_strlcat(buf, rel, size);
4106 int64_t ff_iso8601_to_unix_time(const char *datestr)
4109 struct tm time = {0};
4110 strptime(datestr, "%Y - %m - %dT%T", &time);
4111 return mktime(&time);
4113 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
4114 "the date string.\n");
4119 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
4122 if (ofmt->query_codec)
4123 return ofmt->query_codec(codec_id, std_compliance);
4124 else if (ofmt->codec_tag)
4125 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4126 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4127 codec_id == ofmt->subtitle_codec)
4130 return AVERROR_PATCHWELCOME;