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"
51 * various utility functions for use within FFmpeg
54 unsigned avformat_version(void)
56 return LIBAVFORMAT_VERSION_INT;
59 const char *avformat_configuration(void)
61 return FFMPEG_CONFIGURATION;
64 const char *avformat_license(void)
66 #define LICENSE_PREFIX "libavformat license: "
67 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
70 /* fraction handling */
73 * f = val + (num / den) + 0.5.
75 * 'num' is normalized so that it is such as 0 <= num < den.
77 * @param f fractional number
78 * @param val integer value
79 * @param num must be >= 0
80 * @param den must be >= 1
82 static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
95 * Fractional addition to f: f = f + (incr / f->den).
97 * @param f fractional number
98 * @param incr increment, can be positive or negative
100 static void frac_add(AVFrac *f, int64_t incr)
113 } else if (num >= den) {
120 /** head of registered input format linked list */
121 static AVInputFormat *first_iformat = NULL;
122 /** head of registered output format linked list */
123 static AVOutputFormat *first_oformat = NULL;
125 AVInputFormat *av_iformat_next(AVInputFormat *f)
127 if(f) return f->next;
128 else return first_iformat;
131 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
133 if(f) return f->next;
134 else return first_oformat;
137 void av_register_input_format(AVInputFormat *format)
141 while (*p != NULL) p = &(*p)->next;
146 void av_register_output_format(AVOutputFormat *format)
150 while (*p != NULL) p = &(*p)->next;
155 int av_match_ext(const char *filename, const char *extensions)
163 ext = strrchr(filename, '.');
169 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
172 if (!av_strcasecmp(ext1, ext))
182 static int match_format(const char *name, const char *names)
190 namelen = strlen(name);
191 while ((p = strchr(names, ','))) {
192 len = FFMAX(p - names, namelen);
193 if (!av_strncasecmp(name, names, len))
197 return !av_strcasecmp(name, names);
200 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
201 const char *mime_type)
203 AVOutputFormat *fmt = NULL, *fmt_found;
204 int score_max, score;
206 /* specific test for image sequences */
207 #if CONFIG_IMAGE2_MUXER
208 if (!short_name && filename &&
209 av_filename_number_test(filename) &&
210 ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
211 return av_guess_format("image2", NULL, NULL);
214 /* Find the proper file type. */
217 while ((fmt = av_oformat_next(fmt))) {
219 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
221 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
223 if (filename && fmt->extensions &&
224 av_match_ext(filename, fmt->extensions)) {
227 if (score > score_max) {
235 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
236 const char *filename, const char *mime_type, enum AVMediaType type){
237 if(type == AVMEDIA_TYPE_VIDEO){
238 enum CodecID codec_id= CODEC_ID_NONE;
240 #if CONFIG_IMAGE2_MUXER
241 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
242 codec_id= ff_guess_image2_codec(filename);
245 if(codec_id == CODEC_ID_NONE)
246 codec_id= fmt->video_codec;
248 }else if(type == AVMEDIA_TYPE_AUDIO)
249 return fmt->audio_codec;
250 else if (type == AVMEDIA_TYPE_SUBTITLE)
251 return fmt->subtitle_codec;
253 return CODEC_ID_NONE;
256 AVInputFormat *av_find_input_format(const char *short_name)
258 AVInputFormat *fmt = NULL;
259 while ((fmt = av_iformat_next(fmt))) {
260 if (match_format(short_name, fmt->name))
267 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
269 int ret= av_new_packet(pkt, size);
274 pkt->pos= avio_tell(s);
276 ret= avio_read(s, pkt->data, size);
280 av_shrink_packet(pkt, ret);
285 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
290 return av_get_packet(s, pkt, size);
291 old_size = pkt->size;
292 ret = av_grow_packet(pkt, size);
295 ret = avio_read(s, pkt->data + old_size, size);
296 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
301 int av_filename_number_test(const char *filename)
304 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
307 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
309 AVProbeData lpd = *pd;
310 AVInputFormat *fmt1 = NULL, *fmt;
311 int score, score_max=0;
313 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
314 int id3len = ff_id3v2_tag_len(lpd.buf);
315 if (lpd.buf_size > id3len + 16) {
317 lpd.buf_size -= id3len;
322 while ((fmt1 = av_iformat_next(fmt1))) {
323 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
326 if (fmt1->read_probe) {
327 score = fmt1->read_probe(&lpd);
328 if(!score && fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
330 } else if (fmt1->extensions) {
331 if (av_match_ext(lpd.filename, fmt1->extensions)) {
335 if (score > score_max) {
338 }else if (score == score_max)
341 *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, AVDictionary **options)
608 AVProbeData pd = {filename, NULL, 0};
610 if(s->iformat && !strlen(filename))
614 s->flags |= AVFMT_FLAG_CUSTOM_IO;
616 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
617 else if (s->iformat->flags & AVFMT_NOFILE)
618 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
619 "will be ignored with AVFMT_NOFILE format.\n");
623 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
624 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
627 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ,
628 &s->interrupt_callback, options)) < 0)
632 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
635 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
637 AVFormatContext *s = *ps;
639 AVFormatParameters ap = { { 0 } };
640 AVDictionary *tmp = NULL;
642 if (!s && !(s = avformat_alloc_context()))
643 return AVERROR(ENOMEM);
648 av_dict_copy(&tmp, *options, 0);
650 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
653 if ((ret = init_input(s, filename, &tmp)) < 0)
656 /* check filename in case an image number is expected */
657 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
658 if (!av_filename_number_test(filename)) {
659 ret = AVERROR(EINVAL);
664 s->duration = s->start_time = AV_NOPTS_VALUE;
665 av_strlcpy(s->filename, filename, sizeof(s->filename));
667 /* allocate private data */
668 if (s->iformat->priv_data_size > 0) {
669 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
670 ret = AVERROR(ENOMEM);
673 if (s->iformat->priv_class) {
674 *(const AVClass**)s->priv_data = s->iformat->priv_class;
675 av_opt_set_defaults(s->priv_data);
676 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
681 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
683 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
685 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
686 if ((ret = s->iformat->read_header(s, &ap)) < 0)
689 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
690 s->data_offset = avio_tell(s->pb);
692 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
695 av_dict_free(options);
703 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
705 avformat_free_context(s);
710 /*******************************************************/
712 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
713 AVPacketList **plast_pktl){
714 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
719 (*plast_pktl)->next = pktl;
721 *packet_buffer = pktl;
723 /* add the packet in the buffered packet list */
729 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
735 AVPacketList *pktl = s->raw_packet_buffer;
739 if(s->streams[pkt->stream_index]->request_probe <= 0){
740 s->raw_packet_buffer = pktl->next;
741 s->raw_packet_buffer_remaining_size += pkt->size;
748 ret= s->iformat->read_packet(s, pkt);
750 if (!pktl || ret == AVERROR(EAGAIN))
752 for (i = 0; i < s->nb_streams; i++)
753 if(s->streams[i]->request_probe > 0)
754 s->streams[i]->request_probe = -1;
758 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
759 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
760 av_log(s, AV_LOG_WARNING,
761 "Dropped corrupted packet (stream = %d)\n",
767 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
768 av_packet_merge_side_data(pkt);
770 if(pkt->stream_index >= (unsigned)s->nb_streams){
771 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
775 st= s->streams[pkt->stream_index];
777 switch(st->codec->codec_type){
778 case AVMEDIA_TYPE_VIDEO:
779 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
781 case AVMEDIA_TYPE_AUDIO:
782 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
784 case AVMEDIA_TYPE_SUBTITLE:
785 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
789 if(!pktl && st->request_probe <= 0)
792 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
793 s->raw_packet_buffer_remaining_size -= pkt->size;
795 if(st->request_probe>0){
796 AVProbeData *pd = &st->probe_data;
798 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
801 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
802 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
803 pd->buf_size += pkt->size;
804 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
806 end= s->raw_packet_buffer_remaining_size <= 0
807 || st->probe_packets<=0;
809 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
810 int score= set_codec_from_probe_data(s, st, pd);
811 if( (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
815 st->request_probe= -1;
816 if(st->codec->codec_id != CODEC_ID_NONE){
817 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
819 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
826 /**********************************************************/
829 * Get the number of samples of an audio frame. Return -1 on error.
831 static int get_audio_frame_size(AVCodecContext *enc, int size)
835 if(enc->codec_id == CODEC_ID_VORBIS)
838 if (enc->frame_size <= 1) {
839 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
841 if (bits_per_sample) {
842 if (enc->channels == 0)
844 frame_size = (size << 3) / (bits_per_sample * enc->channels);
846 /* used for example by ADPCM codecs */
847 if (enc->bit_rate == 0)
849 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
852 frame_size = enc->frame_size;
859 * Return the frame duration in seconds. Return 0 if not available.
861 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
862 AVCodecParserContext *pc, AVPacket *pkt)
868 switch(st->codec->codec_type) {
869 case AVMEDIA_TYPE_VIDEO:
870 if(st->time_base.num*1000LL > st->time_base.den){
871 *pnum = st->time_base.num;
872 *pden = st->time_base.den;
873 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
874 *pnum = st->codec->time_base.num;
875 *pden = st->codec->time_base.den;
876 if (pc && pc->repeat_pict) {
877 *pnum = (*pnum) * (1 + pc->repeat_pict);
879 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
880 //Thus if we have no parser in such case leave duration undefined.
881 if(st->codec->ticks_per_frame>1 && !pc){
886 case AVMEDIA_TYPE_AUDIO:
887 frame_size = get_audio_frame_size(st->codec, pkt->size);
888 if (frame_size <= 0 || st->codec->sample_rate <= 0)
891 *pden = st->codec->sample_rate;
898 static int is_intra_only(AVCodecContext *enc){
899 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
901 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
902 switch(enc->codec_id){
904 case CODEC_ID_MJPEGB:
906 case CODEC_ID_PRORES:
907 case CODEC_ID_RAWVIDEO:
908 case CODEC_ID_DVVIDEO:
909 case CODEC_ID_HUFFYUV:
910 case CODEC_ID_FFVHUFF:
915 case CODEC_ID_JPEG2000:
923 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
924 int64_t dts, int64_t pts)
926 AVStream *st= s->streams[stream_index];
927 AVPacketList *pktl= s->packet_buffer;
929 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
932 st->first_dts= dts - st->cur_dts;
935 for(; pktl; pktl= pktl->next){
936 if(pktl->pkt.stream_index != stream_index)
938 //FIXME think more about this check
939 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
940 pktl->pkt.pts += st->first_dts;
942 if(pktl->pkt.dts != AV_NOPTS_VALUE)
943 pktl->pkt.dts += st->first_dts;
945 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
946 st->start_time= pktl->pkt.pts;
948 if (st->start_time == AV_NOPTS_VALUE)
949 st->start_time = pts;
952 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
954 AVPacketList *pktl= s->packet_buffer;
957 if(st->first_dts != AV_NOPTS_VALUE){
958 cur_dts= st->first_dts;
959 for(; pktl; pktl= pktl->next){
960 if(pktl->pkt.stream_index == pkt->stream_index){
961 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
963 cur_dts -= pkt->duration;
966 pktl= s->packet_buffer;
967 st->first_dts = cur_dts;
968 }else if(st->cur_dts)
971 for(; pktl; pktl= pktl->next){
972 if(pktl->pkt.stream_index != pkt->stream_index)
974 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
975 && !pktl->pkt.duration){
976 pktl->pkt.dts= cur_dts;
977 if(!st->codec->has_b_frames)
978 pktl->pkt.pts= cur_dts;
979 cur_dts += pkt->duration;
980 pktl->pkt.duration= pkt->duration;
984 if(st->first_dts == AV_NOPTS_VALUE)
985 st->cur_dts= cur_dts;
988 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
989 AVCodecParserContext *pc, AVPacket *pkt)
991 int num, den, presentation_delayed, delay, i;
994 if (s->flags & AVFMT_FLAG_NOFILLIN)
997 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
998 pkt->dts= AV_NOPTS_VALUE;
1000 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
1001 //FIXME Set low_delay = 0 when has_b_frames = 1
1002 st->codec->has_b_frames = 1;
1004 /* do we have a video B-frame ? */
1005 delay= st->codec->has_b_frames;
1006 presentation_delayed = 0;
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= 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 if(st->first_dts == AV_NOPTS_VALUE) st->cur_dts = 0;
1417 else st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1418 st->reference_dts = AV_NOPTS_VALUE;
1423 st->probe_packets = MAX_PROBE_PACKETS;
1425 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1426 st->pts_buffer[j]= AV_NOPTS_VALUE;
1430 #if FF_API_SEEK_PUBLIC
1431 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1433 ff_update_cur_dts(s, ref_st, timestamp);
1437 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1441 for(i = 0; i < s->nb_streams; i++) {
1442 AVStream *st = s->streams[i];
1444 st->cur_dts = av_rescale(timestamp,
1445 st->time_base.den * (int64_t)ref_st->time_base.num,
1446 st->time_base.num * (int64_t)ref_st->time_base.den);
1450 void ff_reduce_index(AVFormatContext *s, int stream_index)
1452 AVStream *st= s->streams[stream_index];
1453 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1455 if((unsigned)st->nb_index_entries >= max_entries){
1457 for(i=0; 2*i<st->nb_index_entries; i++)
1458 st->index_entries[i]= st->index_entries[2*i];
1459 st->nb_index_entries= i;
1463 int ff_add_index_entry(AVIndexEntry **index_entries,
1464 int *nb_index_entries,
1465 unsigned int *index_entries_allocated_size,
1466 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1468 AVIndexEntry *entries, *ie;
1471 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1474 entries = av_fast_realloc(*index_entries,
1475 index_entries_allocated_size,
1476 (*nb_index_entries + 1) *
1477 sizeof(AVIndexEntry));
1481 *index_entries= entries;
1483 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1486 index= (*nb_index_entries)++;
1487 ie= &entries[index];
1488 assert(index==0 || ie[-1].timestamp < timestamp);
1490 ie= &entries[index];
1491 if(ie->timestamp != timestamp){
1492 if(ie->timestamp <= timestamp)
1494 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1495 (*nb_index_entries)++;
1496 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1497 distance= ie->min_distance;
1501 ie->timestamp = timestamp;
1502 ie->min_distance= distance;
1509 int av_add_index_entry(AVStream *st,
1510 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1512 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1513 &st->index_entries_allocated_size, pos,
1514 timestamp, size, distance, flags);
1517 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1518 int64_t wanted_timestamp, int flags)
1526 //optimize appending index entries at the end
1527 if(b && entries[b-1].timestamp < wanted_timestamp)
1532 timestamp = entries[m].timestamp;
1533 if(timestamp >= wanted_timestamp)
1535 if(timestamp <= wanted_timestamp)
1538 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1540 if(!(flags & AVSEEK_FLAG_ANY)){
1541 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1542 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1551 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1554 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1555 wanted_timestamp, flags);
1558 #if FF_API_SEEK_PUBLIC
1559 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1560 return ff_seek_frame_binary(s, stream_index, target_ts, flags);
1564 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
1566 AVInputFormat *avif= s->iformat;
1567 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1568 int64_t ts_min, ts_max, ts;
1573 if (stream_index < 0)
1576 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1579 ts_min= AV_NOPTS_VALUE;
1580 pos_limit= -1; //gcc falsely says it may be uninitialized
1582 st= s->streams[stream_index];
1583 if(st->index_entries){
1586 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()
1587 index= FFMAX(index, 0);
1588 e= &st->index_entries[index];
1590 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1592 ts_min= e->timestamp;
1593 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1599 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1600 assert(index < st->nb_index_entries);
1602 e= &st->index_entries[index];
1603 assert(e->timestamp >= target_ts);
1605 ts_max= e->timestamp;
1606 pos_limit= pos_max - e->min_distance;
1607 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1608 pos_max,pos_limit, ts_max);
1612 pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1617 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1620 ff_read_frame_flush(s);
1621 ff_update_cur_dts(s, st, ts);
1626 #if FF_API_SEEK_PUBLIC
1627 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1628 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1629 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1630 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1632 return ff_gen_search(s, stream_index, target_ts, pos_min, pos_max,
1633 pos_limit, ts_min, ts_max, flags, ts_ret,
1638 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1639 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1640 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1641 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1644 int64_t start_pos, filesize;
1647 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1649 if(ts_min == AV_NOPTS_VALUE){
1650 pos_min = s->data_offset;
1651 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1652 if (ts_min == AV_NOPTS_VALUE)
1656 if(ts_min >= target_ts){
1661 if(ts_max == AV_NOPTS_VALUE){
1663 filesize = avio_size(s->pb);
1664 pos_max = filesize - 1;
1667 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1669 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1670 if (ts_max == AV_NOPTS_VALUE)
1674 int64_t tmp_pos= pos_max + 1;
1675 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1676 if(tmp_ts == AV_NOPTS_VALUE)
1680 if(tmp_pos >= filesize)
1686 if(ts_max <= target_ts){
1691 if(ts_min > ts_max){
1693 }else if(ts_min == ts_max){
1698 while (pos_min < pos_limit) {
1699 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1700 pos_min, pos_max, ts_min, ts_max);
1701 assert(pos_limit <= pos_max);
1704 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1705 // interpolate position (better than dichotomy)
1706 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1707 + pos_min - approximate_keyframe_distance;
1708 }else if(no_change==1){
1709 // bisection, if interpolation failed to change min or max pos last time
1710 pos = (pos_min + pos_limit)>>1;
1712 /* linear search if bisection failed, can only happen if there
1713 are very few or no keyframes between min/max */
1718 else if(pos > pos_limit)
1722 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1727 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1728 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1729 pos_limit, start_pos, no_change);
1730 if(ts == AV_NOPTS_VALUE){
1731 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1734 assert(ts != AV_NOPTS_VALUE);
1735 if (target_ts <= ts) {
1736 pos_limit = start_pos - 1;
1740 if (target_ts >= ts) {
1746 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1747 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1750 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1752 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1753 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1754 pos, ts_min, target_ts, ts_max);
1760 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1761 int64_t pos_min, pos_max;
1765 if (stream_index < 0)
1768 st= s->streams[stream_index];
1771 pos_min = s->data_offset;
1772 pos_max = avio_size(s->pb) - 1;
1774 if (pos < pos_min) pos= pos_min;
1775 else if(pos > pos_max) pos= pos_max;
1777 avio_seek(s->pb, pos, SEEK_SET);
1780 av_update_cur_dts(s, st, ts);
1785 static int seek_frame_generic(AVFormatContext *s,
1786 int stream_index, int64_t timestamp, int flags)
1793 st = s->streams[stream_index];
1795 index = av_index_search_timestamp(st, timestamp, flags);
1797 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1800 if(index < 0 || index==st->nb_index_entries-1){
1804 if(st->nb_index_entries){
1805 assert(st->index_entries);
1806 ie= &st->index_entries[st->nb_index_entries-1];
1807 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1809 ff_update_cur_dts(s, st, ie->timestamp);
1811 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1817 read_status = av_read_frame(s, &pkt);
1818 } while (read_status == AVERROR(EAGAIN));
1819 if (read_status < 0)
1821 av_free_packet(&pkt);
1822 if(stream_index == pkt.stream_index && pkt.dts > timestamp){
1823 if(pkt.flags & AV_PKT_FLAG_KEY)
1825 if(nonkey++ > 1000){
1826 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);
1831 index = av_index_search_timestamp(st, timestamp, flags);
1836 ff_read_frame_flush(s);
1837 AV_NOWARN_DEPRECATED(
1838 if (s->iformat->read_seek){
1839 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1843 ie = &st->index_entries[index];
1844 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1846 ff_update_cur_dts(s, st, ie->timestamp);
1851 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1856 if (flags & AVSEEK_FLAG_BYTE) {
1857 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1859 ff_read_frame_flush(s);
1860 return seek_frame_byte(s, stream_index, timestamp, flags);
1863 if(stream_index < 0){
1864 stream_index= av_find_default_stream_index(s);
1865 if(stream_index < 0)
1868 st= s->streams[stream_index];
1869 /* timestamp for default must be expressed in AV_TIME_BASE units */
1870 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1873 /* first, we try the format specific seek */
1874 AV_NOWARN_DEPRECATED(
1875 if (s->iformat->read_seek) {
1876 ff_read_frame_flush(s);
1877 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1885 if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1886 ff_read_frame_flush(s);
1887 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1888 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1889 ff_read_frame_flush(s);
1890 return seek_frame_generic(s, stream_index, timestamp, flags);
1896 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1898 if(min_ts > ts || max_ts < ts)
1901 if (s->iformat->read_seek2) {
1902 ff_read_frame_flush(s);
1903 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1906 if(s->iformat->read_timestamp){
1907 //try to seek via read_timestamp()
1910 //Fallback to old API if new is not implemented but old is
1911 //Note the old has somewat different sematics
1912 AV_NOWARN_DEPRECATED(
1913 if(s->iformat->read_seek || 1)
1914 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1917 // try some generic seek like seek_frame_generic() but with new ts semantics
1920 /*******************************************************/
1923 * Return TRUE if the stream has accurate duration in any stream.
1925 * @return TRUE if the stream has accurate duration for at least one component.
1927 static int has_duration(AVFormatContext *ic)
1931 if(ic->duration != AV_NOPTS_VALUE)
1934 for(i = 0;i < ic->nb_streams; i++) {
1935 st = ic->streams[i];
1936 if (st->duration != AV_NOPTS_VALUE)
1943 * Estimate the stream timings from the one of each components.
1945 * Also computes the global bitrate if possible.
1947 static void update_stream_timings(AVFormatContext *ic)
1949 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1950 int64_t duration, duration1, filesize;
1954 start_time = INT64_MAX;
1955 start_time_text = INT64_MAX;
1956 end_time = INT64_MIN;
1957 duration = INT64_MIN;
1958 for(i = 0;i < ic->nb_streams; i++) {
1959 st = ic->streams[i];
1960 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1961 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1962 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1963 if (start_time1 < start_time_text)
1964 start_time_text = start_time1;
1966 start_time = FFMIN(start_time, start_time1);
1967 if (st->duration != AV_NOPTS_VALUE) {
1968 end_time1 = start_time1
1969 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1970 end_time = FFMAX(end_time, end_time1);
1973 if (st->duration != AV_NOPTS_VALUE) {
1974 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1975 duration = FFMAX(duration, duration1);
1978 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
1979 start_time = start_time_text;
1980 if (start_time != INT64_MAX) {
1981 ic->start_time = start_time;
1982 if (end_time != INT64_MIN)
1983 duration = FFMAX(duration, end_time - start_time);
1985 if (duration != INT64_MIN && ic->duration == AV_NOPTS_VALUE) {
1986 ic->duration = duration;
1988 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
1989 /* compute the bitrate */
1990 ic->bit_rate = (double)filesize * 8.0 * AV_TIME_BASE /
1991 (double)ic->duration;
1995 static void fill_all_stream_timings(AVFormatContext *ic)
2000 update_stream_timings(ic);
2001 for(i = 0;i < ic->nb_streams; i++) {
2002 st = ic->streams[i];
2003 if (st->start_time == AV_NOPTS_VALUE) {
2004 if(ic->start_time != AV_NOPTS_VALUE)
2005 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
2006 if(ic->duration != AV_NOPTS_VALUE)
2007 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
2012 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2014 int64_t filesize, duration;
2018 /* if bit_rate is already set, we believe it */
2019 if (ic->bit_rate <= 0) {
2021 for(i=0;i<ic->nb_streams;i++) {
2022 st = ic->streams[i];
2023 if (st->codec->bit_rate > 0)
2024 bit_rate += st->codec->bit_rate;
2026 ic->bit_rate = bit_rate;
2029 /* if duration is already set, we believe it */
2030 if (ic->duration == AV_NOPTS_VALUE &&
2031 ic->bit_rate != 0) {
2032 filesize = ic->pb ? avio_size(ic->pb) : 0;
2034 for(i = 0; i < ic->nb_streams; i++) {
2035 st = ic->streams[i];
2036 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
2037 if (st->duration == AV_NOPTS_VALUE)
2038 st->duration = duration;
2044 #define DURATION_MAX_READ_SIZE 250000
2045 #define DURATION_MAX_RETRY 3
2047 /* only usable for MPEG-PS streams */
2048 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2050 AVPacket pkt1, *pkt = &pkt1;
2052 int read_size, i, ret;
2054 int64_t filesize, offset, duration;
2059 /* flush packet queue */
2060 flush_packet_queue(ic);
2062 for (i=0; i<ic->nb_streams; i++) {
2063 st = ic->streams[i];
2064 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
2065 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2068 av_parser_close(st->parser);
2070 av_free_packet(&st->cur_pkt);
2074 /* estimate the end time (duration) */
2075 /* XXX: may need to support wrapping */
2076 filesize = ic->pb ? avio_size(ic->pb) : 0;
2077 end_time = AV_NOPTS_VALUE;
2079 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2083 avio_seek(ic->pb, offset, SEEK_SET);
2086 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2090 ret = av_read_packet(ic, pkt);
2091 } while(ret == AVERROR(EAGAIN));
2094 read_size += pkt->size;
2095 st = ic->streams[pkt->stream_index];
2096 if (pkt->pts != AV_NOPTS_VALUE &&
2097 (st->start_time != AV_NOPTS_VALUE ||
2098 st->first_dts != AV_NOPTS_VALUE)) {
2099 duration = end_time = pkt->pts;
2100 if (st->start_time != AV_NOPTS_VALUE)
2101 duration -= st->start_time;
2103 duration -= st->first_dts;
2105 duration += 1LL<<st->pts_wrap_bits;
2107 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2108 st->duration = duration;
2111 av_free_packet(pkt);
2113 }while( end_time==AV_NOPTS_VALUE
2114 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2115 && ++retry <= DURATION_MAX_RETRY);
2117 fill_all_stream_timings(ic);
2119 avio_seek(ic->pb, old_offset, SEEK_SET);
2120 for (i=0; i<ic->nb_streams; i++) {
2122 st->cur_dts= st->first_dts;
2123 st->last_IP_pts = AV_NOPTS_VALUE;
2124 st->reference_dts = AV_NOPTS_VALUE;
2128 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2132 /* get the file size, if possible */
2133 if (ic->iformat->flags & AVFMT_NOFILE) {
2136 file_size = avio_size(ic->pb);
2137 file_size = FFMAX(0, file_size);
2140 if ((!strcmp(ic->iformat->name, "mpeg") ||
2141 !strcmp(ic->iformat->name, "mpegts")) &&
2142 file_size && ic->pb->seekable) {
2143 /* get accurate estimate from the PTSes */
2144 estimate_timings_from_pts(ic, old_offset);
2145 } else if (has_duration(ic)) {
2146 /* at least one component has timings - we use them for all
2148 fill_all_stream_timings(ic);
2150 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2151 /* less precise: use bitrate info */
2152 estimate_timings_from_bit_rate(ic);
2154 update_stream_timings(ic);
2158 AVStream av_unused *st;
2159 for(i = 0;i < ic->nb_streams; i++) {
2160 st = ic->streams[i];
2161 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2162 (double) st->start_time / AV_TIME_BASE,
2163 (double) st->duration / AV_TIME_BASE);
2165 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2166 (double) ic->start_time / AV_TIME_BASE,
2167 (double) ic->duration / AV_TIME_BASE,
2168 ic->bit_rate / 1000);
2172 static int has_codec_parameters(AVCodecContext *avctx)
2175 switch (avctx->codec_type) {
2176 case AVMEDIA_TYPE_AUDIO:
2177 val = avctx->sample_rate && avctx->channels && avctx->sample_fmt != AV_SAMPLE_FMT_NONE;
2178 if (!avctx->frame_size &&
2179 (avctx->codec_id == CODEC_ID_VORBIS ||
2180 avctx->codec_id == CODEC_ID_AAC ||
2181 avctx->codec_id == CODEC_ID_MP1 ||
2182 avctx->codec_id == CODEC_ID_MP2 ||
2183 avctx->codec_id == CODEC_ID_MP3 ||
2184 avctx->codec_id == CODEC_ID_CELT))
2187 case AVMEDIA_TYPE_VIDEO:
2188 val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
2190 case AVMEDIA_TYPE_DATA:
2191 if(avctx->codec_id == CODEC_ID_NONE) return 1;
2196 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2199 static int has_decode_delay_been_guessed(AVStream *st)
2201 return st->codec->codec_id != CODEC_ID_H264 ||
2202 st->info->nb_decoded_frames >= 6;
2205 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2209 int got_picture, data_size, ret=0;
2212 if(!st->codec->codec){
2213 codec = avcodec_find_decoder(st->codec->codec_id);
2216 ret = avcodec_open2(st->codec, codec, options);
2221 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st) ||
2222 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF)) {
2223 switch(st->codec->codec_type) {
2224 case AVMEDIA_TYPE_VIDEO:
2225 avcodec_get_frame_defaults(&picture);
2226 ret = avcodec_decode_video2(st->codec, &picture,
2227 &got_picture, avpkt);
2229 st->info->nb_decoded_frames++;
2231 case AVMEDIA_TYPE_AUDIO:
2232 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2233 samples = av_malloc(data_size);
2236 ret = avcodec_decode_audio3(st->codec, samples,
2248 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2250 while (tags->id != CODEC_ID_NONE) {
2258 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2261 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2262 if(tag == tags[i].tag)
2265 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2266 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2269 return CODEC_ID_NONE;
2272 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2275 for(i=0; tags && tags[i]; i++){
2276 int tag= ff_codec_get_tag(tags[i], id);
2282 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2285 for(i=0; tags && tags[i]; i++){
2286 enum CodecID id= ff_codec_get_id(tags[i], tag);
2287 if(id!=CODEC_ID_NONE) return id;
2289 return CODEC_ID_NONE;
2292 static void compute_chapters_end(AVFormatContext *s)
2295 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2297 for (i = 0; i < s->nb_chapters; i++)
2298 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2299 AVChapter *ch = s->chapters[i];
2300 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2303 for (j = 0; j < s->nb_chapters; j++) {
2304 AVChapter *ch1 = s->chapters[j];
2305 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2306 if (j != i && next_start > ch->start && next_start < end)
2309 ch->end = (end == INT64_MAX) ? ch->start : end;
2313 static int get_std_framerate(int i){
2314 if(i<60*12) return i*1001;
2315 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2319 * Is the time base unreliable.
2320 * This is a heuristic to balance between quick acceptance of the values in
2321 * the headers vs. some extra checks.
2322 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2323 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2324 * And there are "variable" fps files this needs to detect as well.
2326 static int tb_unreliable(AVCodecContext *c){
2327 if( c->time_base.den >= 101L*c->time_base.num
2328 || c->time_base.den < 5L*c->time_base.num
2329 /* || c->codec_tag == AV_RL32("DIVX")
2330 || c->codec_tag == AV_RL32("XVID")*/
2331 || c->codec_id == CODEC_ID_MPEG2VIDEO
2332 || c->codec_id == CODEC_ID_H264
2338 #if FF_API_FORMAT_PARAMETERS
2339 int av_find_stream_info(AVFormatContext *ic)
2341 return avformat_find_stream_info(ic, NULL);
2345 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2347 int i, count, ret, read_size, j;
2349 AVPacket pkt1, *pkt;
2350 int64_t old_offset = avio_tell(ic->pb);
2351 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2353 for(i=0;i<ic->nb_streams;i++) {
2355 st = ic->streams[i];
2357 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2358 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2359 /* if(!st->time_base.num)
2361 if(!st->codec->time_base.num)
2362 st->codec->time_base= st->time_base;
2364 //only for the split stuff
2365 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2366 st->parser = av_parser_init(st->codec->codec_id);
2367 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2368 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2371 assert(!st->codec->codec);
2372 codec = avcodec_find_decoder(st->codec->codec_id);
2374 /* Ensure that subtitle_header is properly set. */
2375 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2376 && codec && !st->codec->codec)
2377 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2379 //try to just open decoders, in case this is enough to get parameters
2380 if(!has_codec_parameters(st->codec)){
2381 if (codec && !st->codec->codec){
2382 AVDictionary *tmp = NULL;
2384 av_dict_copy(&tmp, options[i], 0);
2385 av_dict_set(&tmp, "threads", 0, 0);
2387 avcodec_open2(st->codec, codec, options ? &tmp : NULL);
2393 for (i=0; i<ic->nb_streams; i++) {
2394 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2400 if (ff_check_interrupt(&ic->interrupt_callback)){
2402 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2406 /* check if one codec still needs to be handled */
2407 for(i=0;i<ic->nb_streams;i++) {
2408 int fps_analyze_framecount = 20;
2410 st = ic->streams[i];
2411 if (!has_codec_parameters(st->codec))
2413 /* if the timebase is coarse (like the usual millisecond precision
2414 of mkv), we need to analyze more frames to reliably arrive at
2416 if (av_q2d(st->time_base) > 0.0005)
2417 fps_analyze_framecount *= 2;
2418 if (ic->fps_probe_size >= 0)
2419 fps_analyze_framecount = ic->fps_probe_size;
2420 /* variable fps and no guess at the real fps */
2421 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2422 && st->info->duration_count < fps_analyze_framecount
2423 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2425 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2427 if(st->first_dts == AV_NOPTS_VALUE && (st->codec->codec_type == AVMEDIA_TYPE_VIDEO || st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2430 if (i == ic->nb_streams) {
2431 /* NOTE: if the format has no header, then we need to read
2432 some packets to get most of the streams, so we cannot
2434 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2435 /* if we found the info for all the codecs, we can stop */
2437 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2441 /* we did not get all the codec info, but we read too much data */
2442 if (read_size >= ic->probesize) {
2444 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2448 /* NOTE: a new stream can be added there if no header in file
2449 (AVFMTCTX_NOHEADER) */
2450 ret = read_frame_internal(ic, &pkt1);
2451 if (ret == AVERROR(EAGAIN))
2456 ret = -1; /* we could not have all the codec parameters before EOF */
2457 for(i=0;i<ic->nb_streams;i++) {
2458 st = ic->streams[i];
2459 if (!has_codec_parameters(st->codec)){
2461 avcodec_string(buf, sizeof(buf), st->codec, 0);
2462 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2470 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2471 if ((ret = av_dup_packet(pkt)) < 0)
2472 goto find_stream_info_err;
2474 read_size += pkt->size;
2476 st = ic->streams[pkt->stream_index];
2477 if (st->codec_info_nb_frames>1) {
2479 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) {
2480 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2483 st->info->codec_info_duration += pkt->duration;
2486 int64_t last = st->info->last_dts;
2488 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2489 double dts= pkt->dts * av_q2d(st->time_base);
2490 int64_t duration= pkt->dts - last;
2492 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2493 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2494 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) {
2495 int framerate= get_std_framerate(i);
2496 double sdts= dts*framerate/(1001*12);
2498 int ticks= lrintf(sdts+j*0.5);
2499 double error= sdts - ticks + j*0.5;
2500 st->info->duration_error[j][0][i] += error;
2501 st->info->duration_error[j][1][i] += error*error;
2504 st->info->duration_count++;
2505 // ignore the first 4 values, they might have some random jitter
2506 if (st->info->duration_count > 3)
2507 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2509 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2510 st->info->last_dts = pkt->dts;
2512 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2513 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2515 st->codec->extradata_size= i;
2516 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2517 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2518 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2522 /* if still no information, we try to open the codec and to
2523 decompress the frame. We try to avoid that in most cases as
2524 it takes longer and uses more memory. For MPEG-4, we need to
2525 decompress for QuickTime.
2527 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2528 least one frame of codec data, this makes sure the codec initializes
2529 the channel configuration and does not only trust the values from the container.
2531 try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
2533 st->codec_info_nb_frames++;
2537 // close codecs which were opened in try_decode_frame()
2538 for(i=0;i<ic->nb_streams;i++) {
2539 st = ic->streams[i];
2540 if(st->codec->codec)
2541 avcodec_close(st->codec);
2543 for(i=0;i<ic->nb_streams;i++) {
2544 st = ic->streams[i];
2545 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2546 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2547 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2548 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2549 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2550 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2551 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2552 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2553 st->codec->codec_tag= tag;
2556 // the check for tb_unreliable() is not completely correct, since this is not about handling
2557 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2558 // ipmovie.c produces.
2559 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)
2560 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);
2561 if (st->info->duration_count && !st->r_frame_rate.num
2562 && tb_unreliable(st->codec) /*&&
2563 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2564 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2566 double best_error= 0.01;
2568 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) {
2571 if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2574 int n= st->info->duration_count;
2575 double a= st->info->duration_error[k][0][j] / n;
2576 double error= st->info->duration_error[k][1][j]/n - a*a;
2578 if(error < best_error && best_error> 0.000000001){
2580 num = get_std_framerate(j);
2583 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2586 // do not increase frame rate by more than 1 % in order to match a standard rate.
2587 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2588 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2591 if (!st->r_frame_rate.num){
2592 if( st->codec->time_base.den * (int64_t)st->time_base.num
2593 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2594 st->r_frame_rate.num = st->codec->time_base.den;
2595 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2597 st->r_frame_rate.num = st->time_base.den;
2598 st->r_frame_rate.den = st->time_base.num;
2601 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2602 if(!st->codec->bits_per_coded_sample)
2603 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2604 // set stream disposition based on audio service type
2605 switch (st->codec->audio_service_type) {
2606 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2607 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2608 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2609 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2610 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2611 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2612 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2613 st->disposition = AV_DISPOSITION_COMMENT; break;
2614 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2615 st->disposition = AV_DISPOSITION_KARAOKE; break;
2620 estimate_timings(ic, old_offset);
2622 compute_chapters_end(ic);
2625 /* correct DTS for B-frame streams with no timestamps */
2626 for(i=0;i<ic->nb_streams;i++) {
2627 st = ic->streams[i];
2628 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2630 ppktl = &ic->packet_buffer;
2632 if(ppkt1->stream_index != i)
2634 if(ppkt1->pkt->dts < 0)
2636 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2638 ppkt1->pkt->dts -= delta;
2643 st->cur_dts -= delta;
2649 find_stream_info_err:
2650 for (i=0; i < ic->nb_streams; i++)
2651 av_freep(&ic->streams[i]->info);
2655 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2659 for (i = 0; i < ic->nb_programs; i++) {
2660 if (ic->programs[i] == last) {
2664 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2665 if (ic->programs[i]->stream_index[j] == s)
2666 return ic->programs[i];
2672 int av_find_best_stream(AVFormatContext *ic,
2673 enum AVMediaType type,
2674 int wanted_stream_nb,
2676 AVCodec **decoder_ret,
2679 int i, nb_streams = ic->nb_streams;
2680 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2681 unsigned *program = NULL;
2682 AVCodec *decoder = NULL, *best_decoder = NULL;
2684 if (related_stream >= 0 && wanted_stream_nb < 0) {
2685 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2687 program = p->stream_index;
2688 nb_streams = p->nb_stream_indexes;
2691 for (i = 0; i < nb_streams; i++) {
2692 int real_stream_index = program ? program[i] : i;
2693 AVStream *st = ic->streams[real_stream_index];
2694 AVCodecContext *avctx = st->codec;
2695 if (avctx->codec_type != type)
2697 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2699 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2702 decoder = avcodec_find_decoder(st->codec->codec_id);
2705 ret = AVERROR_DECODER_NOT_FOUND;
2709 if (best_count >= st->codec_info_nb_frames)
2711 best_count = st->codec_info_nb_frames;
2712 ret = real_stream_index;
2713 best_decoder = decoder;
2714 if (program && i == nb_streams - 1 && ret < 0) {
2716 nb_streams = ic->nb_streams;
2717 i = 0; /* no related stream found, try again with everything */
2721 *decoder_ret = best_decoder;
2725 /*******************************************************/
2727 int av_read_play(AVFormatContext *s)
2729 if (s->iformat->read_play)
2730 return s->iformat->read_play(s);
2732 return avio_pause(s->pb, 0);
2733 return AVERROR(ENOSYS);
2736 int av_read_pause(AVFormatContext *s)
2738 if (s->iformat->read_pause)
2739 return s->iformat->read_pause(s);
2741 return avio_pause(s->pb, 1);
2742 return AVERROR(ENOSYS);
2745 void av_close_input_stream(AVFormatContext *s)
2747 flush_packet_queue(s);
2748 if (s->iformat->read_close)
2749 s->iformat->read_close(s);
2750 avformat_free_context(s);
2753 void avformat_free_context(AVFormatContext *s)
2759 if (s->iformat && s->iformat->priv_class && s->priv_data)
2760 av_opt_free(s->priv_data);
2762 for(i=0;i<s->nb_streams;i++) {
2763 /* free all data in a stream component */
2766 av_parser_close(st->parser);
2767 av_free_packet(&st->cur_pkt);
2769 av_dict_free(&st->metadata);
2770 av_freep(&st->index_entries);
2771 av_freep(&st->codec->extradata);
2772 av_freep(&st->codec->subtitle_header);
2773 av_freep(&st->codec);
2774 av_freep(&st->priv_data);
2775 av_freep(&st->info);
2778 for(i=s->nb_programs-1; i>=0; i--) {
2779 av_dict_free(&s->programs[i]->metadata);
2780 av_freep(&s->programs[i]->stream_index);
2781 av_freep(&s->programs[i]);
2783 av_freep(&s->programs);
2784 av_freep(&s->priv_data);
2785 while(s->nb_chapters--) {
2786 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2787 av_freep(&s->chapters[s->nb_chapters]);
2789 av_freep(&s->chapters);
2790 av_dict_free(&s->metadata);
2791 av_freep(&s->streams);
2795 void av_close_input_file(AVFormatContext *s)
2797 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2799 av_close_input_stream(s);
2804 #if FF_API_NEW_STREAM
2805 AVStream *av_new_stream(AVFormatContext *s, int id)
2807 AVStream *st = avformat_new_stream(s, NULL);
2814 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
2820 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2822 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2825 s->streams = streams;
2827 st = av_mallocz(sizeof(AVStream));
2830 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2835 st->codec = avcodec_alloc_context3(c);
2837 /* no default bitrate if decoding */
2838 st->codec->bit_rate = 0;
2840 st->index = s->nb_streams;
2841 st->start_time = AV_NOPTS_VALUE;
2842 st->duration = AV_NOPTS_VALUE;
2843 /* we set the current DTS to 0 so that formats without any timestamps
2844 but durations get some timestamps, formats with some unknown
2845 timestamps have their first few packets buffered and the
2846 timestamps corrected before they are returned to the user */
2848 st->first_dts = AV_NOPTS_VALUE;
2849 st->probe_packets = MAX_PROBE_PACKETS;
2851 /* default pts setting is MPEG-like */
2852 av_set_pts_info(st, 33, 1, 90000);
2853 st->last_IP_pts = AV_NOPTS_VALUE;
2854 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2855 st->pts_buffer[i]= AV_NOPTS_VALUE;
2856 st->reference_dts = AV_NOPTS_VALUE;
2858 st->sample_aspect_ratio = (AVRational){0,1};
2860 s->streams[s->nb_streams++] = st;
2864 AVProgram *av_new_program(AVFormatContext *ac, int id)
2866 AVProgram *program=NULL;
2869 av_dlog(ac, "new_program: id=0x%04x\n", id);
2871 for(i=0; i<ac->nb_programs; i++)
2872 if(ac->programs[i]->id == id)
2873 program = ac->programs[i];
2876 program = av_mallocz(sizeof(AVProgram));
2879 dynarray_add(&ac->programs, &ac->nb_programs, program);
2880 program->discard = AVDISCARD_NONE;
2887 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2889 AVChapter *chapter = NULL;
2892 for(i=0; i<s->nb_chapters; i++)
2893 if(s->chapters[i]->id == id)
2894 chapter = s->chapters[i];
2897 chapter= av_mallocz(sizeof(AVChapter));
2900 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2902 av_dict_set(&chapter->metadata, "title", title, 0);
2904 chapter->time_base= time_base;
2905 chapter->start = start;
2911 /************************************************************/
2912 /* output media file */
2914 #if FF_API_FORMAT_PARAMETERS
2915 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2917 if (s->oformat->priv_data_size > 0) {
2918 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2920 return AVERROR(ENOMEM);
2921 if (s->oformat->priv_class) {
2922 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2923 av_opt_set_defaults(s->priv_data);
2926 s->priv_data = NULL;
2932 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
2933 const char *format, const char *filename)
2935 AVFormatContext *s = avformat_alloc_context();
2944 oformat = av_guess_format(format, NULL, NULL);
2946 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
2947 ret = AVERROR(EINVAL);
2951 oformat = av_guess_format(NULL, filename, NULL);
2953 ret = AVERROR(EINVAL);
2954 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
2961 s->oformat = oformat;
2962 if (s->oformat->priv_data_size > 0) {
2963 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2966 if (s->oformat->priv_class) {
2967 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2968 av_opt_set_defaults(s->priv_data);
2971 s->priv_data = NULL;
2974 av_strlcpy(s->filename, filename, sizeof(s->filename));
2978 av_log(s, AV_LOG_ERROR, "Out of memory\n");
2979 ret = AVERROR(ENOMEM);
2981 avformat_free_context(s);
2985 #if FF_API_ALLOC_OUTPUT_CONTEXT
2986 AVFormatContext *avformat_alloc_output_context(const char *format,
2987 AVOutputFormat *oformat, const char *filename)
2989 AVFormatContext *avctx;
2990 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
2991 return ret < 0 ? NULL : avctx;
2995 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2997 const AVCodecTag *avctag;
2999 enum CodecID id = CODEC_ID_NONE;
3000 unsigned int tag = 0;
3003 * Check that tag + id is in the table
3004 * If neither is in the table -> OK
3005 * If tag is in the table with another id -> FAIL
3006 * If id is in the table with another tag -> FAIL unless strict < normal
3008 for (n = 0; s->oformat->codec_tag[n]; n++) {
3009 avctag = s->oformat->codec_tag[n];
3010 while (avctag->id != CODEC_ID_NONE) {
3011 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
3013 if (id == st->codec->codec_id)
3016 if (avctag->id == st->codec->codec_id)
3021 if (id != CODEC_ID_NONE)
3023 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
3028 #if FF_API_FORMAT_PARAMETERS
3029 int av_write_header(AVFormatContext *s)
3031 return avformat_write_header(s, NULL);
3035 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
3039 AVDictionary *tmp = NULL;
3042 av_dict_copy(&tmp, *options, 0);
3043 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
3045 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
3046 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3049 // some sanity checks
3050 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
3051 av_log(s, AV_LOG_ERROR, "no streams\n");
3052 ret = AVERROR(EINVAL);
3056 for(i=0;i<s->nb_streams;i++) {
3059 switch (st->codec->codec_type) {
3060 case AVMEDIA_TYPE_AUDIO:
3061 if(st->codec->sample_rate<=0){
3062 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
3063 ret = AVERROR(EINVAL);
3066 if(!st->codec->block_align)
3067 st->codec->block_align = st->codec->channels *
3068 av_get_bits_per_sample(st->codec->codec_id) >> 3;
3070 case AVMEDIA_TYPE_VIDEO:
3071 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
3072 av_log(s, AV_LOG_ERROR, "time base not set\n");
3073 ret = AVERROR(EINVAL);
3076 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
3077 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
3078 ret = AVERROR(EINVAL);
3081 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
3082 && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
3084 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
3085 ret = AVERROR(EINVAL);
3091 if(s->oformat->codec_tag){
3092 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)){
3093 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
3094 st->codec->codec_tag= 0;
3096 if(st->codec->codec_tag){
3097 if (!validate_codec_tag(s, st)) {
3099 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
3100 av_log(s, AV_LOG_ERROR,
3101 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
3102 tagbuf, st->codec->codec_tag, st->codec->codec_id);
3103 ret = AVERROR_INVALIDDATA;
3107 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3110 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3111 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3112 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3115 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3116 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3117 if (!s->priv_data) {
3118 ret = AVERROR(ENOMEM);
3121 if (s->oformat->priv_class) {
3122 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3123 av_opt_set_defaults(s->priv_data);
3124 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3129 /* set muxer identification string */
3130 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3131 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3134 if(s->oformat->write_header){
3135 ret = s->oformat->write_header(s);
3140 /* init PTS generation */
3141 for(i=0;i<s->nb_streams;i++) {
3142 int64_t den = AV_NOPTS_VALUE;
3145 switch (st->codec->codec_type) {
3146 case AVMEDIA_TYPE_AUDIO:
3147 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3149 case AVMEDIA_TYPE_VIDEO:
3150 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3155 if (den != AV_NOPTS_VALUE) {
3157 ret = AVERROR_INVALIDDATA;
3160 frac_init(&st->pts, 0, 0, den);
3165 av_dict_free(options);
3174 //FIXME merge with compute_pkt_fields
3175 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3176 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3177 int num, den, frame_size, i;
3179 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3180 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3182 /* duration field */
3183 if (pkt->duration == 0) {
3184 compute_frame_duration(&num, &den, st, NULL, pkt);
3186 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3190 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3193 //XXX/FIXME this is a temporary hack until all encoders output pts
3194 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3196 // pkt->pts= st->cur_dts;
3197 pkt->pts= st->pts.val;
3200 //calculate dts from pts
3201 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3202 st->pts_buffer[0]= pkt->pts;
3203 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3204 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3205 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3206 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3208 pkt->dts= st->pts_buffer[0];
3211 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)){
3212 av_log(s, AV_LOG_ERROR,
3213 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3214 st->index, st->cur_dts, pkt->dts);
3215 return AVERROR(EINVAL);
3217 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3218 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3219 return AVERROR(EINVAL);
3222 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3223 st->cur_dts= pkt->dts;
3224 st->pts.val= pkt->dts;
3227 switch (st->codec->codec_type) {
3228 case AVMEDIA_TYPE_AUDIO:
3229 frame_size = get_audio_frame_size(st->codec, pkt->size);
3231 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3232 likely equal to the encoder delay, but it would be better if we
3233 had the real timestamps from the encoder */
3234 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3235 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3238 case AVMEDIA_TYPE_VIDEO:
3239 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3247 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3249 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3251 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3254 ret= s->oformat->write_packet(s, pkt);
3257 s->streams[pkt->stream_index]->nb_frames++;
3261 int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3262 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3264 AVPacketList **next_point, *this_pktl;
3266 this_pktl = av_mallocz(sizeof(AVPacketList));
3268 return AVERROR(ENOMEM);
3269 this_pktl->pkt= *pkt;
3270 pkt->destruct= NULL; // do not free original but only the copy
3271 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3273 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3274 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3276 next_point = &s->packet_buffer;
3279 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3280 while(!compare(s, &(*next_point)->pkt, pkt)){
3281 next_point= &(*next_point)->next;
3285 next_point = &(s->packet_buffer_end->next);
3288 assert(!*next_point);
3290 s->packet_buffer_end= this_pktl;
3293 this_pktl->next= *next_point;
3295 s->streams[pkt->stream_index]->last_in_packet_buffer=
3296 *next_point= this_pktl;
3300 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3302 AVStream *st = s->streams[ pkt ->stream_index];
3303 AVStream *st2= s->streams[ next->stream_index];
3304 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3308 return pkt->stream_index < next->stream_index;
3312 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3314 int stream_count=0, noninterleaved_count=0;
3315 int64_t delta_dts_max = 0;
3319 ret = ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3324 for(i=0; i < s->nb_streams; i++) {
3325 if (s->streams[i]->last_in_packet_buffer) {
3327 } else if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3328 ++noninterleaved_count;
3332 if (s->nb_streams == stream_count) {
3335 for(i=0; i < s->nb_streams; i++) {
3336 if (s->streams[i]->last_in_packet_buffer) {
3338 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
3339 s->streams[i]->time_base,
3341 av_rescale_q(s->packet_buffer->pkt.dts,
3342 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
3344 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
3347 if(s->nb_streams == stream_count+noninterleaved_count &&
3348 delta_dts_max > 20*AV_TIME_BASE) {
3349 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
3353 if(stream_count && flush){
3354 pktl= s->packet_buffer;
3357 s->packet_buffer= pktl->next;
3358 if(!s->packet_buffer)
3359 s->packet_buffer_end= NULL;
3361 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3362 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3366 av_init_packet(out);
3372 * Interleave an AVPacket correctly so it can be muxed.
3373 * @param out the interleaved packet will be output here
3374 * @param in the input packet
3375 * @param flush 1 if no further packets are available as input and all
3376 * remaining packets should be output
3377 * @return 1 if a packet was output, 0 if no packet could be output,
3378 * < 0 if an error occurred
3380 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3381 if(s->oformat->interleave_packet)
3382 return s->oformat->interleave_packet(s, out, in, flush);
3384 return av_interleave_packet_per_dts(s, out, in, flush);
3387 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3388 AVStream *st= s->streams[ pkt->stream_index];
3391 //FIXME/XXX/HACK drop zero sized packets
3392 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3395 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3396 pkt->size, pkt->dts, pkt->pts);
3397 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3400 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3401 return AVERROR(EINVAL);
3405 int ret= interleave_packet(s, &opkt, pkt, 0);
3406 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3409 ret= s->oformat->write_packet(s, &opkt);
3411 s->streams[opkt.stream_index]->nb_frames++;
3413 av_free_packet(&opkt);
3418 if(s->pb && s->pb->error)
3419 return s->pb->error;
3423 int av_write_trailer(AVFormatContext *s)
3429 ret= interleave_packet(s, &pkt, NULL, 1);
3430 if(ret<0) //FIXME cleanup needed for ret<0 ?
3435 ret= s->oformat->write_packet(s, &pkt);
3437 s->streams[pkt.stream_index]->nb_frames++;
3439 av_free_packet(&pkt);
3443 if(s->pb && s->pb->error)
3447 if(s->oformat->write_trailer)
3448 ret = s->oformat->write_trailer(s);
3451 ret = s->pb ? s->pb->error : 0;
3452 for(i=0;i<s->nb_streams;i++) {
3453 av_freep(&s->streams[i]->priv_data);
3454 av_freep(&s->streams[i]->index_entries);
3456 if (s->iformat && s->iformat->priv_class)
3457 av_opt_free(s->priv_data);
3458 av_freep(&s->priv_data);
3462 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
3463 int64_t *dts, int64_t *wall)
3465 if (!s->oformat || !s->oformat->get_output_timestamp)
3466 return AVERROR(ENOSYS);
3467 s->oformat->get_output_timestamp(s, stream, dts, wall);
3471 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3474 AVProgram *program=NULL;
3477 if (idx >= ac->nb_streams) {
3478 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3482 for(i=0; i<ac->nb_programs; i++){
3483 if(ac->programs[i]->id != progid)
3485 program = ac->programs[i];
3486 for(j=0; j<program->nb_stream_indexes; j++)
3487 if(program->stream_index[j] == idx)
3490 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3493 program->stream_index = tmp;
3494 program->stream_index[program->nb_stream_indexes++] = idx;
3499 static void print_fps(double d, const char *postfix){
3500 uint64_t v= lrintf(d*100);
3501 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3502 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3503 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3506 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3508 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3509 AVDictionaryEntry *tag=NULL;
3511 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3512 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3513 if(strcmp("language", tag->key)){
3516 av_strlcpy(tmp, tag->value, sizeof(tmp));
3517 for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
3518 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tmp);
3524 /* "user interface" functions */
3525 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3528 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3529 AVStream *st = ic->streams[i];
3530 int g = av_gcd(st->time_base.num, st->time_base.den);
3531 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3532 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3533 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
3534 /* the pid is an important information, so we display it */
3535 /* XXX: add a generic system */
3536 if (flags & AVFMT_SHOW_IDS)
3537 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3539 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3540 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3541 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3542 if (st->sample_aspect_ratio.num && // default
3543 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3544 AVRational display_aspect_ratio;
3545 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3546 st->codec->width*st->sample_aspect_ratio.num,
3547 st->codec->height*st->sample_aspect_ratio.den,
3549 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3550 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3551 display_aspect_ratio.num, display_aspect_ratio.den);
3553 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3554 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3555 print_fps(av_q2d(st->avg_frame_rate), "fps");
3556 if(st->r_frame_rate.den && st->r_frame_rate.num)
3557 print_fps(av_q2d(st->r_frame_rate), "tbr");
3558 if(st->time_base.den && st->time_base.num)
3559 print_fps(1/av_q2d(st->time_base), "tbn");
3560 if(st->codec->time_base.den && st->codec->time_base.num)
3561 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3563 if (st->disposition & AV_DISPOSITION_DEFAULT)
3564 av_log(NULL, AV_LOG_INFO, " (default)");
3565 if (st->disposition & AV_DISPOSITION_DUB)
3566 av_log(NULL, AV_LOG_INFO, " (dub)");
3567 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3568 av_log(NULL, AV_LOG_INFO, " (original)");
3569 if (st->disposition & AV_DISPOSITION_COMMENT)
3570 av_log(NULL, AV_LOG_INFO, " (comment)");
3571 if (st->disposition & AV_DISPOSITION_LYRICS)
3572 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3573 if (st->disposition & AV_DISPOSITION_KARAOKE)
3574 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3575 if (st->disposition & AV_DISPOSITION_FORCED)
3576 av_log(NULL, AV_LOG_INFO, " (forced)");
3577 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3578 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3579 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3580 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3581 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3582 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3583 av_log(NULL, AV_LOG_INFO, "\n");
3584 dump_metadata(NULL, st->metadata, " ");
3587 #if FF_API_DUMP_FORMAT
3588 void dump_format(AVFormatContext *ic,
3593 av_dump_format(ic, index, url, is_output);
3597 void av_dump_format(AVFormatContext *ic,
3603 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3604 if (ic->nb_streams && !printed)
3607 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3608 is_output ? "Output" : "Input",
3610 is_output ? ic->oformat->name : ic->iformat->name,
3611 is_output ? "to" : "from", url);
3612 dump_metadata(NULL, ic->metadata, " ");
3614 av_log(NULL, AV_LOG_INFO, " Duration: ");
3615 if (ic->duration != AV_NOPTS_VALUE) {
3616 int hours, mins, secs, us;
3617 secs = ic->duration / AV_TIME_BASE;
3618 us = ic->duration % AV_TIME_BASE;
3623 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3624 (100 * us) / AV_TIME_BASE);
3626 av_log(NULL, AV_LOG_INFO, "N/A");
3628 if (ic->start_time != AV_NOPTS_VALUE) {
3630 av_log(NULL, AV_LOG_INFO, ", start: ");
3631 secs = ic->start_time / AV_TIME_BASE;
3632 us = abs(ic->start_time % AV_TIME_BASE);
3633 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3634 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3636 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3638 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3640 av_log(NULL, AV_LOG_INFO, "N/A");
3642 av_log(NULL, AV_LOG_INFO, "\n");
3644 for (i = 0; i < ic->nb_chapters; i++) {
3645 AVChapter *ch = ic->chapters[i];
3646 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3647 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3648 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3650 dump_metadata(NULL, ch->metadata, " ");
3652 if(ic->nb_programs) {
3653 int j, k, total = 0;
3654 for(j=0; j<ic->nb_programs; j++) {
3655 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3657 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3658 name ? name->value : "");
3659 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3660 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3661 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3662 printed[ic->programs[j]->stream_index[k]] = 1;
3664 total += ic->programs[j]->nb_stream_indexes;
3666 if (total < ic->nb_streams)
3667 av_log(NULL, AV_LOG_INFO, " No Program\n");
3669 for(i=0;i<ic->nb_streams;i++)
3671 dump_stream_format(ic, i, index, is_output);
3676 int64_t av_gettime(void)
3679 gettimeofday(&tv,NULL);
3680 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3683 uint64_t ff_ntp_time(void)
3685 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3688 #if FF_API_PARSE_DATE
3689 #include "libavutil/parseutils.h"
3691 int64_t parse_date(const char *timestr, int duration)
3694 av_parse_time(&timeval, timestr, duration);
3699 #if FF_API_FIND_INFO_TAG
3700 #include "libavutil/parseutils.h"
3702 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3704 return av_find_info_tag(arg, arg_size, tag1, info);
3708 int av_get_frame_filename(char *buf, int buf_size,
3709 const char *path, int number)
3712 char *q, buf1[20], c;
3713 int nd, len, percentd_found;
3725 while (isdigit(*p)) {
3726 nd = nd * 10 + *p++ - '0';
3729 } while (isdigit(c));
3738 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3740 if ((q - buf + len) > buf_size - 1)
3742 memcpy(q, buf1, len);
3750 if ((q - buf) < buf_size - 1)
3754 if (!percentd_found)
3763 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3767 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3769 for(i=0;i<size;i+=16) {
3776 PRINT(" %02x", buf[i+j]);
3781 for(j=0;j<len;j++) {
3783 if (c < ' ' || c > '~')
3792 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3794 hex_dump_internal(NULL, f, 0, buf, size);
3797 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3799 hex_dump_internal(avcl, NULL, level, buf, size);
3802 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3805 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3806 PRINT("stream #%d:\n", pkt->stream_index);
3807 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3808 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3809 /* DTS is _always_ valid after av_read_frame() */
3811 if (pkt->dts == AV_NOPTS_VALUE)
3814 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3815 /* PTS may not be known if B-frames are present. */
3817 if (pkt->pts == AV_NOPTS_VALUE)
3820 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3822 PRINT(" size=%d\n", pkt->size);
3825 av_hex_dump(f, pkt->data, pkt->size);
3829 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3831 AVRational tb = { 1, AV_TIME_BASE };
3832 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3836 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3838 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3842 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3844 AVRational tb = { 1, AV_TIME_BASE };
3845 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3849 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3852 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3855 void av_url_split(char *proto, int proto_size,
3856 char *authorization, int authorization_size,
3857 char *hostname, int hostname_size,
3859 char *path, int path_size,
3862 const char *p, *ls, *at, *col, *brk;
3864 if (port_ptr) *port_ptr = -1;
3865 if (proto_size > 0) proto[0] = 0;
3866 if (authorization_size > 0) authorization[0] = 0;
3867 if (hostname_size > 0) hostname[0] = 0;
3868 if (path_size > 0) path[0] = 0;
3870 /* parse protocol */
3871 if ((p = strchr(url, ':'))) {
3872 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3877 /* no protocol means plain filename */
3878 av_strlcpy(path, url, path_size);
3882 /* separate path from hostname */
3883 ls = strchr(p, '/');
3885 ls = strchr(p, '?');
3887 av_strlcpy(path, ls, path_size);
3889 ls = &p[strlen(p)]; // XXX
3891 /* the rest is hostname, use that to parse auth/port */
3893 /* authorization (user[:pass]@hostname) */
3894 if ((at = strchr(p, '@')) && at < ls) {
3895 av_strlcpy(authorization, p,
3896 FFMIN(authorization_size, at + 1 - p));
3897 p = at + 1; /* skip '@' */
3900 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3902 av_strlcpy(hostname, p + 1,
3903 FFMIN(hostname_size, brk - p));
3904 if (brk[1] == ':' && port_ptr)
3905 *port_ptr = atoi(brk + 2);
3906 } else if ((col = strchr(p, ':')) && col < ls) {
3907 av_strlcpy(hostname, p,
3908 FFMIN(col + 1 - p, hostname_size));
3909 if (port_ptr) *port_ptr = atoi(col + 1);
3911 av_strlcpy(hostname, p,
3912 FFMIN(ls + 1 - p, hostname_size));
3916 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3919 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3922 'C', 'D', 'E', 'F' };
3923 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3926 'c', 'd', 'e', 'f' };
3927 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3929 for(i = 0; i < s; i++) {
3930 buff[i * 2] = hex_table[src[i] >> 4];
3931 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3937 int ff_hex_to_data(uint8_t *data, const char *p)
3944 p += strspn(p, SPACE_CHARS);
3947 c = toupper((unsigned char) *p++);
3948 if (c >= '0' && c <= '9')
3950 else if (c >= 'A' && c <= 'F')
3965 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3966 unsigned int pts_num, unsigned int pts_den)
3969 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3970 if(new_tb.num != pts_num)
3971 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3973 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3975 if(new_tb.num <= 0 || new_tb.den <= 0) {
3976 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3979 s->time_base = new_tb;
3980 s->pts_wrap_bits = pts_wrap_bits;
3983 int ff_url_join(char *str, int size, const char *proto,
3984 const char *authorization, const char *hostname,
3985 int port, const char *fmt, ...)
3988 struct addrinfo hints, *ai;
3993 av_strlcatf(str, size, "%s://", proto);
3994 if (authorization && authorization[0])
3995 av_strlcatf(str, size, "%s@", authorization);
3996 #if CONFIG_NETWORK && defined(AF_INET6)
3997 /* Determine if hostname is a numerical IPv6 address,
3998 * properly escape it within [] in that case. */
3999 memset(&hints, 0, sizeof(hints));
4000 hints.ai_flags = AI_NUMERICHOST;
4001 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
4002 if (ai->ai_family == AF_INET6) {
4003 av_strlcat(str, "[", size);
4004 av_strlcat(str, hostname, size);
4005 av_strlcat(str, "]", size);
4007 av_strlcat(str, hostname, size);
4012 /* Not an IPv6 address, just output the plain string. */
4013 av_strlcat(str, hostname, size);
4016 av_strlcatf(str, size, ":%d", port);
4019 int len = strlen(str);
4022 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
4028 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
4029 AVFormatContext *src)
4034 local_pkt.stream_index = dst_stream;
4035 if (pkt->pts != AV_NOPTS_VALUE)
4036 local_pkt.pts = av_rescale_q(pkt->pts,
4037 src->streams[pkt->stream_index]->time_base,
4038 dst->streams[dst_stream]->time_base);
4039 if (pkt->dts != AV_NOPTS_VALUE)
4040 local_pkt.dts = av_rescale_q(pkt->dts,
4041 src->streams[pkt->stream_index]->time_base,
4042 dst->streams[dst_stream]->time_base);
4043 return av_write_frame(dst, &local_pkt);
4046 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4049 const char *ptr = str;
4051 /* Parse key=value pairs. */
4054 char *dest = NULL, *dest_end;
4055 int key_len, dest_len = 0;
4057 /* Skip whitespace and potential commas. */
4058 while (*ptr && (isspace(*ptr) || *ptr == ','))
4065 if (!(ptr = strchr(key, '=')))
4068 key_len = ptr - key;
4070 callback_get_buf(context, key, key_len, &dest, &dest_len);
4071 dest_end = dest + dest_len - 1;
4075 while (*ptr && *ptr != '\"') {
4079 if (dest && dest < dest_end)
4083 if (dest && dest < dest_end)
4091 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
4092 if (dest && dest < dest_end)
4100 int ff_find_stream_index(AVFormatContext *s, int id)
4103 for (i = 0; i < s->nb_streams; i++) {
4104 if (s->streams[i]->id == id)
4110 void ff_make_absolute_url(char *buf, int size, const char *base,
4114 /* Absolute path, relative to the current server */
4115 if (base && strstr(base, "://") && rel[0] == '/') {
4117 av_strlcpy(buf, base, size);
4118 sep = strstr(buf, "://");
4121 sep = strchr(sep, '/');
4125 av_strlcat(buf, rel, size);
4128 /* If rel actually is an absolute url, just copy it */
4129 if (!base || strstr(rel, "://") || rel[0] == '/') {
4130 av_strlcpy(buf, rel, size);
4134 av_strlcpy(buf, base, size);
4135 /* Remove the file name from the base url */
4136 sep = strrchr(buf, '/');
4141 while (av_strstart(rel, "../", NULL) && sep) {
4142 /* Remove the path delimiter at the end */
4144 sep = strrchr(buf, '/');
4145 /* If the next directory name to pop off is "..", break here */
4146 if (!strcmp(sep ? &sep[1] : buf, "..")) {
4147 /* Readd the slash we just removed */
4148 av_strlcat(buf, "/", size);
4151 /* Cut off the directory name */
4158 av_strlcat(buf, rel, size);
4161 int64_t ff_iso8601_to_unix_time(const char *datestr)
4164 struct tm time = {0};
4165 strptime(datestr, "%Y - %m - %dT%T", &time);
4166 return mktime(&time);
4168 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
4169 "the date string.\n");
4174 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
4177 if (ofmt->query_codec)
4178 return ofmt->query_codec(codec_id, std_compliance);
4179 else if (ofmt->codec_tag)
4180 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4181 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4182 codec_id == ofmt->subtitle_codec)
4185 return AVERROR_PATCHWELCOME;
4188 int avformat_network_init(void)
4192 ff_network_inited_globally = 1;
4193 if ((ret = ff_network_init()) < 0)
4200 int avformat_network_deinit(void)