2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "avio_internal.h"
27 #include "libavcodec/internal.h"
28 #include "libavcodec/raw.h"
29 #include "libavcodec/bytestream.h"
30 #include "libavutil/avassert.h"
31 #include "libavutil/opt.h"
32 #include "libavutil/dict.h"
33 #include "libavutil/pixdesc.h"
36 #include "libavutil/avassert.h"
37 #include "libavutil/avstring.h"
38 #include "libavutil/mathematics.h"
39 #include "libavutil/parseutils.h"
40 #include "libavutil/time.h"
41 #include "libavutil/timestamp.h"
43 #include "audiointerleave.h"
55 * various utility functions for use within FFmpeg
58 unsigned avformat_version(void)
60 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
61 return LIBAVFORMAT_VERSION_INT;
64 const char *avformat_configuration(void)
66 return FFMPEG_CONFIGURATION;
69 const char *avformat_license(void)
71 #define LICENSE_PREFIX "libavformat license: "
72 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
75 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
77 static int is_relative(int64_t ts) {
78 return ts > (RELATIVE_TS_BASE - (1LL<<48));
81 /* fraction handling */
84 * f = val + (num / den) + 0.5.
86 * 'num' is normalized so that it is such as 0 <= num < den.
88 * @param f fractional number
89 * @param val integer value
90 * @param num must be >= 0
91 * @param den must be >= 1
93 static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
106 * Fractional addition to f: f = f + (incr / f->den).
108 * @param f fractional number
109 * @param incr increment, can be positive or negative
111 static void frac_add(AVFrac *f, int64_t incr)
124 } else if (num >= den) {
131 /** head of registered input format linked list */
132 static AVInputFormat *first_iformat = NULL;
133 /** head of registered output format linked list */
134 static AVOutputFormat *first_oformat = NULL;
136 AVInputFormat *av_iformat_next(AVInputFormat *f)
138 if(f) return f->next;
139 else return first_iformat;
142 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
144 if(f) return f->next;
145 else return first_oformat;
148 void av_register_input_format(AVInputFormat *format)
152 while (*p != NULL) p = &(*p)->next;
157 void av_register_output_format(AVOutputFormat *format)
161 while (*p != NULL) p = &(*p)->next;
166 int av_match_ext(const char *filename, const char *extensions)
174 ext = strrchr(filename, '.');
180 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
183 if (!av_strcasecmp(ext1, ext))
193 static int match_format(const char *name, const char *names)
201 namelen = strlen(name);
202 while ((p = strchr(names, ','))) {
203 len = FFMAX(p - names, namelen);
204 if (!av_strncasecmp(name, names, len))
208 return !av_strcasecmp(name, names);
211 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
212 const char *mime_type)
214 AVOutputFormat *fmt = NULL, *fmt_found;
215 int score_max, score;
217 /* specific test for image sequences */
218 #if CONFIG_IMAGE2_MUXER
219 if (!short_name && filename &&
220 av_filename_number_test(filename) &&
221 ff_guess_image2_codec(filename) != AV_CODEC_ID_NONE) {
222 return av_guess_format("image2", NULL, NULL);
225 /* Find the proper file type. */
228 while ((fmt = av_oformat_next(fmt))) {
230 if (fmt->name && short_name && match_format(short_name, fmt->name))
232 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
234 if (filename && fmt->extensions &&
235 av_match_ext(filename, fmt->extensions)) {
238 if (score > score_max) {
246 enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
247 const char *filename, const char *mime_type, enum AVMediaType type){
248 if(type == AVMEDIA_TYPE_VIDEO){
249 enum AVCodecID codec_id= AV_CODEC_ID_NONE;
251 #if CONFIG_IMAGE2_MUXER
252 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
253 codec_id= ff_guess_image2_codec(filename);
256 if(codec_id == AV_CODEC_ID_NONE)
257 codec_id= fmt->video_codec;
259 }else if(type == AVMEDIA_TYPE_AUDIO)
260 return fmt->audio_codec;
261 else if (type == AVMEDIA_TYPE_SUBTITLE)
262 return fmt->subtitle_codec;
264 return AV_CODEC_ID_NONE;
267 AVInputFormat *av_find_input_format(const char *short_name)
269 AVInputFormat *fmt = NULL;
270 while ((fmt = av_iformat_next(fmt))) {
271 if (match_format(short_name, fmt->name))
277 int ffio_limit(AVIOContext *s, int size)
280 int64_t remaining= s->maxsize - avio_tell(s);
281 if(remaining < size){
282 int64_t newsize= avio_size(s);
283 if(!s->maxsize || s->maxsize<newsize)
284 s->maxsize= newsize - !newsize;
285 remaining= s->maxsize - avio_tell(s);
286 remaining= FFMAX(remaining, 0);
289 if(s->maxsize>=0 && remaining+1 < size){
290 av_log(0, AV_LOG_ERROR, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
297 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
300 int orig_size = size;
301 size= ffio_limit(s, size);
303 ret= av_new_packet(pkt, size);
308 pkt->pos= avio_tell(s);
310 ret= avio_read(s, pkt->data, size);
314 av_shrink_packet(pkt, ret);
315 if (pkt->size < orig_size)
316 pkt->flags |= AV_PKT_FLAG_CORRUPT;
321 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
326 return av_get_packet(s, pkt, size);
327 old_size = pkt->size;
328 ret = av_grow_packet(pkt, size);
331 ret = avio_read(s, pkt->data + old_size, size);
332 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
337 int av_filename_number_test(const char *filename)
340 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
343 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
345 AVProbeData lpd = *pd;
346 AVInputFormat *fmt1 = NULL, *fmt;
347 int score, nodat = 0, score_max=0;
349 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
350 int id3len = ff_id3v2_tag_len(lpd.buf);
351 if (lpd.buf_size > id3len + 16) {
353 lpd.buf_size -= id3len;
359 while ((fmt1 = av_iformat_next(fmt1))) {
360 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
363 if (fmt1->read_probe) {
364 score = fmt1->read_probe(&lpd);
365 if(fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
366 score = FFMAX(score, nodat ? AVPROBE_SCORE_MAX/4-1 : 1);
367 } else if (fmt1->extensions) {
368 if (av_match_ext(lpd.filename, fmt1->extensions)) {
372 if (score > score_max) {
375 }else if (score == score_max)
378 *score_ret= score_max;
383 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
386 AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
387 if(score_ret > *score_max){
388 *score_max= score_ret;
394 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
396 return av_probe_input_format2(pd, is_opened, &score);
399 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
401 static const struct {
402 const char *name; enum AVCodecID id; enum AVMediaType type;
404 { "aac" , AV_CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
405 { "ac3" , AV_CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
406 { "dts" , AV_CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
407 { "eac3" , AV_CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
408 { "h264" , AV_CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
409 { "loas" , AV_CODEC_ID_AAC_LATM , AVMEDIA_TYPE_AUDIO },
410 { "m4v" , AV_CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
411 { "mp3" , AV_CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
412 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
416 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
420 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
421 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
422 for (i = 0; fmt_id_type[i].name; i++) {
423 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
424 st->codec->codec_id = fmt_id_type[i].id;
425 st->codec->codec_type = fmt_id_type[i].type;
433 /************************************************************/
434 /* input media file */
436 int av_demuxer_open(AVFormatContext *ic){
439 if (ic->iformat->read_header) {
440 err = ic->iformat->read_header(ic);
445 if (ic->pb && !ic->data_offset)
446 ic->data_offset = avio_tell(ic->pb);
452 /** size of probe buffer, for guessing file type from file contents */
453 #define PROBE_BUF_MIN 2048
454 #define PROBE_BUF_MAX (1<<20)
456 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
457 const char *filename, void *logctx,
458 unsigned int offset, unsigned int max_probe_size)
460 AVProbeData pd = { filename ? filename : "", NULL, -offset };
461 unsigned char *buf = NULL;
462 int ret = 0, probe_size;
464 if (!max_probe_size) {
465 max_probe_size = PROBE_BUF_MAX;
466 } else if (max_probe_size > PROBE_BUF_MAX) {
467 max_probe_size = PROBE_BUF_MAX;
468 } else if (max_probe_size < PROBE_BUF_MIN) {
469 return AVERROR(EINVAL);
472 if (offset >= max_probe_size) {
473 return AVERROR(EINVAL);
476 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
477 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
478 int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
479 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
482 if (probe_size < offset) {
486 /* read probe data */
487 buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
490 return AVERROR(ENOMEM);
493 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
494 /* fail if error was not end of file, otherwise, lower score */
495 if (ret != AVERROR_EOF) {
500 ret = 0; /* error was end of file, nothing read */
503 pd.buf = &buf[offset];
505 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
507 /* guess file format */
508 *fmt = av_probe_input_format2(&pd, 1, &score);
510 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
511 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
513 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
519 return AVERROR_INVALIDDATA;
522 /* rewind. reuse probe buffer to avoid seeking */
523 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
529 /* open input file and probe the format if necessary */
530 static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)
533 AVProbeData pd = {filename, NULL, 0};
536 s->flags |= AVFMT_FLAG_CUSTOM_IO;
538 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
539 else if (s->iformat->flags & AVFMT_NOFILE)
540 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
541 "will be ignored with AVFMT_NOFILE format.\n");
545 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
546 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
549 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ | s->avio_flags,
550 &s->interrupt_callback, options)) < 0)
554 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
557 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
558 AVPacketList **plast_pktl){
559 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
564 (*plast_pktl)->next = pktl;
566 *packet_buffer = pktl;
568 /* add the packet in the buffered packet list */
574 void avformat_queue_attached_pictures(AVFormatContext *s)
577 for (i = 0; i < s->nb_streams; i++)
578 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
579 s->streams[i]->discard < AVDISCARD_ALL) {
580 AVPacket copy = s->streams[i]->attached_pic;
581 copy.destruct = NULL;
582 add_to_pktbuf(&s->raw_packet_buffer, ©, &s->raw_packet_buffer_end);
586 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
588 AVFormatContext *s = *ps;
590 AVDictionary *tmp = NULL;
591 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
593 if (!s && !(s = avformat_alloc_context()))
594 return AVERROR(ENOMEM);
596 av_log(0, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
597 return AVERROR(EINVAL);
603 av_dict_copy(&tmp, *options, 0);
605 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
608 if ((ret = init_input(s, filename, &tmp)) < 0)
611 /* check filename in case an image number is expected */
612 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
613 if (!av_filename_number_test(filename)) {
614 ret = AVERROR(EINVAL);
619 s->duration = s->start_time = AV_NOPTS_VALUE;
620 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
622 /* allocate private data */
623 if (s->iformat->priv_data_size > 0) {
624 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
625 ret = AVERROR(ENOMEM);
628 if (s->iformat->priv_class) {
629 *(const AVClass**)s->priv_data = s->iformat->priv_class;
630 av_opt_set_defaults(s->priv_data);
631 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
636 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
638 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
640 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
641 if ((ret = s->iformat->read_header(s)) < 0)
644 if (id3v2_extra_meta &&
645 (ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
647 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
649 avformat_queue_attached_pictures(s);
651 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
652 s->data_offset = avio_tell(s->pb);
654 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
657 av_dict_free(options);
664 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
666 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
668 avformat_free_context(s);
673 /*******************************************************/
675 static void probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
677 if(st->request_probe>0){
678 AVProbeData *pd = &st->probe_data;
680 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
684 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
688 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
689 pd->buf_size += pkt->size;
690 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
693 st->probe_packets = 0;
696 end= s->raw_packet_buffer_remaining_size <= 0
697 || st->probe_packets<=0;
699 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
700 int score= set_codec_from_probe_data(s, st, pd);
701 if( (st->codec->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
705 st->request_probe= -1;
706 if(st->codec->codec_id != AV_CODEC_ID_NONE){
707 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
709 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
715 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
721 AVPacketList *pktl = s->raw_packet_buffer;
725 st = s->streams[pkt->stream_index];
726 if(st->request_probe <= 0){
727 s->raw_packet_buffer = pktl->next;
728 s->raw_packet_buffer_remaining_size += pkt->size;
735 ret= s->iformat->read_packet(s, pkt);
737 if (!pktl || ret == AVERROR(EAGAIN))
739 for (i = 0; i < s->nb_streams; i++) {
741 if (st->probe_packets) {
742 probe_codec(s, st, NULL);
744 av_assert0(st->request_probe <= 0);
749 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
750 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
751 av_log(s, AV_LOG_WARNING,
752 "Dropped corrupted packet (stream = %d)\n",
758 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
759 av_packet_merge_side_data(pkt);
761 if(pkt->stream_index >= (unsigned)s->nb_streams){
762 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
766 st= s->streams[pkt->stream_index];
768 switch(st->codec->codec_type){
769 case AVMEDIA_TYPE_VIDEO:
770 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
772 case AVMEDIA_TYPE_AUDIO:
773 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
775 case AVMEDIA_TYPE_SUBTITLE:
776 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
779 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
780 if (s->use_wallclock_as_timestamps)
781 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
783 if(!pktl && st->request_probe <= 0)
786 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
787 s->raw_packet_buffer_remaining_size -= pkt->size;
789 probe_codec(s, st, pkt);
793 #if FF_API_READ_PACKET
794 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
796 return ff_read_packet(s, pkt);
801 /**********************************************************/
803 static int determinable_frame_size(AVCodecContext *avctx)
805 if (/*avctx->codec_id == AV_CODEC_ID_AAC ||*/
806 avctx->codec_id == AV_CODEC_ID_MP1 ||
807 avctx->codec_id == AV_CODEC_ID_MP2 ||
808 avctx->codec_id == AV_CODEC_ID_MP3/* ||
809 avctx->codec_id == AV_CODEC_ID_CELT*/)
815 * Get the number of samples of an audio frame. Return -1 on error.
817 static int get_audio_frame_size(AVCodecContext *enc, int size, int mux)
821 /* give frame_size priority if demuxing */
822 if (!mux && enc->frame_size > 1)
823 return enc->frame_size;
825 if ((frame_size = av_get_audio_frame_duration(enc, size)) > 0)
828 /* fallback to using frame_size if muxing */
829 if (enc->frame_size > 1)
830 return enc->frame_size;
837 * Return the frame duration in seconds. Return 0 if not available.
839 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
840 AVCodecParserContext *pc, AVPacket *pkt)
846 switch(st->codec->codec_type) {
847 case AVMEDIA_TYPE_VIDEO:
848 if (st->r_frame_rate.num && !pc) {
849 *pnum = st->r_frame_rate.den;
850 *pden = st->r_frame_rate.num;
851 } else if(st->time_base.num*1000LL > st->time_base.den) {
852 *pnum = st->time_base.num;
853 *pden = st->time_base.den;
854 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
855 *pnum = st->codec->time_base.num;
856 *pden = st->codec->time_base.den;
857 if (pc && pc->repeat_pict) {
858 *pnum = (*pnum) * (1 + pc->repeat_pict);
860 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
861 //Thus if we have no parser in such case leave duration undefined.
862 if(st->codec->ticks_per_frame>1 && !pc){
867 case AVMEDIA_TYPE_AUDIO:
868 frame_size = get_audio_frame_size(st->codec, pkt->size, 0);
869 if (frame_size <= 0 || st->codec->sample_rate <= 0)
872 *pden = st->codec->sample_rate;
879 static int is_intra_only(AVCodecContext *enc){
880 const AVCodecDescriptor *desc;
882 if(enc->codec_type != AVMEDIA_TYPE_VIDEO)
885 desc = av_codec_get_codec_descriptor(enc);
887 desc = avcodec_descriptor_get(enc->codec_id);
888 av_codec_set_codec_descriptor(enc, desc);
891 return !!(desc->props & AV_CODEC_PROP_INTRA_ONLY);
895 static int has_decode_delay_been_guessed(AVStream *st)
897 if(st->codec->codec_id != AV_CODEC_ID_H264) return 1;
898 #if CONFIG_H264_DECODER
899 if(st->codec->has_b_frames &&
900 avpriv_h264_has_num_reorder_frames(st->codec) == st->codec->has_b_frames)
903 if(st->codec->has_b_frames<3)
904 return st->nb_decoded_frames >= 7;
905 else if(st->codec->has_b_frames<4)
906 return st->nb_decoded_frames >= 18;
908 return st->nb_decoded_frames >= 20;
911 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
915 if (pktl == s->parse_queue_end)
916 return s->packet_buffer;
920 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
921 int64_t dts, int64_t pts)
923 AVStream *st= s->streams[stream_index];
924 AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
926 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE || is_relative(dts))
929 st->first_dts= dts - (st->cur_dts - RELATIVE_TS_BASE);
932 if (is_relative(pts))
933 pts += st->first_dts - RELATIVE_TS_BASE;
935 for(; pktl; pktl= get_next_pkt(s, st, pktl)){
936 if(pktl->pkt.stream_index != stream_index)
938 if(is_relative(pktl->pkt.pts))
939 pktl->pkt.pts += st->first_dts - RELATIVE_TS_BASE;
941 if(is_relative(pktl->pkt.dts))
942 pktl->pkt.dts += st->first_dts - RELATIVE_TS_BASE;
944 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
945 st->start_time= pktl->pkt.pts;
947 if (st->start_time == AV_NOPTS_VALUE)
948 st->start_time = pts;
951 static void update_initial_durations(AVFormatContext *s, AVStream *st,
952 int stream_index, int duration)
954 AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
955 int64_t cur_dts= RELATIVE_TS_BASE;
957 if(st->first_dts != AV_NOPTS_VALUE){
958 cur_dts= st->first_dts;
959 for(; pktl; pktl= get_next_pkt(s, st, pktl)){
960 if(pktl->pkt.stream_index == stream_index){
961 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
966 if(pktl && pktl->pkt.dts != st->first_dts) {
967 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s in que\n", av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts));
971 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in ques\n", av_ts2str(st->first_dts));
974 pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
975 st->first_dts = cur_dts;
976 }else if(st->cur_dts != RELATIVE_TS_BASE)
979 for(; pktl; pktl= get_next_pkt(s, st, pktl)){
980 if(pktl->pkt.stream_index != stream_index)
982 if(pktl->pkt.pts == pktl->pkt.dts && (pktl->pkt.dts == AV_NOPTS_VALUE || pktl->pkt.dts == st->first_dts)
983 && !pktl->pkt.duration){
984 pktl->pkt.dts= cur_dts;
985 if(!st->codec->has_b_frames)
986 pktl->pkt.pts= cur_dts;
987 // if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
988 pktl->pkt.duration = duration;
991 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
994 st->cur_dts= cur_dts;
997 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
998 AVCodecParserContext *pc, AVPacket *pkt)
1000 int num, den, presentation_delayed, delay, i;
1003 if (s->flags & AVFMT_FLAG_NOFILLIN)
1006 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1007 pkt->dts= AV_NOPTS_VALUE;
1009 if (st->codec->codec_id != AV_CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
1010 //FIXME Set low_delay = 0 when has_b_frames = 1
1011 st->codec->has_b_frames = 1;
1013 /* do we have a video B-frame ? */
1014 delay= st->codec->has_b_frames;
1015 presentation_delayed = 0;
1017 /* XXX: need has_b_frame, but cannot get it if the codec is
1020 pc && pc->pict_type != AV_PICTURE_TYPE_B)
1021 presentation_delayed = 1;
1023 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts - (1LL<<(st->pts_wrap_bits-1)) > pkt->pts && st->pts_wrap_bits<63){
1024 if(is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits-1)) > st->cur_dts) {
1025 pkt->dts -= 1LL<<st->pts_wrap_bits;
1027 pkt->pts += 1LL<<st->pts_wrap_bits;
1030 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
1031 // we take the conservative approach and discard both
1032 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
1033 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
1034 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1035 if(strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1036 pkt->dts= AV_NOPTS_VALUE;
1039 if (pkt->duration == 0) {
1040 compute_frame_duration(&num, &den, st, pc, pkt);
1042 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1045 if(pkt->duration != 0 && (s->packet_buffer || s->parse_queue))
1046 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1048 /* correct timestamps with byte offset if demuxers only have timestamps
1049 on packet boundaries */
1050 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1051 /* this will estimate bitrate based on this frame's duration and size */
1052 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1053 if(pkt->pts != AV_NOPTS_VALUE)
1055 if(pkt->dts != AV_NOPTS_VALUE)
1059 if (pc && pc->dts_sync_point >= 0) {
1060 // we have synchronization info from the parser
1061 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1063 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1064 if (pkt->dts != AV_NOPTS_VALUE) {
1065 // got DTS from the stream, update reference timestamp
1066 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1067 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1068 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1069 // compute DTS based on reference timestamp
1070 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1071 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1073 if (pc->dts_sync_point > 0)
1074 st->reference_dts = pkt->dts; // new reference
1078 /* This may be redundant, but it should not hurt. */
1079 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1080 presentation_delayed = 1;
1082 // av_log(NULL, AV_LOG_DEBUG, "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%d\n",
1083 // presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), pkt->stream_index, pc, pkt->duration);
1084 /* interpolate PTS and DTS if they are not present */
1085 //We skip H264 currently because delay and has_b_frames are not reliably set
1086 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != AV_CODEC_ID_H264){
1087 if (presentation_delayed) {
1088 /* DTS = decompression timestamp */
1089 /* PTS = presentation timestamp */
1090 if (pkt->dts == AV_NOPTS_VALUE)
1091 pkt->dts = st->last_IP_pts;
1092 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1093 if (pkt->dts == AV_NOPTS_VALUE)
1094 pkt->dts = st->cur_dts;
1096 /* this is tricky: the dts must be incremented by the duration
1097 of the frame we are displaying, i.e. the last I- or P-frame */
1098 if (st->last_IP_duration == 0)
1099 st->last_IP_duration = pkt->duration;
1100 if(pkt->dts != AV_NOPTS_VALUE)
1101 st->cur_dts = pkt->dts + st->last_IP_duration;
1102 st->last_IP_duration = pkt->duration;
1103 st->last_IP_pts= pkt->pts;
1104 /* cannot compute PTS if not present (we can compute it only
1105 by knowing the future */
1106 } else if (pkt->pts != AV_NOPTS_VALUE ||
1107 pkt->dts != AV_NOPTS_VALUE ||
1109 int duration = pkt->duration;
1111 if(pkt->pts != AV_NOPTS_VALUE && duration){
1112 int64_t old_diff= FFABS(st->cur_dts - duration - pkt->pts);
1113 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1114 if( old_diff < new_diff && old_diff < (duration>>3)
1115 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO
1116 && (!strcmp(s->iformat->name, "mpeg") ||
1117 !strcmp(s->iformat->name, "mpegts"))){
1118 pkt->pts += duration;
1119 av_log(s, AV_LOG_WARNING, "Adjusting PTS forward\n");
1120 // av_log(NULL, AV_LOG_DEBUG, "id:%d old:%"PRId64" new:%"PRId64" dur:%d cur:%s size:%d\n",
1121 // pkt->stream_index, old_diff, new_diff, pkt->duration, av_ts2str(st->cur_dts), pkt->size);
1125 /* presentation is not delayed : PTS and DTS are the same */
1126 if (pkt->pts == AV_NOPTS_VALUE)
1127 pkt->pts = pkt->dts;
1128 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1130 if (pkt->pts == AV_NOPTS_VALUE)
1131 pkt->pts = st->cur_dts;
1132 pkt->dts = pkt->pts;
1133 if (pkt->pts != AV_NOPTS_VALUE)
1134 st->cur_dts = pkt->pts + duration;
1138 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)){
1139 st->pts_buffer[0]= pkt->pts;
1140 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1141 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1142 if(pkt->dts == AV_NOPTS_VALUE)
1143 pkt->dts= st->pts_buffer[0];
1145 if(st->codec->codec_id == AV_CODEC_ID_H264){ // we skipped it above so we try here
1146 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1148 if(pkt->dts > st->cur_dts)
1149 st->cur_dts = pkt->dts;
1151 // av_log(NULL, AV_LOG_ERROR, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1152 // presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
1155 if (is_intra_only(st->codec))
1156 pkt->flags |= AV_PKT_FLAG_KEY;
1158 pkt->convergence_duration = pc->convergence_duration;
1161 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1164 AVPacketList *pktl = *pkt_buf;
1165 *pkt_buf = pktl->next;
1166 av_free_packet(&pktl->pkt);
1169 *pkt_buf_end = NULL;
1173 * Parse a packet, add all split parts to parse_queue
1175 * @param pkt packet to parse, NULL when flushing the parser at end of stream
1177 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1179 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1180 AVStream *st = s->streams[stream_index];
1181 uint8_t *data = pkt ? pkt->data : NULL;
1182 int size = pkt ? pkt->size : 0;
1183 int ret = 0, got_output = 0;
1186 av_init_packet(&flush_pkt);
1189 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1190 // preserve 0-size sync packets
1191 compute_pkt_fields(s, st, st->parser, pkt);
1194 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1197 av_init_packet(&out_pkt);
1198 len = av_parser_parse2(st->parser, st->codec,
1199 &out_pkt.data, &out_pkt.size, data, size,
1200 pkt->pts, pkt->dts, pkt->pos);
1202 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1204 /* increment read pointer */
1208 got_output = !!out_pkt.size;
1213 /* set the duration */
1214 out_pkt.duration = 0;
1215 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1216 if (st->codec->sample_rate > 0) {
1217 out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
1218 (AVRational){ 1, st->codec->sample_rate },
1222 } else if (st->codec->time_base.num != 0 &&
1223 st->codec->time_base.den != 0) {
1224 out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
1225 st->codec->time_base,
1230 out_pkt.stream_index = st->index;
1231 out_pkt.pts = st->parser->pts;
1232 out_pkt.dts = st->parser->dts;
1233 out_pkt.pos = st->parser->pos;
1235 if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1236 out_pkt.pos = st->parser->frame_offset;
1238 if (st->parser->key_frame == 1 ||
1239 (st->parser->key_frame == -1 &&
1240 st->parser->pict_type == AV_PICTURE_TYPE_I))
1241 out_pkt.flags |= AV_PKT_FLAG_KEY;
1243 if(st->parser->key_frame == -1 && st->parser->pict_type==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1244 out_pkt.flags |= AV_PKT_FLAG_KEY;
1246 compute_pkt_fields(s, st, st->parser, &out_pkt);
1248 if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
1249 out_pkt.destruct = pkt->destruct;
1250 pkt->destruct = NULL;
1252 if ((ret = av_dup_packet(&out_pkt)) < 0)
1255 if (!add_to_pktbuf(&s->parse_queue, &out_pkt, &s->parse_queue_end)) {
1256 av_free_packet(&out_pkt);
1257 ret = AVERROR(ENOMEM);
1263 /* end of the stream => close and free the parser */
1264 if (pkt == &flush_pkt) {
1265 av_parser_close(st->parser);
1270 av_free_packet(pkt);
1274 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1275 AVPacketList **pkt_buffer_end,
1279 av_assert0(*pkt_buffer);
1282 *pkt_buffer = pktl->next;
1284 *pkt_buffer_end = NULL;
1289 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1291 int ret = 0, i, got_packet = 0;
1293 av_init_packet(pkt);
1295 while (!got_packet && !s->parse_queue) {
1299 /* read next packet */
1300 ret = ff_read_packet(s, &cur_pkt);
1302 if (ret == AVERROR(EAGAIN))
1304 /* flush the parsers */
1305 for(i = 0; i < s->nb_streams; i++) {
1307 if (st->parser && st->need_parsing)
1308 parse_packet(s, NULL, st->index);
1310 /* all remaining packets are now in parse_queue =>
1311 * really terminate parsing */
1315 st = s->streams[cur_pkt.stream_index];
1317 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1318 cur_pkt.dts != AV_NOPTS_VALUE &&
1319 cur_pkt.pts < cur_pkt.dts) {
1320 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1321 cur_pkt.stream_index,
1322 av_ts2str(cur_pkt.pts),
1323 av_ts2str(cur_pkt.dts),
1326 if (s->debug & FF_FDEBUG_TS)
1327 av_log(s, AV_LOG_DEBUG, "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
1328 cur_pkt.stream_index,
1329 av_ts2str(cur_pkt.pts),
1330 av_ts2str(cur_pkt.dts),
1335 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1336 st->parser = av_parser_init(st->codec->codec_id);
1338 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1339 "%s, packets or times may be invalid.\n",
1340 avcodec_get_name(st->codec->codec_id));
1341 /* no parser available: just output the raw packets */
1342 st->need_parsing = AVSTREAM_PARSE_NONE;
1343 } else if(st->need_parsing == AVSTREAM_PARSE_HEADERS) {
1344 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1345 } else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE) {
1346 st->parser->flags |= PARSER_FLAG_ONCE;
1347 } else if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
1348 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1352 if (!st->need_parsing || !st->parser) {
1353 /* no parsing needed: we just output the packet as is */
1355 compute_pkt_fields(s, st, NULL, pkt);
1356 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1357 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1358 ff_reduce_index(s, st->index);
1359 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1362 } else if (st->discard < AVDISCARD_ALL) {
1363 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1367 av_free_packet(&cur_pkt);
1369 if (pkt->flags & AV_PKT_FLAG_KEY)
1370 st->skip_to_keyframe = 0;
1371 if (st->skip_to_keyframe) {
1372 av_free_packet(&cur_pkt);
1377 if (!got_packet && s->parse_queue)
1378 ret = read_from_packet_buffer(&s->parse_queue, &s->parse_queue_end, pkt);
1380 if(s->debug & FF_FDEBUG_TS)
1381 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
1383 av_ts2str(pkt->pts),
1384 av_ts2str(pkt->dts),
1392 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1394 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1400 ret = s->packet_buffer ? read_from_packet_buffer(&s->packet_buffer,
1401 &s->packet_buffer_end,
1403 read_frame_internal(s, pkt);
1408 AVPacketList *pktl = s->packet_buffer;
1411 AVPacket *next_pkt = &pktl->pkt;
1413 if (next_pkt->dts != AV_NOPTS_VALUE) {
1414 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1415 // last dts seen for this stream. if any of packets following
1416 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1417 int64_t last_dts = next_pkt->dts;
1418 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1419 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1420 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0)) {
1421 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1422 next_pkt->pts = pktl->pkt.dts;
1424 if (last_dts != AV_NOPTS_VALUE) {
1425 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1426 last_dts = pktl->pkt.dts;
1431 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1432 // Fixing the last reference frame had none pts issue (For MXF etc).
1433 // We only do this when
1435 // 2. we are not able to resolve a pts value for current packet.
1436 // 3. the packets for this stream at the end of the files had valid dts.
1437 next_pkt->pts = last_dts + next_pkt->duration;
1439 pktl = s->packet_buffer;
1442 /* read packet from packet buffer, if there is data */
1443 if (!(next_pkt->pts == AV_NOPTS_VALUE &&
1444 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1445 ret = read_from_packet_buffer(&s->packet_buffer,
1446 &s->packet_buffer_end, pkt);
1451 ret = read_frame_internal(s, pkt);
1453 if (pktl && ret != AVERROR(EAGAIN)) {
1460 if (av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1461 &s->packet_buffer_end)) < 0)
1462 return AVERROR(ENOMEM);
1467 st = s->streams[pkt->stream_index];
1468 if (st->skip_samples) {
1469 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1470 AV_WL32(p, st->skip_samples);
1471 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d\n", st->skip_samples);
1472 st->skip_samples = 0;
1475 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1476 ff_reduce_index(s, st->index);
1477 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1480 if (is_relative(pkt->dts))
1481 pkt->dts -= RELATIVE_TS_BASE;
1482 if (is_relative(pkt->pts))
1483 pkt->pts -= RELATIVE_TS_BASE;
1488 /* XXX: suppress the packet queue */
1489 static void flush_packet_queue(AVFormatContext *s)
1491 free_packet_buffer(&s->parse_queue, &s->parse_queue_end);
1492 free_packet_buffer(&s->packet_buffer, &s->packet_buffer_end);
1493 free_packet_buffer(&s->raw_packet_buffer, &s->raw_packet_buffer_end);
1495 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1498 /*******************************************************/
1501 int av_find_default_stream_index(AVFormatContext *s)
1503 int first_audio_index = -1;
1507 if (s->nb_streams <= 0)
1509 for(i = 0; i < s->nb_streams; i++) {
1511 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1512 !(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
1515 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1516 first_audio_index = i;
1518 return first_audio_index >= 0 ? first_audio_index : 0;
1522 * Flush the frame reader.
1524 void ff_read_frame_flush(AVFormatContext *s)
1529 flush_packet_queue(s);
1531 /* for each stream, reset read state */
1532 for(i = 0; i < s->nb_streams; i++) {
1536 av_parser_close(st->parser);
1539 st->last_IP_pts = AV_NOPTS_VALUE;
1540 if(st->first_dts == AV_NOPTS_VALUE) st->cur_dts = RELATIVE_TS_BASE;
1541 else st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1542 st->reference_dts = AV_NOPTS_VALUE;
1544 st->probe_packets = MAX_PROBE_PACKETS;
1546 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1547 st->pts_buffer[j]= AV_NOPTS_VALUE;
1551 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1555 for(i = 0; i < s->nb_streams; i++) {
1556 AVStream *st = s->streams[i];
1558 st->cur_dts = av_rescale(timestamp,
1559 st->time_base.den * (int64_t)ref_st->time_base.num,
1560 st->time_base.num * (int64_t)ref_st->time_base.den);
1564 void ff_reduce_index(AVFormatContext *s, int stream_index)
1566 AVStream *st= s->streams[stream_index];
1567 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1569 if((unsigned)st->nb_index_entries >= max_entries){
1571 for(i=0; 2*i<st->nb_index_entries; i++)
1572 st->index_entries[i]= st->index_entries[2*i];
1573 st->nb_index_entries= i;
1577 int ff_add_index_entry(AVIndexEntry **index_entries,
1578 int *nb_index_entries,
1579 unsigned int *index_entries_allocated_size,
1580 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1582 AVIndexEntry *entries, *ie;
1585 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1588 if(timestamp == AV_NOPTS_VALUE)
1589 return AVERROR(EINVAL);
1591 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1592 timestamp -= RELATIVE_TS_BASE;
1594 entries = av_fast_realloc(*index_entries,
1595 index_entries_allocated_size,
1596 (*nb_index_entries + 1) *
1597 sizeof(AVIndexEntry));
1601 *index_entries= entries;
1603 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1606 index= (*nb_index_entries)++;
1607 ie= &entries[index];
1608 assert(index==0 || ie[-1].timestamp < timestamp);
1610 ie= &entries[index];
1611 if(ie->timestamp != timestamp){
1612 if(ie->timestamp <= timestamp)
1614 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1615 (*nb_index_entries)++;
1616 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1617 distance= ie->min_distance;
1621 ie->timestamp = timestamp;
1622 ie->min_distance= distance;
1629 int av_add_index_entry(AVStream *st,
1630 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1632 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1633 &st->index_entries_allocated_size, pos,
1634 timestamp, size, distance, flags);
1637 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1638 int64_t wanted_timestamp, int flags)
1646 //optimize appending index entries at the end
1647 if(b && entries[b-1].timestamp < wanted_timestamp)
1652 timestamp = entries[m].timestamp;
1653 if(timestamp >= wanted_timestamp)
1655 if(timestamp <= wanted_timestamp)
1658 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1660 if(!(flags & AVSEEK_FLAG_ANY)){
1661 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1662 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1671 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1674 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1675 wanted_timestamp, flags);
1678 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
1680 AVInputFormat *avif= s->iformat;
1681 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1682 int64_t ts_min, ts_max, ts;
1687 if (stream_index < 0)
1690 av_dlog(s, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1693 ts_min= AV_NOPTS_VALUE;
1694 pos_limit= -1; //gcc falsely says it may be uninitialized
1696 st= s->streams[stream_index];
1697 if(st->index_entries){
1700 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()
1701 index= FFMAX(index, 0);
1702 e= &st->index_entries[index];
1704 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1706 ts_min= e->timestamp;
1707 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
1708 pos_min, av_ts2str(ts_min));
1713 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1714 assert(index < st->nb_index_entries);
1716 e= &st->index_entries[index];
1717 assert(e->timestamp >= target_ts);
1719 ts_max= e->timestamp;
1720 pos_limit= pos_max - e->min_distance;
1721 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%s\n",
1722 pos_max, pos_limit, av_ts2str(ts_max));
1726 pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1731 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1734 ff_read_frame_flush(s);
1735 ff_update_cur_dts(s, st, ts);
1740 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1741 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1742 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1743 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1746 int64_t start_pos, filesize;
1749 av_dlog(s, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1751 if(ts_min == AV_NOPTS_VALUE){
1752 pos_min = s->data_offset;
1753 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1754 if (ts_min == AV_NOPTS_VALUE)
1758 if(ts_min >= target_ts){
1763 if(ts_max == AV_NOPTS_VALUE){
1765 filesize = avio_size(s->pb);
1766 pos_max = filesize - 1;
1769 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1771 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1772 if (ts_max == AV_NOPTS_VALUE)
1776 int64_t tmp_pos= pos_max + 1;
1777 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1778 if(tmp_ts == AV_NOPTS_VALUE)
1782 if(tmp_pos >= filesize)
1788 if(ts_max <= target_ts){
1793 if(ts_min > ts_max){
1795 }else if(ts_min == ts_max){
1800 while (pos_min < pos_limit) {
1801 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
1802 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
1803 assert(pos_limit <= pos_max);
1806 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1807 // interpolate position (better than dichotomy)
1808 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1809 + pos_min - approximate_keyframe_distance;
1810 }else if(no_change==1){
1811 // bisection, if interpolation failed to change min or max pos last time
1812 pos = (pos_min + pos_limit)>>1;
1814 /* linear search if bisection failed, can only happen if there
1815 are very few or no keyframes between min/max */
1820 else if(pos > pos_limit)
1824 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1829 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
1830 pos_min, pos, pos_max,
1831 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
1832 pos_limit, start_pos, no_change);
1833 if(ts == AV_NOPTS_VALUE){
1834 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1837 assert(ts != AV_NOPTS_VALUE);
1838 if (target_ts <= ts) {
1839 pos_limit = start_pos - 1;
1843 if (target_ts >= ts) {
1849 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1850 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1853 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1855 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1856 av_dlog(s, "pos=0x%"PRIx64" %s<=%s<=%s\n",
1857 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
1863 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1864 int64_t pos_min, pos_max;
1866 pos_min = s->data_offset;
1867 pos_max = avio_size(s->pb) - 1;
1869 if (pos < pos_min) pos= pos_min;
1870 else if(pos > pos_max) pos= pos_max;
1872 avio_seek(s->pb, pos, SEEK_SET);
1877 static int seek_frame_generic(AVFormatContext *s,
1878 int stream_index, int64_t timestamp, int flags)
1885 st = s->streams[stream_index];
1887 index = av_index_search_timestamp(st, timestamp, flags);
1889 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1892 if(index < 0 || index==st->nb_index_entries-1){
1896 if(st->nb_index_entries){
1897 assert(st->index_entries);
1898 ie= &st->index_entries[st->nb_index_entries-1];
1899 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1901 ff_update_cur_dts(s, st, ie->timestamp);
1903 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1909 read_status = av_read_frame(s, &pkt);
1910 } while (read_status == AVERROR(EAGAIN));
1911 if (read_status < 0)
1913 av_free_packet(&pkt);
1914 if(stream_index == pkt.stream_index && pkt.dts > timestamp){
1915 if(pkt.flags & AV_PKT_FLAG_KEY)
1917 if(nonkey++ > 1000 && st->codec->codec_id != AV_CODEC_ID_CDGRAPHICS){
1918 av_log(s, AV_LOG_ERROR,"seek_frame_generic failed as this stream seems to contain no keyframes after the target timestamp, %d non keyframes found\n", nonkey);
1923 index = av_index_search_timestamp(st, timestamp, flags);
1928 ff_read_frame_flush(s);
1929 AV_NOWARN_DEPRECATED(
1930 if (s->iformat->read_seek){
1931 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1935 ie = &st->index_entries[index];
1936 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1938 ff_update_cur_dts(s, st, ie->timestamp);
1943 static int seek_frame_internal(AVFormatContext *s, int stream_index,
1944 int64_t timestamp, int flags)
1949 if (flags & AVSEEK_FLAG_BYTE) {
1950 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1952 ff_read_frame_flush(s);
1953 return seek_frame_byte(s, stream_index, timestamp, flags);
1956 if(stream_index < 0){
1957 stream_index= av_find_default_stream_index(s);
1958 if(stream_index < 0)
1961 st= s->streams[stream_index];
1962 /* timestamp for default must be expressed in AV_TIME_BASE units */
1963 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1966 /* first, we try the format specific seek */
1967 AV_NOWARN_DEPRECATED(
1968 if (s->iformat->read_seek) {
1969 ff_read_frame_flush(s);
1970 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1978 if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1979 ff_read_frame_flush(s);
1980 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1981 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1982 ff_read_frame_flush(s);
1983 return seek_frame_generic(s, stream_index, timestamp, flags);
1989 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1991 int ret = seek_frame_internal(s, stream_index, timestamp, flags);
1994 avformat_queue_attached_pictures(s);
1999 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
2001 if(min_ts > ts || max_ts < ts)
2004 if (s->iformat->read_seek2) {
2006 ff_read_frame_flush(s);
2007 ret = s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
2010 avformat_queue_attached_pictures(s);
2014 if(s->iformat->read_timestamp){
2015 //try to seek via read_timestamp()
2018 //Fallback to old API if new is not implemented but old is
2019 //Note the old has somewat different sematics
2020 AV_NOWARN_DEPRECATED(
2021 if (s->iformat->read_seek || 1) {
2022 int dir = (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0);
2023 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2024 if (ret<0 && ts != min_ts && max_ts != ts) {
2025 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2027 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2033 // try some generic seek like seek_frame_generic() but with new ts semantics
2036 /*******************************************************/
2039 * Return TRUE if the stream has accurate duration in any stream.
2041 * @return TRUE if the stream has accurate duration for at least one component.
2043 static int has_duration(AVFormatContext *ic)
2048 for(i = 0;i < ic->nb_streams; i++) {
2049 st = ic->streams[i];
2050 if (st->duration != AV_NOPTS_VALUE)
2053 if (ic->duration != AV_NOPTS_VALUE)
2059 * Estimate the stream timings from the one of each components.
2061 * Also computes the global bitrate if possible.
2063 static void update_stream_timings(AVFormatContext *ic)
2065 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
2066 int64_t duration, duration1, filesize;
2070 start_time = INT64_MAX;
2071 start_time_text = INT64_MAX;
2072 end_time = INT64_MIN;
2073 duration = INT64_MIN;
2074 for(i = 0;i < ic->nb_streams; i++) {
2075 st = ic->streams[i];
2076 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2077 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
2078 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codec->codec_type == AVMEDIA_TYPE_DATA) {
2079 if (start_time1 < start_time_text)
2080 start_time_text = start_time1;
2082 start_time = FFMIN(start_time, start_time1);
2083 if (st->duration != AV_NOPTS_VALUE) {
2084 end_time1 = start_time1
2085 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
2086 end_time = FFMAX(end_time, end_time1);
2089 if (st->duration != AV_NOPTS_VALUE) {
2090 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
2091 duration = FFMAX(duration, duration1);
2094 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2095 start_time = start_time_text;
2096 else if(start_time > start_time_text)
2097 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2099 if (start_time != INT64_MAX) {
2100 ic->start_time = start_time;
2101 if (end_time != INT64_MIN)
2102 duration = FFMAX(duration, end_time - start_time);
2104 if (duration != INT64_MIN && ic->duration == AV_NOPTS_VALUE) {
2105 ic->duration = duration;
2107 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
2108 /* compute the bitrate */
2109 ic->bit_rate = (double)filesize * 8.0 * AV_TIME_BASE /
2110 (double)ic->duration;
2114 static void fill_all_stream_timings(AVFormatContext *ic)
2119 update_stream_timings(ic);
2120 for(i = 0;i < ic->nb_streams; i++) {
2121 st = ic->streams[i];
2122 if (st->start_time == AV_NOPTS_VALUE) {
2123 if(ic->start_time != AV_NOPTS_VALUE)
2124 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
2125 if(ic->duration != AV_NOPTS_VALUE)
2126 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
2131 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2133 int64_t filesize, duration;
2137 /* if bit_rate is already set, we believe it */
2138 if (ic->bit_rate <= 0) {
2140 for(i=0;i<ic->nb_streams;i++) {
2141 st = ic->streams[i];
2142 if (st->codec->bit_rate > 0)
2143 bit_rate += st->codec->bit_rate;
2145 ic->bit_rate = bit_rate;
2148 /* if duration is already set, we believe it */
2149 if (ic->duration == AV_NOPTS_VALUE &&
2150 ic->bit_rate != 0) {
2151 filesize = ic->pb ? avio_size(ic->pb) : 0;
2153 for(i = 0; i < ic->nb_streams; i++) {
2154 st = ic->streams[i];
2155 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
2156 if (st->duration == AV_NOPTS_VALUE)
2157 st->duration = duration;
2163 #define DURATION_MAX_READ_SIZE 250000
2164 #define DURATION_MAX_RETRY 3
2166 /* only usable for MPEG-PS streams */
2167 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2169 AVPacket pkt1, *pkt = &pkt1;
2171 int read_size, i, ret;
2173 int64_t filesize, offset, duration;
2176 /* flush packet queue */
2177 flush_packet_queue(ic);
2179 for (i=0; i<ic->nb_streams; i++) {
2180 st = ic->streams[i];
2181 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
2182 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2185 av_parser_close(st->parser);
2190 /* estimate the end time (duration) */
2191 /* XXX: may need to support wrapping */
2192 filesize = ic->pb ? avio_size(ic->pb) : 0;
2193 end_time = AV_NOPTS_VALUE;
2195 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2199 avio_seek(ic->pb, offset, SEEK_SET);
2202 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2206 ret = ff_read_packet(ic, pkt);
2207 } while(ret == AVERROR(EAGAIN));
2210 read_size += pkt->size;
2211 st = ic->streams[pkt->stream_index];
2212 if (pkt->pts != AV_NOPTS_VALUE &&
2213 (st->start_time != AV_NOPTS_VALUE ||
2214 st->first_dts != AV_NOPTS_VALUE)) {
2215 duration = end_time = pkt->pts;
2216 if (st->start_time != AV_NOPTS_VALUE)
2217 duration -= st->start_time;
2219 duration -= st->first_dts;
2221 duration += 1LL<<st->pts_wrap_bits;
2223 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2224 st->duration = duration;
2227 av_free_packet(pkt);
2229 }while( end_time==AV_NOPTS_VALUE
2230 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2231 && ++retry <= DURATION_MAX_RETRY);
2233 fill_all_stream_timings(ic);
2235 avio_seek(ic->pb, old_offset, SEEK_SET);
2236 for (i=0; i<ic->nb_streams; i++) {
2238 st->cur_dts= st->first_dts;
2239 st->last_IP_pts = AV_NOPTS_VALUE;
2240 st->reference_dts = AV_NOPTS_VALUE;
2244 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2248 /* get the file size, if possible */
2249 if (ic->iformat->flags & AVFMT_NOFILE) {
2252 file_size = avio_size(ic->pb);
2253 file_size = FFMAX(0, file_size);
2256 if ((!strcmp(ic->iformat->name, "mpeg") ||
2257 !strcmp(ic->iformat->name, "mpegts")) &&
2258 file_size && ic->pb->seekable) {
2259 /* get accurate estimate from the PTSes */
2260 estimate_timings_from_pts(ic, old_offset);
2261 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2262 } else if (has_duration(ic)) {
2263 /* at least one component has timings - we use them for all
2265 fill_all_stream_timings(ic);
2266 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2268 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2269 /* less precise: use bitrate info */
2270 estimate_timings_from_bit_rate(ic);
2271 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2273 update_stream_timings(ic);
2277 AVStream av_unused *st;
2278 for(i = 0;i < ic->nb_streams; i++) {
2279 st = ic->streams[i];
2280 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2281 (double) st->start_time / AV_TIME_BASE,
2282 (double) st->duration / AV_TIME_BASE);
2284 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2285 (double) ic->start_time / AV_TIME_BASE,
2286 (double) ic->duration / AV_TIME_BASE,
2287 ic->bit_rate / 1000);
2291 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2293 AVCodecContext *avctx = st->codec;
2295 #define FAIL(errmsg) do { \
2297 *errmsg_ptr = errmsg; \
2301 switch (avctx->codec_type) {
2302 case AVMEDIA_TYPE_AUDIO:
2303 if (!avctx->frame_size && determinable_frame_size(avctx))
2304 FAIL("unspecified sample size");
2305 if (st->info->found_decoder >= 0 && avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2306 FAIL("unspecified sample format");
2307 if (!avctx->sample_rate)
2308 FAIL("unspecified sample rate");
2309 if (!avctx->channels)
2310 FAIL("unspecified number of channels");
2312 case AVMEDIA_TYPE_VIDEO:
2314 FAIL("unspecified size");
2315 if (st->info->found_decoder >= 0 && avctx->pix_fmt == PIX_FMT_NONE)
2316 FAIL("unspecified pixel format");
2318 case AVMEDIA_TYPE_SUBTITLE:
2319 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
2320 FAIL("unspecified size");
2322 case AVMEDIA_TYPE_DATA:
2323 if(avctx->codec_id == AV_CODEC_ID_NONE) return 1;
2326 if (avctx->codec_id == AV_CODEC_ID_NONE)
2327 FAIL("unknown codec");
2331 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2332 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2334 const AVCodec *codec;
2335 int got_picture = 1, ret = 0;
2337 AVSubtitle subtitle;
2338 AVPacket pkt = *avpkt;
2340 if (!avcodec_is_open(st->codec) && !st->info->found_decoder) {
2341 AVDictionary *thread_opt = NULL;
2343 codec = st->codec->codec ? st->codec->codec :
2344 avcodec_find_decoder(st->codec->codec_id);
2347 st->info->found_decoder = -1;
2351 /* force thread count to 1 since the h264 decoder will not extract SPS
2352 * and PPS to extradata during multi-threaded decoding */
2353 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2354 ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
2356 av_dict_free(&thread_opt);
2358 st->info->found_decoder = -1;
2361 st->info->found_decoder = 1;
2362 } else if (!st->info->found_decoder)
2363 st->info->found_decoder = 1;
2365 if (st->info->found_decoder < 0)
2368 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2370 (!has_codec_parameters(st, NULL) ||
2371 !has_decode_delay_been_guessed(st) ||
2372 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2374 avcodec_get_frame_defaults(&picture);
2375 switch(st->codec->codec_type) {
2376 case AVMEDIA_TYPE_VIDEO:
2377 ret = avcodec_decode_video2(st->codec, &picture,
2378 &got_picture, &pkt);
2380 case AVMEDIA_TYPE_AUDIO:
2381 ret = avcodec_decode_audio4(st->codec, &picture, &got_picture, &pkt);
2383 case AVMEDIA_TYPE_SUBTITLE:
2384 ret = avcodec_decode_subtitle2(st->codec, &subtitle,
2385 &got_picture, &pkt);
2393 st->nb_decoded_frames++;
2399 if(!pkt.data && !got_picture)
2404 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
2406 while (tags->id != AV_CODEC_ID_NONE) {
2414 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2417 for(i=0; tags[i].id != AV_CODEC_ID_NONE;i++) {
2418 if(tag == tags[i].tag)
2421 for(i=0; tags[i].id != AV_CODEC_ID_NONE; i++) {
2422 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2425 return AV_CODEC_ID_NONE;
2428 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum AVCodecID id)
2431 for(i=0; tags && tags[i]; i++){
2432 int tag= ff_codec_get_tag(tags[i], id);
2438 enum AVCodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2441 for(i=0; tags && tags[i]; i++){
2442 enum AVCodecID id= ff_codec_get_id(tags[i], tag);
2443 if(id!=AV_CODEC_ID_NONE) return id;
2445 return AV_CODEC_ID_NONE;
2448 static void compute_chapters_end(AVFormatContext *s)
2451 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2453 for (i = 0; i < s->nb_chapters; i++)
2454 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2455 AVChapter *ch = s->chapters[i];
2456 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2459 for (j = 0; j < s->nb_chapters; j++) {
2460 AVChapter *ch1 = s->chapters[j];
2461 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2462 if (j != i && next_start > ch->start && next_start < end)
2465 ch->end = (end == INT64_MAX) ? ch->start : end;
2469 static int get_std_framerate(int i){
2470 if(i<60*12) return (i+1)*1001;
2471 else return ((const int[]){24,30,60,12,15,48})[i-60*12]*1000*12;
2475 * Is the time base unreliable.
2476 * This is a heuristic to balance between quick acceptance of the values in
2477 * the headers vs. some extra checks.
2478 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2479 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2480 * And there are "variable" fps files this needs to detect as well.
2482 static int tb_unreliable(AVCodecContext *c){
2483 if( c->time_base.den >= 101L*c->time_base.num
2484 || c->time_base.den < 5L*c->time_base.num
2485 /* || c->codec_tag == AV_RL32("DIVX")
2486 || c->codec_tag == AV_RL32("XVID")*/
2487 || c->codec_id == AV_CODEC_ID_MPEG2VIDEO
2488 || c->codec_id == AV_CODEC_ID_H264
2494 #if FF_API_FORMAT_PARAMETERS
2495 int av_find_stream_info(AVFormatContext *ic)
2497 return avformat_find_stream_info(ic, NULL);
2501 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2503 int i, count, ret, read_size, j;
2505 AVPacket pkt1, *pkt;
2506 int64_t old_offset = avio_tell(ic->pb);
2507 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2508 int flush_codecs = ic->probesize > 0;
2511 av_log(ic, AV_LOG_DEBUG, "File position before avformat_find_stream_info() is %"PRId64"\n", avio_tell(ic->pb));
2513 for(i=0;i<ic->nb_streams;i++) {
2514 const AVCodec *codec;
2515 AVDictionary *thread_opt = NULL;
2516 st = ic->streams[i];
2518 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2519 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2520 /* if(!st->time_base.num)
2522 if(!st->codec->time_base.num)
2523 st->codec->time_base= st->time_base;
2525 //only for the split stuff
2526 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2527 st->parser = av_parser_init(st->codec->codec_id);
2529 if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
2530 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2531 } else if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
2532 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
2534 } else if (st->need_parsing) {
2535 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
2536 "%s, packets or times may be invalid.\n",
2537 avcodec_get_name(st->codec->codec_id));
2540 codec = st->codec->codec ? st->codec->codec :
2541 avcodec_find_decoder(st->codec->codec_id);
2543 /* force thread count to 1 since the h264 decoder will not extract SPS
2544 * and PPS to extradata during multi-threaded decoding */
2545 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
2547 /* Ensure that subtitle_header is properly set. */
2548 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2549 && codec && !st->codec->codec)
2550 avcodec_open2(st->codec, codec, options ? &options[i]
2553 //try to just open decoders, in case this is enough to get parameters
2554 if (!has_codec_parameters(st, NULL)) {
2555 if (codec && !st->codec->codec)
2556 avcodec_open2(st->codec, codec, options ? &options[i]
2560 av_dict_free(&thread_opt);
2563 for (i=0; i<ic->nb_streams; i++) {
2564 #if FF_API_R_FRAME_RATE
2565 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2567 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
2568 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
2574 if (ff_check_interrupt(&ic->interrupt_callback)){
2576 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2580 /* check if one codec still needs to be handled */
2581 for(i=0;i<ic->nb_streams;i++) {
2582 int fps_analyze_framecount = 20;
2584 st = ic->streams[i];
2585 if (!has_codec_parameters(st, NULL))
2587 /* if the timebase is coarse (like the usual millisecond precision
2588 of mkv), we need to analyze more frames to reliably arrive at
2590 if (av_q2d(st->time_base) > 0.0005)
2591 fps_analyze_framecount *= 2;
2592 if (ic->fps_probe_size >= 0)
2593 fps_analyze_framecount = ic->fps_probe_size;
2594 /* variable fps and no guess at the real fps */
2595 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2596 && st->info->duration_count < fps_analyze_framecount
2597 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2599 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2601 if (st->first_dts == AV_NOPTS_VALUE &&
2602 (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2603 st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2606 if (i == ic->nb_streams) {
2607 /* NOTE: if the format has no header, then we need to read
2608 some packets to get most of the streams, so we cannot
2610 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2611 /* if we found the info for all the codecs, we can stop */
2613 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2618 /* we did not get all the codec info, but we read too much data */
2619 if (read_size >= ic->probesize) {
2621 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2622 for (i = 0; i < ic->nb_streams; i++)
2623 if (!ic->streams[i]->r_frame_rate.num &&
2624 ic->streams[i]->info->duration_count <= 1)
2625 av_log(ic, AV_LOG_WARNING,
2626 "Stream #%d: not enough frames to estimate rate; "
2627 "consider increasing probesize\n", i);
2631 /* NOTE: a new stream can be added there if no header in file
2632 (AVFMTCTX_NOHEADER) */
2633 ret = read_frame_internal(ic, &pkt1);
2634 if (ret == AVERROR(EAGAIN))
2642 if (ic->flags & AVFMT_FLAG_NOBUFFER) {
2645 pkt = add_to_pktbuf(&ic->packet_buffer, &pkt1,
2646 &ic->packet_buffer_end);
2647 if ((ret = av_dup_packet(pkt)) < 0)
2648 goto find_stream_info_err;
2651 read_size += pkt->size;
2653 st = ic->streams[pkt->stream_index];
2654 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
2655 /* check for non-increasing dts */
2656 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
2657 st->info->fps_last_dts >= pkt->dts) {
2658 av_log(ic, AV_LOG_DEBUG, "Non-increasing DTS in stream %d: "
2659 "packet %d with DTS %"PRId64", packet %d with DTS "
2660 "%"PRId64"\n", st->index, st->info->fps_last_dts_idx,
2661 st->info->fps_last_dts, st->codec_info_nb_frames, pkt->dts);
2662 st->info->fps_first_dts = st->info->fps_last_dts = AV_NOPTS_VALUE;
2664 /* check for a discontinuity in dts - if the difference in dts
2665 * is more than 1000 times the average packet duration in the sequence,
2666 * we treat it as a discontinuity */
2667 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
2668 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
2669 (pkt->dts - st->info->fps_last_dts) / 1000 >
2670 (st->info->fps_last_dts - st->info->fps_first_dts) / (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
2671 av_log(ic, AV_LOG_WARNING, "DTS discontinuity in stream %d: "
2672 "packet %d with DTS %"PRId64", packet %d with DTS "
2673 "%"PRId64"\n", st->index, st->info->fps_last_dts_idx,
2674 st->info->fps_last_dts, st->codec_info_nb_frames, pkt->dts);
2675 st->info->fps_first_dts = st->info->fps_last_dts = AV_NOPTS_VALUE;
2678 /* update stored dts values */
2679 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
2680 st->info->fps_first_dts = pkt->dts;
2681 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
2683 st->info->fps_last_dts = pkt->dts;
2684 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
2686 if (st->codec_info_nb_frames>1) {
2688 if (st->time_base.den > 0)
2689 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
2690 if (st->avg_frame_rate.num > 0)
2691 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
2693 if (t >= ic->max_analyze_duration) {
2694 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2697 st->info->codec_info_duration += pkt->duration;
2699 #if FF_API_R_FRAME_RATE
2701 int64_t last = st->info->last_dts;
2703 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2704 double dts= (is_relative(pkt->dts) ? pkt->dts - RELATIVE_TS_BASE : pkt->dts) * av_q2d(st->time_base);
2705 int64_t duration= pkt->dts - last;
2707 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2708 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
2709 for (i=0; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) {
2710 int framerate= get_std_framerate(i);
2711 double sdts= dts*framerate/(1001*12);
2713 int ticks= lrintf(sdts+j*0.5);
2714 double error= sdts - ticks + j*0.5;
2715 st->info->duration_error[j][0][i] += error;
2716 st->info->duration_error[j][1][i] += error*error;
2719 st->info->duration_count++;
2720 // ignore the first 4 values, they might have some random jitter
2721 if (st->info->duration_count > 3)
2722 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2724 if (pkt->dts != AV_NOPTS_VALUE)
2725 st->info->last_dts = pkt->dts;
2728 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2729 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2730 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
2731 st->codec->extradata_size= i;
2732 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2733 if (!st->codec->extradata)
2734 return AVERROR(ENOMEM);
2735 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2736 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2740 /* if still no information, we try to open the codec and to
2741 decompress the frame. We try to avoid that in most cases as
2742 it takes longer and uses more memory. For MPEG-4, we need to
2743 decompress for QuickTime.
2745 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2746 least one frame of codec data, this makes sure the codec initializes
2747 the channel configuration and does not only trust the values from the container.
2749 try_decode_frame(st, pkt, (options && i < orig_nb_streams ) ? &options[i] : NULL);
2751 st->codec_info_nb_frames++;
2756 AVPacket empty_pkt = { 0 };
2758 av_init_packet(&empty_pkt);
2760 ret = -1; /* we could not have all the codec parameters before EOF */
2761 for(i=0;i<ic->nb_streams;i++) {
2764 st = ic->streams[i];
2766 /* flush the decoders */
2767 if (st->info->found_decoder == 1) {
2769 err = try_decode_frame(st, &empty_pkt,
2770 (options && i < orig_nb_streams) ?
2771 &options[i] : NULL);
2772 } while (err > 0 && !has_codec_parameters(st, NULL));
2775 av_log(ic, AV_LOG_INFO,
2776 "decoding for stream %d failed\n", st->index);
2780 if (!has_codec_parameters(st, &errmsg)) {
2782 avcodec_string(buf, sizeof(buf), st->codec, 0);
2783 av_log(ic, AV_LOG_WARNING,
2784 "Could not find codec parameters for stream %d (%s): %s\n"
2785 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
2793 // close codecs which were opened in try_decode_frame()
2794 for(i=0;i<ic->nb_streams;i++) {
2795 st = ic->streams[i];
2796 avcodec_close(st->codec);
2798 for(i=0;i<ic->nb_streams;i++) {
2799 st = ic->streams[i];
2800 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2801 if(st->codec->codec_id == AV_CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2802 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2803 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2804 st->codec->codec_tag= tag;
2807 /* estimate average framerate if not set by demuxer */
2808 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration) {
2810 double best_error = 0.01;
2812 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2813 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2814 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2816 /* round guessed framerate to a "standard" framerate if it's
2817 * within 1% of the original estimate*/
2818 for (j = 1; j < MAX_STD_TIMEBASES; j++) {
2819 AVRational std_fps = { get_std_framerate(j), 12*1001 };
2820 double error = fabs(av_q2d(st->avg_frame_rate) / av_q2d(std_fps) - 1);
2822 if (error < best_error) {
2824 best_fps = std_fps.num;
2828 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2829 best_fps, 12*1001, INT_MAX);
2832 // the check for tb_unreliable() is not completely correct, since this is not about handling
2833 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2834 // ipmovie.c produces.
2835 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
2836 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);
2837 if (st->info->duration_count && !st->r_frame_rate.num
2838 && tb_unreliable(st->codec)) {
2840 double best_error= 0.01;
2842 for (j=0; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) {
2845 if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2847 if(!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
2850 int n= st->info->duration_count;
2851 double a= st->info->duration_error[k][0][j] / n;
2852 double error= st->info->duration_error[k][1][j]/n - a*a;
2854 if(error < best_error && best_error> 0.000000001){
2856 num = get_std_framerate(j);
2859 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2862 // do not increase frame rate by more than 1 % in order to match a standard rate.
2863 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2864 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2867 if (!st->r_frame_rate.num){
2868 if( st->codec->time_base.den * (int64_t)st->time_base.num
2869 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2870 st->r_frame_rate.num = st->codec->time_base.den;
2871 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2873 st->r_frame_rate.num = st->time_base.den;
2874 st->r_frame_rate.den = st->time_base.num;
2877 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2878 if(!st->codec->bits_per_coded_sample)
2879 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2880 // set stream disposition based on audio service type
2881 switch (st->codec->audio_service_type) {
2882 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2883 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2884 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2885 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2886 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2887 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2888 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2889 st->disposition = AV_DISPOSITION_COMMENT; break;
2890 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2891 st->disposition = AV_DISPOSITION_KARAOKE; break;
2897 estimate_timings(ic, old_offset);
2899 compute_chapters_end(ic);
2901 find_stream_info_err:
2902 for (i=0; i < ic->nb_streams; i++) {
2903 if (ic->streams[i]->codec)
2904 ic->streams[i]->codec->thread_count = 0;
2905 av_freep(&ic->streams[i]->info);
2908 av_log(ic, AV_LOG_DEBUG, "File position after avformat_find_stream_info() is %"PRId64"\n", avio_tell(ic->pb));
2912 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2916 for (i = 0; i < ic->nb_programs; i++) {
2917 if (ic->programs[i] == last) {
2921 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2922 if (ic->programs[i]->stream_index[j] == s)
2923 return ic->programs[i];
2929 int av_find_best_stream(AVFormatContext *ic,
2930 enum AVMediaType type,
2931 int wanted_stream_nb,
2933 AVCodec **decoder_ret,
2936 int i, nb_streams = ic->nb_streams;
2937 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2938 unsigned *program = NULL;
2939 AVCodec *decoder = NULL, *best_decoder = NULL;
2941 if (related_stream >= 0 && wanted_stream_nb < 0) {
2942 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2944 program = p->stream_index;
2945 nb_streams = p->nb_stream_indexes;
2948 for (i = 0; i < nb_streams; i++) {
2949 int real_stream_index = program ? program[i] : i;
2950 AVStream *st = ic->streams[real_stream_index];
2951 AVCodecContext *avctx = st->codec;
2952 if (avctx->codec_type != type)
2954 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2956 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2959 decoder = avcodec_find_decoder(st->codec->codec_id);
2962 ret = AVERROR_DECODER_NOT_FOUND;
2966 if (best_count >= st->codec_info_nb_frames)
2968 best_count = st->codec_info_nb_frames;
2969 ret = real_stream_index;
2970 best_decoder = decoder;
2971 if (program && i == nb_streams - 1 && ret < 0) {
2973 nb_streams = ic->nb_streams;
2974 i = 0; /* no related stream found, try again with everything */
2978 *decoder_ret = best_decoder;
2982 /*******************************************************/
2984 int av_read_play(AVFormatContext *s)
2986 if (s->iformat->read_play)
2987 return s->iformat->read_play(s);
2989 return avio_pause(s->pb, 0);
2990 return AVERROR(ENOSYS);
2993 int av_read_pause(AVFormatContext *s)
2995 if (s->iformat->read_pause)
2996 return s->iformat->read_pause(s);
2998 return avio_pause(s->pb, 1);
2999 return AVERROR(ENOSYS);
3002 void ff_free_stream(AVFormatContext *s, AVStream *st){
3003 av_assert0(s->nb_streams>0);
3004 av_assert0(s->streams[ s->nb_streams-1 ] == st);
3007 av_parser_close(st->parser);
3009 if (st->attached_pic.data)
3010 av_free_packet(&st->attached_pic);
3011 av_dict_free(&st->metadata);
3012 av_freep(&st->index_entries);
3013 av_freep(&st->codec->extradata);
3014 av_freep(&st->codec->subtitle_header);
3015 av_freep(&st->codec);
3016 av_freep(&st->priv_data);
3017 av_freep(&st->info);
3018 av_freep(&s->streams[ --s->nb_streams ]);
3021 void avformat_free_context(AVFormatContext *s)
3026 if (s->iformat && s->iformat->priv_class && s->priv_data)
3027 av_opt_free(s->priv_data);
3029 for(i=s->nb_streams-1; i>=0; i--) {
3030 ff_free_stream(s, s->streams[i]);
3032 for(i=s->nb_programs-1; i>=0; i--) {
3033 av_dict_free(&s->programs[i]->metadata);
3034 av_freep(&s->programs[i]->stream_index);
3035 av_freep(&s->programs[i]);
3037 av_freep(&s->programs);
3038 av_freep(&s->priv_data);
3039 while(s->nb_chapters--) {
3040 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
3041 av_freep(&s->chapters[s->nb_chapters]);
3043 av_freep(&s->chapters);
3044 av_dict_free(&s->metadata);
3045 av_freep(&s->streams);
3049 #if FF_API_CLOSE_INPUT_FILE
3050 void av_close_input_file(AVFormatContext *s)
3052 avformat_close_input(&s);
3056 void avformat_close_input(AVFormatContext **ps)
3058 AVFormatContext *s = *ps;
3059 AVIOContext *pb = (s->iformat && (s->iformat->flags & AVFMT_NOFILE)) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
3061 flush_packet_queue(s);
3062 if (s->iformat && (s->iformat->read_close))
3063 s->iformat->read_close(s);
3064 avformat_free_context(s);
3070 #if FF_API_NEW_STREAM
3071 AVStream *av_new_stream(AVFormatContext *s, int id)
3073 AVStream *st = avformat_new_stream(s, NULL);
3080 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
3086 if (s->nb_streams >= INT_MAX/sizeof(*streams))
3088 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
3091 s->streams = streams;
3093 st = av_mallocz(sizeof(AVStream));
3096 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
3100 st->info->last_dts = AV_NOPTS_VALUE;
3102 st->codec = avcodec_alloc_context3(c);
3104 /* no default bitrate if decoding */
3105 st->codec->bit_rate = 0;
3107 st->index = s->nb_streams;
3108 st->start_time = AV_NOPTS_VALUE;
3109 st->duration = AV_NOPTS_VALUE;
3110 /* we set the current DTS to 0 so that formats without any timestamps
3111 but durations get some timestamps, formats with some unknown
3112 timestamps have their first few packets buffered and the
3113 timestamps corrected before they are returned to the user */
3114 st->cur_dts = s->iformat ? RELATIVE_TS_BASE : 0;
3115 st->first_dts = AV_NOPTS_VALUE;
3116 st->probe_packets = MAX_PROBE_PACKETS;
3118 /* default pts setting is MPEG-like */
3119 avpriv_set_pts_info(st, 33, 1, 90000);
3120 st->last_IP_pts = AV_NOPTS_VALUE;
3121 for(i=0; i<MAX_REORDER_DELAY+1; i++)
3122 st->pts_buffer[i]= AV_NOPTS_VALUE;
3123 st->reference_dts = AV_NOPTS_VALUE;
3125 st->sample_aspect_ratio = (AVRational){0,1};
3127 #if FF_API_R_FRAME_RATE
3128 st->info->last_dts = AV_NOPTS_VALUE;
3130 st->info->fps_first_dts = AV_NOPTS_VALUE;
3131 st->info->fps_last_dts = AV_NOPTS_VALUE;
3133 s->streams[s->nb_streams++] = st;
3137 AVProgram *av_new_program(AVFormatContext *ac, int id)
3139 AVProgram *program=NULL;
3142 av_dlog(ac, "new_program: id=0x%04x\n", id);
3144 for(i=0; i<ac->nb_programs; i++)
3145 if(ac->programs[i]->id == id)
3146 program = ac->programs[i];
3149 program = av_mallocz(sizeof(AVProgram));
3152 dynarray_add(&ac->programs, &ac->nb_programs, program);
3153 program->discard = AVDISCARD_NONE;
3160 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
3162 AVChapter *chapter = NULL;
3165 for(i=0; i<s->nb_chapters; i++)
3166 if(s->chapters[i]->id == id)
3167 chapter = s->chapters[i];
3170 chapter= av_mallocz(sizeof(AVChapter));
3173 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
3175 av_dict_set(&chapter->metadata, "title", title, 0);
3177 chapter->time_base= time_base;
3178 chapter->start = start;
3184 /************************************************************/
3185 /* output media file */
3187 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
3188 const char *format, const char *filename)
3190 AVFormatContext *s = avformat_alloc_context();
3199 oformat = av_guess_format(format, NULL, NULL);
3201 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
3202 ret = AVERROR(EINVAL);
3206 oformat = av_guess_format(NULL, filename, NULL);
3208 ret = AVERROR(EINVAL);
3209 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
3216 s->oformat = oformat;
3217 if (s->oformat->priv_data_size > 0) {
3218 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3221 if (s->oformat->priv_class) {
3222 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3223 av_opt_set_defaults(s->priv_data);
3226 s->priv_data = NULL;
3229 av_strlcpy(s->filename, filename, sizeof(s->filename));
3233 av_log(s, AV_LOG_ERROR, "Out of memory\n");
3234 ret = AVERROR(ENOMEM);
3236 avformat_free_context(s);
3240 #if FF_API_ALLOC_OUTPUT_CONTEXT
3241 AVFormatContext *avformat_alloc_output_context(const char *format,
3242 AVOutputFormat *oformat, const char *filename)
3244 AVFormatContext *avctx;
3245 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
3246 return ret < 0 ? NULL : avctx;
3250 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
3252 const AVCodecTag *avctag;
3254 enum AVCodecID id = AV_CODEC_ID_NONE;
3255 unsigned int tag = 0;
3258 * Check that tag + id is in the table
3259 * If neither is in the table -> OK
3260 * If tag is in the table with another id -> FAIL
3261 * If id is in the table with another tag -> FAIL unless strict < normal
3263 for (n = 0; s->oformat->codec_tag[n]; n++) {
3264 avctag = s->oformat->codec_tag[n];
3265 while (avctag->id != AV_CODEC_ID_NONE) {
3266 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
3268 if (id == st->codec->codec_id)
3271 if (avctag->id == st->codec->codec_id)
3276 if (id != AV_CODEC_ID_NONE)
3278 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
3283 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
3287 AVDictionary *tmp = NULL;
3290 av_dict_copy(&tmp, *options, 0);
3291 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
3293 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
3294 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3297 // some sanity checks
3298 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
3299 av_log(s, AV_LOG_ERROR, "no streams\n");
3300 ret = AVERROR(EINVAL);
3304 for(i=0;i<s->nb_streams;i++) {
3307 switch (st->codec->codec_type) {
3308 case AVMEDIA_TYPE_AUDIO:
3309 if(st->codec->sample_rate<=0){
3310 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
3311 ret = AVERROR(EINVAL);
3314 if(!st->codec->block_align)
3315 st->codec->block_align = st->codec->channels *
3316 av_get_bits_per_sample(st->codec->codec_id) >> 3;
3318 case AVMEDIA_TYPE_VIDEO:
3319 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
3320 av_log(s, AV_LOG_ERROR, "time base not set\n");
3321 ret = AVERROR(EINVAL);
3324 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
3325 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
3326 ret = AVERROR(EINVAL);
3329 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
3330 && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
3332 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between muxer "
3333 "(%d/%d) and encoder layer (%d/%d)\n",
3334 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3335 st->codec->sample_aspect_ratio.num,
3336 st->codec->sample_aspect_ratio.den);
3337 ret = AVERROR(EINVAL);
3343 if(s->oformat->codec_tag){
3344 if( st->codec->codec_tag
3345 && st->codec->codec_id == AV_CODEC_ID_RAWVIDEO
3346 && (av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id) == 0 || av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id) ==MKTAG('r', 'a', 'w', ' '))
3347 && !validate_codec_tag(s, st)){
3348 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi/mov, we override it here
3349 st->codec->codec_tag= 0;
3351 if(st->codec->codec_tag){
3352 if (!validate_codec_tag(s, st)) {
3353 char tagbuf[32], cortag[32];
3354 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
3355 av_get_codec_tag_string(cortag, sizeof(cortag), av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id));
3356 av_log(s, AV_LOG_ERROR,
3357 "Tag %s/0x%08x incompatible with output codec id '%d' (%s)\n",
3358 tagbuf, st->codec->codec_tag, st->codec->codec_id, cortag);
3359 ret = AVERROR_INVALIDDATA;
3363 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3366 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3367 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3368 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3371 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3372 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3373 if (!s->priv_data) {
3374 ret = AVERROR(ENOMEM);
3377 if (s->oformat->priv_class) {
3378 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3379 av_opt_set_defaults(s->priv_data);
3380 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3385 /* set muxer identification string */
3386 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3387 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3390 if(s->oformat->write_header){
3391 ret = s->oformat->write_header(s);
3392 if (ret >= 0 && s->pb && s->pb->error < 0)
3398 /* init PTS generation */
3399 for(i=0;i<s->nb_streams;i++) {
3400 int64_t den = AV_NOPTS_VALUE;
3403 switch (st->codec->codec_type) {
3404 case AVMEDIA_TYPE_AUDIO:
3405 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3407 case AVMEDIA_TYPE_VIDEO:
3408 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3413 if (den != AV_NOPTS_VALUE) {
3415 ret = AVERROR_INVALIDDATA;
3418 frac_init(&st->pts, 0, 0, den);
3423 av_dict_free(options);
3432 //FIXME merge with compute_pkt_fields
3433 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3434 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3435 int num, den, frame_size, i;
3437 av_dlog(s, "compute_pkt_fields2: pts:%s dts:%s cur_dts:%s b:%d size:%d st:%d\n",
3438 av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), delay, pkt->size, pkt->stream_index);
3440 /* duration field */
3441 if (pkt->duration == 0) {
3442 compute_frame_duration(&num, &den, st, NULL, pkt);
3444 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3448 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3451 //XXX/FIXME this is a temporary hack until all encoders output pts
3452 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3455 av_log(s, AV_LOG_WARNING, "Encoder did not produce proper pts, making some up.\n");
3459 // pkt->pts= st->cur_dts;
3460 pkt->pts= st->pts.val;
3463 //calculate dts from pts
3464 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3465 st->pts_buffer[0]= pkt->pts;
3466 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3467 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3468 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3469 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3471 pkt->dts= st->pts_buffer[0];
3474 if (st->cur_dts && st->cur_dts != AV_NOPTS_VALUE &&
3475 ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) &&
3476 st->cur_dts >= pkt->dts) || st->cur_dts > pkt->dts)) {
3477 av_log(s, AV_LOG_ERROR,
3478 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %s >= %s\n",
3479 st->index, av_ts2str(st->cur_dts), av_ts2str(pkt->dts));
3480 return AVERROR(EINVAL);
3482 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3483 av_log(s, AV_LOG_ERROR, "pts (%s) < dts (%s) in stream %d\n",
3484 av_ts2str(pkt->pts), av_ts2str(pkt->dts), st->index);
3485 return AVERROR(EINVAL);
3488 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%s dts2:%s\n", av_ts2str(pkt->pts), av_ts2str(pkt->dts));
3489 st->cur_dts= pkt->dts;
3490 st->pts.val= pkt->dts;
3493 switch (st->codec->codec_type) {
3494 case AVMEDIA_TYPE_AUDIO:
3495 frame_size = get_audio_frame_size(st->codec, pkt->size, 1);
3497 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3498 likely equal to the encoder delay, but it would be better if we
3499 had the real timestamps from the encoder */
3500 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3501 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3504 case AVMEDIA_TYPE_VIDEO:
3505 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3513 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3518 if (s->oformat->flags & AVFMT_ALLOW_FLUSH) {
3519 ret = s->oformat->write_packet(s, pkt);
3520 if (ret >= 0 && s->pb && s->pb->error < 0)
3527 ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3529 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3532 ret= s->oformat->write_packet(s, pkt);
3533 if (ret >= 0 && s->pb && s->pb->error < 0)
3537 s->streams[pkt->stream_index]->nb_frames++;
3541 #define CHUNK_START 0x1000
3543 int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3544 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3546 AVPacketList **next_point, *this_pktl;
3547 AVStream *st= s->streams[pkt->stream_index];
3548 int chunked= s->max_chunk_size || s->max_chunk_duration;
3550 this_pktl = av_mallocz(sizeof(AVPacketList));
3552 return AVERROR(ENOMEM);
3553 this_pktl->pkt= *pkt;
3554 pkt->destruct= NULL; // do not free original but only the copy
3555 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3557 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3558 next_point = &(st->last_in_packet_buffer->next);
3560 next_point = &s->packet_buffer;
3565 uint64_t max= av_rescale_q(s->max_chunk_duration, AV_TIME_BASE_Q, st->time_base);
3566 if( st->interleaver_chunk_size + pkt->size <= s->max_chunk_size-1U
3567 && st->interleaver_chunk_duration + pkt->duration <= max-1U){
3568 st->interleaver_chunk_size += pkt->size;
3569 st->interleaver_chunk_duration += pkt->duration;
3572 st->interleaver_chunk_size =
3573 st->interleaver_chunk_duration = 0;
3574 this_pktl->pkt.flags |= CHUNK_START;
3578 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3580 && ((chunked && !((*next_point)->pkt.flags&CHUNK_START))
3581 || !compare(s, &(*next_point)->pkt, pkt))){
3582 next_point= &(*next_point)->next;
3587 next_point = &(s->packet_buffer_end->next);
3590 assert(!*next_point);
3592 s->packet_buffer_end= this_pktl;
3595 this_pktl->next= *next_point;
3597 s->streams[pkt->stream_index]->last_in_packet_buffer=
3598 *next_point= this_pktl;
3602 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3604 AVStream *st = s->streams[ pkt ->stream_index];
3605 AVStream *st2= s->streams[ next->stream_index];
3606 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3608 if(s->audio_preload && ((st->codec->codec_type == AVMEDIA_TYPE_AUDIO) != (st2->codec->codec_type == AVMEDIA_TYPE_AUDIO))){
3609 int64_t ts = av_rescale_q(pkt ->dts, st ->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st ->codec->codec_type == AVMEDIA_TYPE_AUDIO);
3610 int64_t ts2= av_rescale_q(next->dts, st2->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st2->codec->codec_type == AVMEDIA_TYPE_AUDIO);
3612 ts= ( pkt ->dts* st->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st ->codec->codec_type == AVMEDIA_TYPE_AUDIO)* st->time_base.den)*st2->time_base.den
3613 -( next->dts*st2->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st2->codec->codec_type == AVMEDIA_TYPE_AUDIO)*st2->time_base.den)* st->time_base.den;
3616 comp= (ts>ts2) - (ts<ts2);
3620 return pkt->stream_index < next->stream_index;
3624 int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
3625 AVPacket *pkt, int flush)
3628 int stream_count=0, noninterleaved_count=0;
3629 int64_t delta_dts_max = 0;
3633 ret = ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3638 for(i=0; i < s->nb_streams; i++) {
3639 if (s->streams[i]->last_in_packet_buffer) {
3641 } else if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3642 ++noninterleaved_count;
3646 if (s->nb_streams == stream_count) {
3649 for(i=0; i < s->nb_streams; i++) {
3650 if (s->streams[i]->last_in_packet_buffer) {
3652 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
3653 s->streams[i]->time_base,
3655 av_rescale_q(s->packet_buffer->pkt.dts,
3656 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
3658 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
3661 if(s->nb_streams == stream_count+noninterleaved_count &&
3662 delta_dts_max > 20*AV_TIME_BASE) {
3663 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
3667 if(stream_count && flush){
3668 pktl= s->packet_buffer;
3671 s->packet_buffer= pktl->next;
3672 if(!s->packet_buffer)
3673 s->packet_buffer_end= NULL;
3675 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3676 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3680 av_init_packet(out);
3685 #if FF_API_INTERLEAVE_PACKET
3686 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
3687 AVPacket *pkt, int flush)
3689 return ff_interleave_packet_per_dts(s, out, pkt, flush);
3694 * Interleave an AVPacket correctly so it can be muxed.
3695 * @param out the interleaved packet will be output here
3696 * @param in the input packet
3697 * @param flush 1 if no further packets are available as input and all
3698 * remaining packets should be output
3699 * @return 1 if a packet was output, 0 if no packet could be output,
3700 * < 0 if an error occurred
3702 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3703 if (s->oformat->interleave_packet) {
3704 int ret = s->oformat->interleave_packet(s, out, in, flush);
3709 return ff_interleave_packet_per_dts(s, out, in, flush);
3712 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3716 AVStream *st= s->streams[ pkt->stream_index];
3718 //FIXME/XXX/HACK drop zero sized packets
3719 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3722 av_dlog(s, "av_interleaved_write_frame size:%d dts:%s pts:%s\n",
3723 pkt->size, av_ts2str(pkt->dts), av_ts2str(pkt->pts));
3724 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3727 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3728 return AVERROR(EINVAL);
3730 av_dlog(s, "av_interleaved_write_frame FLUSH\n");
3736 int ret= interleave_packet(s, &opkt, pkt, flush);
3737 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3740 ret= s->oformat->write_packet(s, &opkt);
3742 s->streams[opkt.stream_index]->nb_frames++;
3744 av_free_packet(&opkt);
3749 if(s->pb && s->pb->error)
3750 return s->pb->error;
3754 int av_write_trailer(AVFormatContext *s)
3760 ret= interleave_packet(s, &pkt, NULL, 1);
3761 if(ret<0) //FIXME cleanup needed for ret<0 ?
3766 ret= s->oformat->write_packet(s, &pkt);
3768 s->streams[pkt.stream_index]->nb_frames++;
3770 av_free_packet(&pkt);
3774 if(s->pb && s->pb->error)
3778 if(s->oformat->write_trailer)
3779 ret = s->oformat->write_trailer(s);
3784 ret = s->pb ? s->pb->error : 0;
3785 for(i=0;i<s->nb_streams;i++) {
3786 av_freep(&s->streams[i]->priv_data);
3787 av_freep(&s->streams[i]->index_entries);
3789 if (s->oformat->priv_class)
3790 av_opt_free(s->priv_data);
3791 av_freep(&s->priv_data);
3795 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
3796 int64_t *dts, int64_t *wall)
3798 if (!s->oformat || !s->oformat->get_output_timestamp)
3799 return AVERROR(ENOSYS);
3800 s->oformat->get_output_timestamp(s, stream, dts, wall);
3804 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3807 AVProgram *program=NULL;
3810 if (idx >= ac->nb_streams) {
3811 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3815 for(i=0; i<ac->nb_programs; i++){
3816 if(ac->programs[i]->id != progid)
3818 program = ac->programs[i];
3819 for(j=0; j<program->nb_stream_indexes; j++)
3820 if(program->stream_index[j] == idx)
3823 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3826 program->stream_index = tmp;
3827 program->stream_index[program->nb_stream_indexes++] = idx;
3832 static void print_fps(double d, const char *postfix){
3833 uint64_t v= lrintf(d*100);
3834 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3835 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3836 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3839 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3841 if(m && !(av_dict_count(m) == 1 && av_dict_get(m, "language", NULL, 0))){
3842 AVDictionaryEntry *tag=NULL;
3844 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3845 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3846 if(strcmp("language", tag->key)){
3847 const char *p = tag->value;
3848 av_log(ctx, AV_LOG_INFO, "%s %-16s: ", indent, tag->key);
3851 size_t len = strcspn(p, "\x8\xa\xb\xc\xd");
3852 av_strlcpy(tmp, p, FFMIN(sizeof(tmp), len+1));
3853 av_log(ctx, AV_LOG_INFO, "%s", tmp);
3855 if (*p == 0xd) av_log(ctx, AV_LOG_INFO, " ");
3856 if (*p == 0xa) av_log(ctx, AV_LOG_INFO, "\n%s %-16s: ", indent, "");
3859 av_log(ctx, AV_LOG_INFO, "\n");
3865 /* "user interface" functions */
3866 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3869 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3870 AVStream *st = ic->streams[i];
3871 int g = av_gcd(st->time_base.num, st->time_base.den);
3872 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3873 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3874 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
3875 /* the pid is an important information, so we display it */
3876 /* XXX: add a generic system */
3877 if (flags & AVFMT_SHOW_IDS)
3878 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3880 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3881 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3882 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3883 if (st->sample_aspect_ratio.num && // default
3884 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3885 AVRational display_aspect_ratio;
3886 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3887 st->codec->width*st->sample_aspect_ratio.num,
3888 st->codec->height*st->sample_aspect_ratio.den,
3890 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3891 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3892 display_aspect_ratio.num, display_aspect_ratio.den);
3894 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3895 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3896 print_fps(av_q2d(st->avg_frame_rate), "fps");
3897 #if FF_API_R_FRAME_RATE
3898 if(st->r_frame_rate.den && st->r_frame_rate.num)
3899 print_fps(av_q2d(st->r_frame_rate), "tbr");
3901 if(st->time_base.den && st->time_base.num)
3902 print_fps(1/av_q2d(st->time_base), "tbn");
3903 if(st->codec->time_base.den && st->codec->time_base.num)
3904 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3906 if (st->disposition & AV_DISPOSITION_DEFAULT)
3907 av_log(NULL, AV_LOG_INFO, " (default)");
3908 if (st->disposition & AV_DISPOSITION_DUB)
3909 av_log(NULL, AV_LOG_INFO, " (dub)");
3910 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3911 av_log(NULL, AV_LOG_INFO, " (original)");
3912 if (st->disposition & AV_DISPOSITION_COMMENT)
3913 av_log(NULL, AV_LOG_INFO, " (comment)");
3914 if (st->disposition & AV_DISPOSITION_LYRICS)
3915 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3916 if (st->disposition & AV_DISPOSITION_KARAOKE)
3917 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3918 if (st->disposition & AV_DISPOSITION_FORCED)
3919 av_log(NULL, AV_LOG_INFO, " (forced)");
3920 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3921 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3922 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3923 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3924 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3925 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3926 av_log(NULL, AV_LOG_INFO, "\n");
3927 dump_metadata(NULL, st->metadata, " ");
3930 void av_dump_format(AVFormatContext *ic,
3936 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3937 if (ic->nb_streams && !printed)
3940 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3941 is_output ? "Output" : "Input",
3943 is_output ? ic->oformat->name : ic->iformat->name,
3944 is_output ? "to" : "from", url);
3945 dump_metadata(NULL, ic->metadata, " ");
3947 av_log(NULL, AV_LOG_INFO, " Duration: ");
3948 if (ic->duration != AV_NOPTS_VALUE) {
3949 int hours, mins, secs, us;
3950 secs = ic->duration / AV_TIME_BASE;
3951 us = ic->duration % AV_TIME_BASE;
3956 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3957 (100 * us) / AV_TIME_BASE);
3959 av_log(NULL, AV_LOG_INFO, "N/A");
3961 if (ic->start_time != AV_NOPTS_VALUE) {
3963 av_log(NULL, AV_LOG_INFO, ", start: ");
3964 secs = ic->start_time / AV_TIME_BASE;
3965 us = abs(ic->start_time % AV_TIME_BASE);
3966 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3967 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3969 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3971 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3973 av_log(NULL, AV_LOG_INFO, "N/A");
3975 av_log(NULL, AV_LOG_INFO, "\n");
3977 for (i = 0; i < ic->nb_chapters; i++) {
3978 AVChapter *ch = ic->chapters[i];
3979 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3980 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3981 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3983 dump_metadata(NULL, ch->metadata, " ");
3985 if(ic->nb_programs) {
3986 int j, k, total = 0;
3987 for(j=0; j<ic->nb_programs; j++) {
3988 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3990 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3991 name ? name->value : "");
3992 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3993 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3994 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3995 printed[ic->programs[j]->stream_index[k]] = 1;
3997 total += ic->programs[j]->nb_stream_indexes;
3999 if (total < ic->nb_streams)
4000 av_log(NULL, AV_LOG_INFO, " No Program\n");
4002 for(i=0;i<ic->nb_streams;i++)
4004 dump_stream_format(ic, i, index, is_output);
4009 #if FF_API_AV_GETTIME && CONFIG_SHARED && HAVE_SYMVER
4010 FF_SYMVER(int64_t, av_gettime, (void), "LIBAVFORMAT_54")
4012 return av_gettime();
4016 uint64_t ff_ntp_time(void)
4018 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
4021 int av_get_frame_filename(char *buf, int buf_size,
4022 const char *path, int number)
4025 char *q, buf1[20], c;
4026 int nd, len, percentd_found;
4038 while (isdigit(*p)) {
4039 nd = nd * 10 + *p++ - '0';
4042 } while (isdigit(c));
4051 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
4053 if ((q - buf + len) > buf_size - 1)
4055 memcpy(q, buf1, len);
4063 if ((q - buf) < buf_size - 1)
4067 if (!percentd_found)
4076 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
4080 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
4082 for(i=0;i<size;i+=16) {
4089 PRINT(" %02x", buf[i+j]);
4094 for(j=0;j<len;j++) {
4096 if (c < ' ' || c > '~')
4105 void av_hex_dump(FILE *f, uint8_t *buf, int size)
4107 hex_dump_internal(NULL, f, 0, buf, size);
4110 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
4112 hex_dump_internal(avcl, NULL, level, buf, size);
4115 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
4118 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
4119 PRINT("stream #%d:\n", pkt->stream_index);
4120 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
4121 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
4122 /* DTS is _always_ valid after av_read_frame() */
4124 if (pkt->dts == AV_NOPTS_VALUE)
4127 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
4128 /* PTS may not be known if B-frames are present. */
4130 if (pkt->pts == AV_NOPTS_VALUE)
4133 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
4135 PRINT(" size=%d\n", pkt->size);
4138 av_hex_dump(f, pkt->data, pkt->size);
4142 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
4144 AVRational tb = { 1, AV_TIME_BASE };
4145 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
4149 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
4151 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
4155 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
4157 AVRational tb = { 1, AV_TIME_BASE };
4158 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
4162 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
4165 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
4168 void av_url_split(char *proto, int proto_size,
4169 char *authorization, int authorization_size,
4170 char *hostname, int hostname_size,
4172 char *path, int path_size,
4175 const char *p, *ls, *ls2, *at, *col, *brk;
4177 if (port_ptr) *port_ptr = -1;
4178 if (proto_size > 0) proto[0] = 0;
4179 if (authorization_size > 0) authorization[0] = 0;
4180 if (hostname_size > 0) hostname[0] = 0;
4181 if (path_size > 0) path[0] = 0;
4183 /* parse protocol */
4184 if ((p = strchr(url, ':'))) {
4185 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4190 /* no protocol means plain filename */
4191 av_strlcpy(path, url, path_size);
4195 /* separate path from hostname */
4196 ls = strchr(p, '/');
4197 ls2 = strchr(p, '?');
4201 ls = FFMIN(ls, ls2);
4203 av_strlcpy(path, ls, path_size);
4205 ls = &p[strlen(p)]; // XXX
4207 /* the rest is hostname, use that to parse auth/port */
4209 /* authorization (user[:pass]@hostname) */
4210 if ((at = strchr(p, '@')) && at < ls) {
4211 av_strlcpy(authorization, p,
4212 FFMIN(authorization_size, at + 1 - p));
4213 p = at + 1; /* skip '@' */
4216 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4218 av_strlcpy(hostname, p + 1,
4219 FFMIN(hostname_size, brk - p));
4220 if (brk[1] == ':' && port_ptr)
4221 *port_ptr = atoi(brk + 2);
4222 } else if ((col = strchr(p, ':')) && col < ls) {
4223 av_strlcpy(hostname, p,
4224 FFMIN(col + 1 - p, hostname_size));
4225 if (port_ptr) *port_ptr = atoi(col + 1);
4227 av_strlcpy(hostname, p,
4228 FFMIN(ls + 1 - p, hostname_size));
4232 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4235 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4238 'C', 'D', 'E', 'F' };
4239 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4242 'c', 'd', 'e', 'f' };
4243 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4245 for(i = 0; i < s; i++) {
4246 buff[i * 2] = hex_table[src[i] >> 4];
4247 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4253 int ff_hex_to_data(uint8_t *data, const char *p)
4260 p += strspn(p, SPACE_CHARS);
4263 c = toupper((unsigned char) *p++);
4264 if (c >= '0' && c <= '9')
4266 else if (c >= 'A' && c <= 'F')
4281 #if FF_API_SET_PTS_INFO
4282 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
4283 unsigned int pts_num, unsigned int pts_den)
4285 avpriv_set_pts_info(s, pts_wrap_bits, pts_num, pts_den);
4289 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4290 unsigned int pts_num, unsigned int pts_den)
4293 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
4294 if(new_tb.num != pts_num)
4295 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
4297 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
4299 if(new_tb.num <= 0 || new_tb.den <= 0) {
4300 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase %d/%d for st:%d\n", new_tb.num, new_tb.den, s->index);
4303 s->time_base = new_tb;
4304 av_codec_set_pkt_timebase(s->codec, new_tb);
4305 s->pts_wrap_bits = pts_wrap_bits;
4308 int ff_url_join(char *str, int size, const char *proto,
4309 const char *authorization, const char *hostname,
4310 int port, const char *fmt, ...)
4313 struct addrinfo hints = { 0 }, *ai;
4318 av_strlcatf(str, size, "%s://", proto);
4319 if (authorization && authorization[0])
4320 av_strlcatf(str, size, "%s@", authorization);
4321 #if CONFIG_NETWORK && defined(AF_INET6)
4322 /* Determine if hostname is a numerical IPv6 address,
4323 * properly escape it within [] in that case. */
4324 hints.ai_flags = AI_NUMERICHOST;
4325 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
4326 if (ai->ai_family == AF_INET6) {
4327 av_strlcat(str, "[", size);
4328 av_strlcat(str, hostname, size);
4329 av_strlcat(str, "]", size);
4331 av_strlcat(str, hostname, size);
4336 /* Not an IPv6 address, just output the plain string. */
4337 av_strlcat(str, hostname, size);
4340 av_strlcatf(str, size, ":%d", port);
4343 int len = strlen(str);
4346 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
4352 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
4353 AVFormatContext *src)
4358 local_pkt.stream_index = dst_stream;
4359 if (pkt->pts != AV_NOPTS_VALUE)
4360 local_pkt.pts = av_rescale_q(pkt->pts,
4361 src->streams[pkt->stream_index]->time_base,
4362 dst->streams[dst_stream]->time_base);
4363 if (pkt->dts != AV_NOPTS_VALUE)
4364 local_pkt.dts = av_rescale_q(pkt->dts,
4365 src->streams[pkt->stream_index]->time_base,
4366 dst->streams[dst_stream]->time_base);
4367 return av_write_frame(dst, &local_pkt);
4370 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4373 const char *ptr = str;
4375 /* Parse key=value pairs. */
4378 char *dest = NULL, *dest_end;
4379 int key_len, dest_len = 0;
4381 /* Skip whitespace and potential commas. */
4382 while (*ptr && (isspace(*ptr) || *ptr == ','))
4389 if (!(ptr = strchr(key, '=')))
4392 key_len = ptr - key;
4394 callback_get_buf(context, key, key_len, &dest, &dest_len);
4395 dest_end = dest + dest_len - 1;
4399 while (*ptr && *ptr != '\"') {
4403 if (dest && dest < dest_end)
4407 if (dest && dest < dest_end)
4415 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
4416 if (dest && dest < dest_end)
4424 int ff_find_stream_index(AVFormatContext *s, int id)
4427 for (i = 0; i < s->nb_streams; i++) {
4428 if (s->streams[i]->id == id)
4434 void ff_make_absolute_url(char *buf, int size, const char *base,
4438 /* Absolute path, relative to the current server */
4439 if (base && strstr(base, "://") && rel[0] == '/') {
4441 av_strlcpy(buf, base, size);
4442 sep = strstr(buf, "://");
4445 sep = strchr(sep, '/');
4449 av_strlcat(buf, rel, size);
4452 /* If rel actually is an absolute url, just copy it */
4453 if (!base || strstr(rel, "://") || rel[0] == '/') {
4454 av_strlcpy(buf, rel, size);
4458 av_strlcpy(buf, base, size);
4459 /* Remove the file name from the base url */
4460 sep = strrchr(buf, '/');
4465 while (av_strstart(rel, "../", NULL) && sep) {
4466 /* Remove the path delimiter at the end */
4468 sep = strrchr(buf, '/');
4469 /* If the next directory name to pop off is "..", break here */
4470 if (!strcmp(sep ? &sep[1] : buf, "..")) {
4471 /* Readd the slash we just removed */
4472 av_strlcat(buf, "/", size);
4475 /* Cut off the directory name */
4482 av_strlcat(buf, rel, size);
4485 int64_t ff_iso8601_to_unix_time(const char *datestr)
4488 struct tm time1 = {0}, time2 = {0};
4490 ret1 = strptime(datestr, "%Y - %m - %d %T", &time1);
4491 ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2);
4493 return av_timegm(&time2);
4495 return av_timegm(&time1);
4497 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
4498 "the date string.\n");
4503 int avformat_query_codec(AVOutputFormat *ofmt, enum AVCodecID codec_id, int std_compliance)
4506 if (ofmt->query_codec)
4507 return ofmt->query_codec(codec_id, std_compliance);
4508 else if (ofmt->codec_tag)
4509 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4510 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4511 codec_id == ofmt->subtitle_codec)
4514 return AVERROR_PATCHWELCOME;
4517 int avformat_network_init(void)
4521 ff_network_inited_globally = 1;
4522 if ((ret = ff_network_init()) < 0)
4529 int avformat_network_deinit(void)
4538 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4539 uint64_t channel_layout, int32_t sample_rate,
4540 int32_t width, int32_t height)
4546 return AVERROR(EINVAL);
4549 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4551 if (channel_layout) {
4553 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4557 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4559 if (width || height) {
4561 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4563 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4565 return AVERROR(ENOMEM);
4566 bytestream_put_le32(&data, flags);
4568 bytestream_put_le32(&data, channels);
4570 bytestream_put_le64(&data, channel_layout);
4572 bytestream_put_le32(&data, sample_rate);
4573 if (width || height) {
4574 bytestream_put_le32(&data, width);
4575 bytestream_put_le32(&data, height);
4580 const struct AVCodecTag *avformat_get_riff_video_tags(void)
4582 return ff_codec_bmp_tags;
4584 const struct AVCodecTag *avformat_get_riff_audio_tags(void)
4586 return ff_codec_wav_tags;
4589 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
4591 AVRational undef = {0, 1};
4592 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
4593 AVRational codec_sample_aspect_ratio = stream && stream->codec ? stream->codec->sample_aspect_ratio : undef;
4594 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
4596 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
4597 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
4598 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
4599 stream_sample_aspect_ratio = undef;
4601 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
4602 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
4603 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
4604 frame_sample_aspect_ratio = undef;
4606 if (stream_sample_aspect_ratio.num)
4607 return stream_sample_aspect_ratio;
4609 return frame_sample_aspect_ratio;
4612 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
4615 if (*spec <= '9' && *spec >= '0') /* opt:index */
4616 return strtol(spec, NULL, 0) == st->index;
4617 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
4618 *spec == 't') { /* opt:[vasdt] */
4619 enum AVMediaType type;
4622 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
4623 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
4624 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
4625 case 'd': type = AVMEDIA_TYPE_DATA; break;
4626 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
4627 default: av_assert0(0);
4629 if (type != st->codec->codec_type)
4631 if (*spec++ == ':') { /* possibly followed by :index */
4632 int i, index = strtol(spec, NULL, 0);
4633 for (i = 0; i < s->nb_streams; i++)
4634 if (s->streams[i]->codec->codec_type == type && index-- == 0)
4635 return i == st->index;
4639 } else if (*spec == 'p' && *(spec + 1) == ':') {
4643 prog_id = strtol(spec, &endptr, 0);
4644 for (i = 0; i < s->nb_programs; i++) {
4645 if (s->programs[i]->id != prog_id)
4648 if (*endptr++ == ':') {
4649 int stream_idx = strtol(endptr, NULL, 0);
4650 return stream_idx >= 0 &&
4651 stream_idx < s->programs[i]->nb_stream_indexes &&
4652 st->index == s->programs[i]->stream_index[stream_idx];
4655 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
4656 if (st->index == s->programs[i]->stream_index[j])
4660 } else if (*spec == '#') {
4663 sid = strtol(spec + 1, &endptr, 0);
4665 return st->id == sid;
4666 } else if (!*spec) /* empty specifier, matches everything */
4669 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
4670 return AVERROR(EINVAL);