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/avassert.h"
35 #include "libavutil/avstring.h"
36 #include "libavutil/mathematics.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/time.h"
40 #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) != AV_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 && !av_strcasecmp(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 AVCodecID 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 AVCodecID codec_id= AV_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 == AV_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 AV_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 AVCodecID id; enum AVMediaType type;
372 { "aac" , AV_CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
373 { "ac3" , AV_CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
374 { "dts" , AV_CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
375 { "eac3" , AV_CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
376 { "h264" , AV_CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
377 { "m4v" , AV_CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
378 { "mp3" , AV_CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
379 { "mpegvideo", AV_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 /** size of probe buffer, for guessing file type from file contents */
403 #define PROBE_BUF_MIN 2048
404 #define PROBE_BUF_MAX (1<<20)
406 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
407 const char *filename, void *logctx,
408 unsigned int offset, unsigned int max_probe_size)
410 AVProbeData pd = { filename ? filename : "", NULL, -offset };
411 unsigned char *buf = NULL;
412 int ret = 0, probe_size;
414 if (!max_probe_size) {
415 max_probe_size = PROBE_BUF_MAX;
416 } else if (max_probe_size > PROBE_BUF_MAX) {
417 max_probe_size = PROBE_BUF_MAX;
418 } else if (max_probe_size < PROBE_BUF_MIN) {
419 return AVERROR(EINVAL);
422 if (offset >= max_probe_size) {
423 return AVERROR(EINVAL);
426 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
427 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
428 int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
429 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
431 if (probe_size < offset) {
435 /* read probe data */
436 buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
437 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
438 /* fail if error was not end of file, otherwise, lower score */
439 if (ret != AVERROR_EOF) {
444 ret = 0; /* error was end of file, nothing read */
447 pd.buf = &buf[offset];
449 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
451 /* guess file format */
452 *fmt = av_probe_input_format2(&pd, 1, &score);
454 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
455 av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
457 av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
463 return AVERROR_INVALIDDATA;
466 /* rewind. reuse probe buffer to avoid seeking */
467 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
473 /* open input file and probe the format if necessary */
474 static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)
477 AVProbeData pd = {filename, NULL, 0};
480 s->flags |= AVFMT_FLAG_CUSTOM_IO;
482 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
483 else if (s->iformat->flags & AVFMT_NOFILE)
484 return AVERROR(EINVAL);
488 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
489 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
492 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ,
493 &s->interrupt_callback, options)) < 0)
497 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
500 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
501 AVPacketList **plast_pktl){
502 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
507 (*plast_pktl)->next = pktl;
509 *packet_buffer = pktl;
511 /* add the packet in the buffered packet list */
517 static void queue_attached_pictures(AVFormatContext *s)
520 for (i = 0; i < s->nb_streams; i++)
521 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
522 s->streams[i]->discard < AVDISCARD_ALL) {
523 AVPacket copy = s->streams[i]->attached_pic;
524 copy.destruct = NULL;
525 add_to_pktbuf(&s->raw_packet_buffer, ©, &s->raw_packet_buffer_end);
529 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
531 AVFormatContext *s = *ps;
533 AVDictionary *tmp = NULL;
534 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
536 if (!s && !(s = avformat_alloc_context()))
537 return AVERROR(ENOMEM);
542 av_dict_copy(&tmp, *options, 0);
544 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
547 if ((ret = init_input(s, filename, &tmp)) < 0)
550 /* check filename in case an image number is expected */
551 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
552 if (!av_filename_number_test(filename)) {
553 ret = AVERROR(EINVAL);
558 s->duration = s->start_time = AV_NOPTS_VALUE;
559 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
561 /* allocate private data */
562 if (s->iformat->priv_data_size > 0) {
563 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
564 ret = AVERROR(ENOMEM);
567 if (s->iformat->priv_class) {
568 *(const AVClass**)s->priv_data = s->iformat->priv_class;
569 av_opt_set_defaults(s->priv_data);
570 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
575 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
577 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
579 if (s->iformat->read_header)
580 if ((ret = s->iformat->read_header(s)) < 0)
583 if (id3v2_extra_meta &&
584 (ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
586 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
588 queue_attached_pictures(s);
590 if (s->pb && !s->data_offset)
591 s->data_offset = avio_tell(s->pb);
593 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
596 av_dict_free(options);
603 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
605 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
607 avformat_free_context(s);
612 /*******************************************************/
614 static void probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
616 if(st->codec->codec_id == AV_CODEC_ID_PROBE){
617 AVProbeData *pd = &st->probe_data;
618 av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
622 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
623 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
624 pd->buf_size += pkt->size;
625 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
627 st->probe_packets = 0;
629 av_log(s, AV_LOG_ERROR, "nothing to probe for stream %d\n",
635 if (!st->probe_packets ||
636 av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
637 set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0);
638 if(st->codec->codec_id != AV_CODEC_ID_PROBE){
641 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
647 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
653 AVPacketList *pktl = s->raw_packet_buffer;
657 st = s->streams[pkt->stream_index];
658 if (st->codec->codec_id != AV_CODEC_ID_PROBE || !st->probe_packets ||
659 s->raw_packet_buffer_remaining_size < pkt->size) {
661 if (st->probe_packets) {
662 probe_codec(s, st, NULL);
664 pd = &st->probe_data;
667 s->raw_packet_buffer = pktl->next;
668 s->raw_packet_buffer_remaining_size += pkt->size;
677 ret= s->iformat->read_packet(s, pkt);
679 if (!pktl || ret == AVERROR(EAGAIN))
681 for (i = 0; i < s->nb_streams; i++) {
683 if (st->probe_packets) {
684 probe_codec(s, st, NULL);
690 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
691 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
692 av_log(s, AV_LOG_WARNING,
693 "Dropped corrupted packet (stream = %d)\n",
699 st= s->streams[pkt->stream_index];
701 switch(st->codec->codec_type){
702 case AVMEDIA_TYPE_VIDEO:
703 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
705 case AVMEDIA_TYPE_AUDIO:
706 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
708 case AVMEDIA_TYPE_SUBTITLE:
709 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
713 if(!pktl && (st->codec->codec_id != AV_CODEC_ID_PROBE ||
717 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
718 s->raw_packet_buffer_remaining_size -= pkt->size;
720 probe_codec(s, st, pkt);
724 #if FF_API_READ_PACKET
725 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
727 return ff_read_packet(s, pkt);
732 /**********************************************************/
735 * Get the number of samples of an audio frame. Return -1 on error.
737 static int get_audio_frame_size(AVCodecContext *enc, int size, int mux)
741 /* give frame_size priority if demuxing */
742 if (!mux && enc->frame_size > 1)
743 return enc->frame_size;
745 if ((frame_size = av_get_audio_frame_duration(enc, size)) > 0)
748 /* fallback to using frame_size if muxing */
749 if (enc->frame_size > 1)
750 return enc->frame_size;
757 * Return the frame duration in seconds. Return 0 if not available.
759 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
760 AVCodecParserContext *pc, AVPacket *pkt)
766 switch(st->codec->codec_type) {
767 case AVMEDIA_TYPE_VIDEO:
768 if (st->avg_frame_rate.num) {
769 *pnum = st->avg_frame_rate.den;
770 *pden = st->avg_frame_rate.num;
771 } else if(st->time_base.num*1000LL > st->time_base.den) {
772 *pnum = st->time_base.num;
773 *pden = st->time_base.den;
774 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
775 *pnum = st->codec->time_base.num;
776 *pden = st->codec->time_base.den;
777 if (pc && pc->repeat_pict) {
778 *pnum = (*pnum) * (1 + pc->repeat_pict);
780 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
781 //Thus if we have no parser in such case leave duration undefined.
782 if(st->codec->ticks_per_frame>1 && !pc){
787 case AVMEDIA_TYPE_AUDIO:
788 frame_size = get_audio_frame_size(st->codec, pkt->size, 0);
789 if (frame_size <= 0 || st->codec->sample_rate <= 0)
792 *pden = st->codec->sample_rate;
799 static int is_intra_only(enum AVCodecID id)
801 const AVCodecDescriptor *d = avcodec_descriptor_get(id);
804 if (d->type == AVMEDIA_TYPE_VIDEO && !(d->props & AV_CODEC_PROP_INTRA_ONLY))
809 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
810 int64_t dts, int64_t pts)
812 AVStream *st= s->streams[stream_index];
813 AVPacketList *pktl= s->packet_buffer;
815 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
818 st->first_dts= dts - st->cur_dts;
821 for(; pktl; pktl= pktl->next){
822 if(pktl->pkt.stream_index != stream_index)
824 //FIXME think more about this check
825 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
826 pktl->pkt.pts += st->first_dts;
828 if(pktl->pkt.dts != AV_NOPTS_VALUE)
829 pktl->pkt.dts += st->first_dts;
831 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
832 st->start_time= pktl->pkt.pts;
834 if (st->start_time == AV_NOPTS_VALUE)
835 st->start_time = pts;
838 static void update_initial_durations(AVFormatContext *s, AVStream *st,
839 int stream_index, int duration)
841 AVPacketList *pktl= s->packet_buffer;
844 if(st->first_dts != AV_NOPTS_VALUE){
845 cur_dts= st->first_dts;
846 for(; pktl; pktl= pktl->next){
847 if(pktl->pkt.stream_index == stream_index){
848 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
853 pktl= s->packet_buffer;
854 st->first_dts = cur_dts;
855 }else if(st->cur_dts)
858 for(; pktl; pktl= pktl->next){
859 if(pktl->pkt.stream_index != stream_index)
861 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
862 && !pktl->pkt.duration){
863 pktl->pkt.dts= cur_dts;
864 if(!st->codec->has_b_frames)
865 pktl->pkt.pts= cur_dts;
867 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
868 pktl->pkt.duration = duration;
872 if(st->first_dts == AV_NOPTS_VALUE)
873 st->cur_dts= cur_dts;
876 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
877 AVCodecParserContext *pc, AVPacket *pkt)
879 int num, den, presentation_delayed, delay, i;
882 if (s->flags & AVFMT_FLAG_NOFILLIN)
885 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
886 pkt->dts= AV_NOPTS_VALUE;
888 /* do we have a video B-frame ? */
889 delay= st->codec->has_b_frames;
890 presentation_delayed = 0;
892 /* XXX: need has_b_frame, but cannot get it if the codec is
895 pc && pc->pict_type != AV_PICTURE_TYPE_B)
896 presentation_delayed = 1;
898 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
899 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
900 pkt->dts -= 1LL<<st->pts_wrap_bits;
903 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
904 // we take the conservative approach and discard both
905 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
906 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
907 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
908 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
911 if (pkt->duration == 0 && st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
912 compute_frame_duration(&num, &den, st, pc, pkt);
914 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
916 if(pkt->duration != 0 && s->packet_buffer)
917 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
921 /* correct timestamps with byte offset if demuxers only have timestamps
922 on packet boundaries */
923 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
924 /* this will estimate bitrate based on this frame's duration and size */
925 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
926 if(pkt->pts != AV_NOPTS_VALUE)
928 if(pkt->dts != AV_NOPTS_VALUE)
932 if (pc && pc->dts_sync_point >= 0) {
933 // we have synchronization info from the parser
934 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
936 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
937 if (pkt->dts != AV_NOPTS_VALUE) {
938 // got DTS from the stream, update reference timestamp
939 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
940 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
941 } else if (st->reference_dts != AV_NOPTS_VALUE) {
942 // compute DTS based on reference timestamp
943 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
944 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
946 if (pc->dts_sync_point > 0)
947 st->reference_dts = pkt->dts; // new reference
951 /* This may be redundant, but it should not hurt. */
952 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
953 presentation_delayed = 1;
955 // 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);
956 /* interpolate PTS and DTS if they are not present */
957 //We skip H264 currently because delay and has_b_frames are not reliably set
958 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != AV_CODEC_ID_H264){
959 if (presentation_delayed) {
960 /* DTS = decompression timestamp */
961 /* PTS = presentation timestamp */
962 if (pkt->dts == AV_NOPTS_VALUE)
963 pkt->dts = st->last_IP_pts;
964 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
965 if (pkt->dts == AV_NOPTS_VALUE)
966 pkt->dts = st->cur_dts;
968 /* this is tricky: the dts must be incremented by the duration
969 of the frame we are displaying, i.e. the last I- or P-frame */
970 if (st->last_IP_duration == 0)
971 st->last_IP_duration = pkt->duration;
972 if(pkt->dts != AV_NOPTS_VALUE)
973 st->cur_dts = pkt->dts + st->last_IP_duration;
974 st->last_IP_duration = pkt->duration;
975 st->last_IP_pts= pkt->pts;
976 /* cannot compute PTS if not present (we can compute it only
977 by knowing the future */
978 } else if (pkt->pts != AV_NOPTS_VALUE ||
979 pkt->dts != AV_NOPTS_VALUE ||
981 st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
982 int duration = pkt->duration;
983 if (!duration && st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
984 compute_frame_duration(&num, &den, st, pc, pkt);
986 duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den,
987 den * (int64_t)st->time_base.num,
989 if (duration != 0 && s->packet_buffer) {
990 update_initial_durations(s, st, pkt->stream_index,
996 if (pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE ||
998 /* presentation is not delayed : PTS and DTS are the same */
999 if (pkt->pts == AV_NOPTS_VALUE)
1000 pkt->pts = pkt->dts;
1001 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1003 if (pkt->pts == AV_NOPTS_VALUE)
1004 pkt->pts = st->cur_dts;
1005 pkt->dts = pkt->pts;
1006 if (pkt->pts != AV_NOPTS_VALUE)
1007 st->cur_dts = pkt->pts + duration;
1012 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1013 st->pts_buffer[0]= pkt->pts;
1014 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1015 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1016 if(pkt->dts == AV_NOPTS_VALUE)
1017 pkt->dts= st->pts_buffer[0];
1018 if(st->codec->codec_id == AV_CODEC_ID_H264){ // we skipped it above so we try here
1019 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1021 if(pkt->dts > st->cur_dts)
1022 st->cur_dts = pkt->dts;
1025 // 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);
1028 if (is_intra_only(st->codec->codec_id))
1029 pkt->flags |= AV_PKT_FLAG_KEY;
1031 pkt->convergence_duration = pc->convergence_duration;
1034 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1037 AVPacketList *pktl = *pkt_buf;
1038 *pkt_buf = pktl->next;
1039 av_free_packet(&pktl->pkt);
1042 *pkt_buf_end = NULL;
1046 * Parse a packet, add all split parts to parse_queue
1048 * @param pkt packet to parse, NULL when flushing the parser at end of stream
1050 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1052 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1053 AVStream *st = s->streams[stream_index];
1054 uint8_t *data = pkt ? pkt->data : NULL;
1055 int size = pkt ? pkt->size : 0;
1056 int ret = 0, got_output = 0;
1059 av_init_packet(&flush_pkt);
1064 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1067 av_init_packet(&out_pkt);
1068 len = av_parser_parse2(st->parser, st->codec,
1069 &out_pkt.data, &out_pkt.size, data, size,
1070 pkt->pts, pkt->dts, pkt->pos);
1072 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1073 /* increment read pointer */
1077 got_output = !!out_pkt.size;
1082 /* set the duration */
1083 out_pkt.duration = 0;
1084 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1085 if (st->codec->sample_rate > 0) {
1086 out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
1087 (AVRational){ 1, st->codec->sample_rate },
1091 } else if (st->codec->time_base.num != 0 &&
1092 st->codec->time_base.den != 0) {
1093 out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
1094 st->codec->time_base,
1099 out_pkt.stream_index = st->index;
1100 out_pkt.pts = st->parser->pts;
1101 out_pkt.dts = st->parser->dts;
1102 out_pkt.pos = st->parser->pos;
1104 if (st->parser->key_frame == 1 ||
1105 (st->parser->key_frame == -1 &&
1106 st->parser->pict_type == AV_PICTURE_TYPE_I))
1107 out_pkt.flags |= AV_PKT_FLAG_KEY;
1109 compute_pkt_fields(s, st, st->parser, &out_pkt);
1111 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1112 out_pkt.flags & AV_PKT_FLAG_KEY) {
1113 ff_reduce_index(s, st->index);
1114 av_add_index_entry(st, st->parser->frame_offset, out_pkt.dts,
1115 0, 0, AVINDEX_KEYFRAME);
1118 if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
1119 out_pkt.destruct = pkt->destruct;
1120 pkt->destruct = NULL;
1122 if ((ret = av_dup_packet(&out_pkt)) < 0)
1125 if (!add_to_pktbuf(&s->parse_queue, &out_pkt, &s->parse_queue_end)) {
1126 av_free_packet(&out_pkt);
1127 ret = AVERROR(ENOMEM);
1133 /* end of the stream => close and free the parser */
1134 if (pkt == &flush_pkt) {
1135 av_parser_close(st->parser);
1140 av_free_packet(pkt);
1144 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1145 AVPacketList **pkt_buffer_end,
1149 av_assert0(*pkt_buffer);
1152 *pkt_buffer = pktl->next;
1154 *pkt_buffer_end = NULL;
1159 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1161 int ret = 0, i, got_packet = 0;
1163 av_init_packet(pkt);
1165 while (!got_packet && !s->parse_queue) {
1169 /* read next packet */
1170 ret = ff_read_packet(s, &cur_pkt);
1172 if (ret == AVERROR(EAGAIN))
1174 /* flush the parsers */
1175 for(i = 0; i < s->nb_streams; i++) {
1177 if (st->parser && st->need_parsing)
1178 parse_packet(s, NULL, st->index);
1180 /* all remaining packets are now in parse_queue =>
1181 * really terminate parsing */
1185 st = s->streams[cur_pkt.stream_index];
1187 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1188 cur_pkt.dts != AV_NOPTS_VALUE &&
1189 cur_pkt.pts < cur_pkt.dts) {
1190 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1191 cur_pkt.stream_index,
1196 if (s->debug & FF_FDEBUG_TS)
1197 av_log(s, AV_LOG_DEBUG, "ff_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1198 cur_pkt.stream_index,
1205 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1206 st->parser = av_parser_init(st->codec->codec_id);
1208 /* no parser available: just output the raw packets */
1209 st->need_parsing = AVSTREAM_PARSE_NONE;
1210 } else if(st->need_parsing == AVSTREAM_PARSE_HEADERS) {
1211 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1212 } else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE) {
1213 st->parser->flags |= PARSER_FLAG_ONCE;
1217 if (!st->need_parsing || !st->parser) {
1218 /* no parsing needed: we just output the packet as is */
1220 compute_pkt_fields(s, st, NULL, pkt);
1221 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1222 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1223 ff_reduce_index(s, st->index);
1224 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1227 } else if (st->discard < AVDISCARD_ALL) {
1228 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1232 av_free_packet(&cur_pkt);
1236 if (!got_packet && s->parse_queue)
1237 ret = read_from_packet_buffer(&s->parse_queue, &s->parse_queue_end, pkt);
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)
1253 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1257 return s->packet_buffer ? read_from_packet_buffer(&s->packet_buffer,
1258 &s->packet_buffer_end,
1260 read_frame_internal(s, pkt);
1264 AVPacketList *pktl = s->packet_buffer;
1267 AVPacket *next_pkt = &pktl->pkt;
1269 if (next_pkt->dts != AV_NOPTS_VALUE) {
1270 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1271 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1272 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1273 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0) &&
1274 av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1275 next_pkt->pts = pktl->pkt.dts;
1279 pktl = s->packet_buffer;
1282 /* read packet from packet buffer, if there is data */
1283 if (!(next_pkt->pts == AV_NOPTS_VALUE &&
1284 next_pkt->dts != AV_NOPTS_VALUE && !eof))
1285 return read_from_packet_buffer(&s->packet_buffer,
1286 &s->packet_buffer_end, pkt);
1289 ret = read_frame_internal(s, pkt);
1291 if (pktl && ret != AVERROR(EAGAIN)) {
1298 if (av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1299 &s->packet_buffer_end)) < 0)
1300 return AVERROR(ENOMEM);
1304 /* XXX: suppress the packet queue */
1305 static void flush_packet_queue(AVFormatContext *s)
1307 free_packet_buffer(&s->parse_queue, &s->parse_queue_end);
1308 free_packet_buffer(&s->packet_buffer, &s->packet_buffer_end);
1309 free_packet_buffer(&s->raw_packet_buffer, &s->raw_packet_buffer_end);
1311 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1314 /*******************************************************/
1317 int av_find_default_stream_index(AVFormatContext *s)
1319 int first_audio_index = -1;
1323 if (s->nb_streams <= 0)
1325 for(i = 0; i < s->nb_streams; i++) {
1327 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1328 !(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
1331 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1332 first_audio_index = i;
1334 return first_audio_index >= 0 ? first_audio_index : 0;
1338 * Flush the frame reader.
1340 void ff_read_frame_flush(AVFormatContext *s)
1345 flush_packet_queue(s);
1347 /* for each stream, reset read state */
1348 for(i = 0; i < s->nb_streams; i++) {
1352 av_parser_close(st->parser);
1355 st->last_IP_pts = AV_NOPTS_VALUE;
1356 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1357 st->reference_dts = AV_NOPTS_VALUE;
1359 st->probe_packets = MAX_PROBE_PACKETS;
1361 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1362 st->pts_buffer[j]= AV_NOPTS_VALUE;
1366 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1370 for(i = 0; i < s->nb_streams; i++) {
1371 AVStream *st = s->streams[i];
1373 st->cur_dts = av_rescale(timestamp,
1374 st->time_base.den * (int64_t)ref_st->time_base.num,
1375 st->time_base.num * (int64_t)ref_st->time_base.den);
1379 void ff_reduce_index(AVFormatContext *s, int stream_index)
1381 AVStream *st= s->streams[stream_index];
1382 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1384 if((unsigned)st->nb_index_entries >= max_entries){
1386 for(i=0; 2*i<st->nb_index_entries; i++)
1387 st->index_entries[i]= st->index_entries[2*i];
1388 st->nb_index_entries= i;
1392 int ff_add_index_entry(AVIndexEntry **index_entries,
1393 int *nb_index_entries,
1394 unsigned int *index_entries_allocated_size,
1395 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1397 AVIndexEntry *entries, *ie;
1400 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1403 entries = av_fast_realloc(*index_entries,
1404 index_entries_allocated_size,
1405 (*nb_index_entries + 1) *
1406 sizeof(AVIndexEntry));
1410 *index_entries= entries;
1412 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1415 index= (*nb_index_entries)++;
1416 ie= &entries[index];
1417 assert(index==0 || ie[-1].timestamp < timestamp);
1419 ie= &entries[index];
1420 if(ie->timestamp != timestamp){
1421 if(ie->timestamp <= timestamp)
1423 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1424 (*nb_index_entries)++;
1425 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1426 distance= ie->min_distance;
1430 ie->timestamp = timestamp;
1431 ie->min_distance= distance;
1438 int av_add_index_entry(AVStream *st,
1439 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1441 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1442 &st->index_entries_allocated_size, pos,
1443 timestamp, size, distance, flags);
1446 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1447 int64_t wanted_timestamp, int flags)
1455 //optimize appending index entries at the end
1456 if(b && entries[b-1].timestamp < wanted_timestamp)
1461 timestamp = entries[m].timestamp;
1462 if(timestamp >= wanted_timestamp)
1464 if(timestamp <= wanted_timestamp)
1467 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1469 if(!(flags & AVSEEK_FLAG_ANY)){
1470 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1471 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1480 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1483 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1484 wanted_timestamp, flags);
1487 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
1489 AVInputFormat *avif= s->iformat;
1490 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1491 int64_t ts_min, ts_max, ts;
1496 if (stream_index < 0)
1499 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1502 ts_min= AV_NOPTS_VALUE;
1503 pos_limit= -1; //gcc falsely says it may be uninitialized
1505 st= s->streams[stream_index];
1506 if(st->index_entries){
1509 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()
1510 index= FFMAX(index, 0);
1511 e= &st->index_entries[index];
1513 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1515 ts_min= e->timestamp;
1516 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1522 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1523 assert(index < st->nb_index_entries);
1525 e= &st->index_entries[index];
1526 assert(e->timestamp >= target_ts);
1528 ts_max= e->timestamp;
1529 pos_limit= pos_max - e->min_distance;
1530 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1531 pos_max,pos_limit, ts_max);
1535 pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1540 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1543 ff_update_cur_dts(s, st, ts);
1548 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1549 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1550 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1551 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1554 int64_t start_pos, filesize;
1557 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1559 if(ts_min == AV_NOPTS_VALUE){
1560 pos_min = s->data_offset;
1561 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1562 if (ts_min == AV_NOPTS_VALUE)
1566 if(ts_max == AV_NOPTS_VALUE){
1568 filesize = avio_size(s->pb);
1569 pos_max = filesize - 1;
1572 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1574 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1575 if (ts_max == AV_NOPTS_VALUE)
1579 int64_t tmp_pos= pos_max + 1;
1580 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1581 if(tmp_ts == AV_NOPTS_VALUE)
1585 if(tmp_pos >= filesize)
1591 if(ts_min > ts_max){
1593 }else if(ts_min == ts_max){
1598 while (pos_min < pos_limit) {
1599 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1600 pos_min, pos_max, ts_min, ts_max);
1601 assert(pos_limit <= pos_max);
1604 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1605 // interpolate position (better than dichotomy)
1606 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1607 + pos_min - approximate_keyframe_distance;
1608 }else if(no_change==1){
1609 // bisection, if interpolation failed to change min or max pos last time
1610 pos = (pos_min + pos_limit)>>1;
1612 /* linear search if bisection failed, can only happen if there
1613 are very few or no keyframes between min/max */
1618 else if(pos > pos_limit)
1622 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1627 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1628 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1629 pos_limit, start_pos, no_change);
1630 if(ts == AV_NOPTS_VALUE){
1631 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1634 assert(ts != AV_NOPTS_VALUE);
1635 if (target_ts <= ts) {
1636 pos_limit = start_pos - 1;
1640 if (target_ts >= ts) {
1646 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1647 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1649 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1651 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1652 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1653 pos, ts_min, target_ts, ts_max);
1658 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1659 int64_t pos_min, pos_max;
1661 pos_min = s->data_offset;
1662 pos_max = avio_size(s->pb) - 1;
1664 if (pos < pos_min) pos= pos_min;
1665 else if(pos > pos_max) pos= pos_max;
1667 avio_seek(s->pb, pos, SEEK_SET);
1672 static int seek_frame_generic(AVFormatContext *s,
1673 int stream_index, int64_t timestamp, int flags)
1680 st = s->streams[stream_index];
1682 index = av_index_search_timestamp(st, timestamp, flags);
1684 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1687 if(index < 0 || index==st->nb_index_entries-1){
1690 if(st->nb_index_entries){
1691 assert(st->index_entries);
1692 ie= &st->index_entries[st->nb_index_entries-1];
1693 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1695 ff_update_cur_dts(s, st, ie->timestamp);
1697 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1703 read_status = av_read_frame(s, &pkt);
1704 } while (read_status == AVERROR(EAGAIN));
1705 if (read_status < 0)
1707 av_free_packet(&pkt);
1708 if(stream_index == pkt.stream_index){
1709 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1713 index = av_index_search_timestamp(st, timestamp, flags);
1718 ff_read_frame_flush(s);
1719 if (s->iformat->read_seek){
1720 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1723 ie = &st->index_entries[index];
1724 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1726 ff_update_cur_dts(s, st, ie->timestamp);
1731 static int seek_frame_internal(AVFormatContext *s, int stream_index,
1732 int64_t timestamp, int flags)
1737 if (flags & AVSEEK_FLAG_BYTE) {
1738 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1740 ff_read_frame_flush(s);
1741 return seek_frame_byte(s, stream_index, timestamp, flags);
1744 if(stream_index < 0){
1745 stream_index= av_find_default_stream_index(s);
1746 if(stream_index < 0)
1749 st= s->streams[stream_index];
1750 /* timestamp for default must be expressed in AV_TIME_BASE units */
1751 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1754 /* first, we try the format specific seek */
1755 if (s->iformat->read_seek) {
1756 ff_read_frame_flush(s);
1757 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1764 if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1765 ff_read_frame_flush(s);
1766 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1767 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1768 ff_read_frame_flush(s);
1769 return seek_frame_generic(s, stream_index, timestamp, flags);
1775 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1777 int ret = seek_frame_internal(s, stream_index, timestamp, flags);
1780 queue_attached_pictures(s);
1785 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1787 if(min_ts > ts || max_ts < ts)
1790 if (s->iformat->read_seek2) {
1792 ff_read_frame_flush(s);
1793 ret = s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1796 queue_attached_pictures(s);
1800 if(s->iformat->read_timestamp){
1801 //try to seek via read_timestamp()
1804 //Fallback to old API if new is not implemented but old is
1805 //Note the old has somewat different sematics
1806 if(s->iformat->read_seek || 1)
1807 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1809 // try some generic seek like seek_frame_generic() but with new ts semantics
1812 /*******************************************************/
1815 * Return TRUE if the stream has accurate duration in any stream.
1817 * @return TRUE if the stream has accurate duration for at least one component.
1819 static int has_duration(AVFormatContext *ic)
1824 for(i = 0;i < ic->nb_streams; i++) {
1825 st = ic->streams[i];
1826 if (st->duration != AV_NOPTS_VALUE)
1829 if (ic->duration != AV_NOPTS_VALUE)
1835 * Estimate the stream timings from the one of each components.
1837 * Also computes the global bitrate if possible.
1839 static void update_stream_timings(AVFormatContext *ic)
1841 int64_t start_time, start_time1, end_time, end_time1;
1842 int64_t duration, duration1, filesize;
1846 start_time = INT64_MAX;
1847 end_time = INT64_MIN;
1848 duration = INT64_MIN;
1849 for(i = 0;i < ic->nb_streams; i++) {
1850 st = ic->streams[i];
1851 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1852 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1853 start_time = FFMIN(start_time, start_time1);
1854 if (st->duration != AV_NOPTS_VALUE) {
1855 end_time1 = start_time1
1856 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1857 end_time = FFMAX(end_time, end_time1);
1860 if (st->duration != AV_NOPTS_VALUE) {
1861 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1862 duration = FFMAX(duration, duration1);
1865 if (start_time != INT64_MAX) {
1866 ic->start_time = start_time;
1867 if (end_time != INT64_MIN)
1868 duration = FFMAX(duration, end_time - start_time);
1870 if (duration != INT64_MIN) {
1871 ic->duration = duration;
1872 if (ic->pb && (filesize = avio_size(ic->pb)) > 0) {
1873 /* compute the bitrate */
1874 ic->bit_rate = (double)filesize * 8.0 * AV_TIME_BASE /
1875 (double)ic->duration;
1880 static void fill_all_stream_timings(AVFormatContext *ic)
1885 update_stream_timings(ic);
1886 for(i = 0;i < ic->nb_streams; i++) {
1887 st = ic->streams[i];
1888 if (st->start_time == AV_NOPTS_VALUE) {
1889 if(ic->start_time != AV_NOPTS_VALUE)
1890 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1891 if(ic->duration != AV_NOPTS_VALUE)
1892 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1897 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
1899 int64_t filesize, duration;
1903 /* if bit_rate is already set, we believe it */
1904 if (ic->bit_rate <= 0) {
1906 for(i=0;i<ic->nb_streams;i++) {
1907 st = ic->streams[i];
1908 if (st->codec->bit_rate > 0)
1909 bit_rate += st->codec->bit_rate;
1911 ic->bit_rate = bit_rate;
1914 /* if duration is already set, we believe it */
1915 if (ic->duration == AV_NOPTS_VALUE &&
1916 ic->bit_rate != 0) {
1917 filesize = ic->pb ? avio_size(ic->pb) : 0;
1919 for(i = 0; i < ic->nb_streams; i++) {
1920 st = ic->streams[i];
1921 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1922 if (st->duration == AV_NOPTS_VALUE)
1923 st->duration = duration;
1929 #define DURATION_MAX_READ_SIZE 250000
1930 #define DURATION_MAX_RETRY 3
1932 /* only usable for MPEG-PS streams */
1933 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1935 AVPacket pkt1, *pkt = &pkt1;
1937 int read_size, i, ret;
1939 int64_t filesize, offset, duration;
1942 /* flush packet queue */
1943 flush_packet_queue(ic);
1945 for (i=0; i<ic->nb_streams; i++) {
1946 st = ic->streams[i];
1947 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1948 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
1951 av_parser_close(st->parser);
1956 /* estimate the end time (duration) */
1957 /* XXX: may need to support wrapping */
1958 filesize = ic->pb ? avio_size(ic->pb) : 0;
1959 end_time = AV_NOPTS_VALUE;
1961 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
1965 avio_seek(ic->pb, offset, SEEK_SET);
1968 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
1972 ret = ff_read_packet(ic, pkt);
1973 } while(ret == AVERROR(EAGAIN));
1976 read_size += pkt->size;
1977 st = ic->streams[pkt->stream_index];
1978 if (pkt->pts != AV_NOPTS_VALUE &&
1979 (st->start_time != AV_NOPTS_VALUE ||
1980 st->first_dts != AV_NOPTS_VALUE)) {
1981 duration = end_time = pkt->pts;
1982 if (st->start_time != AV_NOPTS_VALUE)
1983 duration -= st->start_time;
1985 duration -= st->first_dts;
1987 duration += 1LL<<st->pts_wrap_bits;
1989 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
1990 st->duration = duration;
1993 av_free_packet(pkt);
1995 }while( end_time==AV_NOPTS_VALUE
1996 && filesize > (DURATION_MAX_READ_SIZE<<retry)
1997 && ++retry <= DURATION_MAX_RETRY);
1999 fill_all_stream_timings(ic);
2001 avio_seek(ic->pb, old_offset, SEEK_SET);
2002 for (i=0; i<ic->nb_streams; i++) {
2004 st->cur_dts= st->first_dts;
2005 st->last_IP_pts = AV_NOPTS_VALUE;
2006 st->reference_dts = AV_NOPTS_VALUE;
2010 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2014 /* get the file size, if possible */
2015 if (ic->iformat->flags & AVFMT_NOFILE) {
2018 file_size = avio_size(ic->pb);
2019 file_size = FFMAX(0, file_size);
2022 if ((!strcmp(ic->iformat->name, "mpeg") ||
2023 !strcmp(ic->iformat->name, "mpegts")) &&
2024 file_size && ic->pb->seekable) {
2025 /* get accurate estimate from the PTSes */
2026 estimate_timings_from_pts(ic, old_offset);
2027 } else if (has_duration(ic)) {
2028 /* at least one component has timings - we use them for all
2030 fill_all_stream_timings(ic);
2032 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2033 /* less precise: use bitrate info */
2034 estimate_timings_from_bit_rate(ic);
2036 update_stream_timings(ic);
2040 AVStream av_unused *st;
2041 for(i = 0;i < ic->nb_streams; i++) {
2042 st = ic->streams[i];
2043 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2044 (double) st->start_time / AV_TIME_BASE,
2045 (double) st->duration / AV_TIME_BASE);
2047 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2048 (double) ic->start_time / AV_TIME_BASE,
2049 (double) ic->duration / AV_TIME_BASE,
2050 ic->bit_rate / 1000);
2054 static int has_codec_parameters(AVStream *st)
2056 AVCodecContext *avctx = st->codec;
2058 switch (avctx->codec_type) {
2059 case AVMEDIA_TYPE_AUDIO:
2060 val = avctx->sample_rate && avctx->channels;
2061 if (st->info->found_decoder >= 0 && avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2064 case AVMEDIA_TYPE_VIDEO:
2066 if (st->info->found_decoder >= 0 && avctx->pix_fmt == PIX_FMT_NONE)
2073 return avctx->codec_id != AV_CODEC_ID_NONE && val != 0;
2076 static int has_decode_delay_been_guessed(AVStream *st)
2078 return st->codec->codec_id != AV_CODEC_ID_H264 ||
2079 st->info->nb_decoded_frames >= 6;
2082 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2083 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2085 const AVCodec *codec;
2086 int got_picture = 1, ret = 0;
2087 AVFrame *frame = avcodec_alloc_frame();
2088 AVPacket pkt = *avpkt;
2091 return AVERROR(ENOMEM);
2093 if (!avcodec_is_open(st->codec) && !st->info->found_decoder) {
2094 AVDictionary *thread_opt = NULL;
2096 codec = st->codec->codec ? st->codec->codec :
2097 avcodec_find_decoder(st->codec->codec_id);
2100 st->info->found_decoder = -1;
2105 /* force thread count to 1 since the h264 decoder will not extract SPS
2106 * and PPS to extradata during multi-threaded decoding */
2107 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2108 ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
2110 av_dict_free(&thread_opt);
2112 st->info->found_decoder = -1;
2115 st->info->found_decoder = 1;
2116 } else if (!st->info->found_decoder)
2117 st->info->found_decoder = 1;
2119 if (st->info->found_decoder < 0) {
2124 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2126 (!has_codec_parameters(st) ||
2127 !has_decode_delay_been_guessed(st) ||
2128 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2130 avcodec_get_frame_defaults(frame);
2131 switch(st->codec->codec_type) {
2132 case AVMEDIA_TYPE_VIDEO:
2133 ret = avcodec_decode_video2(st->codec, frame,
2134 &got_picture, &pkt);
2136 case AVMEDIA_TYPE_AUDIO:
2137 ret = avcodec_decode_audio4(st->codec, frame, &got_picture, &pkt);
2144 st->info->nb_decoded_frames++;
2152 avcodec_free_frame(&frame);
2156 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
2158 while (tags->id != AV_CODEC_ID_NONE) {
2166 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2169 for(i=0; tags[i].id != AV_CODEC_ID_NONE;i++) {
2170 if(tag == tags[i].tag)
2173 for(i=0; tags[i].id != AV_CODEC_ID_NONE; i++) {
2174 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2177 return AV_CODEC_ID_NONE;
2180 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum AVCodecID id)
2183 for(i=0; tags && tags[i]; i++){
2184 int tag= ff_codec_get_tag(tags[i], id);
2190 enum AVCodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2193 for(i=0; tags && tags[i]; i++){
2194 enum AVCodecID id= ff_codec_get_id(tags[i], tag);
2195 if(id!=AV_CODEC_ID_NONE) return id;
2197 return AV_CODEC_ID_NONE;
2200 static void compute_chapters_end(AVFormatContext *s)
2203 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2205 for (i = 0; i < s->nb_chapters; i++)
2206 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2207 AVChapter *ch = s->chapters[i];
2208 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2211 for (j = 0; j < s->nb_chapters; j++) {
2212 AVChapter *ch1 = s->chapters[j];
2213 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2214 if (j != i && next_start > ch->start && next_start < end)
2217 ch->end = (end == INT64_MAX) ? ch->start : end;
2221 static int get_std_framerate(int i){
2222 if(i<60*12) return i*1001;
2223 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2227 * Is the time base unreliable.
2228 * This is a heuristic to balance between quick acceptance of the values in
2229 * the headers vs. some extra checks.
2230 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2231 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2232 * And there are "variable" fps files this needs to detect as well.
2234 static int tb_unreliable(AVCodecContext *c){
2235 if( c->time_base.den >= 101L*c->time_base.num
2236 || c->time_base.den < 5L*c->time_base.num
2237 /* || c->codec_tag == AV_RL32("DIVX")
2238 || c->codec_tag == AV_RL32("XVID")*/
2239 || c->codec_id == AV_CODEC_ID_MPEG2VIDEO
2240 || c->codec_id == AV_CODEC_ID_H264
2246 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2248 int i, count, ret, read_size, j;
2250 AVPacket pkt1, *pkt;
2251 int64_t old_offset = avio_tell(ic->pb);
2252 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2254 for(i=0;i<ic->nb_streams;i++) {
2255 const AVCodec *codec;
2256 AVDictionary *thread_opt = NULL;
2257 st = ic->streams[i];
2259 //only for the split stuff
2260 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2261 st->parser = av_parser_init(st->codec->codec_id);
2262 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2263 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2266 codec = st->codec->codec ? st->codec->codec :
2267 avcodec_find_decoder(st->codec->codec_id);
2269 /* force thread count to 1 since the h264 decoder will not extract SPS
2270 * and PPS to extradata during multi-threaded decoding */
2271 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
2273 /* Ensure that subtitle_header is properly set. */
2274 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2275 && codec && !st->codec->codec)
2276 avcodec_open2(st->codec, codec, options ? &options[i]
2279 //try to just open decoders, in case this is enough to get parameters
2280 if (!has_codec_parameters(st)) {
2281 if (codec && !st->codec->codec)
2282 avcodec_open2(st->codec, codec, options ? &options[i]
2286 av_dict_free(&thread_opt);
2289 for (i=0; i<ic->nb_streams; i++) {
2290 #if FF_API_R_FRAME_RATE
2291 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2293 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
2294 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
2300 if (ff_check_interrupt(&ic->interrupt_callback)){
2302 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2306 /* check if one codec still needs to be handled */
2307 for(i=0;i<ic->nb_streams;i++) {
2308 int fps_analyze_framecount = 20;
2310 st = ic->streams[i];
2311 if (!has_codec_parameters(st))
2313 /* if the timebase is coarse (like the usual millisecond precision
2314 of mkv), we need to analyze more frames to reliably arrive at
2316 if (av_q2d(st->time_base) > 0.0005)
2317 fps_analyze_framecount *= 2;
2318 if (ic->fps_probe_size >= 0)
2319 fps_analyze_framecount = ic->fps_probe_size;
2320 /* variable fps and no guess at the real fps */
2321 if( tb_unreliable(st->codec) && !st->avg_frame_rate.num
2322 && st->codec_info_nb_frames < fps_analyze_framecount
2323 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2325 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2327 if (st->first_dts == AV_NOPTS_VALUE &&
2328 (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2329 st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2332 if (i == ic->nb_streams) {
2333 /* NOTE: if the format has no header, then we need to read
2334 some packets to get most of the streams, so we cannot
2336 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2337 /* if we found the info for all the codecs, we can stop */
2339 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2343 /* we did not get all the codec info, but we read too much data */
2344 if (read_size >= ic->probesize) {
2346 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2350 /* NOTE: a new stream can be added there if no header in file
2351 (AVFMTCTX_NOHEADER) */
2352 ret = read_frame_internal(ic, &pkt1);
2353 if (ret == AVERROR(EAGAIN))
2358 AVPacket empty_pkt = { 0 };
2360 av_init_packet(&empty_pkt);
2362 ret = -1; /* we could not have all the codec parameters before EOF */
2363 for(i=0;i<ic->nb_streams;i++) {
2364 st = ic->streams[i];
2366 /* flush the decoders */
2367 if (st->info->found_decoder == 1) {
2369 err = try_decode_frame(st, &empty_pkt,
2370 (options && i < orig_nb_streams) ?
2371 &options[i] : NULL);
2372 } while (err > 0 && !has_codec_parameters(st));
2376 av_log(ic, AV_LOG_WARNING,
2377 "decoding for stream %d failed\n", st->index);
2378 } else if (!has_codec_parameters(st)) {
2380 avcodec_string(buf, sizeof(buf), st->codec, 0);
2381 av_log(ic, AV_LOG_WARNING,
2382 "Could not find codec parameters (%s)\n", buf);
2390 if (ic->flags & AVFMT_FLAG_NOBUFFER) {
2393 pkt = add_to_pktbuf(&ic->packet_buffer, &pkt1,
2394 &ic->packet_buffer_end);
2395 if ((ret = av_dup_packet(pkt)) < 0)
2396 goto find_stream_info_err;
2399 read_size += pkt->size;
2401 st = ic->streams[pkt->stream_index];
2402 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
2403 /* check for non-increasing dts */
2404 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
2405 st->info->fps_last_dts >= pkt->dts) {
2406 av_log(ic, AV_LOG_WARNING, "Non-increasing DTS in stream %d: "
2407 "packet %d with DTS %"PRId64", packet %d with DTS "
2408 "%"PRId64"\n", st->index, st->info->fps_last_dts_idx,
2409 st->info->fps_last_dts, st->codec_info_nb_frames, pkt->dts);
2410 st->info->fps_first_dts = st->info->fps_last_dts = AV_NOPTS_VALUE;
2412 /* check for a discontinuity in dts - if the difference in dts
2413 * is more than 1000 times the average packet duration in the sequence,
2414 * we treat it as a discontinuity */
2415 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
2416 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
2417 (pkt->dts - st->info->fps_last_dts) / 1000 >
2418 (st->info->fps_last_dts - st->info->fps_first_dts) / (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
2419 av_log(ic, AV_LOG_WARNING, "DTS discontinuity in stream %d: "
2420 "packet %d with DTS %"PRId64", packet %d with DTS "
2421 "%"PRId64"\n", st->index, st->info->fps_last_dts_idx,
2422 st->info->fps_last_dts, st->codec_info_nb_frames, pkt->dts);
2423 st->info->fps_first_dts = st->info->fps_last_dts = AV_NOPTS_VALUE;
2426 /* update stored dts values */
2427 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
2428 st->info->fps_first_dts = pkt->dts;
2429 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
2431 st->info->fps_last_dts = pkt->dts;
2432 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
2434 /* check max_analyze_duration */
2435 if (av_rescale_q(pkt->dts - st->info->fps_first_dts, st->time_base,
2436 AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
2437 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2441 #if FF_API_R_FRAME_RATE
2443 int64_t last = st->info->last_dts;
2445 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2446 int64_t duration= pkt->dts - last;
2447 double dur= duration * av_q2d(st->time_base);
2449 if (st->info->duration_count < 2)
2450 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2451 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2452 int framerate= get_std_framerate(i);
2453 int ticks= lrintf(dur*framerate/(1001*12));
2454 double error = dur - (double)ticks*1001*12 / framerate;
2455 st->info->duration_error[i] += error*error;
2457 st->info->duration_count++;
2458 // ignore the first 4 values, they might have some random jitter
2459 if (st->info->duration_count > 3)
2460 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2462 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2463 st->info->last_dts = pkt->dts;
2466 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2467 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2468 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
2469 st->codec->extradata_size= i;
2470 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2471 if (!st->codec->extradata)
2472 return AVERROR(ENOMEM);
2473 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2474 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2478 /* if still no information, we try to open the codec and to
2479 decompress the frame. We try to avoid that in most cases as
2480 it takes longer and uses more memory. For MPEG-4, we need to
2481 decompress for QuickTime.
2483 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2484 least one frame of codec data, this makes sure the codec initializes
2485 the channel configuration and does not only trust the values from the container.
2487 try_decode_frame(st, pkt, (options && i < orig_nb_streams ) ? &options[i] : NULL);
2489 st->codec_info_nb_frames++;
2493 // close codecs which were opened in try_decode_frame()
2494 for(i=0;i<ic->nb_streams;i++) {
2495 st = ic->streams[i];
2496 avcodec_close(st->codec);
2498 for(i=0;i<ic->nb_streams;i++) {
2499 st = ic->streams[i];
2500 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2501 /* estimate average framerate if not set by demuxer */
2502 if (!st->avg_frame_rate.num && st->info->fps_last_dts != st->info->fps_first_dts) {
2503 int64_t delta_dts = st->info->fps_last_dts - st->info->fps_first_dts;
2504 int delta_packets = st->info->fps_last_dts_idx - st->info->fps_first_dts_idx;
2506 double best_error = 0.01;
2508 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2509 delta_packets*(int64_t)st->time_base.den,
2510 delta_dts*(int64_t)st->time_base.num, 60000);
2512 /* round guessed framerate to a "standard" framerate if it's
2513 * within 1% of the original estimate*/
2514 for (j = 1; j < MAX_STD_TIMEBASES; j++) {
2515 AVRational std_fps = { get_std_framerate(j), 12*1001 };
2516 double error = fabs(av_q2d(st->avg_frame_rate) / av_q2d(std_fps) - 1);
2518 if (error < best_error) {
2520 best_fps = std_fps.num;
2524 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2525 best_fps, 12*1001, INT_MAX);
2528 #if FF_API_R_FRAME_RATE
2529 // the check for tb_unreliable() is not completely correct, since this is not about handling
2530 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2531 // ipmovie.c produces.
2532 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > 1 && !st->r_frame_rate.num)
2533 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);
2534 if (st->info->duration_count && !st->r_frame_rate.num
2535 && tb_unreliable(st->codec)) {
2537 double best_error= 2*av_q2d(st->time_base);
2538 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2540 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2541 double error = st->info->duration_error[j] * get_std_framerate(j);
2542 if(error < best_error){
2544 num = get_std_framerate(j);
2547 // do not increase frame rate by more than 1 % in order to match a standard rate.
2548 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2549 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2552 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2553 if(!st->codec->bits_per_coded_sample)
2554 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2555 // set stream disposition based on audio service type
2556 switch (st->codec->audio_service_type) {
2557 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2558 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2559 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2560 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2561 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2562 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2563 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2564 st->disposition = AV_DISPOSITION_COMMENT; break;
2565 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2566 st->disposition = AV_DISPOSITION_KARAOKE; break;
2571 estimate_timings(ic, old_offset);
2573 compute_chapters_end(ic);
2575 find_stream_info_err:
2576 for (i=0; i < ic->nb_streams; i++) {
2577 if (ic->streams[i]->codec)
2578 ic->streams[i]->codec->thread_count = 0;
2579 av_freep(&ic->streams[i]->info);
2584 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2588 for (i = 0; i < ic->nb_programs; i++)
2589 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2590 if (ic->programs[i]->stream_index[j] == s)
2591 return ic->programs[i];
2595 int av_find_best_stream(AVFormatContext *ic,
2596 enum AVMediaType type,
2597 int wanted_stream_nb,
2599 AVCodec **decoder_ret,
2602 int i, nb_streams = ic->nb_streams;
2603 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2604 unsigned *program = NULL;
2605 AVCodec *decoder = NULL, *best_decoder = NULL;
2607 if (related_stream >= 0 && wanted_stream_nb < 0) {
2608 AVProgram *p = find_program_from_stream(ic, related_stream);
2610 program = p->stream_index;
2611 nb_streams = p->nb_stream_indexes;
2614 for (i = 0; i < nb_streams; i++) {
2615 int real_stream_index = program ? program[i] : i;
2616 AVStream *st = ic->streams[real_stream_index];
2617 AVCodecContext *avctx = st->codec;
2618 if (avctx->codec_type != type)
2620 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2622 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2625 decoder = avcodec_find_decoder(st->codec->codec_id);
2628 ret = AVERROR_DECODER_NOT_FOUND;
2632 if (best_count >= st->codec_info_nb_frames)
2634 best_count = st->codec_info_nb_frames;
2635 ret = real_stream_index;
2636 best_decoder = decoder;
2637 if (program && i == nb_streams - 1 && ret < 0) {
2639 nb_streams = ic->nb_streams;
2640 i = 0; /* no related stream found, try again with everything */
2644 *decoder_ret = best_decoder;
2648 /*******************************************************/
2650 int av_read_play(AVFormatContext *s)
2652 if (s->iformat->read_play)
2653 return s->iformat->read_play(s);
2655 return avio_pause(s->pb, 0);
2656 return AVERROR(ENOSYS);
2659 int av_read_pause(AVFormatContext *s)
2661 if (s->iformat->read_pause)
2662 return s->iformat->read_pause(s);
2664 return avio_pause(s->pb, 1);
2665 return AVERROR(ENOSYS);
2668 void avformat_free_context(AVFormatContext *s)
2674 if (s->iformat && s->iformat->priv_class && s->priv_data)
2675 av_opt_free(s->priv_data);
2677 for(i=0;i<s->nb_streams;i++) {
2678 /* free all data in a stream component */
2681 av_parser_close(st->parser);
2683 if (st->attached_pic.data)
2684 av_free_packet(&st->attached_pic);
2685 av_dict_free(&st->metadata);
2686 av_free(st->index_entries);
2687 av_free(st->codec->extradata);
2688 av_free(st->codec->subtitle_header);
2690 av_free(st->priv_data);
2694 for(i=s->nb_programs-1; i>=0; i--) {
2695 av_dict_free(&s->programs[i]->metadata);
2696 av_freep(&s->programs[i]->stream_index);
2697 av_freep(&s->programs[i]);
2699 av_freep(&s->programs);
2700 av_freep(&s->priv_data);
2701 while(s->nb_chapters--) {
2702 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2703 av_free(s->chapters[s->nb_chapters]);
2705 av_freep(&s->chapters);
2706 av_dict_free(&s->metadata);
2707 av_freep(&s->streams);
2711 #if FF_API_CLOSE_INPUT_FILE
2712 void av_close_input_file(AVFormatContext *s)
2714 avformat_close_input(&s);
2718 void avformat_close_input(AVFormatContext **ps)
2720 AVFormatContext *s = *ps;
2721 AVIOContext *pb = s->pb;
2723 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
2724 (s->flags & AVFMT_FLAG_CUSTOM_IO))
2727 flush_packet_queue(s);
2730 if (s->iformat->read_close)
2731 s->iformat->read_close(s);
2734 avformat_free_context(s);
2741 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
2747 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2749 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2752 s->streams = streams;
2754 st = av_mallocz(sizeof(AVStream));
2757 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2762 st->codec = avcodec_alloc_context3(c);
2764 /* no default bitrate if decoding */
2765 st->codec->bit_rate = 0;
2767 st->index = s->nb_streams;
2768 st->start_time = AV_NOPTS_VALUE;
2769 st->duration = AV_NOPTS_VALUE;
2770 /* we set the current DTS to 0 so that formats without any timestamps
2771 but durations get some timestamps, formats with some unknown
2772 timestamps have their first few packets buffered and the
2773 timestamps corrected before they are returned to the user */
2775 st->first_dts = AV_NOPTS_VALUE;
2776 st->probe_packets = MAX_PROBE_PACKETS;
2778 /* default pts setting is MPEG-like */
2779 avpriv_set_pts_info(st, 33, 1, 90000);
2780 st->last_IP_pts = AV_NOPTS_VALUE;
2781 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2782 st->pts_buffer[i]= AV_NOPTS_VALUE;
2783 st->reference_dts = AV_NOPTS_VALUE;
2785 st->sample_aspect_ratio = (AVRational){0,1};
2787 #if FF_API_R_FRAME_RATE
2788 st->info->last_dts = AV_NOPTS_VALUE;
2790 st->info->fps_first_dts = AV_NOPTS_VALUE;
2791 st->info->fps_last_dts = AV_NOPTS_VALUE;
2793 s->streams[s->nb_streams++] = st;
2797 AVProgram *av_new_program(AVFormatContext *ac, int id)
2799 AVProgram *program=NULL;
2802 av_dlog(ac, "new_program: id=0x%04x\n", id);
2804 for(i=0; i<ac->nb_programs; i++)
2805 if(ac->programs[i]->id == id)
2806 program = ac->programs[i];
2809 program = av_mallocz(sizeof(AVProgram));
2812 dynarray_add(&ac->programs, &ac->nb_programs, program);
2813 program->discard = AVDISCARD_NONE;
2820 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2822 AVChapter *chapter = NULL;
2825 for(i=0; i<s->nb_chapters; i++)
2826 if(s->chapters[i]->id == id)
2827 chapter = s->chapters[i];
2830 chapter= av_mallocz(sizeof(AVChapter));
2833 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2835 av_dict_set(&chapter->metadata, "title", title, 0);
2837 chapter->time_base= time_base;
2838 chapter->start = start;
2844 /************************************************************/
2845 /* output media file */
2847 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2849 const AVCodecTag *avctag;
2851 enum AVCodecID id = AV_CODEC_ID_NONE;
2852 unsigned int tag = 0;
2855 * Check that tag + id is in the table
2856 * If neither is in the table -> OK
2857 * If tag is in the table with another id -> FAIL
2858 * If id is in the table with another tag -> FAIL unless strict < normal
2860 for (n = 0; s->oformat->codec_tag[n]; n++) {
2861 avctag = s->oformat->codec_tag[n];
2862 while (avctag->id != AV_CODEC_ID_NONE) {
2863 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
2865 if (id == st->codec->codec_id)
2868 if (avctag->id == st->codec->codec_id)
2873 if (id != AV_CODEC_ID_NONE)
2875 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2880 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2884 AVDictionary *tmp = NULL;
2887 av_dict_copy(&tmp, *options, 0);
2888 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2891 // some sanity checks
2892 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2893 av_log(s, AV_LOG_ERROR, "no streams\n");
2894 ret = AVERROR(EINVAL);
2898 for(i=0;i<s->nb_streams;i++) {
2901 switch (st->codec->codec_type) {
2902 case AVMEDIA_TYPE_AUDIO:
2903 if(st->codec->sample_rate<=0){
2904 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2905 ret = AVERROR(EINVAL);
2908 if(!st->codec->block_align)
2909 st->codec->block_align = st->codec->channels *
2910 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2912 case AVMEDIA_TYPE_VIDEO:
2913 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2914 av_log(s, AV_LOG_ERROR, "time base not set\n");
2915 ret = AVERROR(EINVAL);
2918 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2919 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2920 ret = AVERROR(EINVAL);
2923 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2924 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between muxer "
2925 "(%d/%d) and encoder layer (%d/%d)\n",
2926 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
2927 st->codec->sample_aspect_ratio.num,
2928 st->codec->sample_aspect_ratio.den);
2929 ret = AVERROR(EINVAL);
2935 if(s->oformat->codec_tag){
2936 if(st->codec->codec_tag && st->codec->codec_id == AV_CODEC_ID_RAWVIDEO && av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id) == 0 && !validate_codec_tag(s, st)){
2937 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2938 st->codec->codec_tag= 0;
2940 if(st->codec->codec_tag){
2941 if (!validate_codec_tag(s, st)) {
2943 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2944 av_log(s, AV_LOG_ERROR,
2945 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
2946 tagbuf, st->codec->codec_tag, st->codec->codec_id);
2947 ret = AVERROR_INVALIDDATA;
2951 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2954 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2955 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2956 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2959 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2960 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2961 if (!s->priv_data) {
2962 ret = AVERROR(ENOMEM);
2965 if (s->oformat->priv_class) {
2966 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2967 av_opt_set_defaults(s->priv_data);
2968 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2973 /* set muxer identification string */
2974 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2975 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
2978 if(s->oformat->write_header){
2979 ret = s->oformat->write_header(s);
2984 /* init PTS generation */
2985 for(i=0;i<s->nb_streams;i++) {
2986 int64_t den = AV_NOPTS_VALUE;
2989 switch (st->codec->codec_type) {
2990 case AVMEDIA_TYPE_AUDIO:
2991 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2993 case AVMEDIA_TYPE_VIDEO:
2994 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2999 if (den != AV_NOPTS_VALUE) {
3001 ret = AVERROR_INVALIDDATA;
3004 frac_init(&st->pts, 0, 0, den);
3009 av_dict_free(options);
3018 //FIXME merge with compute_pkt_fields
3019 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3020 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3021 int num, den, frame_size, i;
3023 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3024 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3026 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
3027 return AVERROR(EINVAL);*/
3029 /* duration field */
3030 if (pkt->duration == 0) {
3031 compute_frame_duration(&num, &den, st, NULL, pkt);
3033 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3037 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3040 //XXX/FIXME this is a temporary hack until all encoders output pts
3041 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3043 // pkt->pts= st->cur_dts;
3044 pkt->pts= st->pts.val;
3047 //calculate dts from pts
3048 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3049 st->pts_buffer[0]= pkt->pts;
3050 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3051 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3052 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3053 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3055 pkt->dts= st->pts_buffer[0];
3058 if (st->cur_dts && st->cur_dts != AV_NOPTS_VALUE &&
3059 ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) &&
3060 st->cur_dts >= pkt->dts) || st->cur_dts > pkt->dts)) {
3061 av_log(s, AV_LOG_ERROR,
3062 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3063 st->index, st->cur_dts, pkt->dts);
3064 return AVERROR(EINVAL);
3066 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3067 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3068 return AVERROR(EINVAL);
3071 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3072 st->cur_dts= pkt->dts;
3073 st->pts.val= pkt->dts;
3076 switch (st->codec->codec_type) {
3077 case AVMEDIA_TYPE_AUDIO:
3078 frame_size = get_audio_frame_size(st->codec, pkt->size, 1);
3080 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3081 likely equal to the encoder delay, but it would be better if we
3082 had the real timestamps from the encoder */
3083 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3084 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3087 case AVMEDIA_TYPE_VIDEO:
3088 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3096 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3101 if (s->oformat->flags & AVFMT_ALLOW_FLUSH)
3102 return s->oformat->write_packet(s, pkt);
3106 ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3108 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3111 ret= s->oformat->write_packet(s, pkt);
3114 s->streams[pkt->stream_index]->nb_frames++;
3118 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3119 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3121 AVPacketList **next_point, *this_pktl;
3123 this_pktl = av_mallocz(sizeof(AVPacketList));
3124 this_pktl->pkt= *pkt;
3125 pkt->destruct= NULL; // do not free original but only the copy
3126 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3128 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3129 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3131 next_point = &s->packet_buffer;
3134 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3135 while(!compare(s, &(*next_point)->pkt, pkt)){
3136 next_point= &(*next_point)->next;
3140 next_point = &(s->packet_buffer_end->next);
3143 assert(!*next_point);
3145 s->packet_buffer_end= this_pktl;
3148 this_pktl->next= *next_point;
3150 s->streams[pkt->stream_index]->last_in_packet_buffer=
3151 *next_point= this_pktl;
3154 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3156 AVStream *st = s->streams[ pkt ->stream_index];
3157 AVStream *st2= s->streams[ next->stream_index];
3158 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3162 return pkt->stream_index < next->stream_index;
3166 int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
3167 AVPacket *pkt, int flush)
3174 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3177 for(i=0; i < s->nb_streams; i++)
3178 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3180 if(stream_count && (s->nb_streams == stream_count || flush)){
3181 pktl= s->packet_buffer;
3184 s->packet_buffer= pktl->next;
3185 if(!s->packet_buffer)
3186 s->packet_buffer_end= NULL;
3188 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3189 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3193 av_init_packet(out);
3198 #if FF_API_INTERLEAVE_PACKET
3199 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
3200 AVPacket *pkt, int flush)
3202 return ff_interleave_packet_per_dts(s, out, pkt, flush);
3207 * Interleave an AVPacket correctly so it can be muxed.
3208 * @param out the interleaved packet will be output here
3209 * @param in the input packet
3210 * @param flush 1 if no further packets are available as input and all
3211 * remaining packets should be output
3212 * @return 1 if a packet was output, 0 if no packet could be output,
3213 * < 0 if an error occurred
3215 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3216 if (s->oformat->interleave_packet) {
3217 int ret = s->oformat->interleave_packet(s, out, in, flush);
3222 return ff_interleave_packet_per_dts(s, out, in, flush);
3225 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3229 AVStream *st= s->streams[ pkt->stream_index];
3231 //FIXME/XXX/HACK drop zero sized packets
3232 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3235 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3236 pkt->size, pkt->dts, pkt->pts);
3237 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3240 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3241 return AVERROR(EINVAL);
3243 av_dlog(s, "av_interleaved_write_frame FLUSH\n");
3249 int ret= interleave_packet(s, &opkt, pkt, flush);
3250 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3253 ret= s->oformat->write_packet(s, &opkt);
3255 s->streams[opkt.stream_index]->nb_frames++;
3257 av_free_packet(&opkt);
3265 int av_write_trailer(AVFormatContext *s)
3271 ret = interleave_packet(s, &pkt, NULL, 1);
3272 if (ret < 0) //FIXME cleanup needed for ret<0 ?
3277 ret = s->oformat->write_packet(s, &pkt);
3279 s->streams[pkt.stream_index]->nb_frames++;
3281 av_free_packet(&pkt);
3287 if (s->oformat->write_trailer)
3288 ret = s->oformat->write_trailer(s);
3290 if (!(s->oformat->flags & AVFMT_NOFILE))
3294 for (i = 0; i < s->nb_streams; i++) {
3295 av_freep(&s->streams[i]->priv_data);
3296 av_freep(&s->streams[i]->index_entries);
3298 if (s->oformat->priv_class)
3299 av_opt_free(s->priv_data);
3300 av_freep(&s->priv_data);
3304 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3307 AVProgram *program=NULL;
3310 if (idx >= ac->nb_streams) {
3311 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3315 for(i=0; i<ac->nb_programs; i++){
3316 if(ac->programs[i]->id != progid)
3318 program = ac->programs[i];
3319 for(j=0; j<program->nb_stream_indexes; j++)
3320 if(program->stream_index[j] == idx)
3323 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3326 program->stream_index = tmp;
3327 program->stream_index[program->nb_stream_indexes++] = idx;
3332 static void print_fps(double d, const char *postfix){
3333 uint64_t v= lrintf(d*100);
3334 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3335 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3336 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3339 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3341 if(m && !(av_dict_count(m) == 1 && av_dict_get(m, "language", NULL, 0))){
3342 AVDictionaryEntry *tag=NULL;
3344 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3345 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3346 if(strcmp("language", tag->key))
3347 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
3352 /* "user interface" functions */
3353 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3356 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3357 AVStream *st = ic->streams[i];
3358 int g = av_gcd(st->time_base.num, st->time_base.den);
3359 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3360 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3361 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3362 /* the pid is an important information, so we display it */
3363 /* XXX: add a generic system */
3364 if (flags & AVFMT_SHOW_IDS)
3365 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3367 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3368 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3369 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3370 if (st->sample_aspect_ratio.num && // default
3371 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3372 AVRational display_aspect_ratio;
3373 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3374 st->codec->width*st->sample_aspect_ratio.num,
3375 st->codec->height*st->sample_aspect_ratio.den,
3377 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3378 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3379 display_aspect_ratio.num, display_aspect_ratio.den);
3381 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3382 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3383 print_fps(av_q2d(st->avg_frame_rate), "fps");
3384 #if FF_API_R_FRAME_RATE
3385 if(st->r_frame_rate.den && st->r_frame_rate.num)
3386 print_fps(av_q2d(st->r_frame_rate), "tbr");
3388 if(st->time_base.den && st->time_base.num)
3389 print_fps(1/av_q2d(st->time_base), "tbn");
3390 if(st->codec->time_base.den && st->codec->time_base.num)
3391 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3393 if (st->disposition & AV_DISPOSITION_DEFAULT)
3394 av_log(NULL, AV_LOG_INFO, " (default)");
3395 if (st->disposition & AV_DISPOSITION_DUB)
3396 av_log(NULL, AV_LOG_INFO, " (dub)");
3397 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3398 av_log(NULL, AV_LOG_INFO, " (original)");
3399 if (st->disposition & AV_DISPOSITION_COMMENT)
3400 av_log(NULL, AV_LOG_INFO, " (comment)");
3401 if (st->disposition & AV_DISPOSITION_LYRICS)
3402 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3403 if (st->disposition & AV_DISPOSITION_KARAOKE)
3404 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3405 if (st->disposition & AV_DISPOSITION_FORCED)
3406 av_log(NULL, AV_LOG_INFO, " (forced)");
3407 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3408 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3409 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3410 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3411 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3412 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3413 av_log(NULL, AV_LOG_INFO, "\n");
3414 dump_metadata(NULL, st->metadata, " ");
3417 void av_dump_format(AVFormatContext *ic,
3423 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3424 if (ic->nb_streams && !printed)
3427 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3428 is_output ? "Output" : "Input",
3430 is_output ? ic->oformat->name : ic->iformat->name,
3431 is_output ? "to" : "from", url);
3432 dump_metadata(NULL, ic->metadata, " ");
3434 av_log(NULL, AV_LOG_INFO, " Duration: ");
3435 if (ic->duration != AV_NOPTS_VALUE) {
3436 int hours, mins, secs, us;
3437 secs = ic->duration / AV_TIME_BASE;
3438 us = ic->duration % AV_TIME_BASE;
3443 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3444 (100 * us) / AV_TIME_BASE);
3446 av_log(NULL, AV_LOG_INFO, "N/A");
3448 if (ic->start_time != AV_NOPTS_VALUE) {
3450 av_log(NULL, AV_LOG_INFO, ", start: ");
3451 secs = ic->start_time / AV_TIME_BASE;
3452 us = abs(ic->start_time % AV_TIME_BASE);
3453 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3454 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3456 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3458 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3460 av_log(NULL, AV_LOG_INFO, "N/A");
3462 av_log(NULL, AV_LOG_INFO, "\n");
3464 for (i = 0; i < ic->nb_chapters; i++) {
3465 AVChapter *ch = ic->chapters[i];
3466 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3467 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3468 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3470 dump_metadata(NULL, ch->metadata, " ");
3472 if(ic->nb_programs) {
3473 int j, k, total = 0;
3474 for(j=0; j<ic->nb_programs; j++) {
3475 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3477 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3478 name ? name->value : "");
3479 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3480 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3481 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3482 printed[ic->programs[j]->stream_index[k]] = 1;
3484 total += ic->programs[j]->nb_stream_indexes;
3486 if (total < ic->nb_streams)
3487 av_log(NULL, AV_LOG_INFO, " No Program\n");
3489 for(i=0;i<ic->nb_streams;i++)
3491 dump_stream_format(ic, i, index, is_output);
3496 #if FF_API_AV_GETTIME && CONFIG_SHARED && HAVE_SYMVER
3497 FF_SYMVER(int64_t, av_gettime, (void), "LIBAVFORMAT_54")
3499 return av_gettime();
3503 uint64_t ff_ntp_time(void)
3505 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3508 int av_get_frame_filename(char *buf, int buf_size,
3509 const char *path, int number)
3512 char *q, buf1[20], c;
3513 int nd, len, percentd_found;
3525 while (isdigit(*p)) {
3526 nd = nd * 10 + *p++ - '0';
3529 } while (isdigit(c));
3538 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3540 if ((q - buf + len) > buf_size - 1)
3542 memcpy(q, buf1, len);
3550 if ((q - buf) < buf_size - 1)
3554 if (!percentd_found)
3563 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3567 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3569 for(i=0;i<size;i+=16) {
3576 PRINT(" %02x", buf[i+j]);
3581 for(j=0;j<len;j++) {
3583 if (c < ' ' || c > '~')
3592 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3594 hex_dump_internal(NULL, f, 0, buf, size);
3597 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3599 hex_dump_internal(avcl, NULL, level, buf, size);
3602 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3605 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3606 PRINT("stream #%d:\n", pkt->stream_index);
3607 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3608 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3609 /* DTS is _always_ valid after av_read_frame() */
3611 if (pkt->dts == AV_NOPTS_VALUE)
3614 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3615 /* PTS may not be known if B-frames are present. */
3617 if (pkt->pts == AV_NOPTS_VALUE)
3620 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3622 PRINT(" size=%d\n", pkt->size);
3625 av_hex_dump(f, pkt->data, pkt->size);
3628 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3630 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3633 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3636 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3639 void av_url_split(char *proto, int proto_size,
3640 char *authorization, int authorization_size,
3641 char *hostname, int hostname_size,
3643 char *path, int path_size,
3646 const char *p, *ls, *at, *col, *brk;
3648 if (port_ptr) *port_ptr = -1;
3649 if (proto_size > 0) proto[0] = 0;
3650 if (authorization_size > 0) authorization[0] = 0;
3651 if (hostname_size > 0) hostname[0] = 0;
3652 if (path_size > 0) path[0] = 0;
3654 /* parse protocol */
3655 if ((p = strchr(url, ':'))) {
3656 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3661 /* no protocol means plain filename */
3662 av_strlcpy(path, url, path_size);
3666 /* separate path from hostname */
3667 ls = strchr(p, '/');
3669 ls = strchr(p, '?');
3671 av_strlcpy(path, ls, path_size);
3673 ls = &p[strlen(p)]; // XXX
3675 /* the rest is hostname, use that to parse auth/port */
3677 /* authorization (user[:pass]@hostname) */
3678 if ((at = strchr(p, '@')) && at < ls) {
3679 av_strlcpy(authorization, p,
3680 FFMIN(authorization_size, at + 1 - p));
3681 p = at + 1; /* skip '@' */
3684 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3686 av_strlcpy(hostname, p + 1,
3687 FFMIN(hostname_size, brk - p));
3688 if (brk[1] == ':' && port_ptr)
3689 *port_ptr = atoi(brk + 2);
3690 } else if ((col = strchr(p, ':')) && col < ls) {
3691 av_strlcpy(hostname, p,
3692 FFMIN(col + 1 - p, hostname_size));
3693 if (port_ptr) *port_ptr = atoi(col + 1);
3695 av_strlcpy(hostname, p,
3696 FFMIN(ls + 1 - p, hostname_size));
3700 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3703 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3706 'C', 'D', 'E', 'F' };
3707 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3710 'c', 'd', 'e', 'f' };
3711 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3713 for(i = 0; i < s; i++) {
3714 buff[i * 2] = hex_table[src[i] >> 4];
3715 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3721 int ff_hex_to_data(uint8_t *data, const char *p)
3728 p += strspn(p, SPACE_CHARS);
3731 c = toupper((unsigned char) *p++);
3732 if (c >= '0' && c <= '9')
3734 else if (c >= 'A' && c <= 'F')
3749 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
3750 unsigned int pts_num, unsigned int pts_den)
3753 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3754 if(new_tb.num != pts_num)
3755 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3757 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3759 if(new_tb.num <= 0 || new_tb.den <= 0) {
3760 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3763 s->time_base = new_tb;
3764 s->pts_wrap_bits = pts_wrap_bits;
3767 int ff_url_join(char *str, int size, const char *proto,
3768 const char *authorization, const char *hostname,
3769 int port, const char *fmt, ...)
3772 struct addrinfo hints = { 0 }, *ai;
3777 av_strlcatf(str, size, "%s://", proto);
3778 if (authorization && authorization[0])
3779 av_strlcatf(str, size, "%s@", authorization);
3780 #if CONFIG_NETWORK && defined(AF_INET6)
3781 /* Determine if hostname is a numerical IPv6 address,
3782 * properly escape it within [] in that case. */
3783 hints.ai_flags = AI_NUMERICHOST;
3784 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3785 if (ai->ai_family == AF_INET6) {
3786 av_strlcat(str, "[", size);
3787 av_strlcat(str, hostname, size);
3788 av_strlcat(str, "]", size);
3790 av_strlcat(str, hostname, size);
3795 /* Not an IPv6 address, just output the plain string. */
3796 av_strlcat(str, hostname, size);
3799 av_strlcatf(str, size, ":%d", port);
3802 int len = strlen(str);
3805 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3811 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3812 AVFormatContext *src)
3817 local_pkt.stream_index = dst_stream;
3818 if (pkt->pts != AV_NOPTS_VALUE)
3819 local_pkt.pts = av_rescale_q(pkt->pts,
3820 src->streams[pkt->stream_index]->time_base,
3821 dst->streams[dst_stream]->time_base);
3822 if (pkt->dts != AV_NOPTS_VALUE)
3823 local_pkt.dts = av_rescale_q(pkt->dts,
3824 src->streams[pkt->stream_index]->time_base,
3825 dst->streams[dst_stream]->time_base);
3826 return av_write_frame(dst, &local_pkt);
3829 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3832 const char *ptr = str;
3834 /* Parse key=value pairs. */
3837 char *dest = NULL, *dest_end;
3838 int key_len, dest_len = 0;
3840 /* Skip whitespace and potential commas. */
3841 while (*ptr && (isspace(*ptr) || *ptr == ','))
3848 if (!(ptr = strchr(key, '=')))
3851 key_len = ptr - key;
3853 callback_get_buf(context, key, key_len, &dest, &dest_len);
3854 dest_end = dest + dest_len - 1;
3858 while (*ptr && *ptr != '\"') {
3862 if (dest && dest < dest_end)
3866 if (dest && dest < dest_end)
3874 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3875 if (dest && dest < dest_end)
3883 int ff_find_stream_index(AVFormatContext *s, int id)
3886 for (i = 0; i < s->nb_streams; i++) {
3887 if (s->streams[i]->id == id)
3893 void ff_make_absolute_url(char *buf, int size, const char *base,
3897 /* Absolute path, relative to the current server */
3898 if (base && strstr(base, "://") && rel[0] == '/') {
3900 av_strlcpy(buf, base, size);
3901 sep = strstr(buf, "://");
3904 sep = strchr(sep, '/');
3908 av_strlcat(buf, rel, size);
3911 /* If rel actually is an absolute url, just copy it */
3912 if (!base || strstr(rel, "://") || rel[0] == '/') {
3913 av_strlcpy(buf, rel, size);
3917 av_strlcpy(buf, base, size);
3918 /* Remove the file name from the base url */
3919 sep = strrchr(buf, '/');
3924 while (av_strstart(rel, "../", NULL) && sep) {
3925 /* Remove the path delimiter at the end */
3927 sep = strrchr(buf, '/');
3928 /* If the next directory name to pop off is "..", break here */
3929 if (!strcmp(sep ? &sep[1] : buf, "..")) {
3930 /* Readd the slash we just removed */
3931 av_strlcat(buf, "/", size);
3934 /* Cut off the directory name */
3941 av_strlcat(buf, rel, size);
3944 int64_t ff_iso8601_to_unix_time(const char *datestr)
3947 struct tm time1 = {0}, time2 = {0};
3949 ret1 = strptime(datestr, "%Y - %m - %d %T", &time1);
3950 ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2);
3952 return av_timegm(&time2);
3954 return av_timegm(&time1);
3956 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
3957 "the date string.\n");
3962 int avformat_query_codec(AVOutputFormat *ofmt, enum AVCodecID codec_id, int std_compliance)
3965 if (ofmt->query_codec)
3966 return ofmt->query_codec(codec_id, std_compliance);
3967 else if (ofmt->codec_tag)
3968 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
3969 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
3970 codec_id == ofmt->subtitle_codec)
3973 return AVERROR_PATCHWELCOME;
3976 int avformat_network_init(void)
3980 ff_network_inited_globally = 1;
3981 if ((ret = ff_network_init()) < 0)
3988 int avformat_network_deinit(void)
3997 int ff_add_param_change(AVPacket *pkt, int32_t channels,
3998 uint64_t channel_layout, int32_t sample_rate,
3999 int32_t width, int32_t height)
4005 return AVERROR(EINVAL);
4008 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4010 if (channel_layout) {
4012 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4016 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4018 if (width || height) {
4020 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4022 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4024 return AVERROR(ENOMEM);
4025 bytestream_put_le32(&data, flags);
4027 bytestream_put_le32(&data, channels);
4029 bytestream_put_le64(&data, channel_layout);
4031 bytestream_put_le32(&data, sample_rate);
4032 if (width || height) {
4033 bytestream_put_le32(&data, width);
4034 bytestream_put_le32(&data, height);
4039 const struct AVCodecTag *avformat_get_riff_video_tags(void)
4041 return ff_codec_bmp_tags;
4043 const struct AVCodecTag *avformat_get_riff_audio_tags(void)
4045 return ff_codec_wav_tags;