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)
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_open(&s->pb, filename, AVIO_FLAG_READ)) < 0)
631 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
634 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
636 AVFormatContext *s = *ps;
638 AVFormatParameters ap = { { 0 } };
639 AVDictionary *tmp = NULL;
641 if (!s && !(s = avformat_alloc_context()))
642 return AVERROR(ENOMEM);
647 av_dict_copy(&tmp, *options, 0);
649 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
652 if ((ret = init_input(s, filename)) < 0)
655 /* check filename in case an image number is expected */
656 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
657 if (!av_filename_number_test(filename)) {
658 ret = AVERROR(EINVAL);
663 s->duration = s->start_time = AV_NOPTS_VALUE;
664 av_strlcpy(s->filename, filename, sizeof(s->filename));
666 /* allocate private data */
667 if (s->iformat->priv_data_size > 0) {
668 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
669 ret = AVERROR(ENOMEM);
672 if (s->iformat->priv_class) {
673 *(const AVClass**)s->priv_data = s->iformat->priv_class;
674 av_opt_set_defaults(s->priv_data);
675 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
680 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
682 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
684 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
685 if ((ret = s->iformat->read_header(s, &ap)) < 0)
688 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
689 s->data_offset = avio_tell(s->pb);
691 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
694 av_dict_free(options);
702 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
704 avformat_free_context(s);
709 /*******************************************************/
711 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
712 AVPacketList **plast_pktl){
713 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
718 (*plast_pktl)->next = pktl;
720 *packet_buffer = pktl;
722 /* add the packet in the buffered packet list */
728 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
734 AVPacketList *pktl = s->raw_packet_buffer;
738 if(s->streams[pkt->stream_index]->request_probe <= 0){
739 s->raw_packet_buffer = pktl->next;
740 s->raw_packet_buffer_remaining_size += pkt->size;
747 ret= s->iformat->read_packet(s, pkt);
749 if (!pktl || ret == AVERROR(EAGAIN))
751 for (i = 0; i < s->nb_streams; i++)
752 if(s->streams[i]->request_probe > 0)
753 s->streams[i]->request_probe = -1;
757 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
758 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
759 av_log(s, AV_LOG_WARNING,
760 "Dropped corrupted packet (stream = %d)\n",
766 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
767 av_packet_merge_side_data(pkt);
769 if(pkt->stream_index >= (unsigned)s->nb_streams){
770 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
774 st= s->streams[pkt->stream_index];
776 switch(st->codec->codec_type){
777 case AVMEDIA_TYPE_VIDEO:
778 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
780 case AVMEDIA_TYPE_AUDIO:
781 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
783 case AVMEDIA_TYPE_SUBTITLE:
784 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
788 if(!pktl && st->request_probe <= 0)
791 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
792 s->raw_packet_buffer_remaining_size -= pkt->size;
794 if(st->request_probe>0){
795 AVProbeData *pd = &st->probe_data;
797 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
800 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
801 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
802 pd->buf_size += pkt->size;
803 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
805 end= s->raw_packet_buffer_remaining_size <= 0
806 || st->probe_packets<=0;
808 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
809 int score= set_codec_from_probe_data(s, st, pd);
810 if( (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
814 st->request_probe= -1;
815 if(st->codec->codec_id != CODEC_ID_NONE){
816 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
818 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
825 /**********************************************************/
828 * Get the number of samples of an audio frame. Return -1 on error.
830 static int get_audio_frame_size(AVCodecContext *enc, int size)
834 if(enc->codec_id == CODEC_ID_VORBIS)
837 if (enc->frame_size <= 1) {
838 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
840 if (bits_per_sample) {
841 if (enc->channels == 0)
843 frame_size = (size << 3) / (bits_per_sample * enc->channels);
845 /* used for example by ADPCM codecs */
846 if (enc->bit_rate == 0)
848 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
851 frame_size = enc->frame_size;
858 * Return the frame duration in seconds. Return 0 if not available.
860 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
861 AVCodecParserContext *pc, AVPacket *pkt)
867 switch(st->codec->codec_type) {
868 case AVMEDIA_TYPE_VIDEO:
869 if(st->time_base.num*1000LL > st->time_base.den){
870 *pnum = st->time_base.num;
871 *pden = st->time_base.den;
872 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
873 *pnum = st->codec->time_base.num;
874 *pden = st->codec->time_base.den;
875 if (pc && pc->repeat_pict) {
876 *pnum = (*pnum) * (1 + pc->repeat_pict);
878 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
879 //Thus if we have no parser in such case leave duration undefined.
880 if(st->codec->ticks_per_frame>1 && !pc){
885 case AVMEDIA_TYPE_AUDIO:
886 frame_size = get_audio_frame_size(st->codec, pkt->size);
887 if (frame_size <= 0 || st->codec->sample_rate <= 0)
890 *pden = st->codec->sample_rate;
897 static int is_intra_only(AVCodecContext *enc){
898 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
900 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
901 switch(enc->codec_id){
903 case CODEC_ID_MJPEGB:
905 case CODEC_ID_PRORES:
906 case CODEC_ID_RAWVIDEO:
907 case CODEC_ID_DVVIDEO:
908 case CODEC_ID_HUFFYUV:
909 case CODEC_ID_FFVHUFF:
914 case CODEC_ID_JPEG2000:
922 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
923 int64_t dts, int64_t pts)
925 AVStream *st= s->streams[stream_index];
926 AVPacketList *pktl= s->packet_buffer;
928 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
931 st->first_dts= dts - st->cur_dts;
934 for(; pktl; pktl= pktl->next){
935 if(pktl->pkt.stream_index != stream_index)
937 //FIXME think more about this check
938 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
939 pktl->pkt.pts += st->first_dts;
941 if(pktl->pkt.dts != AV_NOPTS_VALUE)
942 pktl->pkt.dts += st->first_dts;
944 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
945 st->start_time= pktl->pkt.pts;
947 if (st->start_time == AV_NOPTS_VALUE)
948 st->start_time = pts;
951 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
953 AVPacketList *pktl= s->packet_buffer;
956 if(st->first_dts != AV_NOPTS_VALUE){
957 cur_dts= st->first_dts;
958 for(; pktl; pktl= pktl->next){
959 if(pktl->pkt.stream_index == pkt->stream_index){
960 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
962 cur_dts -= pkt->duration;
965 pktl= s->packet_buffer;
966 st->first_dts = cur_dts;
967 }else if(st->cur_dts)
970 for(; pktl; pktl= pktl->next){
971 if(pktl->pkt.stream_index != pkt->stream_index)
973 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
974 && !pktl->pkt.duration){
975 pktl->pkt.dts= cur_dts;
976 if(!st->codec->has_b_frames)
977 pktl->pkt.pts= cur_dts;
978 cur_dts += pkt->duration;
979 pktl->pkt.duration= pkt->duration;
983 if(st->first_dts == AV_NOPTS_VALUE)
984 st->cur_dts= cur_dts;
987 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
988 AVCodecParserContext *pc, AVPacket *pkt)
990 int num, den, presentation_delayed, delay, i;
993 if (s->flags & AVFMT_FLAG_NOFILLIN)
996 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
997 pkt->dts= AV_NOPTS_VALUE;
999 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
1000 //FIXME Set low_delay = 0 when has_b_frames = 1
1001 st->codec->has_b_frames = 1;
1003 /* do we have a video B-frame ? */
1004 delay= st->codec->has_b_frames;
1005 presentation_delayed = 0;
1007 // ignore delay caused by frame threading so that the mpeg2-without-dts
1008 // warning will not trigger
1009 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
1010 delay -= st->codec->thread_count-1;
1012 /* XXX: need has_b_frame, but cannot get it if the codec is
1015 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1016 presentation_delayed = 1;
1018 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){
1019 pkt->dts -= 1LL<<st->pts_wrap_bits;
1022 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
1023 // we take the conservative approach and discard both
1024 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
1025 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
1026 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1027 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
1030 if (pkt->duration == 0) {
1031 compute_frame_duration(&num, &den, st, pc, pkt);
1033 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1035 if(pkt->duration != 0 && s->packet_buffer)
1036 update_initial_durations(s, st, pkt);
1040 /* correct timestamps with byte offset if demuxers only have timestamps
1041 on packet boundaries */
1042 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1043 /* this will estimate bitrate based on this frame's duration and size */
1044 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1045 if(pkt->pts != AV_NOPTS_VALUE)
1047 if(pkt->dts != AV_NOPTS_VALUE)
1051 if (pc && pc->dts_sync_point >= 0) {
1052 // we have synchronization info from the parser
1053 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1055 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1056 if (pkt->dts != AV_NOPTS_VALUE) {
1057 // got DTS from the stream, update reference timestamp
1058 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1059 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1060 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1061 // compute DTS based on reference timestamp
1062 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1063 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1065 if (pc->dts_sync_point > 0)
1066 st->reference_dts = pkt->dts; // new reference
1070 /* This may be redundant, but it should not hurt. */
1071 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1072 presentation_delayed = 1;
1074 // 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);
1075 /* interpolate PTS and DTS if they are not present */
1076 //We skip H264 currently because delay and has_b_frames are not reliably set
1077 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1078 if (presentation_delayed) {
1079 /* DTS = decompression timestamp */
1080 /* PTS = presentation timestamp */
1081 if (pkt->dts == AV_NOPTS_VALUE)
1082 pkt->dts = st->last_IP_pts;
1083 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1084 if (pkt->dts == AV_NOPTS_VALUE)
1085 pkt->dts = st->cur_dts;
1087 /* this is tricky: the dts must be incremented by the duration
1088 of the frame we are displaying, i.e. the last I- or P-frame */
1089 if (st->last_IP_duration == 0)
1090 st->last_IP_duration = pkt->duration;
1091 if(pkt->dts != AV_NOPTS_VALUE)
1092 st->cur_dts = pkt->dts + st->last_IP_duration;
1093 st->last_IP_duration = pkt->duration;
1094 st->last_IP_pts= pkt->pts;
1095 /* cannot compute PTS if not present (we can compute it only
1096 by knowing the future */
1097 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1098 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1099 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1100 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1101 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1102 pkt->pts += pkt->duration;
1103 // 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);
1107 /* presentation is not delayed : PTS and DTS are the same */
1108 if(pkt->pts == AV_NOPTS_VALUE)
1109 pkt->pts = pkt->dts;
1110 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1111 if(pkt->pts == AV_NOPTS_VALUE)
1112 pkt->pts = st->cur_dts;
1113 pkt->dts = pkt->pts;
1114 if(pkt->pts != AV_NOPTS_VALUE)
1115 st->cur_dts = pkt->pts + pkt->duration;
1119 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1120 st->pts_buffer[0]= pkt->pts;
1121 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1122 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1123 if(pkt->dts == AV_NOPTS_VALUE)
1124 pkt->dts= st->pts_buffer[0];
1125 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1126 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1128 if(pkt->dts > st->cur_dts)
1129 st->cur_dts = pkt->dts;
1132 // 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);
1135 if(is_intra_only(st->codec))
1136 pkt->flags |= AV_PKT_FLAG_KEY;
1139 /* keyframe computation */
1140 if (pc->key_frame == 1)
1141 pkt->flags |= AV_PKT_FLAG_KEY;
1142 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1143 pkt->flags |= AV_PKT_FLAG_KEY;
1146 pkt->convergence_duration = pc->convergence_duration;
1150 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1155 av_init_packet(pkt);
1158 /* select current input stream component */
1161 if (!st->need_parsing || !st->parser) {
1162 /* no parsing needed: we just output the packet as is */
1163 /* raw data support */
1165 st->cur_pkt.data= NULL;
1166 st->cur_pkt.side_data_elems = 0;
1167 st->cur_pkt.side_data = NULL;
1168 compute_pkt_fields(s, st, NULL, pkt);
1170 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1171 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1172 ff_reduce_index(s, st->index);
1173 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1176 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1177 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1178 st->cur_ptr, st->cur_len,
1179 st->cur_pkt.pts, st->cur_pkt.dts,
1181 st->cur_pkt.pts = AV_NOPTS_VALUE;
1182 st->cur_pkt.dts = AV_NOPTS_VALUE;
1183 /* increment read pointer */
1187 /* return packet if any */
1191 pkt->stream_index = st->index;
1192 pkt->pts = st->parser->pts;
1193 pkt->dts = st->parser->dts;
1194 pkt->pos = st->parser->pos;
1195 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1197 pkt->destruct= st->cur_pkt.destruct;
1198 st->cur_pkt.destruct= NULL;
1199 st->cur_pkt.data = NULL;
1200 assert(st->cur_len == 0);
1202 pkt->destruct = NULL;
1204 compute_pkt_fields(s, st, st->parser, pkt);
1206 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1207 int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
1208 ff_reduce_index(s, st->index);
1209 av_add_index_entry(st, pos, pkt->dts,
1210 0, 0, AVINDEX_KEYFRAME);
1217 av_free_packet(&st->cur_pkt);
1222 /* read next packet */
1223 ret = av_read_packet(s, &cur_pkt);
1225 if (ret == AVERROR(EAGAIN))
1227 /* return the last frames, if any */
1228 for(i = 0; i < s->nb_streams; i++) {
1230 if (st->parser && st->need_parsing) {
1231 av_parser_parse2(st->parser, st->codec,
1232 &pkt->data, &pkt->size,
1234 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1240 /* no more packets: really terminate parsing */
1243 st = s->streams[cur_pkt.stream_index];
1244 st->cur_pkt= cur_pkt;
1246 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1247 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1248 st->cur_pkt.pts < st->cur_pkt.dts){
1249 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1250 st->cur_pkt.stream_index,
1254 // av_free_packet(&st->cur_pkt);
1258 if(s->debug & FF_FDEBUG_TS)
1259 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1260 st->cur_pkt.stream_index,
1264 st->cur_pkt.duration,
1268 st->cur_ptr = st->cur_pkt.data;
1269 st->cur_len = st->cur_pkt.size;
1270 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1271 st->parser = av_parser_init(st->codec->codec_id);
1273 av_log(s, AV_LOG_WARNING, "parser not found for codec "
1274 "%s, packets or times may be invalid.\n",
1275 avcodec_get_name(st->codec->codec_id));
1276 /* no parser available: just output the raw packets */
1277 st->need_parsing = AVSTREAM_PARSE_NONE;
1278 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1279 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1280 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1281 st->parser->flags |= PARSER_FLAG_ONCE;
1286 if(s->debug & FF_FDEBUG_TS)
1287 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1298 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1302 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1305 pktl = s->packet_buffer;
1307 AVPacket *next_pkt= &pktl->pkt;
1309 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1310 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1311 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1312 if( pktl->pkt.stream_index == next_pkt->stream_index
1313 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1314 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1315 next_pkt->pts= pktl->pkt.dts;
1319 pktl = s->packet_buffer;
1322 if( next_pkt->pts != AV_NOPTS_VALUE
1323 || next_pkt->dts == AV_NOPTS_VALUE
1325 /* read packet from packet buffer, if there is data */
1327 s->packet_buffer = pktl->next;
1333 int ret= read_frame_internal(s, pkt);
1335 if(pktl && ret != AVERROR(EAGAIN)){
1342 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1343 &s->packet_buffer_end)) < 0)
1344 return AVERROR(ENOMEM);
1346 assert(!s->packet_buffer);
1347 return read_frame_internal(s, pkt);
1352 /* XXX: suppress the packet queue */
1353 static void flush_packet_queue(AVFormatContext *s)
1358 pktl = s->packet_buffer;
1361 s->packet_buffer = pktl->next;
1362 av_free_packet(&pktl->pkt);
1365 while(s->raw_packet_buffer){
1366 pktl = s->raw_packet_buffer;
1367 s->raw_packet_buffer = pktl->next;
1368 av_free_packet(&pktl->pkt);
1371 s->packet_buffer_end=
1372 s->raw_packet_buffer_end= NULL;
1373 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1376 /*******************************************************/
1379 int av_find_default_stream_index(AVFormatContext *s)
1381 int first_audio_index = -1;
1385 if (s->nb_streams <= 0)
1387 for(i = 0; i < s->nb_streams; i++) {
1389 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1392 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1393 first_audio_index = i;
1395 return first_audio_index >= 0 ? first_audio_index : 0;
1399 * Flush the frame reader.
1401 void ff_read_frame_flush(AVFormatContext *s)
1406 flush_packet_queue(s);
1410 /* for each stream, reset read state */
1411 for(i = 0; i < s->nb_streams; i++) {
1415 av_parser_close(st->parser);
1417 av_free_packet(&st->cur_pkt);
1419 st->last_IP_pts = AV_NOPTS_VALUE;
1420 if(st->first_dts == AV_NOPTS_VALUE) st->cur_dts = 0;
1421 else st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1422 st->reference_dts = AV_NOPTS_VALUE;
1427 st->probe_packets = MAX_PROBE_PACKETS;
1429 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1430 st->pts_buffer[j]= AV_NOPTS_VALUE;
1434 #if FF_API_SEEK_PUBLIC
1435 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1437 return ff_update_cur_dts(s, ref_st, timestamp);
1441 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1445 for(i = 0; i < s->nb_streams; i++) {
1446 AVStream *st = s->streams[i];
1448 st->cur_dts = av_rescale(timestamp,
1449 st->time_base.den * (int64_t)ref_st->time_base.num,
1450 st->time_base.num * (int64_t)ref_st->time_base.den);
1454 void ff_reduce_index(AVFormatContext *s, int stream_index)
1456 AVStream *st= s->streams[stream_index];
1457 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1459 if((unsigned)st->nb_index_entries >= max_entries){
1461 for(i=0; 2*i<st->nb_index_entries; i++)
1462 st->index_entries[i]= st->index_entries[2*i];
1463 st->nb_index_entries= i;
1467 int ff_add_index_entry(AVIndexEntry **index_entries,
1468 int *nb_index_entries,
1469 unsigned int *index_entries_allocated_size,
1470 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1472 AVIndexEntry *entries, *ie;
1475 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1478 entries = av_fast_realloc(*index_entries,
1479 index_entries_allocated_size,
1480 (*nb_index_entries + 1) *
1481 sizeof(AVIndexEntry));
1485 *index_entries= entries;
1487 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1490 index= (*nb_index_entries)++;
1491 ie= &entries[index];
1492 assert(index==0 || ie[-1].timestamp < timestamp);
1494 ie= &entries[index];
1495 if(ie->timestamp != timestamp){
1496 if(ie->timestamp <= timestamp)
1498 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1499 (*nb_index_entries)++;
1500 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1501 distance= ie->min_distance;
1505 ie->timestamp = timestamp;
1506 ie->min_distance= distance;
1513 int av_add_index_entry(AVStream *st,
1514 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1516 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1517 &st->index_entries_allocated_size, pos,
1518 timestamp, size, distance, flags);
1521 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1522 int64_t wanted_timestamp, int flags)
1530 //optimize appending index entries at the end
1531 if(b && entries[b-1].timestamp < wanted_timestamp)
1536 timestamp = entries[m].timestamp;
1537 if(timestamp >= wanted_timestamp)
1539 if(timestamp <= wanted_timestamp)
1542 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1544 if(!(flags & AVSEEK_FLAG_ANY)){
1545 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1546 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1555 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1558 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1559 wanted_timestamp, flags);
1562 #if FF_API_SEEK_PUBLIC
1563 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1564 return ff_seek_frame_binary(s, stream_index, target_ts, flags);
1568 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
1570 AVInputFormat *avif= s->iformat;
1571 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1572 int64_t ts_min, ts_max, ts;
1577 if (stream_index < 0)
1580 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1583 ts_min= AV_NOPTS_VALUE;
1584 pos_limit= -1; //gcc falsely says it may be uninitialized
1586 st= s->streams[stream_index];
1587 if(st->index_entries){
1590 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()
1591 index= FFMAX(index, 0);
1592 e= &st->index_entries[index];
1594 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1596 ts_min= e->timestamp;
1597 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1603 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1604 assert(index < st->nb_index_entries);
1606 e= &st->index_entries[index];
1607 assert(e->timestamp >= target_ts);
1609 ts_max= e->timestamp;
1610 pos_limit= pos_max - e->min_distance;
1611 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1612 pos_max,pos_limit, ts_max);
1616 pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1621 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1624 ff_read_frame_flush(s);
1625 ff_update_cur_dts(s, st, ts);
1630 #if FF_API_SEEK_PUBLIC
1631 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1632 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1633 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1634 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1636 return ff_gen_search(s, stream_index, target_ts, pos_min, pos_max,
1637 pos_limit, ts_min, ts_max, flags, ts_ret,
1642 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1643 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1644 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1645 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1648 int64_t start_pos, filesize;
1651 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1653 if(ts_min == AV_NOPTS_VALUE){
1654 pos_min = s->data_offset;
1655 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1656 if (ts_min == AV_NOPTS_VALUE)
1660 if(ts_min >= target_ts){
1665 if(ts_max == AV_NOPTS_VALUE){
1667 filesize = avio_size(s->pb);
1668 pos_max = filesize - 1;
1671 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1673 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1674 if (ts_max == AV_NOPTS_VALUE)
1678 int64_t tmp_pos= pos_max + 1;
1679 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1680 if(tmp_ts == AV_NOPTS_VALUE)
1684 if(tmp_pos >= filesize)
1690 if(ts_max <= target_ts){
1695 if(ts_min > ts_max){
1697 }else if(ts_min == ts_max){
1702 while (pos_min < pos_limit) {
1703 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1704 pos_min, pos_max, ts_min, ts_max);
1705 assert(pos_limit <= pos_max);
1708 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1709 // interpolate position (better than dichotomy)
1710 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1711 + pos_min - approximate_keyframe_distance;
1712 }else if(no_change==1){
1713 // bisection, if interpolation failed to change min or max pos last time
1714 pos = (pos_min + pos_limit)>>1;
1716 /* linear search if bisection failed, can only happen if there
1717 are very few or no keyframes between min/max */
1722 else if(pos > pos_limit)
1726 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1731 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1732 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1733 pos_limit, start_pos, no_change);
1734 if(ts == AV_NOPTS_VALUE){
1735 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1738 assert(ts != AV_NOPTS_VALUE);
1739 if (target_ts <= ts) {
1740 pos_limit = start_pos - 1;
1744 if (target_ts >= ts) {
1750 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1751 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1754 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1756 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1757 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1758 pos, ts_min, target_ts, ts_max);
1764 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1765 int64_t pos_min, pos_max;
1769 if (stream_index < 0)
1772 st= s->streams[stream_index];
1775 pos_min = s->data_offset;
1776 pos_max = avio_size(s->pb) - 1;
1778 if (pos < pos_min) pos= pos_min;
1779 else if(pos > pos_max) pos= pos_max;
1781 avio_seek(s->pb, pos, SEEK_SET);
1784 av_update_cur_dts(s, st, ts);
1789 static int seek_frame_generic(AVFormatContext *s,
1790 int stream_index, int64_t timestamp, int flags)
1797 st = s->streams[stream_index];
1799 index = av_index_search_timestamp(st, timestamp, flags);
1801 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1804 if(index < 0 || index==st->nb_index_entries-1){
1808 if(st->nb_index_entries){
1809 assert(st->index_entries);
1810 ie= &st->index_entries[st->nb_index_entries-1];
1811 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1813 ff_update_cur_dts(s, st, ie->timestamp);
1815 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1821 read_status = av_read_frame(s, &pkt);
1822 } while (read_status == AVERROR(EAGAIN));
1823 if (read_status < 0)
1825 av_free_packet(&pkt);
1826 if(stream_index == pkt.stream_index && pkt.dts > timestamp){
1827 if(pkt.flags & AV_PKT_FLAG_KEY)
1829 if(nonkey++ > 1000){
1830 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);
1835 index = av_index_search_timestamp(st, timestamp, flags);
1840 ff_read_frame_flush(s);
1841 AV_NOWARN_DEPRECATED(
1842 if (s->iformat->read_seek){
1843 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1847 ie = &st->index_entries[index];
1848 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1850 ff_update_cur_dts(s, st, ie->timestamp);
1855 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1860 if (flags & AVSEEK_FLAG_BYTE) {
1861 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1863 ff_read_frame_flush(s);
1864 return seek_frame_byte(s, stream_index, timestamp, flags);
1867 if(stream_index < 0){
1868 stream_index= av_find_default_stream_index(s);
1869 if(stream_index < 0)
1872 st= s->streams[stream_index];
1873 /* timestamp for default must be expressed in AV_TIME_BASE units */
1874 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1877 /* first, we try the format specific seek */
1878 AV_NOWARN_DEPRECATED(
1879 if (s->iformat->read_seek) {
1880 ff_read_frame_flush(s);
1881 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1889 if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1890 ff_read_frame_flush(s);
1891 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1892 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1893 ff_read_frame_flush(s);
1894 return seek_frame_generic(s, stream_index, timestamp, flags);
1900 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1902 if(min_ts > ts || max_ts < ts)
1905 if (s->iformat->read_seek2) {
1906 ff_read_frame_flush(s);
1907 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1910 if(s->iformat->read_timestamp){
1911 //try to seek via read_timestamp()
1914 //Fallback to old API if new is not implemented but old is
1915 //Note the old has somewat different sematics
1916 AV_NOWARN_DEPRECATED(
1917 if(s->iformat->read_seek || 1)
1918 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1921 // try some generic seek like seek_frame_generic() but with new ts semantics
1924 /*******************************************************/
1927 * Return TRUE if the stream has accurate duration in any stream.
1929 * @return TRUE if the stream has accurate duration for at least one component.
1931 static int has_duration(AVFormatContext *ic)
1935 if(ic->duration != AV_NOPTS_VALUE)
1938 for(i = 0;i < ic->nb_streams; i++) {
1939 st = ic->streams[i];
1940 if (st->duration != AV_NOPTS_VALUE)
1947 * Estimate the stream timings from the one of each components.
1949 * Also computes the global bitrate if possible.
1951 static void update_stream_timings(AVFormatContext *ic)
1953 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1954 int64_t duration, duration1, filesize;
1958 start_time = INT64_MAX;
1959 start_time_text = INT64_MAX;
1960 end_time = INT64_MIN;
1961 duration = INT64_MIN;
1962 for(i = 0;i < ic->nb_streams; i++) {
1963 st = ic->streams[i];
1964 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1965 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1966 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1967 if (start_time1 < start_time_text)
1968 start_time_text = start_time1;
1970 start_time = FFMIN(start_time, start_time1);
1971 if (st->duration != AV_NOPTS_VALUE) {
1972 end_time1 = start_time1
1973 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1974 end_time = FFMAX(end_time, end_time1);
1977 if (st->duration != AV_NOPTS_VALUE) {
1978 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1979 duration = FFMAX(duration, duration1);
1982 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
1983 start_time = start_time_text;
1984 if (start_time != INT64_MAX) {
1985 ic->start_time = start_time;
1986 if (end_time != INT64_MIN)
1987 duration = FFMAX(duration, end_time - start_time);
1989 if (duration != INT64_MIN && ic->duration == AV_NOPTS_VALUE) {
1990 ic->duration = duration;
1992 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
1993 /* compute the bitrate */
1994 ic->bit_rate = (double)filesize * 8.0 * AV_TIME_BASE /
1995 (double)ic->duration;
1999 static void fill_all_stream_timings(AVFormatContext *ic)
2004 update_stream_timings(ic);
2005 for(i = 0;i < ic->nb_streams; i++) {
2006 st = ic->streams[i];
2007 if (st->start_time == AV_NOPTS_VALUE) {
2008 if(ic->start_time != AV_NOPTS_VALUE)
2009 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
2010 if(ic->duration != AV_NOPTS_VALUE)
2011 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
2016 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2018 int64_t filesize, duration;
2022 /* if bit_rate is already set, we believe it */
2023 if (ic->bit_rate <= 0) {
2025 for(i=0;i<ic->nb_streams;i++) {
2026 st = ic->streams[i];
2027 if (st->codec->bit_rate > 0)
2028 bit_rate += st->codec->bit_rate;
2030 ic->bit_rate = bit_rate;
2033 /* if duration is already set, we believe it */
2034 if (ic->duration == AV_NOPTS_VALUE &&
2035 ic->bit_rate != 0) {
2036 filesize = ic->pb ? avio_size(ic->pb) : 0;
2038 for(i = 0; i < ic->nb_streams; i++) {
2039 st = ic->streams[i];
2040 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
2041 if (st->duration == AV_NOPTS_VALUE)
2042 st->duration = duration;
2048 #define DURATION_MAX_READ_SIZE 250000
2049 #define DURATION_MAX_RETRY 3
2051 /* only usable for MPEG-PS streams */
2052 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2054 AVPacket pkt1, *pkt = &pkt1;
2056 int read_size, i, ret;
2058 int64_t filesize, offset, duration;
2063 /* flush packet queue */
2064 flush_packet_queue(ic);
2066 for (i=0; i<ic->nb_streams; i++) {
2067 st = ic->streams[i];
2068 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
2069 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2072 av_parser_close(st->parser);
2074 av_free_packet(&st->cur_pkt);
2078 /* estimate the end time (duration) */
2079 /* XXX: may need to support wrapping */
2080 filesize = ic->pb ? avio_size(ic->pb) : 0;
2081 end_time = AV_NOPTS_VALUE;
2083 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2087 avio_seek(ic->pb, offset, SEEK_SET);
2090 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2094 ret = av_read_packet(ic, pkt);
2095 } while(ret == AVERROR(EAGAIN));
2098 read_size += pkt->size;
2099 st = ic->streams[pkt->stream_index];
2100 if (pkt->pts != AV_NOPTS_VALUE &&
2101 (st->start_time != AV_NOPTS_VALUE ||
2102 st->first_dts != AV_NOPTS_VALUE)) {
2103 duration = end_time = pkt->pts;
2104 if (st->start_time != AV_NOPTS_VALUE)
2105 duration -= st->start_time;
2107 duration -= st->first_dts;
2109 duration += 1LL<<st->pts_wrap_bits;
2111 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2112 st->duration = duration;
2115 av_free_packet(pkt);
2117 }while( end_time==AV_NOPTS_VALUE
2118 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2119 && ++retry <= DURATION_MAX_RETRY);
2121 fill_all_stream_timings(ic);
2123 avio_seek(ic->pb, old_offset, SEEK_SET);
2124 for (i=0; i<ic->nb_streams; i++) {
2126 st->cur_dts= st->first_dts;
2127 st->last_IP_pts = AV_NOPTS_VALUE;
2128 st->reference_dts = AV_NOPTS_VALUE;
2132 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2136 /* get the file size, if possible */
2137 if (ic->iformat->flags & AVFMT_NOFILE) {
2140 file_size = avio_size(ic->pb);
2141 file_size = FFMAX(0, file_size);
2144 if ((!strcmp(ic->iformat->name, "mpeg") ||
2145 !strcmp(ic->iformat->name, "mpegts")) &&
2146 file_size && ic->pb->seekable) {
2147 /* get accurate estimate from the PTSes */
2148 estimate_timings_from_pts(ic, old_offset);
2149 } else if (has_duration(ic)) {
2150 /* at least one component has timings - we use them for all
2152 fill_all_stream_timings(ic);
2154 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2155 /* less precise: use bitrate info */
2156 estimate_timings_from_bit_rate(ic);
2158 update_stream_timings(ic);
2162 AVStream av_unused *st;
2163 for(i = 0;i < ic->nb_streams; i++) {
2164 st = ic->streams[i];
2165 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2166 (double) st->start_time / AV_TIME_BASE,
2167 (double) st->duration / AV_TIME_BASE);
2169 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2170 (double) ic->start_time / AV_TIME_BASE,
2171 (double) ic->duration / AV_TIME_BASE,
2172 ic->bit_rate / 1000);
2176 static int has_codec_parameters(AVCodecContext *avctx)
2179 switch (avctx->codec_type) {
2180 case AVMEDIA_TYPE_AUDIO:
2181 val = avctx->sample_rate && avctx->channels && avctx->sample_fmt != AV_SAMPLE_FMT_NONE;
2182 if (!avctx->frame_size &&
2183 (avctx->codec_id == CODEC_ID_VORBIS ||
2184 avctx->codec_id == CODEC_ID_AAC ||
2185 avctx->codec_id == CODEC_ID_MP1 ||
2186 avctx->codec_id == CODEC_ID_MP2 ||
2187 avctx->codec_id == CODEC_ID_MP3 ||
2188 avctx->codec_id == CODEC_ID_CELT))
2191 case AVMEDIA_TYPE_VIDEO:
2192 val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
2194 case AVMEDIA_TYPE_DATA:
2195 if(avctx->codec_id == CODEC_ID_NONE) return 1;
2200 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2203 static int has_decode_delay_been_guessed(AVStream *st)
2205 return st->codec->codec_id != CODEC_ID_H264 ||
2206 st->info->nb_decoded_frames >= 6;
2209 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2213 int got_picture, data_size, ret=0;
2216 if(!st->codec->codec){
2217 codec = avcodec_find_decoder(st->codec->codec_id);
2220 ret = avcodec_open2(st->codec, codec, options);
2225 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st) ||
2226 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF)) {
2227 switch(st->codec->codec_type) {
2228 case AVMEDIA_TYPE_VIDEO:
2229 avcodec_get_frame_defaults(&picture);
2230 ret = avcodec_decode_video2(st->codec, &picture,
2231 &got_picture, avpkt);
2233 st->info->nb_decoded_frames++;
2235 case AVMEDIA_TYPE_AUDIO:
2236 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2237 samples = av_malloc(data_size);
2240 ret = avcodec_decode_audio3(st->codec, samples,
2252 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2254 while (tags->id != CODEC_ID_NONE) {
2262 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2265 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2266 if(tag == tags[i].tag)
2269 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2270 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2273 return CODEC_ID_NONE;
2276 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2279 for(i=0; tags && tags[i]; i++){
2280 int tag= ff_codec_get_tag(tags[i], id);
2286 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2289 for(i=0; tags && tags[i]; i++){
2290 enum CodecID id= ff_codec_get_id(tags[i], tag);
2291 if(id!=CODEC_ID_NONE) return id;
2293 return CODEC_ID_NONE;
2296 static void compute_chapters_end(AVFormatContext *s)
2299 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2301 for (i = 0; i < s->nb_chapters; i++)
2302 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2303 AVChapter *ch = s->chapters[i];
2304 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2307 for (j = 0; j < s->nb_chapters; j++) {
2308 AVChapter *ch1 = s->chapters[j];
2309 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2310 if (j != i && next_start > ch->start && next_start < end)
2313 ch->end = (end == INT64_MAX) ? ch->start : end;
2317 static int get_std_framerate(int i){
2318 if(i<60*12) return i*1001;
2319 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2323 * Is the time base unreliable.
2324 * This is a heuristic to balance between quick acceptance of the values in
2325 * the headers vs. some extra checks.
2326 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2327 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2328 * And there are "variable" fps files this needs to detect as well.
2330 static int tb_unreliable(AVCodecContext *c){
2331 if( c->time_base.den >= 101L*c->time_base.num
2332 || c->time_base.den < 5L*c->time_base.num
2333 /* || c->codec_tag == AV_RL32("DIVX")
2334 || c->codec_tag == AV_RL32("XVID")*/
2335 || c->codec_id == CODEC_ID_MPEG2VIDEO
2336 || c->codec_id == CODEC_ID_H264
2342 #if FF_API_FORMAT_PARAMETERS
2343 int av_find_stream_info(AVFormatContext *ic)
2345 return avformat_find_stream_info(ic, NULL);
2349 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2351 int i, count, ret, read_size, j;
2353 AVPacket pkt1, *pkt;
2354 int64_t old_offset = avio_tell(ic->pb);
2355 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2357 for(i=0;i<ic->nb_streams;i++) {
2359 st = ic->streams[i];
2361 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2362 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2363 /* if(!st->time_base.num)
2365 if(!st->codec->time_base.num)
2366 st->codec->time_base= st->time_base;
2368 //only for the split stuff
2369 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2370 st->parser = av_parser_init(st->codec->codec_id);
2371 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2372 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2375 assert(!st->codec->codec);
2376 codec = avcodec_find_decoder(st->codec->codec_id);
2378 /* Ensure that subtitle_header is properly set. */
2379 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2380 && codec && !st->codec->codec)
2381 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2383 //try to just open decoders, in case this is enough to get parameters
2384 if(!has_codec_parameters(st->codec)){
2385 if (codec && !st->codec->codec){
2386 AVDictionary *tmp = NULL;
2388 av_dict_copy(&tmp, options[i], 0);
2389 av_dict_set(&tmp, "threads", 0, 0);
2391 avcodec_open2(st->codec, codec, options ? &tmp : NULL);
2397 for (i=0; i<ic->nb_streams; i++) {
2398 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2404 if(url_interrupt_cb()){
2406 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2410 /* check if one codec still needs to be handled */
2411 for(i=0;i<ic->nb_streams;i++) {
2412 int fps_analyze_framecount = 20;
2414 st = ic->streams[i];
2415 if (!has_codec_parameters(st->codec))
2417 /* if the timebase is coarse (like the usual millisecond precision
2418 of mkv), we need to analyze more frames to reliably arrive at
2420 if (av_q2d(st->time_base) > 0.0005)
2421 fps_analyze_framecount *= 2;
2422 if (ic->fps_probe_size >= 0)
2423 fps_analyze_framecount = ic->fps_probe_size;
2424 /* variable fps and no guess at the real fps */
2425 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2426 && st->info->duration_count < fps_analyze_framecount
2427 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2429 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2431 if(st->first_dts == AV_NOPTS_VALUE && (st->codec->codec_type == AVMEDIA_TYPE_VIDEO || st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2434 if (i == ic->nb_streams) {
2435 /* NOTE: if the format has no header, then we need to read
2436 some packets to get most of the streams, so we cannot
2438 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2439 /* if we found the info for all the codecs, we can stop */
2441 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2445 /* we did not get all the codec info, but we read too much data */
2446 if (read_size >= ic->probesize) {
2448 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2452 /* NOTE: a new stream can be added there if no header in file
2453 (AVFMTCTX_NOHEADER) */
2454 ret = read_frame_internal(ic, &pkt1);
2455 if (ret == AVERROR(EAGAIN))
2460 ret = -1; /* we could not have all the codec parameters before EOF */
2461 for(i=0;i<ic->nb_streams;i++) {
2462 st = ic->streams[i];
2463 if (!has_codec_parameters(st->codec)){
2465 avcodec_string(buf, sizeof(buf), st->codec, 0);
2466 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2474 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2475 if ((ret = av_dup_packet(pkt)) < 0)
2476 goto find_stream_info_err;
2478 read_size += pkt->size;
2480 st = ic->streams[pkt->stream_index];
2481 if (st->codec_info_nb_frames>1) {
2483 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) {
2484 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2487 st->info->codec_info_duration += pkt->duration;
2490 int64_t last = st->info->last_dts;
2492 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2493 double dts= pkt->dts * av_q2d(st->time_base);
2494 int64_t duration= pkt->dts - last;
2496 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2497 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2498 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) {
2499 int framerate= get_std_framerate(i);
2500 double sdts= dts*framerate/(1001*12);
2502 int ticks= lrintf(sdts+j*0.5);
2503 double error= sdts - ticks + j*0.5;
2504 st->info->duration_error[j][0][i] += error;
2505 st->info->duration_error[j][1][i] += error*error;
2508 st->info->duration_count++;
2509 // ignore the first 4 values, they might have some random jitter
2510 if (st->info->duration_count > 3)
2511 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2513 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2514 st->info->last_dts = pkt->dts;
2516 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2517 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2519 st->codec->extradata_size= i;
2520 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2521 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2522 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2526 /* if still no information, we try to open the codec and to
2527 decompress the frame. We try to avoid that in most cases as
2528 it takes longer and uses more memory. For MPEG-4, we need to
2529 decompress for QuickTime.
2531 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2532 least one frame of codec data, this makes sure the codec initializes
2533 the channel configuration and does not only trust the values from the container.
2535 try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
2537 st->codec_info_nb_frames++;
2541 // close codecs which were opened in try_decode_frame()
2542 for(i=0;i<ic->nb_streams;i++) {
2543 st = ic->streams[i];
2544 if(st->codec->codec)
2545 avcodec_close(st->codec);
2547 for(i=0;i<ic->nb_streams;i++) {
2548 st = ic->streams[i];
2549 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2550 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2551 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2552 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2553 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2554 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2555 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2556 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2557 st->codec->codec_tag= tag;
2560 // the check for tb_unreliable() is not completely correct, since this is not about handling
2561 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2562 // ipmovie.c produces.
2563 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)
2564 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);
2565 if (st->info->duration_count && !st->r_frame_rate.num
2566 && tb_unreliable(st->codec) /*&&
2567 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2568 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2570 double best_error= 0.01;
2572 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) {
2575 if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2578 int n= st->info->duration_count;
2579 double a= st->info->duration_error[k][0][j] / n;
2580 double error= st->info->duration_error[k][1][j]/n - a*a;
2582 if(error < best_error && best_error> 0.000000001){
2584 num = get_std_framerate(j);
2587 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2590 // do not increase frame rate by more than 1 % in order to match a standard rate.
2591 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2592 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2595 if (!st->r_frame_rate.num){
2596 if( st->codec->time_base.den * (int64_t)st->time_base.num
2597 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2598 st->r_frame_rate.num = st->codec->time_base.den;
2599 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2601 st->r_frame_rate.num = st->time_base.den;
2602 st->r_frame_rate.den = st->time_base.num;
2605 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2606 if(!st->codec->bits_per_coded_sample)
2607 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2608 // set stream disposition based on audio service type
2609 switch (st->codec->audio_service_type) {
2610 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2611 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2612 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2613 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2614 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2615 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2616 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2617 st->disposition = AV_DISPOSITION_COMMENT; break;
2618 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2619 st->disposition = AV_DISPOSITION_KARAOKE; break;
2624 estimate_timings(ic, old_offset);
2626 compute_chapters_end(ic);
2629 /* correct DTS for B-frame streams with no timestamps */
2630 for(i=0;i<ic->nb_streams;i++) {
2631 st = ic->streams[i];
2632 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2634 ppktl = &ic->packet_buffer;
2636 if(ppkt1->stream_index != i)
2638 if(ppkt1->pkt->dts < 0)
2640 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2642 ppkt1->pkt->dts -= delta;
2647 st->cur_dts -= delta;
2653 find_stream_info_err:
2654 for (i=0; i < ic->nb_streams; i++)
2655 av_freep(&ic->streams[i]->info);
2659 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2663 for (i = 0; i < ic->nb_programs; i++) {
2664 if (ic->programs[i] == last) {
2668 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2669 if (ic->programs[i]->stream_index[j] == s)
2670 return ic->programs[i];
2676 int av_find_best_stream(AVFormatContext *ic,
2677 enum AVMediaType type,
2678 int wanted_stream_nb,
2680 AVCodec **decoder_ret,
2683 int i, nb_streams = ic->nb_streams;
2684 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2685 unsigned *program = NULL;
2686 AVCodec *decoder = NULL, *best_decoder = NULL;
2688 if (related_stream >= 0 && wanted_stream_nb < 0) {
2689 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2691 program = p->stream_index;
2692 nb_streams = p->nb_stream_indexes;
2695 for (i = 0; i < nb_streams; i++) {
2696 int real_stream_index = program ? program[i] : i;
2697 AVStream *st = ic->streams[real_stream_index];
2698 AVCodecContext *avctx = st->codec;
2699 if (avctx->codec_type != type)
2701 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2703 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2706 decoder = avcodec_find_decoder(st->codec->codec_id);
2709 ret = AVERROR_DECODER_NOT_FOUND;
2713 if (best_count >= st->codec_info_nb_frames)
2715 best_count = st->codec_info_nb_frames;
2716 ret = real_stream_index;
2717 best_decoder = decoder;
2718 if (program && i == nb_streams - 1 && ret < 0) {
2720 nb_streams = ic->nb_streams;
2721 i = 0; /* no related stream found, try again with everything */
2725 *decoder_ret = best_decoder;
2729 /*******************************************************/
2731 int av_read_play(AVFormatContext *s)
2733 if (s->iformat->read_play)
2734 return s->iformat->read_play(s);
2736 return avio_pause(s->pb, 0);
2737 return AVERROR(ENOSYS);
2740 int av_read_pause(AVFormatContext *s)
2742 if (s->iformat->read_pause)
2743 return s->iformat->read_pause(s);
2745 return avio_pause(s->pb, 1);
2746 return AVERROR(ENOSYS);
2749 void av_close_input_stream(AVFormatContext *s)
2751 flush_packet_queue(s);
2752 if (s->iformat->read_close)
2753 s->iformat->read_close(s);
2754 avformat_free_context(s);
2757 void avformat_free_context(AVFormatContext *s)
2763 if (s->iformat && s->iformat->priv_class && s->priv_data)
2764 av_opt_free(s->priv_data);
2766 for(i=0;i<s->nb_streams;i++) {
2767 /* free all data in a stream component */
2770 av_parser_close(st->parser);
2771 av_free_packet(&st->cur_pkt);
2773 av_dict_free(&st->metadata);
2774 av_freep(&st->index_entries);
2775 av_freep(&st->codec->extradata);
2776 av_freep(&st->codec->subtitle_header);
2777 av_freep(&st->codec);
2778 av_freep(&st->priv_data);
2779 av_freep(&st->info);
2782 for(i=s->nb_programs-1; i>=0; i--) {
2783 av_dict_free(&s->programs[i]->metadata);
2784 av_freep(&s->programs[i]->stream_index);
2785 av_freep(&s->programs[i]);
2787 av_freep(&s->programs);
2788 av_freep(&s->priv_data);
2789 while(s->nb_chapters--) {
2790 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2791 av_freep(&s->chapters[s->nb_chapters]);
2793 av_freep(&s->chapters);
2794 av_dict_free(&s->metadata);
2795 av_freep(&s->streams);
2799 void av_close_input_file(AVFormatContext *s)
2801 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2803 av_close_input_stream(s);
2808 #if FF_API_NEW_STREAM
2809 AVStream *av_new_stream(AVFormatContext *s, int id)
2811 AVStream *st = avformat_new_stream(s, NULL);
2818 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
2824 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2826 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2829 s->streams = streams;
2831 st = av_mallocz(sizeof(AVStream));
2834 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2839 st->codec = avcodec_alloc_context3(c);
2841 /* no default bitrate if decoding */
2842 st->codec->bit_rate = 0;
2844 st->index = s->nb_streams;
2845 st->start_time = AV_NOPTS_VALUE;
2846 st->duration = AV_NOPTS_VALUE;
2847 /* we set the current DTS to 0 so that formats without any timestamps
2848 but durations get some timestamps, formats with some unknown
2849 timestamps have their first few packets buffered and the
2850 timestamps corrected before they are returned to the user */
2852 st->first_dts = AV_NOPTS_VALUE;
2853 st->probe_packets = MAX_PROBE_PACKETS;
2855 /* default pts setting is MPEG-like */
2856 av_set_pts_info(st, 33, 1, 90000);
2857 st->last_IP_pts = AV_NOPTS_VALUE;
2858 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2859 st->pts_buffer[i]= AV_NOPTS_VALUE;
2860 st->reference_dts = AV_NOPTS_VALUE;
2862 st->sample_aspect_ratio = (AVRational){0,1};
2864 s->streams[s->nb_streams++] = st;
2868 AVProgram *av_new_program(AVFormatContext *ac, int id)
2870 AVProgram *program=NULL;
2873 av_dlog(ac, "new_program: id=0x%04x\n", id);
2875 for(i=0; i<ac->nb_programs; i++)
2876 if(ac->programs[i]->id == id)
2877 program = ac->programs[i];
2880 program = av_mallocz(sizeof(AVProgram));
2883 dynarray_add(&ac->programs, &ac->nb_programs, program);
2884 program->discard = AVDISCARD_NONE;
2891 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2893 AVChapter *chapter = NULL;
2896 for(i=0; i<s->nb_chapters; i++)
2897 if(s->chapters[i]->id == id)
2898 chapter = s->chapters[i];
2901 chapter= av_mallocz(sizeof(AVChapter));
2904 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2906 av_dict_set(&chapter->metadata, "title", title, 0);
2908 chapter->time_base= time_base;
2909 chapter->start = start;
2915 /************************************************************/
2916 /* output media file */
2918 #if FF_API_FORMAT_PARAMETERS
2919 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2921 if (s->oformat->priv_data_size > 0) {
2922 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2924 return AVERROR(ENOMEM);
2925 if (s->oformat->priv_class) {
2926 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2927 av_opt_set_defaults(s->priv_data);
2930 s->priv_data = NULL;
2936 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
2937 const char *format, const char *filename)
2939 AVFormatContext *s = avformat_alloc_context();
2948 oformat = av_guess_format(format, NULL, NULL);
2950 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
2951 ret = AVERROR(EINVAL);
2955 oformat = av_guess_format(NULL, filename, NULL);
2957 ret = AVERROR(EINVAL);
2958 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
2965 s->oformat = oformat;
2966 if (s->oformat->priv_data_size > 0) {
2967 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2970 if (s->oformat->priv_class) {
2971 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2972 av_opt_set_defaults(s->priv_data);
2975 s->priv_data = NULL;
2978 av_strlcpy(s->filename, filename, sizeof(s->filename));
2982 av_log(s, AV_LOG_ERROR, "Out of memory\n");
2983 ret = AVERROR(ENOMEM);
2985 avformat_free_context(s);
2989 #if FF_API_ALLOC_OUTPUT_CONTEXT
2990 AVFormatContext *avformat_alloc_output_context(const char *format,
2991 AVOutputFormat *oformat, const char *filename)
2993 AVFormatContext *avctx;
2994 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
2995 return ret < 0 ? NULL : avctx;
2999 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
3001 const AVCodecTag *avctag;
3003 enum CodecID id = CODEC_ID_NONE;
3004 unsigned int tag = 0;
3007 * Check that tag + id is in the table
3008 * If neither is in the table -> OK
3009 * If tag is in the table with another id -> FAIL
3010 * If id is in the table with another tag -> FAIL unless strict < normal
3012 for (n = 0; s->oformat->codec_tag[n]; n++) {
3013 avctag = s->oformat->codec_tag[n];
3014 while (avctag->id != CODEC_ID_NONE) {
3015 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
3017 if (id == st->codec->codec_id)
3020 if (avctag->id == st->codec->codec_id)
3025 if (id != CODEC_ID_NONE)
3027 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
3032 #if FF_API_FORMAT_PARAMETERS
3033 int av_write_header(AVFormatContext *s)
3035 return avformat_write_header(s, NULL);
3039 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
3043 AVDictionary *tmp = NULL;
3046 av_dict_copy(&tmp, *options, 0);
3047 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
3049 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
3050 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3053 // some sanity checks
3054 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
3055 av_log(s, AV_LOG_ERROR, "no streams\n");
3056 ret = AVERROR(EINVAL);
3060 for(i=0;i<s->nb_streams;i++) {
3063 switch (st->codec->codec_type) {
3064 case AVMEDIA_TYPE_AUDIO:
3065 if(st->codec->sample_rate<=0){
3066 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
3067 ret = AVERROR(EINVAL);
3070 if(!st->codec->block_align)
3071 st->codec->block_align = st->codec->channels *
3072 av_get_bits_per_sample(st->codec->codec_id) >> 3;
3074 case AVMEDIA_TYPE_VIDEO:
3075 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
3076 av_log(s, AV_LOG_ERROR, "time base not set\n");
3077 ret = AVERROR(EINVAL);
3080 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
3081 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
3082 ret = AVERROR(EINVAL);
3085 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
3086 && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
3088 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
3089 ret = AVERROR(EINVAL);
3095 if(s->oformat->codec_tag){
3096 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)){
3097 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
3098 st->codec->codec_tag= 0;
3100 if(st->codec->codec_tag){
3101 if (!validate_codec_tag(s, st)) {
3103 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
3104 av_log(s, AV_LOG_ERROR,
3105 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
3106 tagbuf, st->codec->codec_tag, st->codec->codec_id);
3107 ret = AVERROR_INVALIDDATA;
3111 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3114 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3115 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3116 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3119 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3120 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3121 if (!s->priv_data) {
3122 ret = AVERROR(ENOMEM);
3125 if (s->oformat->priv_class) {
3126 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3127 av_opt_set_defaults(s->priv_data);
3128 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3133 /* set muxer identification string */
3134 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3135 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3138 if(s->oformat->write_header){
3139 ret = s->oformat->write_header(s);
3144 /* init PTS generation */
3145 for(i=0;i<s->nb_streams;i++) {
3146 int64_t den = AV_NOPTS_VALUE;
3149 switch (st->codec->codec_type) {
3150 case AVMEDIA_TYPE_AUDIO:
3151 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3153 case AVMEDIA_TYPE_VIDEO:
3154 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3159 if (den != AV_NOPTS_VALUE) {
3161 ret = AVERROR_INVALIDDATA;
3164 frac_init(&st->pts, 0, 0, den);
3169 av_dict_free(options);
3178 //FIXME merge with compute_pkt_fields
3179 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3180 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3181 int num, den, frame_size, i;
3183 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3184 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3186 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
3187 return AVERROR(EINVAL);*/
3189 /* duration field */
3190 if (pkt->duration == 0) {
3191 compute_frame_duration(&num, &den, st, NULL, pkt);
3193 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3197 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3200 //XXX/FIXME this is a temporary hack until all encoders output pts
3201 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3203 // pkt->pts= st->cur_dts;
3204 pkt->pts= st->pts.val;
3207 //calculate dts from pts
3208 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3209 st->pts_buffer[0]= pkt->pts;
3210 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3211 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3212 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3213 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3215 pkt->dts= st->pts_buffer[0];
3218 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)){
3219 av_log(s, AV_LOG_ERROR,
3220 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3221 st->index, st->cur_dts, pkt->dts);
3222 return AVERROR(EINVAL);
3224 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3225 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3226 return AVERROR(EINVAL);
3229 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3230 st->cur_dts= pkt->dts;
3231 st->pts.val= pkt->dts;
3234 switch (st->codec->codec_type) {
3235 case AVMEDIA_TYPE_AUDIO:
3236 frame_size = get_audio_frame_size(st->codec, pkt->size);
3238 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3239 likely equal to the encoder delay, but it would be better if we
3240 had the real timestamps from the encoder */
3241 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3242 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3245 case AVMEDIA_TYPE_VIDEO:
3246 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3254 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3256 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3258 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3261 ret= s->oformat->write_packet(s, pkt);
3264 s->streams[pkt->stream_index]->nb_frames++;
3268 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3269 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3271 AVPacketList **next_point, *this_pktl;
3273 this_pktl = av_mallocz(sizeof(AVPacketList));
3274 this_pktl->pkt= *pkt;
3275 pkt->destruct= NULL; // do not free original but only the copy
3276 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3278 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3279 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3281 next_point = &s->packet_buffer;
3284 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3285 while(!compare(s, &(*next_point)->pkt, pkt)){
3286 next_point= &(*next_point)->next;
3290 next_point = &(s->packet_buffer_end->next);
3293 assert(!*next_point);
3295 s->packet_buffer_end= this_pktl;
3298 this_pktl->next= *next_point;
3300 s->streams[pkt->stream_index]->last_in_packet_buffer=
3301 *next_point= this_pktl;
3304 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3306 AVStream *st = s->streams[ pkt ->stream_index];
3307 AVStream *st2= s->streams[ next->stream_index];
3308 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3312 return pkt->stream_index < next->stream_index;
3316 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3318 int stream_count=0, noninterleaved_count=0;
3319 int64_t delta_dts_max = 0;
3323 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3326 for(i=0; i < s->nb_streams; i++) {
3327 if (s->streams[i]->last_in_packet_buffer) {
3329 } else if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3330 ++noninterleaved_count;
3334 if (s->nb_streams == stream_count) {
3337 for(i=0; i < s->nb_streams; i++) {
3338 if (s->streams[i]->last_in_packet_buffer) {
3340 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
3341 s->streams[i]->time_base,
3343 av_rescale_q(s->packet_buffer->pkt.dts,
3344 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
3346 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
3349 if(s->nb_streams == stream_count+noninterleaved_count &&
3350 delta_dts_max > 20*AV_TIME_BASE) {
3351 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
3355 if(stream_count && flush){
3356 pktl= s->packet_buffer;
3359 s->packet_buffer= pktl->next;
3360 if(!s->packet_buffer)
3361 s->packet_buffer_end= NULL;
3363 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3364 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3368 av_init_packet(out);
3374 * Interleave an AVPacket correctly so it can be muxed.
3375 * @param out the interleaved packet will be output here
3376 * @param in the input packet
3377 * @param flush 1 if no further packets are available as input and all
3378 * remaining packets should be output
3379 * @return 1 if a packet was output, 0 if no packet could be output,
3380 * < 0 if an error occurred
3382 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3383 if(s->oformat->interleave_packet)
3384 return s->oformat->interleave_packet(s, out, in, flush);
3386 return av_interleave_packet_per_dts(s, out, in, flush);
3389 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3390 AVStream *st= s->streams[ pkt->stream_index];
3393 //FIXME/XXX/HACK drop zero sized packets
3394 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3397 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3398 pkt->size, pkt->dts, pkt->pts);
3399 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3402 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3403 return AVERROR(EINVAL);
3407 int ret= interleave_packet(s, &opkt, pkt, 0);
3408 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3411 ret= s->oformat->write_packet(s, &opkt);
3413 s->streams[opkt.stream_index]->nb_frames++;
3415 av_free_packet(&opkt);
3420 if(s->pb && s->pb->error)
3421 return s->pb->error;
3425 int av_write_trailer(AVFormatContext *s)
3431 ret= interleave_packet(s, &pkt, NULL, 1);
3432 if(ret<0) //FIXME cleanup needed for ret<0 ?
3437 ret= s->oformat->write_packet(s, &pkt);
3439 s->streams[pkt.stream_index]->nb_frames++;
3441 av_free_packet(&pkt);
3445 if(s->pb && s->pb->error)
3449 if(s->oformat->write_trailer)
3450 ret = s->oformat->write_trailer(s);
3453 ret = s->pb ? s->pb->error : 0;
3454 for(i=0;i<s->nb_streams;i++) {
3455 av_freep(&s->streams[i]->priv_data);
3456 av_freep(&s->streams[i]->index_entries);
3458 if (s->iformat && s->iformat->priv_class)
3459 av_opt_free(s->priv_data);
3460 av_freep(&s->priv_data);
3464 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
3465 int64_t *dts, int64_t *wall)
3467 if (!s->oformat || !s->oformat->get_output_timestamp)
3468 return AVERROR(ENOSYS);
3469 s->oformat->get_output_timestamp(s, stream, dts, wall);
3473 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3476 AVProgram *program=NULL;
3479 if (idx >= ac->nb_streams) {
3480 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3484 for(i=0; i<ac->nb_programs; i++){
3485 if(ac->programs[i]->id != progid)
3487 program = ac->programs[i];
3488 for(j=0; j<program->nb_stream_indexes; j++)
3489 if(program->stream_index[j] == idx)
3492 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3495 program->stream_index = tmp;
3496 program->stream_index[program->nb_stream_indexes++] = idx;
3501 static void print_fps(double d, const char *postfix){
3502 uint64_t v= lrintf(d*100);
3503 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3504 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3505 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3508 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3510 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3511 AVDictionaryEntry *tag=NULL;
3513 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3514 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3515 if(strcmp("language", tag->key)){
3518 av_strlcpy(tmp, tag->value, sizeof(tmp));
3519 for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
3520 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tmp);
3526 /* "user interface" functions */
3527 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3530 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3531 AVStream *st = ic->streams[i];
3532 int g = av_gcd(st->time_base.num, st->time_base.den);
3533 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3534 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3535 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
3536 /* the pid is an important information, so we display it */
3537 /* XXX: add a generic system */
3538 if (flags & AVFMT_SHOW_IDS)
3539 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3541 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3542 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3543 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3544 if (st->sample_aspect_ratio.num && // default
3545 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3546 AVRational display_aspect_ratio;
3547 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3548 st->codec->width*st->sample_aspect_ratio.num,
3549 st->codec->height*st->sample_aspect_ratio.den,
3551 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3552 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3553 display_aspect_ratio.num, display_aspect_ratio.den);
3555 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3556 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3557 print_fps(av_q2d(st->avg_frame_rate), "fps");
3558 if(st->r_frame_rate.den && st->r_frame_rate.num)
3559 print_fps(av_q2d(st->r_frame_rate), "tbr");
3560 if(st->time_base.den && st->time_base.num)
3561 print_fps(1/av_q2d(st->time_base), "tbn");
3562 if(st->codec->time_base.den && st->codec->time_base.num)
3563 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3565 if (st->disposition & AV_DISPOSITION_DEFAULT)
3566 av_log(NULL, AV_LOG_INFO, " (default)");
3567 if (st->disposition & AV_DISPOSITION_DUB)
3568 av_log(NULL, AV_LOG_INFO, " (dub)");
3569 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3570 av_log(NULL, AV_LOG_INFO, " (original)");
3571 if (st->disposition & AV_DISPOSITION_COMMENT)
3572 av_log(NULL, AV_LOG_INFO, " (comment)");
3573 if (st->disposition & AV_DISPOSITION_LYRICS)
3574 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3575 if (st->disposition & AV_DISPOSITION_KARAOKE)
3576 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3577 if (st->disposition & AV_DISPOSITION_FORCED)
3578 av_log(NULL, AV_LOG_INFO, " (forced)");
3579 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3580 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3581 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3582 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3583 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3584 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3585 av_log(NULL, AV_LOG_INFO, "\n");
3586 dump_metadata(NULL, st->metadata, " ");
3589 #if FF_API_DUMP_FORMAT
3590 void dump_format(AVFormatContext *ic,
3595 av_dump_format(ic, index, url, is_output);
3599 void av_dump_format(AVFormatContext *ic,
3605 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3606 if (ic->nb_streams && !printed)
3609 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3610 is_output ? "Output" : "Input",
3612 is_output ? ic->oformat->name : ic->iformat->name,
3613 is_output ? "to" : "from", url);
3614 dump_metadata(NULL, ic->metadata, " ");
3616 av_log(NULL, AV_LOG_INFO, " Duration: ");
3617 if (ic->duration != AV_NOPTS_VALUE) {
3618 int hours, mins, secs, us;
3619 secs = ic->duration / AV_TIME_BASE;
3620 us = ic->duration % AV_TIME_BASE;
3625 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3626 (100 * us) / AV_TIME_BASE);
3628 av_log(NULL, AV_LOG_INFO, "N/A");
3630 if (ic->start_time != AV_NOPTS_VALUE) {
3632 av_log(NULL, AV_LOG_INFO, ", start: ");
3633 secs = ic->start_time / AV_TIME_BASE;
3634 us = abs(ic->start_time % AV_TIME_BASE);
3635 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3636 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3638 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3640 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3642 av_log(NULL, AV_LOG_INFO, "N/A");
3644 av_log(NULL, AV_LOG_INFO, "\n");
3646 for (i = 0; i < ic->nb_chapters; i++) {
3647 AVChapter *ch = ic->chapters[i];
3648 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3649 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3650 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3652 dump_metadata(NULL, ch->metadata, " ");
3654 if(ic->nb_programs) {
3655 int j, k, total = 0;
3656 for(j=0; j<ic->nb_programs; j++) {
3657 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3659 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3660 name ? name->value : "");
3661 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3662 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3663 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3664 printed[ic->programs[j]->stream_index[k]] = 1;
3666 total += ic->programs[j]->nb_stream_indexes;
3668 if (total < ic->nb_streams)
3669 av_log(NULL, AV_LOG_INFO, " No Program\n");
3671 for(i=0;i<ic->nb_streams;i++)
3673 dump_stream_format(ic, i, index, is_output);
3678 int64_t av_gettime(void)
3681 gettimeofday(&tv,NULL);
3682 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3685 uint64_t ff_ntp_time(void)
3687 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3690 #if FF_API_PARSE_DATE
3691 #include "libavutil/parseutils.h"
3693 int64_t parse_date(const char *timestr, int duration)
3696 av_parse_time(&timeval, timestr, duration);
3701 #if FF_API_FIND_INFO_TAG
3702 #include "libavutil/parseutils.h"
3704 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3706 return av_find_info_tag(arg, arg_size, tag1, info);
3710 int av_get_frame_filename(char *buf, int buf_size,
3711 const char *path, int number)
3714 char *q, buf1[20], c;
3715 int nd, len, percentd_found;
3727 while (isdigit(*p)) {
3728 nd = nd * 10 + *p++ - '0';
3731 } while (isdigit(c));
3740 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3742 if ((q - buf + len) > buf_size - 1)
3744 memcpy(q, buf1, len);
3752 if ((q - buf) < buf_size - 1)
3756 if (!percentd_found)
3765 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3769 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3771 for(i=0;i<size;i+=16) {
3778 PRINT(" %02x", buf[i+j]);
3783 for(j=0;j<len;j++) {
3785 if (c < ' ' || c > '~')
3794 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3796 hex_dump_internal(NULL, f, 0, buf, size);
3799 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3801 hex_dump_internal(avcl, NULL, level, buf, size);
3804 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3807 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3808 PRINT("stream #%d:\n", pkt->stream_index);
3809 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3810 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3811 /* DTS is _always_ valid after av_read_frame() */
3813 if (pkt->dts == AV_NOPTS_VALUE)
3816 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3817 /* PTS may not be known if B-frames are present. */
3819 if (pkt->pts == AV_NOPTS_VALUE)
3822 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3824 PRINT(" size=%d\n", pkt->size);
3827 av_hex_dump(f, pkt->data, pkt->size);
3831 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3833 AVRational tb = { 1, AV_TIME_BASE };
3834 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3838 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3840 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3844 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3846 AVRational tb = { 1, AV_TIME_BASE };
3847 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3851 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3854 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3857 void av_url_split(char *proto, int proto_size,
3858 char *authorization, int authorization_size,
3859 char *hostname, int hostname_size,
3861 char *path, int path_size,
3864 const char *p, *ls, *at, *col, *brk;
3866 if (port_ptr) *port_ptr = -1;
3867 if (proto_size > 0) proto[0] = 0;
3868 if (authorization_size > 0) authorization[0] = 0;
3869 if (hostname_size > 0) hostname[0] = 0;
3870 if (path_size > 0) path[0] = 0;
3872 /* parse protocol */
3873 if ((p = strchr(url, ':'))) {
3874 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3879 /* no protocol means plain filename */
3880 av_strlcpy(path, url, path_size);
3884 /* separate path from hostname */
3885 ls = strchr(p, '/');
3887 ls = strchr(p, '?');
3889 av_strlcpy(path, ls, path_size);
3891 ls = &p[strlen(p)]; // XXX
3893 /* the rest is hostname, use that to parse auth/port */
3895 /* authorization (user[:pass]@hostname) */
3896 if ((at = strchr(p, '@')) && at < ls) {
3897 av_strlcpy(authorization, p,
3898 FFMIN(authorization_size, at + 1 - p));
3899 p = at + 1; /* skip '@' */
3902 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3904 av_strlcpy(hostname, p + 1,
3905 FFMIN(hostname_size, brk - p));
3906 if (brk[1] == ':' && port_ptr)
3907 *port_ptr = atoi(brk + 2);
3908 } else if ((col = strchr(p, ':')) && col < ls) {
3909 av_strlcpy(hostname, p,
3910 FFMIN(col + 1 - p, hostname_size));
3911 if (port_ptr) *port_ptr = atoi(col + 1);
3913 av_strlcpy(hostname, p,
3914 FFMIN(ls + 1 - p, hostname_size));
3918 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3921 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3924 'C', 'D', 'E', 'F' };
3925 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3928 'c', 'd', 'e', 'f' };
3929 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3931 for(i = 0; i < s; i++) {
3932 buff[i * 2] = hex_table[src[i] >> 4];
3933 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3939 int ff_hex_to_data(uint8_t *data, const char *p)
3946 p += strspn(p, SPACE_CHARS);
3949 c = toupper((unsigned char) *p++);
3950 if (c >= '0' && c <= '9')
3952 else if (c >= 'A' && c <= 'F')
3967 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3968 unsigned int pts_num, unsigned int pts_den)
3971 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3972 if(new_tb.num != pts_num)
3973 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3975 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3977 if(new_tb.num <= 0 || new_tb.den <= 0) {
3978 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3981 s->time_base = new_tb;
3982 s->pts_wrap_bits = pts_wrap_bits;
3985 int ff_url_join(char *str, int size, const char *proto,
3986 const char *authorization, const char *hostname,
3987 int port, const char *fmt, ...)
3990 struct addrinfo hints, *ai;
3995 av_strlcatf(str, size, "%s://", proto);
3996 if (authorization && authorization[0])
3997 av_strlcatf(str, size, "%s@", authorization);
3998 #if CONFIG_NETWORK && defined(AF_INET6)
3999 /* Determine if hostname is a numerical IPv6 address,
4000 * properly escape it within [] in that case. */
4001 memset(&hints, 0, sizeof(hints));
4002 hints.ai_flags = AI_NUMERICHOST;
4003 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
4004 if (ai->ai_family == AF_INET6) {
4005 av_strlcat(str, "[", size);
4006 av_strlcat(str, hostname, size);
4007 av_strlcat(str, "]", size);
4009 av_strlcat(str, hostname, size);
4014 /* Not an IPv6 address, just output the plain string. */
4015 av_strlcat(str, hostname, size);
4018 av_strlcatf(str, size, ":%d", port);
4021 int len = strlen(str);
4024 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
4030 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
4031 AVFormatContext *src)
4036 local_pkt.stream_index = dst_stream;
4037 if (pkt->pts != AV_NOPTS_VALUE)
4038 local_pkt.pts = av_rescale_q(pkt->pts,
4039 src->streams[pkt->stream_index]->time_base,
4040 dst->streams[dst_stream]->time_base);
4041 if (pkt->dts != AV_NOPTS_VALUE)
4042 local_pkt.dts = av_rescale_q(pkt->dts,
4043 src->streams[pkt->stream_index]->time_base,
4044 dst->streams[dst_stream]->time_base);
4045 return av_write_frame(dst, &local_pkt);
4048 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4051 const char *ptr = str;
4053 /* Parse key=value pairs. */
4056 char *dest = NULL, *dest_end;
4057 int key_len, dest_len = 0;
4059 /* Skip whitespace and potential commas. */
4060 while (*ptr && (isspace(*ptr) || *ptr == ','))
4067 if (!(ptr = strchr(key, '=')))
4070 key_len = ptr - key;
4072 callback_get_buf(context, key, key_len, &dest, &dest_len);
4073 dest_end = dest + dest_len - 1;
4077 while (*ptr && *ptr != '\"') {
4081 if (dest && dest < dest_end)
4085 if (dest && dest < dest_end)
4093 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
4094 if (dest && dest < dest_end)
4102 int ff_find_stream_index(AVFormatContext *s, int id)
4105 for (i = 0; i < s->nb_streams; i++) {
4106 if (s->streams[i]->id == id)
4112 void ff_make_absolute_url(char *buf, int size, const char *base,
4116 /* Absolute path, relative to the current server */
4117 if (base && strstr(base, "://") && rel[0] == '/') {
4119 av_strlcpy(buf, base, size);
4120 sep = strstr(buf, "://");
4123 sep = strchr(sep, '/');
4127 av_strlcat(buf, rel, size);
4130 /* If rel actually is an absolute url, just copy it */
4131 if (!base || strstr(rel, "://") || rel[0] == '/') {
4132 av_strlcpy(buf, rel, size);
4136 av_strlcpy(buf, base, size);
4137 /* Remove the file name from the base url */
4138 sep = strrchr(buf, '/');
4143 while (av_strstart(rel, "../", NULL) && sep) {
4144 /* Remove the path delimiter at the end */
4146 sep = strrchr(buf, '/');
4147 /* If the next directory name to pop off is "..", break here */
4148 if (!strcmp(sep ? &sep[1] : buf, "..")) {
4149 /* Readd the slash we just removed */
4150 av_strlcat(buf, "/", size);
4153 /* Cut off the directory name */
4160 av_strlcat(buf, rel, size);
4163 int64_t ff_iso8601_to_unix_time(const char *datestr)
4166 struct tm time = {0};
4167 strptime(datestr, "%Y - %m - %dT%T", &time);
4168 return mktime(&time);
4170 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
4171 "the date string.\n");
4176 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
4179 if (ofmt->query_codec)
4180 return ofmt->query_codec(codec_id, std_compliance);
4181 else if (ofmt->codec_tag)
4182 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4183 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4184 codec_id == ofmt->subtitle_codec)
4187 return AVERROR_PATCHWELCOME;