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"
36 #include "audiointerleave.h"
51 * various utility functions for use within FFmpeg
54 unsigned avformat_version(void)
56 return LIBAVFORMAT_VERSION_INT;
59 const char *avformat_configuration(void)
61 return FFMPEG_CONFIGURATION;
64 const char *avformat_license(void)
66 #define LICENSE_PREFIX "libavformat license: "
67 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
70 /* fraction handling */
73 * f = val + (num / den) + 0.5.
75 * 'num' is normalized so that it is such as 0 <= num < den.
77 * @param f fractional number
78 * @param val integer value
79 * @param num must be >= 0
80 * @param den must be >= 1
82 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
95 * Fractional addition to f: f = f + (incr / f->den).
97 * @param f fractional number
98 * @param incr increment, can be positive or negative
100 static void av_frac_add(AVFrac *f, int64_t incr)
113 } else if (num >= den) {
120 /** head of registered input format linked list */
121 static AVInputFormat *first_iformat = NULL;
122 /** head of registered output format linked list */
123 static AVOutputFormat *first_oformat = NULL;
125 AVInputFormat *av_iformat_next(AVInputFormat *f)
127 if(f) return f->next;
128 else return first_iformat;
131 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
133 if(f) return f->next;
134 else return first_oformat;
137 void av_register_input_format(AVInputFormat *format)
141 while (*p != NULL) p = &(*p)->next;
146 void av_register_output_format(AVOutputFormat *format)
150 while (*p != NULL) p = &(*p)->next;
155 int av_match_ext(const char *filename, const char *extensions)
163 ext = strrchr(filename, '.');
169 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
172 if (!strcasecmp(ext1, ext))
182 static int match_format(const char *name, const char *names)
190 namelen = strlen(name);
191 while ((p = strchr(names, ','))) {
192 len = FFMAX(p - names, namelen);
193 if (!strncasecmp(name, names, len))
197 return !strcasecmp(name, names);
200 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
201 const char *mime_type)
203 AVOutputFormat *fmt = NULL, *fmt_found;
204 int score_max, score;
206 /* specific test for image sequences */
207 #if CONFIG_IMAGE2_MUXER
208 if (!short_name && filename &&
209 av_filename_number_test(filename) &&
210 ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
211 return av_guess_format("image2", NULL, NULL);
214 /* Find the proper file type. */
217 while ((fmt = av_oformat_next(fmt))) {
219 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
221 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
223 if (filename && fmt->extensions &&
224 av_match_ext(filename, fmt->extensions)) {
227 if (score > score_max) {
235 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
236 const char *filename, const char *mime_type, enum AVMediaType type){
237 if(type == AVMEDIA_TYPE_VIDEO){
238 enum CodecID codec_id= CODEC_ID_NONE;
240 #if CONFIG_IMAGE2_MUXER
241 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
242 codec_id= ff_guess_image2_codec(filename);
245 if(codec_id == CODEC_ID_NONE)
246 codec_id= fmt->video_codec;
248 }else if(type == AVMEDIA_TYPE_AUDIO)
249 return fmt->audio_codec;
250 else if (type == AVMEDIA_TYPE_SUBTITLE)
251 return fmt->subtitle_codec;
253 return CODEC_ID_NONE;
256 AVInputFormat *av_find_input_format(const char *short_name)
258 AVInputFormat *fmt = NULL;
259 while ((fmt = av_iformat_next(fmt))) {
260 if (match_format(short_name, fmt->name))
267 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
269 int ret= av_new_packet(pkt, size);
274 pkt->pos= avio_tell(s);
276 ret= avio_read(s, pkt->data, size);
280 av_shrink_packet(pkt, ret);
285 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
290 return av_get_packet(s, pkt, size);
291 old_size = pkt->size;
292 ret = av_grow_packet(pkt, size);
295 ret = avio_read(s, pkt->data + old_size, size);
296 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
301 int av_filename_number_test(const char *filename)
304 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
307 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
309 AVProbeData lpd = *pd;
310 AVInputFormat *fmt1 = NULL, *fmt;
311 int score, score_max=0;
313 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
314 int id3len = ff_id3v2_tag_len(lpd.buf);
315 if (lpd.buf_size > id3len + 16) {
317 lpd.buf_size -= id3len;
322 while ((fmt1 = av_iformat_next(fmt1))) {
323 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
326 if (fmt1->read_probe) {
327 score = fmt1->read_probe(&lpd);
328 if(!score && fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
330 } else if (fmt1->extensions) {
331 if (av_match_ext(lpd.filename, fmt1->extensions)) {
335 if (score > score_max) {
338 }else if (score == score_max)
341 *score_ret= score_max;
345 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
348 AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
349 if(score_ret > *score_max){
350 *score_max= score_ret;
356 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
358 return av_probe_input_format2(pd, is_opened, &score);
361 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
363 static const struct {
364 const char *name; enum CodecID id; enum AVMediaType type;
366 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
367 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
368 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
369 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
370 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
371 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
372 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
373 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
377 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
381 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
382 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
383 for (i = 0; fmt_id_type[i].name; i++) {
384 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
385 st->codec->codec_id = fmt_id_type[i].id;
386 st->codec->codec_type = fmt_id_type[i].type;
394 /************************************************************/
395 /* input media file */
397 #if FF_API_FORMAT_PARAMETERS
398 static AVDictionary *convert_format_parameters(AVFormatParameters *ap)
401 AVDictionary *opts = NULL;
406 if (ap->time_base.num) {
407 snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
408 av_dict_set(&opts, "framerate", buf, 0);
410 if (ap->sample_rate) {
411 snprintf(buf, sizeof(buf), "%d", ap->sample_rate);
412 av_dict_set(&opts, "sample_rate", buf, 0);
415 snprintf(buf, sizeof(buf), "%d", ap->channels);
416 av_dict_set(&opts, "channels", buf, 0);
418 if (ap->width || ap->height) {
419 snprintf(buf, sizeof(buf), "%dx%d", ap->width, ap->height);
420 av_dict_set(&opts, "video_size", buf, 0);
422 if (ap->pix_fmt != PIX_FMT_NONE) {
423 av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(ap->pix_fmt), 0);
426 snprintf(buf, sizeof(buf), "%d", ap->channel);
427 av_dict_set(&opts, "channel", buf, 0);
430 av_dict_set(&opts, "standard", ap->standard, 0);
432 if (ap->mpeg2ts_compute_pcr) {
433 av_dict_set(&opts, "mpeg2ts_compute_pcr", "1", 0);
435 if (ap->initial_pause) {
436 av_dict_set(&opts, "initial_pause", "1", 0);
442 * Open a media file from an IO stream. 'fmt' must be specified.
444 int av_open_input_stream(AVFormatContext **ic_ptr,
445 AVIOContext *pb, const char *filename,
446 AVInputFormat *fmt, AVFormatParameters *ap)
451 AVFormatParameters default_ap;
455 memset(ap, 0, sizeof(default_ap));
457 opts = convert_format_parameters(ap);
459 if(!ap->prealloced_context)
460 *ic_ptr = ic = avformat_alloc_context();
464 err = AVERROR(ENOMEM);
467 if (pb && fmt && fmt->flags & AVFMT_NOFILE)
468 av_log(ic, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
469 "will be ignored with AVFMT_NOFILE format.\n");
473 if ((err = avformat_open_input(&ic, filename, fmt, &opts)) < 0)
475 ic->pb = ic->pb ? ic->pb : pb; // don't leak custom pb if it wasn't set above
484 int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap){
487 if (ic->iformat->read_header) {
488 err = ic->iformat->read_header(ic, ap);
493 if (ic->pb && !ic->data_offset)
494 ic->data_offset = avio_tell(ic->pb);
500 /** size of probe buffer, for guessing file type from file contents */
501 #define PROBE_BUF_MIN 2048
502 #define PROBE_BUF_MAX (1<<20)
504 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
505 const char *filename, void *logctx,
506 unsigned int offset, unsigned int max_probe_size)
508 AVProbeData pd = { filename ? filename : "", NULL, -offset };
509 unsigned char *buf = NULL;
510 int ret = 0, probe_size;
512 if (!max_probe_size) {
513 max_probe_size = PROBE_BUF_MAX;
514 } else if (max_probe_size > PROBE_BUF_MAX) {
515 max_probe_size = PROBE_BUF_MAX;
516 } else if (max_probe_size < PROBE_BUF_MIN) {
517 return AVERROR(EINVAL);
520 if (offset >= max_probe_size) {
521 return AVERROR(EINVAL);
524 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt && ret >= 0;
525 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
526 int ret, score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
527 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
530 if (probe_size < offset) {
534 /* read probe data */
535 buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
538 return AVERROR(ENOMEM);
541 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
542 /* fail if error was not end of file, otherwise, lower score */
543 if (ret != AVERROR_EOF) {
548 ret = 0; /* error was end of file, nothing read */
551 pd.buf = &buf[offset];
553 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
555 /* guess file format */
556 *fmt = av_probe_input_format2(&pd, 1, &score);
558 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
559 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
561 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
567 return AVERROR_INVALIDDATA;
570 /* rewind. reuse probe buffer to avoid seeking */
571 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
577 #if FF_API_FORMAT_PARAMETERS
578 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
581 AVFormatParameters *ap)
584 AVDictionary *opts = convert_format_parameters(ap);
586 if (!ap || !ap->prealloced_context)
589 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
596 /* open input file and probe the format if necessary */
597 static int init_input(AVFormatContext *s, const char *filename)
600 AVProbeData pd = {filename, NULL, 0};
603 s->flags |= AVFMT_FLAG_CUSTOM_IO;
605 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
606 else if (s->iformat->flags & AVFMT_NOFILE)
607 return AVERROR(EINVAL);
611 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
612 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
615 if ((ret = avio_open(&s->pb, filename, AVIO_FLAG_READ)) < 0)
619 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
622 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
624 AVFormatContext *s = *ps;
626 AVFormatParameters ap = { 0 };
627 AVDictionary *tmp = NULL;
629 if (!s && !(s = avformat_alloc_context()))
630 return AVERROR(ENOMEM);
635 av_dict_copy(&tmp, *options, 0);
637 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
640 if ((ret = init_input(s, filename)) < 0)
643 /* check filename in case an image number is expected */
644 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
645 if (!av_filename_number_test(filename)) {
646 ret = AVERROR(EINVAL);
651 s->duration = s->start_time = AV_NOPTS_VALUE;
652 av_strlcpy(s->filename, filename, sizeof(s->filename));
654 /* allocate private data */
655 if (s->iformat->priv_data_size > 0) {
656 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
657 ret = AVERROR(ENOMEM);
660 if (s->iformat->priv_class) {
661 *(const AVClass**)s->priv_data = s->iformat->priv_class;
662 av_opt_set_defaults(s->priv_data);
663 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
668 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
670 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
672 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
673 if ((ret = s->iformat->read_header(s, &ap)) < 0)
676 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
677 s->data_offset = avio_tell(s->pb);
679 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
682 av_dict_free(options);
690 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
692 avformat_free_context(s);
697 /*******************************************************/
699 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
700 AVPacketList **plast_pktl){
701 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
706 (*plast_pktl)->next = pktl;
708 *packet_buffer = pktl;
710 /* add the packet in the buffered packet list */
716 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
722 AVPacketList *pktl = s->raw_packet_buffer;
726 if(s->streams[pkt->stream_index]->request_probe <= 0){
727 s->raw_packet_buffer = pktl->next;
728 s->raw_packet_buffer_remaining_size += pkt->size;
735 ret= s->iformat->read_packet(s, pkt);
737 if (!pktl || ret == AVERROR(EAGAIN))
739 for (i = 0; i < s->nb_streams; i++)
740 if(s->streams[i]->request_probe > 0)
741 s->streams[i]->request_probe = -1;
745 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
746 av_packet_merge_side_data(pkt);
747 st= s->streams[pkt->stream_index];
749 switch(st->codec->codec_type){
750 case AVMEDIA_TYPE_VIDEO:
751 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
753 case AVMEDIA_TYPE_AUDIO:
754 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
756 case AVMEDIA_TYPE_SUBTITLE:
757 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
761 if(!pktl && st->request_probe <= 0)
764 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
765 s->raw_packet_buffer_remaining_size -= pkt->size;
767 if(st->request_probe>0){
768 AVProbeData *pd = &st->probe_data;
770 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
773 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
774 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
775 pd->buf_size += pkt->size;
776 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
778 end= s->raw_packet_buffer_remaining_size <= 0
779 || st->probe_packets<=0;
781 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
782 int score= set_codec_from_probe_data(s, st, pd);
783 if( (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
787 st->request_probe= -1;
788 if(st->codec->codec_id != CODEC_ID_NONE){
789 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
791 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
798 /**********************************************************/
801 * Get the number of samples of an audio frame. Return -1 on error.
803 static int get_audio_frame_size(AVCodecContext *enc, int size)
807 if(enc->codec_id == CODEC_ID_VORBIS)
810 if (enc->frame_size <= 1) {
811 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
813 if (bits_per_sample) {
814 if (enc->channels == 0)
816 frame_size = (size << 3) / (bits_per_sample * enc->channels);
818 /* used for example by ADPCM codecs */
819 if (enc->bit_rate == 0)
821 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
824 frame_size = enc->frame_size;
831 * Return the frame duration in seconds. Return 0 if not available.
833 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
834 AVCodecParserContext *pc, AVPacket *pkt)
840 switch(st->codec->codec_type) {
841 case AVMEDIA_TYPE_VIDEO:
842 if(st->time_base.num*1000LL > st->time_base.den){
843 *pnum = st->time_base.num;
844 *pden = st->time_base.den;
845 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
846 *pnum = st->codec->time_base.num;
847 *pden = st->codec->time_base.den;
848 if (pc && pc->repeat_pict) {
849 *pnum = (*pnum) * (1 + pc->repeat_pict);
851 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
852 //Thus if we have no parser in such case leave duration undefined.
853 if(st->codec->ticks_per_frame>1 && !pc){
858 case AVMEDIA_TYPE_AUDIO:
859 frame_size = get_audio_frame_size(st->codec, pkt->size);
860 if (frame_size <= 0 || st->codec->sample_rate <= 0)
863 *pden = st->codec->sample_rate;
870 static int is_intra_only(AVCodecContext *enc){
871 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
873 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
874 switch(enc->codec_id){
876 case CODEC_ID_MJPEGB:
878 case CODEC_ID_RAWVIDEO:
879 case CODEC_ID_DVVIDEO:
880 case CODEC_ID_HUFFYUV:
881 case CODEC_ID_FFVHUFF:
886 case CODEC_ID_JPEG2000:
894 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
895 int64_t dts, int64_t pts)
897 AVStream *st= s->streams[stream_index];
898 AVPacketList *pktl= s->packet_buffer;
900 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
903 st->first_dts= dts - st->cur_dts;
906 for(; pktl; pktl= pktl->next){
907 if(pktl->pkt.stream_index != stream_index)
909 //FIXME think more about this check
910 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
911 pktl->pkt.pts += st->first_dts;
913 if(pktl->pkt.dts != AV_NOPTS_VALUE)
914 pktl->pkt.dts += st->first_dts;
916 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
917 st->start_time= pktl->pkt.pts;
919 if (st->start_time == AV_NOPTS_VALUE)
920 st->start_time = pts;
923 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
925 AVPacketList *pktl= s->packet_buffer;
928 if(st->first_dts != AV_NOPTS_VALUE){
929 cur_dts= st->first_dts;
930 for(; pktl; pktl= pktl->next){
931 if(pktl->pkt.stream_index == pkt->stream_index){
932 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
934 cur_dts -= pkt->duration;
937 pktl= s->packet_buffer;
938 st->first_dts = cur_dts;
939 }else if(st->cur_dts)
942 for(; pktl; pktl= pktl->next){
943 if(pktl->pkt.stream_index != pkt->stream_index)
945 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
946 && !pktl->pkt.duration){
947 pktl->pkt.dts= cur_dts;
948 if(!st->codec->has_b_frames)
949 pktl->pkt.pts= cur_dts;
950 cur_dts += pkt->duration;
951 pktl->pkt.duration= pkt->duration;
955 if(st->first_dts == AV_NOPTS_VALUE)
956 st->cur_dts= cur_dts;
959 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
960 AVCodecParserContext *pc, AVPacket *pkt)
962 int num, den, presentation_delayed, delay, i;
965 if (s->flags & AVFMT_FLAG_NOFILLIN)
968 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
969 pkt->dts= AV_NOPTS_VALUE;
971 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
972 //FIXME Set low_delay = 0 when has_b_frames = 1
973 st->codec->has_b_frames = 1;
975 /* do we have a video B-frame ? */
976 delay= st->codec->has_b_frames;
977 presentation_delayed = 0;
979 // ignore delay caused by frame threading so that the mpeg2-without-dts
980 // warning will not trigger
981 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
982 delay -= st->codec->thread_count-1;
984 /* XXX: need has_b_frame, but cannot get it if the codec is
987 pc && pc->pict_type != AV_PICTURE_TYPE_B)
988 presentation_delayed = 1;
990 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
991 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
992 pkt->dts -= 1LL<<st->pts_wrap_bits;
995 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
996 // we take the conservative approach and discard both
997 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
998 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
999 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %Ld\n", pkt->dts);
1000 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
1003 if (pkt->duration == 0) {
1004 compute_frame_duration(&num, &den, st, pc, pkt);
1006 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1008 if(pkt->duration != 0 && s->packet_buffer)
1009 update_initial_durations(s, st, pkt);
1013 /* correct timestamps with byte offset if demuxers only have timestamps
1014 on packet boundaries */
1015 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1016 /* this will estimate bitrate based on this frame's duration and size */
1017 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1018 if(pkt->pts != AV_NOPTS_VALUE)
1020 if(pkt->dts != AV_NOPTS_VALUE)
1024 if (pc && pc->dts_sync_point >= 0) {
1025 // we have synchronization info from the parser
1026 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1028 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1029 if (pkt->dts != AV_NOPTS_VALUE) {
1030 // got DTS from the stream, update reference timestamp
1031 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1032 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1033 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1034 // compute DTS based on reference timestamp
1035 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1036 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1038 if (pc->dts_sync_point > 0)
1039 st->reference_dts = pkt->dts; // new reference
1043 /* This may be redundant, but it should not hurt. */
1044 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1045 presentation_delayed = 1;
1047 // 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);
1048 /* interpolate PTS and DTS if they are not present */
1049 //We skip H264 currently because delay and has_b_frames are not reliably set
1050 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1051 if (presentation_delayed) {
1052 /* DTS = decompression timestamp */
1053 /* PTS = presentation timestamp */
1054 if (pkt->dts == AV_NOPTS_VALUE)
1055 pkt->dts = st->last_IP_pts;
1056 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1057 if (pkt->dts == AV_NOPTS_VALUE)
1058 pkt->dts = st->cur_dts;
1060 /* this is tricky: the dts must be incremented by the duration
1061 of the frame we are displaying, i.e. the last I- or P-frame */
1062 if (st->last_IP_duration == 0)
1063 st->last_IP_duration = pkt->duration;
1064 if(pkt->dts != AV_NOPTS_VALUE)
1065 st->cur_dts = pkt->dts + st->last_IP_duration;
1066 st->last_IP_duration = pkt->duration;
1067 st->last_IP_pts= pkt->pts;
1068 /* cannot compute PTS if not present (we can compute it only
1069 by knowing the future */
1070 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1071 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1072 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1073 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1074 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1075 pkt->pts += pkt->duration;
1076 // 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);
1080 /* presentation is not delayed : PTS and DTS are the same */
1081 if(pkt->pts == AV_NOPTS_VALUE)
1082 pkt->pts = pkt->dts;
1083 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1084 if(pkt->pts == AV_NOPTS_VALUE)
1085 pkt->pts = st->cur_dts;
1086 pkt->dts = pkt->pts;
1087 if(pkt->pts != AV_NOPTS_VALUE)
1088 st->cur_dts = pkt->pts + pkt->duration;
1092 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1093 st->pts_buffer[0]= pkt->pts;
1094 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1095 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1096 if(pkt->dts == AV_NOPTS_VALUE)
1097 pkt->dts= st->pts_buffer[0];
1098 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1099 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1101 if(pkt->dts > st->cur_dts)
1102 st->cur_dts = pkt->dts;
1105 // 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);
1108 if(is_intra_only(st->codec))
1109 pkt->flags |= AV_PKT_FLAG_KEY;
1112 /* keyframe computation */
1113 if (pc->key_frame == 1)
1114 pkt->flags |= AV_PKT_FLAG_KEY;
1115 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1116 pkt->flags |= AV_PKT_FLAG_KEY;
1119 pkt->convergence_duration = pc->convergence_duration;
1123 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1128 av_init_packet(pkt);
1131 /* select current input stream component */
1134 if (!st->need_parsing || !st->parser) {
1135 /* no parsing needed: we just output the packet as is */
1136 /* raw data support */
1138 st->cur_pkt.data= NULL;
1139 st->cur_pkt.side_data_elems = 0;
1140 st->cur_pkt.side_data = NULL;
1141 compute_pkt_fields(s, st, NULL, pkt);
1143 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1144 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1145 ff_reduce_index(s, st->index);
1146 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1149 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1150 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1151 st->cur_ptr, st->cur_len,
1152 st->cur_pkt.pts, st->cur_pkt.dts,
1154 st->cur_pkt.pts = AV_NOPTS_VALUE;
1155 st->cur_pkt.dts = AV_NOPTS_VALUE;
1156 /* increment read pointer */
1160 /* return packet if any */
1164 pkt->stream_index = st->index;
1165 pkt->pts = st->parser->pts;
1166 pkt->dts = st->parser->dts;
1167 pkt->pos = st->parser->pos;
1168 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1170 pkt->destruct= st->cur_pkt.destruct;
1171 st->cur_pkt.destruct= NULL;
1172 st->cur_pkt.data = NULL;
1173 assert(st->cur_len == 0);
1175 pkt->destruct = NULL;
1177 compute_pkt_fields(s, st, st->parser, pkt);
1179 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1180 int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
1181 ff_reduce_index(s, st->index);
1182 av_add_index_entry(st, pos, pkt->dts,
1183 0, 0, AVINDEX_KEYFRAME);
1190 av_free_packet(&st->cur_pkt);
1195 /* read next packet */
1196 ret = av_read_packet(s, &cur_pkt);
1198 if (ret == AVERROR(EAGAIN))
1200 /* return the last frames, if any */
1201 for(i = 0; i < s->nb_streams; i++) {
1203 if (st->parser && st->need_parsing) {
1204 av_parser_parse2(st->parser, st->codec,
1205 &pkt->data, &pkt->size,
1207 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1213 /* no more packets: really terminate parsing */
1216 st = s->streams[cur_pkt.stream_index];
1217 st->cur_pkt= cur_pkt;
1219 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1220 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1221 st->cur_pkt.pts < st->cur_pkt.dts){
1222 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1223 st->cur_pkt.stream_index,
1227 // av_free_packet(&st->cur_pkt);
1231 if(s->debug & FF_FDEBUG_TS)
1232 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1233 st->cur_pkt.stream_index,
1237 st->cur_pkt.duration,
1241 st->cur_ptr = st->cur_pkt.data;
1242 st->cur_len = st->cur_pkt.size;
1243 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1244 st->parser = av_parser_init(st->codec->codec_id);
1246 /* no parser available: just output the raw packets */
1247 st->need_parsing = AVSTREAM_PARSE_NONE;
1248 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1249 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1250 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1251 st->parser->flags |= PARSER_FLAG_ONCE;
1256 if(s->debug & FF_FDEBUG_TS)
1257 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1268 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1272 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1275 pktl = s->packet_buffer;
1277 AVPacket *next_pkt= &pktl->pkt;
1279 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1280 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1281 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1282 if( pktl->pkt.stream_index == next_pkt->stream_index
1283 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1284 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1285 next_pkt->pts= pktl->pkt.dts;
1289 pktl = s->packet_buffer;
1292 if( next_pkt->pts != AV_NOPTS_VALUE
1293 || next_pkt->dts == AV_NOPTS_VALUE
1295 /* read packet from packet buffer, if there is data */
1297 s->packet_buffer = pktl->next;
1303 int ret= av_read_frame_internal(s, pkt);
1305 if(pktl && ret != AVERROR(EAGAIN)){
1312 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1313 &s->packet_buffer_end)) < 0)
1314 return AVERROR(ENOMEM);
1316 assert(!s->packet_buffer);
1317 return av_read_frame_internal(s, pkt);
1322 /* XXX: suppress the packet queue */
1323 static void flush_packet_queue(AVFormatContext *s)
1328 pktl = s->packet_buffer;
1331 s->packet_buffer = pktl->next;
1332 av_free_packet(&pktl->pkt);
1335 while(s->raw_packet_buffer){
1336 pktl = s->raw_packet_buffer;
1337 s->raw_packet_buffer = pktl->next;
1338 av_free_packet(&pktl->pkt);
1341 s->packet_buffer_end=
1342 s->raw_packet_buffer_end= NULL;
1343 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1346 /*******************************************************/
1349 int av_find_default_stream_index(AVFormatContext *s)
1351 int first_audio_index = -1;
1355 if (s->nb_streams <= 0)
1357 for(i = 0; i < s->nb_streams; i++) {
1359 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1362 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1363 first_audio_index = i;
1365 return first_audio_index >= 0 ? first_audio_index : 0;
1369 * Flush the frame reader.
1371 void ff_read_frame_flush(AVFormatContext *s)
1376 flush_packet_queue(s);
1380 /* for each stream, reset read state */
1381 for(i = 0; i < s->nb_streams; i++) {
1385 av_parser_close(st->parser);
1387 av_free_packet(&st->cur_pkt);
1389 st->last_IP_pts = AV_NOPTS_VALUE;
1390 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1391 st->reference_dts = AV_NOPTS_VALUE;
1396 st->probe_packets = MAX_PROBE_PACKETS;
1398 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1399 st->pts_buffer[j]= AV_NOPTS_VALUE;
1403 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1406 for(i = 0; i < s->nb_streams; i++) {
1407 AVStream *st = s->streams[i];
1409 st->cur_dts = av_rescale(timestamp,
1410 st->time_base.den * (int64_t)ref_st->time_base.num,
1411 st->time_base.num * (int64_t)ref_st->time_base.den);
1415 void ff_reduce_index(AVFormatContext *s, int stream_index)
1417 AVStream *st= s->streams[stream_index];
1418 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1420 if((unsigned)st->nb_index_entries >= max_entries){
1422 for(i=0; 2*i<st->nb_index_entries; i++)
1423 st->index_entries[i]= st->index_entries[2*i];
1424 st->nb_index_entries= i;
1428 int ff_add_index_entry(AVIndexEntry **index_entries,
1429 int *nb_index_entries,
1430 unsigned int *index_entries_allocated_size,
1431 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1433 AVIndexEntry *entries, *ie;
1436 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1439 entries = av_fast_realloc(*index_entries,
1440 index_entries_allocated_size,
1441 (*nb_index_entries + 1) *
1442 sizeof(AVIndexEntry));
1446 *index_entries= entries;
1448 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1451 index= (*nb_index_entries)++;
1452 ie= &entries[index];
1453 assert(index==0 || ie[-1].timestamp < timestamp);
1455 ie= &entries[index];
1456 if(ie->timestamp != timestamp){
1457 if(ie->timestamp <= timestamp)
1459 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1460 (*nb_index_entries)++;
1461 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1462 distance= ie->min_distance;
1466 ie->timestamp = timestamp;
1467 ie->min_distance= distance;
1474 int av_add_index_entry(AVStream *st,
1475 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1477 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1478 &st->index_entries_allocated_size, pos,
1479 timestamp, size, distance, flags);
1482 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1483 int64_t wanted_timestamp, int flags)
1491 //optimize appending index entries at the end
1492 if(b && entries[b-1].timestamp < wanted_timestamp)
1497 timestamp = entries[m].timestamp;
1498 if(timestamp >= wanted_timestamp)
1500 if(timestamp <= wanted_timestamp)
1503 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1505 if(!(flags & AVSEEK_FLAG_ANY)){
1506 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1507 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1516 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1519 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1520 wanted_timestamp, flags);
1523 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1524 AVInputFormat *avif= s->iformat;
1525 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1526 int64_t ts_min, ts_max, ts;
1531 if (stream_index < 0)
1534 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1537 ts_min= AV_NOPTS_VALUE;
1538 pos_limit= -1; //gcc falsely says it may be uninitialized
1540 st= s->streams[stream_index];
1541 if(st->index_entries){
1544 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()
1545 index= FFMAX(index, 0);
1546 e= &st->index_entries[index];
1548 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1550 ts_min= e->timestamp;
1551 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1557 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1558 assert(index < st->nb_index_entries);
1560 e= &st->index_entries[index];
1561 assert(e->timestamp >= target_ts);
1563 ts_max= e->timestamp;
1564 pos_limit= pos_max - e->min_distance;
1565 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1566 pos_max,pos_limit, ts_max);
1570 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1575 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1578 av_update_cur_dts(s, st, ts);
1583 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 )){
1585 int64_t start_pos, filesize;
1588 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1590 if(ts_min == AV_NOPTS_VALUE){
1591 pos_min = s->data_offset;
1592 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1593 if (ts_min == AV_NOPTS_VALUE)
1597 if(ts_max == AV_NOPTS_VALUE){
1599 filesize = avio_size(s->pb);
1600 pos_max = filesize - 1;
1603 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1605 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1606 if (ts_max == AV_NOPTS_VALUE)
1610 int64_t tmp_pos= pos_max + 1;
1611 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1612 if(tmp_ts == AV_NOPTS_VALUE)
1616 if(tmp_pos >= filesize)
1622 if(ts_min > ts_max){
1624 }else if(ts_min == ts_max){
1629 while (pos_min < pos_limit) {
1630 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1631 pos_min, pos_max, ts_min, ts_max);
1632 assert(pos_limit <= pos_max);
1635 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1636 // interpolate position (better than dichotomy)
1637 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1638 + pos_min - approximate_keyframe_distance;
1639 }else if(no_change==1){
1640 // bisection, if interpolation failed to change min or max pos last time
1641 pos = (pos_min + pos_limit)>>1;
1643 /* linear search if bisection failed, can only happen if there
1644 are very few or no keyframes between min/max */
1649 else if(pos > pos_limit)
1653 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1658 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1659 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1660 pos_limit, start_pos, no_change);
1661 if(ts == AV_NOPTS_VALUE){
1662 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1665 assert(ts != AV_NOPTS_VALUE);
1666 if (target_ts <= ts) {
1667 pos_limit = start_pos - 1;
1671 if (target_ts >= ts) {
1677 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1678 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1680 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1682 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1683 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1684 pos, ts_min, target_ts, ts_max);
1689 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1690 int64_t pos_min, pos_max;
1694 if (stream_index < 0)
1697 st= s->streams[stream_index];
1700 pos_min = s->data_offset;
1701 pos_max = avio_size(s->pb) - 1;
1703 if (pos < pos_min) pos= pos_min;
1704 else if(pos > pos_max) pos= pos_max;
1706 avio_seek(s->pb, pos, SEEK_SET);
1709 av_update_cur_dts(s, st, ts);
1714 static int av_seek_frame_generic(AVFormatContext *s,
1715 int stream_index, int64_t timestamp, int flags)
1722 st = s->streams[stream_index];
1724 index = av_index_search_timestamp(st, timestamp, flags);
1726 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1729 if(index < 0 || index==st->nb_index_entries-1){
1733 if(st->nb_index_entries){
1734 assert(st->index_entries);
1735 ie= &st->index_entries[st->nb_index_entries-1];
1736 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1738 av_update_cur_dts(s, st, ie->timestamp);
1740 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1746 ret = av_read_frame(s, &pkt);
1747 }while(ret == AVERROR(EAGAIN));
1750 av_free_packet(&pkt);
1751 if(stream_index == pkt.stream_index){
1752 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1756 index = av_index_search_timestamp(st, timestamp, flags);
1761 ff_read_frame_flush(s);
1762 if (s->iformat->read_seek){
1763 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1766 ie = &st->index_entries[index];
1767 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1769 av_update_cur_dts(s, st, ie->timestamp);
1774 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1779 ff_read_frame_flush(s);
1781 if(flags & AVSEEK_FLAG_BYTE)
1782 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1784 if(stream_index < 0){
1785 stream_index= av_find_default_stream_index(s);
1786 if(stream_index < 0)
1789 st= s->streams[stream_index];
1790 /* timestamp for default must be expressed in AV_TIME_BASE units */
1791 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1794 /* first, we try the format specific seek */
1795 if (s->iformat->read_seek)
1796 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1803 if(s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH))
1804 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1805 else if (!(s->iformat->flags & AVFMT_NOGENSEARCH))
1806 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1811 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1813 if(min_ts > ts || max_ts < ts)
1816 ff_read_frame_flush(s);
1818 if (s->iformat->read_seek2)
1819 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1821 if(s->iformat->read_timestamp){
1822 //try to seek via read_timestamp()
1825 //Fallback to old API if new is not implemented but old is
1826 //Note the old has somewat different sematics
1827 if(s->iformat->read_seek || 1)
1828 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1830 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1833 /*******************************************************/
1836 * Return TRUE if the stream has accurate duration in any stream.
1838 * @return TRUE if the stream has accurate duration for at least one component.
1840 static int av_has_duration(AVFormatContext *ic)
1845 for(i = 0;i < ic->nb_streams; i++) {
1846 st = ic->streams[i];
1847 if (st->duration != AV_NOPTS_VALUE)
1854 * Estimate the stream timings from the one of each components.
1856 * Also computes the global bitrate if possible.
1858 static void av_update_stream_timings(AVFormatContext *ic)
1860 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1861 int64_t duration, duration1;
1865 start_time = INT64_MAX;
1866 start_time_text = INT64_MAX;
1867 end_time = INT64_MIN;
1868 duration = INT64_MIN;
1869 for(i = 0;i < ic->nb_streams; i++) {
1870 st = ic->streams[i];
1871 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1872 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1873 if (st->codec->codec_id == CODEC_ID_DVB_TELETEXT) {
1874 if (start_time1 < start_time_text)
1875 start_time_text = start_time1;
1877 if (start_time1 < start_time)
1878 start_time = start_time1;
1879 if (st->duration != AV_NOPTS_VALUE) {
1880 end_time1 = start_time1
1881 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1882 if (end_time1 > end_time)
1883 end_time = end_time1;
1886 if (st->duration != AV_NOPTS_VALUE) {
1887 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1888 if (duration1 > duration)
1889 duration = duration1;
1892 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
1893 start_time = start_time_text;
1894 if (start_time != INT64_MAX) {
1895 ic->start_time = start_time;
1896 if (end_time != INT64_MIN) {
1897 if (end_time - start_time > duration)
1898 duration = end_time - start_time;
1901 if (duration != INT64_MIN) {
1902 ic->duration = duration;
1903 if (ic->file_size > 0) {
1904 /* compute the bitrate */
1905 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1906 (double)ic->duration;
1911 static void fill_all_stream_timings(AVFormatContext *ic)
1916 av_update_stream_timings(ic);
1917 for(i = 0;i < ic->nb_streams; i++) {
1918 st = ic->streams[i];
1919 if (st->start_time == AV_NOPTS_VALUE) {
1920 if(ic->start_time != AV_NOPTS_VALUE)
1921 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1922 if(ic->duration != AV_NOPTS_VALUE)
1923 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1928 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1930 int64_t filesize, duration;
1934 /* if bit_rate is already set, we believe it */
1935 if (ic->bit_rate <= 0) {
1937 for(i=0;i<ic->nb_streams;i++) {
1938 st = ic->streams[i];
1939 if (st->codec->bit_rate > 0)
1940 bit_rate += st->codec->bit_rate;
1942 ic->bit_rate = bit_rate;
1945 /* if duration is already set, we believe it */
1946 if (ic->duration == AV_NOPTS_VALUE &&
1947 ic->bit_rate != 0 &&
1948 ic->file_size != 0) {
1949 filesize = ic->file_size;
1951 for(i = 0; i < ic->nb_streams; i++) {
1952 st = ic->streams[i];
1953 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1954 if (st->duration == AV_NOPTS_VALUE)
1955 st->duration = duration;
1961 #define DURATION_MAX_READ_SIZE 250000
1962 #define DURATION_MAX_RETRY 3
1964 /* only usable for MPEG-PS streams */
1965 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1967 AVPacket pkt1, *pkt = &pkt1;
1969 int read_size, i, ret;
1971 int64_t filesize, offset, duration;
1976 /* flush packet queue */
1977 flush_packet_queue(ic);
1979 for (i=0; i<ic->nb_streams; i++) {
1980 st = ic->streams[i];
1981 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1982 av_log(st->codec, AV_LOG_WARNING, "start time is not set in av_estimate_timings_from_pts\n");
1985 av_parser_close(st->parser);
1987 av_free_packet(&st->cur_pkt);
1991 /* estimate the end time (duration) */
1992 /* XXX: may need to support wrapping */
1993 filesize = ic->file_size;
1994 end_time = AV_NOPTS_VALUE;
1996 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2000 avio_seek(ic->pb, offset, SEEK_SET);
2003 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2007 ret = av_read_packet(ic, pkt);
2008 }while(ret == AVERROR(EAGAIN));
2011 read_size += pkt->size;
2012 st = ic->streams[pkt->stream_index];
2013 if (pkt->pts != AV_NOPTS_VALUE &&
2014 (st->start_time != AV_NOPTS_VALUE ||
2015 st->first_dts != AV_NOPTS_VALUE)) {
2016 duration = end_time = pkt->pts;
2017 if (st->start_time != AV_NOPTS_VALUE) duration -= st->start_time;
2018 else duration -= st->first_dts;
2020 duration += 1LL<<st->pts_wrap_bits;
2022 if (st->duration == AV_NOPTS_VALUE ||
2023 st->duration < duration)
2024 st->duration = duration;
2027 av_free_packet(pkt);
2029 }while( end_time==AV_NOPTS_VALUE
2030 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2031 && ++retry <= DURATION_MAX_RETRY);
2033 fill_all_stream_timings(ic);
2035 avio_seek(ic->pb, old_offset, SEEK_SET);
2036 for (i=0; i<ic->nb_streams; i++) {
2038 st->cur_dts= st->first_dts;
2039 st->last_IP_pts = AV_NOPTS_VALUE;
2040 st->reference_dts = AV_NOPTS_VALUE;
2044 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
2048 /* get the file size, if possible */
2049 if (ic->iformat->flags & AVFMT_NOFILE) {
2052 file_size = avio_size(ic->pb);
2056 ic->file_size = file_size;
2058 if ((!strcmp(ic->iformat->name, "mpeg") ||
2059 !strcmp(ic->iformat->name, "mpegts")) &&
2060 file_size && ic->pb->seekable) {
2061 /* get accurate estimate from the PTSes */
2062 av_estimate_timings_from_pts(ic, old_offset);
2063 } else if (av_has_duration(ic)) {
2064 /* at least one component has timings - we use them for all
2066 fill_all_stream_timings(ic);
2068 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2069 /* less precise: use bitrate info */
2070 av_estimate_timings_from_bit_rate(ic);
2072 av_update_stream_timings(ic);
2077 AVStream av_unused *st;
2078 for(i = 0;i < ic->nb_streams; i++) {
2079 st = ic->streams[i];
2080 printf("%d: start_time: %0.3f duration: %0.3f\n",
2081 i, (double)st->start_time / AV_TIME_BASE,
2082 (double)st->duration / AV_TIME_BASE);
2084 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2085 (double)ic->start_time / AV_TIME_BASE,
2086 (double)ic->duration / AV_TIME_BASE,
2087 ic->bit_rate / 1000);
2092 static int has_codec_parameters(AVCodecContext *enc)
2095 switch(enc->codec_type) {
2096 case AVMEDIA_TYPE_AUDIO:
2097 val = enc->sample_rate && enc->channels && enc->sample_fmt != AV_SAMPLE_FMT_NONE;
2098 if(!enc->frame_size &&
2099 (enc->codec_id == CODEC_ID_VORBIS ||
2100 enc->codec_id == CODEC_ID_AAC ||
2101 enc->codec_id == CODEC_ID_MP1 ||
2102 enc->codec_id == CODEC_ID_MP2 ||
2103 enc->codec_id == CODEC_ID_MP3 ||
2104 enc->codec_id == CODEC_ID_SPEEX ||
2105 enc->codec_id == CODEC_ID_CELT))
2108 case AVMEDIA_TYPE_VIDEO:
2109 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
2115 return enc->codec_id != CODEC_ID_NONE && val != 0;
2118 static int has_decode_delay_been_guessed(AVStream *st)
2120 return st->codec->codec_id != CODEC_ID_H264 ||
2121 st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2124 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
2128 int got_picture, data_size, ret=0;
2131 if(!st->codec->codec){
2132 codec = avcodec_find_decoder(st->codec->codec_id);
2135 ret = avcodec_open(st->codec, codec);
2140 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st)){
2141 switch(st->codec->codec_type) {
2142 case AVMEDIA_TYPE_VIDEO:
2143 avcodec_get_frame_defaults(&picture);
2144 ret = avcodec_decode_video2(st->codec, &picture,
2145 &got_picture, avpkt);
2147 case AVMEDIA_TYPE_AUDIO:
2148 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2149 samples = av_malloc(data_size);
2152 ret = avcodec_decode_audio3(st->codec, samples,
2164 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2166 while (tags->id != CODEC_ID_NONE) {
2174 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2177 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2178 if(tag == tags[i].tag)
2181 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2182 if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2185 return CODEC_ID_NONE;
2188 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2191 for(i=0; tags && tags[i]; i++){
2192 int tag= ff_codec_get_tag(tags[i], id);
2198 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2201 for(i=0; tags && tags[i]; i++){
2202 enum CodecID id= ff_codec_get_id(tags[i], tag);
2203 if(id!=CODEC_ID_NONE) return id;
2205 return CODEC_ID_NONE;
2208 static void compute_chapters_end(AVFormatContext *s)
2211 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2213 for (i = 0; i < s->nb_chapters; i++)
2214 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2215 AVChapter *ch = s->chapters[i];
2216 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2219 for (j = 0; j < s->nb_chapters; j++) {
2220 AVChapter *ch1 = s->chapters[j];
2221 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2222 if (j != i && next_start > ch->start && next_start < end)
2225 ch->end = (end == INT64_MAX) ? ch->start : end;
2229 static int get_std_framerate(int i){
2230 if(i<60*12) return i*1001;
2231 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2235 * Is the time base unreliable.
2236 * This is a heuristic to balance between quick acceptance of the values in
2237 * the headers vs. some extra checks.
2238 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2239 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2240 * And there are "variable" fps files this needs to detect as well.
2242 static int tb_unreliable(AVCodecContext *c){
2243 if( c->time_base.den >= 101L*c->time_base.num
2244 || c->time_base.den < 5L*c->time_base.num
2245 /* || c->codec_tag == AV_RL32("DIVX")
2246 || c->codec_tag == AV_RL32("XVID")*/
2247 || c->codec_id == CODEC_ID_MPEG2VIDEO
2248 || c->codec_id == CODEC_ID_H264
2254 int av_find_stream_info(AVFormatContext *ic)
2256 int i, count, ret, read_size, j;
2258 AVPacket pkt1, *pkt;
2259 int64_t old_offset = avio_tell(ic->pb);
2261 for(i=0;i<ic->nb_streams;i++) {
2263 st = ic->streams[i];
2264 #if 0 /*fix bug. m4a(aac) file's samperate,channel, frame_size is 0*/
2265 if (st->codec->codec_id == CODEC_ID_AAC) {
2266 st->codec->sample_rate = 0;
2267 st->codec->frame_size = 0;
2268 st->codec->channels = 0;
2271 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2272 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2273 /* if(!st->time_base.num)
2275 if(!st->codec->time_base.num)
2276 st->codec->time_base= st->time_base;
2278 //only for the split stuff
2279 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2280 st->parser = av_parser_init(st->codec->codec_id);
2281 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2282 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2285 assert(!st->codec->codec);
2286 codec = avcodec_find_decoder(st->codec->codec_id);
2288 /* Force decoding of at least one frame of codec data
2289 * this makes sure the codec initializes the channel configuration
2290 * and does not trust the values from the container.
2292 if (codec && codec->capabilities & CODEC_CAP_CHANNEL_CONF)
2293 st->codec->channels = 0;
2295 /* Ensure that subtitle_header is properly set. */
2296 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2297 && codec && !st->codec->codec)
2298 avcodec_open(st->codec, codec);
2300 //try to just open decoders, in case this is enough to get parameters
2301 if(!has_codec_parameters(st->codec)){
2302 if (codec && !st->codec->codec)
2303 avcodec_open(st->codec, codec);
2307 for (i=0; i<ic->nb_streams; i++) {
2308 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2314 if(url_interrupt_cb()){
2316 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2320 /* check if one codec still needs to be handled */
2321 for(i=0;i<ic->nb_streams;i++) {
2322 int fps_analyze_framecount = 20;
2324 st = ic->streams[i];
2325 if (!has_codec_parameters(st->codec))
2327 /* if the timebase is coarse (like the usual millisecond precision
2328 of mkv), we need to analyze more frames to reliably arrive at
2330 if (av_q2d(st->time_base) > 0.0005)
2331 fps_analyze_framecount *= 2;
2332 if (ic->fps_probe_size >= 0)
2333 fps_analyze_framecount = ic->fps_probe_size;
2334 /* variable fps and no guess at the real fps */
2335 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2336 && st->info->duration_count < fps_analyze_framecount
2337 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2339 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2341 if(st->first_dts == AV_NOPTS_VALUE)
2344 if (i == ic->nb_streams) {
2345 /* NOTE: if the format has no header, then we need to read
2346 some packets to get most of the streams, so we cannot
2348 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2349 /* if we found the info for all the codecs, we can stop */
2351 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2355 /* we did not get all the codec info, but we read too much data */
2356 if (read_size >= ic->probesize) {
2358 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2362 /* NOTE: a new stream can be added there if no header in file
2363 (AVFMTCTX_NOHEADER) */
2364 ret = av_read_frame_internal(ic, &pkt1);
2367 this function return error for some m4a(aac) and ogg file's. so, break here*/
2368 if(st->codec->codec_id == CODEC_ID_AAC || st->codec->codec_id == CODEC_ID_VORBIS)
2371 if (ret < 0 && ret != AVERROR(EAGAIN)) {
2373 ret = -1; /* we could not have all the codec parameters before EOF */
2374 for(i=0;i<ic->nb_streams;i++) {
2375 st = ic->streams[i];
2376 if (!has_codec_parameters(st->codec)){
2378 avcodec_string(buf, sizeof(buf), st->codec, 0);
2379 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2387 if (ret == AVERROR(EAGAIN))
2390 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2391 if ((ret = av_dup_packet(pkt)) < 0)
2392 goto find_stream_info_err;
2394 read_size += pkt->size;
2396 st = ic->streams[pkt->stream_index];
2397 if (st->codec_info_nb_frames>1) {
2399 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) {
2400 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2403 st->info->codec_info_duration += pkt->duration;
2406 int64_t last = st->info->last_dts;
2407 int64_t duration= pkt->dts - last;
2409 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2410 double dur= duration * av_q2d(st->time_base);
2412 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2413 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2414 if (st->info->duration_count < 2)
2415 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2416 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2417 int framerate= get_std_framerate(i);
2418 int ticks= lrintf(dur*framerate/(1001*12));
2419 double error= dur - ticks*1001*12/(double)framerate;
2420 st->info->duration_error[i] += error*error;
2422 st->info->duration_count++;
2423 // ignore the first 4 values, they might have some random jitter
2424 if (st->info->duration_count > 3)
2425 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2427 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2428 st->info->last_dts = pkt->dts;
2430 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2431 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2433 st->codec->extradata_size= i;
2434 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2435 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2436 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2440 /* if still no information, we try to open the codec and to
2441 decompress the frame. We try to avoid that in most cases as
2442 it takes longer and uses more memory. For MPEG-4, we need to
2443 decompress for QuickTime. */
2444 if (!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st))
2445 try_decode_frame(st, pkt);
2447 st->codec_info_nb_frames++;
2451 // close codecs which were opened in try_decode_frame()
2452 for(i=0;i<ic->nb_streams;i++) {
2453 st = ic->streams[i];
2454 if(st->codec->codec)
2455 avcodec_close(st->codec);
2457 for(i=0;i<ic->nb_streams;i++) {
2458 st = ic->streams[i];
2459 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2460 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2461 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2462 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2463 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2464 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2465 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2466 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2467 st->codec->codec_tag= tag;
2470 // the check for tb_unreliable() is not completely correct, since this is not about handling
2471 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2472 // ipmovie.c produces.
2473 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)
2474 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);
2475 if (st->info->duration_count && !st->r_frame_rate.num
2476 && tb_unreliable(st->codec) /*&&
2477 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2478 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2480 double best_error= 2*av_q2d(st->time_base);
2481 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2483 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2484 double error = st->info->duration_error[j] * get_std_framerate(j);
2485 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2486 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2487 if(error < best_error){
2489 num = get_std_framerate(j);
2492 // do not increase frame rate by more than 1 % in order to match a standard rate.
2493 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2494 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2497 if (!st->r_frame_rate.num){
2498 if( st->codec->time_base.den * (int64_t)st->time_base.num
2499 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2500 st->r_frame_rate.num = st->codec->time_base.den;
2501 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2503 st->r_frame_rate.num = st->time_base.den;
2504 st->r_frame_rate.den = st->time_base.num;
2507 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2508 if(!st->codec->bits_per_coded_sample)
2509 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2510 // set stream disposition based on audio service type
2511 switch (st->codec->audio_service_type) {
2512 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2513 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2514 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2515 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2516 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2517 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2518 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2519 st->disposition = AV_DISPOSITION_COMMENT; break;
2520 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2521 st->disposition = AV_DISPOSITION_KARAOKE; break;
2526 av_estimate_timings(ic, old_offset);
2528 compute_chapters_end(ic);
2531 /* correct DTS for B-frame streams with no timestamps */
2532 for(i=0;i<ic->nb_streams;i++) {
2533 st = ic->streams[i];
2534 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2536 ppktl = &ic->packet_buffer;
2538 if(ppkt1->stream_index != i)
2540 if(ppkt1->pkt->dts < 0)
2542 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2544 ppkt1->pkt->dts -= delta;
2549 st->cur_dts -= delta;
2555 find_stream_info_err:
2556 for (i=0; i < ic->nb_streams; i++)
2557 av_freep(&ic->streams[i]->info);
2561 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2565 for (i = 0; i < ic->nb_programs; i++)
2566 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2567 if (ic->programs[i]->stream_index[j] == s)
2568 return ic->programs[i];
2572 int av_find_best_stream(AVFormatContext *ic,
2573 enum AVMediaType type,
2574 int wanted_stream_nb,
2576 AVCodec **decoder_ret,
2579 int i, nb_streams = ic->nb_streams;
2580 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2581 unsigned *program = NULL;
2582 AVCodec *decoder = NULL, *best_decoder = NULL;
2584 if (related_stream >= 0 && wanted_stream_nb < 0) {
2585 AVProgram *p = find_program_from_stream(ic, related_stream);
2587 program = p->stream_index;
2588 nb_streams = p->nb_stream_indexes;
2591 for (i = 0; i < nb_streams; i++) {
2592 int real_stream_index = program ? program[i] : i;
2593 AVStream *st = ic->streams[real_stream_index];
2594 AVCodecContext *avctx = st->codec;
2595 if (avctx->codec_type != type)
2597 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2599 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2602 decoder = avcodec_find_decoder(st->codec->codec_id);
2605 ret = AVERROR_DECODER_NOT_FOUND;
2609 if (best_count >= st->codec_info_nb_frames)
2611 best_count = st->codec_info_nb_frames;
2612 ret = real_stream_index;
2613 best_decoder = decoder;
2614 if (program && i == nb_streams - 1 && ret < 0) {
2616 nb_streams = ic->nb_streams;
2617 i = 0; /* no related stream found, try again with everything */
2621 *decoder_ret = best_decoder;
2625 /*******************************************************/
2627 int av_read_play(AVFormatContext *s)
2629 if (s->iformat->read_play)
2630 return s->iformat->read_play(s);
2632 return avio_pause(s->pb, 0);
2633 return AVERROR(ENOSYS);
2636 int av_read_pause(AVFormatContext *s)
2638 if (s->iformat->read_pause)
2639 return s->iformat->read_pause(s);
2641 return avio_pause(s->pb, 1);
2642 return AVERROR(ENOSYS);
2645 void av_close_input_stream(AVFormatContext *s)
2647 flush_packet_queue(s);
2648 if (s->iformat->read_close)
2649 s->iformat->read_close(s);
2650 avformat_free_context(s);
2653 void avformat_free_context(AVFormatContext *s)
2659 if (s->iformat && s->iformat->priv_class && s->priv_data)
2660 av_opt_free(s->priv_data);
2662 for(i=0;i<s->nb_streams;i++) {
2663 /* free all data in a stream component */
2666 av_parser_close(st->parser);
2667 av_free_packet(&st->cur_pkt);
2669 av_dict_free(&st->metadata);
2670 av_freep(&st->index_entries);
2671 av_freep(&st->codec->extradata);
2672 av_freep(&st->codec->subtitle_header);
2673 av_freep(&st->codec);
2674 av_freep(&st->priv_data);
2675 av_freep(&st->info);
2678 for(i=s->nb_programs-1; i>=0; i--) {
2679 av_dict_free(&s->programs[i]->metadata);
2680 av_freep(&s->programs[i]->stream_index);
2681 av_freep(&s->programs[i]);
2683 av_freep(&s->programs);
2684 av_freep(&s->priv_data);
2685 while(s->nb_chapters--) {
2686 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2687 av_freep(&s->chapters[s->nb_chapters]);
2689 av_freep(&s->chapters);
2690 av_dict_free(&s->metadata);
2691 av_freep(&s->streams);
2695 void av_close_input_file(AVFormatContext *s)
2697 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2699 av_close_input_stream(s);
2704 AVStream *av_new_stream(AVFormatContext *s, int id)
2710 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2712 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2715 s->streams = streams;
2717 st = av_mallocz(sizeof(AVStream));
2720 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2725 st->codec= avcodec_alloc_context();
2727 /* no default bitrate if decoding */
2728 st->codec->bit_rate = 0;
2730 st->index = s->nb_streams;
2732 st->start_time = AV_NOPTS_VALUE;
2733 st->duration = AV_NOPTS_VALUE;
2734 /* we set the current DTS to 0 so that formats without any timestamps
2735 but durations get some timestamps, formats with some unknown
2736 timestamps have their first few packets buffered and the
2737 timestamps corrected before they are returned to the user */
2739 st->first_dts = AV_NOPTS_VALUE;
2740 st->probe_packets = MAX_PROBE_PACKETS;
2742 /* default pts setting is MPEG-like */
2743 av_set_pts_info(st, 33, 1, 90000);
2744 st->last_IP_pts = AV_NOPTS_VALUE;
2745 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2746 st->pts_buffer[i]= AV_NOPTS_VALUE;
2747 st->reference_dts = AV_NOPTS_VALUE;
2749 st->sample_aspect_ratio = (AVRational){0,1};
2751 s->streams[s->nb_streams++] = st;
2755 AVProgram *av_new_program(AVFormatContext *ac, int id)
2757 AVProgram *program=NULL;
2760 av_dlog(ac, "new_program: id=0x%04x\n", id);
2762 for(i=0; i<ac->nb_programs; i++)
2763 if(ac->programs[i]->id == id)
2764 program = ac->programs[i];
2767 program = av_mallocz(sizeof(AVProgram));
2770 dynarray_add(&ac->programs, &ac->nb_programs, program);
2771 program->discard = AVDISCARD_NONE;
2778 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2780 AVChapter *chapter = NULL;
2783 for(i=0; i<s->nb_chapters; i++)
2784 if(s->chapters[i]->id == id)
2785 chapter = s->chapters[i];
2788 chapter= av_mallocz(sizeof(AVChapter));
2791 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2793 av_dict_set(&chapter->metadata, "title", title, 0);
2795 chapter->time_base= time_base;
2796 chapter->start = start;
2802 /************************************************************/
2803 /* output media file */
2805 #if FF_API_FORMAT_PARAMETERS
2806 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2808 if (s->oformat->priv_data_size > 0) {
2809 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2811 return AVERROR(ENOMEM);
2812 if (s->oformat->priv_class) {
2813 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2814 av_opt_set_defaults(s->priv_data);
2817 s->priv_data = NULL;
2823 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
2824 const char *format, const char *filename)
2826 AVFormatContext *s = avformat_alloc_context();
2835 oformat = av_guess_format(format, NULL, NULL);
2837 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
2838 ret = AVERROR(EINVAL);
2842 oformat = av_guess_format(NULL, filename, NULL);
2844 ret = AVERROR(EINVAL);
2845 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
2852 s->oformat = oformat;
2853 if (s->oformat->priv_data_size > 0) {
2854 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2857 if (s->oformat->priv_class) {
2858 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2859 av_opt_set_defaults(s->priv_data);
2862 s->priv_data = NULL;
2865 av_strlcpy(s->filename, filename, sizeof(s->filename));
2869 av_log(s, AV_LOG_ERROR, "Out of memory\n");
2870 ret = AVERROR(ENOMEM);
2872 avformat_free_context(s);
2876 #if FF_API_ALLOC_OUTPUT_CONTEXT
2877 AVFormatContext *avformat_alloc_output_context(const char *format,
2878 AVOutputFormat *oformat, const char *filename)
2880 AVFormatContext *avctx;
2881 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
2882 return ret < 0 ? NULL : avctx;
2886 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2888 const AVCodecTag *avctag;
2890 enum CodecID id = CODEC_ID_NONE;
2891 unsigned int tag = 0;
2894 * Check that tag + id is in the table
2895 * If neither is in the table -> OK
2896 * If tag is in the table with another id -> FAIL
2897 * If id is in the table with another tag -> FAIL unless strict < normal
2899 for (n = 0; s->oformat->codec_tag[n]; n++) {
2900 avctag = s->oformat->codec_tag[n];
2901 while (avctag->id != CODEC_ID_NONE) {
2902 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2904 if (id == st->codec->codec_id)
2907 if (avctag->id == st->codec->codec_id)
2912 if (id != CODEC_ID_NONE)
2914 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2919 #if FF_API_FORMAT_PARAMETERS
2920 int av_write_header(AVFormatContext *s)
2922 return avformat_write_header(s, NULL);
2926 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2930 AVDictionary *tmp = NULL;
2933 av_dict_copy(&tmp, *options, 0);
2934 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2937 // some sanity checks
2938 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2939 av_log(s, AV_LOG_ERROR, "no streams\n");
2940 ret = AVERROR(EINVAL);
2944 for(i=0;i<s->nb_streams;i++) {
2947 switch (st->codec->codec_type) {
2948 case AVMEDIA_TYPE_AUDIO:
2949 if(st->codec->sample_rate<=0){
2950 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2951 ret = AVERROR(EINVAL);
2954 if(!st->codec->block_align)
2955 st->codec->block_align = st->codec->channels *
2956 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2958 case AVMEDIA_TYPE_VIDEO:
2959 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2960 av_log(s, AV_LOG_ERROR, "time base not set\n");
2961 ret = AVERROR(EINVAL);
2964 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2965 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2966 ret = AVERROR(EINVAL);
2969 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
2970 && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.001
2972 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2973 ret = AVERROR(EINVAL);
2979 if(s->oformat->codec_tag){
2980 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)){
2981 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2982 st->codec->codec_tag= 0;
2984 if(st->codec->codec_tag){
2985 if (!validate_codec_tag(s, st)) {
2987 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2988 av_log(s, AV_LOG_ERROR,
2989 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
2990 tagbuf, st->codec->codec_tag, st->codec->codec_id);
2991 ret = AVERROR_INVALIDDATA;
2995 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2998 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2999 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3000 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3003 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3004 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3005 if (!s->priv_data) {
3006 ret = AVERROR(ENOMEM);
3009 if (s->oformat->priv_class) {
3010 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3011 av_opt_set_defaults(s->priv_data);
3012 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3017 /* set muxer identification string */
3018 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3019 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3022 if(s->oformat->write_header){
3023 ret = s->oformat->write_header(s);
3028 /* init PTS generation */
3029 for(i=0;i<s->nb_streams;i++) {
3030 int64_t den = AV_NOPTS_VALUE;
3033 switch (st->codec->codec_type) {
3034 case AVMEDIA_TYPE_AUDIO:
3035 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3037 case AVMEDIA_TYPE_VIDEO:
3038 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3043 if (den != AV_NOPTS_VALUE) {
3045 ret = AVERROR_INVALIDDATA;
3048 av_frac_init(&st->pts, 0, 0, den);
3053 av_dict_free(options);
3062 //FIXME merge with compute_pkt_fields
3063 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3064 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3065 int num, den, frame_size, i;
3067 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3068 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3070 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
3071 return AVERROR(EINVAL);*/
3073 /* duration field */
3074 if (pkt->duration == 0) {
3075 compute_frame_duration(&num, &den, st, NULL, pkt);
3077 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3081 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3084 //XXX/FIXME this is a temporary hack until all encoders output pts
3085 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3087 // pkt->pts= st->cur_dts;
3088 pkt->pts= st->pts.val;
3091 //calculate dts from pts
3092 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3093 st->pts_buffer[0]= pkt->pts;
3094 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3095 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3096 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3097 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3099 pkt->dts= st->pts_buffer[0];
3102 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)){
3103 av_log(s, AV_LOG_ERROR,
3104 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3105 st->index, st->cur_dts, pkt->dts);
3106 return AVERROR(EINVAL);
3108 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3109 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3110 return AVERROR(EINVAL);
3113 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3114 st->cur_dts= pkt->dts;
3115 st->pts.val= pkt->dts;
3118 switch (st->codec->codec_type) {
3119 case AVMEDIA_TYPE_AUDIO:
3120 frame_size = get_audio_frame_size(st->codec, pkt->size);
3122 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3123 likely equal to the encoder delay, but it would be better if we
3124 had the real timestamps from the encoder */
3125 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3126 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3129 case AVMEDIA_TYPE_VIDEO:
3130 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3138 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3140 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3142 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3145 ret= s->oformat->write_packet(s, pkt);
3147 ret= url_ferror(s->pb);
3151 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3152 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3154 AVPacketList **next_point, *this_pktl;
3156 this_pktl = av_mallocz(sizeof(AVPacketList));
3157 this_pktl->pkt= *pkt;
3158 pkt->destruct= NULL; // do not free original but only the copy
3159 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3161 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3162 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3164 next_point = &s->packet_buffer;
3167 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3168 while(!compare(s, &(*next_point)->pkt, pkt)){
3169 next_point= &(*next_point)->next;
3173 next_point = &(s->packet_buffer_end->next);
3176 assert(!*next_point);
3178 s->packet_buffer_end= this_pktl;
3181 this_pktl->next= *next_point;
3183 s->streams[pkt->stream_index]->last_in_packet_buffer=
3184 *next_point= this_pktl;
3187 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3189 AVStream *st = s->streams[ pkt ->stream_index];
3190 AVStream *st2= s->streams[ next->stream_index];
3191 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3195 return pkt->stream_index < next->stream_index;
3199 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3205 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3208 for(i=0; i < s->nb_streams; i++)
3209 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3211 if(stream_count && (s->nb_streams == stream_count || flush)){
3212 pktl= s->packet_buffer;
3215 s->packet_buffer= pktl->next;
3216 if(!s->packet_buffer)
3217 s->packet_buffer_end= NULL;
3219 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3220 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3224 av_init_packet(out);
3230 * Interleave an AVPacket correctly so it can be muxed.
3231 * @param out the interleaved packet will be output here
3232 * @param in the input packet
3233 * @param flush 1 if no further packets are available as input and all
3234 * remaining packets should be output
3235 * @return 1 if a packet was output, 0 if no packet could be output,
3236 * < 0 if an error occurred
3238 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3239 if(s->oformat->interleave_packet)
3240 return s->oformat->interleave_packet(s, out, in, flush);
3242 return av_interleave_packet_per_dts(s, out, in, flush);
3245 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3246 AVStream *st= s->streams[ pkt->stream_index];
3249 //FIXME/XXX/HACK drop zero sized packets
3250 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3253 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3254 pkt->size, pkt->dts, pkt->pts);
3255 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3258 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3259 return AVERROR(EINVAL);
3263 int ret= av_interleave_packet(s, &opkt, pkt, 0);
3264 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3267 ret= s->oformat->write_packet(s, &opkt);
3269 av_free_packet(&opkt);
3274 if(url_ferror(s->pb))
3275 return url_ferror(s->pb);
3279 int av_write_trailer(AVFormatContext *s)
3285 ret= av_interleave_packet(s, &pkt, NULL, 1);
3286 if(ret<0) //FIXME cleanup needed for ret<0 ?
3291 ret= s->oformat->write_packet(s, &pkt);
3293 av_free_packet(&pkt);
3297 if(url_ferror(s->pb))
3301 if(s->oformat->write_trailer)
3302 ret = s->oformat->write_trailer(s);
3305 ret=url_ferror(s->pb);
3306 for(i=0;i<s->nb_streams;i++) {
3307 av_freep(&s->streams[i]->priv_data);
3308 av_freep(&s->streams[i]->index_entries);
3310 if (s->iformat && s->iformat->priv_class)
3311 av_opt_free(s->priv_data);
3312 av_freep(&s->priv_data);
3316 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3319 AVProgram *program=NULL;
3322 if (idx >= ac->nb_streams) {
3323 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3327 for(i=0; i<ac->nb_programs; i++){
3328 if(ac->programs[i]->id != progid)
3330 program = ac->programs[i];
3331 for(j=0; j<program->nb_stream_indexes; j++)
3332 if(program->stream_index[j] == idx)
3335 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3338 program->stream_index = tmp;
3339 program->stream_index[program->nb_stream_indexes++] = idx;
3344 static void print_fps(double d, const char *postfix){
3345 uint64_t v= lrintf(d*100);
3346 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3347 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3348 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3351 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3353 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3354 AVDictionaryEntry *tag=NULL;
3356 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3357 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3358 if(strcmp("language", tag->key)){
3361 av_strlcpy(tmp, tag->value, sizeof(tmp));
3362 for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
3363 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tmp);
3369 /* "user interface" functions */
3370 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3373 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3374 AVStream *st = ic->streams[i];
3375 int g = av_gcd(st->time_base.num, st->time_base.den);
3376 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3377 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3378 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3379 /* the pid is an important information, so we display it */
3380 /* XXX: add a generic system */
3381 if (flags & AVFMT_SHOW_IDS)
3382 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3384 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3385 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3386 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3387 if (st->sample_aspect_ratio.num && // default
3388 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3389 AVRational display_aspect_ratio;
3390 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3391 st->codec->width*st->sample_aspect_ratio.num,
3392 st->codec->height*st->sample_aspect_ratio.den,
3394 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3395 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3396 display_aspect_ratio.num, display_aspect_ratio.den);
3398 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3399 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3400 print_fps(av_q2d(st->avg_frame_rate), "fps");
3401 if(st->r_frame_rate.den && st->r_frame_rate.num)
3402 print_fps(av_q2d(st->r_frame_rate), "tbr");
3403 if(st->time_base.den && st->time_base.num)
3404 print_fps(1/av_q2d(st->time_base), "tbn");
3405 if(st->codec->time_base.den && st->codec->time_base.num)
3406 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3408 if (st->disposition & AV_DISPOSITION_DEFAULT)
3409 av_log(NULL, AV_LOG_INFO, " (default)");
3410 if (st->disposition & AV_DISPOSITION_DUB)
3411 av_log(NULL, AV_LOG_INFO, " (dub)");
3412 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3413 av_log(NULL, AV_LOG_INFO, " (original)");
3414 if (st->disposition & AV_DISPOSITION_COMMENT)
3415 av_log(NULL, AV_LOG_INFO, " (comment)");
3416 if (st->disposition & AV_DISPOSITION_LYRICS)
3417 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3418 if (st->disposition & AV_DISPOSITION_KARAOKE)
3419 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3420 if (st->disposition & AV_DISPOSITION_FORCED)
3421 av_log(NULL, AV_LOG_INFO, " (forced)");
3422 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3423 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3424 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3425 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3426 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3427 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3428 av_log(NULL, AV_LOG_INFO, "\n");
3429 dump_metadata(NULL, st->metadata, " ");
3432 #if FF_API_DUMP_FORMAT
3433 void dump_format(AVFormatContext *ic,
3438 av_dump_format(ic, index, url, is_output);
3442 void av_dump_format(AVFormatContext *ic,
3448 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3449 if (ic->nb_streams && !printed)
3452 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3453 is_output ? "Output" : "Input",
3455 is_output ? ic->oformat->name : ic->iformat->name,
3456 is_output ? "to" : "from", url);
3457 dump_metadata(NULL, ic->metadata, " ");
3459 av_log(NULL, AV_LOG_INFO, " Duration: ");
3460 if (ic->duration != AV_NOPTS_VALUE) {
3461 int hours, mins, secs, us;
3462 secs = ic->duration / AV_TIME_BASE;
3463 us = ic->duration % AV_TIME_BASE;
3468 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3469 (100 * us) / AV_TIME_BASE);
3471 av_log(NULL, AV_LOG_INFO, "N/A");
3473 if (ic->start_time != AV_NOPTS_VALUE) {
3475 av_log(NULL, AV_LOG_INFO, ", start: ");
3476 secs = ic->start_time / AV_TIME_BASE;
3477 us = abs(ic->start_time % AV_TIME_BASE);
3478 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3479 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3481 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3483 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3485 av_log(NULL, AV_LOG_INFO, "N/A");
3487 av_log(NULL, AV_LOG_INFO, "\n");
3489 for (i = 0; i < ic->nb_chapters; i++) {
3490 AVChapter *ch = ic->chapters[i];
3491 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3492 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3493 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3495 dump_metadata(NULL, ch->metadata, " ");
3497 if(ic->nb_programs) {
3498 int j, k, total = 0;
3499 for(j=0; j<ic->nb_programs; j++) {
3500 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3502 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3503 name ? name->value : "");
3504 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3505 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3506 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3507 printed[ic->programs[j]->stream_index[k]] = 1;
3509 total += ic->programs[j]->nb_stream_indexes;
3511 if (total < ic->nb_streams)
3512 av_log(NULL, AV_LOG_INFO, " No Program\n");
3514 for(i=0;i<ic->nb_streams;i++)
3516 dump_stream_format(ic, i, index, is_output);
3521 int64_t av_gettime(void)
3524 gettimeofday(&tv,NULL);
3525 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3528 uint64_t ff_ntp_time(void)
3530 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3533 #if FF_API_PARSE_DATE
3534 #include "libavutil/parseutils.h"
3536 int64_t parse_date(const char *timestr, int duration)
3539 av_parse_time(&timeval, timestr, duration);
3544 #if FF_API_FIND_INFO_TAG
3545 #include "libavutil/parseutils.h"
3547 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3549 return av_find_info_tag(arg, arg_size, tag1, info);
3553 int av_get_frame_filename(char *buf, int buf_size,
3554 const char *path, int number)
3557 char *q, buf1[20], c;
3558 int nd, len, percentd_found;
3570 while (isdigit(*p)) {
3571 nd = nd * 10 + *p++ - '0';
3574 } while (isdigit(c));
3583 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3585 if ((q - buf + len) > buf_size - 1)
3587 memcpy(q, buf1, len);
3595 if ((q - buf) < buf_size - 1)
3599 if (!percentd_found)
3608 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3612 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3614 for(i=0;i<size;i+=16) {
3621 PRINT(" %02x", buf[i+j]);
3626 for(j=0;j<len;j++) {
3628 if (c < ' ' || c > '~')
3637 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3639 hex_dump_internal(NULL, f, 0, buf, size);
3642 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3644 hex_dump_internal(avcl, NULL, level, buf, size);
3647 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3650 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3651 PRINT("stream #%d:\n", pkt->stream_index);
3652 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3653 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3654 /* DTS is _always_ valid after av_read_frame() */
3656 if (pkt->dts == AV_NOPTS_VALUE)
3659 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3660 /* PTS may not be known if B-frames are present. */
3662 if (pkt->pts == AV_NOPTS_VALUE)
3665 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3667 PRINT(" size=%d\n", pkt->size);
3670 av_hex_dump(f, pkt->data, pkt->size);
3674 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3676 AVRational tb = { 1, AV_TIME_BASE };
3677 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3681 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3683 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3687 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3689 AVRational tb = { 1, AV_TIME_BASE };
3690 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3694 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3697 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3700 void av_url_split(char *proto, int proto_size,
3701 char *authorization, int authorization_size,
3702 char *hostname, int hostname_size,
3704 char *path, int path_size,
3707 const char *p, *ls, *at, *col, *brk;
3709 if (port_ptr) *port_ptr = -1;
3710 if (proto_size > 0) proto[0] = 0;
3711 if (authorization_size > 0) authorization[0] = 0;
3712 if (hostname_size > 0) hostname[0] = 0;
3713 if (path_size > 0) path[0] = 0;
3715 /* parse protocol */
3716 if ((p = strchr(url, ':'))) {
3717 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3722 /* no protocol means plain filename */
3723 av_strlcpy(path, url, path_size);
3727 /* separate path from hostname */
3728 ls = strchr(p, '/');
3730 ls = strchr(p, '?');
3732 av_strlcpy(path, ls, path_size);
3734 ls = &p[strlen(p)]; // XXX
3736 /* the rest is hostname, use that to parse auth/port */
3738 /* authorization (user[:pass]@hostname) */
3739 if ((at = strchr(p, '@')) && at < ls) {
3740 av_strlcpy(authorization, p,
3741 FFMIN(authorization_size, at + 1 - p));
3742 p = at + 1; /* skip '@' */
3745 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3747 av_strlcpy(hostname, p + 1,
3748 FFMIN(hostname_size, brk - p));
3749 if (brk[1] == ':' && port_ptr)
3750 *port_ptr = atoi(brk + 2);
3751 } else if ((col = strchr(p, ':')) && col < ls) {
3752 av_strlcpy(hostname, p,
3753 FFMIN(col + 1 - p, hostname_size));
3754 if (port_ptr) *port_ptr = atoi(col + 1);
3756 av_strlcpy(hostname, p,
3757 FFMIN(ls + 1 - p, hostname_size));
3761 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3764 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3767 'C', 'D', 'E', 'F' };
3768 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3771 'c', 'd', 'e', 'f' };
3772 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3774 for(i = 0; i < s; i++) {
3775 buff[i * 2] = hex_table[src[i] >> 4];
3776 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3782 int ff_hex_to_data(uint8_t *data, const char *p)
3789 p += strspn(p, SPACE_CHARS);
3792 c = toupper((unsigned char) *p++);
3793 if (c >= '0' && c <= '9')
3795 else if (c >= 'A' && c <= 'F')
3810 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3811 unsigned int pts_num, unsigned int pts_den)
3814 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3815 if(new_tb.num != pts_num)
3816 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3818 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3820 if(new_tb.num <= 0 || new_tb.den <= 0) {
3821 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3824 s->time_base = new_tb;
3825 s->pts_wrap_bits = pts_wrap_bits;
3828 int ff_url_join(char *str, int size, const char *proto,
3829 const char *authorization, const char *hostname,
3830 int port, const char *fmt, ...)
3833 struct addrinfo hints, *ai;
3838 av_strlcatf(str, size, "%s://", proto);
3839 if (authorization && authorization[0])
3840 av_strlcatf(str, size, "%s@", authorization);
3841 #if CONFIG_NETWORK && defined(AF_INET6)
3842 /* Determine if hostname is a numerical IPv6 address,
3843 * properly escape it within [] in that case. */
3844 memset(&hints, 0, sizeof(hints));
3845 hints.ai_flags = AI_NUMERICHOST;
3846 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3847 if (ai->ai_family == AF_INET6) {
3848 av_strlcat(str, "[", size);
3849 av_strlcat(str, hostname, size);
3850 av_strlcat(str, "]", size);
3852 av_strlcat(str, hostname, size);
3857 /* Not an IPv6 address, just output the plain string. */
3858 av_strlcat(str, hostname, size);
3861 av_strlcatf(str, size, ":%d", port);
3864 int len = strlen(str);
3867 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3873 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3874 AVFormatContext *src)
3879 local_pkt.stream_index = dst_stream;
3880 if (pkt->pts != AV_NOPTS_VALUE)
3881 local_pkt.pts = av_rescale_q(pkt->pts,
3882 src->streams[pkt->stream_index]->time_base,
3883 dst->streams[dst_stream]->time_base);
3884 if (pkt->dts != AV_NOPTS_VALUE)
3885 local_pkt.dts = av_rescale_q(pkt->dts,
3886 src->streams[pkt->stream_index]->time_base,
3887 dst->streams[dst_stream]->time_base);
3888 return av_write_frame(dst, &local_pkt);
3891 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3894 const char *ptr = str;
3896 /* Parse key=value pairs. */
3899 char *dest = NULL, *dest_end;
3900 int key_len, dest_len = 0;
3902 /* Skip whitespace and potential commas. */
3903 while (*ptr && (isspace(*ptr) || *ptr == ','))
3910 if (!(ptr = strchr(key, '=')))
3913 key_len = ptr - key;
3915 callback_get_buf(context, key, key_len, &dest, &dest_len);
3916 dest_end = dest + dest_len - 1;
3920 while (*ptr && *ptr != '\"') {
3924 if (dest && dest < dest_end)
3928 if (dest && dest < dest_end)
3936 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3937 if (dest && dest < dest_end)
3945 int ff_find_stream_index(AVFormatContext *s, int id)
3948 for (i = 0; i < s->nb_streams; i++) {
3949 if (s->streams[i]->id == id)
3955 void ff_make_absolute_url(char *buf, int size, const char *base,
3959 /* Absolute path, relative to the current server */
3960 if (base && strstr(base, "://") && rel[0] == '/') {
3962 av_strlcpy(buf, base, size);
3963 sep = strstr(buf, "://");
3966 sep = strchr(sep, '/');
3970 av_strlcat(buf, rel, size);
3973 /* If rel actually is an absolute url, just copy it */
3974 if (!base || strstr(rel, "://") || rel[0] == '/') {
3975 av_strlcpy(buf, rel, size);
3979 av_strlcpy(buf, base, size);
3980 /* Remove the file name from the base url */
3981 sep = strrchr(buf, '/');
3986 while (av_strstart(rel, "../", NULL) && sep) {
3987 /* Remove the path delimiter at the end */
3989 sep = strrchr(buf, '/');
3990 /* If the next directory name to pop off is "..", break here */
3991 if (!strcmp(sep ? &sep[1] : buf, "..")) {
3992 /* Readd the slash we just removed */
3993 av_strlcat(buf, "/", size);
3996 /* Cut off the directory name */
4003 av_strlcat(buf, rel, size);