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 "libavcodec/bytestream.h"
29 #include "libavutil/opt.h"
30 #include "libavutil/dict.h"
31 #include "libavutil/pixdesc.h"
34 #include "libavutil/avstring.h"
35 #include "libavutil/mathematics.h"
36 #include "libavutil/parseutils.h"
38 #include "audiointerleave.h"
52 * various utility functions for use within Libav
55 unsigned avformat_version(void)
57 return LIBAVFORMAT_VERSION_INT;
60 const char *avformat_configuration(void)
62 return LIBAV_CONFIGURATION;
65 const char *avformat_license(void)
67 #define LICENSE_PREFIX "libavformat license: "
68 return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
71 /* fraction handling */
74 * f = val + (num / den) + 0.5.
76 * 'num' is normalized so that it is such as 0 <= num < den.
78 * @param f fractional number
79 * @param val integer value
80 * @param num must be >= 0
81 * @param den must be >= 1
83 static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
96 * Fractional addition to f: f = f + (incr / f->den).
98 * @param f fractional number
99 * @param incr increment, can be positive or negative
101 static void frac_add(AVFrac *f, int64_t incr)
114 } else if (num >= den) {
121 /** head of registered input format linked list */
122 static AVInputFormat *first_iformat = NULL;
123 /** head of registered output format linked list */
124 static AVOutputFormat *first_oformat = NULL;
126 AVInputFormat *av_iformat_next(AVInputFormat *f)
128 if(f) return f->next;
129 else return first_iformat;
132 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
134 if(f) return f->next;
135 else return first_oformat;
138 void av_register_input_format(AVInputFormat *format)
142 while (*p != NULL) p = &(*p)->next;
147 void av_register_output_format(AVOutputFormat *format)
151 while (*p != NULL) p = &(*p)->next;
156 int av_match_ext(const char *filename, const char *extensions)
164 ext = strrchr(filename, '.');
170 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
173 if (!av_strcasecmp(ext1, ext))
183 static int match_format(const char *name, const char *names)
191 namelen = strlen(name);
192 while ((p = strchr(names, ','))) {
193 len = FFMAX(p - names, namelen);
194 if (!av_strncasecmp(name, names, len))
198 return !av_strcasecmp(name, names);
201 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
202 const char *mime_type)
204 AVOutputFormat *fmt = NULL, *fmt_found;
205 int score_max, score;
207 /* specific test for image sequences */
208 #if CONFIG_IMAGE2_MUXER
209 if (!short_name && filename &&
210 av_filename_number_test(filename) &&
211 ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
212 return av_guess_format("image2", NULL, NULL);
215 /* Find the proper file type. */
218 while ((fmt = av_oformat_next(fmt))) {
220 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
222 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
224 if (filename && fmt->extensions &&
225 av_match_ext(filename, fmt->extensions)) {
228 if (score > score_max) {
236 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
237 const char *filename, const char *mime_type, enum AVMediaType type){
238 if(type == AVMEDIA_TYPE_VIDEO){
239 enum CodecID codec_id= CODEC_ID_NONE;
241 #if CONFIG_IMAGE2_MUXER
242 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
243 codec_id= ff_guess_image2_codec(filename);
246 if(codec_id == CODEC_ID_NONE)
247 codec_id= fmt->video_codec;
249 }else if(type == AVMEDIA_TYPE_AUDIO)
250 return fmt->audio_codec;
251 else if (type == AVMEDIA_TYPE_SUBTITLE)
252 return fmt->subtitle_codec;
254 return CODEC_ID_NONE;
257 AVInputFormat *av_find_input_format(const char *short_name)
259 AVInputFormat *fmt = NULL;
260 while ((fmt = av_iformat_next(fmt))) {
261 if (match_format(short_name, fmt->name))
268 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
270 int ret= av_new_packet(pkt, size);
275 pkt->pos= avio_tell(s);
277 ret= avio_read(s, pkt->data, size);
281 av_shrink_packet(pkt, ret);
286 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
291 return av_get_packet(s, pkt, size);
292 old_size = pkt->size;
293 ret = av_grow_packet(pkt, size);
296 ret = avio_read(s, pkt->data + old_size, size);
297 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
302 int av_filename_number_test(const char *filename)
305 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
308 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
310 AVProbeData lpd = *pd;
311 AVInputFormat *fmt1 = NULL, *fmt;
314 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
315 int id3len = ff_id3v2_tag_len(lpd.buf);
316 if (lpd.buf_size > id3len + 16) {
318 lpd.buf_size -= id3len;
324 while ((fmt1 = av_iformat_next(fmt1))) {
325 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
328 if (fmt1->read_probe) {
329 score = fmt1->read_probe(&lpd);
330 } else if (fmt1->extensions) {
331 if (av_match_ext(lpd.filename, fmt1->extensions)) {
335 if (score > *score_max) {
338 }else if (score == *score_max)
342 /* a hack for files with huge id3v2 tags -- try to guess by file extension. */
343 if (!fmt && is_opened && *score_max < AVPROBE_SCORE_MAX/4) {
344 while ((fmt = av_iformat_next(fmt)))
345 if (fmt->extensions && av_match_ext(lpd.filename, fmt->extensions)) {
346 *score_max = AVPROBE_SCORE_MAX/4;
351 if (!fmt && id3 && *score_max < AVPROBE_SCORE_MAX/4-1) {
352 while ((fmt = av_iformat_next(fmt)))
353 if (fmt->extensions && av_match_ext("mp3", fmt->extensions)) {
354 *score_max = AVPROBE_SCORE_MAX/4-1;
362 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
364 return av_probe_input_format2(pd, is_opened, &score);
367 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
369 static const struct {
370 const char *name; enum CodecID id; enum AVMediaType type;
372 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
373 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
374 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
375 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
376 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
377 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
378 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
379 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
382 AVInputFormat *fmt = av_probe_input_format2(pd, 1, &score);
386 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
387 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
388 for (i = 0; fmt_id_type[i].name; i++) {
389 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
390 st->codec->codec_id = fmt_id_type[i].id;
391 st->codec->codec_type = fmt_id_type[i].type;
399 /************************************************************/
400 /* input media file */
402 #if FF_API_FORMAT_PARAMETERS
403 static AVDictionary *convert_format_parameters(AVFormatParameters *ap)
406 AVDictionary *opts = NULL;
411 if (ap->time_base.num) {
412 snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
413 av_dict_set(&opts, "framerate", buf, 0);
415 if (ap->sample_rate) {
416 snprintf(buf, sizeof(buf), "%d", ap->sample_rate);
417 av_dict_set(&opts, "sample_rate", buf, 0);
420 snprintf(buf, sizeof(buf), "%d", ap->channels);
421 av_dict_set(&opts, "channels", buf, 0);
423 if (ap->width || ap->height) {
424 snprintf(buf, sizeof(buf), "%dx%d", ap->width, ap->height);
425 av_dict_set(&opts, "video_size", buf, 0);
427 if (ap->pix_fmt != PIX_FMT_NONE) {
428 av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(ap->pix_fmt), 0);
431 snprintf(buf, sizeof(buf), "%d", ap->channel);
432 av_dict_set(&opts, "channel", buf, 0);
435 av_dict_set(&opts, "standard", ap->standard, 0);
437 if (ap->mpeg2ts_compute_pcr) {
438 av_dict_set(&opts, "mpeg2ts_compute_pcr", "1", 0);
440 if (ap->initial_pause) {
441 av_dict_set(&opts, "initial_pause", "1", 0);
447 * Open a media file from an IO stream. 'fmt' must be specified.
449 int av_open_input_stream(AVFormatContext **ic_ptr,
450 AVIOContext *pb, const char *filename,
451 AVInputFormat *fmt, AVFormatParameters *ap)
456 AVFormatParameters default_ap;
460 memset(ap, 0, sizeof(default_ap));
462 opts = convert_format_parameters(ap);
464 if(!ap->prealloced_context)
465 ic = avformat_alloc_context();
469 err = AVERROR(ENOMEM);
472 if (pb && fmt && fmt->flags & AVFMT_NOFILE)
473 av_log(ic, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
474 "will be ignored with AVFMT_NOFILE format.\n");
478 if ((err = avformat_open_input(&ic, filename, fmt, &opts)) < 0)
480 ic->pb = ic->pb ? ic->pb : pb; // don't leak custom pb if it wasn't set above
489 /** size of probe buffer, for guessing file type from file contents */
490 #define PROBE_BUF_MIN 2048
491 #define PROBE_BUF_MAX (1<<20)
493 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
494 const char *filename, void *logctx,
495 unsigned int offset, unsigned int max_probe_size)
497 AVProbeData pd = { filename ? filename : "", NULL, -offset };
498 unsigned char *buf = NULL;
499 int ret = 0, probe_size;
501 if (!max_probe_size) {
502 max_probe_size = PROBE_BUF_MAX;
503 } else if (max_probe_size > PROBE_BUF_MAX) {
504 max_probe_size = PROBE_BUF_MAX;
505 } else if (max_probe_size < PROBE_BUF_MIN) {
506 return AVERROR(EINVAL);
509 if (offset >= max_probe_size) {
510 return AVERROR(EINVAL);
513 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
514 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
515 int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
516 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
518 if (probe_size < offset) {
522 /* read probe data */
523 buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
524 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
525 /* fail if error was not end of file, otherwise, lower score */
526 if (ret != AVERROR_EOF) {
531 ret = 0; /* error was end of file, nothing read */
534 pd.buf = &buf[offset];
536 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
538 /* guess file format */
539 *fmt = av_probe_input_format2(&pd, 1, &score);
541 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
542 av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
544 av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
550 return AVERROR_INVALIDDATA;
553 /* rewind. reuse probe buffer to avoid seeking */
554 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
560 #if FF_API_FORMAT_PARAMETERS
561 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
564 AVFormatParameters *ap)
567 AVDictionary *opts = convert_format_parameters(ap);
569 if (!ap || !ap->prealloced_context)
572 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
579 /* open input file and probe the format if necessary */
580 static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)
583 AVProbeData pd = {filename, NULL, 0};
586 s->flags |= AVFMT_FLAG_CUSTOM_IO;
588 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
589 else if (s->iformat->flags & AVFMT_NOFILE)
590 return AVERROR(EINVAL);
594 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
595 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
598 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ,
599 &s->interrupt_callback, options)) < 0)
603 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
606 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
608 AVFormatContext *s = *ps;
610 AVFormatParameters ap = { { 0 } };
611 AVDictionary *tmp = NULL;
613 if (!s && !(s = avformat_alloc_context()))
614 return AVERROR(ENOMEM);
619 av_dict_copy(&tmp, *options, 0);
621 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
624 if ((ret = init_input(s, filename, &tmp)) < 0)
627 /* check filename in case an image number is expected */
628 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
629 if (!av_filename_number_test(filename)) {
630 ret = AVERROR(EINVAL);
635 s->duration = s->start_time = AV_NOPTS_VALUE;
636 av_strlcpy(s->filename, filename, sizeof(s->filename));
638 /* allocate private data */
639 if (s->iformat->priv_data_size > 0) {
640 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
641 ret = AVERROR(ENOMEM);
644 if (s->iformat->priv_class) {
645 *(const AVClass**)s->priv_data = s->iformat->priv_class;
646 av_opt_set_defaults(s->priv_data);
647 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
652 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
654 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
656 if (s->iformat->read_header)
657 if ((ret = s->iformat->read_header(s, &ap)) < 0)
660 if (s->pb && !s->data_offset)
661 s->data_offset = avio_tell(s->pb);
663 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
666 av_dict_free(options);
674 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
676 avformat_free_context(s);
681 /*******************************************************/
683 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
684 AVPacketList **plast_pktl){
685 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
690 (*plast_pktl)->next = pktl;
692 *packet_buffer = pktl;
694 /* add the packet in the buffered packet list */
700 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
706 AVPacketList *pktl = s->raw_packet_buffer;
710 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
711 !s->streams[pkt->stream_index]->probe_packets ||
712 s->raw_packet_buffer_remaining_size < pkt->size){
713 AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
716 s->raw_packet_buffer = pktl->next;
717 s->raw_packet_buffer_remaining_size += pkt->size;
724 ret= s->iformat->read_packet(s, pkt);
726 if (!pktl || ret == AVERROR(EAGAIN))
728 for (i = 0; i < s->nb_streams; i++)
729 s->streams[i]->probe_packets = 0;
733 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
734 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
735 av_log(s, AV_LOG_WARNING,
736 "Dropped corrupted packet (stream = %d)\n",
742 st= s->streams[pkt->stream_index];
744 switch(st->codec->codec_type){
745 case AVMEDIA_TYPE_VIDEO:
746 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
748 case AVMEDIA_TYPE_AUDIO:
749 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
751 case AVMEDIA_TYPE_SUBTITLE:
752 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
756 if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
760 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
761 s->raw_packet_buffer_remaining_size -= pkt->size;
763 if(st->codec->codec_id == CODEC_ID_PROBE){
764 AVProbeData *pd = &st->probe_data;
765 av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
768 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
769 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
770 pd->buf_size += pkt->size;
771 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
773 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
774 //FIXME we do not reduce score to 0 for the case of running out of buffer space in bytes
775 set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0);
776 if(st->codec->codec_id != CODEC_ID_PROBE){
779 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
786 /**********************************************************/
789 * Get the number of samples of an audio frame. Return -1 on error.
791 static int get_audio_frame_size(AVCodecContext *enc, int size)
795 if(enc->codec_id == CODEC_ID_VORBIS)
798 if (enc->frame_size <= 1) {
799 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
801 if (bits_per_sample) {
802 if (enc->channels == 0)
804 frame_size = (size << 3) / (bits_per_sample * enc->channels);
806 /* used for example by ADPCM codecs */
807 if (enc->bit_rate == 0)
809 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
812 frame_size = enc->frame_size;
819 * Return the frame duration in seconds. Return 0 if not available.
821 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
822 AVCodecParserContext *pc, AVPacket *pkt)
828 switch(st->codec->codec_type) {
829 case AVMEDIA_TYPE_VIDEO:
830 if (st->r_frame_rate.num) {
831 *pnum = st->r_frame_rate.den;
832 *pden = st->r_frame_rate.num;
833 } else if(st->time_base.num*1000LL > st->time_base.den) {
834 *pnum = st->time_base.num;
835 *pden = st->time_base.den;
836 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
837 *pnum = st->codec->time_base.num;
838 *pden = st->codec->time_base.den;
839 if (pc && pc->repeat_pict) {
840 *pnum = (*pnum) * (1 + pc->repeat_pict);
842 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
843 //Thus if we have no parser in such case leave duration undefined.
844 if(st->codec->ticks_per_frame>1 && !pc){
849 case AVMEDIA_TYPE_AUDIO:
850 frame_size = get_audio_frame_size(st->codec, pkt->size);
851 if (frame_size <= 0 || st->codec->sample_rate <= 0)
854 *pden = st->codec->sample_rate;
861 static int is_intra_only(AVCodecContext *enc){
862 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
864 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
865 switch(enc->codec_id){
867 case CODEC_ID_MJPEGB:
869 case CODEC_ID_PRORES:
870 case CODEC_ID_RAWVIDEO:
871 case CODEC_ID_DVVIDEO:
872 case CODEC_ID_HUFFYUV:
873 case CODEC_ID_FFVHUFF:
878 case CODEC_ID_JPEG2000:
886 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
887 int64_t dts, int64_t pts)
889 AVStream *st= s->streams[stream_index];
890 AVPacketList *pktl= s->packet_buffer;
892 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
895 st->first_dts= dts - st->cur_dts;
898 for(; pktl; pktl= pktl->next){
899 if(pktl->pkt.stream_index != stream_index)
901 //FIXME think more about this check
902 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
903 pktl->pkt.pts += st->first_dts;
905 if(pktl->pkt.dts != AV_NOPTS_VALUE)
906 pktl->pkt.dts += st->first_dts;
908 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
909 st->start_time= pktl->pkt.pts;
911 if (st->start_time == AV_NOPTS_VALUE)
912 st->start_time = pts;
915 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
917 AVPacketList *pktl= s->packet_buffer;
920 if(st->first_dts != AV_NOPTS_VALUE){
921 cur_dts= st->first_dts;
922 for(; pktl; pktl= pktl->next){
923 if(pktl->pkt.stream_index == pkt->stream_index){
924 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
926 cur_dts -= pkt->duration;
929 pktl= s->packet_buffer;
930 st->first_dts = cur_dts;
931 }else if(st->cur_dts)
934 for(; pktl; pktl= pktl->next){
935 if(pktl->pkt.stream_index != pkt->stream_index)
937 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
938 && !pktl->pkt.duration){
939 pktl->pkt.dts= cur_dts;
940 if(!st->codec->has_b_frames)
941 pktl->pkt.pts= cur_dts;
942 cur_dts += pkt->duration;
943 pktl->pkt.duration= pkt->duration;
947 if(st->first_dts == AV_NOPTS_VALUE)
948 st->cur_dts= cur_dts;
951 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
952 AVCodecParserContext *pc, AVPacket *pkt)
954 int num, den, presentation_delayed, delay, i;
957 if (s->flags & AVFMT_FLAG_NOFILLIN)
960 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
961 pkt->dts= AV_NOPTS_VALUE;
963 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
964 //FIXME Set low_delay = 0 when has_b_frames = 1
965 st->codec->has_b_frames = 1;
967 /* do we have a video B-frame ? */
968 delay= st->codec->has_b_frames;
969 presentation_delayed = 0;
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 skipped 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)
2129 int got_picture, ret = 0;
2131 AVPacket pkt = *avpkt;
2133 if(!st->codec->codec){
2134 codec = avcodec_find_decoder(st->codec->codec_id);
2137 ret = avcodec_open2(st->codec, codec, options);
2142 while (pkt.size > 0 && ret >= 0 &&
2143 (!has_codec_parameters(st->codec) ||
2144 !has_decode_delay_been_guessed(st) ||
2145 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2147 avcodec_get_frame_defaults(&picture);
2148 switch(st->codec->codec_type) {
2149 case AVMEDIA_TYPE_VIDEO:
2150 ret = avcodec_decode_video2(st->codec, &picture,
2151 &got_picture, &pkt);
2153 case AVMEDIA_TYPE_AUDIO:
2154 ret = avcodec_decode_audio4(st->codec, &picture, &got_picture, &pkt);
2161 st->info->nb_decoded_frames++;
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 /* this function doesn't flush the decoders, so force thread count
2296 * to 1 to fix behavior when thread count > number of frames in the file */
2298 av_dict_set(&options[i], "threads", "1", 0);
2300 /* Ensure that subtitle_header is properly set. */
2301 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2302 && codec && !st->codec->codec)
2303 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2305 //try to just open decoders, in case this is enough to get parameters
2306 if(!has_codec_parameters(st->codec)){
2307 if (codec && !st->codec->codec)
2308 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2312 for (i=0; i<ic->nb_streams; i++) {
2313 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2319 if (ff_check_interrupt(&ic->interrupt_callback)){
2321 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2325 /* check if one codec still needs to be handled */
2326 for(i=0;i<ic->nb_streams;i++) {
2327 int fps_analyze_framecount = 20;
2329 st = ic->streams[i];
2330 if (!has_codec_parameters(st->codec))
2332 /* if the timebase is coarse (like the usual millisecond precision
2333 of mkv), we need to analyze more frames to reliably arrive at
2335 if (av_q2d(st->time_base) > 0.0005)
2336 fps_analyze_framecount *= 2;
2337 if (ic->fps_probe_size >= 0)
2338 fps_analyze_framecount = ic->fps_probe_size;
2339 /* variable fps and no guess at the real fps */
2340 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2341 && st->info->duration_count < fps_analyze_framecount
2342 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2344 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2346 if(st->first_dts == AV_NOPTS_VALUE)
2349 if (i == ic->nb_streams) {
2350 /* NOTE: if the format has no header, then we need to read
2351 some packets to get most of the streams, so we cannot
2353 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2354 /* if we found the info for all the codecs, we can stop */
2356 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2360 /* we did not get all the codec info, but we read too much data */
2361 if (read_size >= ic->probesize) {
2363 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2367 /* NOTE: a new stream can be added there if no header in file
2368 (AVFMTCTX_NOHEADER) */
2369 ret = read_frame_internal(ic, &pkt1);
2370 if (ret == AVERROR(EAGAIN))
2375 ret = -1; /* we could not have all the codec parameters before EOF */
2376 for(i=0;i<ic->nb_streams;i++) {
2377 st = ic->streams[i];
2378 if (!has_codec_parameters(st->codec)){
2380 avcodec_string(buf, sizeof(buf), st->codec, 0);
2381 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2389 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2390 if ((ret = av_dup_packet(pkt)) < 0)
2391 goto find_stream_info_err;
2393 read_size += pkt->size;
2395 st = ic->streams[pkt->stream_index];
2396 if (st->codec_info_nb_frames>1) {
2397 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) {
2398 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2401 st->info->codec_info_duration += pkt->duration;
2404 int64_t last = st->info->last_dts;
2406 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2407 int64_t duration= pkt->dts - last;
2408 double dur= duration * av_q2d(st->time_base);
2410 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2411 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2412 if (st->info->duration_count < 2)
2413 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2414 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2415 int framerate= get_std_framerate(i);
2416 int ticks= lrintf(dur*framerate/(1001*12));
2417 double error = dur - (double)ticks*1001*12 / framerate;
2418 st->info->duration_error[i] += error*error;
2420 st->info->duration_count++;
2421 // ignore the first 4 values, they might have some random jitter
2422 if (st->info->duration_count > 3)
2423 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2425 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2426 st->info->last_dts = pkt->dts;
2428 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2429 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2431 st->codec->extradata_size= i;
2432 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2433 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2434 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2438 /* if still no information, we try to open the codec and to
2439 decompress the frame. We try to avoid that in most cases as
2440 it takes longer and uses more memory. For MPEG-4, we need to
2441 decompress for QuickTime.
2443 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2444 least one frame of codec data, this makes sure the codec initializes
2445 the channel configuration and does not only trust the values from the container.
2447 try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
2449 st->codec_info_nb_frames++;
2453 // close codecs which were opened in try_decode_frame()
2454 for(i=0;i<ic->nb_streams;i++) {
2455 st = ic->streams[i];
2456 if(st->codec->codec)
2457 avcodec_close(st->codec);
2459 for(i=0;i<ic->nb_streams;i++) {
2460 st = ic->streams[i];
2461 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2462 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2463 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2464 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2465 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2466 // the check for tb_unreliable() is not completely correct, since this is not about handling
2467 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2468 // ipmovie.c produces.
2469 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > 1 && !st->r_frame_rate.num)
2470 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);
2471 if (st->info->duration_count && !st->r_frame_rate.num
2472 && tb_unreliable(st->codec) /*&&
2473 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2474 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2476 double best_error= 2*av_q2d(st->time_base);
2477 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2479 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2480 double error = st->info->duration_error[j] * get_std_framerate(j);
2481 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2482 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2483 if(error < best_error){
2485 num = get_std_framerate(j);
2488 // do not increase frame rate by more than 1 % in order to match a standard rate.
2489 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2490 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2493 if (!st->r_frame_rate.num){
2494 if( st->codec->time_base.den * (int64_t)st->time_base.num
2495 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2496 st->r_frame_rate.num = st->codec->time_base.den;
2497 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2499 st->r_frame_rate.num = st->time_base.den;
2500 st->r_frame_rate.den = st->time_base.num;
2503 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2504 if(!st->codec->bits_per_coded_sample)
2505 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2506 // set stream disposition based on audio service type
2507 switch (st->codec->audio_service_type) {
2508 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2509 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2510 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2511 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2512 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2513 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2514 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2515 st->disposition = AV_DISPOSITION_COMMENT; break;
2516 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2517 st->disposition = AV_DISPOSITION_KARAOKE; break;
2522 estimate_timings(ic, old_offset);
2524 compute_chapters_end(ic);
2527 /* correct DTS for B-frame streams with no timestamps */
2528 for(i=0;i<ic->nb_streams;i++) {
2529 st = ic->streams[i];
2530 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2532 ppktl = &ic->packet_buffer;
2534 if(ppkt1->stream_index != i)
2536 if(ppkt1->pkt->dts < 0)
2538 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2540 ppkt1->pkt->dts -= delta;
2545 st->cur_dts -= delta;
2551 find_stream_info_err:
2552 for (i=0; i < ic->nb_streams; i++)
2553 av_freep(&ic->streams[i]->info);
2557 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2561 for (i = 0; i < ic->nb_programs; i++)
2562 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2563 if (ic->programs[i]->stream_index[j] == s)
2564 return ic->programs[i];
2568 int av_find_best_stream(AVFormatContext *ic,
2569 enum AVMediaType type,
2570 int wanted_stream_nb,
2572 AVCodec **decoder_ret,
2575 int i, nb_streams = ic->nb_streams;
2576 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2577 unsigned *program = NULL;
2578 AVCodec *decoder = NULL, *best_decoder = NULL;
2580 if (related_stream >= 0 && wanted_stream_nb < 0) {
2581 AVProgram *p = find_program_from_stream(ic, related_stream);
2583 program = p->stream_index;
2584 nb_streams = p->nb_stream_indexes;
2587 for (i = 0; i < nb_streams; i++) {
2588 int real_stream_index = program ? program[i] : i;
2589 AVStream *st = ic->streams[real_stream_index];
2590 AVCodecContext *avctx = st->codec;
2591 if (avctx->codec_type != type)
2593 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2595 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2598 decoder = avcodec_find_decoder(st->codec->codec_id);
2601 ret = AVERROR_DECODER_NOT_FOUND;
2605 if (best_count >= st->codec_info_nb_frames)
2607 best_count = st->codec_info_nb_frames;
2608 ret = real_stream_index;
2609 best_decoder = decoder;
2610 if (program && i == nb_streams - 1 && ret < 0) {
2612 nb_streams = ic->nb_streams;
2613 i = 0; /* no related stream found, try again with everything */
2617 *decoder_ret = best_decoder;
2621 /*******************************************************/
2623 int av_read_play(AVFormatContext *s)
2625 if (s->iformat->read_play)
2626 return s->iformat->read_play(s);
2628 return avio_pause(s->pb, 0);
2629 return AVERROR(ENOSYS);
2632 int av_read_pause(AVFormatContext *s)
2634 if (s->iformat->read_pause)
2635 return s->iformat->read_pause(s);
2637 return avio_pause(s->pb, 1);
2638 return AVERROR(ENOSYS);
2641 #if FF_API_FORMAT_PARAMETERS
2642 void av_close_input_stream(AVFormatContext *s)
2644 flush_packet_queue(s);
2645 if (s->iformat->read_close)
2646 s->iformat->read_close(s);
2647 avformat_free_context(s);
2651 void avformat_free_context(AVFormatContext *s)
2657 if (s->iformat && s->iformat->priv_class && s->priv_data)
2658 av_opt_free(s->priv_data);
2660 for(i=0;i<s->nb_streams;i++) {
2661 /* free all data in a stream component */
2664 av_parser_close(st->parser);
2665 av_free_packet(&st->cur_pkt);
2667 av_dict_free(&st->metadata);
2668 av_free(st->index_entries);
2669 av_free(st->codec->extradata);
2670 av_free(st->codec->subtitle_header);
2672 av_free(st->priv_data);
2676 for(i=s->nb_programs-1; i>=0; i--) {
2677 av_dict_free(&s->programs[i]->metadata);
2678 av_freep(&s->programs[i]->stream_index);
2679 av_freep(&s->programs[i]);
2681 av_freep(&s->programs);
2682 av_freep(&s->priv_data);
2683 while(s->nb_chapters--) {
2684 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2685 av_free(s->chapters[s->nb_chapters]);
2687 av_freep(&s->chapters);
2688 av_dict_free(&s->metadata);
2689 av_freep(&s->streams);
2693 #if FF_API_CLOSE_INPUT_FILE
2694 void av_close_input_file(AVFormatContext *s)
2696 avformat_close_input(&s);
2700 void avformat_close_input(AVFormatContext **ps)
2702 AVFormatContext *s = *ps;
2703 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2705 flush_packet_queue(s);
2706 if (s->iformat->read_close)
2707 s->iformat->read_close(s);
2708 avformat_free_context(s);
2714 #if FF_API_NEW_STREAM
2715 AVStream *av_new_stream(AVFormatContext *s, int id)
2717 AVStream *st = avformat_new_stream(s, NULL);
2724 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
2730 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2732 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2735 s->streams = streams;
2737 st = av_mallocz(sizeof(AVStream));
2740 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2745 st->codec = avcodec_alloc_context3(c);
2747 /* no default bitrate if decoding */
2748 st->codec->bit_rate = 0;
2750 st->index = s->nb_streams;
2751 st->start_time = AV_NOPTS_VALUE;
2752 st->duration = AV_NOPTS_VALUE;
2753 /* we set the current DTS to 0 so that formats without any timestamps
2754 but durations get some timestamps, formats with some unknown
2755 timestamps have their first few packets buffered and the
2756 timestamps corrected before they are returned to the user */
2758 st->first_dts = AV_NOPTS_VALUE;
2759 st->probe_packets = MAX_PROBE_PACKETS;
2761 /* default pts setting is MPEG-like */
2762 avpriv_set_pts_info(st, 33, 1, 90000);
2763 st->last_IP_pts = AV_NOPTS_VALUE;
2764 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2765 st->pts_buffer[i]= AV_NOPTS_VALUE;
2766 st->reference_dts = AV_NOPTS_VALUE;
2768 st->sample_aspect_ratio = (AVRational){0,1};
2770 s->streams[s->nb_streams++] = st;
2774 AVProgram *av_new_program(AVFormatContext *ac, int id)
2776 AVProgram *program=NULL;
2779 av_dlog(ac, "new_program: id=0x%04x\n", id);
2781 for(i=0; i<ac->nb_programs; i++)
2782 if(ac->programs[i]->id == id)
2783 program = ac->programs[i];
2786 program = av_mallocz(sizeof(AVProgram));
2789 dynarray_add(&ac->programs, &ac->nb_programs, program);
2790 program->discard = AVDISCARD_NONE;
2797 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2799 AVChapter *chapter = NULL;
2802 for(i=0; i<s->nb_chapters; i++)
2803 if(s->chapters[i]->id == id)
2804 chapter = s->chapters[i];
2807 chapter= av_mallocz(sizeof(AVChapter));
2810 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2812 av_dict_set(&chapter->metadata, "title", title, 0);
2814 chapter->time_base= time_base;
2815 chapter->start = start;
2821 /************************************************************/
2822 /* output media file */
2824 #if FF_API_FORMAT_PARAMETERS
2825 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2829 if (s->oformat->priv_data_size > 0) {
2830 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2832 return AVERROR(ENOMEM);
2833 if (s->oformat->priv_class) {
2834 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2835 av_opt_set_defaults(s->priv_data);
2838 s->priv_data = NULL;
2840 if (s->oformat->set_parameters) {
2841 ret = s->oformat->set_parameters(s, ap);
2849 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2851 const AVCodecTag *avctag;
2853 enum CodecID id = CODEC_ID_NONE;
2854 unsigned int tag = 0;
2857 * Check that tag + id is in the table
2858 * If neither is in the table -> OK
2859 * If tag is in the table with another id -> FAIL
2860 * If id is in the table with another tag -> FAIL unless strict < normal
2862 for (n = 0; s->oformat->codec_tag[n]; n++) {
2863 avctag = s->oformat->codec_tag[n];
2864 while (avctag->id != CODEC_ID_NONE) {
2865 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
2867 if (id == st->codec->codec_id)
2870 if (avctag->id == st->codec->codec_id)
2875 if (id != CODEC_ID_NONE)
2877 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2882 #if FF_API_FORMAT_PARAMETERS
2883 int av_write_header(AVFormatContext *s)
2885 return avformat_write_header(s, NULL);
2889 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2893 AVDictionary *tmp = NULL;
2896 av_dict_copy(&tmp, *options, 0);
2897 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2900 // some sanity checks
2901 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2902 av_log(s, AV_LOG_ERROR, "no streams\n");
2903 ret = AVERROR(EINVAL);
2907 for(i=0;i<s->nb_streams;i++) {
2910 switch (st->codec->codec_type) {
2911 case AVMEDIA_TYPE_AUDIO:
2912 if(st->codec->sample_rate<=0){
2913 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2914 ret = AVERROR(EINVAL);
2917 if(!st->codec->block_align)
2918 st->codec->block_align = st->codec->channels *
2919 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2921 case AVMEDIA_TYPE_VIDEO:
2922 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2923 av_log(s, AV_LOG_ERROR, "time base not set\n");
2924 ret = AVERROR(EINVAL);
2927 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2928 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2929 ret = AVERROR(EINVAL);
2932 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2933 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2934 ret = AVERROR(EINVAL);
2940 if(s->oformat->codec_tag){
2941 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)){
2942 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2943 st->codec->codec_tag= 0;
2945 if(st->codec->codec_tag){
2946 if (!validate_codec_tag(s, st)) {
2948 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2949 av_log(s, AV_LOG_ERROR,
2950 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
2951 tagbuf, st->codec->codec_tag, st->codec->codec_id);
2952 ret = AVERROR_INVALIDDATA;
2956 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2959 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2960 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2961 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2964 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2965 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2966 if (!s->priv_data) {
2967 ret = AVERROR(ENOMEM);
2970 if (s->oformat->priv_class) {
2971 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2972 av_opt_set_defaults(s->priv_data);
2973 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2978 /* set muxer identification string */
2979 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2980 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
2983 if(s->oformat->write_header){
2984 ret = s->oformat->write_header(s);
2989 /* init PTS generation */
2990 for(i=0;i<s->nb_streams;i++) {
2991 int64_t den = AV_NOPTS_VALUE;
2994 switch (st->codec->codec_type) {
2995 case AVMEDIA_TYPE_AUDIO:
2996 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2998 case AVMEDIA_TYPE_VIDEO:
2999 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3004 if (den != AV_NOPTS_VALUE) {
3006 ret = AVERROR_INVALIDDATA;
3009 frac_init(&st->pts, 0, 0, den);
3014 av_dict_free(options);
3023 //FIXME merge with compute_pkt_fields
3024 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3025 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3026 int num, den, frame_size, i;
3028 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3029 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3031 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
3032 return AVERROR(EINVAL);*/
3034 /* duration field */
3035 if (pkt->duration == 0) {
3036 compute_frame_duration(&num, &den, st, NULL, pkt);
3038 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3042 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3045 //XXX/FIXME this is a temporary hack until all encoders output pts
3046 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3048 // pkt->pts= st->cur_dts;
3049 pkt->pts= st->pts.val;
3052 //calculate dts from pts
3053 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3054 st->pts_buffer[0]= pkt->pts;
3055 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3056 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3057 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3058 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3060 pkt->dts= st->pts_buffer[0];
3063 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
3064 av_log(s, AV_LOG_ERROR,
3065 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3066 st->index, st->cur_dts, pkt->dts);
3067 return AVERROR(EINVAL);
3069 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3070 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3071 return AVERROR(EINVAL);
3074 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3075 st->cur_dts= pkt->dts;
3076 st->pts.val= pkt->dts;
3079 switch (st->codec->codec_type) {
3080 case AVMEDIA_TYPE_AUDIO:
3081 frame_size = get_audio_frame_size(st->codec, pkt->size);
3083 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3084 likely equal to the encoder delay, but it would be better if we
3085 had the real timestamps from the encoder */
3086 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3087 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3090 case AVMEDIA_TYPE_VIDEO:
3091 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3099 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3101 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3103 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3106 ret= s->oformat->write_packet(s, pkt);
3109 s->streams[pkt->stream_index]->nb_frames++;
3113 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3114 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3116 AVPacketList **next_point, *this_pktl;
3118 this_pktl = av_mallocz(sizeof(AVPacketList));
3119 this_pktl->pkt= *pkt;
3120 pkt->destruct= NULL; // do not free original but only the copy
3121 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3123 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3124 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3126 next_point = &s->packet_buffer;
3129 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3130 while(!compare(s, &(*next_point)->pkt, pkt)){
3131 next_point= &(*next_point)->next;
3135 next_point = &(s->packet_buffer_end->next);
3138 assert(!*next_point);
3140 s->packet_buffer_end= this_pktl;
3143 this_pktl->next= *next_point;
3145 s->streams[pkt->stream_index]->last_in_packet_buffer=
3146 *next_point= this_pktl;
3149 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3151 AVStream *st = s->streams[ pkt ->stream_index];
3152 AVStream *st2= s->streams[ next->stream_index];
3153 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3157 return pkt->stream_index < next->stream_index;
3161 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3167 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3170 for(i=0; i < s->nb_streams; i++)
3171 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3173 if(stream_count && (s->nb_streams == stream_count || flush)){
3174 pktl= s->packet_buffer;
3177 s->packet_buffer= pktl->next;
3178 if(!s->packet_buffer)
3179 s->packet_buffer_end= NULL;
3181 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3182 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3186 av_init_packet(out);
3192 * Interleave an AVPacket correctly so it can be muxed.
3193 * @param out the interleaved packet will be output here
3194 * @param in the input packet
3195 * @param flush 1 if no further packets are available as input and all
3196 * remaining packets should be output
3197 * @return 1 if a packet was output, 0 if no packet could be output,
3198 * < 0 if an error occurred
3200 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3201 if(s->oformat->interleave_packet)
3202 return s->oformat->interleave_packet(s, out, in, flush);
3204 return av_interleave_packet_per_dts(s, out, in, flush);
3207 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3208 AVStream *st= s->streams[ pkt->stream_index];
3211 //FIXME/XXX/HACK drop zero sized packets
3212 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3215 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3216 pkt->size, pkt->dts, pkt->pts);
3217 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3220 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3221 return AVERROR(EINVAL);
3225 int ret= interleave_packet(s, &opkt, pkt, 0);
3226 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3229 ret= s->oformat->write_packet(s, &opkt);
3231 s->streams[opkt.stream_index]->nb_frames++;
3233 av_free_packet(&opkt);
3241 int av_write_trailer(AVFormatContext *s)
3247 ret= interleave_packet(s, &pkt, NULL, 1);
3248 if(ret<0) //FIXME cleanup needed for ret<0 ?
3253 ret= s->oformat->write_packet(s, &pkt);
3255 s->streams[pkt.stream_index]->nb_frames++;
3257 av_free_packet(&pkt);
3263 if(s->oformat->write_trailer)
3264 ret = s->oformat->write_trailer(s);
3266 for(i=0;i<s->nb_streams;i++) {
3267 av_freep(&s->streams[i]->priv_data);
3268 av_freep(&s->streams[i]->index_entries);
3270 if (s->oformat->priv_class)
3271 av_opt_free(s->priv_data);
3272 av_freep(&s->priv_data);
3276 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3279 AVProgram *program=NULL;
3282 if (idx >= ac->nb_streams) {
3283 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3287 for(i=0; i<ac->nb_programs; i++){
3288 if(ac->programs[i]->id != progid)
3290 program = ac->programs[i];
3291 for(j=0; j<program->nb_stream_indexes; j++)
3292 if(program->stream_index[j] == idx)
3295 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3298 program->stream_index = tmp;
3299 program->stream_index[program->nb_stream_indexes++] = idx;
3304 static void print_fps(double d, const char *postfix){
3305 uint64_t v= lrintf(d*100);
3306 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3307 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3308 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3311 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3313 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3314 AVDictionaryEntry *tag=NULL;
3316 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3317 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3318 if(strcmp("language", tag->key))
3319 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
3324 /* "user interface" functions */
3325 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3328 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3329 AVStream *st = ic->streams[i];
3330 int g = av_gcd(st->time_base.num, st->time_base.den);
3331 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3332 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3333 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3334 /* the pid is an important information, so we display it */
3335 /* XXX: add a generic system */
3336 if (flags & AVFMT_SHOW_IDS)
3337 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3339 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3340 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3341 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3342 if (st->sample_aspect_ratio.num && // default
3343 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3344 AVRational display_aspect_ratio;
3345 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3346 st->codec->width*st->sample_aspect_ratio.num,
3347 st->codec->height*st->sample_aspect_ratio.den,
3349 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3350 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3351 display_aspect_ratio.num, display_aspect_ratio.den);
3353 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3354 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3355 print_fps(av_q2d(st->avg_frame_rate), "fps");
3356 if(st->r_frame_rate.den && st->r_frame_rate.num)
3357 print_fps(av_q2d(st->r_frame_rate), "tbr");
3358 if(st->time_base.den && st->time_base.num)
3359 print_fps(1/av_q2d(st->time_base), "tbn");
3360 if(st->codec->time_base.den && st->codec->time_base.num)
3361 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3363 if (st->disposition & AV_DISPOSITION_DEFAULT)
3364 av_log(NULL, AV_LOG_INFO, " (default)");
3365 if (st->disposition & AV_DISPOSITION_DUB)
3366 av_log(NULL, AV_LOG_INFO, " (dub)");
3367 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3368 av_log(NULL, AV_LOG_INFO, " (original)");
3369 if (st->disposition & AV_DISPOSITION_COMMENT)
3370 av_log(NULL, AV_LOG_INFO, " (comment)");
3371 if (st->disposition & AV_DISPOSITION_LYRICS)
3372 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3373 if (st->disposition & AV_DISPOSITION_KARAOKE)
3374 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3375 if (st->disposition & AV_DISPOSITION_FORCED)
3376 av_log(NULL, AV_LOG_INFO, " (forced)");
3377 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3378 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3379 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3380 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3381 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3382 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3383 av_log(NULL, AV_LOG_INFO, "\n");
3384 dump_metadata(NULL, st->metadata, " ");
3387 #if FF_API_DUMP_FORMAT
3388 void dump_format(AVFormatContext *ic,
3393 av_dump_format(ic, index, url, is_output);
3397 void av_dump_format(AVFormatContext *ic,
3403 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3404 if (ic->nb_streams && !printed)
3407 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3408 is_output ? "Output" : "Input",
3410 is_output ? ic->oformat->name : ic->iformat->name,
3411 is_output ? "to" : "from", url);
3412 dump_metadata(NULL, ic->metadata, " ");
3414 av_log(NULL, AV_LOG_INFO, " Duration: ");
3415 if (ic->duration != AV_NOPTS_VALUE) {
3416 int hours, mins, secs, us;
3417 secs = ic->duration / AV_TIME_BASE;
3418 us = ic->duration % AV_TIME_BASE;
3423 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3424 (100 * us) / AV_TIME_BASE);
3426 av_log(NULL, AV_LOG_INFO, "N/A");
3428 if (ic->start_time != AV_NOPTS_VALUE) {
3430 av_log(NULL, AV_LOG_INFO, ", start: ");
3431 secs = ic->start_time / AV_TIME_BASE;
3432 us = abs(ic->start_time % AV_TIME_BASE);
3433 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3434 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3436 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3438 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3440 av_log(NULL, AV_LOG_INFO, "N/A");
3442 av_log(NULL, AV_LOG_INFO, "\n");
3444 for (i = 0; i < ic->nb_chapters; i++) {
3445 AVChapter *ch = ic->chapters[i];
3446 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3447 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3448 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3450 dump_metadata(NULL, ch->metadata, " ");
3452 if(ic->nb_programs) {
3453 int j, k, total = 0;
3454 for(j=0; j<ic->nb_programs; j++) {
3455 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3457 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3458 name ? name->value : "");
3459 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3460 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3461 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3462 printed[ic->programs[j]->stream_index[k]] = 1;
3464 total += ic->programs[j]->nb_stream_indexes;
3466 if (total < ic->nb_streams)
3467 av_log(NULL, AV_LOG_INFO, " No Program\n");
3469 for(i=0;i<ic->nb_streams;i++)
3471 dump_stream_format(ic, i, index, is_output);
3476 int64_t av_gettime(void)
3479 gettimeofday(&tv,NULL);
3480 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3483 uint64_t ff_ntp_time(void)
3485 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3488 #if FF_API_PARSE_DATE
3489 #include "libavutil/parseutils.h"
3491 int64_t parse_date(const char *timestr, int duration)
3494 av_parse_time(&timeval, timestr, duration);
3499 #if FF_API_FIND_INFO_TAG
3500 #include "libavutil/parseutils.h"
3502 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3504 return av_find_info_tag(arg, arg_size, tag1, info);
3508 int av_get_frame_filename(char *buf, int buf_size,
3509 const char *path, int number)
3512 char *q, buf1[20], c;
3513 int nd, len, percentd_found;
3525 while (isdigit(*p)) {
3526 nd = nd * 10 + *p++ - '0';
3529 } while (isdigit(c));
3538 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3540 if ((q - buf + len) > buf_size - 1)
3542 memcpy(q, buf1, len);
3550 if ((q - buf) < buf_size - 1)
3554 if (!percentd_found)
3563 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3567 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3569 for(i=0;i<size;i+=16) {
3576 PRINT(" %02x", buf[i+j]);
3581 for(j=0;j<len;j++) {
3583 if (c < ' ' || c > '~')
3592 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3594 hex_dump_internal(NULL, f, 0, buf, size);
3597 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3599 hex_dump_internal(avcl, NULL, level, buf, size);
3602 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3605 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3606 PRINT("stream #%d:\n", pkt->stream_index);
3607 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3608 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3609 /* DTS is _always_ valid after av_read_frame() */
3611 if (pkt->dts == AV_NOPTS_VALUE)
3614 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3615 /* PTS may not be known if B-frames are present. */
3617 if (pkt->pts == AV_NOPTS_VALUE)
3620 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3622 PRINT(" size=%d\n", pkt->size);
3625 av_hex_dump(f, pkt->data, pkt->size);
3629 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3631 AVRational tb = { 1, AV_TIME_BASE };
3632 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3636 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3638 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3642 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3644 AVRational tb = { 1, AV_TIME_BASE };
3645 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3649 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3652 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3655 void av_url_split(char *proto, int proto_size,
3656 char *authorization, int authorization_size,
3657 char *hostname, int hostname_size,
3659 char *path, int path_size,
3662 const char *p, *ls, *at, *col, *brk;
3664 if (port_ptr) *port_ptr = -1;
3665 if (proto_size > 0) proto[0] = 0;
3666 if (authorization_size > 0) authorization[0] = 0;
3667 if (hostname_size > 0) hostname[0] = 0;
3668 if (path_size > 0) path[0] = 0;
3670 /* parse protocol */
3671 if ((p = strchr(url, ':'))) {
3672 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3677 /* no protocol means plain filename */
3678 av_strlcpy(path, url, path_size);
3682 /* separate path from hostname */
3683 ls = strchr(p, '/');
3685 ls = strchr(p, '?');
3687 av_strlcpy(path, ls, path_size);
3689 ls = &p[strlen(p)]; // XXX
3691 /* the rest is hostname, use that to parse auth/port */
3693 /* authorization (user[:pass]@hostname) */
3694 if ((at = strchr(p, '@')) && at < ls) {
3695 av_strlcpy(authorization, p,
3696 FFMIN(authorization_size, at + 1 - p));
3697 p = at + 1; /* skip '@' */
3700 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3702 av_strlcpy(hostname, p + 1,
3703 FFMIN(hostname_size, brk - p));
3704 if (brk[1] == ':' && port_ptr)
3705 *port_ptr = atoi(brk + 2);
3706 } else if ((col = strchr(p, ':')) && col < ls) {
3707 av_strlcpy(hostname, p,
3708 FFMIN(col + 1 - p, hostname_size));
3709 if (port_ptr) *port_ptr = atoi(col + 1);
3711 av_strlcpy(hostname, p,
3712 FFMIN(ls + 1 - p, hostname_size));
3716 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3719 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3722 'C', 'D', 'E', 'F' };
3723 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3726 'c', 'd', 'e', 'f' };
3727 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3729 for(i = 0; i < s; i++) {
3730 buff[i * 2] = hex_table[src[i] >> 4];
3731 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3737 int ff_hex_to_data(uint8_t *data, const char *p)
3744 p += strspn(p, SPACE_CHARS);
3747 c = toupper((unsigned char) *p++);
3748 if (c >= '0' && c <= '9')
3750 else if (c >= 'A' && c <= 'F')
3765 #if FF_API_SET_PTS_INFO
3766 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3767 unsigned int pts_num, unsigned int pts_den)
3769 avpriv_set_pts_info(s, pts_wrap_bits, pts_num, pts_den);
3773 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
3774 unsigned int pts_num, unsigned int pts_den)
3777 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3778 if(new_tb.num != pts_num)
3779 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3781 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3783 if(new_tb.num <= 0 || new_tb.den <= 0) {
3784 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3787 s->time_base = new_tb;
3788 s->pts_wrap_bits = pts_wrap_bits;
3791 int ff_url_join(char *str, int size, const char *proto,
3792 const char *authorization, const char *hostname,
3793 int port, const char *fmt, ...)
3796 struct addrinfo hints, *ai;
3801 av_strlcatf(str, size, "%s://", proto);
3802 if (authorization && authorization[0])
3803 av_strlcatf(str, size, "%s@", authorization);
3804 #if CONFIG_NETWORK && defined(AF_INET6)
3805 /* Determine if hostname is a numerical IPv6 address,
3806 * properly escape it within [] in that case. */
3807 memset(&hints, 0, sizeof(hints));
3808 hints.ai_flags = AI_NUMERICHOST;
3809 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3810 if (ai->ai_family == AF_INET6) {
3811 av_strlcat(str, "[", size);
3812 av_strlcat(str, hostname, size);
3813 av_strlcat(str, "]", size);
3815 av_strlcat(str, hostname, size);
3820 /* Not an IPv6 address, just output the plain string. */
3821 av_strlcat(str, hostname, size);
3824 av_strlcatf(str, size, ":%d", port);
3827 int len = strlen(str);
3830 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3836 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3837 AVFormatContext *src)
3842 local_pkt.stream_index = dst_stream;
3843 if (pkt->pts != AV_NOPTS_VALUE)
3844 local_pkt.pts = av_rescale_q(pkt->pts,
3845 src->streams[pkt->stream_index]->time_base,
3846 dst->streams[dst_stream]->time_base);
3847 if (pkt->dts != AV_NOPTS_VALUE)
3848 local_pkt.dts = av_rescale_q(pkt->dts,
3849 src->streams[pkt->stream_index]->time_base,
3850 dst->streams[dst_stream]->time_base);
3851 return av_write_frame(dst, &local_pkt);
3854 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3857 const char *ptr = str;
3859 /* Parse key=value pairs. */
3862 char *dest = NULL, *dest_end;
3863 int key_len, dest_len = 0;
3865 /* Skip whitespace and potential commas. */
3866 while (*ptr && (isspace(*ptr) || *ptr == ','))
3873 if (!(ptr = strchr(key, '=')))
3876 key_len = ptr - key;
3878 callback_get_buf(context, key, key_len, &dest, &dest_len);
3879 dest_end = dest + dest_len - 1;
3883 while (*ptr && *ptr != '\"') {
3887 if (dest && dest < dest_end)
3891 if (dest && dest < dest_end)
3899 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3900 if (dest && dest < dest_end)
3908 int ff_find_stream_index(AVFormatContext *s, int id)
3911 for (i = 0; i < s->nb_streams; i++) {
3912 if (s->streams[i]->id == id)
3918 void ff_make_absolute_url(char *buf, int size, const char *base,
3922 /* Absolute path, relative to the current server */
3923 if (base && strstr(base, "://") && rel[0] == '/') {
3925 av_strlcpy(buf, base, size);
3926 sep = strstr(buf, "://");
3929 sep = strchr(sep, '/');
3933 av_strlcat(buf, rel, size);
3936 /* If rel actually is an absolute url, just copy it */
3937 if (!base || strstr(rel, "://") || rel[0] == '/') {
3938 av_strlcpy(buf, rel, size);
3942 av_strlcpy(buf, base, size);
3943 /* Remove the file name from the base url */
3944 sep = strrchr(buf, '/');
3949 while (av_strstart(rel, "../", NULL) && sep) {
3950 /* Remove the path delimiter at the end */
3952 sep = strrchr(buf, '/');
3953 /* If the next directory name to pop off is "..", break here */
3954 if (!strcmp(sep ? &sep[1] : buf, "..")) {
3955 /* Readd the slash we just removed */
3956 av_strlcat(buf, "/", size);
3959 /* Cut off the directory name */
3966 av_strlcat(buf, rel, size);
3969 int64_t ff_iso8601_to_unix_time(const char *datestr)
3972 struct tm time1 = {0}, time2 = {0};
3974 ret1 = strptime(datestr, "%Y - %m - %d %T", &time1);
3975 ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2);
3977 return av_timegm(&time2);
3979 return av_timegm(&time1);
3981 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
3982 "the date string.\n");
3987 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
3990 if (ofmt->query_codec)
3991 return ofmt->query_codec(codec_id, std_compliance);
3992 else if (ofmt->codec_tag)
3993 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
3994 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
3995 codec_id == ofmt->subtitle_codec)
3998 return AVERROR_PATCHWELCOME;
4001 int avformat_network_init(void)
4005 ff_network_inited_globally = 1;
4006 if ((ret = ff_network_init()) < 0)
4013 int avformat_network_deinit(void)
4022 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4023 uint64_t channel_layout, int32_t sample_rate,
4024 int32_t width, int32_t height)
4030 return AVERROR(EINVAL);
4033 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4035 if (channel_layout) {
4037 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4041 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4043 if (width || height) {
4045 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4047 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4049 return AVERROR(ENOMEM);
4050 bytestream_put_le32(&data, flags);
4052 bytestream_put_le32(&data, channels);
4054 bytestream_put_le64(&data, channel_layout);
4056 bytestream_put_le32(&data, sample_rate);
4057 if (width || height) {
4058 bytestream_put_le32(&data, width);
4059 bytestream_put_le32(&data, height);