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 AVDictionary *one_thread_opt = NULL;
2272 int64_t old_offset = avio_tell(ic->pb);
2273 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2275 /* this function doesn't flush the decoders, so force thread count
2276 * to 1 to fix behavior when thread count > number of frames in the file */
2277 av_dict_set(&one_thread_opt, "threads", "1", 0);
2279 for(i=0;i<ic->nb_streams;i++) {
2281 st = ic->streams[i];
2283 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2284 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2285 /* if(!st->time_base.num)
2287 if(!st->codec->time_base.num)
2288 st->codec->time_base= st->time_base;
2290 //only for the split stuff
2291 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2292 st->parser = av_parser_init(st->codec->codec_id);
2293 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2294 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2297 assert(!st->codec->codec);
2298 codec = avcodec_find_decoder(st->codec->codec_id);
2300 /* this function doesn't flush the decoders, so force thread count
2301 * to 1 to fix behavior when thread count > number of frames in the file */
2303 av_dict_set(&options[i], "threads", "1", 0);
2305 /* Ensure that subtitle_header is properly set. */
2306 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2307 && codec && !st->codec->codec)
2308 avcodec_open2(st->codec, codec, options ? &options[i] : &one_thread_opt);
2310 //try to just open decoders, in case this is enough to get parameters
2311 if(!has_codec_parameters(st->codec)){
2312 if (codec && !st->codec->codec)
2313 avcodec_open2(st->codec, codec, options ? &options[i]
2318 for (i=0; i<ic->nb_streams; i++) {
2319 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2325 if (ff_check_interrupt(&ic->interrupt_callback)){
2327 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2331 /* check if one codec still needs to be handled */
2332 for(i=0;i<ic->nb_streams;i++) {
2333 int fps_analyze_framecount = 20;
2335 st = ic->streams[i];
2336 if (!has_codec_parameters(st->codec))
2338 /* if the timebase is coarse (like the usual millisecond precision
2339 of mkv), we need to analyze more frames to reliably arrive at
2341 if (av_q2d(st->time_base) > 0.0005)
2342 fps_analyze_framecount *= 2;
2343 if (ic->fps_probe_size >= 0)
2344 fps_analyze_framecount = ic->fps_probe_size;
2345 /* variable fps and no guess at the real fps */
2346 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2347 && st->info->duration_count < fps_analyze_framecount
2348 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2350 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2352 if(st->first_dts == AV_NOPTS_VALUE)
2355 if (i == ic->nb_streams) {
2356 /* NOTE: if the format has no header, then we need to read
2357 some packets to get most of the streams, so we cannot
2359 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2360 /* if we found the info for all the codecs, we can stop */
2362 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2366 /* we did not get all the codec info, but we read too much data */
2367 if (read_size >= ic->probesize) {
2369 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2373 /* NOTE: a new stream can be added there if no header in file
2374 (AVFMTCTX_NOHEADER) */
2375 ret = read_frame_internal(ic, &pkt1);
2376 if (ret == AVERROR(EAGAIN))
2381 ret = -1; /* we could not have all the codec parameters before EOF */
2382 for(i=0;i<ic->nb_streams;i++) {
2383 st = ic->streams[i];
2384 if (!has_codec_parameters(st->codec)){
2386 avcodec_string(buf, sizeof(buf), st->codec, 0);
2387 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2395 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2396 if ((ret = av_dup_packet(pkt)) < 0)
2397 goto find_stream_info_err;
2399 read_size += pkt->size;
2401 st = ic->streams[pkt->stream_index];
2402 if (st->codec_info_nb_frames>1) {
2403 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) {
2404 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2407 st->info->codec_info_duration += pkt->duration;
2410 int64_t last = st->info->last_dts;
2412 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2413 int64_t duration= pkt->dts - last;
2414 double dur= duration * av_q2d(st->time_base);
2416 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2417 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2418 if (st->info->duration_count < 2)
2419 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2420 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2421 int framerate= get_std_framerate(i);
2422 int ticks= lrintf(dur*framerate/(1001*12));
2423 double error = dur - (double)ticks*1001*12 / framerate;
2424 st->info->duration_error[i] += error*error;
2426 st->info->duration_count++;
2427 // ignore the first 4 values, they might have some random jitter
2428 if (st->info->duration_count > 3)
2429 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2431 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2432 st->info->last_dts = pkt->dts;
2434 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2435 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2437 st->codec->extradata_size= i;
2438 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2439 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2440 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2444 /* if still no information, we try to open the codec and to
2445 decompress the frame. We try to avoid that in most cases as
2446 it takes longer and uses more memory. For MPEG-4, we need to
2447 decompress for QuickTime.
2449 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2450 least one frame of codec data, this makes sure the codec initializes
2451 the channel configuration and does not only trust the values from the container.
2453 try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i]
2456 st->codec_info_nb_frames++;
2460 // close codecs which were opened in try_decode_frame()
2461 for(i=0;i<ic->nb_streams;i++) {
2462 st = ic->streams[i];
2463 if(st->codec->codec)
2464 avcodec_close(st->codec);
2466 for(i=0;i<ic->nb_streams;i++) {
2467 st = ic->streams[i];
2468 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2469 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2470 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2471 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2472 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2473 // the check for tb_unreliable() is not completely correct, since this is not about handling
2474 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2475 // ipmovie.c produces.
2476 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > 1 && !st->r_frame_rate.num)
2477 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);
2478 if (st->info->duration_count && !st->r_frame_rate.num
2479 && tb_unreliable(st->codec) /*&&
2480 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2481 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2483 double best_error= 2*av_q2d(st->time_base);
2484 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2486 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2487 double error = st->info->duration_error[j] * get_std_framerate(j);
2488 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2489 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2490 if(error < best_error){
2492 num = get_std_framerate(j);
2495 // do not increase frame rate by more than 1 % in order to match a standard rate.
2496 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2497 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2500 if (!st->r_frame_rate.num){
2501 if( st->codec->time_base.den * (int64_t)st->time_base.num
2502 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2503 st->r_frame_rate.num = st->codec->time_base.den;
2504 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2506 st->r_frame_rate.num = st->time_base.den;
2507 st->r_frame_rate.den = st->time_base.num;
2510 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2511 if(!st->codec->bits_per_coded_sample)
2512 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2513 // set stream disposition based on audio service type
2514 switch (st->codec->audio_service_type) {
2515 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2516 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2517 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2518 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2519 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2520 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2521 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2522 st->disposition = AV_DISPOSITION_COMMENT; break;
2523 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2524 st->disposition = AV_DISPOSITION_KARAOKE; break;
2529 estimate_timings(ic, old_offset);
2531 compute_chapters_end(ic);
2534 /* correct DTS for B-frame streams with no timestamps */
2535 for(i=0;i<ic->nb_streams;i++) {
2536 st = ic->streams[i];
2537 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2539 ppktl = &ic->packet_buffer;
2541 if(ppkt1->stream_index != i)
2543 if(ppkt1->pkt->dts < 0)
2545 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2547 ppkt1->pkt->dts -= delta;
2552 st->cur_dts -= delta;
2558 find_stream_info_err:
2559 for (i=0; i < ic->nb_streams; i++) {
2560 if (ic->streams[i]->codec)
2561 ic->streams[i]->codec->thread_count = 0;
2562 av_freep(&ic->streams[i]->info);
2564 av_dict_free(&one_thread_opt);
2568 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2572 for (i = 0; i < ic->nb_programs; i++)
2573 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2574 if (ic->programs[i]->stream_index[j] == s)
2575 return ic->programs[i];
2579 int av_find_best_stream(AVFormatContext *ic,
2580 enum AVMediaType type,
2581 int wanted_stream_nb,
2583 AVCodec **decoder_ret,
2586 int i, nb_streams = ic->nb_streams;
2587 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2588 unsigned *program = NULL;
2589 AVCodec *decoder = NULL, *best_decoder = NULL;
2591 if (related_stream >= 0 && wanted_stream_nb < 0) {
2592 AVProgram *p = find_program_from_stream(ic, related_stream);
2594 program = p->stream_index;
2595 nb_streams = p->nb_stream_indexes;
2598 for (i = 0; i < nb_streams; i++) {
2599 int real_stream_index = program ? program[i] : i;
2600 AVStream *st = ic->streams[real_stream_index];
2601 AVCodecContext *avctx = st->codec;
2602 if (avctx->codec_type != type)
2604 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2606 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2609 decoder = avcodec_find_decoder(st->codec->codec_id);
2612 ret = AVERROR_DECODER_NOT_FOUND;
2616 if (best_count >= st->codec_info_nb_frames)
2618 best_count = st->codec_info_nb_frames;
2619 ret = real_stream_index;
2620 best_decoder = decoder;
2621 if (program && i == nb_streams - 1 && ret < 0) {
2623 nb_streams = ic->nb_streams;
2624 i = 0; /* no related stream found, try again with everything */
2628 *decoder_ret = best_decoder;
2632 /*******************************************************/
2634 int av_read_play(AVFormatContext *s)
2636 if (s->iformat->read_play)
2637 return s->iformat->read_play(s);
2639 return avio_pause(s->pb, 0);
2640 return AVERROR(ENOSYS);
2643 int av_read_pause(AVFormatContext *s)
2645 if (s->iformat->read_pause)
2646 return s->iformat->read_pause(s);
2648 return avio_pause(s->pb, 1);
2649 return AVERROR(ENOSYS);
2652 #if FF_API_FORMAT_PARAMETERS
2653 void av_close_input_stream(AVFormatContext *s)
2655 flush_packet_queue(s);
2656 if (s->iformat->read_close)
2657 s->iformat->read_close(s);
2658 avformat_free_context(s);
2662 void avformat_free_context(AVFormatContext *s)
2668 if (s->iformat && s->iformat->priv_class && s->priv_data)
2669 av_opt_free(s->priv_data);
2671 for(i=0;i<s->nb_streams;i++) {
2672 /* free all data in a stream component */
2675 av_parser_close(st->parser);
2676 av_free_packet(&st->cur_pkt);
2678 av_dict_free(&st->metadata);
2679 av_free(st->index_entries);
2680 av_free(st->codec->extradata);
2681 av_free(st->codec->subtitle_header);
2683 av_free(st->priv_data);
2687 for(i=s->nb_programs-1; i>=0; i--) {
2688 av_dict_free(&s->programs[i]->metadata);
2689 av_freep(&s->programs[i]->stream_index);
2690 av_freep(&s->programs[i]);
2692 av_freep(&s->programs);
2693 av_freep(&s->priv_data);
2694 while(s->nb_chapters--) {
2695 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2696 av_free(s->chapters[s->nb_chapters]);
2698 av_freep(&s->chapters);
2699 av_dict_free(&s->metadata);
2700 av_freep(&s->streams);
2704 #if FF_API_CLOSE_INPUT_FILE
2705 void av_close_input_file(AVFormatContext *s)
2707 avformat_close_input(&s);
2711 void avformat_close_input(AVFormatContext **ps)
2713 AVFormatContext *s = *ps;
2714 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2716 flush_packet_queue(s);
2717 if (s->iformat->read_close)
2718 s->iformat->read_close(s);
2719 avformat_free_context(s);
2725 #if FF_API_NEW_STREAM
2726 AVStream *av_new_stream(AVFormatContext *s, int id)
2728 AVStream *st = avformat_new_stream(s, NULL);
2735 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
2741 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2743 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2746 s->streams = streams;
2748 st = av_mallocz(sizeof(AVStream));
2751 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2756 st->codec = avcodec_alloc_context3(c);
2758 /* no default bitrate if decoding */
2759 st->codec->bit_rate = 0;
2761 st->index = s->nb_streams;
2762 st->start_time = AV_NOPTS_VALUE;
2763 st->duration = AV_NOPTS_VALUE;
2764 /* we set the current DTS to 0 so that formats without any timestamps
2765 but durations get some timestamps, formats with some unknown
2766 timestamps have their first few packets buffered and the
2767 timestamps corrected before they are returned to the user */
2769 st->first_dts = AV_NOPTS_VALUE;
2770 st->probe_packets = MAX_PROBE_PACKETS;
2772 /* default pts setting is MPEG-like */
2773 avpriv_set_pts_info(st, 33, 1, 90000);
2774 st->last_IP_pts = AV_NOPTS_VALUE;
2775 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2776 st->pts_buffer[i]= AV_NOPTS_VALUE;
2777 st->reference_dts = AV_NOPTS_VALUE;
2779 st->sample_aspect_ratio = (AVRational){0,1};
2781 s->streams[s->nb_streams++] = st;
2785 AVProgram *av_new_program(AVFormatContext *ac, int id)
2787 AVProgram *program=NULL;
2790 av_dlog(ac, "new_program: id=0x%04x\n", id);
2792 for(i=0; i<ac->nb_programs; i++)
2793 if(ac->programs[i]->id == id)
2794 program = ac->programs[i];
2797 program = av_mallocz(sizeof(AVProgram));
2800 dynarray_add(&ac->programs, &ac->nb_programs, program);
2801 program->discard = AVDISCARD_NONE;
2808 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2810 AVChapter *chapter = NULL;
2813 for(i=0; i<s->nb_chapters; i++)
2814 if(s->chapters[i]->id == id)
2815 chapter = s->chapters[i];
2818 chapter= av_mallocz(sizeof(AVChapter));
2821 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2823 av_dict_set(&chapter->metadata, "title", title, 0);
2825 chapter->time_base= time_base;
2826 chapter->start = start;
2832 /************************************************************/
2833 /* output media file */
2835 #if FF_API_FORMAT_PARAMETERS
2836 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2840 if (s->oformat->priv_data_size > 0) {
2841 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2843 return AVERROR(ENOMEM);
2844 if (s->oformat->priv_class) {
2845 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2846 av_opt_set_defaults(s->priv_data);
2849 s->priv_data = NULL;
2851 if (s->oformat->set_parameters) {
2852 ret = s->oformat->set_parameters(s, ap);
2860 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2862 const AVCodecTag *avctag;
2864 enum CodecID id = CODEC_ID_NONE;
2865 unsigned int tag = 0;
2868 * Check that tag + id is in the table
2869 * If neither is in the table -> OK
2870 * If tag is in the table with another id -> FAIL
2871 * If id is in the table with another tag -> FAIL unless strict < normal
2873 for (n = 0; s->oformat->codec_tag[n]; n++) {
2874 avctag = s->oformat->codec_tag[n];
2875 while (avctag->id != CODEC_ID_NONE) {
2876 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
2878 if (id == st->codec->codec_id)
2881 if (avctag->id == st->codec->codec_id)
2886 if (id != CODEC_ID_NONE)
2888 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2893 #if FF_API_FORMAT_PARAMETERS
2894 int av_write_header(AVFormatContext *s)
2896 return avformat_write_header(s, NULL);
2900 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2904 AVDictionary *tmp = NULL;
2907 av_dict_copy(&tmp, *options, 0);
2908 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2911 // some sanity checks
2912 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2913 av_log(s, AV_LOG_ERROR, "no streams\n");
2914 ret = AVERROR(EINVAL);
2918 for(i=0;i<s->nb_streams;i++) {
2921 switch (st->codec->codec_type) {
2922 case AVMEDIA_TYPE_AUDIO:
2923 if(st->codec->sample_rate<=0){
2924 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2925 ret = AVERROR(EINVAL);
2928 if(!st->codec->block_align)
2929 st->codec->block_align = st->codec->channels *
2930 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2932 case AVMEDIA_TYPE_VIDEO:
2933 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2934 av_log(s, AV_LOG_ERROR, "time base not set\n");
2935 ret = AVERROR(EINVAL);
2938 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2939 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2940 ret = AVERROR(EINVAL);
2943 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2944 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2945 ret = AVERROR(EINVAL);
2951 if(s->oformat->codec_tag){
2952 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)){
2953 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2954 st->codec->codec_tag= 0;
2956 if(st->codec->codec_tag){
2957 if (!validate_codec_tag(s, st)) {
2959 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2960 av_log(s, AV_LOG_ERROR,
2961 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
2962 tagbuf, st->codec->codec_tag, st->codec->codec_id);
2963 ret = AVERROR_INVALIDDATA;
2967 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2970 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2971 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2972 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2975 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2976 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2977 if (!s->priv_data) {
2978 ret = AVERROR(ENOMEM);
2981 if (s->oformat->priv_class) {
2982 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2983 av_opt_set_defaults(s->priv_data);
2984 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2989 /* set muxer identification string */
2990 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2991 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
2994 if(s->oformat->write_header){
2995 ret = s->oformat->write_header(s);
3000 /* init PTS generation */
3001 for(i=0;i<s->nb_streams;i++) {
3002 int64_t den = AV_NOPTS_VALUE;
3005 switch (st->codec->codec_type) {
3006 case AVMEDIA_TYPE_AUDIO:
3007 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3009 case AVMEDIA_TYPE_VIDEO:
3010 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3015 if (den != AV_NOPTS_VALUE) {
3017 ret = AVERROR_INVALIDDATA;
3020 frac_init(&st->pts, 0, 0, den);
3025 av_dict_free(options);
3034 //FIXME merge with compute_pkt_fields
3035 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3036 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3037 int num, den, frame_size, i;
3039 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3040 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3042 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
3043 return AVERROR(EINVAL);*/
3045 /* duration field */
3046 if (pkt->duration == 0) {
3047 compute_frame_duration(&num, &den, st, NULL, pkt);
3049 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3053 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3056 //XXX/FIXME this is a temporary hack until all encoders output pts
3057 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3059 // pkt->pts= st->cur_dts;
3060 pkt->pts= st->pts.val;
3063 //calculate dts from pts
3064 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3065 st->pts_buffer[0]= pkt->pts;
3066 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3067 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3068 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3069 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3071 pkt->dts= st->pts_buffer[0];
3074 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
3075 av_log(s, AV_LOG_ERROR,
3076 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3077 st->index, st->cur_dts, pkt->dts);
3078 return AVERROR(EINVAL);
3080 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3081 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3082 return AVERROR(EINVAL);
3085 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3086 st->cur_dts= pkt->dts;
3087 st->pts.val= pkt->dts;
3090 switch (st->codec->codec_type) {
3091 case AVMEDIA_TYPE_AUDIO:
3092 frame_size = get_audio_frame_size(st->codec, pkt->size);
3094 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3095 likely equal to the encoder delay, but it would be better if we
3096 had the real timestamps from the encoder */
3097 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3098 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3101 case AVMEDIA_TYPE_VIDEO:
3102 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3110 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3112 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3114 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3117 ret= s->oformat->write_packet(s, pkt);
3120 s->streams[pkt->stream_index]->nb_frames++;
3124 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3125 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3127 AVPacketList **next_point, *this_pktl;
3129 this_pktl = av_mallocz(sizeof(AVPacketList));
3130 this_pktl->pkt= *pkt;
3131 pkt->destruct= NULL; // do not free original but only the copy
3132 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3134 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3135 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3137 next_point = &s->packet_buffer;
3140 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3141 while(!compare(s, &(*next_point)->pkt, pkt)){
3142 next_point= &(*next_point)->next;
3146 next_point = &(s->packet_buffer_end->next);
3149 assert(!*next_point);
3151 s->packet_buffer_end= this_pktl;
3154 this_pktl->next= *next_point;
3156 s->streams[pkt->stream_index]->last_in_packet_buffer=
3157 *next_point= this_pktl;
3160 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3162 AVStream *st = s->streams[ pkt ->stream_index];
3163 AVStream *st2= s->streams[ next->stream_index];
3164 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3168 return pkt->stream_index < next->stream_index;
3172 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3178 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3181 for(i=0; i < s->nb_streams; i++)
3182 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3184 if(stream_count && (s->nb_streams == stream_count || flush)){
3185 pktl= s->packet_buffer;
3188 s->packet_buffer= pktl->next;
3189 if(!s->packet_buffer)
3190 s->packet_buffer_end= NULL;
3192 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3193 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3197 av_init_packet(out);
3203 * Interleave an AVPacket correctly so it can be muxed.
3204 * @param out the interleaved packet will be output here
3205 * @param in the input packet
3206 * @param flush 1 if no further packets are available as input and all
3207 * remaining packets should be output
3208 * @return 1 if a packet was output, 0 if no packet could be output,
3209 * < 0 if an error occurred
3211 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3212 if(s->oformat->interleave_packet)
3213 return s->oformat->interleave_packet(s, out, in, flush);
3215 return av_interleave_packet_per_dts(s, out, in, flush);
3218 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3219 AVStream *st= s->streams[ pkt->stream_index];
3222 //FIXME/XXX/HACK drop zero sized packets
3223 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3226 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3227 pkt->size, pkt->dts, pkt->pts);
3228 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3231 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3232 return AVERROR(EINVAL);
3236 int ret= interleave_packet(s, &opkt, pkt, 0);
3237 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3240 ret= s->oformat->write_packet(s, &opkt);
3242 s->streams[opkt.stream_index]->nb_frames++;
3244 av_free_packet(&opkt);
3252 int av_write_trailer(AVFormatContext *s)
3258 ret= interleave_packet(s, &pkt, NULL, 1);
3259 if(ret<0) //FIXME cleanup needed for ret<0 ?
3264 ret= s->oformat->write_packet(s, &pkt);
3266 s->streams[pkt.stream_index]->nb_frames++;
3268 av_free_packet(&pkt);
3274 if(s->oformat->write_trailer)
3275 ret = s->oformat->write_trailer(s);
3277 for(i=0;i<s->nb_streams;i++) {
3278 av_freep(&s->streams[i]->priv_data);
3279 av_freep(&s->streams[i]->index_entries);
3281 if (s->oformat->priv_class)
3282 av_opt_free(s->priv_data);
3283 av_freep(&s->priv_data);
3287 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3290 AVProgram *program=NULL;
3293 if (idx >= ac->nb_streams) {
3294 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3298 for(i=0; i<ac->nb_programs; i++){
3299 if(ac->programs[i]->id != progid)
3301 program = ac->programs[i];
3302 for(j=0; j<program->nb_stream_indexes; j++)
3303 if(program->stream_index[j] == idx)
3306 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3309 program->stream_index = tmp;
3310 program->stream_index[program->nb_stream_indexes++] = idx;
3315 static void print_fps(double d, const char *postfix){
3316 uint64_t v= lrintf(d*100);
3317 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3318 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3319 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3322 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3324 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3325 AVDictionaryEntry *tag=NULL;
3327 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3328 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3329 if(strcmp("language", tag->key))
3330 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
3335 /* "user interface" functions */
3336 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3339 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3340 AVStream *st = ic->streams[i];
3341 int g = av_gcd(st->time_base.num, st->time_base.den);
3342 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3343 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3344 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3345 /* the pid is an important information, so we display it */
3346 /* XXX: add a generic system */
3347 if (flags & AVFMT_SHOW_IDS)
3348 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3350 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3351 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3352 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3353 if (st->sample_aspect_ratio.num && // default
3354 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3355 AVRational display_aspect_ratio;
3356 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3357 st->codec->width*st->sample_aspect_ratio.num,
3358 st->codec->height*st->sample_aspect_ratio.den,
3360 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3361 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3362 display_aspect_ratio.num, display_aspect_ratio.den);
3364 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3365 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3366 print_fps(av_q2d(st->avg_frame_rate), "fps");
3367 if(st->r_frame_rate.den && st->r_frame_rate.num)
3368 print_fps(av_q2d(st->r_frame_rate), "tbr");
3369 if(st->time_base.den && st->time_base.num)
3370 print_fps(1/av_q2d(st->time_base), "tbn");
3371 if(st->codec->time_base.den && st->codec->time_base.num)
3372 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3374 if (st->disposition & AV_DISPOSITION_DEFAULT)
3375 av_log(NULL, AV_LOG_INFO, " (default)");
3376 if (st->disposition & AV_DISPOSITION_DUB)
3377 av_log(NULL, AV_LOG_INFO, " (dub)");
3378 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3379 av_log(NULL, AV_LOG_INFO, " (original)");
3380 if (st->disposition & AV_DISPOSITION_COMMENT)
3381 av_log(NULL, AV_LOG_INFO, " (comment)");
3382 if (st->disposition & AV_DISPOSITION_LYRICS)
3383 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3384 if (st->disposition & AV_DISPOSITION_KARAOKE)
3385 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3386 if (st->disposition & AV_DISPOSITION_FORCED)
3387 av_log(NULL, AV_LOG_INFO, " (forced)");
3388 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3389 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3390 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3391 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3392 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3393 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3394 av_log(NULL, AV_LOG_INFO, "\n");
3395 dump_metadata(NULL, st->metadata, " ");
3398 #if FF_API_DUMP_FORMAT
3399 void dump_format(AVFormatContext *ic,
3404 av_dump_format(ic, index, url, is_output);
3408 void av_dump_format(AVFormatContext *ic,
3414 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3415 if (ic->nb_streams && !printed)
3418 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3419 is_output ? "Output" : "Input",
3421 is_output ? ic->oformat->name : ic->iformat->name,
3422 is_output ? "to" : "from", url);
3423 dump_metadata(NULL, ic->metadata, " ");
3425 av_log(NULL, AV_LOG_INFO, " Duration: ");
3426 if (ic->duration != AV_NOPTS_VALUE) {
3427 int hours, mins, secs, us;
3428 secs = ic->duration / AV_TIME_BASE;
3429 us = ic->duration % AV_TIME_BASE;
3434 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3435 (100 * us) / AV_TIME_BASE);
3437 av_log(NULL, AV_LOG_INFO, "N/A");
3439 if (ic->start_time != AV_NOPTS_VALUE) {
3441 av_log(NULL, AV_LOG_INFO, ", start: ");
3442 secs = ic->start_time / AV_TIME_BASE;
3443 us = abs(ic->start_time % AV_TIME_BASE);
3444 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3445 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3447 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3449 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3451 av_log(NULL, AV_LOG_INFO, "N/A");
3453 av_log(NULL, AV_LOG_INFO, "\n");
3455 for (i = 0; i < ic->nb_chapters; i++) {
3456 AVChapter *ch = ic->chapters[i];
3457 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3458 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3459 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3461 dump_metadata(NULL, ch->metadata, " ");
3463 if(ic->nb_programs) {
3464 int j, k, total = 0;
3465 for(j=0; j<ic->nb_programs; j++) {
3466 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3468 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3469 name ? name->value : "");
3470 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3471 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3472 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3473 printed[ic->programs[j]->stream_index[k]] = 1;
3475 total += ic->programs[j]->nb_stream_indexes;
3477 if (total < ic->nb_streams)
3478 av_log(NULL, AV_LOG_INFO, " No Program\n");
3480 for(i=0;i<ic->nb_streams;i++)
3482 dump_stream_format(ic, i, index, is_output);
3487 int64_t av_gettime(void)
3490 gettimeofday(&tv,NULL);
3491 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3494 uint64_t ff_ntp_time(void)
3496 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3499 #if FF_API_PARSE_DATE
3500 #include "libavutil/parseutils.h"
3502 int64_t parse_date(const char *timestr, int duration)
3505 av_parse_time(&timeval, timestr, duration);
3510 #if FF_API_FIND_INFO_TAG
3511 #include "libavutil/parseutils.h"
3513 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3515 return av_find_info_tag(arg, arg_size, tag1, info);
3519 int av_get_frame_filename(char *buf, int buf_size,
3520 const char *path, int number)
3523 char *q, buf1[20], c;
3524 int nd, len, percentd_found;
3536 while (isdigit(*p)) {
3537 nd = nd * 10 + *p++ - '0';
3540 } while (isdigit(c));
3549 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3551 if ((q - buf + len) > buf_size - 1)
3553 memcpy(q, buf1, len);
3561 if ((q - buf) < buf_size - 1)
3565 if (!percentd_found)
3574 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3578 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3580 for(i=0;i<size;i+=16) {
3587 PRINT(" %02x", buf[i+j]);
3592 for(j=0;j<len;j++) {
3594 if (c < ' ' || c > '~')
3603 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3605 hex_dump_internal(NULL, f, 0, buf, size);
3608 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3610 hex_dump_internal(avcl, NULL, level, buf, size);
3613 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3616 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3617 PRINT("stream #%d:\n", pkt->stream_index);
3618 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3619 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3620 /* DTS is _always_ valid after av_read_frame() */
3622 if (pkt->dts == AV_NOPTS_VALUE)
3625 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3626 /* PTS may not be known if B-frames are present. */
3628 if (pkt->pts == AV_NOPTS_VALUE)
3631 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3633 PRINT(" size=%d\n", pkt->size);
3636 av_hex_dump(f, pkt->data, pkt->size);
3640 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3642 AVRational tb = { 1, AV_TIME_BASE };
3643 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3647 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3649 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3653 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3655 AVRational tb = { 1, AV_TIME_BASE };
3656 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3660 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3663 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3666 void av_url_split(char *proto, int proto_size,
3667 char *authorization, int authorization_size,
3668 char *hostname, int hostname_size,
3670 char *path, int path_size,
3673 const char *p, *ls, *at, *col, *brk;
3675 if (port_ptr) *port_ptr = -1;
3676 if (proto_size > 0) proto[0] = 0;
3677 if (authorization_size > 0) authorization[0] = 0;
3678 if (hostname_size > 0) hostname[0] = 0;
3679 if (path_size > 0) path[0] = 0;
3681 /* parse protocol */
3682 if ((p = strchr(url, ':'))) {
3683 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3688 /* no protocol means plain filename */
3689 av_strlcpy(path, url, path_size);
3693 /* separate path from hostname */
3694 ls = strchr(p, '/');
3696 ls = strchr(p, '?');
3698 av_strlcpy(path, ls, path_size);
3700 ls = &p[strlen(p)]; // XXX
3702 /* the rest is hostname, use that to parse auth/port */
3704 /* authorization (user[:pass]@hostname) */
3705 if ((at = strchr(p, '@')) && at < ls) {
3706 av_strlcpy(authorization, p,
3707 FFMIN(authorization_size, at + 1 - p));
3708 p = at + 1; /* skip '@' */
3711 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3713 av_strlcpy(hostname, p + 1,
3714 FFMIN(hostname_size, brk - p));
3715 if (brk[1] == ':' && port_ptr)
3716 *port_ptr = atoi(brk + 2);
3717 } else if ((col = strchr(p, ':')) && col < ls) {
3718 av_strlcpy(hostname, p,
3719 FFMIN(col + 1 - p, hostname_size));
3720 if (port_ptr) *port_ptr = atoi(col + 1);
3722 av_strlcpy(hostname, p,
3723 FFMIN(ls + 1 - p, hostname_size));
3727 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3730 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3733 'C', 'D', 'E', 'F' };
3734 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3737 'c', 'd', 'e', 'f' };
3738 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3740 for(i = 0; i < s; i++) {
3741 buff[i * 2] = hex_table[src[i] >> 4];
3742 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3748 int ff_hex_to_data(uint8_t *data, const char *p)
3755 p += strspn(p, SPACE_CHARS);
3758 c = toupper((unsigned char) *p++);
3759 if (c >= '0' && c <= '9')
3761 else if (c >= 'A' && c <= 'F')
3776 #if FF_API_SET_PTS_INFO
3777 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3778 unsigned int pts_num, unsigned int pts_den)
3780 avpriv_set_pts_info(s, pts_wrap_bits, pts_num, pts_den);
3784 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
3785 unsigned int pts_num, unsigned int pts_den)
3788 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3789 if(new_tb.num != pts_num)
3790 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3792 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3794 if(new_tb.num <= 0 || new_tb.den <= 0) {
3795 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3798 s->time_base = new_tb;
3799 s->pts_wrap_bits = pts_wrap_bits;
3802 int ff_url_join(char *str, int size, const char *proto,
3803 const char *authorization, const char *hostname,
3804 int port, const char *fmt, ...)
3807 struct addrinfo hints, *ai;
3812 av_strlcatf(str, size, "%s://", proto);
3813 if (authorization && authorization[0])
3814 av_strlcatf(str, size, "%s@", authorization);
3815 #if CONFIG_NETWORK && defined(AF_INET6)
3816 /* Determine if hostname is a numerical IPv6 address,
3817 * properly escape it within [] in that case. */
3818 memset(&hints, 0, sizeof(hints));
3819 hints.ai_flags = AI_NUMERICHOST;
3820 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3821 if (ai->ai_family == AF_INET6) {
3822 av_strlcat(str, "[", size);
3823 av_strlcat(str, hostname, size);
3824 av_strlcat(str, "]", size);
3826 av_strlcat(str, hostname, size);
3831 /* Not an IPv6 address, just output the plain string. */
3832 av_strlcat(str, hostname, size);
3835 av_strlcatf(str, size, ":%d", port);
3838 int len = strlen(str);
3841 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3847 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3848 AVFormatContext *src)
3853 local_pkt.stream_index = dst_stream;
3854 if (pkt->pts != AV_NOPTS_VALUE)
3855 local_pkt.pts = av_rescale_q(pkt->pts,
3856 src->streams[pkt->stream_index]->time_base,
3857 dst->streams[dst_stream]->time_base);
3858 if (pkt->dts != AV_NOPTS_VALUE)
3859 local_pkt.dts = av_rescale_q(pkt->dts,
3860 src->streams[pkt->stream_index]->time_base,
3861 dst->streams[dst_stream]->time_base);
3862 return av_write_frame(dst, &local_pkt);
3865 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3868 const char *ptr = str;
3870 /* Parse key=value pairs. */
3873 char *dest = NULL, *dest_end;
3874 int key_len, dest_len = 0;
3876 /* Skip whitespace and potential commas. */
3877 while (*ptr && (isspace(*ptr) || *ptr == ','))
3884 if (!(ptr = strchr(key, '=')))
3887 key_len = ptr - key;
3889 callback_get_buf(context, key, key_len, &dest, &dest_len);
3890 dest_end = dest + dest_len - 1;
3894 while (*ptr && *ptr != '\"') {
3898 if (dest && dest < dest_end)
3902 if (dest && dest < dest_end)
3910 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3911 if (dest && dest < dest_end)
3919 int ff_find_stream_index(AVFormatContext *s, int id)
3922 for (i = 0; i < s->nb_streams; i++) {
3923 if (s->streams[i]->id == id)
3929 void ff_make_absolute_url(char *buf, int size, const char *base,
3933 /* Absolute path, relative to the current server */
3934 if (base && strstr(base, "://") && rel[0] == '/') {
3936 av_strlcpy(buf, base, size);
3937 sep = strstr(buf, "://");
3940 sep = strchr(sep, '/');
3944 av_strlcat(buf, rel, size);
3947 /* If rel actually is an absolute url, just copy it */
3948 if (!base || strstr(rel, "://") || rel[0] == '/') {
3949 av_strlcpy(buf, rel, size);
3953 av_strlcpy(buf, base, size);
3954 /* Remove the file name from the base url */
3955 sep = strrchr(buf, '/');
3960 while (av_strstart(rel, "../", NULL) && sep) {
3961 /* Remove the path delimiter at the end */
3963 sep = strrchr(buf, '/');
3964 /* If the next directory name to pop off is "..", break here */
3965 if (!strcmp(sep ? &sep[1] : buf, "..")) {
3966 /* Readd the slash we just removed */
3967 av_strlcat(buf, "/", size);
3970 /* Cut off the directory name */
3977 av_strlcat(buf, rel, size);
3980 int64_t ff_iso8601_to_unix_time(const char *datestr)
3983 struct tm time1 = {0}, time2 = {0};
3985 ret1 = strptime(datestr, "%Y - %m - %d %T", &time1);
3986 ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2);
3988 return av_timegm(&time2);
3990 return av_timegm(&time1);
3992 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
3993 "the date string.\n");
3998 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
4001 if (ofmt->query_codec)
4002 return ofmt->query_codec(codec_id, std_compliance);
4003 else if (ofmt->codec_tag)
4004 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4005 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4006 codec_id == ofmt->subtitle_codec)
4009 return AVERROR_PATCHWELCOME;
4012 int avformat_network_init(void)
4016 ff_network_inited_globally = 1;
4017 if ((ret = ff_network_init()) < 0)
4024 int avformat_network_deinit(void)
4033 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4034 uint64_t channel_layout, int32_t sample_rate,
4035 int32_t width, int32_t height)
4041 return AVERROR(EINVAL);
4044 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4046 if (channel_layout) {
4048 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4052 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4054 if (width || height) {
4056 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4058 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4060 return AVERROR(ENOMEM);
4061 bytestream_put_le32(&data, flags);
4063 bytestream_put_le32(&data, channels);
4065 bytestream_put_le64(&data, channel_layout);
4067 bytestream_put_le32(&data, sample_rate);
4068 if (width || height) {
4069 bytestream_put_le32(&data, width);
4070 bytestream_put_le32(&data, height);