2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "avio_internal.h"
27 #include "libavcodec/internal.h"
28 #include "libavcodec/raw.h"
29 #include "libavutil/opt.h"
30 #include "libavutil/dict.h"
31 #include "libavutil/pixdesc.h"
34 #include "libavutil/avstring.h"
35 #include "libavutil/mathematics.h"
37 #include "audiointerleave.h"
52 * various utility functions for use within FFmpeg
55 unsigned avformat_version(void)
57 return LIBAVFORMAT_VERSION_INT;
60 const char *avformat_configuration(void)
62 return FFMPEG_CONFIGURATION;
65 const char *avformat_license(void)
67 #define LICENSE_PREFIX "libavformat license: "
68 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
71 /* fraction handling */
74 * f = val + (num / den) + 0.5.
76 * 'num' is normalized so that it is such as 0 <= num < den.
78 * @param f fractional number
79 * @param val integer value
80 * @param num must be >= 0
81 * @param den must be >= 1
83 static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
96 * Fractional addition to f: f = f + (incr / f->den).
98 * @param f fractional number
99 * @param incr increment, can be positive or negative
101 static void frac_add(AVFrac *f, int64_t incr)
114 } else if (num >= den) {
121 /** head of registered input format linked list */
122 static AVInputFormat *first_iformat = NULL;
123 /** head of registered output format linked list */
124 static AVOutputFormat *first_oformat = NULL;
126 AVInputFormat *av_iformat_next(AVInputFormat *f)
128 if(f) return f->next;
129 else return first_iformat;
132 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
134 if(f) return f->next;
135 else return first_oformat;
138 void av_register_input_format(AVInputFormat *format)
142 while (*p != NULL) p = &(*p)->next;
147 void av_register_output_format(AVOutputFormat *format)
151 while (*p != NULL) p = &(*p)->next;
156 int av_match_ext(const char *filename, const char *extensions)
164 ext = strrchr(filename, '.');
170 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
173 if (!strcasecmp(ext1, ext))
183 static int match_format(const char *name, const char *names)
191 namelen = strlen(name);
192 while ((p = strchr(names, ','))) {
193 len = FFMAX(p - names, namelen);
194 if (!strncasecmp(name, names, len))
198 return !strcasecmp(name, names);
201 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
202 const char *mime_type)
204 AVOutputFormat *fmt = NULL, *fmt_found;
205 int score_max, score;
207 /* specific test for image sequences */
208 #if CONFIG_IMAGE2_MUXER
209 if (!short_name && filename &&
210 av_filename_number_test(filename) &&
211 ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
212 return av_guess_format("image2", NULL, NULL);
215 /* Find the proper file type. */
218 while ((fmt = av_oformat_next(fmt))) {
220 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
222 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
224 if (filename && fmt->extensions &&
225 av_match_ext(filename, fmt->extensions)) {
228 if (score > score_max) {
236 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
237 const char *filename, const char *mime_type, enum AVMediaType type){
238 if(type == AVMEDIA_TYPE_VIDEO){
239 enum CodecID codec_id= CODEC_ID_NONE;
241 #if CONFIG_IMAGE2_MUXER
242 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
243 codec_id= ff_guess_image2_codec(filename);
246 if(codec_id == CODEC_ID_NONE)
247 codec_id= fmt->video_codec;
249 }else if(type == AVMEDIA_TYPE_AUDIO)
250 return fmt->audio_codec;
251 else if (type == AVMEDIA_TYPE_SUBTITLE)
252 return fmt->subtitle_codec;
254 return CODEC_ID_NONE;
257 AVInputFormat *av_find_input_format(const char *short_name)
259 AVInputFormat *fmt = NULL;
260 while ((fmt = av_iformat_next(fmt))) {
261 if (match_format(short_name, fmt->name))
268 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
270 int ret= av_new_packet(pkt, size);
275 pkt->pos= avio_tell(s);
277 ret= avio_read(s, pkt->data, size);
281 av_shrink_packet(pkt, ret);
286 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
291 return av_get_packet(s, pkt, size);
292 old_size = pkt->size;
293 ret = av_grow_packet(pkt, size);
296 ret = avio_read(s, pkt->data + old_size, size);
297 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
302 int av_filename_number_test(const char *filename)
305 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
308 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
310 AVProbeData lpd = *pd;
311 AVInputFormat *fmt1 = NULL, *fmt;
312 int score, score_max=0;
314 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
315 int id3len = ff_id3v2_tag_len(lpd.buf);
316 if (lpd.buf_size > id3len + 16) {
318 lpd.buf_size -= id3len;
323 while ((fmt1 = av_iformat_next(fmt1))) {
324 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
327 if (fmt1->read_probe) {
328 score = fmt1->read_probe(&lpd);
329 if(!score && fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
331 } else if (fmt1->extensions) {
332 if (av_match_ext(lpd.filename, fmt1->extensions)) {
336 if (score > score_max) {
339 }else if (score == score_max)
342 *score_ret= score_max;
346 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
349 AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
350 if(score_ret > *score_max){
351 *score_max= score_ret;
357 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
359 return av_probe_input_format2(pd, is_opened, &score);
362 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
364 static const struct {
365 const char *name; enum CodecID id; enum AVMediaType type;
367 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
368 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
369 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
370 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
371 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
372 { "loas" , CODEC_ID_AAC_LATM , AVMEDIA_TYPE_AUDIO },
373 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
374 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
375 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
379 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
383 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
384 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
385 for (i = 0; fmt_id_type[i].name; i++) {
386 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
387 st->codec->codec_id = fmt_id_type[i].id;
388 st->codec->codec_type = fmt_id_type[i].type;
396 /************************************************************/
397 /* input media file */
399 #if FF_API_FORMAT_PARAMETERS
400 static AVDictionary *convert_format_parameters(AVFormatParameters *ap)
403 AVDictionary *opts = NULL;
408 if (ap->time_base.num) {
409 snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
410 av_dict_set(&opts, "framerate", buf, 0);
412 if (ap->sample_rate) {
413 snprintf(buf, sizeof(buf), "%d", ap->sample_rate);
414 av_dict_set(&opts, "sample_rate", buf, 0);
417 snprintf(buf, sizeof(buf), "%d", ap->channels);
418 av_dict_set(&opts, "channels", buf, 0);
420 if (ap->width || ap->height) {
421 snprintf(buf, sizeof(buf), "%dx%d", ap->width, ap->height);
422 av_dict_set(&opts, "video_size", buf, 0);
424 if (ap->pix_fmt != PIX_FMT_NONE) {
425 av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(ap->pix_fmt), 0);
428 snprintf(buf, sizeof(buf), "%d", ap->channel);
429 av_dict_set(&opts, "channel", buf, 0);
432 av_dict_set(&opts, "standard", ap->standard, 0);
434 if (ap->mpeg2ts_compute_pcr) {
435 av_dict_set(&opts, "mpeg2ts_compute_pcr", "1", 0);
437 if (ap->initial_pause) {
438 av_dict_set(&opts, "initial_pause", "1", 0);
444 * Open a media file from an IO stream. 'fmt' must be specified.
446 int av_open_input_stream(AVFormatContext **ic_ptr,
447 AVIOContext *pb, const char *filename,
448 AVInputFormat *fmt, AVFormatParameters *ap)
453 AVFormatParameters default_ap;
457 memset(ap, 0, sizeof(default_ap));
459 opts = convert_format_parameters(ap);
461 if(!ap->prealloced_context)
462 *ic_ptr = ic = avformat_alloc_context();
466 err = AVERROR(ENOMEM);
469 if (pb && fmt && fmt->flags & AVFMT_NOFILE)
470 av_log(ic, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
471 "will be ignored with AVFMT_NOFILE format.\n");
475 if ((err = avformat_open_input(&ic, filename, fmt, &opts)) < 0)
477 ic->pb = ic->pb ? ic->pb : pb; // don't leak custom pb if it wasn't set above
486 int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap){
489 if (ic->iformat->read_header) {
490 err = ic->iformat->read_header(ic, ap);
495 if (ic->pb && !ic->data_offset)
496 ic->data_offset = avio_tell(ic->pb);
502 /** size of probe buffer, for guessing file type from file contents */
503 #define PROBE_BUF_MIN 2048
504 #define PROBE_BUF_MAX (1<<20)
506 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
507 const char *filename, void *logctx,
508 unsigned int offset, unsigned int max_probe_size)
510 AVProbeData pd = { filename ? filename : "", NULL, -offset };
511 unsigned char *buf = NULL;
512 int ret = 0, probe_size;
514 if (!max_probe_size) {
515 max_probe_size = PROBE_BUF_MAX;
516 } else if (max_probe_size > PROBE_BUF_MAX) {
517 max_probe_size = PROBE_BUF_MAX;
518 } else if (max_probe_size < PROBE_BUF_MIN) {
519 return AVERROR(EINVAL);
522 if (offset >= max_probe_size) {
523 return AVERROR(EINVAL);
526 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
527 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
528 int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
529 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
532 if (probe_size < offset) {
536 /* read probe data */
537 buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
540 return AVERROR(ENOMEM);
543 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
544 /* fail if error was not end of file, otherwise, lower score */
545 if (ret != AVERROR_EOF) {
550 ret = 0; /* error was end of file, nothing read */
553 pd.buf = &buf[offset];
555 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
557 /* guess file format */
558 *fmt = av_probe_input_format2(&pd, 1, &score);
560 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
561 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
563 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
569 return AVERROR_INVALIDDATA;
572 /* rewind. reuse probe buffer to avoid seeking */
573 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
579 #if FF_API_FORMAT_PARAMETERS
580 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
583 AVFormatParameters *ap)
586 AVDictionary *opts = convert_format_parameters(ap);
588 if (!ap || !ap->prealloced_context)
591 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
598 /* open input file and probe the format if necessary */
599 static int init_input(AVFormatContext *s, const char *filename)
602 AVProbeData pd = {filename, NULL, 0};
605 s->flags |= AVFMT_FLAG_CUSTOM_IO;
607 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
608 else if (s->iformat->flags & AVFMT_NOFILE)
609 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
610 "will be ignored with AVFMT_NOFILE format.\n");
614 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
615 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
618 if ((ret = avio_open(&s->pb, filename, AVIO_FLAG_READ)) < 0)
622 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
625 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
627 AVFormatContext *s = *ps;
629 AVFormatParameters ap = { { 0 } };
630 AVDictionary *tmp = NULL;
632 if (!s && !(s = avformat_alloc_context()))
633 return AVERROR(ENOMEM);
638 av_dict_copy(&tmp, *options, 0);
640 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
643 if ((ret = init_input(s, filename)) < 0)
646 /* check filename in case an image number is expected */
647 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
648 if (!av_filename_number_test(filename)) {
649 ret = AVERROR(EINVAL);
654 s->duration = s->start_time = AV_NOPTS_VALUE;
655 av_strlcpy(s->filename, filename, sizeof(s->filename));
657 /* allocate private data */
658 if (s->iformat->priv_data_size > 0) {
659 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
660 ret = AVERROR(ENOMEM);
663 if (s->iformat->priv_class) {
664 *(const AVClass**)s->priv_data = s->iformat->priv_class;
665 av_opt_set_defaults(s->priv_data);
666 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
671 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
673 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
675 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
676 if ((ret = s->iformat->read_header(s, &ap)) < 0)
679 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
680 s->data_offset = avio_tell(s->pb);
682 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
685 av_dict_free(options);
693 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
695 avformat_free_context(s);
700 /*******************************************************/
702 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
703 AVPacketList **plast_pktl){
704 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
709 (*plast_pktl)->next = pktl;
711 *packet_buffer = pktl;
713 /* add the packet in the buffered packet list */
719 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
725 AVPacketList *pktl = s->raw_packet_buffer;
729 if(s->streams[pkt->stream_index]->request_probe <= 0){
730 s->raw_packet_buffer = pktl->next;
731 s->raw_packet_buffer_remaining_size += pkt->size;
738 ret= s->iformat->read_packet(s, pkt);
740 if (!pktl || ret == AVERROR(EAGAIN))
742 for (i = 0; i < s->nb_streams; i++)
743 if(s->streams[i]->request_probe > 0)
744 s->streams[i]->request_probe = -1;
748 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
749 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
750 av_log(s, AV_LOG_WARNING,
751 "Dropped corrupted packet (stream = %d)\n",
756 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
757 av_packet_merge_side_data(pkt);
759 st= s->streams[pkt->stream_index];
761 switch(st->codec->codec_type){
762 case AVMEDIA_TYPE_VIDEO:
763 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
765 case AVMEDIA_TYPE_AUDIO:
766 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
768 case AVMEDIA_TYPE_SUBTITLE:
769 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
773 if(!pktl && st->request_probe <= 0)
776 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
777 s->raw_packet_buffer_remaining_size -= pkt->size;
779 if(st->request_probe>0){
780 AVProbeData *pd = &st->probe_data;
782 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
785 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
786 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
787 pd->buf_size += pkt->size;
788 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
790 end= s->raw_packet_buffer_remaining_size <= 0
791 || st->probe_packets<=0;
793 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
794 int score= set_codec_from_probe_data(s, st, pd);
795 if( (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
799 st->request_probe= -1;
800 if(st->codec->codec_id != CODEC_ID_NONE){
801 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
803 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
810 /**********************************************************/
813 * Get the number of samples of an audio frame. Return -1 on error.
815 static int get_audio_frame_size(AVCodecContext *enc, int size)
819 if(enc->codec_id == CODEC_ID_VORBIS)
822 if (enc->frame_size <= 1) {
823 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
825 if (bits_per_sample) {
826 if (enc->channels == 0)
828 frame_size = (size << 3) / (bits_per_sample * enc->channels);
830 /* used for example by ADPCM codecs */
831 if (enc->bit_rate == 0)
833 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
836 frame_size = enc->frame_size;
843 * Return the frame duration in seconds. Return 0 if not available.
845 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
846 AVCodecParserContext *pc, AVPacket *pkt)
852 switch(st->codec->codec_type) {
853 case AVMEDIA_TYPE_VIDEO:
854 if(st->time_base.num*1000LL > st->time_base.den){
855 *pnum = st->time_base.num;
856 *pden = st->time_base.den;
857 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
858 *pnum = st->codec->time_base.num;
859 *pden = st->codec->time_base.den;
860 if (pc && pc->repeat_pict) {
861 *pnum = (*pnum) * (1 + pc->repeat_pict);
863 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
864 //Thus if we have no parser in such case leave duration undefined.
865 if(st->codec->ticks_per_frame>1 && !pc){
870 case AVMEDIA_TYPE_AUDIO:
871 frame_size = get_audio_frame_size(st->codec, pkt->size);
872 if (frame_size <= 0 || st->codec->sample_rate <= 0)
875 *pden = st->codec->sample_rate;
882 static int is_intra_only(AVCodecContext *enc){
883 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
885 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
886 switch(enc->codec_id){
888 case CODEC_ID_MJPEGB:
890 case CODEC_ID_RAWVIDEO:
891 case CODEC_ID_DVVIDEO:
892 case CODEC_ID_HUFFYUV:
893 case CODEC_ID_FFVHUFF:
898 case CODEC_ID_JPEG2000:
906 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
907 int64_t dts, int64_t pts)
909 AVStream *st= s->streams[stream_index];
910 AVPacketList *pktl= s->packet_buffer;
912 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
915 st->first_dts= dts - st->cur_dts;
918 for(; pktl; pktl= pktl->next){
919 if(pktl->pkt.stream_index != stream_index)
921 //FIXME think more about this check
922 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
923 pktl->pkt.pts += st->first_dts;
925 if(pktl->pkt.dts != AV_NOPTS_VALUE)
926 pktl->pkt.dts += st->first_dts;
928 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
929 st->start_time= pktl->pkt.pts;
931 if (st->start_time == AV_NOPTS_VALUE)
932 st->start_time = pts;
935 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
937 AVPacketList *pktl= s->packet_buffer;
940 if(st->first_dts != AV_NOPTS_VALUE){
941 cur_dts= st->first_dts;
942 for(; pktl; pktl= pktl->next){
943 if(pktl->pkt.stream_index == pkt->stream_index){
944 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
946 cur_dts -= pkt->duration;
949 pktl= s->packet_buffer;
950 st->first_dts = cur_dts;
951 }else if(st->cur_dts)
954 for(; pktl; pktl= pktl->next){
955 if(pktl->pkt.stream_index != pkt->stream_index)
957 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
958 && !pktl->pkt.duration){
959 pktl->pkt.dts= cur_dts;
960 if(!st->codec->has_b_frames)
961 pktl->pkt.pts= cur_dts;
962 cur_dts += pkt->duration;
963 pktl->pkt.duration= pkt->duration;
967 if(st->first_dts == AV_NOPTS_VALUE)
968 st->cur_dts= cur_dts;
971 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
972 AVCodecParserContext *pc, AVPacket *pkt)
974 int num, den, presentation_delayed, delay, i;
977 if (s->flags & AVFMT_FLAG_NOFILLIN)
980 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
981 pkt->dts= AV_NOPTS_VALUE;
983 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
984 //FIXME Set low_delay = 0 when has_b_frames = 1
985 st->codec->has_b_frames = 1;
987 /* do we have a video B-frame ? */
988 delay= st->codec->has_b_frames;
989 presentation_delayed = 0;
991 // ignore delay caused by frame threading so that the mpeg2-without-dts
992 // warning will not trigger
993 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
994 delay -= st->codec->thread_count-1;
996 /* XXX: need has_b_frame, but cannot get it if the codec is
999 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1000 presentation_delayed = 1;
1002 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
1003 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
1004 pkt->dts -= 1LL<<st->pts_wrap_bits;
1007 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
1008 // we take the conservative approach and discard both
1009 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
1010 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
1011 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
1012 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
1015 if (pkt->duration == 0) {
1016 compute_frame_duration(&num, &den, st, pc, pkt);
1018 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1020 if(pkt->duration != 0 && s->packet_buffer)
1021 update_initial_durations(s, st, pkt);
1025 /* correct timestamps with byte offset if demuxers only have timestamps
1026 on packet boundaries */
1027 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1028 /* this will estimate bitrate based on this frame's duration and size */
1029 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1030 if(pkt->pts != AV_NOPTS_VALUE)
1032 if(pkt->dts != AV_NOPTS_VALUE)
1036 if (pc && pc->dts_sync_point >= 0) {
1037 // we have synchronization info from the parser
1038 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1040 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1041 if (pkt->dts != AV_NOPTS_VALUE) {
1042 // got DTS from the stream, update reference timestamp
1043 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1044 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1045 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1046 // compute DTS based on reference timestamp
1047 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1048 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1050 if (pc->dts_sync_point > 0)
1051 st->reference_dts = pkt->dts; // new reference
1055 /* This may be redundant, but it should not hurt. */
1056 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1057 presentation_delayed = 1;
1059 // 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);
1060 /* interpolate PTS and DTS if they are not present */
1061 //We skip H264 currently because delay and has_b_frames are not reliably set
1062 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1063 if (presentation_delayed) {
1064 /* DTS = decompression timestamp */
1065 /* PTS = presentation timestamp */
1066 if (pkt->dts == AV_NOPTS_VALUE)
1067 pkt->dts = st->last_IP_pts;
1068 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1069 if (pkt->dts == AV_NOPTS_VALUE)
1070 pkt->dts = st->cur_dts;
1072 /* this is tricky: the dts must be incremented by the duration
1073 of the frame we are displaying, i.e. the last I- or P-frame */
1074 if (st->last_IP_duration == 0)
1075 st->last_IP_duration = pkt->duration;
1076 if(pkt->dts != AV_NOPTS_VALUE)
1077 st->cur_dts = pkt->dts + st->last_IP_duration;
1078 st->last_IP_duration = pkt->duration;
1079 st->last_IP_pts= pkt->pts;
1080 /* cannot compute PTS if not present (we can compute it only
1081 by knowing the future */
1082 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1083 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1084 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1085 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1086 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1087 pkt->pts += pkt->duration;
1088 // 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);
1092 /* presentation is not delayed : PTS and DTS are the same */
1093 if(pkt->pts == AV_NOPTS_VALUE)
1094 pkt->pts = pkt->dts;
1095 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1096 if(pkt->pts == AV_NOPTS_VALUE)
1097 pkt->pts = st->cur_dts;
1098 pkt->dts = pkt->pts;
1099 if(pkt->pts != AV_NOPTS_VALUE)
1100 st->cur_dts = pkt->pts + pkt->duration;
1104 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1105 st->pts_buffer[0]= pkt->pts;
1106 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1107 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1108 if(pkt->dts == AV_NOPTS_VALUE)
1109 pkt->dts= st->pts_buffer[0];
1110 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1111 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1113 if(pkt->dts > st->cur_dts)
1114 st->cur_dts = pkt->dts;
1117 // 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);
1120 if(is_intra_only(st->codec))
1121 pkt->flags |= AV_PKT_FLAG_KEY;
1124 /* keyframe computation */
1125 if (pc->key_frame == 1)
1126 pkt->flags |= AV_PKT_FLAG_KEY;
1127 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1128 pkt->flags |= AV_PKT_FLAG_KEY;
1131 pkt->convergence_duration = pc->convergence_duration;
1135 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1140 av_init_packet(pkt);
1143 /* select current input stream component */
1146 if (!st->need_parsing || !st->parser) {
1147 /* no parsing needed: we just output the packet as is */
1148 /* raw data support */
1150 st->cur_pkt.data= NULL;
1151 st->cur_pkt.side_data_elems = 0;
1152 st->cur_pkt.side_data = NULL;
1153 compute_pkt_fields(s, st, NULL, pkt);
1155 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1156 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1157 ff_reduce_index(s, st->index);
1158 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1161 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1162 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1163 st->cur_ptr, st->cur_len,
1164 st->cur_pkt.pts, st->cur_pkt.dts,
1166 st->cur_pkt.pts = AV_NOPTS_VALUE;
1167 st->cur_pkt.dts = AV_NOPTS_VALUE;
1168 /* increment read pointer */
1172 /* return packet if any */
1176 pkt->stream_index = st->index;
1177 pkt->pts = st->parser->pts;
1178 pkt->dts = st->parser->dts;
1179 pkt->pos = st->parser->pos;
1180 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1182 pkt->destruct= st->cur_pkt.destruct;
1183 st->cur_pkt.destruct= NULL;
1184 st->cur_pkt.data = NULL;
1185 assert(st->cur_len == 0);
1187 pkt->destruct = NULL;
1189 compute_pkt_fields(s, st, st->parser, pkt);
1191 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1192 int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
1193 ff_reduce_index(s, st->index);
1194 av_add_index_entry(st, pos, pkt->dts,
1195 0, 0, AVINDEX_KEYFRAME);
1202 av_free_packet(&st->cur_pkt);
1207 /* read next packet */
1208 ret = av_read_packet(s, &cur_pkt);
1210 if (ret == AVERROR(EAGAIN))
1212 /* return the last frames, if any */
1213 for(i = 0; i < s->nb_streams; i++) {
1215 if (st->parser && st->need_parsing) {
1216 av_parser_parse2(st->parser, st->codec,
1217 &pkt->data, &pkt->size,
1219 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1225 /* no more packets: really terminate parsing */
1228 st = s->streams[cur_pkt.stream_index];
1229 st->cur_pkt= cur_pkt;
1231 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1232 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1233 st->cur_pkt.pts < st->cur_pkt.dts){
1234 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1235 st->cur_pkt.stream_index,
1239 // av_free_packet(&st->cur_pkt);
1243 if(s->debug & FF_FDEBUG_TS)
1244 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1245 st->cur_pkt.stream_index,
1249 st->cur_pkt.duration,
1253 st->cur_ptr = st->cur_pkt.data;
1254 st->cur_len = st->cur_pkt.size;
1255 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1256 st->parser = av_parser_init(st->codec->codec_id);
1258 av_log(s, AV_LOG_WARNING, "parser not found for codec "
1259 "%s, packets or times may be invalid.\n",
1260 avcodec_get_name(st->codec->codec_id));
1261 /* no parser available: just output the raw packets */
1262 st->need_parsing = AVSTREAM_PARSE_NONE;
1263 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1264 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1265 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1266 st->parser->flags |= PARSER_FLAG_ONCE;
1271 if(s->debug & FF_FDEBUG_TS)
1272 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1283 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1287 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1290 pktl = s->packet_buffer;
1292 AVPacket *next_pkt= &pktl->pkt;
1294 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1295 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1296 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1297 if( pktl->pkt.stream_index == next_pkt->stream_index
1298 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1299 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1300 next_pkt->pts= pktl->pkt.dts;
1304 pktl = s->packet_buffer;
1307 if( next_pkt->pts != AV_NOPTS_VALUE
1308 || next_pkt->dts == AV_NOPTS_VALUE
1310 /* read packet from packet buffer, if there is data */
1312 s->packet_buffer = pktl->next;
1318 int ret= read_frame_internal(s, pkt);
1320 if(pktl && ret != AVERROR(EAGAIN)){
1327 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1328 &s->packet_buffer_end)) < 0)
1329 return AVERROR(ENOMEM);
1331 assert(!s->packet_buffer);
1332 return read_frame_internal(s, pkt);
1337 /* XXX: suppress the packet queue */
1338 static void flush_packet_queue(AVFormatContext *s)
1343 pktl = s->packet_buffer;
1346 s->packet_buffer = pktl->next;
1347 av_free_packet(&pktl->pkt);
1350 while(s->raw_packet_buffer){
1351 pktl = s->raw_packet_buffer;
1352 s->raw_packet_buffer = pktl->next;
1353 av_free_packet(&pktl->pkt);
1356 s->packet_buffer_end=
1357 s->raw_packet_buffer_end= NULL;
1358 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1361 /*******************************************************/
1364 int av_find_default_stream_index(AVFormatContext *s)
1366 int first_audio_index = -1;
1370 if (s->nb_streams <= 0)
1372 for(i = 0; i < s->nb_streams; i++) {
1374 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1377 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1378 first_audio_index = i;
1380 return first_audio_index >= 0 ? first_audio_index : 0;
1384 * Flush the frame reader.
1386 void ff_read_frame_flush(AVFormatContext *s)
1391 flush_packet_queue(s);
1395 /* for each stream, reset read state */
1396 for(i = 0; i < s->nb_streams; i++) {
1400 av_parser_close(st->parser);
1402 av_free_packet(&st->cur_pkt);
1404 st->last_IP_pts = AV_NOPTS_VALUE;
1405 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1406 st->reference_dts = AV_NOPTS_VALUE;
1411 st->probe_packets = MAX_PROBE_PACKETS;
1413 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1414 st->pts_buffer[j]= AV_NOPTS_VALUE;
1418 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1421 for(i = 0; i < s->nb_streams; i++) {
1422 AVStream *st = s->streams[i];
1424 st->cur_dts = av_rescale(timestamp,
1425 st->time_base.den * (int64_t)ref_st->time_base.num,
1426 st->time_base.num * (int64_t)ref_st->time_base.den);
1430 void ff_reduce_index(AVFormatContext *s, int stream_index)
1432 AVStream *st= s->streams[stream_index];
1433 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1435 if((unsigned)st->nb_index_entries >= max_entries){
1437 for(i=0; 2*i<st->nb_index_entries; i++)
1438 st->index_entries[i]= st->index_entries[2*i];
1439 st->nb_index_entries= i;
1443 int ff_add_index_entry(AVIndexEntry **index_entries,
1444 int *nb_index_entries,
1445 unsigned int *index_entries_allocated_size,
1446 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1448 AVIndexEntry *entries, *ie;
1451 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1454 entries = av_fast_realloc(*index_entries,
1455 index_entries_allocated_size,
1456 (*nb_index_entries + 1) *
1457 sizeof(AVIndexEntry));
1461 *index_entries= entries;
1463 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1466 index= (*nb_index_entries)++;
1467 ie= &entries[index];
1468 assert(index==0 || ie[-1].timestamp < timestamp);
1470 ie= &entries[index];
1471 if(ie->timestamp != timestamp){
1472 if(ie->timestamp <= timestamp)
1474 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1475 (*nb_index_entries)++;
1476 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1477 distance= ie->min_distance;
1481 ie->timestamp = timestamp;
1482 ie->min_distance= distance;
1489 int av_add_index_entry(AVStream *st,
1490 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1492 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1493 &st->index_entries_allocated_size, pos,
1494 timestamp, size, distance, flags);
1497 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1498 int64_t wanted_timestamp, int flags)
1506 //optimize appending index entries at the end
1507 if(b && entries[b-1].timestamp < wanted_timestamp)
1512 timestamp = entries[m].timestamp;
1513 if(timestamp >= wanted_timestamp)
1515 if(timestamp <= wanted_timestamp)
1518 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1520 if(!(flags & AVSEEK_FLAG_ANY)){
1521 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1522 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1531 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1534 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1535 wanted_timestamp, flags);
1538 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1539 AVInputFormat *avif= s->iformat;
1540 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1541 int64_t ts_min, ts_max, ts;
1546 if (stream_index < 0)
1549 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1552 ts_min= AV_NOPTS_VALUE;
1553 pos_limit= -1; //gcc falsely says it may be uninitialized
1555 st= s->streams[stream_index];
1556 if(st->index_entries){
1559 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()
1560 index= FFMAX(index, 0);
1561 e= &st->index_entries[index];
1563 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1565 ts_min= e->timestamp;
1566 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1572 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1573 assert(index < st->nb_index_entries);
1575 e= &st->index_entries[index];
1576 assert(e->timestamp >= target_ts);
1578 ts_max= e->timestamp;
1579 pos_limit= pos_max - e->min_distance;
1580 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1581 pos_max,pos_limit, ts_max);
1585 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1590 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1593 av_update_cur_dts(s, st, ts);
1598 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, int64_t pos_min, int64_t pos_max, int64_t pos_limit, int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret, int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t )){
1600 int64_t start_pos, filesize;
1603 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1605 if(ts_min == AV_NOPTS_VALUE){
1606 pos_min = s->data_offset;
1607 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1608 if (ts_min == AV_NOPTS_VALUE)
1612 if(ts_max == AV_NOPTS_VALUE){
1614 filesize = avio_size(s->pb);
1615 pos_max = filesize - 1;
1618 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1620 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1621 if (ts_max == AV_NOPTS_VALUE)
1625 int64_t tmp_pos= pos_max + 1;
1626 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1627 if(tmp_ts == AV_NOPTS_VALUE)
1631 if(tmp_pos >= filesize)
1637 if(ts_min > ts_max){
1639 }else if(ts_min == ts_max){
1644 while (pos_min < pos_limit) {
1645 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1646 pos_min, pos_max, ts_min, ts_max);
1647 assert(pos_limit <= pos_max);
1650 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1651 // interpolate position (better than dichotomy)
1652 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1653 + pos_min - approximate_keyframe_distance;
1654 }else if(no_change==1){
1655 // bisection, if interpolation failed to change min or max pos last time
1656 pos = (pos_min + pos_limit)>>1;
1658 /* linear search if bisection failed, can only happen if there
1659 are very few or no keyframes between min/max */
1664 else if(pos > pos_limit)
1668 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1673 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1674 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1675 pos_limit, start_pos, no_change);
1676 if(ts == AV_NOPTS_VALUE){
1677 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1680 assert(ts != AV_NOPTS_VALUE);
1681 if (target_ts <= ts) {
1682 pos_limit = start_pos - 1;
1686 if (target_ts >= ts) {
1692 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1693 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1695 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1697 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1698 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1699 pos, ts_min, target_ts, ts_max);
1704 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1705 int64_t pos_min, pos_max;
1709 if (stream_index < 0)
1712 st= s->streams[stream_index];
1715 pos_min = s->data_offset;
1716 pos_max = avio_size(s->pb) - 1;
1718 if (pos < pos_min) pos= pos_min;
1719 else if(pos > pos_max) pos= pos_max;
1721 avio_seek(s->pb, pos, SEEK_SET);
1724 av_update_cur_dts(s, st, ts);
1729 static int seek_frame_generic(AVFormatContext *s,
1730 int stream_index, int64_t timestamp, int flags)
1737 st = s->streams[stream_index];
1739 index = av_index_search_timestamp(st, timestamp, flags);
1741 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1744 if(index < 0 || index==st->nb_index_entries-1){
1748 if(st->nb_index_entries){
1749 assert(st->index_entries);
1750 ie= &st->index_entries[st->nb_index_entries-1];
1751 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1753 av_update_cur_dts(s, st, ie->timestamp);
1755 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1761 ret = av_read_frame(s, &pkt);
1762 }while(ret == AVERROR(EAGAIN));
1765 av_free_packet(&pkt);
1766 if(stream_index == pkt.stream_index){
1767 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1771 index = av_index_search_timestamp(st, timestamp, flags);
1776 ff_read_frame_flush(s);
1777 if (s->iformat->read_seek){
1778 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1781 ie = &st->index_entries[index];
1782 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1784 av_update_cur_dts(s, st, ie->timestamp);
1789 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1794 ff_read_frame_flush(s);
1796 if(flags & AVSEEK_FLAG_BYTE)
1797 return seek_frame_byte(s, stream_index, timestamp, flags);
1799 if(stream_index < 0){
1800 stream_index= av_find_default_stream_index(s);
1801 if(stream_index < 0)
1804 st= s->streams[stream_index];
1805 /* timestamp for default must be expressed in AV_TIME_BASE units */
1806 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1809 /* first, we try the format specific seek */
1810 if (s->iformat->read_seek)
1811 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1818 if(s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH))
1819 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1820 else if (!(s->iformat->flags & AVFMT_NOGENSEARCH))
1821 return seek_frame_generic(s, stream_index, timestamp, flags);
1826 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1828 if(min_ts > ts || max_ts < ts)
1831 ff_read_frame_flush(s);
1833 if (s->iformat->read_seek2)
1834 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1836 if(s->iformat->read_timestamp){
1837 //try to seek via read_timestamp()
1840 //Fallback to old API if new is not implemented but old is
1841 //Note the old has somewat different sematics
1842 if(s->iformat->read_seek || 1)
1843 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1845 // try some generic seek like seek_frame_generic() but with new ts semantics
1848 /*******************************************************/
1851 * Return TRUE if the stream has accurate duration in any stream.
1853 * @return TRUE if the stream has accurate duration for at least one component.
1855 static int has_duration(AVFormatContext *ic)
1860 for(i = 0;i < ic->nb_streams; i++) {
1861 st = ic->streams[i];
1862 if (st->duration != AV_NOPTS_VALUE)
1869 * Estimate the stream timings from the one of each components.
1871 * Also computes the global bitrate if possible.
1873 static void update_stream_timings(AVFormatContext *ic)
1875 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1876 int64_t duration, duration1;
1880 start_time = INT64_MAX;
1881 start_time_text = INT64_MAX;
1882 end_time = INT64_MIN;
1883 duration = INT64_MIN;
1884 for(i = 0;i < ic->nb_streams; i++) {
1885 st = ic->streams[i];
1886 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1887 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1888 if (st->codec->codec_id == CODEC_ID_DVB_TELETEXT) {
1889 if (start_time1 < start_time_text)
1890 start_time_text = start_time1;
1892 if (start_time1 < start_time)
1893 start_time = start_time1;
1894 if (st->duration != AV_NOPTS_VALUE) {
1895 end_time1 = start_time1
1896 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1897 if (end_time1 > end_time)
1898 end_time = end_time1;
1901 if (st->duration != AV_NOPTS_VALUE) {
1902 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1903 if (duration1 > duration)
1904 duration = duration1;
1907 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
1908 start_time = start_time_text;
1909 if (start_time != INT64_MAX) {
1910 ic->start_time = start_time;
1911 if (end_time != INT64_MIN) {
1912 if (end_time - start_time > duration)
1913 duration = end_time - start_time;
1916 if (duration != INT64_MIN) {
1917 ic->duration = duration;
1918 if (ic->file_size > 0) {
1919 /* compute the bitrate */
1920 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1921 (double)ic->duration;
1926 static void fill_all_stream_timings(AVFormatContext *ic)
1931 update_stream_timings(ic);
1932 for(i = 0;i < ic->nb_streams; i++) {
1933 st = ic->streams[i];
1934 if (st->start_time == AV_NOPTS_VALUE) {
1935 if(ic->start_time != AV_NOPTS_VALUE)
1936 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1937 if(ic->duration != AV_NOPTS_VALUE)
1938 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1943 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
1945 int64_t filesize, duration;
1949 /* if bit_rate is already set, we believe it */
1950 if (ic->bit_rate <= 0) {
1952 for(i=0;i<ic->nb_streams;i++) {
1953 st = ic->streams[i];
1954 if (st->codec->bit_rate > 0)
1955 bit_rate += st->codec->bit_rate;
1957 ic->bit_rate = bit_rate;
1960 /* if duration is already set, we believe it */
1961 if (ic->duration == AV_NOPTS_VALUE &&
1962 ic->bit_rate != 0 &&
1963 ic->file_size != 0) {
1964 filesize = ic->file_size;
1966 for(i = 0; i < ic->nb_streams; i++) {
1967 st = ic->streams[i];
1968 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1969 if (st->duration == AV_NOPTS_VALUE)
1970 st->duration = duration;
1976 #define DURATION_MAX_READ_SIZE 250000
1977 #define DURATION_MAX_RETRY 3
1979 /* only usable for MPEG-PS streams */
1980 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1982 AVPacket pkt1, *pkt = &pkt1;
1984 int read_size, i, ret;
1986 int64_t filesize, offset, duration;
1991 /* flush packet queue */
1992 flush_packet_queue(ic);
1994 for (i=0; i<ic->nb_streams; i++) {
1995 st = ic->streams[i];
1996 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1997 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2000 av_parser_close(st->parser);
2002 av_free_packet(&st->cur_pkt);
2006 /* estimate the end time (duration) */
2007 /* XXX: may need to support wrapping */
2008 filesize = ic->file_size;
2009 end_time = AV_NOPTS_VALUE;
2011 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2015 avio_seek(ic->pb, offset, SEEK_SET);
2018 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2022 ret = av_read_packet(ic, pkt);
2023 } while(ret == AVERROR(EAGAIN));
2026 read_size += pkt->size;
2027 st = ic->streams[pkt->stream_index];
2028 if (pkt->pts != AV_NOPTS_VALUE &&
2029 (st->start_time != AV_NOPTS_VALUE ||
2030 st->first_dts != AV_NOPTS_VALUE)) {
2031 duration = end_time = pkt->pts;
2032 if (st->start_time != AV_NOPTS_VALUE)
2033 duration -= st->start_time;
2035 duration -= st->first_dts;
2037 duration += 1LL<<st->pts_wrap_bits;
2039 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2040 st->duration = duration;
2043 av_free_packet(pkt);
2045 }while( end_time==AV_NOPTS_VALUE
2046 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2047 && ++retry <= DURATION_MAX_RETRY);
2049 fill_all_stream_timings(ic);
2051 avio_seek(ic->pb, old_offset, SEEK_SET);
2052 for (i=0; i<ic->nb_streams; i++) {
2054 st->cur_dts= st->first_dts;
2055 st->last_IP_pts = AV_NOPTS_VALUE;
2056 st->reference_dts = AV_NOPTS_VALUE;
2060 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2064 /* get the file size, if possible */
2065 if (ic->iformat->flags & AVFMT_NOFILE) {
2068 file_size = avio_size(ic->pb);
2072 ic->file_size = file_size;
2074 if ((!strcmp(ic->iformat->name, "mpeg") ||
2075 !strcmp(ic->iformat->name, "mpegts")) &&
2076 file_size && ic->pb->seekable) {
2077 /* get accurate estimate from the PTSes */
2078 estimate_timings_from_pts(ic, old_offset);
2079 } else if (has_duration(ic)) {
2080 /* at least one component has timings - we use them for all
2082 fill_all_stream_timings(ic);
2084 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2085 /* less precise: use bitrate info */
2086 estimate_timings_from_bit_rate(ic);
2088 update_stream_timings(ic);
2092 AVStream av_unused *st;
2093 for(i = 0;i < ic->nb_streams; i++) {
2094 st = ic->streams[i];
2095 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2096 (double) st->start_time / AV_TIME_BASE,
2097 (double) st->duration / AV_TIME_BASE);
2099 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2100 (double) ic->start_time / AV_TIME_BASE,
2101 (double) ic->duration / AV_TIME_BASE,
2102 ic->bit_rate / 1000);
2106 static int has_codec_parameters(AVCodecContext *avctx)
2109 switch (avctx->codec_type) {
2110 case AVMEDIA_TYPE_AUDIO:
2111 val = avctx->sample_rate && avctx->channels && avctx->sample_fmt != AV_SAMPLE_FMT_NONE;
2112 if(!avctx->frame_size &&
2113 (avctx->codec_id == CODEC_ID_VORBIS ||
2114 avctx->codec_id == CODEC_ID_AAC ||
2115 avctx->codec_id == CODEC_ID_MP1 ||
2116 avctx->codec_id == CODEC_ID_MP2 ||
2117 avctx->codec_id == CODEC_ID_MP3 ||
2118 avctx->codec_id == CODEC_ID_SPEEX ||
2119 avctx->codec_id == CODEC_ID_CELT))
2122 case AVMEDIA_TYPE_VIDEO:
2123 val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
2125 case AVMEDIA_TYPE_DATA:
2126 if(avctx->codec_id == CODEC_ID_NONE) return 1;
2131 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2134 static int has_decode_delay_been_guessed(AVStream *st)
2136 return st->codec->codec_id != CODEC_ID_H264 ||
2137 st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2140 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2144 int got_picture, data_size, ret=0;
2147 if(!st->codec->codec){
2148 codec = avcodec_find_decoder(st->codec->codec_id);
2151 ret = avcodec_open2(st->codec, codec, options);
2156 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st) ||
2157 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF)) {
2158 switch(st->codec->codec_type) {
2159 case AVMEDIA_TYPE_VIDEO:
2160 avcodec_get_frame_defaults(&picture);
2161 ret = avcodec_decode_video2(st->codec, &picture,
2162 &got_picture, avpkt);
2164 case AVMEDIA_TYPE_AUDIO:
2165 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2166 samples = av_malloc(data_size);
2169 ret = avcodec_decode_audio3(st->codec, samples,
2181 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2183 while (tags->id != CODEC_ID_NONE) {
2191 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2194 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2195 if(tag == tags[i].tag)
2198 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2199 if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2202 return CODEC_ID_NONE;
2205 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2208 for(i=0; tags && tags[i]; i++){
2209 int tag= ff_codec_get_tag(tags[i], id);
2215 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2218 for(i=0; tags && tags[i]; i++){
2219 enum CodecID id= ff_codec_get_id(tags[i], tag);
2220 if(id!=CODEC_ID_NONE) return id;
2222 return CODEC_ID_NONE;
2225 static void compute_chapters_end(AVFormatContext *s)
2228 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2230 for (i = 0; i < s->nb_chapters; i++)
2231 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2232 AVChapter *ch = s->chapters[i];
2233 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2236 for (j = 0; j < s->nb_chapters; j++) {
2237 AVChapter *ch1 = s->chapters[j];
2238 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2239 if (j != i && next_start > ch->start && next_start < end)
2242 ch->end = (end == INT64_MAX) ? ch->start : end;
2246 static int get_std_framerate(int i){
2247 if(i<60*12) return i*1001;
2248 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2252 * Is the time base unreliable.
2253 * This is a heuristic to balance between quick acceptance of the values in
2254 * the headers vs. some extra checks.
2255 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2256 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2257 * And there are "variable" fps files this needs to detect as well.
2259 static int tb_unreliable(AVCodecContext *c){
2260 if( c->time_base.den >= 101L*c->time_base.num
2261 || c->time_base.den < 5L*c->time_base.num
2262 /* || c->codec_tag == AV_RL32("DIVX")
2263 || c->codec_tag == AV_RL32("XVID")*/
2264 || c->codec_id == CODEC_ID_MPEG2VIDEO
2265 || c->codec_id == CODEC_ID_H264
2271 #if FF_API_FORMAT_PARAMETERS
2272 int av_find_stream_info(AVFormatContext *ic)
2274 return avformat_find_stream_info(ic, NULL);
2278 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2280 int i, count, ret, read_size, j;
2282 AVPacket pkt1, *pkt;
2283 int64_t old_offset = avio_tell(ic->pb);
2284 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2286 for(i=0;i<ic->nb_streams;i++) {
2288 st = ic->streams[i];
2289 if (st->codec->codec_id == CODEC_ID_AAC && st->codec->extradata_size) {
2290 // We need to discard these since they can be plain wrong for
2291 // backwards compatible HE-AAC signaling.
2292 // But when we have no extradata we need to keep them or we can't
2293 // play anything at all.
2294 st->codec->sample_rate = 0;
2295 st->codec->frame_size = 0;
2296 st->codec->channels = 0;
2299 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2300 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2301 /* if(!st->time_base.num)
2303 if(!st->codec->time_base.num)
2304 st->codec->time_base= st->time_base;
2306 //only for the split stuff
2307 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2308 st->parser = av_parser_init(st->codec->codec_id);
2309 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2310 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2313 assert(!st->codec->codec);
2314 codec = avcodec_find_decoder(st->codec->codec_id);
2316 /* Ensure that subtitle_header is properly set. */
2317 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2318 && codec && !st->codec->codec)
2319 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2321 //try to just open decoders, in case this is enough to get parameters
2322 if(!has_codec_parameters(st->codec)){
2323 if (codec && !st->codec->codec){
2324 AVDictionary *tmp = NULL;
2326 av_dict_copy(&tmp, options[i], 0);
2327 av_dict_set(&tmp, "threads", 0, 0);
2329 avcodec_open2(st->codec, codec, options ? &tmp : NULL);
2335 for (i=0; i<ic->nb_streams; i++) {
2336 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2342 if(url_interrupt_cb()){
2344 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2348 /* check if one codec still needs to be handled */
2349 for(i=0;i<ic->nb_streams;i++) {
2350 int fps_analyze_framecount = 20;
2352 st = ic->streams[i];
2353 if (!has_codec_parameters(st->codec))
2355 /* if the timebase is coarse (like the usual millisecond precision
2356 of mkv), we need to analyze more frames to reliably arrive at
2358 if (av_q2d(st->time_base) > 0.0005)
2359 fps_analyze_framecount *= 2;
2360 if (ic->fps_probe_size >= 0)
2361 fps_analyze_framecount = ic->fps_probe_size;
2362 /* variable fps and no guess at the real fps */
2363 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2364 && st->info->duration_count < fps_analyze_framecount
2365 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2367 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2369 if(st->first_dts == AV_NOPTS_VALUE && (st->codec->codec_type == AVMEDIA_TYPE_VIDEO || st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2372 if (i == ic->nb_streams) {
2373 /* NOTE: if the format has no header, then we need to read
2374 some packets to get most of the streams, so we cannot
2376 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2377 /* if we found the info for all the codecs, we can stop */
2379 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2383 /* we did not get all the codec info, but we read too much data */
2384 if (read_size >= ic->probesize) {
2386 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2390 /* NOTE: a new stream can be added there if no header in file
2391 (AVFMTCTX_NOHEADER) */
2392 ret = read_frame_internal(ic, &pkt1);
2393 if (ret == AVERROR(EAGAIN))
2398 ret = -1; /* we could not have all the codec parameters before EOF */
2399 for(i=0;i<ic->nb_streams;i++) {
2400 st = ic->streams[i];
2401 if (!has_codec_parameters(st->codec)){
2403 avcodec_string(buf, sizeof(buf), st->codec, 0);
2404 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2412 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2413 if ((ret = av_dup_packet(pkt)) < 0)
2414 goto find_stream_info_err;
2416 read_size += pkt->size;
2418 st = ic->streams[pkt->stream_index];
2419 if (st->codec_info_nb_frames>1) {
2421 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) {
2422 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2425 st->info->codec_info_duration += pkt->duration;
2428 int64_t last = st->info->last_dts;
2429 int64_t duration= pkt->dts - last;
2431 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2432 double dur= duration * av_q2d(st->time_base);
2434 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2435 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2436 if (st->info->duration_count < 2)
2437 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2438 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2439 int framerate= get_std_framerate(i);
2440 int ticks= lrintf(dur*framerate/(1001*12));
2441 double error= dur - ticks*1001*12/(double)framerate;
2442 st->info->duration_error[i] += error*error;
2444 st->info->duration_count++;
2445 // ignore the first 4 values, they might have some random jitter
2446 if (st->info->duration_count > 3)
2447 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2449 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2450 st->info->last_dts = pkt->dts;
2452 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2453 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2455 st->codec->extradata_size= i;
2456 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2457 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2458 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2462 /* if still no information, we try to open the codec and to
2463 decompress the frame. We try to avoid that in most cases as
2464 it takes longer and uses more memory. For MPEG-4, we need to
2465 decompress for QuickTime.
2467 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2468 least one frame of codec data, this makes sure the codec initializes
2469 the channel configuration and does not only trust the values from the container.
2471 try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
2473 st->codec_info_nb_frames++;
2477 // close codecs which were opened in try_decode_frame()
2478 for(i=0;i<ic->nb_streams;i++) {
2479 st = ic->streams[i];
2480 if(st->codec->codec)
2481 avcodec_close(st->codec);
2483 for(i=0;i<ic->nb_streams;i++) {
2484 st = ic->streams[i];
2485 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2486 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2487 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2488 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2489 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2490 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2491 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2492 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2493 st->codec->codec_tag= tag;
2496 // the check for tb_unreliable() is not completely correct, since this is not about handling
2497 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2498 // ipmovie.c produces.
2499 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)
2500 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);
2501 if (st->info->duration_count && !st->r_frame_rate.num
2502 && tb_unreliable(st->codec) /*&&
2503 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2504 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2506 double best_error= 2*av_q2d(st->time_base);
2507 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2509 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2510 double error = st->info->duration_error[j] * get_std_framerate(j);
2511 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2512 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2513 if(error < best_error){
2515 num = get_std_framerate(j);
2518 // do not increase frame rate by more than 1 % in order to match a standard rate.
2519 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2520 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2523 if (!st->r_frame_rate.num){
2524 if( st->codec->time_base.den * (int64_t)st->time_base.num
2525 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2526 st->r_frame_rate.num = st->codec->time_base.den;
2527 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2529 st->r_frame_rate.num = st->time_base.den;
2530 st->r_frame_rate.den = st->time_base.num;
2533 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2534 if(!st->codec->bits_per_coded_sample)
2535 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2536 // set stream disposition based on audio service type
2537 switch (st->codec->audio_service_type) {
2538 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2539 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2540 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2541 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2542 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2543 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2544 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2545 st->disposition = AV_DISPOSITION_COMMENT; break;
2546 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2547 st->disposition = AV_DISPOSITION_KARAOKE; break;
2552 estimate_timings(ic, old_offset);
2554 compute_chapters_end(ic);
2557 /* correct DTS for B-frame streams with no timestamps */
2558 for(i=0;i<ic->nb_streams;i++) {
2559 st = ic->streams[i];
2560 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2562 ppktl = &ic->packet_buffer;
2564 if(ppkt1->stream_index != i)
2566 if(ppkt1->pkt->dts < 0)
2568 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2570 ppkt1->pkt->dts -= delta;
2575 st->cur_dts -= delta;
2581 find_stream_info_err:
2582 for (i=0; i < ic->nb_streams; i++)
2583 av_freep(&ic->streams[i]->info);
2587 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2591 for (i = 0; i < ic->nb_programs; i++) {
2592 if (ic->programs[i] == last) {
2596 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2597 if (ic->programs[i]->stream_index[j] == s)
2598 return ic->programs[i];
2604 int av_find_best_stream(AVFormatContext *ic,
2605 enum AVMediaType type,
2606 int wanted_stream_nb,
2608 AVCodec **decoder_ret,
2611 int i, nb_streams = ic->nb_streams;
2612 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2613 unsigned *program = NULL;
2614 AVCodec *decoder = NULL, *best_decoder = NULL;
2616 if (related_stream >= 0 && wanted_stream_nb < 0) {
2617 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2619 program = p->stream_index;
2620 nb_streams = p->nb_stream_indexes;
2623 for (i = 0; i < nb_streams; i++) {
2624 int real_stream_index = program ? program[i] : i;
2625 AVStream *st = ic->streams[real_stream_index];
2626 AVCodecContext *avctx = st->codec;
2627 if (avctx->codec_type != type)
2629 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2631 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2634 decoder = avcodec_find_decoder(st->codec->codec_id);
2637 ret = AVERROR_DECODER_NOT_FOUND;
2641 if (best_count >= st->codec_info_nb_frames)
2643 best_count = st->codec_info_nb_frames;
2644 ret = real_stream_index;
2645 best_decoder = decoder;
2646 if (program && i == nb_streams - 1 && ret < 0) {
2648 nb_streams = ic->nb_streams;
2649 i = 0; /* no related stream found, try again with everything */
2653 *decoder_ret = best_decoder;
2657 /*******************************************************/
2659 int av_read_play(AVFormatContext *s)
2661 if (s->iformat->read_play)
2662 return s->iformat->read_play(s);
2664 return avio_pause(s->pb, 0);
2665 return AVERROR(ENOSYS);
2668 int av_read_pause(AVFormatContext *s)
2670 if (s->iformat->read_pause)
2671 return s->iformat->read_pause(s);
2673 return avio_pause(s->pb, 1);
2674 return AVERROR(ENOSYS);
2677 void av_close_input_stream(AVFormatContext *s)
2679 flush_packet_queue(s);
2680 if (s->iformat->read_close)
2681 s->iformat->read_close(s);
2682 avformat_free_context(s);
2685 void avformat_free_context(AVFormatContext *s)
2691 if (s->iformat && s->iformat->priv_class && s->priv_data)
2692 av_opt_free(s->priv_data);
2694 for(i=0;i<s->nb_streams;i++) {
2695 /* free all data in a stream component */
2698 av_parser_close(st->parser);
2699 av_free_packet(&st->cur_pkt);
2701 av_dict_free(&st->metadata);
2702 av_free(st->index_entries);
2703 av_free(st->codec->extradata);
2704 av_free(st->codec->subtitle_header);
2706 av_free(st->priv_data);
2710 for(i=s->nb_programs-1; i>=0; i--) {
2711 av_dict_free(&s->programs[i]->metadata);
2712 av_freep(&s->programs[i]->stream_index);
2713 av_freep(&s->programs[i]);
2715 av_freep(&s->programs);
2716 av_freep(&s->priv_data);
2717 while(s->nb_chapters--) {
2718 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2719 av_free(s->chapters[s->nb_chapters]);
2721 av_freep(&s->chapters);
2722 av_dict_free(&s->metadata);
2723 av_freep(&s->streams);
2727 void av_close_input_file(AVFormatContext *s)
2729 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2731 av_close_input_stream(s);
2736 AVStream *av_new_stream(AVFormatContext *s, int id)
2742 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2744 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2747 s->streams = streams;
2749 st = av_mallocz(sizeof(AVStream));
2752 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2757 st->codec = avcodec_alloc_context3(NULL);
2759 /* no default bitrate if decoding */
2760 st->codec->bit_rate = 0;
2762 st->index = s->nb_streams;
2764 st->start_time = AV_NOPTS_VALUE;
2765 st->duration = AV_NOPTS_VALUE;
2766 /* we set the current DTS to 0 so that formats without any timestamps
2767 but durations get some timestamps, formats with some unknown
2768 timestamps have their first few packets buffered and the
2769 timestamps corrected before they are returned to the user */
2771 st->first_dts = AV_NOPTS_VALUE;
2772 st->probe_packets = MAX_PROBE_PACKETS;
2774 /* default pts setting is MPEG-like */
2775 av_set_pts_info(st, 33, 1, 90000);
2776 st->last_IP_pts = AV_NOPTS_VALUE;
2777 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2778 st->pts_buffer[i]= AV_NOPTS_VALUE;
2779 st->reference_dts = AV_NOPTS_VALUE;
2781 st->sample_aspect_ratio = (AVRational){0,1};
2783 s->streams[s->nb_streams++] = st;
2787 AVProgram *av_new_program(AVFormatContext *ac, int id)
2789 AVProgram *program=NULL;
2792 av_dlog(ac, "new_program: id=0x%04x\n", id);
2794 for(i=0; i<ac->nb_programs; i++)
2795 if(ac->programs[i]->id == id)
2796 program = ac->programs[i];
2799 program = av_mallocz(sizeof(AVProgram));
2802 dynarray_add(&ac->programs, &ac->nb_programs, program);
2803 program->discard = AVDISCARD_NONE;
2810 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2812 AVChapter *chapter = NULL;
2815 for(i=0; i<s->nb_chapters; i++)
2816 if(s->chapters[i]->id == id)
2817 chapter = s->chapters[i];
2820 chapter= av_mallocz(sizeof(AVChapter));
2823 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2825 av_dict_set(&chapter->metadata, "title", title, 0);
2827 chapter->time_base= time_base;
2828 chapter->start = start;
2834 /************************************************************/
2835 /* output media file */
2837 #if FF_API_FORMAT_PARAMETERS
2838 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2840 if (s->oformat->priv_data_size > 0) {
2841 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2843 return AVERROR(ENOMEM);
2844 if (s->oformat->priv_class) {
2845 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2846 av_opt_set_defaults(s->priv_data);
2849 s->priv_data = NULL;
2855 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
2856 const char *format, const char *filename)
2858 AVFormatContext *s = avformat_alloc_context();
2867 oformat = av_guess_format(format, NULL, NULL);
2869 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
2870 ret = AVERROR(EINVAL);
2874 oformat = av_guess_format(NULL, filename, NULL);
2876 ret = AVERROR(EINVAL);
2877 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
2884 s->oformat = oformat;
2885 if (s->oformat->priv_data_size > 0) {
2886 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2889 if (s->oformat->priv_class) {
2890 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2891 av_opt_set_defaults(s->priv_data);
2894 s->priv_data = NULL;
2897 av_strlcpy(s->filename, filename, sizeof(s->filename));
2901 av_log(s, AV_LOG_ERROR, "Out of memory\n");
2902 ret = AVERROR(ENOMEM);
2904 avformat_free_context(s);
2908 #if FF_API_ALLOC_OUTPUT_CONTEXT
2909 AVFormatContext *avformat_alloc_output_context(const char *format,
2910 AVOutputFormat *oformat, const char *filename)
2912 AVFormatContext *avctx;
2913 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
2914 return ret < 0 ? NULL : avctx;
2918 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2920 const AVCodecTag *avctag;
2922 enum CodecID id = CODEC_ID_NONE;
2923 unsigned int tag = 0;
2926 * Check that tag + id is in the table
2927 * If neither is in the table -> OK
2928 * If tag is in the table with another id -> FAIL
2929 * If id is in the table with another tag -> FAIL unless strict < normal
2931 for (n = 0; s->oformat->codec_tag[n]; n++) {
2932 avctag = s->oformat->codec_tag[n];
2933 while (avctag->id != CODEC_ID_NONE) {
2934 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2936 if (id == st->codec->codec_id)
2939 if (avctag->id == st->codec->codec_id)
2944 if (id != CODEC_ID_NONE)
2946 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2951 #if FF_API_FORMAT_PARAMETERS
2952 int av_write_header(AVFormatContext *s)
2954 return avformat_write_header(s, NULL);
2958 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2962 AVDictionary *tmp = NULL;
2965 av_dict_copy(&tmp, *options, 0);
2966 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2968 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
2969 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2972 // some sanity checks
2973 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2974 av_log(s, AV_LOG_ERROR, "no streams\n");
2975 ret = AVERROR(EINVAL);
2979 for(i=0;i<s->nb_streams;i++) {
2982 switch (st->codec->codec_type) {
2983 case AVMEDIA_TYPE_AUDIO:
2984 if(st->codec->sample_rate<=0){
2985 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2986 ret = AVERROR(EINVAL);
2989 if(!st->codec->block_align)
2990 st->codec->block_align = st->codec->channels *
2991 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2993 case AVMEDIA_TYPE_VIDEO:
2994 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2995 av_log(s, AV_LOG_ERROR, "time base not set\n");
2996 ret = AVERROR(EINVAL);
2999 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
3000 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
3001 ret = AVERROR(EINVAL);
3004 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
3005 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
3006 ret = AVERROR(EINVAL);
3012 if(s->oformat->codec_tag){
3013 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)){
3014 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
3015 st->codec->codec_tag= 0;
3017 if(st->codec->codec_tag){
3018 if (!validate_codec_tag(s, st)) {
3020 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
3021 av_log(s, AV_LOG_ERROR,
3022 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
3023 tagbuf, st->codec->codec_tag, st->codec->codec_id);
3024 ret = AVERROR_INVALIDDATA;
3028 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3031 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3032 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3033 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3036 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3037 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3038 if (!s->priv_data) {
3039 ret = AVERROR(ENOMEM);
3042 if (s->oformat->priv_class) {
3043 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3044 av_opt_set_defaults(s->priv_data);
3045 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3050 /* set muxer identification string */
3051 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3052 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3055 if(s->oformat->write_header){
3056 ret = s->oformat->write_header(s);
3061 /* init PTS generation */
3062 for(i=0;i<s->nb_streams;i++) {
3063 int64_t den = AV_NOPTS_VALUE;
3066 switch (st->codec->codec_type) {
3067 case AVMEDIA_TYPE_AUDIO:
3068 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3070 case AVMEDIA_TYPE_VIDEO:
3071 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3076 if (den != AV_NOPTS_VALUE) {
3078 ret = AVERROR_INVALIDDATA;
3081 frac_init(&st->pts, 0, 0, den);
3086 av_dict_free(options);
3095 //FIXME merge with compute_pkt_fields
3096 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3097 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3098 int num, den, frame_size, i;
3100 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3101 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3103 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
3104 return AVERROR(EINVAL);*/
3106 /* duration field */
3107 if (pkt->duration == 0) {
3108 compute_frame_duration(&num, &den, st, NULL, pkt);
3110 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3114 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3117 //XXX/FIXME this is a temporary hack until all encoders output pts
3118 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3120 // pkt->pts= st->cur_dts;
3121 pkt->pts= st->pts.val;
3124 //calculate dts from pts
3125 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3126 st->pts_buffer[0]= pkt->pts;
3127 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3128 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3129 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3130 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3132 pkt->dts= st->pts_buffer[0];
3135 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)){
3136 av_log(s, AV_LOG_ERROR,
3137 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3138 st->index, st->cur_dts, pkt->dts);
3139 return AVERROR(EINVAL);
3141 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3142 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3143 return AVERROR(EINVAL);
3146 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3147 st->cur_dts= pkt->dts;
3148 st->pts.val= pkt->dts;
3151 switch (st->codec->codec_type) {
3152 case AVMEDIA_TYPE_AUDIO:
3153 frame_size = get_audio_frame_size(st->codec, pkt->size);
3155 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3156 likely equal to the encoder delay, but it would be better if we
3157 had the real timestamps from the encoder */
3158 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3159 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3162 case AVMEDIA_TYPE_VIDEO:
3163 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3171 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3173 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3175 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3178 ret= s->oformat->write_packet(s, pkt);
3181 s->streams[pkt->stream_index]->nb_frames++;
3185 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3186 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3188 AVPacketList **next_point, *this_pktl;
3190 this_pktl = av_mallocz(sizeof(AVPacketList));
3191 this_pktl->pkt= *pkt;
3192 pkt->destruct= NULL; // do not free original but only the copy
3193 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3195 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3196 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3198 next_point = &s->packet_buffer;
3201 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3202 while(!compare(s, &(*next_point)->pkt, pkt)){
3203 next_point= &(*next_point)->next;
3207 next_point = &(s->packet_buffer_end->next);
3210 assert(!*next_point);
3212 s->packet_buffer_end= this_pktl;
3215 this_pktl->next= *next_point;
3217 s->streams[pkt->stream_index]->last_in_packet_buffer=
3218 *next_point= this_pktl;
3221 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3223 AVStream *st = s->streams[ pkt ->stream_index];
3224 AVStream *st2= s->streams[ next->stream_index];
3225 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3229 return pkt->stream_index < next->stream_index;
3233 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3235 int stream_count=0, noninterleaved_count=0;
3236 int64_t delta_dts_max = 0;
3240 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3243 for(i=0; i < s->nb_streams; i++) {
3244 if (s->streams[i]->last_in_packet_buffer) {
3246 } else if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3247 ++noninterleaved_count;
3251 if (s->nb_streams == stream_count) {
3254 for(i=0; i < s->nb_streams; i++) {
3255 if (s->streams[i]->last_in_packet_buffer) {
3257 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
3258 s->streams[i]->time_base,
3260 av_rescale_q(s->packet_buffer->pkt.dts,
3261 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
3263 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
3266 if(s->nb_streams == stream_count+noninterleaved_count &&
3267 delta_dts_max > 20*AV_TIME_BASE) {
3268 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
3272 if(stream_count && flush){
3273 pktl= s->packet_buffer;
3276 s->packet_buffer= pktl->next;
3277 if(!s->packet_buffer)
3278 s->packet_buffer_end= NULL;
3280 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3281 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3285 av_init_packet(out);
3291 * Interleave an AVPacket correctly so it can be muxed.
3292 * @param out the interleaved packet will be output here
3293 * @param in the input packet
3294 * @param flush 1 if no further packets are available as input and all
3295 * remaining packets should be output
3296 * @return 1 if a packet was output, 0 if no packet could be output,
3297 * < 0 if an error occurred
3299 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3300 if(s->oformat->interleave_packet)
3301 return s->oformat->interleave_packet(s, out, in, flush);
3303 return av_interleave_packet_per_dts(s, out, in, flush);
3306 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3307 AVStream *st= s->streams[ pkt->stream_index];
3310 //FIXME/XXX/HACK drop zero sized packets
3311 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3314 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3315 pkt->size, pkt->dts, pkt->pts);
3316 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3319 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3320 return AVERROR(EINVAL);
3324 int ret= interleave_packet(s, &opkt, pkt, 0);
3325 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3328 ret= s->oformat->write_packet(s, &opkt);
3330 s->streams[opkt.stream_index]->nb_frames++;
3332 av_free_packet(&opkt);
3337 if(url_ferror(s->pb))
3338 return url_ferror(s->pb);
3342 int av_write_trailer(AVFormatContext *s)
3348 ret= interleave_packet(s, &pkt, NULL, 1);
3349 if(ret<0) //FIXME cleanup needed for ret<0 ?
3354 ret= s->oformat->write_packet(s, &pkt);
3356 s->streams[pkt.stream_index]->nb_frames++;
3358 av_free_packet(&pkt);
3362 if(url_ferror(s->pb))
3366 if(s->oformat->write_trailer)
3367 ret = s->oformat->write_trailer(s);
3370 ret=url_ferror(s->pb);
3371 for(i=0;i<s->nb_streams;i++) {
3372 av_freep(&s->streams[i]->priv_data);
3373 av_freep(&s->streams[i]->index_entries);
3375 if (s->iformat && s->iformat->priv_class)
3376 av_opt_free(s->priv_data);
3377 av_freep(&s->priv_data);
3381 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
3382 int64_t *dts, int64_t *wall)
3384 if (!s->oformat || !s->oformat->get_output_timestamp)
3385 return AVERROR(ENOSYS);
3386 s->oformat->get_output_timestamp(s, stream, dts, wall);
3390 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3393 AVProgram *program=NULL;
3396 if (idx >= ac->nb_streams) {
3397 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3401 for(i=0; i<ac->nb_programs; i++){
3402 if(ac->programs[i]->id != progid)
3404 program = ac->programs[i];
3405 for(j=0; j<program->nb_stream_indexes; j++)
3406 if(program->stream_index[j] == idx)
3409 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3412 program->stream_index = tmp;
3413 program->stream_index[program->nb_stream_indexes++] = idx;
3418 static void print_fps(double d, const char *postfix){
3419 uint64_t v= lrintf(d*100);
3420 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3421 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3422 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3425 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3427 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3428 AVDictionaryEntry *tag=NULL;
3430 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3431 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3432 if(strcmp("language", tag->key)){
3435 av_strlcpy(tmp, tag->value, sizeof(tmp));
3436 for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
3437 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tmp);
3443 /* "user interface" functions */
3444 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3447 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3448 AVStream *st = ic->streams[i];
3449 int g = av_gcd(st->time_base.num, st->time_base.den);
3450 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3451 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3452 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3453 /* the pid is an important information, so we display it */
3454 /* XXX: add a generic system */
3455 if (flags & AVFMT_SHOW_IDS)
3456 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3458 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3459 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3460 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3461 if (st->sample_aspect_ratio.num && // default
3462 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3463 AVRational display_aspect_ratio;
3464 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3465 st->codec->width*st->sample_aspect_ratio.num,
3466 st->codec->height*st->sample_aspect_ratio.den,
3468 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3469 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3470 display_aspect_ratio.num, display_aspect_ratio.den);
3472 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3473 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3474 print_fps(av_q2d(st->avg_frame_rate), "fps");
3475 if(st->r_frame_rate.den && st->r_frame_rate.num)
3476 print_fps(av_q2d(st->r_frame_rate), "tbr");
3477 if(st->time_base.den && st->time_base.num)
3478 print_fps(1/av_q2d(st->time_base), "tbn");
3479 if(st->codec->time_base.den && st->codec->time_base.num)
3480 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3482 if (st->disposition & AV_DISPOSITION_DEFAULT)
3483 av_log(NULL, AV_LOG_INFO, " (default)");
3484 if (st->disposition & AV_DISPOSITION_DUB)
3485 av_log(NULL, AV_LOG_INFO, " (dub)");
3486 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3487 av_log(NULL, AV_LOG_INFO, " (original)");
3488 if (st->disposition & AV_DISPOSITION_COMMENT)
3489 av_log(NULL, AV_LOG_INFO, " (comment)");
3490 if (st->disposition & AV_DISPOSITION_LYRICS)
3491 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3492 if (st->disposition & AV_DISPOSITION_KARAOKE)
3493 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3494 if (st->disposition & AV_DISPOSITION_FORCED)
3495 av_log(NULL, AV_LOG_INFO, " (forced)");
3496 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3497 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3498 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3499 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3500 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3501 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3502 av_log(NULL, AV_LOG_INFO, "\n");
3503 dump_metadata(NULL, st->metadata, " ");
3506 #if FF_API_DUMP_FORMAT
3507 void dump_format(AVFormatContext *ic,
3512 av_dump_format(ic, index, url, is_output);
3516 void av_dump_format(AVFormatContext *ic,
3522 uint8_t *printed = av_mallocz(ic->nb_streams);
3523 if (ic->nb_streams && !printed)
3526 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3527 is_output ? "Output" : "Input",
3529 is_output ? ic->oformat->name : ic->iformat->name,
3530 is_output ? "to" : "from", url);
3531 dump_metadata(NULL, ic->metadata, " ");
3533 av_log(NULL, AV_LOG_INFO, " Duration: ");
3534 if (ic->duration != AV_NOPTS_VALUE) {
3535 int hours, mins, secs, us;
3536 secs = ic->duration / AV_TIME_BASE;
3537 us = ic->duration % AV_TIME_BASE;
3542 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3543 (100 * us) / AV_TIME_BASE);
3545 av_log(NULL, AV_LOG_INFO, "N/A");
3547 if (ic->start_time != AV_NOPTS_VALUE) {
3549 av_log(NULL, AV_LOG_INFO, ", start: ");
3550 secs = ic->start_time / AV_TIME_BASE;
3551 us = abs(ic->start_time % AV_TIME_BASE);
3552 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3553 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3555 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3557 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3559 av_log(NULL, AV_LOG_INFO, "N/A");
3561 av_log(NULL, AV_LOG_INFO, "\n");
3563 for (i = 0; i < ic->nb_chapters; i++) {
3564 AVChapter *ch = ic->chapters[i];
3565 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3566 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3567 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3569 dump_metadata(NULL, ch->metadata, " ");
3571 if(ic->nb_programs) {
3572 int j, k, total = 0;
3573 for(j=0; j<ic->nb_programs; j++) {
3574 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3576 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3577 name ? name->value : "");
3578 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3579 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3580 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3581 printed[ic->programs[j]->stream_index[k]] = 1;
3583 total += ic->programs[j]->nb_stream_indexes;
3585 if (total < ic->nb_streams)
3586 av_log(NULL, AV_LOG_INFO, " No Program\n");
3588 for(i=0;i<ic->nb_streams;i++)
3590 dump_stream_format(ic, i, index, is_output);
3595 int64_t av_gettime(void)
3598 gettimeofday(&tv,NULL);
3599 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3602 uint64_t ff_ntp_time(void)
3604 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3607 #if FF_API_PARSE_DATE
3608 #include "libavutil/parseutils.h"
3610 int64_t parse_date(const char *timestr, int duration)
3613 av_parse_time(&timeval, timestr, duration);
3618 #if FF_API_FIND_INFO_TAG
3619 #include "libavutil/parseutils.h"
3621 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3623 return av_find_info_tag(arg, arg_size, tag1, info);
3627 int av_get_frame_filename(char *buf, int buf_size,
3628 const char *path, int number)
3631 char *q, buf1[20], c;
3632 int nd, len, percentd_found;
3644 while (isdigit(*p)) {
3645 nd = nd * 10 + *p++ - '0';
3648 } while (isdigit(c));
3657 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3659 if ((q - buf + len) > buf_size - 1)
3661 memcpy(q, buf1, len);
3669 if ((q - buf) < buf_size - 1)
3673 if (!percentd_found)
3682 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3686 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3688 for(i=0;i<size;i+=16) {
3695 PRINT(" %02x", buf[i+j]);
3700 for(j=0;j<len;j++) {
3702 if (c < ' ' || c > '~')
3711 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3713 hex_dump_internal(NULL, f, 0, buf, size);
3716 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3718 hex_dump_internal(avcl, NULL, level, buf, size);
3721 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3724 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3725 PRINT("stream #%d:\n", pkt->stream_index);
3726 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3727 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3728 /* DTS is _always_ valid after av_read_frame() */
3730 if (pkt->dts == AV_NOPTS_VALUE)
3733 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3734 /* PTS may not be known if B-frames are present. */
3736 if (pkt->pts == AV_NOPTS_VALUE)
3739 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3741 PRINT(" size=%d\n", pkt->size);
3744 av_hex_dump(f, pkt->data, pkt->size);
3748 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3750 AVRational tb = { 1, AV_TIME_BASE };
3751 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3755 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3757 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3761 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3763 AVRational tb = { 1, AV_TIME_BASE };
3764 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3768 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3771 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3774 void av_url_split(char *proto, int proto_size,
3775 char *authorization, int authorization_size,
3776 char *hostname, int hostname_size,
3778 char *path, int path_size,
3781 const char *p, *ls, *at, *col, *brk;
3783 if (port_ptr) *port_ptr = -1;
3784 if (proto_size > 0) proto[0] = 0;
3785 if (authorization_size > 0) authorization[0] = 0;
3786 if (hostname_size > 0) hostname[0] = 0;
3787 if (path_size > 0) path[0] = 0;
3789 /* parse protocol */
3790 if ((p = strchr(url, ':'))) {
3791 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3796 /* no protocol means plain filename */
3797 av_strlcpy(path, url, path_size);
3801 /* separate path from hostname */
3802 ls = strchr(p, '/');
3804 ls = strchr(p, '?');
3806 av_strlcpy(path, ls, path_size);
3808 ls = &p[strlen(p)]; // XXX
3810 /* the rest is hostname, use that to parse auth/port */
3812 /* authorization (user[:pass]@hostname) */
3813 if ((at = strchr(p, '@')) && at < ls) {
3814 av_strlcpy(authorization, p,
3815 FFMIN(authorization_size, at + 1 - p));
3816 p = at + 1; /* skip '@' */
3819 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3821 av_strlcpy(hostname, p + 1,
3822 FFMIN(hostname_size, brk - p));
3823 if (brk[1] == ':' && port_ptr)
3824 *port_ptr = atoi(brk + 2);
3825 } else if ((col = strchr(p, ':')) && col < ls) {
3826 av_strlcpy(hostname, p,
3827 FFMIN(col + 1 - p, hostname_size));
3828 if (port_ptr) *port_ptr = atoi(col + 1);
3830 av_strlcpy(hostname, p,
3831 FFMIN(ls + 1 - p, hostname_size));
3835 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3838 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3841 'C', 'D', 'E', 'F' };
3842 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3845 'c', 'd', 'e', 'f' };
3846 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3848 for(i = 0; i < s; i++) {
3849 buff[i * 2] = hex_table[src[i] >> 4];
3850 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3856 int ff_hex_to_data(uint8_t *data, const char *p)
3863 p += strspn(p, SPACE_CHARS);
3866 c = toupper((unsigned char) *p++);
3867 if (c >= '0' && c <= '9')
3869 else if (c >= 'A' && c <= 'F')
3884 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3885 unsigned int pts_num, unsigned int pts_den)
3888 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3889 if(new_tb.num != pts_num)
3890 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3892 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3894 if(new_tb.num <= 0 || new_tb.den <= 0) {
3895 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3898 s->time_base = new_tb;
3899 s->pts_wrap_bits = pts_wrap_bits;
3902 int ff_url_join(char *str, int size, const char *proto,
3903 const char *authorization, const char *hostname,
3904 int port, const char *fmt, ...)
3907 struct addrinfo hints, *ai;
3912 av_strlcatf(str, size, "%s://", proto);
3913 if (authorization && authorization[0])
3914 av_strlcatf(str, size, "%s@", authorization);
3915 #if CONFIG_NETWORK && defined(AF_INET6)
3916 /* Determine if hostname is a numerical IPv6 address,
3917 * properly escape it within [] in that case. */
3918 memset(&hints, 0, sizeof(hints));
3919 hints.ai_flags = AI_NUMERICHOST;
3920 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3921 if (ai->ai_family == AF_INET6) {
3922 av_strlcat(str, "[", size);
3923 av_strlcat(str, hostname, size);
3924 av_strlcat(str, "]", size);
3926 av_strlcat(str, hostname, size);
3931 /* Not an IPv6 address, just output the plain string. */
3932 av_strlcat(str, hostname, size);
3935 av_strlcatf(str, size, ":%d", port);
3938 int len = strlen(str);
3941 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3947 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3948 AVFormatContext *src)
3953 local_pkt.stream_index = dst_stream;
3954 if (pkt->pts != AV_NOPTS_VALUE)
3955 local_pkt.pts = av_rescale_q(pkt->pts,
3956 src->streams[pkt->stream_index]->time_base,
3957 dst->streams[dst_stream]->time_base);
3958 if (pkt->dts != AV_NOPTS_VALUE)
3959 local_pkt.dts = av_rescale_q(pkt->dts,
3960 src->streams[pkt->stream_index]->time_base,
3961 dst->streams[dst_stream]->time_base);
3962 return av_write_frame(dst, &local_pkt);
3965 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3968 const char *ptr = str;
3970 /* Parse key=value pairs. */
3973 char *dest = NULL, *dest_end;
3974 int key_len, dest_len = 0;
3976 /* Skip whitespace and potential commas. */
3977 while (*ptr && (isspace(*ptr) || *ptr == ','))
3984 if (!(ptr = strchr(key, '=')))
3987 key_len = ptr - key;
3989 callback_get_buf(context, key, key_len, &dest, &dest_len);
3990 dest_end = dest + dest_len - 1;
3994 while (*ptr && *ptr != '\"') {
3998 if (dest && dest < dest_end)
4002 if (dest && dest < dest_end)
4010 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
4011 if (dest && dest < dest_end)
4019 int ff_find_stream_index(AVFormatContext *s, int id)
4022 for (i = 0; i < s->nb_streams; i++) {
4023 if (s->streams[i]->id == id)
4029 void ff_make_absolute_url(char *buf, int size, const char *base,
4033 /* Absolute path, relative to the current server */
4034 if (base && strstr(base, "://") && rel[0] == '/') {
4036 av_strlcpy(buf, base, size);
4037 sep = strstr(buf, "://");
4040 sep = strchr(sep, '/');
4044 av_strlcat(buf, rel, size);
4047 /* If rel actually is an absolute url, just copy it */
4048 if (!base || strstr(rel, "://") || rel[0] == '/') {
4049 av_strlcpy(buf, rel, size);
4053 av_strlcpy(buf, base, size);
4054 /* Remove the file name from the base url */
4055 sep = strrchr(buf, '/');
4060 while (av_strstart(rel, "../", NULL) && sep) {
4061 /* Remove the path delimiter at the end */
4063 sep = strrchr(buf, '/');
4064 /* If the next directory name to pop off is "..", break here */
4065 if (!strcmp(sep ? &sep[1] : buf, "..")) {
4066 /* Readd the slash we just removed */
4067 av_strlcat(buf, "/", size);
4070 /* Cut off the directory name */
4077 av_strlcat(buf, rel, size);
4080 int64_t ff_iso8601_to_unix_time(const char *datestr)
4083 struct tm time = {0};
4084 strptime(datestr, "%Y - %m - %dT%T", &time);
4085 return mktime(&time);
4087 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
4088 "the date string.\n");
4093 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
4096 if (ofmt->query_codec)
4097 return ofmt->query_codec(codec_id, std_compliance);
4098 else if (ofmt->codec_tag)
4099 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4100 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4101 codec_id == ofmt->subtitle_codec)
4104 return AVERROR_PATCHWELCOME;