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 */
1149 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
1150 compute_pkt_fields(s, st, NULL, pkt);
1152 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1153 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1154 ff_reduce_index(s, st->index);
1155 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1158 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1159 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1160 st->cur_ptr, st->cur_len,
1161 st->cur_pkt.pts, st->cur_pkt.dts,
1163 st->cur_pkt.pts = AV_NOPTS_VALUE;
1164 st->cur_pkt.dts = AV_NOPTS_VALUE;
1165 /* increment read pointer */
1169 /* return packet if any */
1173 pkt->stream_index = st->index;
1174 pkt->pts = st->parser->pts;
1175 pkt->dts = st->parser->dts;
1176 pkt->pos = st->parser->pos;
1177 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1179 pkt->destruct= st->cur_pkt.destruct;
1180 st->cur_pkt.destruct= NULL;
1181 st->cur_pkt.data = NULL;
1182 assert(st->cur_len == 0);
1184 pkt->destruct = NULL;
1186 compute_pkt_fields(s, st, st->parser, pkt);
1188 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1189 int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
1190 ff_reduce_index(s, st->index);
1191 av_add_index_entry(st, pos, pkt->dts,
1192 0, 0, AVINDEX_KEYFRAME);
1199 av_free_packet(&st->cur_pkt);
1204 /* read next packet */
1205 ret = av_read_packet(s, &cur_pkt);
1207 if (ret == AVERROR(EAGAIN))
1209 /* return the last frames, if any */
1210 for(i = 0; i < s->nb_streams; i++) {
1212 if (st->parser && st->need_parsing) {
1213 av_parser_parse2(st->parser, st->codec,
1214 &pkt->data, &pkt->size,
1216 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1222 /* no more packets: really terminate parsing */
1225 st = s->streams[cur_pkt.stream_index];
1226 st->cur_pkt= cur_pkt;
1228 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1229 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1230 st->cur_pkt.pts < st->cur_pkt.dts){
1231 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1232 st->cur_pkt.stream_index,
1236 // av_free_packet(&st->cur_pkt);
1240 if(s->debug & FF_FDEBUG_TS)
1241 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1242 st->cur_pkt.stream_index,
1246 st->cur_pkt.duration,
1250 st->cur_ptr = st->cur_pkt.data;
1251 st->cur_len = st->cur_pkt.size;
1252 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1253 st->parser = av_parser_init(st->codec->codec_id);
1255 av_log(s, AV_LOG_WARNING, "parser not found for codec "
1256 "%s, packets or times may be invalid.\n",
1257 avcodec_get_name(st->codec->codec_id));
1258 /* no parser available: just output the raw packets */
1259 st->need_parsing = AVSTREAM_PARSE_NONE;
1260 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1261 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1262 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1263 st->parser->flags |= PARSER_FLAG_ONCE;
1268 if(s->debug & FF_FDEBUG_TS)
1269 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1280 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1284 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1287 pktl = s->packet_buffer;
1289 AVPacket *next_pkt= &pktl->pkt;
1291 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1292 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1293 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1294 if( pktl->pkt.stream_index == next_pkt->stream_index
1295 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1296 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1297 next_pkt->pts= pktl->pkt.dts;
1301 pktl = s->packet_buffer;
1304 if( next_pkt->pts != AV_NOPTS_VALUE
1305 || next_pkt->dts == AV_NOPTS_VALUE
1307 /* read packet from packet buffer, if there is data */
1309 s->packet_buffer = pktl->next;
1315 int ret= read_frame_internal(s, pkt);
1317 if(pktl && ret != AVERROR(EAGAIN)){
1324 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1325 &s->packet_buffer_end)) < 0)
1326 return AVERROR(ENOMEM);
1328 assert(!s->packet_buffer);
1329 return read_frame_internal(s, pkt);
1334 /* XXX: suppress the packet queue */
1335 static void flush_packet_queue(AVFormatContext *s)
1340 pktl = s->packet_buffer;
1343 s->packet_buffer = pktl->next;
1344 av_free_packet(&pktl->pkt);
1347 while(s->raw_packet_buffer){
1348 pktl = s->raw_packet_buffer;
1349 s->raw_packet_buffer = pktl->next;
1350 av_free_packet(&pktl->pkt);
1353 s->packet_buffer_end=
1354 s->raw_packet_buffer_end= NULL;
1355 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1358 /*******************************************************/
1361 int av_find_default_stream_index(AVFormatContext *s)
1363 int first_audio_index = -1;
1367 if (s->nb_streams <= 0)
1369 for(i = 0; i < s->nb_streams; i++) {
1371 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1374 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1375 first_audio_index = i;
1377 return first_audio_index >= 0 ? first_audio_index : 0;
1381 * Flush the frame reader.
1383 void ff_read_frame_flush(AVFormatContext *s)
1388 flush_packet_queue(s);
1392 /* for each stream, reset read state */
1393 for(i = 0; i < s->nb_streams; i++) {
1397 av_parser_close(st->parser);
1399 av_free_packet(&st->cur_pkt);
1401 st->last_IP_pts = AV_NOPTS_VALUE;
1402 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1403 st->reference_dts = AV_NOPTS_VALUE;
1408 st->probe_packets = MAX_PROBE_PACKETS;
1410 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1411 st->pts_buffer[j]= AV_NOPTS_VALUE;
1415 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1418 for(i = 0; i < s->nb_streams; i++) {
1419 AVStream *st = s->streams[i];
1421 st->cur_dts = av_rescale(timestamp,
1422 st->time_base.den * (int64_t)ref_st->time_base.num,
1423 st->time_base.num * (int64_t)ref_st->time_base.den);
1427 void ff_reduce_index(AVFormatContext *s, int stream_index)
1429 AVStream *st= s->streams[stream_index];
1430 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1432 if((unsigned)st->nb_index_entries >= max_entries){
1434 for(i=0; 2*i<st->nb_index_entries; i++)
1435 st->index_entries[i]= st->index_entries[2*i];
1436 st->nb_index_entries= i;
1440 int ff_add_index_entry(AVIndexEntry **index_entries,
1441 int *nb_index_entries,
1442 unsigned int *index_entries_allocated_size,
1443 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1445 AVIndexEntry *entries, *ie;
1448 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1451 entries = av_fast_realloc(*index_entries,
1452 index_entries_allocated_size,
1453 (*nb_index_entries + 1) *
1454 sizeof(AVIndexEntry));
1458 *index_entries= entries;
1460 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1463 index= (*nb_index_entries)++;
1464 ie= &entries[index];
1465 assert(index==0 || ie[-1].timestamp < timestamp);
1467 ie= &entries[index];
1468 if(ie->timestamp != timestamp){
1469 if(ie->timestamp <= timestamp)
1471 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1472 (*nb_index_entries)++;
1473 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1474 distance= ie->min_distance;
1478 ie->timestamp = timestamp;
1479 ie->min_distance= distance;
1486 int av_add_index_entry(AVStream *st,
1487 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1489 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1490 &st->index_entries_allocated_size, pos,
1491 timestamp, size, distance, flags);
1494 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1495 int64_t wanted_timestamp, int flags)
1503 //optimize appending index entries at the end
1504 if(b && entries[b-1].timestamp < wanted_timestamp)
1509 timestamp = entries[m].timestamp;
1510 if(timestamp >= wanted_timestamp)
1512 if(timestamp <= wanted_timestamp)
1515 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1517 if(!(flags & AVSEEK_FLAG_ANY)){
1518 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1519 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1528 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1531 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1532 wanted_timestamp, flags);
1535 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1536 AVInputFormat *avif= s->iformat;
1537 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1538 int64_t ts_min, ts_max, ts;
1543 if (stream_index < 0)
1546 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1549 ts_min= AV_NOPTS_VALUE;
1550 pos_limit= -1; //gcc falsely says it may be uninitialized
1552 st= s->streams[stream_index];
1553 if(st->index_entries){
1556 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()
1557 index= FFMAX(index, 0);
1558 e= &st->index_entries[index];
1560 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1562 ts_min= e->timestamp;
1563 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1569 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1570 assert(index < st->nb_index_entries);
1572 e= &st->index_entries[index];
1573 assert(e->timestamp >= target_ts);
1575 ts_max= e->timestamp;
1576 pos_limit= pos_max - e->min_distance;
1577 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1578 pos_max,pos_limit, ts_max);
1582 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1587 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1590 av_update_cur_dts(s, st, ts);
1595 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 )){
1597 int64_t start_pos, filesize;
1600 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1602 if(ts_min == AV_NOPTS_VALUE){
1603 pos_min = s->data_offset;
1604 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1605 if (ts_min == AV_NOPTS_VALUE)
1609 if(ts_max == AV_NOPTS_VALUE){
1611 filesize = avio_size(s->pb);
1612 pos_max = filesize - 1;
1615 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1617 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1618 if (ts_max == AV_NOPTS_VALUE)
1622 int64_t tmp_pos= pos_max + 1;
1623 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1624 if(tmp_ts == AV_NOPTS_VALUE)
1628 if(tmp_pos >= filesize)
1634 if(ts_min > ts_max){
1636 }else if(ts_min == ts_max){
1641 while (pos_min < pos_limit) {
1642 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1643 pos_min, pos_max, ts_min, ts_max);
1644 assert(pos_limit <= pos_max);
1647 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1648 // interpolate position (better than dichotomy)
1649 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1650 + pos_min - approximate_keyframe_distance;
1651 }else if(no_change==1){
1652 // bisection, if interpolation failed to change min or max pos last time
1653 pos = (pos_min + pos_limit)>>1;
1655 /* linear search if bisection failed, can only happen if there
1656 are very few or no keyframes between min/max */
1661 else if(pos > pos_limit)
1665 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1670 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1671 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1672 pos_limit, start_pos, no_change);
1673 if(ts == AV_NOPTS_VALUE){
1674 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1677 assert(ts != AV_NOPTS_VALUE);
1678 if (target_ts <= ts) {
1679 pos_limit = start_pos - 1;
1683 if (target_ts >= ts) {
1689 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1690 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1692 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1694 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1695 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1696 pos, ts_min, target_ts, ts_max);
1701 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1702 int64_t pos_min, pos_max;
1706 if (stream_index < 0)
1709 st= s->streams[stream_index];
1712 pos_min = s->data_offset;
1713 pos_max = avio_size(s->pb) - 1;
1715 if (pos < pos_min) pos= pos_min;
1716 else if(pos > pos_max) pos= pos_max;
1718 avio_seek(s->pb, pos, SEEK_SET);
1721 av_update_cur_dts(s, st, ts);
1726 static int seek_frame_generic(AVFormatContext *s,
1727 int stream_index, int64_t timestamp, int flags)
1734 st = s->streams[stream_index];
1736 index = av_index_search_timestamp(st, timestamp, flags);
1738 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1741 if(index < 0 || index==st->nb_index_entries-1){
1745 if(st->nb_index_entries){
1746 assert(st->index_entries);
1747 ie= &st->index_entries[st->nb_index_entries-1];
1748 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1750 av_update_cur_dts(s, st, ie->timestamp);
1752 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1758 ret = av_read_frame(s, &pkt);
1759 }while(ret == AVERROR(EAGAIN));
1762 av_free_packet(&pkt);
1763 if(stream_index == pkt.stream_index){
1764 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1768 index = av_index_search_timestamp(st, timestamp, flags);
1773 ff_read_frame_flush(s);
1774 if (s->iformat->read_seek){
1775 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1778 ie = &st->index_entries[index];
1779 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1781 av_update_cur_dts(s, st, ie->timestamp);
1786 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1791 ff_read_frame_flush(s);
1793 if(flags & AVSEEK_FLAG_BYTE)
1794 return seek_frame_byte(s, stream_index, timestamp, flags);
1796 if(stream_index < 0){
1797 stream_index= av_find_default_stream_index(s);
1798 if(stream_index < 0)
1801 st= s->streams[stream_index];
1802 /* timestamp for default must be expressed in AV_TIME_BASE units */
1803 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1806 /* first, we try the format specific seek */
1807 if (s->iformat->read_seek)
1808 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1815 if(s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH))
1816 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1817 else if (!(s->iformat->flags & AVFMT_NOGENSEARCH))
1818 return seek_frame_generic(s, stream_index, timestamp, flags);
1823 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1825 if(min_ts > ts || max_ts < ts)
1828 ff_read_frame_flush(s);
1830 if (s->iformat->read_seek2)
1831 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1833 if(s->iformat->read_timestamp){
1834 //try to seek via read_timestamp()
1837 //Fallback to old API if new is not implemented but old is
1838 //Note the old has somewat different sematics
1839 if(s->iformat->read_seek || 1)
1840 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1842 // try some generic seek like seek_frame_generic() but with new ts semantics
1845 /*******************************************************/
1848 * Return TRUE if the stream has accurate duration in any stream.
1850 * @return TRUE if the stream has accurate duration for at least one component.
1852 static int has_duration(AVFormatContext *ic)
1857 for(i = 0;i < ic->nb_streams; i++) {
1858 st = ic->streams[i];
1859 if (st->duration != AV_NOPTS_VALUE)
1866 * Estimate the stream timings from the one of each components.
1868 * Also computes the global bitrate if possible.
1870 static void update_stream_timings(AVFormatContext *ic)
1872 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1873 int64_t duration, duration1;
1877 start_time = INT64_MAX;
1878 start_time_text = INT64_MAX;
1879 end_time = INT64_MIN;
1880 duration = INT64_MIN;
1881 for(i = 0;i < ic->nb_streams; i++) {
1882 st = ic->streams[i];
1883 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1884 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1885 if (st->codec->codec_id == CODEC_ID_DVB_TELETEXT) {
1886 if (start_time1 < start_time_text)
1887 start_time_text = start_time1;
1889 if (start_time1 < start_time)
1890 start_time = start_time1;
1891 if (st->duration != AV_NOPTS_VALUE) {
1892 end_time1 = start_time1
1893 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1894 if (end_time1 > end_time)
1895 end_time = end_time1;
1898 if (st->duration != AV_NOPTS_VALUE) {
1899 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1900 if (duration1 > duration)
1901 duration = duration1;
1904 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
1905 start_time = start_time_text;
1906 if (start_time != INT64_MAX) {
1907 ic->start_time = start_time;
1908 if (end_time != INT64_MIN) {
1909 if (end_time - start_time > duration)
1910 duration = end_time - start_time;
1913 if (duration != INT64_MIN) {
1914 ic->duration = duration;
1915 if (ic->file_size > 0) {
1916 /* compute the bitrate */
1917 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1918 (double)ic->duration;
1923 static void fill_all_stream_timings(AVFormatContext *ic)
1928 update_stream_timings(ic);
1929 for(i = 0;i < ic->nb_streams; i++) {
1930 st = ic->streams[i];
1931 if (st->start_time == AV_NOPTS_VALUE) {
1932 if(ic->start_time != AV_NOPTS_VALUE)
1933 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1934 if(ic->duration != AV_NOPTS_VALUE)
1935 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1940 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
1942 int64_t filesize, duration;
1946 /* if bit_rate is already set, we believe it */
1947 if (ic->bit_rate <= 0) {
1949 for(i=0;i<ic->nb_streams;i++) {
1950 st = ic->streams[i];
1951 if (st->codec->bit_rate > 0)
1952 bit_rate += st->codec->bit_rate;
1954 ic->bit_rate = bit_rate;
1957 /* if duration is already set, we believe it */
1958 if (ic->duration == AV_NOPTS_VALUE &&
1959 ic->bit_rate != 0 &&
1960 ic->file_size != 0) {
1961 filesize = ic->file_size;
1963 for(i = 0; i < ic->nb_streams; i++) {
1964 st = ic->streams[i];
1965 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1966 if (st->duration == AV_NOPTS_VALUE)
1967 st->duration = duration;
1973 #define DURATION_MAX_READ_SIZE 250000
1974 #define DURATION_MAX_RETRY 3
1976 /* only usable for MPEG-PS streams */
1977 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1979 AVPacket pkt1, *pkt = &pkt1;
1981 int read_size, i, ret;
1983 int64_t filesize, offset, duration;
1988 /* flush packet queue */
1989 flush_packet_queue(ic);
1991 for (i=0; i<ic->nb_streams; i++) {
1992 st = ic->streams[i];
1993 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1994 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
1997 av_parser_close(st->parser);
1999 av_free_packet(&st->cur_pkt);
2003 /* estimate the end time (duration) */
2004 /* XXX: may need to support wrapping */
2005 filesize = ic->file_size;
2006 end_time = AV_NOPTS_VALUE;
2008 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2012 avio_seek(ic->pb, offset, SEEK_SET);
2015 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2019 ret = av_read_packet(ic, pkt);
2020 } while(ret == AVERROR(EAGAIN));
2023 read_size += pkt->size;
2024 st = ic->streams[pkt->stream_index];
2025 if (pkt->pts != AV_NOPTS_VALUE &&
2026 (st->start_time != AV_NOPTS_VALUE ||
2027 st->first_dts != AV_NOPTS_VALUE)) {
2028 duration = end_time = pkt->pts;
2029 if (st->start_time != AV_NOPTS_VALUE)
2030 duration -= st->start_time;
2032 duration -= st->first_dts;
2034 duration += 1LL<<st->pts_wrap_bits;
2036 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2037 st->duration = duration;
2040 av_free_packet(pkt);
2042 }while( end_time==AV_NOPTS_VALUE
2043 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2044 && ++retry <= DURATION_MAX_RETRY);
2046 fill_all_stream_timings(ic);
2048 avio_seek(ic->pb, old_offset, SEEK_SET);
2049 for (i=0; i<ic->nb_streams; i++) {
2051 st->cur_dts= st->first_dts;
2052 st->last_IP_pts = AV_NOPTS_VALUE;
2053 st->reference_dts = AV_NOPTS_VALUE;
2057 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2061 /* get the file size, if possible */
2062 if (ic->iformat->flags & AVFMT_NOFILE) {
2065 file_size = avio_size(ic->pb);
2069 ic->file_size = file_size;
2071 if ((!strcmp(ic->iformat->name, "mpeg") ||
2072 !strcmp(ic->iformat->name, "mpegts")) &&
2073 file_size && ic->pb->seekable) {
2074 /* get accurate estimate from the PTSes */
2075 estimate_timings_from_pts(ic, old_offset);
2076 } else if (has_duration(ic)) {
2077 /* at least one component has timings - we use them for all
2079 fill_all_stream_timings(ic);
2081 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2082 /* less precise: use bitrate info */
2083 estimate_timings_from_bit_rate(ic);
2085 update_stream_timings(ic);
2089 AVStream av_unused *st;
2090 for(i = 0;i < ic->nb_streams; i++) {
2091 st = ic->streams[i];
2092 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2093 (double) st->start_time / AV_TIME_BASE,
2094 (double) st->duration / AV_TIME_BASE);
2096 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2097 (double) ic->start_time / AV_TIME_BASE,
2098 (double) ic->duration / AV_TIME_BASE,
2099 ic->bit_rate / 1000);
2103 static int has_codec_parameters(AVCodecContext *avctx)
2106 switch (avctx->codec_type) {
2107 case AVMEDIA_TYPE_AUDIO:
2108 val = avctx->sample_rate && avctx->channels && avctx->sample_fmt != AV_SAMPLE_FMT_NONE;
2109 if(!avctx->frame_size &&
2110 (avctx->codec_id == CODEC_ID_VORBIS ||
2111 avctx->codec_id == CODEC_ID_AAC ||
2112 avctx->codec_id == CODEC_ID_MP1 ||
2113 avctx->codec_id == CODEC_ID_MP2 ||
2114 avctx->codec_id == CODEC_ID_MP3 ||
2115 avctx->codec_id == CODEC_ID_SPEEX ||
2116 avctx->codec_id == CODEC_ID_CELT))
2119 case AVMEDIA_TYPE_VIDEO:
2120 val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
2126 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2129 static int has_decode_delay_been_guessed(AVStream *st)
2131 return st->codec->codec_id != CODEC_ID_H264 ||
2132 st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2135 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2139 int got_picture, data_size, ret=0;
2142 if(!st->codec->codec){
2143 codec = avcodec_find_decoder(st->codec->codec_id);
2146 ret = avcodec_open2(st->codec, codec, options);
2151 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st) ||
2152 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF)) {
2153 switch(st->codec->codec_type) {
2154 case AVMEDIA_TYPE_VIDEO:
2155 avcodec_get_frame_defaults(&picture);
2156 ret = avcodec_decode_video2(st->codec, &picture,
2157 &got_picture, avpkt);
2159 case AVMEDIA_TYPE_AUDIO:
2160 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2161 samples = av_malloc(data_size);
2164 ret = avcodec_decode_audio3(st->codec, samples,
2176 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2178 while (tags->id != CODEC_ID_NONE) {
2186 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2189 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2190 if(tag == tags[i].tag)
2193 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2194 if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2197 return CODEC_ID_NONE;
2200 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2203 for(i=0; tags && tags[i]; i++){
2204 int tag= ff_codec_get_tag(tags[i], id);
2210 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2213 for(i=0; tags && tags[i]; i++){
2214 enum CodecID id= ff_codec_get_id(tags[i], tag);
2215 if(id!=CODEC_ID_NONE) return id;
2217 return CODEC_ID_NONE;
2220 static void compute_chapters_end(AVFormatContext *s)
2223 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2225 for (i = 0; i < s->nb_chapters; i++)
2226 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2227 AVChapter *ch = s->chapters[i];
2228 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2231 for (j = 0; j < s->nb_chapters; j++) {
2232 AVChapter *ch1 = s->chapters[j];
2233 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2234 if (j != i && next_start > ch->start && next_start < end)
2237 ch->end = (end == INT64_MAX) ? ch->start : end;
2241 static int get_std_framerate(int i){
2242 if(i<60*12) return i*1001;
2243 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2247 * Is the time base unreliable.
2248 * This is a heuristic to balance between quick acceptance of the values in
2249 * the headers vs. some extra checks.
2250 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2251 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2252 * And there are "variable" fps files this needs to detect as well.
2254 static int tb_unreliable(AVCodecContext *c){
2255 if( c->time_base.den >= 101L*c->time_base.num
2256 || c->time_base.den < 5L*c->time_base.num
2257 /* || c->codec_tag == AV_RL32("DIVX")
2258 || c->codec_tag == AV_RL32("XVID")*/
2259 || c->codec_id == CODEC_ID_MPEG2VIDEO
2260 || c->codec_id == CODEC_ID_H264
2266 #if FF_API_FORMAT_PARAMETERS
2267 int av_find_stream_info(AVFormatContext *ic)
2269 return avformat_find_stream_info(ic, NULL);
2273 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2275 int i, count, ret, read_size, j;
2277 AVPacket pkt1, *pkt;
2278 int64_t old_offset = avio_tell(ic->pb);
2279 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2281 for(i=0;i<ic->nb_streams;i++) {
2283 st = ic->streams[i];
2284 if (st->codec->codec_id == CODEC_ID_AAC && st->codec->extradata_size) {
2285 // We need to discard these since they can be plain wrong for
2286 // backwards compatible HE-AAC signaling.
2287 // But when we have no extradata we need to keep them or we can't
2288 // play anything at all.
2289 st->codec->sample_rate = 0;
2290 st->codec->frame_size = 0;
2291 st->codec->channels = 0;
2294 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2295 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2296 /* if(!st->time_base.num)
2298 if(!st->codec->time_base.num)
2299 st->codec->time_base= st->time_base;
2301 //only for the split stuff
2302 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2303 st->parser = av_parser_init(st->codec->codec_id);
2304 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2305 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2308 assert(!st->codec->codec);
2309 codec = avcodec_find_decoder(st->codec->codec_id);
2311 /* Ensure that subtitle_header is properly set. */
2312 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2313 && codec && !st->codec->codec)
2314 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2316 //try to just open decoders, in case this is enough to get parameters
2317 if(!has_codec_parameters(st->codec)){
2318 if (codec && !st->codec->codec)
2319 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2323 for (i=0; i<ic->nb_streams; i++) {
2324 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2330 if(url_interrupt_cb()){
2332 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2336 /* check if one codec still needs to be handled */
2337 for(i=0;i<ic->nb_streams;i++) {
2338 int fps_analyze_framecount = 20;
2340 st = ic->streams[i];
2341 if (!has_codec_parameters(st->codec))
2343 /* if the timebase is coarse (like the usual millisecond precision
2344 of mkv), we need to analyze more frames to reliably arrive at
2346 if (av_q2d(st->time_base) > 0.0005)
2347 fps_analyze_framecount *= 2;
2348 if (ic->fps_probe_size >= 0)
2349 fps_analyze_framecount = ic->fps_probe_size;
2350 /* variable fps and no guess at the real fps */
2351 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2352 && st->info->duration_count < fps_analyze_framecount
2353 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2355 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2357 if(st->first_dts == AV_NOPTS_VALUE)
2360 if (i == ic->nb_streams) {
2361 /* NOTE: if the format has no header, then we need to read
2362 some packets to get most of the streams, so we cannot
2364 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2365 /* if we found the info for all the codecs, we can stop */
2367 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2371 /* we did not get all the codec info, but we read too much data */
2372 if (read_size >= ic->probesize) {
2374 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2378 /* NOTE: a new stream can be added there if no header in file
2379 (AVFMTCTX_NOHEADER) */
2380 ret = read_frame_internal(ic, &pkt1);
2381 if (ret == AVERROR(EAGAIN))
2386 ret = -1; /* we could not have all the codec parameters before EOF */
2387 for(i=0;i<ic->nb_streams;i++) {
2388 st = ic->streams[i];
2389 if (!has_codec_parameters(st->codec)){
2391 avcodec_string(buf, sizeof(buf), st->codec, 0);
2392 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2400 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2401 if ((ret = av_dup_packet(pkt)) < 0)
2402 goto find_stream_info_err;
2404 read_size += pkt->size;
2406 st = ic->streams[pkt->stream_index];
2407 if (st->codec_info_nb_frames>1) {
2409 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) {
2410 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2413 st->info->codec_info_duration += pkt->duration;
2416 int64_t last = st->info->last_dts;
2417 int64_t duration= pkt->dts - last;
2419 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2420 double dur= duration * av_q2d(st->time_base);
2422 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2423 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2424 if (st->info->duration_count < 2)
2425 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2426 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2427 int framerate= get_std_framerate(i);
2428 int ticks= lrintf(dur*framerate/(1001*12));
2429 double error= dur - ticks*1001*12/(double)framerate;
2430 st->info->duration_error[i] += error*error;
2432 st->info->duration_count++;
2433 // ignore the first 4 values, they might have some random jitter
2434 if (st->info->duration_count > 3)
2435 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2437 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2438 st->info->last_dts = pkt->dts;
2440 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2441 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2443 st->codec->extradata_size= i;
2444 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2445 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2446 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2450 /* if still no information, we try to open the codec and to
2451 decompress the frame. We try to avoid that in most cases as
2452 it takes longer and uses more memory. For MPEG-4, we need to
2453 decompress for QuickTime.
2455 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2456 least one frame of codec data, this makes sure the codec initializes
2457 the channel configuration and does not only trust the values from the container.
2459 try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
2461 st->codec_info_nb_frames++;
2465 // close codecs which were opened in try_decode_frame()
2466 for(i=0;i<ic->nb_streams;i++) {
2467 st = ic->streams[i];
2468 if(st->codec->codec)
2469 avcodec_close(st->codec);
2471 for(i=0;i<ic->nb_streams;i++) {
2472 st = ic->streams[i];
2473 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2474 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2475 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2476 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2477 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2478 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2479 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2480 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2481 st->codec->codec_tag= tag;
2484 // the check for tb_unreliable() is not completely correct, since this is not about handling
2485 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2486 // ipmovie.c produces.
2487 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)
2488 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);
2489 if (st->info->duration_count && !st->r_frame_rate.num
2490 && tb_unreliable(st->codec) /*&&
2491 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2492 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2494 double best_error= 2*av_q2d(st->time_base);
2495 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2497 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2498 double error = st->info->duration_error[j] * get_std_framerate(j);
2499 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2500 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2501 if(error < best_error){
2503 num = get_std_framerate(j);
2506 // do not increase frame rate by more than 1 % in order to match a standard rate.
2507 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2508 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2511 if (!st->r_frame_rate.num){
2512 if( st->codec->time_base.den * (int64_t)st->time_base.num
2513 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2514 st->r_frame_rate.num = st->codec->time_base.den;
2515 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2517 st->r_frame_rate.num = st->time_base.den;
2518 st->r_frame_rate.den = st->time_base.num;
2521 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2522 if(!st->codec->bits_per_coded_sample)
2523 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2524 // set stream disposition based on audio service type
2525 switch (st->codec->audio_service_type) {
2526 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2527 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2528 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2529 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2530 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2531 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2532 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2533 st->disposition = AV_DISPOSITION_COMMENT; break;
2534 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2535 st->disposition = AV_DISPOSITION_KARAOKE; break;
2540 estimate_timings(ic, old_offset);
2542 compute_chapters_end(ic);
2545 /* correct DTS for B-frame streams with no timestamps */
2546 for(i=0;i<ic->nb_streams;i++) {
2547 st = ic->streams[i];
2548 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2550 ppktl = &ic->packet_buffer;
2552 if(ppkt1->stream_index != i)
2554 if(ppkt1->pkt->dts < 0)
2556 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2558 ppkt1->pkt->dts -= delta;
2563 st->cur_dts -= delta;
2569 find_stream_info_err:
2570 for (i=0; i < ic->nb_streams; i++)
2571 av_freep(&ic->streams[i]->info);
2575 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2579 for (i = 0; i < ic->nb_programs; i++) {
2580 if (ic->programs[i] == last) {
2584 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2585 if (ic->programs[i]->stream_index[j] == s)
2586 return ic->programs[i];
2592 int av_find_best_stream(AVFormatContext *ic,
2593 enum AVMediaType type,
2594 int wanted_stream_nb,
2596 AVCodec **decoder_ret,
2599 int i, nb_streams = ic->nb_streams;
2600 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2601 unsigned *program = NULL;
2602 AVCodec *decoder = NULL, *best_decoder = NULL;
2604 if (related_stream >= 0 && wanted_stream_nb < 0) {
2605 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2607 program = p->stream_index;
2608 nb_streams = p->nb_stream_indexes;
2611 for (i = 0; i < nb_streams; i++) {
2612 int real_stream_index = program ? program[i] : i;
2613 AVStream *st = ic->streams[real_stream_index];
2614 AVCodecContext *avctx = st->codec;
2615 if (avctx->codec_type != type)
2617 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2619 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2622 decoder = avcodec_find_decoder(st->codec->codec_id);
2625 ret = AVERROR_DECODER_NOT_FOUND;
2629 if (best_count >= st->codec_info_nb_frames)
2631 best_count = st->codec_info_nb_frames;
2632 ret = real_stream_index;
2633 best_decoder = decoder;
2634 if (program && i == nb_streams - 1 && ret < 0) {
2636 nb_streams = ic->nb_streams;
2637 i = 0; /* no related stream found, try again with everything */
2641 *decoder_ret = best_decoder;
2645 /*******************************************************/
2647 int av_read_play(AVFormatContext *s)
2649 if (s->iformat->read_play)
2650 return s->iformat->read_play(s);
2652 return avio_pause(s->pb, 0);
2653 return AVERROR(ENOSYS);
2656 int av_read_pause(AVFormatContext *s)
2658 if (s->iformat->read_pause)
2659 return s->iformat->read_pause(s);
2661 return avio_pause(s->pb, 1);
2662 return AVERROR(ENOSYS);
2665 void av_close_input_stream(AVFormatContext *s)
2667 flush_packet_queue(s);
2668 if (s->iformat->read_close)
2669 s->iformat->read_close(s);
2670 avformat_free_context(s);
2673 void avformat_free_context(AVFormatContext *s)
2679 if (s->iformat && s->iformat->priv_class && s->priv_data)
2680 av_opt_free(s->priv_data);
2682 for(i=0;i<s->nb_streams;i++) {
2683 /* free all data in a stream component */
2686 av_parser_close(st->parser);
2687 av_free_packet(&st->cur_pkt);
2689 av_dict_free(&st->metadata);
2690 av_free(st->index_entries);
2691 av_free(st->codec->extradata);
2692 av_free(st->codec->subtitle_header);
2694 av_free(st->priv_data);
2698 for(i=s->nb_programs-1; i>=0; i--) {
2699 av_dict_free(&s->programs[i]->metadata);
2700 av_freep(&s->programs[i]->stream_index);
2701 av_freep(&s->programs[i]);
2703 av_freep(&s->programs);
2704 av_freep(&s->priv_data);
2705 while(s->nb_chapters--) {
2706 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2707 av_free(s->chapters[s->nb_chapters]);
2709 av_freep(&s->chapters);
2710 av_dict_free(&s->metadata);
2711 av_freep(&s->streams);
2715 void av_close_input_file(AVFormatContext *s)
2717 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2719 av_close_input_stream(s);
2724 AVStream *av_new_stream(AVFormatContext *s, int id)
2730 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2732 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2735 s->streams = streams;
2737 st = av_mallocz(sizeof(AVStream));
2740 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2745 st->codec = avcodec_alloc_context3(NULL);
2747 /* no default bitrate if decoding */
2748 st->codec->bit_rate = 0;
2750 st->index = s->nb_streams;
2752 st->start_time = AV_NOPTS_VALUE;
2753 st->duration = AV_NOPTS_VALUE;
2754 /* we set the current DTS to 0 so that formats without any timestamps
2755 but durations get some timestamps, formats with some unknown
2756 timestamps have their first few packets buffered and the
2757 timestamps corrected before they are returned to the user */
2759 st->first_dts = AV_NOPTS_VALUE;
2760 st->probe_packets = MAX_PROBE_PACKETS;
2762 /* default pts setting is MPEG-like */
2763 av_set_pts_info(st, 33, 1, 90000);
2764 st->last_IP_pts = AV_NOPTS_VALUE;
2765 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2766 st->pts_buffer[i]= AV_NOPTS_VALUE;
2767 st->reference_dts = AV_NOPTS_VALUE;
2769 st->sample_aspect_ratio = (AVRational){0,1};
2771 s->streams[s->nb_streams++] = st;
2775 AVProgram *av_new_program(AVFormatContext *ac, int id)
2777 AVProgram *program=NULL;
2780 av_dlog(ac, "new_program: id=0x%04x\n", id);
2782 for(i=0; i<ac->nb_programs; i++)
2783 if(ac->programs[i]->id == id)
2784 program = ac->programs[i];
2787 program = av_mallocz(sizeof(AVProgram));
2790 dynarray_add(&ac->programs, &ac->nb_programs, program);
2791 program->discard = AVDISCARD_NONE;
2798 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2800 AVChapter *chapter = NULL;
2803 for(i=0; i<s->nb_chapters; i++)
2804 if(s->chapters[i]->id == id)
2805 chapter = s->chapters[i];
2808 chapter= av_mallocz(sizeof(AVChapter));
2811 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2813 av_dict_set(&chapter->metadata, "title", title, 0);
2815 chapter->time_base= time_base;
2816 chapter->start = start;
2822 /************************************************************/
2823 /* output media file */
2825 #if FF_API_FORMAT_PARAMETERS
2826 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2828 if (s->oformat->priv_data_size > 0) {
2829 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2831 return AVERROR(ENOMEM);
2832 if (s->oformat->priv_class) {
2833 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2834 av_opt_set_defaults(s->priv_data);
2837 s->priv_data = NULL;
2843 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
2844 const char *format, const char *filename)
2846 AVFormatContext *s = avformat_alloc_context();
2855 oformat = av_guess_format(format, NULL, NULL);
2857 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
2858 ret = AVERROR(EINVAL);
2862 oformat = av_guess_format(NULL, filename, NULL);
2864 ret = AVERROR(EINVAL);
2865 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
2872 s->oformat = oformat;
2873 if (s->oformat->priv_data_size > 0) {
2874 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2877 if (s->oformat->priv_class) {
2878 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2879 av_opt_set_defaults(s->priv_data);
2882 s->priv_data = NULL;
2885 av_strlcpy(s->filename, filename, sizeof(s->filename));
2889 av_log(s, AV_LOG_ERROR, "Out of memory\n");
2890 ret = AVERROR(ENOMEM);
2892 avformat_free_context(s);
2896 #if FF_API_ALLOC_OUTPUT_CONTEXT
2897 AVFormatContext *avformat_alloc_output_context(const char *format,
2898 AVOutputFormat *oformat, const char *filename)
2900 AVFormatContext *avctx;
2901 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
2902 return ret < 0 ? NULL : avctx;
2906 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2908 const AVCodecTag *avctag;
2910 enum CodecID id = CODEC_ID_NONE;
2911 unsigned int tag = 0;
2914 * Check that tag + id is in the table
2915 * If neither is in the table -> OK
2916 * If tag is in the table with another id -> FAIL
2917 * If id is in the table with another tag -> FAIL unless strict < normal
2919 for (n = 0; s->oformat->codec_tag[n]; n++) {
2920 avctag = s->oformat->codec_tag[n];
2921 while (avctag->id != CODEC_ID_NONE) {
2922 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2924 if (id == st->codec->codec_id)
2927 if (avctag->id == st->codec->codec_id)
2932 if (id != CODEC_ID_NONE)
2934 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2939 #if FF_API_FORMAT_PARAMETERS
2940 int av_write_header(AVFormatContext *s)
2942 return avformat_write_header(s, NULL);
2946 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2950 AVDictionary *tmp = NULL;
2953 av_dict_copy(&tmp, *options, 0);
2954 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2956 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
2957 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2960 // some sanity checks
2961 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2962 av_log(s, AV_LOG_ERROR, "no streams\n");
2963 ret = AVERROR(EINVAL);
2967 for(i=0;i<s->nb_streams;i++) {
2970 switch (st->codec->codec_type) {
2971 case AVMEDIA_TYPE_AUDIO:
2972 if(st->codec->sample_rate<=0){
2973 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2974 ret = AVERROR(EINVAL);
2977 if(!st->codec->block_align)
2978 st->codec->block_align = st->codec->channels *
2979 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2981 case AVMEDIA_TYPE_VIDEO:
2982 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2983 av_log(s, AV_LOG_ERROR, "time base not set\n");
2984 ret = AVERROR(EINVAL);
2987 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2988 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2989 ret = AVERROR(EINVAL);
2992 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2993 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2994 ret = AVERROR(EINVAL);
3000 if(s->oformat->codec_tag){
3001 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)){
3002 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
3003 st->codec->codec_tag= 0;
3005 if(st->codec->codec_tag){
3006 if (!validate_codec_tag(s, st)) {
3008 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
3009 av_log(s, AV_LOG_ERROR,
3010 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
3011 tagbuf, st->codec->codec_tag, st->codec->codec_id);
3012 ret = AVERROR_INVALIDDATA;
3016 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3019 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3020 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3021 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3024 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3025 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3026 if (!s->priv_data) {
3027 ret = AVERROR(ENOMEM);
3030 if (s->oformat->priv_class) {
3031 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3032 av_opt_set_defaults(s->priv_data);
3033 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3038 /* set muxer identification string */
3039 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3040 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3043 if(s->oformat->write_header){
3044 ret = s->oformat->write_header(s);
3049 /* init PTS generation */
3050 for(i=0;i<s->nb_streams;i++) {
3051 int64_t den = AV_NOPTS_VALUE;
3054 switch (st->codec->codec_type) {
3055 case AVMEDIA_TYPE_AUDIO:
3056 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3058 case AVMEDIA_TYPE_VIDEO:
3059 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3064 if (den != AV_NOPTS_VALUE) {
3066 ret = AVERROR_INVALIDDATA;
3069 frac_init(&st->pts, 0, 0, den);
3074 av_dict_free(options);
3083 //FIXME merge with compute_pkt_fields
3084 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3085 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3086 int num, den, frame_size, i;
3088 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3089 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3091 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
3092 return AVERROR(EINVAL);*/
3094 /* duration field */
3095 if (pkt->duration == 0) {
3096 compute_frame_duration(&num, &den, st, NULL, pkt);
3098 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3102 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3105 //XXX/FIXME this is a temporary hack until all encoders output pts
3106 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3108 // pkt->pts= st->cur_dts;
3109 pkt->pts= st->pts.val;
3112 //calculate dts from pts
3113 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3114 st->pts_buffer[0]= pkt->pts;
3115 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3116 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3117 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3118 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3120 pkt->dts= st->pts_buffer[0];
3123 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)){
3124 av_log(s, AV_LOG_ERROR,
3125 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3126 st->index, st->cur_dts, pkt->dts);
3127 return AVERROR(EINVAL);
3129 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3130 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3131 return AVERROR(EINVAL);
3134 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3135 st->cur_dts= pkt->dts;
3136 st->pts.val= pkt->dts;
3139 switch (st->codec->codec_type) {
3140 case AVMEDIA_TYPE_AUDIO:
3141 frame_size = get_audio_frame_size(st->codec, pkt->size);
3143 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3144 likely equal to the encoder delay, but it would be better if we
3145 had the real timestamps from the encoder */
3146 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3147 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3150 case AVMEDIA_TYPE_VIDEO:
3151 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3159 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3161 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3163 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3166 ret= s->oformat->write_packet(s, pkt);
3169 s->streams[pkt->stream_index]->nb_frames++;
3173 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3174 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3176 AVPacketList **next_point, *this_pktl;
3178 this_pktl = av_mallocz(sizeof(AVPacketList));
3179 this_pktl->pkt= *pkt;
3180 pkt->destruct= NULL; // do not free original but only the copy
3181 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3183 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3184 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3186 next_point = &s->packet_buffer;
3189 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3190 while(!compare(s, &(*next_point)->pkt, pkt)){
3191 next_point= &(*next_point)->next;
3195 next_point = &(s->packet_buffer_end->next);
3198 assert(!*next_point);
3200 s->packet_buffer_end= this_pktl;
3203 this_pktl->next= *next_point;
3205 s->streams[pkt->stream_index]->last_in_packet_buffer=
3206 *next_point= this_pktl;
3209 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3211 AVStream *st = s->streams[ pkt ->stream_index];
3212 AVStream *st2= s->streams[ next->stream_index];
3213 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3217 return pkt->stream_index < next->stream_index;
3221 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3223 int stream_count=0, noninterleaved_count=0;
3224 int64_t delta_dts_min = INT64_MAX;
3228 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3231 for(i=0; i < s->nb_streams; i++) {
3232 if (s->streams[i]->last_in_packet_buffer) {
3234 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
3235 s->streams[i]->time_base,
3237 av_rescale_q(s->packet_buffer->pkt.dts,
3238 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
3240 if (delta_dts < delta_dts_min)
3241 delta_dts_min = delta_dts;
3244 if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
3245 ++noninterleaved_count;
3249 if (s->nb_streams == stream_count) {
3251 } else if (!flush &&
3252 s->nb_streams == stream_count+noninterleaved_count &&
3253 delta_dts_min > 20*AV_TIME_BASE) {
3254 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
3257 if(stream_count && flush){
3258 pktl= s->packet_buffer;
3261 s->packet_buffer= pktl->next;
3262 if(!s->packet_buffer)
3263 s->packet_buffer_end= NULL;
3265 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3266 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3270 av_init_packet(out);
3276 * Interleave an AVPacket correctly so it can be muxed.
3277 * @param out the interleaved packet will be output here
3278 * @param in the input packet
3279 * @param flush 1 if no further packets are available as input and all
3280 * remaining packets should be output
3281 * @return 1 if a packet was output, 0 if no packet could be output,
3282 * < 0 if an error occurred
3284 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3285 if(s->oformat->interleave_packet)
3286 return s->oformat->interleave_packet(s, out, in, flush);
3288 return av_interleave_packet_per_dts(s, out, in, flush);
3291 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3292 AVStream *st= s->streams[ pkt->stream_index];
3295 //FIXME/XXX/HACK drop zero sized packets
3296 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3299 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3300 pkt->size, pkt->dts, pkt->pts);
3301 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3304 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3305 return AVERROR(EINVAL);
3309 int ret= interleave_packet(s, &opkt, pkt, 0);
3310 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3313 ret= s->oformat->write_packet(s, &opkt);
3315 s->streams[opkt.stream_index]->nb_frames++;
3317 av_free_packet(&opkt);
3322 if(url_ferror(s->pb))
3323 return url_ferror(s->pb);
3327 int av_write_trailer(AVFormatContext *s)
3333 ret= interleave_packet(s, &pkt, NULL, 1);
3334 if(ret<0) //FIXME cleanup needed for ret<0 ?
3339 ret= s->oformat->write_packet(s, &pkt);
3341 s->streams[pkt.stream_index]->nb_frames++;
3343 av_free_packet(&pkt);
3347 if(url_ferror(s->pb))
3351 if(s->oformat->write_trailer)
3352 ret = s->oformat->write_trailer(s);
3355 ret=url_ferror(s->pb);
3356 for(i=0;i<s->nb_streams;i++) {
3357 av_freep(&s->streams[i]->priv_data);
3358 av_freep(&s->streams[i]->index_entries);
3360 if (s->iformat && s->iformat->priv_class)
3361 av_opt_free(s->priv_data);
3362 av_freep(&s->priv_data);
3366 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
3367 int64_t *dts, int64_t *wall)
3369 if (!s->oformat || !s->oformat->get_output_timestamp)
3370 return AVERROR(ENOSYS);
3371 s->oformat->get_output_timestamp(s, stream, dts, wall);
3375 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3378 AVProgram *program=NULL;
3381 if (idx >= ac->nb_streams) {
3382 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3386 for(i=0; i<ac->nb_programs; i++){
3387 if(ac->programs[i]->id != progid)
3389 program = ac->programs[i];
3390 for(j=0; j<program->nb_stream_indexes; j++)
3391 if(program->stream_index[j] == idx)
3394 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3397 program->stream_index = tmp;
3398 program->stream_index[program->nb_stream_indexes++] = idx;
3403 static void print_fps(double d, const char *postfix){
3404 uint64_t v= lrintf(d*100);
3405 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3406 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3407 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3410 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3412 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3413 AVDictionaryEntry *tag=NULL;
3415 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3416 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3417 if(strcmp("language", tag->key)){
3420 av_strlcpy(tmp, tag->value, sizeof(tmp));
3421 for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
3422 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tmp);
3428 /* "user interface" functions */
3429 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3432 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3433 AVStream *st = ic->streams[i];
3434 int g = av_gcd(st->time_base.num, st->time_base.den);
3435 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3436 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3437 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3438 /* the pid is an important information, so we display it */
3439 /* XXX: add a generic system */
3440 if (flags & AVFMT_SHOW_IDS)
3441 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3443 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3444 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3445 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3446 if (st->sample_aspect_ratio.num && // default
3447 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3448 AVRational display_aspect_ratio;
3449 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3450 st->codec->width*st->sample_aspect_ratio.num,
3451 st->codec->height*st->sample_aspect_ratio.den,
3453 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3454 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3455 display_aspect_ratio.num, display_aspect_ratio.den);
3457 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3458 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3459 print_fps(av_q2d(st->avg_frame_rate), "fps");
3460 if(st->r_frame_rate.den && st->r_frame_rate.num)
3461 print_fps(av_q2d(st->r_frame_rate), "tbr");
3462 if(st->time_base.den && st->time_base.num)
3463 print_fps(1/av_q2d(st->time_base), "tbn");
3464 if(st->codec->time_base.den && st->codec->time_base.num)
3465 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3467 if (st->disposition & AV_DISPOSITION_DEFAULT)
3468 av_log(NULL, AV_LOG_INFO, " (default)");
3469 if (st->disposition & AV_DISPOSITION_DUB)
3470 av_log(NULL, AV_LOG_INFO, " (dub)");
3471 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3472 av_log(NULL, AV_LOG_INFO, " (original)");
3473 if (st->disposition & AV_DISPOSITION_COMMENT)
3474 av_log(NULL, AV_LOG_INFO, " (comment)");
3475 if (st->disposition & AV_DISPOSITION_LYRICS)
3476 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3477 if (st->disposition & AV_DISPOSITION_KARAOKE)
3478 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3479 if (st->disposition & AV_DISPOSITION_FORCED)
3480 av_log(NULL, AV_LOG_INFO, " (forced)");
3481 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3482 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3483 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3484 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3485 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3486 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3487 av_log(NULL, AV_LOG_INFO, "\n");
3488 dump_metadata(NULL, st->metadata, " ");
3491 #if FF_API_DUMP_FORMAT
3492 void dump_format(AVFormatContext *ic,
3497 av_dump_format(ic, index, url, is_output);
3501 void av_dump_format(AVFormatContext *ic,
3507 uint8_t *printed = av_mallocz(ic->nb_streams);
3508 if (ic->nb_streams && !printed)
3511 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3512 is_output ? "Output" : "Input",
3514 is_output ? ic->oformat->name : ic->iformat->name,
3515 is_output ? "to" : "from", url);
3516 dump_metadata(NULL, ic->metadata, " ");
3518 av_log(NULL, AV_LOG_INFO, " Duration: ");
3519 if (ic->duration != AV_NOPTS_VALUE) {
3520 int hours, mins, secs, us;
3521 secs = ic->duration / AV_TIME_BASE;
3522 us = ic->duration % AV_TIME_BASE;
3527 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3528 (100 * us) / AV_TIME_BASE);
3530 av_log(NULL, AV_LOG_INFO, "N/A");
3532 if (ic->start_time != AV_NOPTS_VALUE) {
3534 av_log(NULL, AV_LOG_INFO, ", start: ");
3535 secs = ic->start_time / AV_TIME_BASE;
3536 us = abs(ic->start_time % AV_TIME_BASE);
3537 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3538 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3540 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3542 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3544 av_log(NULL, AV_LOG_INFO, "N/A");
3546 av_log(NULL, AV_LOG_INFO, "\n");
3548 for (i = 0; i < ic->nb_chapters; i++) {
3549 AVChapter *ch = ic->chapters[i];
3550 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3551 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3552 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3554 dump_metadata(NULL, ch->metadata, " ");
3556 if(ic->nb_programs) {
3557 int j, k, total = 0;
3558 for(j=0; j<ic->nb_programs; j++) {
3559 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3561 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3562 name ? name->value : "");
3563 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3564 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3565 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3566 printed[ic->programs[j]->stream_index[k]] = 1;
3568 total += ic->programs[j]->nb_stream_indexes;
3570 if (total < ic->nb_streams)
3571 av_log(NULL, AV_LOG_INFO, " No Program\n");
3573 for(i=0;i<ic->nb_streams;i++)
3575 dump_stream_format(ic, i, index, is_output);
3580 int64_t av_gettime(void)
3583 gettimeofday(&tv,NULL);
3584 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3587 uint64_t ff_ntp_time(void)
3589 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3592 #if FF_API_PARSE_DATE
3593 #include "libavutil/parseutils.h"
3595 int64_t parse_date(const char *timestr, int duration)
3598 av_parse_time(&timeval, timestr, duration);
3603 #if FF_API_FIND_INFO_TAG
3604 #include "libavutil/parseutils.h"
3606 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3608 return av_find_info_tag(arg, arg_size, tag1, info);
3612 int av_get_frame_filename(char *buf, int buf_size,
3613 const char *path, int number)
3616 char *q, buf1[20], c;
3617 int nd, len, percentd_found;
3629 while (isdigit(*p)) {
3630 nd = nd * 10 + *p++ - '0';
3633 } while (isdigit(c));
3642 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3644 if ((q - buf + len) > buf_size - 1)
3646 memcpy(q, buf1, len);
3654 if ((q - buf) < buf_size - 1)
3658 if (!percentd_found)
3667 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3671 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3673 for(i=0;i<size;i+=16) {
3680 PRINT(" %02x", buf[i+j]);
3685 for(j=0;j<len;j++) {
3687 if (c < ' ' || c > '~')
3696 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3698 hex_dump_internal(NULL, f, 0, buf, size);
3701 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3703 hex_dump_internal(avcl, NULL, level, buf, size);
3706 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3709 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3710 PRINT("stream #%d:\n", pkt->stream_index);
3711 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3712 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3713 /* DTS is _always_ valid after av_read_frame() */
3715 if (pkt->dts == AV_NOPTS_VALUE)
3718 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3719 /* PTS may not be known if B-frames are present. */
3721 if (pkt->pts == AV_NOPTS_VALUE)
3724 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3726 PRINT(" size=%d\n", pkt->size);
3729 av_hex_dump(f, pkt->data, pkt->size);
3733 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3735 AVRational tb = { 1, AV_TIME_BASE };
3736 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3740 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3742 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3746 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3748 AVRational tb = { 1, AV_TIME_BASE };
3749 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3753 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3756 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3759 void av_url_split(char *proto, int proto_size,
3760 char *authorization, int authorization_size,
3761 char *hostname, int hostname_size,
3763 char *path, int path_size,
3766 const char *p, *ls, *at, *col, *brk;
3768 if (port_ptr) *port_ptr = -1;
3769 if (proto_size > 0) proto[0] = 0;
3770 if (authorization_size > 0) authorization[0] = 0;
3771 if (hostname_size > 0) hostname[0] = 0;
3772 if (path_size > 0) path[0] = 0;
3774 /* parse protocol */
3775 if ((p = strchr(url, ':'))) {
3776 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3781 /* no protocol means plain filename */
3782 av_strlcpy(path, url, path_size);
3786 /* separate path from hostname */
3787 ls = strchr(p, '/');
3789 ls = strchr(p, '?');
3791 av_strlcpy(path, ls, path_size);
3793 ls = &p[strlen(p)]; // XXX
3795 /* the rest is hostname, use that to parse auth/port */
3797 /* authorization (user[:pass]@hostname) */
3798 if ((at = strchr(p, '@')) && at < ls) {
3799 av_strlcpy(authorization, p,
3800 FFMIN(authorization_size, at + 1 - p));
3801 p = at + 1; /* skip '@' */
3804 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3806 av_strlcpy(hostname, p + 1,
3807 FFMIN(hostname_size, brk - p));
3808 if (brk[1] == ':' && port_ptr)
3809 *port_ptr = atoi(brk + 2);
3810 } else if ((col = strchr(p, ':')) && col < ls) {
3811 av_strlcpy(hostname, p,
3812 FFMIN(col + 1 - p, hostname_size));
3813 if (port_ptr) *port_ptr = atoi(col + 1);
3815 av_strlcpy(hostname, p,
3816 FFMIN(ls + 1 - p, hostname_size));
3820 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3823 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3826 'C', 'D', 'E', 'F' };
3827 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3830 'c', 'd', 'e', 'f' };
3831 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3833 for(i = 0; i < s; i++) {
3834 buff[i * 2] = hex_table[src[i] >> 4];
3835 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3841 int ff_hex_to_data(uint8_t *data, const char *p)
3848 p += strspn(p, SPACE_CHARS);
3851 c = toupper((unsigned char) *p++);
3852 if (c >= '0' && c <= '9')
3854 else if (c >= 'A' && c <= 'F')
3869 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3870 unsigned int pts_num, unsigned int pts_den)
3873 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3874 if(new_tb.num != pts_num)
3875 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3877 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3879 if(new_tb.num <= 0 || new_tb.den <= 0) {
3880 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3883 s->time_base = new_tb;
3884 s->pts_wrap_bits = pts_wrap_bits;
3887 int ff_url_join(char *str, int size, const char *proto,
3888 const char *authorization, const char *hostname,
3889 int port, const char *fmt, ...)
3892 struct addrinfo hints, *ai;
3897 av_strlcatf(str, size, "%s://", proto);
3898 if (authorization && authorization[0])
3899 av_strlcatf(str, size, "%s@", authorization);
3900 #if CONFIG_NETWORK && defined(AF_INET6)
3901 /* Determine if hostname is a numerical IPv6 address,
3902 * properly escape it within [] in that case. */
3903 memset(&hints, 0, sizeof(hints));
3904 hints.ai_flags = AI_NUMERICHOST;
3905 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3906 if (ai->ai_family == AF_INET6) {
3907 av_strlcat(str, "[", size);
3908 av_strlcat(str, hostname, size);
3909 av_strlcat(str, "]", size);
3911 av_strlcat(str, hostname, size);
3916 /* Not an IPv6 address, just output the plain string. */
3917 av_strlcat(str, hostname, size);
3920 av_strlcatf(str, size, ":%d", port);
3923 int len = strlen(str);
3926 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3932 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3933 AVFormatContext *src)
3938 local_pkt.stream_index = dst_stream;
3939 if (pkt->pts != AV_NOPTS_VALUE)
3940 local_pkt.pts = av_rescale_q(pkt->pts,
3941 src->streams[pkt->stream_index]->time_base,
3942 dst->streams[dst_stream]->time_base);
3943 if (pkt->dts != AV_NOPTS_VALUE)
3944 local_pkt.dts = av_rescale_q(pkt->dts,
3945 src->streams[pkt->stream_index]->time_base,
3946 dst->streams[dst_stream]->time_base);
3947 return av_write_frame(dst, &local_pkt);
3950 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3953 const char *ptr = str;
3955 /* Parse key=value pairs. */
3958 char *dest = NULL, *dest_end;
3959 int key_len, dest_len = 0;
3961 /* Skip whitespace and potential commas. */
3962 while (*ptr && (isspace(*ptr) || *ptr == ','))
3969 if (!(ptr = strchr(key, '=')))
3972 key_len = ptr - key;
3974 callback_get_buf(context, key, key_len, &dest, &dest_len);
3975 dest_end = dest + dest_len - 1;
3979 while (*ptr && *ptr != '\"') {
3983 if (dest && dest < dest_end)
3987 if (dest && dest < dest_end)
3995 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3996 if (dest && dest < dest_end)
4004 int ff_find_stream_index(AVFormatContext *s, int id)
4007 for (i = 0; i < s->nb_streams; i++) {
4008 if (s->streams[i]->id == id)
4014 void ff_make_absolute_url(char *buf, int size, const char *base,
4018 /* Absolute path, relative to the current server */
4019 if (base && strstr(base, "://") && rel[0] == '/') {
4021 av_strlcpy(buf, base, size);
4022 sep = strstr(buf, "://");
4025 sep = strchr(sep, '/');
4029 av_strlcat(buf, rel, size);
4032 /* If rel actually is an absolute url, just copy it */
4033 if (!base || strstr(rel, "://") || rel[0] == '/') {
4034 av_strlcpy(buf, rel, size);
4038 av_strlcpy(buf, base, size);
4039 /* Remove the file name from the base url */
4040 sep = strrchr(buf, '/');
4045 while (av_strstart(rel, "../", NULL) && sep) {
4046 /* Remove the path delimiter at the end */
4048 sep = strrchr(buf, '/');
4049 /* If the next directory name to pop off is "..", break here */
4050 if (!strcmp(sep ? &sep[1] : buf, "..")) {
4051 /* Readd the slash we just removed */
4052 av_strlcat(buf, "/", size);
4055 /* Cut off the directory name */
4062 av_strlcat(buf, rel, size);
4065 int64_t ff_iso8601_to_unix_time(const char *datestr)
4068 struct tm time = {0};
4069 strptime(datestr, "%Y - %m - %dT%T", &time);
4070 return mktime(&time);
4072 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
4073 "the date string.\n");
4078 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
4081 if (ofmt->query_codec)
4082 return ofmt->query_codec(codec_id, std_compliance);
4083 else if (ofmt->codec_tag)
4084 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4085 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4086 codec_id == ofmt->subtitle_codec)
4089 return AVERROR_PATCHWELCOME;