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;
531 if (probe_size < offset) {
535 /* read probe data */
536 buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
537 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
538 /* fail if error was not end of file, otherwise, lower score */
539 if (ret != AVERROR_EOF) {
544 ret = 0; /* error was end of file, nothing read */
547 pd.buf = &buf[offset];
549 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
551 /* guess file format */
552 *fmt = av_probe_input_format2(&pd, 1, &score);
554 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
555 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
557 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
563 return AVERROR_INVALIDDATA;
566 /* rewind. reuse probe buffer to avoid seeking */
567 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
573 #if FF_API_FORMAT_PARAMETERS
574 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
577 AVFormatParameters *ap)
580 AVDictionary *opts = convert_format_parameters(ap);
582 if (!ap || !ap->prealloced_context)
585 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
592 /* open input file and probe the format if necessary */
593 static int init_input(AVFormatContext *s, const char *filename)
596 AVProbeData pd = {filename, NULL, 0};
599 s->flags |= AVFMT_FLAG_CUSTOM_IO;
601 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
602 else if (s->iformat->flags & AVFMT_NOFILE)
603 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
604 "will be ignored with AVFMT_NOFILE format.\n");
608 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
609 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
612 if ((ret = avio_open(&s->pb, filename, AVIO_FLAG_READ)) < 0)
616 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
619 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
621 AVFormatContext *s = *ps;
623 AVFormatParameters ap = { { 0 } };
624 AVDictionary *tmp = NULL;
626 if (!s && !(s = avformat_alloc_context()))
627 return AVERROR(ENOMEM);
632 av_dict_copy(&tmp, *options, 0);
634 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
637 if ((ret = init_input(s, filename)) < 0)
640 /* check filename in case an image number is expected */
641 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
642 if (!av_filename_number_test(filename)) {
643 ret = AVERROR(EINVAL);
648 s->duration = s->start_time = AV_NOPTS_VALUE;
649 av_strlcpy(s->filename, filename, sizeof(s->filename));
651 /* allocate private data */
652 if (s->iformat->priv_data_size > 0) {
653 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
654 ret = AVERROR(ENOMEM);
657 if (s->iformat->priv_class) {
658 *(const AVClass**)s->priv_data = s->iformat->priv_class;
659 av_opt_set_defaults(s->priv_data);
660 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
665 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
667 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
669 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
670 if ((ret = s->iformat->read_header(s, &ap)) < 0)
673 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
674 s->data_offset = avio_tell(s->pb);
676 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
679 av_dict_free(options);
687 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
689 avformat_free_context(s);
694 /*******************************************************/
696 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
697 AVPacketList **plast_pktl){
698 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
703 (*plast_pktl)->next = pktl;
705 *packet_buffer = pktl;
707 /* add the packet in the buffered packet list */
713 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
719 AVPacketList *pktl = s->raw_packet_buffer;
723 if(s->streams[pkt->stream_index]->request_probe <= 0){
724 s->raw_packet_buffer = pktl->next;
725 s->raw_packet_buffer_remaining_size += pkt->size;
732 ret= s->iformat->read_packet(s, pkt);
734 if (!pktl || ret == AVERROR(EAGAIN))
736 for (i = 0; i < s->nb_streams; i++)
737 if(s->streams[i]->request_probe > 0)
738 s->streams[i]->request_probe = -1;
742 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
743 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
744 av_log(s, AV_LOG_WARNING,
745 "Dropped corrupted packet (stream = %d)\n",
750 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
751 av_packet_merge_side_data(pkt);
753 st= s->streams[pkt->stream_index];
755 switch(st->codec->codec_type){
756 case AVMEDIA_TYPE_VIDEO:
757 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
759 case AVMEDIA_TYPE_AUDIO:
760 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
762 case AVMEDIA_TYPE_SUBTITLE:
763 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
767 if(!pktl && st->request_probe <= 0)
770 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
771 s->raw_packet_buffer_remaining_size -= pkt->size;
773 if(st->request_probe>0){
774 AVProbeData *pd = &st->probe_data;
776 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
779 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
780 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
781 pd->buf_size += pkt->size;
782 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
784 end= s->raw_packet_buffer_remaining_size <= 0
785 || st->probe_packets<=0;
787 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
788 int score= set_codec_from_probe_data(s, st, pd);
789 if( (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
793 st->request_probe= -1;
794 if(st->codec->codec_id != CODEC_ID_NONE){
795 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
797 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
804 /**********************************************************/
807 * Get the number of samples of an audio frame. Return -1 on error.
809 static int get_audio_frame_size(AVCodecContext *enc, int size)
813 if(enc->codec_id == CODEC_ID_VORBIS)
816 if (enc->frame_size <= 1) {
817 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
819 if (bits_per_sample) {
820 if (enc->channels == 0)
822 frame_size = (size << 3) / (bits_per_sample * enc->channels);
824 /* used for example by ADPCM codecs */
825 if (enc->bit_rate == 0)
827 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
830 frame_size = enc->frame_size;
837 * Return the frame duration in seconds. Return 0 if not available.
839 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
840 AVCodecParserContext *pc, AVPacket *pkt)
846 switch(st->codec->codec_type) {
847 case AVMEDIA_TYPE_VIDEO:
848 if(st->time_base.num*1000LL > st->time_base.den){
849 *pnum = st->time_base.num;
850 *pden = st->time_base.den;
851 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
852 *pnum = st->codec->time_base.num;
853 *pden = st->codec->time_base.den;
854 if (pc && pc->repeat_pict) {
855 *pnum = (*pnum) * (1 + pc->repeat_pict);
857 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
858 //Thus if we have no parser in such case leave duration undefined.
859 if(st->codec->ticks_per_frame>1 && !pc){
864 case AVMEDIA_TYPE_AUDIO:
865 frame_size = get_audio_frame_size(st->codec, pkt->size);
866 if (frame_size <= 0 || st->codec->sample_rate <= 0)
869 *pden = st->codec->sample_rate;
876 static int is_intra_only(AVCodecContext *enc){
877 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
879 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
880 switch(enc->codec_id){
882 case CODEC_ID_MJPEGB:
884 case CODEC_ID_RAWVIDEO:
885 case CODEC_ID_DVVIDEO:
886 case CODEC_ID_HUFFYUV:
887 case CODEC_ID_FFVHUFF:
892 case CODEC_ID_JPEG2000:
900 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
901 int64_t dts, int64_t pts)
903 AVStream *st= s->streams[stream_index];
904 AVPacketList *pktl= s->packet_buffer;
906 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
909 st->first_dts= dts - st->cur_dts;
912 for(; pktl; pktl= pktl->next){
913 if(pktl->pkt.stream_index != stream_index)
915 //FIXME think more about this check
916 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
917 pktl->pkt.pts += st->first_dts;
919 if(pktl->pkt.dts != AV_NOPTS_VALUE)
920 pktl->pkt.dts += st->first_dts;
922 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
923 st->start_time= pktl->pkt.pts;
925 if (st->start_time == AV_NOPTS_VALUE)
926 st->start_time = pts;
929 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
931 AVPacketList *pktl= s->packet_buffer;
934 if(st->first_dts != AV_NOPTS_VALUE){
935 cur_dts= st->first_dts;
936 for(; pktl; pktl= pktl->next){
937 if(pktl->pkt.stream_index == pkt->stream_index){
938 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
940 cur_dts -= pkt->duration;
943 pktl= s->packet_buffer;
944 st->first_dts = cur_dts;
945 }else if(st->cur_dts)
948 for(; pktl; pktl= pktl->next){
949 if(pktl->pkt.stream_index != pkt->stream_index)
951 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
952 && !pktl->pkt.duration){
953 pktl->pkt.dts= cur_dts;
954 if(!st->codec->has_b_frames)
955 pktl->pkt.pts= cur_dts;
956 cur_dts += pkt->duration;
957 pktl->pkt.duration= pkt->duration;
961 if(st->first_dts == AV_NOPTS_VALUE)
962 st->cur_dts= cur_dts;
965 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
966 AVCodecParserContext *pc, AVPacket *pkt)
968 int num, den, presentation_delayed, delay, i;
971 if (s->flags & AVFMT_FLAG_NOFILLIN)
974 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
975 pkt->dts= AV_NOPTS_VALUE;
977 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
978 //FIXME Set low_delay = 0 when has_b_frames = 1
979 st->codec->has_b_frames = 1;
981 /* do we have a video B-frame ? */
982 delay= st->codec->has_b_frames;
983 presentation_delayed = 0;
985 // ignore delay caused by frame threading so that the mpeg2-without-dts
986 // warning will not trigger
987 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
988 delay -= st->codec->thread_count-1;
990 /* XXX: need has_b_frame, but cannot get it if the codec is
993 pc && pc->pict_type != AV_PICTURE_TYPE_B)
994 presentation_delayed = 1;
996 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
997 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
998 pkt->dts -= 1LL<<st->pts_wrap_bits;
1001 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
1002 // we take the conservative approach and discard both
1003 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
1004 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
1005 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
1006 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
1009 if (pkt->duration == 0) {
1010 compute_frame_duration(&num, &den, st, pc, pkt);
1012 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1014 if(pkt->duration != 0 && s->packet_buffer)
1015 update_initial_durations(s, st, pkt);
1019 /* correct timestamps with byte offset if demuxers only have timestamps
1020 on packet boundaries */
1021 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1022 /* this will estimate bitrate based on this frame's duration and size */
1023 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1024 if(pkt->pts != AV_NOPTS_VALUE)
1026 if(pkt->dts != AV_NOPTS_VALUE)
1030 if (pc && pc->dts_sync_point >= 0) {
1031 // we have synchronization info from the parser
1032 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1034 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1035 if (pkt->dts != AV_NOPTS_VALUE) {
1036 // got DTS from the stream, update reference timestamp
1037 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1038 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1039 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1040 // compute DTS based on reference timestamp
1041 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1042 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1044 if (pc->dts_sync_point > 0)
1045 st->reference_dts = pkt->dts; // new reference
1049 /* This may be redundant, but it should not hurt. */
1050 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1051 presentation_delayed = 1;
1053 // 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);
1054 /* interpolate PTS and DTS if they are not present */
1055 //We skip H264 currently because delay and has_b_frames are not reliably set
1056 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1057 if (presentation_delayed) {
1058 /* DTS = decompression timestamp */
1059 /* PTS = presentation timestamp */
1060 if (pkt->dts == AV_NOPTS_VALUE)
1061 pkt->dts = st->last_IP_pts;
1062 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1063 if (pkt->dts == AV_NOPTS_VALUE)
1064 pkt->dts = st->cur_dts;
1066 /* this is tricky: the dts must be incremented by the duration
1067 of the frame we are displaying, i.e. the last I- or P-frame */
1068 if (st->last_IP_duration == 0)
1069 st->last_IP_duration = pkt->duration;
1070 if(pkt->dts != AV_NOPTS_VALUE)
1071 st->cur_dts = pkt->dts + st->last_IP_duration;
1072 st->last_IP_duration = pkt->duration;
1073 st->last_IP_pts= pkt->pts;
1074 /* cannot compute PTS if not present (we can compute it only
1075 by knowing the future */
1076 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1077 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1078 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1079 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1080 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1081 pkt->pts += pkt->duration;
1082 // 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);
1086 /* presentation is not delayed : PTS and DTS are the same */
1087 if(pkt->pts == AV_NOPTS_VALUE)
1088 pkt->pts = pkt->dts;
1089 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1090 if(pkt->pts == AV_NOPTS_VALUE)
1091 pkt->pts = st->cur_dts;
1092 pkt->dts = pkt->pts;
1093 if(pkt->pts != AV_NOPTS_VALUE)
1094 st->cur_dts = pkt->pts + pkt->duration;
1098 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1099 st->pts_buffer[0]= pkt->pts;
1100 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1101 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1102 if(pkt->dts == AV_NOPTS_VALUE)
1103 pkt->dts= st->pts_buffer[0];
1104 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1105 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1107 if(pkt->dts > st->cur_dts)
1108 st->cur_dts = pkt->dts;
1111 // 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);
1114 if(is_intra_only(st->codec))
1115 pkt->flags |= AV_PKT_FLAG_KEY;
1118 /* keyframe computation */
1119 if (pc->key_frame == 1)
1120 pkt->flags |= AV_PKT_FLAG_KEY;
1121 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1122 pkt->flags |= AV_PKT_FLAG_KEY;
1125 pkt->convergence_duration = pc->convergence_duration;
1129 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1134 av_init_packet(pkt);
1137 /* select current input stream component */
1140 if (!st->need_parsing || !st->parser) {
1141 /* no parsing needed: we just output the packet as is */
1142 /* raw data support */
1143 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
1144 compute_pkt_fields(s, st, NULL, pkt);
1146 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1147 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1148 ff_reduce_index(s, st->index);
1149 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1152 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1153 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1154 st->cur_ptr, st->cur_len,
1155 st->cur_pkt.pts, st->cur_pkt.dts,
1157 st->cur_pkt.pts = AV_NOPTS_VALUE;
1158 st->cur_pkt.dts = AV_NOPTS_VALUE;
1159 /* increment read pointer */
1163 /* return packet if any */
1167 pkt->stream_index = st->index;
1168 pkt->pts = st->parser->pts;
1169 pkt->dts = st->parser->dts;
1170 pkt->pos = st->parser->pos;
1171 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1173 pkt->destruct= st->cur_pkt.destruct;
1174 st->cur_pkt.destruct= NULL;
1175 st->cur_pkt.data = NULL;
1176 assert(st->cur_len == 0);
1178 pkt->destruct = NULL;
1180 compute_pkt_fields(s, st, st->parser, pkt);
1182 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1183 int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
1184 ff_reduce_index(s, st->index);
1185 av_add_index_entry(st, pos, pkt->dts,
1186 0, 0, AVINDEX_KEYFRAME);
1193 av_free_packet(&st->cur_pkt);
1198 /* read next packet */
1199 ret = av_read_packet(s, &cur_pkt);
1201 if (ret == AVERROR(EAGAIN))
1203 /* return the last frames, if any */
1204 for(i = 0; i < s->nb_streams; i++) {
1206 if (st->parser && st->need_parsing) {
1207 av_parser_parse2(st->parser, st->codec,
1208 &pkt->data, &pkt->size,
1210 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1216 /* no more packets: really terminate parsing */
1219 st = s->streams[cur_pkt.stream_index];
1220 st->cur_pkt= cur_pkt;
1222 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1223 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1224 st->cur_pkt.pts < st->cur_pkt.dts){
1225 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1226 st->cur_pkt.stream_index,
1230 // av_free_packet(&st->cur_pkt);
1234 if(s->debug & FF_FDEBUG_TS)
1235 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1236 st->cur_pkt.stream_index,
1240 st->cur_pkt.duration,
1244 st->cur_ptr = st->cur_pkt.data;
1245 st->cur_len = st->cur_pkt.size;
1246 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1247 st->parser = av_parser_init(st->codec->codec_id);
1249 av_log(s, AV_LOG_WARNING, "parser not found for codec "
1250 "%s, packets or times may be invalid.\n",
1251 avcodec_get_name(st->codec->codec_id));
1252 /* no parser available: just output the raw packets */
1253 st->need_parsing = AVSTREAM_PARSE_NONE;
1254 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1255 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1256 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1257 st->parser->flags |= PARSER_FLAG_ONCE;
1262 if(s->debug & FF_FDEBUG_TS)
1263 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1274 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1278 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1281 pktl = s->packet_buffer;
1283 AVPacket *next_pkt= &pktl->pkt;
1285 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1286 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1287 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1288 if( pktl->pkt.stream_index == next_pkt->stream_index
1289 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1290 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1291 next_pkt->pts= pktl->pkt.dts;
1295 pktl = s->packet_buffer;
1298 if( next_pkt->pts != AV_NOPTS_VALUE
1299 || next_pkt->dts == AV_NOPTS_VALUE
1301 /* read packet from packet buffer, if there is data */
1303 s->packet_buffer = pktl->next;
1309 int ret= read_frame_internal(s, pkt);
1311 if(pktl && ret != AVERROR(EAGAIN)){
1318 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1319 &s->packet_buffer_end)) < 0)
1320 return AVERROR(ENOMEM);
1322 assert(!s->packet_buffer);
1323 return read_frame_internal(s, pkt);
1328 /* XXX: suppress the packet queue */
1329 static void flush_packet_queue(AVFormatContext *s)
1334 pktl = s->packet_buffer;
1337 s->packet_buffer = pktl->next;
1338 av_free_packet(&pktl->pkt);
1341 while(s->raw_packet_buffer){
1342 pktl = s->raw_packet_buffer;
1343 s->raw_packet_buffer = pktl->next;
1344 av_free_packet(&pktl->pkt);
1347 s->packet_buffer_end=
1348 s->raw_packet_buffer_end= NULL;
1349 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1352 /*******************************************************/
1355 int av_find_default_stream_index(AVFormatContext *s)
1357 int first_audio_index = -1;
1361 if (s->nb_streams <= 0)
1363 for(i = 0; i < s->nb_streams; i++) {
1365 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1368 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1369 first_audio_index = i;
1371 return first_audio_index >= 0 ? first_audio_index : 0;
1375 * Flush the frame reader.
1377 void ff_read_frame_flush(AVFormatContext *s)
1382 flush_packet_queue(s);
1386 /* for each stream, reset read state */
1387 for(i = 0; i < s->nb_streams; i++) {
1391 av_parser_close(st->parser);
1393 av_free_packet(&st->cur_pkt);
1395 st->last_IP_pts = AV_NOPTS_VALUE;
1396 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1397 st->reference_dts = AV_NOPTS_VALUE;
1402 st->probe_packets = MAX_PROBE_PACKETS;
1404 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1405 st->pts_buffer[j]= AV_NOPTS_VALUE;
1409 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1412 for(i = 0; i < s->nb_streams; i++) {
1413 AVStream *st = s->streams[i];
1415 st->cur_dts = av_rescale(timestamp,
1416 st->time_base.den * (int64_t)ref_st->time_base.num,
1417 st->time_base.num * (int64_t)ref_st->time_base.den);
1421 void ff_reduce_index(AVFormatContext *s, int stream_index)
1423 AVStream *st= s->streams[stream_index];
1424 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1426 if((unsigned)st->nb_index_entries >= max_entries){
1428 for(i=0; 2*i<st->nb_index_entries; i++)
1429 st->index_entries[i]= st->index_entries[2*i];
1430 st->nb_index_entries= i;
1434 int ff_add_index_entry(AVIndexEntry **index_entries,
1435 int *nb_index_entries,
1436 unsigned int *index_entries_allocated_size,
1437 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1439 AVIndexEntry *entries, *ie;
1442 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1445 entries = av_fast_realloc(*index_entries,
1446 index_entries_allocated_size,
1447 (*nb_index_entries + 1) *
1448 sizeof(AVIndexEntry));
1452 *index_entries= entries;
1454 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1457 index= (*nb_index_entries)++;
1458 ie= &entries[index];
1459 assert(index==0 || ie[-1].timestamp < timestamp);
1461 ie= &entries[index];
1462 if(ie->timestamp != timestamp){
1463 if(ie->timestamp <= timestamp)
1465 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1466 (*nb_index_entries)++;
1467 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1468 distance= ie->min_distance;
1472 ie->timestamp = timestamp;
1473 ie->min_distance= distance;
1480 int av_add_index_entry(AVStream *st,
1481 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1483 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1484 &st->index_entries_allocated_size, pos,
1485 timestamp, size, distance, flags);
1488 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1489 int64_t wanted_timestamp, int flags)
1497 //optimize appending index entries at the end
1498 if(b && entries[b-1].timestamp < wanted_timestamp)
1503 timestamp = entries[m].timestamp;
1504 if(timestamp >= wanted_timestamp)
1506 if(timestamp <= wanted_timestamp)
1509 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1511 if(!(flags & AVSEEK_FLAG_ANY)){
1512 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1513 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1522 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1525 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1526 wanted_timestamp, flags);
1529 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1530 AVInputFormat *avif= s->iformat;
1531 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1532 int64_t ts_min, ts_max, ts;
1537 if (stream_index < 0)
1540 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1543 ts_min= AV_NOPTS_VALUE;
1544 pos_limit= -1; //gcc falsely says it may be uninitialized
1546 st= s->streams[stream_index];
1547 if(st->index_entries){
1550 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()
1551 index= FFMAX(index, 0);
1552 e= &st->index_entries[index];
1554 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1556 ts_min= e->timestamp;
1557 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1563 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1564 assert(index < st->nb_index_entries);
1566 e= &st->index_entries[index];
1567 assert(e->timestamp >= target_ts);
1569 ts_max= e->timestamp;
1570 pos_limit= pos_max - e->min_distance;
1571 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1572 pos_max,pos_limit, ts_max);
1576 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1581 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1584 av_update_cur_dts(s, st, ts);
1589 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 )){
1591 int64_t start_pos, filesize;
1594 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1596 if(ts_min == AV_NOPTS_VALUE){
1597 pos_min = s->data_offset;
1598 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1599 if (ts_min == AV_NOPTS_VALUE)
1603 if(ts_max == AV_NOPTS_VALUE){
1605 filesize = avio_size(s->pb);
1606 pos_max = filesize - 1;
1609 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1611 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1612 if (ts_max == AV_NOPTS_VALUE)
1616 int64_t tmp_pos= pos_max + 1;
1617 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1618 if(tmp_ts == AV_NOPTS_VALUE)
1622 if(tmp_pos >= filesize)
1628 if(ts_min > ts_max){
1630 }else if(ts_min == ts_max){
1635 while (pos_min < pos_limit) {
1636 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1637 pos_min, pos_max, ts_min, ts_max);
1638 assert(pos_limit <= pos_max);
1641 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1642 // interpolate position (better than dichotomy)
1643 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1644 + pos_min - approximate_keyframe_distance;
1645 }else if(no_change==1){
1646 // bisection, if interpolation failed to change min or max pos last time
1647 pos = (pos_min + pos_limit)>>1;
1649 /* linear search if bisection failed, can only happen if there
1650 are very few or no keyframes between min/max */
1655 else if(pos > pos_limit)
1659 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1664 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1665 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1666 pos_limit, start_pos, no_change);
1667 if(ts == AV_NOPTS_VALUE){
1668 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1671 assert(ts != AV_NOPTS_VALUE);
1672 if (target_ts <= ts) {
1673 pos_limit = start_pos - 1;
1677 if (target_ts >= ts) {
1683 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1684 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1686 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1688 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1689 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1690 pos, ts_min, target_ts, ts_max);
1695 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1696 int64_t pos_min, pos_max;
1700 if (stream_index < 0)
1703 st= s->streams[stream_index];
1706 pos_min = s->data_offset;
1707 pos_max = avio_size(s->pb) - 1;
1709 if (pos < pos_min) pos= pos_min;
1710 else if(pos > pos_max) pos= pos_max;
1712 avio_seek(s->pb, pos, SEEK_SET);
1715 av_update_cur_dts(s, st, ts);
1720 static int seek_frame_generic(AVFormatContext *s,
1721 int stream_index, int64_t timestamp, int flags)
1728 st = s->streams[stream_index];
1730 index = av_index_search_timestamp(st, timestamp, flags);
1732 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1735 if(index < 0 || index==st->nb_index_entries-1){
1739 if(st->nb_index_entries){
1740 assert(st->index_entries);
1741 ie= &st->index_entries[st->nb_index_entries-1];
1742 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1744 av_update_cur_dts(s, st, ie->timestamp);
1746 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1752 ret = av_read_frame(s, &pkt);
1753 }while(ret == AVERROR(EAGAIN));
1756 av_free_packet(&pkt);
1757 if(stream_index == pkt.stream_index){
1758 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1762 index = av_index_search_timestamp(st, timestamp, flags);
1767 ff_read_frame_flush(s);
1768 if (s->iformat->read_seek){
1769 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1772 ie = &st->index_entries[index];
1773 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1775 av_update_cur_dts(s, st, ie->timestamp);
1780 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1785 ff_read_frame_flush(s);
1787 if(flags & AVSEEK_FLAG_BYTE)
1788 return seek_frame_byte(s, stream_index, timestamp, flags);
1790 if(stream_index < 0){
1791 stream_index= av_find_default_stream_index(s);
1792 if(stream_index < 0)
1795 st= s->streams[stream_index];
1796 /* timestamp for default must be expressed in AV_TIME_BASE units */
1797 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1800 /* first, we try the format specific seek */
1801 if (s->iformat->read_seek)
1802 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1809 if(s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH))
1810 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1811 else if (!(s->iformat->flags & AVFMT_NOGENSEARCH))
1812 return seek_frame_generic(s, stream_index, timestamp, flags);
1817 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1819 if(min_ts > ts || max_ts < ts)
1822 ff_read_frame_flush(s);
1824 if (s->iformat->read_seek2)
1825 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1827 if(s->iformat->read_timestamp){
1828 //try to seek via read_timestamp()
1831 //Fallback to old API if new is not implemented but old is
1832 //Note the old has somewat different sematics
1833 if(s->iformat->read_seek || 1)
1834 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1836 // try some generic seek like seek_frame_generic() but with new ts semantics
1839 /*******************************************************/
1842 * Return TRUE if the stream has accurate duration in any stream.
1844 * @return TRUE if the stream has accurate duration for at least one component.
1846 static int has_duration(AVFormatContext *ic)
1851 for(i = 0;i < ic->nb_streams; i++) {
1852 st = ic->streams[i];
1853 if (st->duration != AV_NOPTS_VALUE)
1860 * Estimate the stream timings from the one of each components.
1862 * Also computes the global bitrate if possible.
1864 static void update_stream_timings(AVFormatContext *ic)
1866 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1867 int64_t duration, duration1;
1871 start_time = INT64_MAX;
1872 start_time_text = INT64_MAX;
1873 end_time = INT64_MIN;
1874 duration = INT64_MIN;
1875 for(i = 0;i < ic->nb_streams; i++) {
1876 st = ic->streams[i];
1877 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1878 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1879 if (st->codec->codec_id == CODEC_ID_DVB_TELETEXT) {
1880 if (start_time1 < start_time_text)
1881 start_time_text = start_time1;
1883 if (start_time1 < start_time)
1884 start_time = start_time1;
1885 if (st->duration != AV_NOPTS_VALUE) {
1886 end_time1 = start_time1
1887 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1888 if (end_time1 > end_time)
1889 end_time = end_time1;
1892 if (st->duration != AV_NOPTS_VALUE) {
1893 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1894 if (duration1 > duration)
1895 duration = duration1;
1898 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
1899 start_time = start_time_text;
1900 if (start_time != INT64_MAX) {
1901 ic->start_time = start_time;
1902 if (end_time != INT64_MIN) {
1903 if (end_time - start_time > duration)
1904 duration = end_time - start_time;
1907 if (duration != INT64_MIN) {
1908 ic->duration = duration;
1909 if (ic->file_size > 0) {
1910 /* compute the bitrate */
1911 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1912 (double)ic->duration;
1917 static void fill_all_stream_timings(AVFormatContext *ic)
1922 update_stream_timings(ic);
1923 for(i = 0;i < ic->nb_streams; i++) {
1924 st = ic->streams[i];
1925 if (st->start_time == AV_NOPTS_VALUE) {
1926 if(ic->start_time != AV_NOPTS_VALUE)
1927 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1928 if(ic->duration != AV_NOPTS_VALUE)
1929 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1934 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
1936 int64_t filesize, duration;
1940 /* if bit_rate is already set, we believe it */
1941 if (ic->bit_rate <= 0) {
1943 for(i=0;i<ic->nb_streams;i++) {
1944 st = ic->streams[i];
1945 if (st->codec->bit_rate > 0)
1946 bit_rate += st->codec->bit_rate;
1948 ic->bit_rate = bit_rate;
1951 /* if duration is already set, we believe it */
1952 if (ic->duration == AV_NOPTS_VALUE &&
1953 ic->bit_rate != 0 &&
1954 ic->file_size != 0) {
1955 filesize = ic->file_size;
1957 for(i = 0; i < ic->nb_streams; i++) {
1958 st = ic->streams[i];
1959 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1960 if (st->duration == AV_NOPTS_VALUE)
1961 st->duration = duration;
1967 #define DURATION_MAX_READ_SIZE 250000
1968 #define DURATION_MAX_RETRY 3
1970 /* only usable for MPEG-PS streams */
1971 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1973 AVPacket pkt1, *pkt = &pkt1;
1975 int read_size, i, ret;
1977 int64_t filesize, offset, duration;
1982 /* flush packet queue */
1983 flush_packet_queue(ic);
1985 for (i=0; i<ic->nb_streams; i++) {
1986 st = ic->streams[i];
1987 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1988 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
1991 av_parser_close(st->parser);
1993 av_free_packet(&st->cur_pkt);
1997 /* estimate the end time (duration) */
1998 /* XXX: may need to support wrapping */
1999 filesize = ic->file_size;
2000 end_time = AV_NOPTS_VALUE;
2002 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2006 avio_seek(ic->pb, offset, SEEK_SET);
2009 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2013 ret = av_read_packet(ic, pkt);
2014 }while(ret == AVERROR(EAGAIN));
2017 read_size += pkt->size;
2018 st = ic->streams[pkt->stream_index];
2019 if (pkt->pts != AV_NOPTS_VALUE &&
2020 (st->start_time != AV_NOPTS_VALUE ||
2021 st->first_dts != AV_NOPTS_VALUE)) {
2022 duration = end_time = pkt->pts;
2023 if (st->start_time != AV_NOPTS_VALUE) duration -= st->start_time;
2024 else duration -= st->first_dts;
2026 duration += 1LL<<st->pts_wrap_bits;
2028 if (st->duration == AV_NOPTS_VALUE ||
2029 st->duration < duration)
2030 st->duration = duration;
2033 av_free_packet(pkt);
2035 }while( end_time==AV_NOPTS_VALUE
2036 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2037 && ++retry <= DURATION_MAX_RETRY);
2039 fill_all_stream_timings(ic);
2041 avio_seek(ic->pb, old_offset, SEEK_SET);
2042 for (i=0; i<ic->nb_streams; i++) {
2044 st->cur_dts= st->first_dts;
2045 st->last_IP_pts = AV_NOPTS_VALUE;
2046 st->reference_dts = AV_NOPTS_VALUE;
2050 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2054 /* get the file size, if possible */
2055 if (ic->iformat->flags & AVFMT_NOFILE) {
2058 file_size = avio_size(ic->pb);
2062 ic->file_size = file_size;
2064 if ((!strcmp(ic->iformat->name, "mpeg") ||
2065 !strcmp(ic->iformat->name, "mpegts")) &&
2066 file_size && ic->pb->seekable) {
2067 /* get accurate estimate from the PTSes */
2068 estimate_timings_from_pts(ic, old_offset);
2069 } else if (has_duration(ic)) {
2070 /* at least one component has timings - we use them for all
2072 fill_all_stream_timings(ic);
2074 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2075 /* less precise: use bitrate info */
2076 estimate_timings_from_bit_rate(ic);
2078 update_stream_timings(ic);
2083 AVStream av_unused *st;
2084 for(i = 0;i < ic->nb_streams; i++) {
2085 st = ic->streams[i];
2086 printf("%d: start_time: %0.3f duration: %0.3f\n",
2087 i, (double)st->start_time / AV_TIME_BASE,
2088 (double)st->duration / AV_TIME_BASE);
2090 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2091 (double)ic->start_time / AV_TIME_BASE,
2092 (double)ic->duration / AV_TIME_BASE,
2093 ic->bit_rate / 1000);
2098 static int has_codec_parameters(AVCodecContext *avctx)
2101 switch (avctx->codec_type) {
2102 case AVMEDIA_TYPE_AUDIO:
2103 val = avctx->sample_rate && avctx->channels && avctx->sample_fmt != AV_SAMPLE_FMT_NONE;
2104 if(!avctx->frame_size &&
2105 (avctx->codec_id == CODEC_ID_VORBIS ||
2106 avctx->codec_id == CODEC_ID_AAC ||
2107 avctx->codec_id == CODEC_ID_MP1 ||
2108 avctx->codec_id == CODEC_ID_MP2 ||
2109 avctx->codec_id == CODEC_ID_MP3 ||
2110 avctx->codec_id == CODEC_ID_SPEEX ||
2111 avctx->codec_id == CODEC_ID_CELT))
2114 case AVMEDIA_TYPE_VIDEO:
2115 val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
2121 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2124 static int has_decode_delay_been_guessed(AVStream *st)
2126 return st->codec->codec_id != CODEC_ID_H264 ||
2127 st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2130 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2134 int got_picture, data_size, ret=0;
2137 if(!st->codec->codec){
2138 codec = avcodec_find_decoder(st->codec->codec_id);
2141 ret = avcodec_open2(st->codec, codec, options);
2146 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st) ||
2147 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF)) {
2148 switch(st->codec->codec_type) {
2149 case AVMEDIA_TYPE_VIDEO:
2150 avcodec_get_frame_defaults(&picture);
2151 ret = avcodec_decode_video2(st->codec, &picture,
2152 &got_picture, avpkt);
2154 case AVMEDIA_TYPE_AUDIO:
2155 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2156 samples = av_malloc(data_size);
2159 ret = avcodec_decode_audio3(st->codec, samples,
2171 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2173 while (tags->id != CODEC_ID_NONE) {
2181 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2184 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2185 if(tag == tags[i].tag)
2188 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2189 if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2192 return CODEC_ID_NONE;
2195 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2198 for(i=0; tags && tags[i]; i++){
2199 int tag= ff_codec_get_tag(tags[i], id);
2205 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2208 for(i=0; tags && tags[i]; i++){
2209 enum CodecID id= ff_codec_get_id(tags[i], tag);
2210 if(id!=CODEC_ID_NONE) return id;
2212 return CODEC_ID_NONE;
2215 static void compute_chapters_end(AVFormatContext *s)
2218 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2220 for (i = 0; i < s->nb_chapters; i++)
2221 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2222 AVChapter *ch = s->chapters[i];
2223 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2226 for (j = 0; j < s->nb_chapters; j++) {
2227 AVChapter *ch1 = s->chapters[j];
2228 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2229 if (j != i && next_start > ch->start && next_start < end)
2232 ch->end = (end == INT64_MAX) ? ch->start : end;
2236 static int get_std_framerate(int i){
2237 if(i<60*12) return i*1001;
2238 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2242 * Is the time base unreliable.
2243 * This is a heuristic to balance between quick acceptance of the values in
2244 * the headers vs. some extra checks.
2245 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2246 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2247 * And there are "variable" fps files this needs to detect as well.
2249 static int tb_unreliable(AVCodecContext *c){
2250 if( c->time_base.den >= 101L*c->time_base.num
2251 || c->time_base.den < 5L*c->time_base.num
2252 /* || c->codec_tag == AV_RL32("DIVX")
2253 || c->codec_tag == AV_RL32("XVID")*/
2254 || c->codec_id == CODEC_ID_MPEG2VIDEO
2255 || c->codec_id == CODEC_ID_H264
2261 #if FF_API_FORMAT_PARAMETERS
2262 int av_find_stream_info(AVFormatContext *ic)
2264 return avformat_find_stream_info(ic, NULL);
2268 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2270 int i, count, ret, read_size, j;
2272 AVPacket pkt1, *pkt;
2273 int64_t old_offset = avio_tell(ic->pb);
2274 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2276 for(i=0;i<ic->nb_streams;i++) {
2278 st = ic->streams[i];
2279 if (st->codec->codec_id == CODEC_ID_AAC && st->codec->extradata_size) {
2280 // We need to discard these since they can be plain wrong for
2281 // backwards compatible HE-AAC signaling.
2282 // But when we have no extradata we need to keep them or we can't
2283 // play anything at all.
2284 st->codec->sample_rate = 0;
2285 st->codec->frame_size = 0;
2286 st->codec->channels = 0;
2289 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2290 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2291 /* if(!st->time_base.num)
2293 if(!st->codec->time_base.num)
2294 st->codec->time_base= st->time_base;
2296 //only for the split stuff
2297 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2298 st->parser = av_parser_init(st->codec->codec_id);
2299 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2300 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2303 assert(!st->codec->codec);
2304 codec = avcodec_find_decoder(st->codec->codec_id);
2306 /* Ensure that subtitle_header is properly set. */
2307 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2308 && codec && !st->codec->codec)
2309 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2311 //try to just open decoders, in case this is enough to get parameters
2312 if(!has_codec_parameters(st->codec)){
2313 if (codec && !st->codec->codec)
2314 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2318 for (i=0; i<ic->nb_streams; i++) {
2319 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2325 if(url_interrupt_cb()){
2327 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2331 /* check if one codec still needs to be handled */
2332 for(i=0;i<ic->nb_streams;i++) {
2333 int fps_analyze_framecount = 20;
2335 st = ic->streams[i];
2336 if (!has_codec_parameters(st->codec))
2338 /* if the timebase is coarse (like the usual millisecond precision
2339 of mkv), we need to analyze more frames to reliably arrive at
2341 if (av_q2d(st->time_base) > 0.0005)
2342 fps_analyze_framecount *= 2;
2343 if (ic->fps_probe_size >= 0)
2344 fps_analyze_framecount = ic->fps_probe_size;
2345 /* variable fps and no guess at the real fps */
2346 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2347 && st->info->duration_count < fps_analyze_framecount
2348 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2350 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2352 if(st->first_dts == AV_NOPTS_VALUE)
2355 if (i == ic->nb_streams) {
2356 /* NOTE: if the format has no header, then we need to read
2357 some packets to get most of the streams, so we cannot
2359 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2360 /* if we found the info for all the codecs, we can stop */
2362 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2366 /* we did not get all the codec info, but we read too much data */
2367 if (read_size >= ic->probesize) {
2369 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2373 /* NOTE: a new stream can be added there if no header in file
2374 (AVFMTCTX_NOHEADER) */
2375 ret = read_frame_internal(ic, &pkt1);
2376 if (ret == AVERROR(EAGAIN))
2381 ret = -1; /* we could not have all the codec parameters before EOF */
2382 for(i=0;i<ic->nb_streams;i++) {
2383 st = ic->streams[i];
2384 if (!has_codec_parameters(st->codec)){
2386 avcodec_string(buf, sizeof(buf), st->codec, 0);
2387 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2395 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2396 if ((ret = av_dup_packet(pkt)) < 0)
2397 goto find_stream_info_err;
2399 read_size += pkt->size;
2401 st = ic->streams[pkt->stream_index];
2402 if (st->codec_info_nb_frames>1) {
2404 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) {
2405 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2408 st->info->codec_info_duration += pkt->duration;
2411 int64_t last = st->info->last_dts;
2412 int64_t duration= pkt->dts - last;
2414 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2415 double dur= duration * av_q2d(st->time_base);
2417 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2418 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2419 if (st->info->duration_count < 2)
2420 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2421 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2422 int framerate= get_std_framerate(i);
2423 int ticks= lrintf(dur*framerate/(1001*12));
2424 double error= dur - ticks*1001*12/(double)framerate;
2425 st->info->duration_error[i] += error*error;
2427 st->info->duration_count++;
2428 // ignore the first 4 values, they might have some random jitter
2429 if (st->info->duration_count > 3)
2430 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2432 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2433 st->info->last_dts = pkt->dts;
2435 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2436 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2438 st->codec->extradata_size= i;
2439 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2440 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2441 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2445 /* if still no information, we try to open the codec and to
2446 decompress the frame. We try to avoid that in most cases as
2447 it takes longer and uses more memory. For MPEG-4, we need to
2448 decompress for QuickTime.
2450 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2451 least one frame of codec data, this makes sure the codec initializes
2452 the channel configuration and does not only trust the values from the container.
2454 try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
2456 st->codec_info_nb_frames++;
2460 // close codecs which were opened in try_decode_frame()
2461 for(i=0;i<ic->nb_streams;i++) {
2462 st = ic->streams[i];
2463 if(st->codec->codec)
2464 avcodec_close(st->codec);
2466 for(i=0;i<ic->nb_streams;i++) {
2467 st = ic->streams[i];
2468 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2469 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2470 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2471 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2472 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2473 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2474 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2475 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2476 st->codec->codec_tag= tag;
2479 // the check for tb_unreliable() is not completely correct, since this is not about handling
2480 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2481 // ipmovie.c produces.
2482 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)
2483 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);
2484 if (st->info->duration_count && !st->r_frame_rate.num
2485 && tb_unreliable(st->codec) /*&&
2486 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2487 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2489 double best_error= 2*av_q2d(st->time_base);
2490 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2492 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2493 double error = st->info->duration_error[j] * get_std_framerate(j);
2494 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2495 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2496 if(error < best_error){
2498 num = get_std_framerate(j);
2501 // do not increase frame rate by more than 1 % in order to match a standard rate.
2502 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2503 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2506 if (!st->r_frame_rate.num){
2507 if( st->codec->time_base.den * (int64_t)st->time_base.num
2508 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2509 st->r_frame_rate.num = st->codec->time_base.den;
2510 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2512 st->r_frame_rate.num = st->time_base.den;
2513 st->r_frame_rate.den = st->time_base.num;
2516 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2517 if(!st->codec->bits_per_coded_sample)
2518 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2519 // set stream disposition based on audio service type
2520 switch (st->codec->audio_service_type) {
2521 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2522 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2523 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2524 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2525 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2526 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2527 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2528 st->disposition = AV_DISPOSITION_COMMENT; break;
2529 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2530 st->disposition = AV_DISPOSITION_KARAOKE; break;
2535 estimate_timings(ic, old_offset);
2537 compute_chapters_end(ic);
2540 /* correct DTS for B-frame streams with no timestamps */
2541 for(i=0;i<ic->nb_streams;i++) {
2542 st = ic->streams[i];
2543 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2545 ppktl = &ic->packet_buffer;
2547 if(ppkt1->stream_index != i)
2549 if(ppkt1->pkt->dts < 0)
2551 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2553 ppkt1->pkt->dts -= delta;
2558 st->cur_dts -= delta;
2564 find_stream_info_err:
2565 for (i=0; i < ic->nb_streams; i++)
2566 av_freep(&ic->streams[i]->info);
2570 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2574 for (i = 0; i < ic->nb_programs; i++)
2575 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2576 if (ic->programs[i]->stream_index[j] == s)
2577 return ic->programs[i];
2581 int av_find_best_stream(AVFormatContext *ic,
2582 enum AVMediaType type,
2583 int wanted_stream_nb,
2585 AVCodec **decoder_ret,
2588 int i, nb_streams = ic->nb_streams;
2589 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2590 unsigned *program = NULL;
2591 AVCodec *decoder = NULL, *best_decoder = NULL;
2593 if (related_stream >= 0 && wanted_stream_nb < 0) {
2594 AVProgram *p = find_program_from_stream(ic, related_stream);
2596 program = p->stream_index;
2597 nb_streams = p->nb_stream_indexes;
2600 for (i = 0; i < nb_streams; i++) {
2601 int real_stream_index = program ? program[i] : i;
2602 AVStream *st = ic->streams[real_stream_index];
2603 AVCodecContext *avctx = st->codec;
2604 if (avctx->codec_type != type)
2606 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2608 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2611 decoder = avcodec_find_decoder(st->codec->codec_id);
2614 ret = AVERROR_DECODER_NOT_FOUND;
2618 if (best_count >= st->codec_info_nb_frames)
2620 best_count = st->codec_info_nb_frames;
2621 ret = real_stream_index;
2622 best_decoder = decoder;
2623 if (program && i == nb_streams - 1 && ret < 0) {
2625 nb_streams = ic->nb_streams;
2626 i = 0; /* no related stream found, try again with everything */
2630 *decoder_ret = best_decoder;
2634 /*******************************************************/
2636 int av_read_play(AVFormatContext *s)
2638 if (s->iformat->read_play)
2639 return s->iformat->read_play(s);
2641 return avio_pause(s->pb, 0);
2642 return AVERROR(ENOSYS);
2645 int av_read_pause(AVFormatContext *s)
2647 if (s->iformat->read_pause)
2648 return s->iformat->read_pause(s);
2650 return avio_pause(s->pb, 1);
2651 return AVERROR(ENOSYS);
2654 void av_close_input_stream(AVFormatContext *s)
2656 flush_packet_queue(s);
2657 if (s->iformat->read_close)
2658 s->iformat->read_close(s);
2659 avformat_free_context(s);
2662 void avformat_free_context(AVFormatContext *s)
2668 if (s->iformat && s->iformat->priv_class && s->priv_data)
2669 av_opt_free(s->priv_data);
2671 for(i=0;i<s->nb_streams;i++) {
2672 /* free all data in a stream component */
2675 av_parser_close(st->parser);
2676 av_free_packet(&st->cur_pkt);
2678 av_dict_free(&st->metadata);
2679 av_free(st->index_entries);
2680 av_free(st->codec->extradata);
2681 av_free(st->codec->subtitle_header);
2683 av_free(st->priv_data);
2687 for(i=s->nb_programs-1; i>=0; i--) {
2688 av_dict_free(&s->programs[i]->metadata);
2689 av_freep(&s->programs[i]->stream_index);
2690 av_freep(&s->programs[i]);
2692 av_freep(&s->programs);
2693 av_freep(&s->priv_data);
2694 while(s->nb_chapters--) {
2695 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2696 av_free(s->chapters[s->nb_chapters]);
2698 av_freep(&s->chapters);
2699 av_dict_free(&s->metadata);
2700 av_freep(&s->streams);
2704 void av_close_input_file(AVFormatContext *s)
2706 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2708 av_close_input_stream(s);
2713 AVStream *av_new_stream(AVFormatContext *s, int id)
2719 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2721 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2724 s->streams = streams;
2726 st = av_mallocz(sizeof(AVStream));
2729 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2734 st->codec = avcodec_alloc_context3(NULL);
2736 /* no default bitrate if decoding */
2737 st->codec->bit_rate = 0;
2739 st->index = s->nb_streams;
2741 st->start_time = AV_NOPTS_VALUE;
2742 st->duration = AV_NOPTS_VALUE;
2743 /* we set the current DTS to 0 so that formats without any timestamps
2744 but durations get some timestamps, formats with some unknown
2745 timestamps have their first few packets buffered and the
2746 timestamps corrected before they are returned to the user */
2748 st->first_dts = AV_NOPTS_VALUE;
2749 st->probe_packets = MAX_PROBE_PACKETS;
2751 /* default pts setting is MPEG-like */
2752 av_set_pts_info(st, 33, 1, 90000);
2753 st->last_IP_pts = AV_NOPTS_VALUE;
2754 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2755 st->pts_buffer[i]= AV_NOPTS_VALUE;
2756 st->reference_dts = AV_NOPTS_VALUE;
2758 st->sample_aspect_ratio = (AVRational){0,1};
2760 s->streams[s->nb_streams++] = st;
2764 AVProgram *av_new_program(AVFormatContext *ac, int id)
2766 AVProgram *program=NULL;
2769 av_dlog(ac, "new_program: id=0x%04x\n", id);
2771 for(i=0; i<ac->nb_programs; i++)
2772 if(ac->programs[i]->id == id)
2773 program = ac->programs[i];
2776 program = av_mallocz(sizeof(AVProgram));
2779 dynarray_add(&ac->programs, &ac->nb_programs, program);
2780 program->discard = AVDISCARD_NONE;
2787 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2789 AVChapter *chapter = NULL;
2792 for(i=0; i<s->nb_chapters; i++)
2793 if(s->chapters[i]->id == id)
2794 chapter = s->chapters[i];
2797 chapter= av_mallocz(sizeof(AVChapter));
2800 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2802 av_dict_set(&chapter->metadata, "title", title, 0);
2804 chapter->time_base= time_base;
2805 chapter->start = start;
2811 /************************************************************/
2812 /* output media file */
2814 #if FF_API_FORMAT_PARAMETERS
2815 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2817 if (s->oformat->priv_data_size > 0) {
2818 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2820 return AVERROR(ENOMEM);
2821 if (s->oformat->priv_class) {
2822 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2823 av_opt_set_defaults(s->priv_data);
2826 s->priv_data = NULL;
2832 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
2833 const char *format, const char *filename)
2835 AVFormatContext *s = avformat_alloc_context();
2844 oformat = av_guess_format(format, NULL, NULL);
2846 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
2847 ret = AVERROR(EINVAL);
2851 oformat = av_guess_format(NULL, filename, NULL);
2853 ret = AVERROR(EINVAL);
2854 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
2861 s->oformat = oformat;
2862 if (s->oformat->priv_data_size > 0) {
2863 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2866 if (s->oformat->priv_class) {
2867 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2868 av_opt_set_defaults(s->priv_data);
2871 s->priv_data = NULL;
2874 av_strlcpy(s->filename, filename, sizeof(s->filename));
2878 av_log(s, AV_LOG_ERROR, "Out of memory\n");
2879 ret = AVERROR(ENOMEM);
2881 avformat_free_context(s);
2885 #if FF_API_ALLOC_OUTPUT_CONTEXT
2886 AVFormatContext *avformat_alloc_output_context(const char *format,
2887 AVOutputFormat *oformat, const char *filename)
2889 AVFormatContext *avctx;
2890 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
2891 return ret < 0 ? NULL : avctx;
2895 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2897 const AVCodecTag *avctag;
2899 enum CodecID id = CODEC_ID_NONE;
2900 unsigned int tag = 0;
2903 * Check that tag + id is in the table
2904 * If neither is in the table -> OK
2905 * If tag is in the table with another id -> FAIL
2906 * If id is in the table with another tag -> FAIL unless strict < normal
2908 for (n = 0; s->oformat->codec_tag[n]; n++) {
2909 avctag = s->oformat->codec_tag[n];
2910 while (avctag->id != CODEC_ID_NONE) {
2911 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2913 if (id == st->codec->codec_id)
2916 if (avctag->id == st->codec->codec_id)
2921 if (id != CODEC_ID_NONE)
2923 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2928 #if FF_API_FORMAT_PARAMETERS
2929 int av_write_header(AVFormatContext *s)
2931 return avformat_write_header(s, NULL);
2935 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2939 AVDictionary *tmp = NULL;
2942 av_dict_copy(&tmp, *options, 0);
2943 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2945 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
2946 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2949 // some sanity checks
2950 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2951 av_log(s, AV_LOG_ERROR, "no streams\n");
2952 ret = AVERROR(EINVAL);
2956 for(i=0;i<s->nb_streams;i++) {
2959 switch (st->codec->codec_type) {
2960 case AVMEDIA_TYPE_AUDIO:
2961 if(st->codec->sample_rate<=0){
2962 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2963 ret = AVERROR(EINVAL);
2966 if(!st->codec->block_align)
2967 st->codec->block_align = st->codec->channels *
2968 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2970 case AVMEDIA_TYPE_VIDEO:
2971 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2972 av_log(s, AV_LOG_ERROR, "time base not set\n");
2973 ret = AVERROR(EINVAL);
2976 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2977 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2978 ret = AVERROR(EINVAL);
2981 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2982 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2983 ret = AVERROR(EINVAL);
2989 if(s->oformat->codec_tag){
2990 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)){
2991 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2992 st->codec->codec_tag= 0;
2994 if(st->codec->codec_tag){
2995 if (!validate_codec_tag(s, st)) {
2997 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2998 av_log(s, AV_LOG_ERROR,
2999 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
3000 tagbuf, st->codec->codec_tag, st->codec->codec_id);
3001 ret = AVERROR_INVALIDDATA;
3005 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3008 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3009 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3010 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3013 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3014 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3015 if (!s->priv_data) {
3016 ret = AVERROR(ENOMEM);
3019 if (s->oformat->priv_class) {
3020 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3021 av_opt_set_defaults(s->priv_data);
3022 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3027 /* set muxer identification string */
3028 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3029 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3032 if(s->oformat->write_header){
3033 ret = s->oformat->write_header(s);
3038 /* init PTS generation */
3039 for(i=0;i<s->nb_streams;i++) {
3040 int64_t den = AV_NOPTS_VALUE;
3043 switch (st->codec->codec_type) {
3044 case AVMEDIA_TYPE_AUDIO:
3045 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3047 case AVMEDIA_TYPE_VIDEO:
3048 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3053 if (den != AV_NOPTS_VALUE) {
3055 ret = AVERROR_INVALIDDATA;
3058 frac_init(&st->pts, 0, 0, den);
3063 av_dict_free(options);
3072 //FIXME merge with compute_pkt_fields
3073 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3074 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3075 int num, den, frame_size, i;
3077 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3078 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3080 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
3081 return AVERROR(EINVAL);*/
3083 /* duration field */
3084 if (pkt->duration == 0) {
3085 compute_frame_duration(&num, &den, st, NULL, pkt);
3087 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3091 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3094 //XXX/FIXME this is a temporary hack until all encoders output pts
3095 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3097 // pkt->pts= st->cur_dts;
3098 pkt->pts= st->pts.val;
3101 //calculate dts from pts
3102 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3103 st->pts_buffer[0]= pkt->pts;
3104 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3105 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3106 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3107 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3109 pkt->dts= st->pts_buffer[0];
3112 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)){
3113 av_log(s, AV_LOG_ERROR,
3114 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3115 st->index, st->cur_dts, pkt->dts);
3116 return AVERROR(EINVAL);
3118 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3119 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3120 return AVERROR(EINVAL);
3123 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3124 st->cur_dts= pkt->dts;
3125 st->pts.val= pkt->dts;
3128 switch (st->codec->codec_type) {
3129 case AVMEDIA_TYPE_AUDIO:
3130 frame_size = get_audio_frame_size(st->codec, pkt->size);
3132 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3133 likely equal to the encoder delay, but it would be better if we
3134 had the real timestamps from the encoder */
3135 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3136 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3139 case AVMEDIA_TYPE_VIDEO:
3140 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3148 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3150 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3152 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3155 ret= s->oformat->write_packet(s, pkt);
3158 s->streams[pkt->stream_index]->nb_frames++;
3162 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3163 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3165 AVPacketList **next_point, *this_pktl;
3167 this_pktl = av_mallocz(sizeof(AVPacketList));
3168 this_pktl->pkt= *pkt;
3169 pkt->destruct= NULL; // do not free original but only the copy
3170 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3172 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3173 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3175 next_point = &s->packet_buffer;
3178 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3179 while(!compare(s, &(*next_point)->pkt, pkt)){
3180 next_point= &(*next_point)->next;
3184 next_point = &(s->packet_buffer_end->next);
3187 assert(!*next_point);
3189 s->packet_buffer_end= this_pktl;
3192 this_pktl->next= *next_point;
3194 s->streams[pkt->stream_index]->last_in_packet_buffer=
3195 *next_point= this_pktl;
3198 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3200 AVStream *st = s->streams[ pkt ->stream_index];
3201 AVStream *st2= s->streams[ next->stream_index];
3202 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3206 return pkt->stream_index < next->stream_index;
3210 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3216 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3219 for(i=0; i < s->nb_streams; i++)
3220 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3222 if(stream_count && (s->nb_streams == stream_count || flush)){
3223 pktl= s->packet_buffer;
3226 s->packet_buffer= pktl->next;
3227 if(!s->packet_buffer)
3228 s->packet_buffer_end= NULL;
3230 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3231 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3235 av_init_packet(out);
3241 * Interleave an AVPacket correctly so it can be muxed.
3242 * @param out the interleaved packet will be output here
3243 * @param in the input packet
3244 * @param flush 1 if no further packets are available as input and all
3245 * remaining packets should be output
3246 * @return 1 if a packet was output, 0 if no packet could be output,
3247 * < 0 if an error occurred
3249 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3250 if(s->oformat->interleave_packet)
3251 return s->oformat->interleave_packet(s, out, in, flush);
3253 return av_interleave_packet_per_dts(s, out, in, flush);
3256 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3257 AVStream *st= s->streams[ pkt->stream_index];
3260 //FIXME/XXX/HACK drop zero sized packets
3261 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3264 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3265 pkt->size, pkt->dts, pkt->pts);
3266 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3269 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3270 return AVERROR(EINVAL);
3274 int ret= interleave_packet(s, &opkt, pkt, 0);
3275 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3278 ret= s->oformat->write_packet(s, &opkt);
3280 s->streams[opkt.stream_index]->nb_frames++;
3282 av_free_packet(&opkt);
3287 if(url_ferror(s->pb))
3288 return url_ferror(s->pb);
3292 int av_write_trailer(AVFormatContext *s)
3298 ret= interleave_packet(s, &pkt, NULL, 1);
3299 if(ret<0) //FIXME cleanup needed for ret<0 ?
3304 ret= s->oformat->write_packet(s, &pkt);
3306 s->streams[pkt.stream_index]->nb_frames++;
3308 av_free_packet(&pkt);
3312 if(url_ferror(s->pb))
3316 if(s->oformat->write_trailer)
3317 ret = s->oformat->write_trailer(s);
3320 ret=url_ferror(s->pb);
3321 for(i=0;i<s->nb_streams;i++) {
3322 av_freep(&s->streams[i]->priv_data);
3323 av_freep(&s->streams[i]->index_entries);
3325 if (s->iformat && s->iformat->priv_class)
3326 av_opt_free(s->priv_data);
3327 av_freep(&s->priv_data);
3331 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
3332 int64_t *dts, int64_t *wall)
3334 if (!s->oformat || !s->oformat->get_output_timestamp)
3335 return AVERROR(ENOSYS);
3336 s->oformat->get_output_timestamp(s, stream, dts, wall);
3340 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3343 AVProgram *program=NULL;
3346 if (idx >= ac->nb_streams) {
3347 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3351 for(i=0; i<ac->nb_programs; i++){
3352 if(ac->programs[i]->id != progid)
3354 program = ac->programs[i];
3355 for(j=0; j<program->nb_stream_indexes; j++)
3356 if(program->stream_index[j] == idx)
3359 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3362 program->stream_index = tmp;
3363 program->stream_index[program->nb_stream_indexes++] = idx;
3368 static void print_fps(double d, const char *postfix){
3369 uint64_t v= lrintf(d*100);
3370 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3371 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3372 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3375 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3377 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3378 AVDictionaryEntry *tag=NULL;
3380 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3381 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3382 if(strcmp("language", tag->key)){
3385 av_strlcpy(tmp, tag->value, sizeof(tmp));
3386 for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
3387 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tmp);
3393 /* "user interface" functions */
3394 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3397 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3398 AVStream *st = ic->streams[i];
3399 int g = av_gcd(st->time_base.num, st->time_base.den);
3400 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3401 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3402 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3403 /* the pid is an important information, so we display it */
3404 /* XXX: add a generic system */
3405 if (flags & AVFMT_SHOW_IDS)
3406 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3408 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3409 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3410 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3411 if (st->sample_aspect_ratio.num && // default
3412 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3413 AVRational display_aspect_ratio;
3414 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3415 st->codec->width*st->sample_aspect_ratio.num,
3416 st->codec->height*st->sample_aspect_ratio.den,
3418 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3419 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3420 display_aspect_ratio.num, display_aspect_ratio.den);
3422 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3423 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3424 print_fps(av_q2d(st->avg_frame_rate), "fps");
3425 if(st->r_frame_rate.den && st->r_frame_rate.num)
3426 print_fps(av_q2d(st->r_frame_rate), "tbr");
3427 if(st->time_base.den && st->time_base.num)
3428 print_fps(1/av_q2d(st->time_base), "tbn");
3429 if(st->codec->time_base.den && st->codec->time_base.num)
3430 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3432 if (st->disposition & AV_DISPOSITION_DEFAULT)
3433 av_log(NULL, AV_LOG_INFO, " (default)");
3434 if (st->disposition & AV_DISPOSITION_DUB)
3435 av_log(NULL, AV_LOG_INFO, " (dub)");
3436 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3437 av_log(NULL, AV_LOG_INFO, " (original)");
3438 if (st->disposition & AV_DISPOSITION_COMMENT)
3439 av_log(NULL, AV_LOG_INFO, " (comment)");
3440 if (st->disposition & AV_DISPOSITION_LYRICS)
3441 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3442 if (st->disposition & AV_DISPOSITION_KARAOKE)
3443 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3444 if (st->disposition & AV_DISPOSITION_FORCED)
3445 av_log(NULL, AV_LOG_INFO, " (forced)");
3446 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3447 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3448 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3449 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3450 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3451 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3452 av_log(NULL, AV_LOG_INFO, "\n");
3453 dump_metadata(NULL, st->metadata, " ");
3456 #if FF_API_DUMP_FORMAT
3457 void dump_format(AVFormatContext *ic,
3462 av_dump_format(ic, index, url, is_output);
3466 void av_dump_format(AVFormatContext *ic,
3472 uint8_t *printed = av_mallocz(ic->nb_streams);
3473 if (ic->nb_streams && !printed)
3476 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3477 is_output ? "Output" : "Input",
3479 is_output ? ic->oformat->name : ic->iformat->name,
3480 is_output ? "to" : "from", url);
3481 dump_metadata(NULL, ic->metadata, " ");
3483 av_log(NULL, AV_LOG_INFO, " Duration: ");
3484 if (ic->duration != AV_NOPTS_VALUE) {
3485 int hours, mins, secs, us;
3486 secs = ic->duration / AV_TIME_BASE;
3487 us = ic->duration % AV_TIME_BASE;
3492 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3493 (100 * us) / AV_TIME_BASE);
3495 av_log(NULL, AV_LOG_INFO, "N/A");
3497 if (ic->start_time != AV_NOPTS_VALUE) {
3499 av_log(NULL, AV_LOG_INFO, ", start: ");
3500 secs = ic->start_time / AV_TIME_BASE;
3501 us = abs(ic->start_time % AV_TIME_BASE);
3502 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3503 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3505 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3507 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3509 av_log(NULL, AV_LOG_INFO, "N/A");
3511 av_log(NULL, AV_LOG_INFO, "\n");
3513 for (i = 0; i < ic->nb_chapters; i++) {
3514 AVChapter *ch = ic->chapters[i];
3515 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3516 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3517 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3519 dump_metadata(NULL, ch->metadata, " ");
3521 if(ic->nb_programs) {
3522 int j, k, total = 0;
3523 for(j=0; j<ic->nb_programs; j++) {
3524 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3526 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3527 name ? name->value : "");
3528 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3529 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3530 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3531 printed[ic->programs[j]->stream_index[k]] = 1;
3533 total += ic->programs[j]->nb_stream_indexes;
3535 if (total < ic->nb_streams)
3536 av_log(NULL, AV_LOG_INFO, " No Program\n");
3538 for(i=0;i<ic->nb_streams;i++)
3540 dump_stream_format(ic, i, index, is_output);
3545 int64_t av_gettime(void)
3548 gettimeofday(&tv,NULL);
3549 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3552 uint64_t ff_ntp_time(void)
3554 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3557 #if FF_API_PARSE_DATE
3558 #include "libavutil/parseutils.h"
3560 int64_t parse_date(const char *timestr, int duration)
3563 av_parse_time(&timeval, timestr, duration);
3568 #if FF_API_FIND_INFO_TAG
3569 #include "libavutil/parseutils.h"
3571 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3573 return av_find_info_tag(arg, arg_size, tag1, info);
3577 int av_get_frame_filename(char *buf, int buf_size,
3578 const char *path, int number)
3581 char *q, buf1[20], c;
3582 int nd, len, percentd_found;
3594 while (isdigit(*p)) {
3595 nd = nd * 10 + *p++ - '0';
3598 } while (isdigit(c));
3607 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3609 if ((q - buf + len) > buf_size - 1)
3611 memcpy(q, buf1, len);
3619 if ((q - buf) < buf_size - 1)
3623 if (!percentd_found)
3632 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3636 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3638 for(i=0;i<size;i+=16) {
3645 PRINT(" %02x", buf[i+j]);
3650 for(j=0;j<len;j++) {
3652 if (c < ' ' || c > '~')
3661 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3663 hex_dump_internal(NULL, f, 0, buf, size);
3666 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3668 hex_dump_internal(avcl, NULL, level, buf, size);
3671 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3674 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3675 PRINT("stream #%d:\n", pkt->stream_index);
3676 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3677 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3678 /* DTS is _always_ valid after av_read_frame() */
3680 if (pkt->dts == AV_NOPTS_VALUE)
3683 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3684 /* PTS may not be known if B-frames are present. */
3686 if (pkt->pts == AV_NOPTS_VALUE)
3689 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3691 PRINT(" size=%d\n", pkt->size);
3694 av_hex_dump(f, pkt->data, pkt->size);
3698 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3700 AVRational tb = { 1, AV_TIME_BASE };
3701 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3705 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3707 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3711 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3713 AVRational tb = { 1, AV_TIME_BASE };
3714 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3718 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3721 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3724 void av_url_split(char *proto, int proto_size,
3725 char *authorization, int authorization_size,
3726 char *hostname, int hostname_size,
3728 char *path, int path_size,
3731 const char *p, *ls, *at, *col, *brk;
3733 if (port_ptr) *port_ptr = -1;
3734 if (proto_size > 0) proto[0] = 0;
3735 if (authorization_size > 0) authorization[0] = 0;
3736 if (hostname_size > 0) hostname[0] = 0;
3737 if (path_size > 0) path[0] = 0;
3739 /* parse protocol */
3740 if ((p = strchr(url, ':'))) {
3741 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3746 /* no protocol means plain filename */
3747 av_strlcpy(path, url, path_size);
3751 /* separate path from hostname */
3752 ls = strchr(p, '/');
3754 ls = strchr(p, '?');
3756 av_strlcpy(path, ls, path_size);
3758 ls = &p[strlen(p)]; // XXX
3760 /* the rest is hostname, use that to parse auth/port */
3762 /* authorization (user[:pass]@hostname) */
3763 if ((at = strchr(p, '@')) && at < ls) {
3764 av_strlcpy(authorization, p,
3765 FFMIN(authorization_size, at + 1 - p));
3766 p = at + 1; /* skip '@' */
3769 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3771 av_strlcpy(hostname, p + 1,
3772 FFMIN(hostname_size, brk - p));
3773 if (brk[1] == ':' && port_ptr)
3774 *port_ptr = atoi(brk + 2);
3775 } else if ((col = strchr(p, ':')) && col < ls) {
3776 av_strlcpy(hostname, p,
3777 FFMIN(col + 1 - p, hostname_size));
3778 if (port_ptr) *port_ptr = atoi(col + 1);
3780 av_strlcpy(hostname, p,
3781 FFMIN(ls + 1 - p, hostname_size));
3785 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3788 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3791 'C', 'D', 'E', 'F' };
3792 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3795 'c', 'd', 'e', 'f' };
3796 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3798 for(i = 0; i < s; i++) {
3799 buff[i * 2] = hex_table[src[i] >> 4];
3800 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3806 int ff_hex_to_data(uint8_t *data, const char *p)
3813 p += strspn(p, SPACE_CHARS);
3816 c = toupper((unsigned char) *p++);
3817 if (c >= '0' && c <= '9')
3819 else if (c >= 'A' && c <= 'F')
3834 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3835 unsigned int pts_num, unsigned int pts_den)
3838 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3839 if(new_tb.num != pts_num)
3840 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3842 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3844 if(new_tb.num <= 0 || new_tb.den <= 0) {
3845 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3848 s->time_base = new_tb;
3849 s->pts_wrap_bits = pts_wrap_bits;
3852 int ff_url_join(char *str, int size, const char *proto,
3853 const char *authorization, const char *hostname,
3854 int port, const char *fmt, ...)
3857 struct addrinfo hints, *ai;
3862 av_strlcatf(str, size, "%s://", proto);
3863 if (authorization && authorization[0])
3864 av_strlcatf(str, size, "%s@", authorization);
3865 #if CONFIG_NETWORK && defined(AF_INET6)
3866 /* Determine if hostname is a numerical IPv6 address,
3867 * properly escape it within [] in that case. */
3868 memset(&hints, 0, sizeof(hints));
3869 hints.ai_flags = AI_NUMERICHOST;
3870 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3871 if (ai->ai_family == AF_INET6) {
3872 av_strlcat(str, "[", size);
3873 av_strlcat(str, hostname, size);
3874 av_strlcat(str, "]", size);
3876 av_strlcat(str, hostname, size);
3881 /* Not an IPv6 address, just output the plain string. */
3882 av_strlcat(str, hostname, size);
3885 av_strlcatf(str, size, ":%d", port);
3888 int len = strlen(str);
3891 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3897 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3898 AVFormatContext *src)
3903 local_pkt.stream_index = dst_stream;
3904 if (pkt->pts != AV_NOPTS_VALUE)
3905 local_pkt.pts = av_rescale_q(pkt->pts,
3906 src->streams[pkt->stream_index]->time_base,
3907 dst->streams[dst_stream]->time_base);
3908 if (pkt->dts != AV_NOPTS_VALUE)
3909 local_pkt.dts = av_rescale_q(pkt->dts,
3910 src->streams[pkt->stream_index]->time_base,
3911 dst->streams[dst_stream]->time_base);
3912 return av_write_frame(dst, &local_pkt);
3915 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3918 const char *ptr = str;
3920 /* Parse key=value pairs. */
3923 char *dest = NULL, *dest_end;
3924 int key_len, dest_len = 0;
3926 /* Skip whitespace and potential commas. */
3927 while (*ptr && (isspace(*ptr) || *ptr == ','))
3934 if (!(ptr = strchr(key, '=')))
3937 key_len = ptr - key;
3939 callback_get_buf(context, key, key_len, &dest, &dest_len);
3940 dest_end = dest + dest_len - 1;
3944 while (*ptr && *ptr != '\"') {
3948 if (dest && dest < dest_end)
3952 if (dest && dest < dest_end)
3960 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3961 if (dest && dest < dest_end)
3969 int ff_find_stream_index(AVFormatContext *s, int id)
3972 for (i = 0; i < s->nb_streams; i++) {
3973 if (s->streams[i]->id == id)
3979 void ff_make_absolute_url(char *buf, int size, const char *base,
3983 /* Absolute path, relative to the current server */
3984 if (base && strstr(base, "://") && rel[0] == '/') {
3986 av_strlcpy(buf, base, size);
3987 sep = strstr(buf, "://");
3990 sep = strchr(sep, '/');
3994 av_strlcat(buf, rel, size);
3997 /* If rel actually is an absolute url, just copy it */
3998 if (!base || strstr(rel, "://") || rel[0] == '/') {
3999 av_strlcpy(buf, rel, size);
4003 av_strlcpy(buf, base, size);
4004 /* Remove the file name from the base url */
4005 sep = strrchr(buf, '/');
4010 while (av_strstart(rel, "../", NULL) && sep) {
4011 /* Remove the path delimiter at the end */
4013 sep = strrchr(buf, '/');
4014 /* If the next directory name to pop off is "..", break here */
4015 if (!strcmp(sep ? &sep[1] : buf, "..")) {
4016 /* Readd the slash we just removed */
4017 av_strlcat(buf, "/", size);
4020 /* Cut off the directory name */
4027 av_strlcat(buf, rel, size);
4030 int64_t ff_iso8601_to_unix_time(const char *datestr)
4033 struct tm time = {0};
4034 strptime(datestr, "%Y - %m - %dT%T", &time);
4035 return mktime(&time);
4037 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
4038 "the date string.\n");
4043 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
4046 if (ofmt->query_codec)
4047 return ofmt->query_codec(codec_id, std_compliance);
4048 else if (ofmt->codec_tag)
4049 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4050 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4051 codec_id == ofmt->subtitle_codec)
4054 return AVERROR_PATCHWELCOME;