2 * various utility functions for use within Libav
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; 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 "libavutil/opt.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/pixdesc.h"
33 #include "libavutil/avstring.h"
34 #include "libavutil/mathematics.h"
36 #include "audiointerleave.h"
50 * various utility functions for use within Libav
53 unsigned avformat_version(void)
55 return LIBAVFORMAT_VERSION_INT;
58 const char *avformat_configuration(void)
60 return LIBAV_CONFIGURATION;
63 const char *avformat_license(void)
65 #define LICENSE_PREFIX "libavformat license: "
66 return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
69 /* fraction handling */
72 * f = val + (num / den) + 0.5.
74 * 'num' is normalized so that it is such as 0 <= num < den.
76 * @param f fractional number
77 * @param val integer value
78 * @param num must be >= 0
79 * @param den must be >= 1
81 static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
94 * Fractional addition to f: f = f + (incr / f->den).
96 * @param f fractional number
97 * @param incr increment, can be positive or negative
99 static void frac_add(AVFrac *f, int64_t incr)
112 } else if (num >= den) {
119 /** head of registered input format linked list */
120 static AVInputFormat *first_iformat = NULL;
121 /** head of registered output format linked list */
122 static AVOutputFormat *first_oformat = NULL;
124 AVInputFormat *av_iformat_next(AVInputFormat *f)
126 if(f) return f->next;
127 else return first_iformat;
130 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
132 if(f) return f->next;
133 else return first_oformat;
136 void av_register_input_format(AVInputFormat *format)
140 while (*p != NULL) p = &(*p)->next;
145 void av_register_output_format(AVOutputFormat *format)
149 while (*p != NULL) p = &(*p)->next;
154 int av_match_ext(const char *filename, const char *extensions)
162 ext = strrchr(filename, '.');
168 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
171 if (!av_strcasecmp(ext1, ext))
181 static int match_format(const char *name, const char *names)
189 namelen = strlen(name);
190 while ((p = strchr(names, ','))) {
191 len = FFMAX(p - names, namelen);
192 if (!av_strncasecmp(name, names, len))
196 return !av_strcasecmp(name, names);
199 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
200 const char *mime_type)
202 AVOutputFormat *fmt = NULL, *fmt_found;
203 int score_max, score;
205 /* specific test for image sequences */
206 #if CONFIG_IMAGE2_MUXER
207 if (!short_name && filename &&
208 av_filename_number_test(filename) &&
209 ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
210 return av_guess_format("image2", NULL, NULL);
213 /* Find the proper file type. */
216 while ((fmt = av_oformat_next(fmt))) {
218 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
220 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
222 if (filename && fmt->extensions &&
223 av_match_ext(filename, fmt->extensions)) {
226 if (score > score_max) {
234 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
235 const char *filename, const char *mime_type, enum AVMediaType type){
236 if(type == AVMEDIA_TYPE_VIDEO){
237 enum CodecID codec_id= CODEC_ID_NONE;
239 #if CONFIG_IMAGE2_MUXER
240 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
241 codec_id= ff_guess_image2_codec(filename);
244 if(codec_id == CODEC_ID_NONE)
245 codec_id= fmt->video_codec;
247 }else if(type == AVMEDIA_TYPE_AUDIO)
248 return fmt->audio_codec;
249 else if (type == AVMEDIA_TYPE_SUBTITLE)
250 return fmt->subtitle_codec;
252 return CODEC_ID_NONE;
255 AVInputFormat *av_find_input_format(const char *short_name)
257 AVInputFormat *fmt = NULL;
258 while ((fmt = av_iformat_next(fmt))) {
259 if (match_format(short_name, fmt->name))
266 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
268 int ret= av_new_packet(pkt, size);
273 pkt->pos= avio_tell(s);
275 ret= avio_read(s, pkt->data, size);
279 av_shrink_packet(pkt, ret);
284 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
289 return av_get_packet(s, pkt, size);
290 old_size = pkt->size;
291 ret = av_grow_packet(pkt, size);
294 ret = avio_read(s, pkt->data + old_size, size);
295 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
300 int av_filename_number_test(const char *filename)
303 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
306 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
308 AVProbeData lpd = *pd;
309 AVInputFormat *fmt1 = NULL, *fmt;
312 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
313 int id3len = ff_id3v2_tag_len(lpd.buf);
314 if (lpd.buf_size > id3len + 16) {
316 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 } else if (fmt1->extensions) {
329 if (av_match_ext(lpd.filename, fmt1->extensions)) {
333 if (score > *score_max) {
336 }else if (score == *score_max)
340 /* a hack for files with huge id3v2 tags -- try to guess by file extension. */
341 if (!fmt && is_opened && *score_max < AVPROBE_SCORE_MAX/4) {
342 while ((fmt = av_iformat_next(fmt)))
343 if (fmt->extensions && av_match_ext(lpd.filename, fmt->extensions)) {
344 *score_max = AVPROBE_SCORE_MAX/4;
349 if (!fmt && id3 && *score_max < AVPROBE_SCORE_MAX/4-1) {
350 while ((fmt = av_iformat_next(fmt)))
351 if (fmt->extensions && av_match_ext("mp3", fmt->extensions)) {
352 *score_max = AVPROBE_SCORE_MAX/4-1;
360 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
362 return av_probe_input_format2(pd, is_opened, &score);
365 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
367 static const struct {
368 const char *name; enum CodecID id; enum AVMediaType type;
370 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
371 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
372 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
373 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
374 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
375 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
376 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
377 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
380 AVInputFormat *fmt = av_probe_input_format2(pd, 1, &score);
384 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
385 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
386 for (i = 0; fmt_id_type[i].name; i++) {
387 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
388 st->codec->codec_id = fmt_id_type[i].id;
389 st->codec->codec_type = fmt_id_type[i].type;
397 /************************************************************/
398 /* input media file */
400 #if FF_API_FORMAT_PARAMETERS
401 static AVDictionary *convert_format_parameters(AVFormatParameters *ap)
404 AVDictionary *opts = NULL;
409 if (ap->time_base.num) {
410 snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
411 av_dict_set(&opts, "framerate", buf, 0);
413 if (ap->sample_rate) {
414 snprintf(buf, sizeof(buf), "%d", ap->sample_rate);
415 av_dict_set(&opts, "sample_rate", buf, 0);
418 snprintf(buf, sizeof(buf), "%d", ap->channels);
419 av_dict_set(&opts, "channels", buf, 0);
421 if (ap->width || ap->height) {
422 snprintf(buf, sizeof(buf), "%dx%d", ap->width, ap->height);
423 av_dict_set(&opts, "video_size", buf, 0);
425 if (ap->pix_fmt != PIX_FMT_NONE) {
426 av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(ap->pix_fmt), 0);
429 snprintf(buf, sizeof(buf), "%d", ap->channel);
430 av_dict_set(&opts, "channel", buf, 0);
433 av_dict_set(&opts, "standard", ap->standard, 0);
435 if (ap->mpeg2ts_compute_pcr) {
436 av_dict_set(&opts, "mpeg2ts_compute_pcr", "1", 0);
438 if (ap->initial_pause) {
439 av_dict_set(&opts, "initial_pause", "1", 0);
445 * Open a media file from an IO stream. 'fmt' must be specified.
447 int av_open_input_stream(AVFormatContext **ic_ptr,
448 AVIOContext *pb, const char *filename,
449 AVInputFormat *fmt, AVFormatParameters *ap)
454 AVFormatParameters default_ap;
458 memset(ap, 0, sizeof(default_ap));
460 opts = convert_format_parameters(ap);
462 if(!ap->prealloced_context)
463 ic = avformat_alloc_context();
467 err = AVERROR(ENOMEM);
470 if (pb && fmt && fmt->flags & AVFMT_NOFILE)
471 av_log(ic, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
472 "will be ignored with AVFMT_NOFILE format.\n");
476 if ((err = avformat_open_input(&ic, filename, fmt, &opts)) < 0)
478 ic->pb = ic->pb ? ic->pb : pb; // don't leak custom pb if it wasn't set above
487 /** size of probe buffer, for guessing file type from file contents */
488 #define PROBE_BUF_MIN 2048
489 #define PROBE_BUF_MAX (1<<20)
491 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
492 const char *filename, void *logctx,
493 unsigned int offset, unsigned int max_probe_size)
495 AVProbeData pd = { filename ? filename : "", NULL, -offset };
496 unsigned char *buf = NULL;
497 int ret = 0, probe_size;
499 if (!max_probe_size) {
500 max_probe_size = PROBE_BUF_MAX;
501 } else if (max_probe_size > PROBE_BUF_MAX) {
502 max_probe_size = PROBE_BUF_MAX;
503 } else if (max_probe_size < PROBE_BUF_MIN) {
504 return AVERROR(EINVAL);
507 if (offset >= max_probe_size) {
508 return AVERROR(EINVAL);
511 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
512 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
513 int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
514 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
516 if (probe_size < offset) {
520 /* read probe data */
521 buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
522 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
523 /* fail if error was not end of file, otherwise, lower score */
524 if (ret != AVERROR_EOF) {
529 ret = 0; /* error was end of file, nothing read */
532 pd.buf = &buf[offset];
534 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
536 /* guess file format */
537 *fmt = av_probe_input_format2(&pd, 1, &score);
539 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
540 av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
542 av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
548 return AVERROR_INVALIDDATA;
551 /* rewind. reuse probe buffer to avoid seeking */
552 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
558 #if FF_API_FORMAT_PARAMETERS
559 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
562 AVFormatParameters *ap)
565 AVDictionary *opts = convert_format_parameters(ap);
567 if (!ap || !ap->prealloced_context)
570 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
577 /* open input file and probe the format if necessary */
578 static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)
581 AVProbeData pd = {filename, NULL, 0};
584 s->flags |= AVFMT_FLAG_CUSTOM_IO;
586 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
587 else if (s->iformat->flags & AVFMT_NOFILE)
588 return AVERROR(EINVAL);
592 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
593 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
596 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ,
597 &s->interrupt_callback, options)) < 0)
601 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
604 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
606 AVFormatContext *s = *ps;
608 AVFormatParameters ap = { { 0 } };
609 AVDictionary *tmp = NULL;
611 if (!s && !(s = avformat_alloc_context()))
612 return AVERROR(ENOMEM);
617 av_dict_copy(&tmp, *options, 0);
619 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
622 if ((ret = init_input(s, filename, &tmp)) < 0)
625 /* check filename in case an image number is expected */
626 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
627 if (!av_filename_number_test(filename)) {
628 ret = AVERROR(EINVAL);
633 s->duration = s->start_time = AV_NOPTS_VALUE;
634 av_strlcpy(s->filename, filename, sizeof(s->filename));
636 /* allocate private data */
637 if (s->iformat->priv_data_size > 0) {
638 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
639 ret = AVERROR(ENOMEM);
642 if (s->iformat->priv_class) {
643 *(const AVClass**)s->priv_data = s->iformat->priv_class;
644 av_opt_set_defaults(s->priv_data);
645 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
650 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
652 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
654 if (s->iformat->read_header)
655 if ((ret = s->iformat->read_header(s, &ap)) < 0)
658 if (s->pb && !s->data_offset)
659 s->data_offset = avio_tell(s->pb);
661 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
664 av_dict_free(options);
672 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
674 avformat_free_context(s);
679 /*******************************************************/
681 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
682 AVPacketList **plast_pktl){
683 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
688 (*plast_pktl)->next = pktl;
690 *packet_buffer = pktl;
692 /* add the packet in the buffered packet list */
698 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
704 AVPacketList *pktl = s->raw_packet_buffer;
708 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
709 !s->streams[pkt->stream_index]->probe_packets ||
710 s->raw_packet_buffer_remaining_size < pkt->size){
711 AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
714 s->raw_packet_buffer = pktl->next;
715 s->raw_packet_buffer_remaining_size += pkt->size;
722 ret= s->iformat->read_packet(s, pkt);
724 if (!pktl || ret == AVERROR(EAGAIN))
726 for (i = 0; i < s->nb_streams; i++)
727 s->streams[i]->probe_packets = 0;
731 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
732 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
733 av_log(s, AV_LOG_WARNING,
734 "Dropped corrupted packet (stream = %d)\n",
740 st= s->streams[pkt->stream_index];
742 switch(st->codec->codec_type){
743 case AVMEDIA_TYPE_VIDEO:
744 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
746 case AVMEDIA_TYPE_AUDIO:
747 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
749 case AVMEDIA_TYPE_SUBTITLE:
750 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
754 if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
758 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
759 s->raw_packet_buffer_remaining_size -= pkt->size;
761 if(st->codec->codec_id == CODEC_ID_PROBE){
762 AVProbeData *pd = &st->probe_data;
763 av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
766 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
767 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
768 pd->buf_size += pkt->size;
769 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
771 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
772 //FIXME we dont reduce score to 0 for the case of running out of buffer space in bytes
773 set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0);
774 if(st->codec->codec_id != CODEC_ID_PROBE){
777 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
784 /**********************************************************/
787 * Get the number of samples of an audio frame. Return -1 on error.
789 static int get_audio_frame_size(AVCodecContext *enc, int size)
793 if(enc->codec_id == CODEC_ID_VORBIS)
796 if (enc->frame_size <= 1) {
797 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
799 if (bits_per_sample) {
800 if (enc->channels == 0)
802 frame_size = (size << 3) / (bits_per_sample * enc->channels);
804 /* used for example by ADPCM codecs */
805 if (enc->bit_rate == 0)
807 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
810 frame_size = enc->frame_size;
817 * Return the frame duration in seconds. Return 0 if not available.
819 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
820 AVCodecParserContext *pc, AVPacket *pkt)
826 switch(st->codec->codec_type) {
827 case AVMEDIA_TYPE_VIDEO:
828 if(st->time_base.num*1000LL > st->time_base.den){
829 *pnum = st->time_base.num;
830 *pden = st->time_base.den;
831 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
832 *pnum = st->codec->time_base.num;
833 *pden = st->codec->time_base.den;
834 if (pc && pc->repeat_pict) {
835 *pnum = (*pnum) * (1 + pc->repeat_pict);
837 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
838 //Thus if we have no parser in such case leave duration undefined.
839 if(st->codec->ticks_per_frame>1 && !pc){
844 case AVMEDIA_TYPE_AUDIO:
845 frame_size = get_audio_frame_size(st->codec, pkt->size);
846 if (frame_size <= 0 || st->codec->sample_rate <= 0)
849 *pden = st->codec->sample_rate;
856 static int is_intra_only(AVCodecContext *enc){
857 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
859 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
860 switch(enc->codec_id){
862 case CODEC_ID_MJPEGB:
864 case CODEC_ID_PRORES:
865 case CODEC_ID_RAWVIDEO:
866 case CODEC_ID_DVVIDEO:
867 case CODEC_ID_HUFFYUV:
868 case CODEC_ID_FFVHUFF:
873 case CODEC_ID_JPEG2000:
881 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
882 int64_t dts, int64_t pts)
884 AVStream *st= s->streams[stream_index];
885 AVPacketList *pktl= s->packet_buffer;
887 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
890 st->first_dts= dts - st->cur_dts;
893 for(; pktl; pktl= pktl->next){
894 if(pktl->pkt.stream_index != stream_index)
896 //FIXME think more about this check
897 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
898 pktl->pkt.pts += st->first_dts;
900 if(pktl->pkt.dts != AV_NOPTS_VALUE)
901 pktl->pkt.dts += st->first_dts;
903 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
904 st->start_time= pktl->pkt.pts;
906 if (st->start_time == AV_NOPTS_VALUE)
907 st->start_time = pts;
910 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
912 AVPacketList *pktl= s->packet_buffer;
915 if(st->first_dts != AV_NOPTS_VALUE){
916 cur_dts= st->first_dts;
917 for(; pktl; pktl= pktl->next){
918 if(pktl->pkt.stream_index == pkt->stream_index){
919 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
921 cur_dts -= pkt->duration;
924 pktl= s->packet_buffer;
925 st->first_dts = cur_dts;
926 }else if(st->cur_dts)
929 for(; pktl; pktl= pktl->next){
930 if(pktl->pkt.stream_index != pkt->stream_index)
932 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
933 && !pktl->pkt.duration){
934 pktl->pkt.dts= cur_dts;
935 if(!st->codec->has_b_frames)
936 pktl->pkt.pts= cur_dts;
937 cur_dts += pkt->duration;
938 pktl->pkt.duration= pkt->duration;
942 if(st->first_dts == AV_NOPTS_VALUE)
943 st->cur_dts= cur_dts;
946 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
947 AVCodecParserContext *pc, AVPacket *pkt)
949 int num, den, presentation_delayed, delay, i;
952 if (s->flags & AVFMT_FLAG_NOFILLIN)
955 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
956 pkt->dts= AV_NOPTS_VALUE;
958 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
959 //FIXME Set low_delay = 0 when has_b_frames = 1
960 st->codec->has_b_frames = 1;
962 /* do we have a video B-frame ? */
963 delay= st->codec->has_b_frames;
964 presentation_delayed = 0;
966 // ignore delay caused by frame threading so that the mpeg2-without-dts
967 // warning will not trigger
968 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
969 delay -= st->codec->thread_count-1;
971 /* XXX: need has_b_frame, but cannot get it if the codec is
974 pc && pc->pict_type != AV_PICTURE_TYPE_B)
975 presentation_delayed = 1;
977 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
978 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
979 pkt->dts -= 1LL<<st->pts_wrap_bits;
982 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
983 // we take the conservative approach and discard both
984 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
985 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
986 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
987 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
990 if (pkt->duration == 0) {
991 compute_frame_duration(&num, &den, st, pc, pkt);
993 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
995 if(pkt->duration != 0 && s->packet_buffer)
996 update_initial_durations(s, st, pkt);
1000 /* correct timestamps with byte offset if demuxers only have timestamps
1001 on packet boundaries */
1002 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1003 /* this will estimate bitrate based on this frame's duration and size */
1004 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1005 if(pkt->pts != AV_NOPTS_VALUE)
1007 if(pkt->dts != AV_NOPTS_VALUE)
1011 if (pc && pc->dts_sync_point >= 0) {
1012 // we have synchronization info from the parser
1013 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1015 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1016 if (pkt->dts != AV_NOPTS_VALUE) {
1017 // got DTS from the stream, update reference timestamp
1018 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1019 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1020 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1021 // compute DTS based on reference timestamp
1022 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1023 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1025 if (pc->dts_sync_point > 0)
1026 st->reference_dts = pkt->dts; // new reference
1030 /* This may be redundant, but it should not hurt. */
1031 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1032 presentation_delayed = 1;
1034 // 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);
1035 /* interpolate PTS and DTS if they are not present */
1036 //We skip H264 currently because delay and has_b_frames are not reliably set
1037 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1038 if (presentation_delayed) {
1039 /* DTS = decompression timestamp */
1040 /* PTS = presentation timestamp */
1041 if (pkt->dts == AV_NOPTS_VALUE)
1042 pkt->dts = st->last_IP_pts;
1043 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1044 if (pkt->dts == AV_NOPTS_VALUE)
1045 pkt->dts = st->cur_dts;
1047 /* this is tricky: the dts must be incremented by the duration
1048 of the frame we are displaying, i.e. the last I- or P-frame */
1049 if (st->last_IP_duration == 0)
1050 st->last_IP_duration = pkt->duration;
1051 if(pkt->dts != AV_NOPTS_VALUE)
1052 st->cur_dts = pkt->dts + st->last_IP_duration;
1053 st->last_IP_duration = pkt->duration;
1054 st->last_IP_pts= pkt->pts;
1055 /* cannot compute PTS if not present (we can compute it only
1056 by knowing the future */
1057 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1058 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1059 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1060 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1061 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1062 pkt->pts += pkt->duration;
1063 // 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);
1067 /* presentation is not delayed : PTS and DTS are the same */
1068 if(pkt->pts == AV_NOPTS_VALUE)
1069 pkt->pts = pkt->dts;
1070 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1071 if(pkt->pts == AV_NOPTS_VALUE)
1072 pkt->pts = st->cur_dts;
1073 pkt->dts = pkt->pts;
1074 if(pkt->pts != AV_NOPTS_VALUE)
1075 st->cur_dts = pkt->pts + pkt->duration;
1079 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1080 st->pts_buffer[0]= pkt->pts;
1081 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1082 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1083 if(pkt->dts == AV_NOPTS_VALUE)
1084 pkt->dts= st->pts_buffer[0];
1085 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1086 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1088 if(pkt->dts > st->cur_dts)
1089 st->cur_dts = pkt->dts;
1092 // 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);
1095 if(is_intra_only(st->codec))
1096 pkt->flags |= AV_PKT_FLAG_KEY;
1099 /* keyframe computation */
1100 if (pc->key_frame == 1)
1101 pkt->flags |= AV_PKT_FLAG_KEY;
1102 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1103 pkt->flags |= AV_PKT_FLAG_KEY;
1106 pkt->convergence_duration = pc->convergence_duration;
1110 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1115 av_init_packet(pkt);
1118 /* select current input stream component */
1121 if (!st->need_parsing || !st->parser) {
1122 /* no parsing needed: we just output the packet as is */
1123 /* raw data support */
1124 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
1125 compute_pkt_fields(s, st, NULL, pkt);
1127 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1128 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1129 ff_reduce_index(s, st->index);
1130 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1133 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1134 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1135 st->cur_ptr, st->cur_len,
1136 st->cur_pkt.pts, st->cur_pkt.dts,
1138 st->cur_pkt.pts = AV_NOPTS_VALUE;
1139 st->cur_pkt.dts = AV_NOPTS_VALUE;
1140 /* increment read pointer */
1144 /* return packet if any */
1148 pkt->stream_index = st->index;
1149 pkt->pts = st->parser->pts;
1150 pkt->dts = st->parser->dts;
1151 pkt->pos = st->parser->pos;
1152 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1154 pkt->destruct= st->cur_pkt.destruct;
1155 st->cur_pkt.destruct= NULL;
1156 st->cur_pkt.data = NULL;
1157 assert(st->cur_len == 0);
1159 pkt->destruct = NULL;
1161 compute_pkt_fields(s, st, st->parser, pkt);
1163 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1164 ff_reduce_index(s, st->index);
1165 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1166 0, 0, AVINDEX_KEYFRAME);
1173 av_free_packet(&st->cur_pkt);
1178 /* read next packet */
1179 ret = av_read_packet(s, &cur_pkt);
1181 if (ret == AVERROR(EAGAIN))
1183 /* return the last frames, if any */
1184 for(i = 0; i < s->nb_streams; i++) {
1186 if (st->parser && st->need_parsing) {
1187 av_parser_parse2(st->parser, st->codec,
1188 &pkt->data, &pkt->size,
1190 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1196 /* no more packets: really terminate parsing */
1199 st = s->streams[cur_pkt.stream_index];
1200 st->cur_pkt= cur_pkt;
1202 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1203 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1204 st->cur_pkt.pts < st->cur_pkt.dts){
1205 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1206 st->cur_pkt.stream_index,
1210 // av_free_packet(&st->cur_pkt);
1214 if(s->debug & FF_FDEBUG_TS)
1215 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1216 st->cur_pkt.stream_index,
1220 st->cur_pkt.duration,
1224 st->cur_ptr = st->cur_pkt.data;
1225 st->cur_len = st->cur_pkt.size;
1226 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1227 st->parser = av_parser_init(st->codec->codec_id);
1229 /* no parser available: just output the raw packets */
1230 st->need_parsing = AVSTREAM_PARSE_NONE;
1231 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1232 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1233 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1234 st->parser->flags |= PARSER_FLAG_ONCE;
1239 if(s->debug & FF_FDEBUG_TS)
1240 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1251 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1255 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1258 pktl = s->packet_buffer;
1260 AVPacket *next_pkt= &pktl->pkt;
1262 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1263 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1264 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1265 if( pktl->pkt.stream_index == next_pkt->stream_index
1266 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1267 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1268 next_pkt->pts= pktl->pkt.dts;
1272 pktl = s->packet_buffer;
1275 if( next_pkt->pts != AV_NOPTS_VALUE
1276 || next_pkt->dts == AV_NOPTS_VALUE
1278 /* read packet from packet buffer, if there is data */
1280 s->packet_buffer = pktl->next;
1286 int ret= read_frame_internal(s, pkt);
1288 if(pktl && ret != AVERROR(EAGAIN)){
1295 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1296 &s->packet_buffer_end)) < 0)
1297 return AVERROR(ENOMEM);
1299 assert(!s->packet_buffer);
1300 return read_frame_internal(s, pkt);
1305 /* XXX: suppress the packet queue */
1306 static void flush_packet_queue(AVFormatContext *s)
1311 pktl = s->packet_buffer;
1314 s->packet_buffer = pktl->next;
1315 av_free_packet(&pktl->pkt);
1318 while(s->raw_packet_buffer){
1319 pktl = s->raw_packet_buffer;
1320 s->raw_packet_buffer = pktl->next;
1321 av_free_packet(&pktl->pkt);
1324 s->packet_buffer_end=
1325 s->raw_packet_buffer_end= NULL;
1326 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1329 /*******************************************************/
1332 int av_find_default_stream_index(AVFormatContext *s)
1334 int first_audio_index = -1;
1338 if (s->nb_streams <= 0)
1340 for(i = 0; i < s->nb_streams; i++) {
1342 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1345 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1346 first_audio_index = i;
1348 return first_audio_index >= 0 ? first_audio_index : 0;
1352 * Flush the frame reader.
1354 void ff_read_frame_flush(AVFormatContext *s)
1359 flush_packet_queue(s);
1363 /* for each stream, reset read state */
1364 for(i = 0; i < s->nb_streams; i++) {
1368 av_parser_close(st->parser);
1370 av_free_packet(&st->cur_pkt);
1372 st->last_IP_pts = AV_NOPTS_VALUE;
1373 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1374 st->reference_dts = AV_NOPTS_VALUE;
1379 st->probe_packets = MAX_PROBE_PACKETS;
1381 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1382 st->pts_buffer[j]= AV_NOPTS_VALUE;
1386 #if FF_API_SEEK_PUBLIC
1387 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1389 ff_update_cur_dts(s, ref_st, timestamp);
1393 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1397 for(i = 0; i < s->nb_streams; i++) {
1398 AVStream *st = s->streams[i];
1400 st->cur_dts = av_rescale(timestamp,
1401 st->time_base.den * (int64_t)ref_st->time_base.num,
1402 st->time_base.num * (int64_t)ref_st->time_base.den);
1406 void ff_reduce_index(AVFormatContext *s, int stream_index)
1408 AVStream *st= s->streams[stream_index];
1409 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1411 if((unsigned)st->nb_index_entries >= max_entries){
1413 for(i=0; 2*i<st->nb_index_entries; i++)
1414 st->index_entries[i]= st->index_entries[2*i];
1415 st->nb_index_entries= i;
1419 int ff_add_index_entry(AVIndexEntry **index_entries,
1420 int *nb_index_entries,
1421 unsigned int *index_entries_allocated_size,
1422 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1424 AVIndexEntry *entries, *ie;
1427 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1430 entries = av_fast_realloc(*index_entries,
1431 index_entries_allocated_size,
1432 (*nb_index_entries + 1) *
1433 sizeof(AVIndexEntry));
1437 *index_entries= entries;
1439 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1442 index= (*nb_index_entries)++;
1443 ie= &entries[index];
1444 assert(index==0 || ie[-1].timestamp < timestamp);
1446 ie= &entries[index];
1447 if(ie->timestamp != timestamp){
1448 if(ie->timestamp <= timestamp)
1450 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1451 (*nb_index_entries)++;
1452 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1453 distance= ie->min_distance;
1457 ie->timestamp = timestamp;
1458 ie->min_distance= distance;
1465 int av_add_index_entry(AVStream *st,
1466 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1468 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1469 &st->index_entries_allocated_size, pos,
1470 timestamp, size, distance, flags);
1473 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1474 int64_t wanted_timestamp, int flags)
1482 //optimize appending index entries at the end
1483 if(b && entries[b-1].timestamp < wanted_timestamp)
1488 timestamp = entries[m].timestamp;
1489 if(timestamp >= wanted_timestamp)
1491 if(timestamp <= wanted_timestamp)
1494 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1496 if(!(flags & AVSEEK_FLAG_ANY)){
1497 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1498 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1507 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1510 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1511 wanted_timestamp, flags);
1514 #if FF_API_SEEK_PUBLIC
1515 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1516 return ff_seek_frame_binary(s, stream_index, target_ts, flags);
1520 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
1522 AVInputFormat *avif= s->iformat;
1523 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1524 int64_t ts_min, ts_max, ts;
1529 if (stream_index < 0)
1532 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1535 ts_min= AV_NOPTS_VALUE;
1536 pos_limit= -1; //gcc falsely says it may be uninitialized
1538 st= s->streams[stream_index];
1539 if(st->index_entries){
1542 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()
1543 index= FFMAX(index, 0);
1544 e= &st->index_entries[index];
1546 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1548 ts_min= e->timestamp;
1549 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1555 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1556 assert(index < st->nb_index_entries);
1558 e= &st->index_entries[index];
1559 assert(e->timestamp >= target_ts);
1561 ts_max= e->timestamp;
1562 pos_limit= pos_max - e->min_distance;
1563 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1564 pos_max,pos_limit, ts_max);
1568 pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1573 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1576 ff_update_cur_dts(s, st, ts);
1581 #if FF_API_SEEK_PUBLIC
1582 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1583 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1584 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1585 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1587 return ff_gen_search(s, stream_index, target_ts, pos_min, pos_max,
1588 pos_limit, ts_min, ts_max, flags, ts_ret,
1593 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1594 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1595 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1596 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1599 int64_t start_pos, filesize;
1602 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1604 if(ts_min == AV_NOPTS_VALUE){
1605 pos_min = s->data_offset;
1606 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1607 if (ts_min == AV_NOPTS_VALUE)
1611 if(ts_max == AV_NOPTS_VALUE){
1613 filesize = avio_size(s->pb);
1614 pos_max = filesize - 1;
1617 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1619 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1620 if (ts_max == AV_NOPTS_VALUE)
1624 int64_t tmp_pos= pos_max + 1;
1625 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1626 if(tmp_ts == AV_NOPTS_VALUE)
1630 if(tmp_pos >= filesize)
1636 if(ts_min > ts_max){
1638 }else if(ts_min == ts_max){
1643 while (pos_min < pos_limit) {
1644 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1645 pos_min, pos_max, ts_min, ts_max);
1646 assert(pos_limit <= pos_max);
1649 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1650 // interpolate position (better than dichotomy)
1651 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1652 + pos_min - approximate_keyframe_distance;
1653 }else if(no_change==1){
1654 // bisection, if interpolation failed to change min or max pos last time
1655 pos = (pos_min + pos_limit)>>1;
1657 /* linear search if bisection failed, can only happen if there
1658 are very few or no keyframes between min/max */
1663 else if(pos > pos_limit)
1667 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1672 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1673 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1674 pos_limit, start_pos, no_change);
1675 if(ts == AV_NOPTS_VALUE){
1676 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1679 assert(ts != AV_NOPTS_VALUE);
1680 if (target_ts <= ts) {
1681 pos_limit = start_pos - 1;
1685 if (target_ts >= ts) {
1691 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1692 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1694 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1696 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1697 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1698 pos, ts_min, target_ts, ts_max);
1703 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1704 int64_t pos_min, pos_max;
1708 if (stream_index < 0)
1711 st= s->streams[stream_index];
1714 pos_min = s->data_offset;
1715 pos_max = avio_size(s->pb) - 1;
1717 if (pos < pos_min) pos= pos_min;
1718 else if(pos > pos_max) pos= pos_max;
1720 avio_seek(s->pb, pos, SEEK_SET);
1723 av_update_cur_dts(s, st, ts);
1728 static int seek_frame_generic(AVFormatContext *s,
1729 int stream_index, int64_t timestamp, int flags)
1736 st = s->streams[stream_index];
1738 index = av_index_search_timestamp(st, timestamp, flags);
1740 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1743 if(index < 0 || index==st->nb_index_entries-1){
1746 if(st->nb_index_entries){
1747 assert(st->index_entries);
1748 ie= &st->index_entries[st->nb_index_entries-1];
1749 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1751 ff_update_cur_dts(s, st, ie->timestamp);
1753 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1759 read_status = av_read_frame(s, &pkt);
1760 } while (read_status == AVERROR(EAGAIN));
1761 if (read_status < 0)
1763 av_free_packet(&pkt);
1764 if(stream_index == pkt.stream_index){
1765 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1769 index = av_index_search_timestamp(st, timestamp, flags);
1774 ff_read_frame_flush(s);
1775 if (s->iformat->read_seek){
1776 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1779 ie = &st->index_entries[index];
1780 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1782 ff_update_cur_dts(s, st, ie->timestamp);
1787 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1792 if (flags & AVSEEK_FLAG_BYTE) {
1793 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1795 ff_read_frame_flush(s);
1796 return seek_frame_byte(s, stream_index, timestamp, flags);
1799 if(stream_index < 0){
1800 stream_index= av_find_default_stream_index(s);
1801 if(stream_index < 0)
1804 st= s->streams[stream_index];
1805 /* timestamp for default must be expressed in AV_TIME_BASE units */
1806 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1809 /* first, we try the format specific seek */
1810 if (s->iformat->read_seek) {
1811 ff_read_frame_flush(s);
1812 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1819 if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1820 ff_read_frame_flush(s);
1821 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1822 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1823 ff_read_frame_flush(s);
1824 return seek_frame_generic(s, stream_index, timestamp, flags);
1830 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1832 if(min_ts > ts || max_ts < ts)
1835 if (s->iformat->read_seek2) {
1836 ff_read_frame_flush(s);
1837 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1840 if(s->iformat->read_timestamp){
1841 //try to seek via read_timestamp()
1844 //Fallback to old API if new is not implemented but old is
1845 //Note the old has somewat different sematics
1846 if(s->iformat->read_seek || 1)
1847 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1849 // try some generic seek like seek_frame_generic() but with new ts semantics
1852 /*******************************************************/
1855 * Return TRUE if the stream has accurate duration in any stream.
1857 * @return TRUE if the stream has accurate duration for at least one component.
1859 static int has_duration(AVFormatContext *ic)
1864 for(i = 0;i < ic->nb_streams; i++) {
1865 st = ic->streams[i];
1866 if (st->duration != AV_NOPTS_VALUE)
1873 * Estimate the stream timings from the one of each components.
1875 * Also computes the global bitrate if possible.
1877 static void update_stream_timings(AVFormatContext *ic)
1879 int64_t start_time, start_time1, end_time, end_time1;
1880 int64_t duration, duration1, filesize;
1884 start_time = INT64_MAX;
1885 end_time = INT64_MIN;
1886 duration = INT64_MIN;
1887 for(i = 0;i < ic->nb_streams; i++) {
1888 st = ic->streams[i];
1889 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1890 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1891 start_time = FFMIN(start_time, start_time1);
1892 if (st->duration != AV_NOPTS_VALUE) {
1893 end_time1 = start_time1
1894 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1895 end_time = FFMAX(end_time, end_time1);
1898 if (st->duration != AV_NOPTS_VALUE) {
1899 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1900 duration = FFMAX(duration, duration1);
1903 if (start_time != INT64_MAX) {
1904 ic->start_time = start_time;
1905 if (end_time != INT64_MIN)
1906 duration = FFMAX(duration, end_time - start_time);
1908 if (duration != INT64_MIN) {
1909 ic->duration = duration;
1910 if (ic->pb && (filesize = avio_size(ic->pb)) > 0) {
1911 /* compute the bitrate */
1912 ic->bit_rate = (double)filesize * 8.0 * AV_TIME_BASE /
1913 (double)ic->duration;
1918 static void fill_all_stream_timings(AVFormatContext *ic)
1923 update_stream_timings(ic);
1924 for(i = 0;i < ic->nb_streams; i++) {
1925 st = ic->streams[i];
1926 if (st->start_time == AV_NOPTS_VALUE) {
1927 if(ic->start_time != AV_NOPTS_VALUE)
1928 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1929 if(ic->duration != AV_NOPTS_VALUE)
1930 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1935 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
1937 int64_t filesize, duration;
1941 /* if bit_rate is already set, we believe it */
1942 if (ic->bit_rate <= 0) {
1944 for(i=0;i<ic->nb_streams;i++) {
1945 st = ic->streams[i];
1946 if (st->codec->bit_rate > 0)
1947 bit_rate += st->codec->bit_rate;
1949 ic->bit_rate = bit_rate;
1952 /* if duration is already set, we believe it */
1953 if (ic->duration == AV_NOPTS_VALUE &&
1954 ic->bit_rate != 0) {
1955 filesize = ic->pb ? avio_size(ic->pb) : 0;
1957 for(i = 0; i < ic->nb_streams; i++) {
1958 st = ic->streams[i];
1959 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1960 if (st->duration == AV_NOPTS_VALUE)
1961 st->duration = duration;
1967 #define DURATION_MAX_READ_SIZE 250000
1968 #define DURATION_MAX_RETRY 3
1970 /* only usable for MPEG-PS streams */
1971 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1973 AVPacket pkt1, *pkt = &pkt1;
1975 int read_size, i, ret;
1977 int64_t filesize, offset, duration;
1982 /* flush packet queue */
1983 flush_packet_queue(ic);
1985 for (i=0; i<ic->nb_streams; i++) {
1986 st = ic->streams[i];
1987 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1988 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
1991 av_parser_close(st->parser);
1993 av_free_packet(&st->cur_pkt);
1997 /* estimate the end time (duration) */
1998 /* XXX: may need to support wrapping */
1999 filesize = ic->pb ? avio_size(ic->pb) : 0;
2000 end_time = AV_NOPTS_VALUE;
2002 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2006 avio_seek(ic->pb, offset, SEEK_SET);
2009 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2013 ret = av_read_packet(ic, pkt);
2014 } while(ret == AVERROR(EAGAIN));
2017 read_size += pkt->size;
2018 st = ic->streams[pkt->stream_index];
2019 if (pkt->pts != AV_NOPTS_VALUE &&
2020 (st->start_time != AV_NOPTS_VALUE ||
2021 st->first_dts != AV_NOPTS_VALUE)) {
2022 duration = end_time = pkt->pts;
2023 if (st->start_time != AV_NOPTS_VALUE)
2024 duration -= st->start_time;
2026 duration -= st->first_dts;
2028 duration += 1LL<<st->pts_wrap_bits;
2030 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2031 st->duration = duration;
2034 av_free_packet(pkt);
2036 }while( end_time==AV_NOPTS_VALUE
2037 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2038 && ++retry <= DURATION_MAX_RETRY);
2040 fill_all_stream_timings(ic);
2042 avio_seek(ic->pb, old_offset, SEEK_SET);
2043 for (i=0; i<ic->nb_streams; i++) {
2045 st->cur_dts= st->first_dts;
2046 st->last_IP_pts = AV_NOPTS_VALUE;
2047 st->reference_dts = AV_NOPTS_VALUE;
2051 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2055 /* get the file size, if possible */
2056 if (ic->iformat->flags & AVFMT_NOFILE) {
2059 file_size = avio_size(ic->pb);
2060 file_size = FFMAX(0, file_size);
2063 if ((!strcmp(ic->iformat->name, "mpeg") ||
2064 !strcmp(ic->iformat->name, "mpegts")) &&
2065 file_size && ic->pb->seekable) {
2066 /* get accurate estimate from the PTSes */
2067 estimate_timings_from_pts(ic, old_offset);
2068 } else if (has_duration(ic)) {
2069 /* at least one component has timings - we use them for all
2071 fill_all_stream_timings(ic);
2073 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2074 /* less precise: use bitrate info */
2075 estimate_timings_from_bit_rate(ic);
2077 update_stream_timings(ic);
2081 AVStream av_unused *st;
2082 for(i = 0;i < ic->nb_streams; i++) {
2083 st = ic->streams[i];
2084 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2085 (double) st->start_time / AV_TIME_BASE,
2086 (double) st->duration / AV_TIME_BASE);
2088 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2089 (double) ic->start_time / AV_TIME_BASE,
2090 (double) ic->duration / AV_TIME_BASE,
2091 ic->bit_rate / 1000);
2095 static int has_codec_parameters(AVCodecContext *avctx)
2098 switch (avctx->codec_type) {
2099 case AVMEDIA_TYPE_AUDIO:
2100 val = avctx->sample_rate && avctx->channels && avctx->sample_fmt != AV_SAMPLE_FMT_NONE;
2101 if (!avctx->frame_size &&
2102 (avctx->codec_id == CODEC_ID_VORBIS ||
2103 avctx->codec_id == CODEC_ID_AAC ||
2104 avctx->codec_id == CODEC_ID_MP1 ||
2105 avctx->codec_id == CODEC_ID_MP2 ||
2106 avctx->codec_id == CODEC_ID_MP3 ||
2107 avctx->codec_id == CODEC_ID_CELT))
2110 case AVMEDIA_TYPE_VIDEO:
2111 val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
2117 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2120 static int has_decode_delay_been_guessed(AVStream *st)
2122 return st->codec->codec_id != CODEC_ID_H264 ||
2123 st->info->nb_decoded_frames >= 6;
2126 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2130 int got_picture, data_size, ret=0;
2133 if(!st->codec->codec){
2134 codec = avcodec_find_decoder(st->codec->codec_id);
2137 ret = avcodec_open2(st->codec, codec, options);
2142 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st) ||
2143 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF)) {
2144 switch(st->codec->codec_type) {
2145 case AVMEDIA_TYPE_VIDEO:
2146 avcodec_get_frame_defaults(&picture);
2147 ret = avcodec_decode_video2(st->codec, &picture,
2148 &got_picture, avpkt);
2150 st->info->nb_decoded_frames++;
2152 case AVMEDIA_TYPE_AUDIO:
2153 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2154 samples = av_malloc(data_size);
2157 ret = avcodec_decode_audio3(st->codec, samples,
2169 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2171 while (tags->id != CODEC_ID_NONE) {
2179 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2182 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2183 if(tag == tags[i].tag)
2186 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2187 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2190 return CODEC_ID_NONE;
2193 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2196 for(i=0; tags && tags[i]; i++){
2197 int tag= ff_codec_get_tag(tags[i], id);
2203 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2206 for(i=0; tags && tags[i]; i++){
2207 enum CodecID id= ff_codec_get_id(tags[i], tag);
2208 if(id!=CODEC_ID_NONE) return id;
2210 return CODEC_ID_NONE;
2213 static void compute_chapters_end(AVFormatContext *s)
2216 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2218 for (i = 0; i < s->nb_chapters; i++)
2219 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2220 AVChapter *ch = s->chapters[i];
2221 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2224 for (j = 0; j < s->nb_chapters; j++) {
2225 AVChapter *ch1 = s->chapters[j];
2226 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2227 if (j != i && next_start > ch->start && next_start < end)
2230 ch->end = (end == INT64_MAX) ? ch->start : end;
2234 static int get_std_framerate(int i){
2235 if(i<60*12) return i*1001;
2236 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2240 * Is the time base unreliable.
2241 * This is a heuristic to balance between quick acceptance of the values in
2242 * the headers vs. some extra checks.
2243 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2244 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2245 * And there are "variable" fps files this needs to detect as well.
2247 static int tb_unreliable(AVCodecContext *c){
2248 if( c->time_base.den >= 101L*c->time_base.num
2249 || c->time_base.den < 5L*c->time_base.num
2250 /* || c->codec_tag == AV_RL32("DIVX")
2251 || c->codec_tag == AV_RL32("XVID")*/
2252 || c->codec_id == CODEC_ID_MPEG2VIDEO
2253 || c->codec_id == CODEC_ID_H264
2259 #if FF_API_FORMAT_PARAMETERS
2260 int av_find_stream_info(AVFormatContext *ic)
2262 return avformat_find_stream_info(ic, NULL);
2266 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2268 int i, count, ret, read_size, j;
2270 AVPacket pkt1, *pkt;
2271 int64_t old_offset = avio_tell(ic->pb);
2272 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2274 for(i=0;i<ic->nb_streams;i++) {
2276 st = ic->streams[i];
2278 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2279 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2280 /* if(!st->time_base.num)
2282 if(!st->codec->time_base.num)
2283 st->codec->time_base= st->time_base;
2285 //only for the split stuff
2286 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2287 st->parser = av_parser_init(st->codec->codec_id);
2288 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2289 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2292 assert(!st->codec->codec);
2293 codec = avcodec_find_decoder(st->codec->codec_id);
2295 /* Ensure that subtitle_header is properly set. */
2296 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2297 && codec && !st->codec->codec)
2298 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
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_open2(st->codec, codec, options ? &options[i] : NULL);
2307 for (i=0; i<ic->nb_streams; i++) {
2308 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2314 if (ff_check_interrupt(&ic->interrupt_callback)){
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 = read_frame_internal(ic, &pkt1);
2365 if (ret == AVERROR(EAGAIN))
2370 ret = -1; /* we could not have all the codec parameters before EOF */
2371 for(i=0;i<ic->nb_streams;i++) {
2372 st = ic->streams[i];
2373 if (!has_codec_parameters(st->codec)){
2375 avcodec_string(buf, sizeof(buf), st->codec, 0);
2376 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2384 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2385 if ((ret = av_dup_packet(pkt)) < 0)
2386 goto find_stream_info_err;
2388 read_size += pkt->size;
2390 st = ic->streams[pkt->stream_index];
2391 if (st->codec_info_nb_frames>1) {
2392 if (st->time_base.den > 0 && av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
2393 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2396 st->info->codec_info_duration += pkt->duration;
2399 int64_t last = st->info->last_dts;
2401 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2402 int64_t duration= pkt->dts - last;
2403 double dur= duration * av_q2d(st->time_base);
2405 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2406 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2407 if (st->info->duration_count < 2)
2408 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2409 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2410 int framerate= get_std_framerate(i);
2411 int ticks= lrintf(dur*framerate/(1001*12));
2412 double error = dur - (double)ticks*1001*12 / framerate;
2413 st->info->duration_error[i] += error*error;
2415 st->info->duration_count++;
2416 // ignore the first 4 values, they might have some random jitter
2417 if (st->info->duration_count > 3)
2418 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2420 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2421 st->info->last_dts = pkt->dts;
2423 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2424 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2426 st->codec->extradata_size= i;
2427 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2428 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2429 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2433 /* if still no information, we try to open the codec and to
2434 decompress the frame. We try to avoid that in most cases as
2435 it takes longer and uses more memory. For MPEG-4, we need to
2436 decompress for QuickTime.
2438 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2439 least one frame of codec data, this makes sure the codec initializes
2440 the channel configuration and does not only trust the values from the container.
2442 try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
2444 st->codec_info_nb_frames++;
2448 // close codecs which were opened in try_decode_frame()
2449 for(i=0;i<ic->nb_streams;i++) {
2450 st = ic->streams[i];
2451 if(st->codec->codec)
2452 avcodec_close(st->codec);
2454 for(i=0;i<ic->nb_streams;i++) {
2455 st = ic->streams[i];
2456 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2457 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2458 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2459 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2460 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2461 // the check for tb_unreliable() is not completely correct, since this is not about handling
2462 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2463 // ipmovie.c produces.
2464 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > 1 && !st->r_frame_rate.num)
2465 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);
2466 if (st->info->duration_count && !st->r_frame_rate.num
2467 && tb_unreliable(st->codec) /*&&
2468 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2469 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2471 double best_error= 2*av_q2d(st->time_base);
2472 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2474 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2475 double error = st->info->duration_error[j] * get_std_framerate(j);
2476 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2477 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2478 if(error < best_error){
2480 num = get_std_framerate(j);
2483 // do not increase frame rate by more than 1 % in order to match a standard rate.
2484 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2485 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2488 if (!st->r_frame_rate.num){
2489 if( st->codec->time_base.den * (int64_t)st->time_base.num
2490 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2491 st->r_frame_rate.num = st->codec->time_base.den;
2492 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2494 st->r_frame_rate.num = st->time_base.den;
2495 st->r_frame_rate.den = st->time_base.num;
2498 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2499 if(!st->codec->bits_per_coded_sample)
2500 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2501 // set stream disposition based on audio service type
2502 switch (st->codec->audio_service_type) {
2503 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2504 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2505 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2506 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2507 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2508 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2509 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2510 st->disposition = AV_DISPOSITION_COMMENT; break;
2511 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2512 st->disposition = AV_DISPOSITION_KARAOKE; break;
2517 estimate_timings(ic, old_offset);
2519 compute_chapters_end(ic);
2522 /* correct DTS for B-frame streams with no timestamps */
2523 for(i=0;i<ic->nb_streams;i++) {
2524 st = ic->streams[i];
2525 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2527 ppktl = &ic->packet_buffer;
2529 if(ppkt1->stream_index != i)
2531 if(ppkt1->pkt->dts < 0)
2533 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2535 ppkt1->pkt->dts -= delta;
2540 st->cur_dts -= delta;
2546 find_stream_info_err:
2547 for (i=0; i < ic->nb_streams; i++)
2548 av_freep(&ic->streams[i]->info);
2552 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2556 for (i = 0; i < ic->nb_programs; i++)
2557 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2558 if (ic->programs[i]->stream_index[j] == s)
2559 return ic->programs[i];
2563 int av_find_best_stream(AVFormatContext *ic,
2564 enum AVMediaType type,
2565 int wanted_stream_nb,
2567 AVCodec **decoder_ret,
2570 int i, nb_streams = ic->nb_streams;
2571 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2572 unsigned *program = NULL;
2573 AVCodec *decoder = NULL, *best_decoder = NULL;
2575 if (related_stream >= 0 && wanted_stream_nb < 0) {
2576 AVProgram *p = find_program_from_stream(ic, related_stream);
2578 program = p->stream_index;
2579 nb_streams = p->nb_stream_indexes;
2582 for (i = 0; i < nb_streams; i++) {
2583 int real_stream_index = program ? program[i] : i;
2584 AVStream *st = ic->streams[real_stream_index];
2585 AVCodecContext *avctx = st->codec;
2586 if (avctx->codec_type != type)
2588 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2590 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2593 decoder = avcodec_find_decoder(st->codec->codec_id);
2596 ret = AVERROR_DECODER_NOT_FOUND;
2600 if (best_count >= st->codec_info_nb_frames)
2602 best_count = st->codec_info_nb_frames;
2603 ret = real_stream_index;
2604 best_decoder = decoder;
2605 if (program && i == nb_streams - 1 && ret < 0) {
2607 nb_streams = ic->nb_streams;
2608 i = 0; /* no related stream found, try again with everything */
2612 *decoder_ret = best_decoder;
2616 /*******************************************************/
2618 int av_read_play(AVFormatContext *s)
2620 if (s->iformat->read_play)
2621 return s->iformat->read_play(s);
2623 return avio_pause(s->pb, 0);
2624 return AVERROR(ENOSYS);
2627 int av_read_pause(AVFormatContext *s)
2629 if (s->iformat->read_pause)
2630 return s->iformat->read_pause(s);
2632 return avio_pause(s->pb, 1);
2633 return AVERROR(ENOSYS);
2636 void av_close_input_stream(AVFormatContext *s)
2638 flush_packet_queue(s);
2639 if (s->iformat->read_close)
2640 s->iformat->read_close(s);
2641 avformat_free_context(s);
2644 void avformat_free_context(AVFormatContext *s)
2650 if (s->iformat && s->iformat->priv_class && s->priv_data)
2651 av_opt_free(s->priv_data);
2653 for(i=0;i<s->nb_streams;i++) {
2654 /* free all data in a stream component */
2657 av_parser_close(st->parser);
2658 av_free_packet(&st->cur_pkt);
2660 av_dict_free(&st->metadata);
2661 av_free(st->index_entries);
2662 av_free(st->codec->extradata);
2663 av_free(st->codec->subtitle_header);
2665 av_free(st->priv_data);
2669 for(i=s->nb_programs-1; i>=0; i--) {
2670 av_dict_free(&s->programs[i]->metadata);
2671 av_freep(&s->programs[i]->stream_index);
2672 av_freep(&s->programs[i]);
2674 av_freep(&s->programs);
2675 av_freep(&s->priv_data);
2676 while(s->nb_chapters--) {
2677 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2678 av_free(s->chapters[s->nb_chapters]);
2680 av_freep(&s->chapters);
2681 av_dict_free(&s->metadata);
2682 av_freep(&s->streams);
2686 void av_close_input_file(AVFormatContext *s)
2688 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2690 av_close_input_stream(s);
2695 #if FF_API_NEW_STREAM
2696 AVStream *av_new_stream(AVFormatContext *s, int id)
2698 AVStream *st = avformat_new_stream(s, NULL);
2705 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
2711 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2713 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2716 s->streams = streams;
2718 st = av_mallocz(sizeof(AVStream));
2721 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2726 st->codec = avcodec_alloc_context3(c);
2728 /* no default bitrate if decoding */
2729 st->codec->bit_rate = 0;
2731 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 *avpriv_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)
2810 if (s->oformat->priv_data_size > 0) {
2811 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2813 return AVERROR(ENOMEM);
2814 if (s->oformat->priv_class) {
2815 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2816 av_opt_set_defaults(s->priv_data);
2819 s->priv_data = NULL;
2821 if (s->oformat->set_parameters) {
2822 ret = s->oformat->set_parameters(s, ap);
2830 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2832 const AVCodecTag *avctag;
2834 enum CodecID id = CODEC_ID_NONE;
2835 unsigned int tag = 0;
2838 * Check that tag + id is in the table
2839 * If neither is in the table -> OK
2840 * If tag is in the table with another id -> FAIL
2841 * If id is in the table with another tag -> FAIL unless strict < normal
2843 for (n = 0; s->oformat->codec_tag[n]; n++) {
2844 avctag = s->oformat->codec_tag[n];
2845 while (avctag->id != CODEC_ID_NONE) {
2846 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
2848 if (id == st->codec->codec_id)
2851 if (avctag->id == st->codec->codec_id)
2856 if (id != CODEC_ID_NONE)
2858 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2863 #if FF_API_FORMAT_PARAMETERS
2864 int av_write_header(AVFormatContext *s)
2866 return avformat_write_header(s, NULL);
2870 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2874 AVDictionary *tmp = NULL;
2877 av_dict_copy(&tmp, *options, 0);
2878 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2881 // some sanity checks
2882 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2883 av_log(s, AV_LOG_ERROR, "no streams\n");
2884 ret = AVERROR(EINVAL);
2888 for(i=0;i<s->nb_streams;i++) {
2891 switch (st->codec->codec_type) {
2892 case AVMEDIA_TYPE_AUDIO:
2893 if(st->codec->sample_rate<=0){
2894 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2895 ret = AVERROR(EINVAL);
2898 if(!st->codec->block_align)
2899 st->codec->block_align = st->codec->channels *
2900 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2902 case AVMEDIA_TYPE_VIDEO:
2903 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2904 av_log(s, AV_LOG_ERROR, "time base not set\n");
2905 ret = AVERROR(EINVAL);
2908 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2909 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2910 ret = AVERROR(EINVAL);
2913 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2914 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2915 ret = AVERROR(EINVAL);
2921 if(s->oformat->codec_tag){
2922 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)){
2923 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2924 st->codec->codec_tag= 0;
2926 if(st->codec->codec_tag){
2927 if (!validate_codec_tag(s, st)) {
2929 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2930 av_log(s, AV_LOG_ERROR,
2931 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
2932 tagbuf, st->codec->codec_tag, st->codec->codec_id);
2933 ret = AVERROR_INVALIDDATA;
2937 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2940 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2941 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2942 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2945 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2946 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2947 if (!s->priv_data) {
2948 ret = AVERROR(ENOMEM);
2951 if (s->oformat->priv_class) {
2952 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2953 av_opt_set_defaults(s->priv_data);
2954 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2959 /* set muxer identification string */
2960 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2961 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
2964 if(s->oformat->write_header){
2965 ret = s->oformat->write_header(s);
2970 /* init PTS generation */
2971 for(i=0;i<s->nb_streams;i++) {
2972 int64_t den = AV_NOPTS_VALUE;
2975 switch (st->codec->codec_type) {
2976 case AVMEDIA_TYPE_AUDIO:
2977 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2979 case AVMEDIA_TYPE_VIDEO:
2980 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2985 if (den != AV_NOPTS_VALUE) {
2987 ret = AVERROR_INVALIDDATA;
2990 frac_init(&st->pts, 0, 0, den);
2995 av_dict_free(options);
3004 //FIXME merge with compute_pkt_fields
3005 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3006 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3007 int num, den, frame_size, i;
3009 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3010 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3012 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
3013 return AVERROR(EINVAL);*/
3015 /* duration field */
3016 if (pkt->duration == 0) {
3017 compute_frame_duration(&num, &den, st, NULL, pkt);
3019 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3023 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3026 //XXX/FIXME this is a temporary hack until all encoders output pts
3027 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3029 // pkt->pts= st->cur_dts;
3030 pkt->pts= st->pts.val;
3033 //calculate dts from pts
3034 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3035 st->pts_buffer[0]= pkt->pts;
3036 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3037 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3038 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3039 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3041 pkt->dts= st->pts_buffer[0];
3044 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
3045 av_log(s, AV_LOG_ERROR,
3046 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3047 st->index, st->cur_dts, pkt->dts);
3048 return AVERROR(EINVAL);
3050 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3051 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3052 return AVERROR(EINVAL);
3055 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3056 st->cur_dts= pkt->dts;
3057 st->pts.val= pkt->dts;
3060 switch (st->codec->codec_type) {
3061 case AVMEDIA_TYPE_AUDIO:
3062 frame_size = get_audio_frame_size(st->codec, pkt->size);
3064 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3065 likely equal to the encoder delay, but it would be better if we
3066 had the real timestamps from the encoder */
3067 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3068 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3071 case AVMEDIA_TYPE_VIDEO:
3072 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3080 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3082 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3084 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3087 ret= s->oformat->write_packet(s, pkt);
3090 s->streams[pkt->stream_index]->nb_frames++;
3094 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3095 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3097 AVPacketList **next_point, *this_pktl;
3099 this_pktl = av_mallocz(sizeof(AVPacketList));
3100 this_pktl->pkt= *pkt;
3101 pkt->destruct= NULL; // do not free original but only the copy
3102 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3104 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3105 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3107 next_point = &s->packet_buffer;
3110 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3111 while(!compare(s, &(*next_point)->pkt, pkt)){
3112 next_point= &(*next_point)->next;
3116 next_point = &(s->packet_buffer_end->next);
3119 assert(!*next_point);
3121 s->packet_buffer_end= this_pktl;
3124 this_pktl->next= *next_point;
3126 s->streams[pkt->stream_index]->last_in_packet_buffer=
3127 *next_point= this_pktl;
3130 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3132 AVStream *st = s->streams[ pkt ->stream_index];
3133 AVStream *st2= s->streams[ next->stream_index];
3134 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3138 return pkt->stream_index < next->stream_index;
3142 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3148 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3151 for(i=0; i < s->nb_streams; i++)
3152 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3154 if(stream_count && (s->nb_streams == stream_count || flush)){
3155 pktl= s->packet_buffer;
3158 s->packet_buffer= pktl->next;
3159 if(!s->packet_buffer)
3160 s->packet_buffer_end= NULL;
3162 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3163 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3167 av_init_packet(out);
3173 * Interleave an AVPacket correctly so it can be muxed.
3174 * @param out the interleaved packet will be output here
3175 * @param in the input packet
3176 * @param flush 1 if no further packets are available as input and all
3177 * remaining packets should be output
3178 * @return 1 if a packet was output, 0 if no packet could be output,
3179 * < 0 if an error occurred
3181 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3182 if(s->oformat->interleave_packet)
3183 return s->oformat->interleave_packet(s, out, in, flush);
3185 return av_interleave_packet_per_dts(s, out, in, flush);
3188 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3189 AVStream *st= s->streams[ pkt->stream_index];
3192 //FIXME/XXX/HACK drop zero sized packets
3193 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3196 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3197 pkt->size, pkt->dts, pkt->pts);
3198 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3201 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3202 return AVERROR(EINVAL);
3206 int ret= interleave_packet(s, &opkt, pkt, 0);
3207 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3210 ret= s->oformat->write_packet(s, &opkt);
3212 s->streams[opkt.stream_index]->nb_frames++;
3214 av_free_packet(&opkt);
3222 int av_write_trailer(AVFormatContext *s)
3228 ret= interleave_packet(s, &pkt, NULL, 1);
3229 if(ret<0) //FIXME cleanup needed for ret<0 ?
3234 ret= s->oformat->write_packet(s, &pkt);
3236 s->streams[pkt.stream_index]->nb_frames++;
3238 av_free_packet(&pkt);
3244 if(s->oformat->write_trailer)
3245 ret = s->oformat->write_trailer(s);
3247 for(i=0;i<s->nb_streams;i++) {
3248 av_freep(&s->streams[i]->priv_data);
3249 av_freep(&s->streams[i]->index_entries);
3251 if (s->iformat && s->iformat->priv_class)
3252 av_opt_free(s->priv_data);
3253 av_freep(&s->priv_data);
3257 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3260 AVProgram *program=NULL;
3263 if (idx >= ac->nb_streams) {
3264 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3268 for(i=0; i<ac->nb_programs; i++){
3269 if(ac->programs[i]->id != progid)
3271 program = ac->programs[i];
3272 for(j=0; j<program->nb_stream_indexes; j++)
3273 if(program->stream_index[j] == idx)
3276 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3279 program->stream_index = tmp;
3280 program->stream_index[program->nb_stream_indexes++] = idx;
3285 static void print_fps(double d, const char *postfix){
3286 uint64_t v= lrintf(d*100);
3287 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3288 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3289 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3292 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3294 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3295 AVDictionaryEntry *tag=NULL;
3297 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3298 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3299 if(strcmp("language", tag->key))
3300 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
3305 /* "user interface" functions */
3306 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3309 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3310 AVStream *st = ic->streams[i];
3311 int g = av_gcd(st->time_base.num, st->time_base.den);
3312 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3313 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3314 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3315 /* the pid is an important information, so we display it */
3316 /* XXX: add a generic system */
3317 if (flags & AVFMT_SHOW_IDS)
3318 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3320 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3321 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3322 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3323 if (st->sample_aspect_ratio.num && // default
3324 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3325 AVRational display_aspect_ratio;
3326 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3327 st->codec->width*st->sample_aspect_ratio.num,
3328 st->codec->height*st->sample_aspect_ratio.den,
3330 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3331 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3332 display_aspect_ratio.num, display_aspect_ratio.den);
3334 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3335 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3336 print_fps(av_q2d(st->avg_frame_rate), "fps");
3337 if(st->r_frame_rate.den && st->r_frame_rate.num)
3338 print_fps(av_q2d(st->r_frame_rate), "tbr");
3339 if(st->time_base.den && st->time_base.num)
3340 print_fps(1/av_q2d(st->time_base), "tbn");
3341 if(st->codec->time_base.den && st->codec->time_base.num)
3342 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3344 if (st->disposition & AV_DISPOSITION_DEFAULT)
3345 av_log(NULL, AV_LOG_INFO, " (default)");
3346 if (st->disposition & AV_DISPOSITION_DUB)
3347 av_log(NULL, AV_LOG_INFO, " (dub)");
3348 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3349 av_log(NULL, AV_LOG_INFO, " (original)");
3350 if (st->disposition & AV_DISPOSITION_COMMENT)
3351 av_log(NULL, AV_LOG_INFO, " (comment)");
3352 if (st->disposition & AV_DISPOSITION_LYRICS)
3353 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3354 if (st->disposition & AV_DISPOSITION_KARAOKE)
3355 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3356 if (st->disposition & AV_DISPOSITION_FORCED)
3357 av_log(NULL, AV_LOG_INFO, " (forced)");
3358 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3359 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3360 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3361 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3362 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3363 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3364 av_log(NULL, AV_LOG_INFO, "\n");
3365 dump_metadata(NULL, st->metadata, " ");
3368 #if FF_API_DUMP_FORMAT
3369 void dump_format(AVFormatContext *ic,
3374 av_dump_format(ic, index, url, is_output);
3378 void av_dump_format(AVFormatContext *ic,
3384 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3385 if (ic->nb_streams && !printed)
3388 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3389 is_output ? "Output" : "Input",
3391 is_output ? ic->oformat->name : ic->iformat->name,
3392 is_output ? "to" : "from", url);
3393 dump_metadata(NULL, ic->metadata, " ");
3395 av_log(NULL, AV_LOG_INFO, " Duration: ");
3396 if (ic->duration != AV_NOPTS_VALUE) {
3397 int hours, mins, secs, us;
3398 secs = ic->duration / AV_TIME_BASE;
3399 us = ic->duration % AV_TIME_BASE;
3404 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3405 (100 * us) / AV_TIME_BASE);
3407 av_log(NULL, AV_LOG_INFO, "N/A");
3409 if (ic->start_time != AV_NOPTS_VALUE) {
3411 av_log(NULL, AV_LOG_INFO, ", start: ");
3412 secs = ic->start_time / AV_TIME_BASE;
3413 us = abs(ic->start_time % AV_TIME_BASE);
3414 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3415 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3417 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3419 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3421 av_log(NULL, AV_LOG_INFO, "N/A");
3423 av_log(NULL, AV_LOG_INFO, "\n");
3425 for (i = 0; i < ic->nb_chapters; i++) {
3426 AVChapter *ch = ic->chapters[i];
3427 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3428 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3429 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3431 dump_metadata(NULL, ch->metadata, " ");
3433 if(ic->nb_programs) {
3434 int j, k, total = 0;
3435 for(j=0; j<ic->nb_programs; j++) {
3436 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3438 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3439 name ? name->value : "");
3440 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3441 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3442 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3443 printed[ic->programs[j]->stream_index[k]] = 1;
3445 total += ic->programs[j]->nb_stream_indexes;
3447 if (total < ic->nb_streams)
3448 av_log(NULL, AV_LOG_INFO, " No Program\n");
3450 for(i=0;i<ic->nb_streams;i++)
3452 dump_stream_format(ic, i, index, is_output);
3457 int64_t av_gettime(void)
3460 gettimeofday(&tv,NULL);
3461 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3464 uint64_t ff_ntp_time(void)
3466 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3469 #if FF_API_PARSE_DATE
3470 #include "libavutil/parseutils.h"
3472 int64_t parse_date(const char *timestr, int duration)
3475 av_parse_time(&timeval, timestr, duration);
3480 #if FF_API_FIND_INFO_TAG
3481 #include "libavutil/parseutils.h"
3483 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3485 return av_find_info_tag(arg, arg_size, tag1, info);
3489 int av_get_frame_filename(char *buf, int buf_size,
3490 const char *path, int number)
3493 char *q, buf1[20], c;
3494 int nd, len, percentd_found;
3506 while (isdigit(*p)) {
3507 nd = nd * 10 + *p++ - '0';
3510 } while (isdigit(c));
3519 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3521 if ((q - buf + len) > buf_size - 1)
3523 memcpy(q, buf1, len);
3531 if ((q - buf) < buf_size - 1)
3535 if (!percentd_found)
3544 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3548 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3550 for(i=0;i<size;i+=16) {
3557 PRINT(" %02x", buf[i+j]);
3562 for(j=0;j<len;j++) {
3564 if (c < ' ' || c > '~')
3573 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3575 hex_dump_internal(NULL, f, 0, buf, size);
3578 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3580 hex_dump_internal(avcl, NULL, level, buf, size);
3583 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3586 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3587 PRINT("stream #%d:\n", pkt->stream_index);
3588 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3589 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3590 /* DTS is _always_ valid after av_read_frame() */
3592 if (pkt->dts == AV_NOPTS_VALUE)
3595 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3596 /* PTS may not be known if B-frames are present. */
3598 if (pkt->pts == AV_NOPTS_VALUE)
3601 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3603 PRINT(" size=%d\n", pkt->size);
3606 av_hex_dump(f, pkt->data, pkt->size);
3610 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3612 AVRational tb = { 1, AV_TIME_BASE };
3613 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3617 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3619 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3623 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3625 AVRational tb = { 1, AV_TIME_BASE };
3626 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3630 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3633 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3636 void av_url_split(char *proto, int proto_size,
3637 char *authorization, int authorization_size,
3638 char *hostname, int hostname_size,
3640 char *path, int path_size,
3643 const char *p, *ls, *at, *col, *brk;
3645 if (port_ptr) *port_ptr = -1;
3646 if (proto_size > 0) proto[0] = 0;
3647 if (authorization_size > 0) authorization[0] = 0;
3648 if (hostname_size > 0) hostname[0] = 0;
3649 if (path_size > 0) path[0] = 0;
3651 /* parse protocol */
3652 if ((p = strchr(url, ':'))) {
3653 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3658 /* no protocol means plain filename */
3659 av_strlcpy(path, url, path_size);
3663 /* separate path from hostname */
3664 ls = strchr(p, '/');
3666 ls = strchr(p, '?');
3668 av_strlcpy(path, ls, path_size);
3670 ls = &p[strlen(p)]; // XXX
3672 /* the rest is hostname, use that to parse auth/port */
3674 /* authorization (user[:pass]@hostname) */
3675 if ((at = strchr(p, '@')) && at < ls) {
3676 av_strlcpy(authorization, p,
3677 FFMIN(authorization_size, at + 1 - p));
3678 p = at + 1; /* skip '@' */
3681 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3683 av_strlcpy(hostname, p + 1,
3684 FFMIN(hostname_size, brk - p));
3685 if (brk[1] == ':' && port_ptr)
3686 *port_ptr = atoi(brk + 2);
3687 } else if ((col = strchr(p, ':')) && col < ls) {
3688 av_strlcpy(hostname, p,
3689 FFMIN(col + 1 - p, hostname_size));
3690 if (port_ptr) *port_ptr = atoi(col + 1);
3692 av_strlcpy(hostname, p,
3693 FFMIN(ls + 1 - p, hostname_size));
3697 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3700 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3703 'C', 'D', 'E', 'F' };
3704 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3707 'c', 'd', 'e', 'f' };
3708 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3710 for(i = 0; i < s; i++) {
3711 buff[i * 2] = hex_table[src[i] >> 4];
3712 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3718 int ff_hex_to_data(uint8_t *data, const char *p)
3725 p += strspn(p, SPACE_CHARS);
3728 c = toupper((unsigned char) *p++);
3729 if (c >= '0' && c <= '9')
3731 else if (c >= 'A' && c <= 'F')
3746 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3747 unsigned int pts_num, unsigned int pts_den)
3750 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3751 if(new_tb.num != pts_num)
3752 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3754 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3756 if(new_tb.num <= 0 || new_tb.den <= 0) {
3757 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3760 s->time_base = new_tb;
3761 s->pts_wrap_bits = pts_wrap_bits;
3764 int ff_url_join(char *str, int size, const char *proto,
3765 const char *authorization, const char *hostname,
3766 int port, const char *fmt, ...)
3769 struct addrinfo hints, *ai;
3774 av_strlcatf(str, size, "%s://", proto);
3775 if (authorization && authorization[0])
3776 av_strlcatf(str, size, "%s@", authorization);
3777 #if CONFIG_NETWORK && defined(AF_INET6)
3778 /* Determine if hostname is a numerical IPv6 address,
3779 * properly escape it within [] in that case. */
3780 memset(&hints, 0, sizeof(hints));
3781 hints.ai_flags = AI_NUMERICHOST;
3782 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3783 if (ai->ai_family == AF_INET6) {
3784 av_strlcat(str, "[", size);
3785 av_strlcat(str, hostname, size);
3786 av_strlcat(str, "]", size);
3788 av_strlcat(str, hostname, size);
3793 /* Not an IPv6 address, just output the plain string. */
3794 av_strlcat(str, hostname, size);
3797 av_strlcatf(str, size, ":%d", port);
3800 int len = strlen(str);
3803 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3809 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3810 AVFormatContext *src)
3815 local_pkt.stream_index = dst_stream;
3816 if (pkt->pts != AV_NOPTS_VALUE)
3817 local_pkt.pts = av_rescale_q(pkt->pts,
3818 src->streams[pkt->stream_index]->time_base,
3819 dst->streams[dst_stream]->time_base);
3820 if (pkt->dts != AV_NOPTS_VALUE)
3821 local_pkt.dts = av_rescale_q(pkt->dts,
3822 src->streams[pkt->stream_index]->time_base,
3823 dst->streams[dst_stream]->time_base);
3824 return av_write_frame(dst, &local_pkt);
3827 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3830 const char *ptr = str;
3832 /* Parse key=value pairs. */
3835 char *dest = NULL, *dest_end;
3836 int key_len, dest_len = 0;
3838 /* Skip whitespace and potential commas. */
3839 while (*ptr && (isspace(*ptr) || *ptr == ','))
3846 if (!(ptr = strchr(key, '=')))
3849 key_len = ptr - key;
3851 callback_get_buf(context, key, key_len, &dest, &dest_len);
3852 dest_end = dest + dest_len - 1;
3856 while (*ptr && *ptr != '\"') {
3860 if (dest && dest < dest_end)
3864 if (dest && dest < dest_end)
3872 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3873 if (dest && dest < dest_end)
3881 int ff_find_stream_index(AVFormatContext *s, int id)
3884 for (i = 0; i < s->nb_streams; i++) {
3885 if (s->streams[i]->id == id)
3891 void ff_make_absolute_url(char *buf, int size, const char *base,
3895 /* Absolute path, relative to the current server */
3896 if (base && strstr(base, "://") && rel[0] == '/') {
3898 av_strlcpy(buf, base, size);
3899 sep = strstr(buf, "://");
3902 sep = strchr(sep, '/');
3906 av_strlcat(buf, rel, size);
3909 /* If rel actually is an absolute url, just copy it */
3910 if (!base || strstr(rel, "://") || rel[0] == '/') {
3911 av_strlcpy(buf, rel, size);
3915 av_strlcpy(buf, base, size);
3916 /* Remove the file name from the base url */
3917 sep = strrchr(buf, '/');
3922 while (av_strstart(rel, "../", NULL) && sep) {
3923 /* Remove the path delimiter at the end */
3925 sep = strrchr(buf, '/');
3926 /* If the next directory name to pop off is "..", break here */
3927 if (!strcmp(sep ? &sep[1] : buf, "..")) {
3928 /* Readd the slash we just removed */
3929 av_strlcat(buf, "/", size);
3932 /* Cut off the directory name */
3939 av_strlcat(buf, rel, size);
3942 int64_t ff_iso8601_to_unix_time(const char *datestr)
3945 struct tm time = {0};
3946 strptime(datestr, "%Y - %m - %dT%T", &time);
3947 return mktime(&time);
3949 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
3950 "the date string.\n");
3955 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
3958 if (ofmt->query_codec)
3959 return ofmt->query_codec(codec_id, std_compliance);
3960 else if (ofmt->codec_tag)
3961 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
3962 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
3963 codec_id == ofmt->subtitle_codec)
3966 return AVERROR_PATCHWELCOME;
3969 int avformat_network_init(void)
3973 ff_network_inited_globally = 1;
3974 if ((ret = ff_network_init()) < 0)
3981 int avformat_network_deinit(void)