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"
41 #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) != 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 && !strcmp(fmt->name, short_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 CodecID 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 CodecID codec_id= 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 == 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 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 size= ffio_limit(s, size);
302 ret= av_new_packet(pkt, size);
307 pkt->pos= avio_tell(s);
309 ret= avio_read(s, pkt->data, size);
313 av_shrink_packet(pkt, ret);
318 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
323 return av_get_packet(s, pkt, size);
324 old_size = pkt->size;
325 ret = av_grow_packet(pkt, size);
328 ret = avio_read(s, pkt->data + old_size, size);
329 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
334 int av_filename_number_test(const char *filename)
337 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
340 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
342 AVProbeData lpd = *pd;
343 AVInputFormat *fmt1 = NULL, *fmt;
344 int score, nodat = 0, score_max=0;
346 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
347 int id3len = ff_id3v2_tag_len(lpd.buf);
348 if (lpd.buf_size > id3len + 16) {
350 lpd.buf_size -= id3len;
356 while ((fmt1 = av_iformat_next(fmt1))) {
357 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
360 if (fmt1->read_probe) {
361 score = fmt1->read_probe(&lpd);
362 if(fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
363 score = FFMAX(score, nodat ? AVPROBE_SCORE_MAX/4-1 : 1);
364 } else if (fmt1->extensions) {
365 if (av_match_ext(lpd.filename, fmt1->extensions)) {
369 if (score > score_max) {
372 }else if (score == score_max)
375 *score_ret= score_max;
380 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
383 AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
384 if(score_ret > *score_max){
385 *score_max= score_ret;
391 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
393 return av_probe_input_format2(pd, is_opened, &score);
396 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
398 static const struct {
399 const char *name; enum CodecID id; enum AVMediaType type;
401 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
402 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
403 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
404 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
405 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
406 { "loas" , CODEC_ID_AAC_LATM , AVMEDIA_TYPE_AUDIO },
407 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
408 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
409 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
413 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
417 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
418 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
419 for (i = 0; fmt_id_type[i].name; i++) {
420 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
421 st->codec->codec_id = fmt_id_type[i].id;
422 st->codec->codec_type = fmt_id_type[i].type;
430 /************************************************************/
431 /* input media file */
433 int av_demuxer_open(AVFormatContext *ic){
436 if (ic->iformat->read_header) {
437 err = ic->iformat->read_header(ic);
442 if (ic->pb && !ic->data_offset)
443 ic->data_offset = avio_tell(ic->pb);
449 /** size of probe buffer, for guessing file type from file contents */
450 #define PROBE_BUF_MIN 2048
451 #define PROBE_BUF_MAX (1<<20)
453 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
454 const char *filename, void *logctx,
455 unsigned int offset, unsigned int max_probe_size)
457 AVProbeData pd = { filename ? filename : "", NULL, -offset };
458 unsigned char *buf = NULL;
459 int ret = 0, probe_size;
461 if (!max_probe_size) {
462 max_probe_size = PROBE_BUF_MAX;
463 } else if (max_probe_size > PROBE_BUF_MAX) {
464 max_probe_size = PROBE_BUF_MAX;
465 } else if (max_probe_size < PROBE_BUF_MIN) {
466 return AVERROR(EINVAL);
469 if (offset >= max_probe_size) {
470 return AVERROR(EINVAL);
473 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
474 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
475 int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
476 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
479 if (probe_size < offset) {
483 /* read probe data */
484 buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
487 return AVERROR(ENOMEM);
490 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
491 /* fail if error was not end of file, otherwise, lower score */
492 if (ret != AVERROR_EOF) {
497 ret = 0; /* error was end of file, nothing read */
500 pd.buf = &buf[offset];
502 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
504 /* guess file format */
505 *fmt = av_probe_input_format2(&pd, 1, &score);
507 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
508 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
510 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
516 return AVERROR_INVALIDDATA;
519 /* rewind. reuse probe buffer to avoid seeking */
520 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
526 /* open input file and probe the format if necessary */
527 static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)
530 AVProbeData pd = {filename, NULL, 0};
533 s->flags |= AVFMT_FLAG_CUSTOM_IO;
535 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
536 else if (s->iformat->flags & AVFMT_NOFILE)
537 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
538 "will be ignored with AVFMT_NOFILE format.\n");
542 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
543 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
546 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ | s->avio_flags,
547 &s->interrupt_callback, options)) < 0)
551 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
554 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
555 AVPacketList **plast_pktl){
556 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
561 (*plast_pktl)->next = pktl;
563 *packet_buffer = pktl;
565 /* add the packet in the buffered packet list */
571 static void queue_attached_pictures(AVFormatContext *s)
574 for (i = 0; i < s->nb_streams; i++)
575 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
576 s->streams[i]->discard < AVDISCARD_ALL) {
577 AVPacket copy = s->streams[i]->attached_pic;
578 copy.destruct = NULL;
579 add_to_pktbuf(&s->raw_packet_buffer, ©, &s->raw_packet_buffer_end);
583 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
585 AVFormatContext *s = *ps;
587 AVDictionary *tmp = NULL;
588 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
590 if (!s && !(s = avformat_alloc_context()))
591 return AVERROR(ENOMEM);
596 av_dict_copy(&tmp, *options, 0);
598 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
601 if ((ret = init_input(s, filename, &tmp)) < 0)
604 /* check filename in case an image number is expected */
605 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
606 if (!av_filename_number_test(filename)) {
607 ret = AVERROR(EINVAL);
612 s->duration = s->start_time = AV_NOPTS_VALUE;
613 av_strlcpy(s->filename, filename, sizeof(s->filename));
615 /* allocate private data */
616 if (s->iformat->priv_data_size > 0) {
617 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
618 ret = AVERROR(ENOMEM);
621 if (s->iformat->priv_class) {
622 *(const AVClass**)s->priv_data = s->iformat->priv_class;
623 av_opt_set_defaults(s->priv_data);
624 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
629 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
631 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
633 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
634 if ((ret = s->iformat->read_header(s)) < 0)
637 if (id3v2_extra_meta &&
638 (ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
640 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
642 queue_attached_pictures(s);
644 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
645 s->data_offset = avio_tell(s->pb);
647 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
650 av_dict_free(options);
657 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
659 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
661 avformat_free_context(s);
666 /*******************************************************/
668 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
674 AVPacketList *pktl = s->raw_packet_buffer;
678 if(s->streams[pkt->stream_index]->request_probe <= 0){
679 s->raw_packet_buffer = pktl->next;
680 s->raw_packet_buffer_remaining_size += pkt->size;
687 ret= s->iformat->read_packet(s, pkt);
689 if (!pktl || ret == AVERROR(EAGAIN))
691 for (i = 0; i < s->nb_streams; i++)
692 if(s->streams[i]->request_probe > 0)
693 s->streams[i]->request_probe = -1;
697 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
698 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
699 av_log(s, AV_LOG_WARNING,
700 "Dropped corrupted packet (stream = %d)\n",
706 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
707 av_packet_merge_side_data(pkt);
709 if(pkt->stream_index >= (unsigned)s->nb_streams){
710 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
714 st= s->streams[pkt->stream_index];
716 switch(st->codec->codec_type){
717 case AVMEDIA_TYPE_VIDEO:
718 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
720 case AVMEDIA_TYPE_AUDIO:
721 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
723 case AVMEDIA_TYPE_SUBTITLE:
724 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
728 if(!pktl && st->request_probe <= 0)
731 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
732 s->raw_packet_buffer_remaining_size -= pkt->size;
734 if(st->request_probe>0){
735 AVProbeData *pd = &st->probe_data;
737 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
740 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
741 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
742 pd->buf_size += pkt->size;
743 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
745 end= s->raw_packet_buffer_remaining_size <= 0
746 || st->probe_packets<=0;
748 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
749 int score= set_codec_from_probe_data(s, st, pd);
750 if( (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
754 st->request_probe= -1;
755 if(st->codec->codec_id != CODEC_ID_NONE){
756 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
758 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
765 #if FF_API_READ_PACKET
766 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
768 return ff_read_packet(s, pkt);
773 /**********************************************************/
775 static int determinable_frame_size(AVCodecContext *avctx)
777 if (/*avctx->codec_id == CODEC_ID_AAC ||*/
778 avctx->codec_id == CODEC_ID_MP1 ||
779 avctx->codec_id == CODEC_ID_MP2 ||
780 avctx->codec_id == CODEC_ID_MP3/* ||
781 avctx->codec_id == CODEC_ID_CELT*/)
787 * Get the number of samples of an audio frame. Return -1 on error.
789 static int get_audio_frame_size(AVCodecContext *enc, int size, int mux)
793 /* give frame_size priority if demuxing */
794 if (!mux && enc->frame_size > 1)
795 return enc->frame_size;
797 if ((frame_size = av_get_audio_frame_duration(enc, size)) > 0)
800 /* fallback to using frame_size if muxing */
801 if (enc->frame_size > 1)
802 return enc->frame_size;
809 * Return the frame duration in seconds. Return 0 if not available.
811 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
812 AVCodecParserContext *pc, AVPacket *pkt)
818 switch(st->codec->codec_type) {
819 case AVMEDIA_TYPE_VIDEO:
820 if (st->r_frame_rate.num && !pc) {
821 *pnum = st->r_frame_rate.den;
822 *pden = st->r_frame_rate.num;
823 } else if(st->time_base.num*1000LL > st->time_base.den) {
824 *pnum = st->time_base.num;
825 *pden = st->time_base.den;
826 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
827 *pnum = st->codec->time_base.num;
828 *pden = st->codec->time_base.den;
829 if (pc && pc->repeat_pict) {
830 *pnum = (*pnum) * (1 + pc->repeat_pict);
832 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
833 //Thus if we have no parser in such case leave duration undefined.
834 if(st->codec->ticks_per_frame>1 && !pc){
839 case AVMEDIA_TYPE_AUDIO:
840 frame_size = get_audio_frame_size(st->codec, pkt->size, 0);
841 if (frame_size <= 0 || st->codec->sample_rate <= 0)
844 *pden = st->codec->sample_rate;
851 static int is_intra_only(AVCodecContext *enc){
852 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
854 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
855 switch(enc->codec_id){
857 case CODEC_ID_MJPEGB:
859 case CODEC_ID_PRORES:
860 case CODEC_ID_RAWVIDEO:
862 case CODEC_ID_DVVIDEO:
863 case CODEC_ID_HUFFYUV:
864 case CODEC_ID_FFVHUFF:
869 case CODEC_ID_JPEG2000:
870 case CODEC_ID_UTVIDEO:
878 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
882 if (pktl == s->parse_queue_end)
883 return s->packet_buffer;
887 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
888 int64_t dts, int64_t pts)
890 AVStream *st= s->streams[stream_index];
891 AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
893 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE || is_relative(dts))
896 st->first_dts= dts - (st->cur_dts - RELATIVE_TS_BASE);
899 if (is_relative(pts))
900 pts += st->first_dts - RELATIVE_TS_BASE;
902 for(; pktl; pktl= get_next_pkt(s, st, pktl)){
903 if(pktl->pkt.stream_index != stream_index)
905 if(is_relative(pktl->pkt.pts))
906 pktl->pkt.pts += st->first_dts - RELATIVE_TS_BASE;
908 if(is_relative(pktl->pkt.dts))
909 pktl->pkt.dts += st->first_dts - RELATIVE_TS_BASE;
911 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
912 st->start_time= pktl->pkt.pts;
914 if (st->start_time == AV_NOPTS_VALUE)
915 st->start_time = pts;
918 static void update_initial_durations(AVFormatContext *s, AVStream *st,
919 int stream_index, int duration)
921 AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
922 int64_t cur_dts= RELATIVE_TS_BASE;
924 if(st->first_dts != AV_NOPTS_VALUE){
925 cur_dts= st->first_dts;
926 for(; pktl; pktl= get_next_pkt(s, st, pktl)){
927 if(pktl->pkt.stream_index == stream_index){
928 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
933 pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
934 st->first_dts = cur_dts;
935 }else if(st->cur_dts != RELATIVE_TS_BASE)
938 for(; pktl; pktl= get_next_pkt(s, st, pktl)){
939 if(pktl->pkt.stream_index != stream_index)
941 if(pktl->pkt.pts == pktl->pkt.dts && (pktl->pkt.dts == AV_NOPTS_VALUE || pktl->pkt.dts == st->first_dts)
942 && !pktl->pkt.duration){
943 pktl->pkt.dts= cur_dts;
944 if(!st->codec->has_b_frames)
945 pktl->pkt.pts= cur_dts;
946 // if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
947 pktl->pkt.duration = duration;
950 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
953 st->cur_dts= cur_dts;
956 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
957 AVCodecParserContext *pc, AVPacket *pkt)
959 int num, den, presentation_delayed, delay, i;
962 if (s->flags & AVFMT_FLAG_NOFILLIN)
965 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
966 pkt->dts= AV_NOPTS_VALUE;
968 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
969 //FIXME Set low_delay = 0 when has_b_frames = 1
970 st->codec->has_b_frames = 1;
972 /* do we have a video B-frame ? */
973 delay= st->codec->has_b_frames;
974 presentation_delayed = 0;
976 /* XXX: need has_b_frame, but cannot get it if the codec is
979 pc && pc->pict_type != AV_PICTURE_TYPE_B)
980 presentation_delayed = 1;
982 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){
983 pkt->dts -= 1LL<<st->pts_wrap_bits;
986 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
987 // we take the conservative approach and discard both
988 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
989 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
990 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
991 pkt->dts= AV_NOPTS_VALUE;
994 if (pkt->duration == 0) {
995 compute_frame_duration(&num, &den, st, pc, pkt);
997 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1000 if(pkt->duration != 0 && (s->packet_buffer || s->parse_queue))
1001 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1003 /* correct timestamps with byte offset if demuxers only have timestamps
1004 on packet boundaries */
1005 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1006 /* this will estimate bitrate based on this frame's duration and size */
1007 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1008 if(pkt->pts != AV_NOPTS_VALUE)
1010 if(pkt->dts != AV_NOPTS_VALUE)
1014 if (pc && pc->dts_sync_point >= 0) {
1015 // we have synchronization info from the parser
1016 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1018 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1019 if (pkt->dts != AV_NOPTS_VALUE) {
1020 // got DTS from the stream, update reference timestamp
1021 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1022 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1023 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1024 // compute DTS based on reference timestamp
1025 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1026 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1028 if (pc->dts_sync_point > 0)
1029 st->reference_dts = pkt->dts; // new reference
1033 /* This may be redundant, but it should not hurt. */
1034 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1035 presentation_delayed = 1;
1037 // av_log(NULL, AV_LOG_DEBUG, "IN delayed:%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64" st:%d pc:%p duration:%d\n", presentation_delayed, pkt->pts, pkt->dts, st->cur_dts, pkt->stream_index, pc, pkt->duration);
1038 /* interpolate PTS and DTS if they are not present */
1039 //We skip H264 currently because delay and has_b_frames are not reliably set
1040 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1041 if (presentation_delayed) {
1042 /* DTS = decompression timestamp */
1043 /* PTS = presentation timestamp */
1044 if (pkt->dts == AV_NOPTS_VALUE)
1045 pkt->dts = st->last_IP_pts;
1046 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1047 if (pkt->dts == AV_NOPTS_VALUE)
1048 pkt->dts = st->cur_dts;
1050 /* this is tricky: the dts must be incremented by the duration
1051 of the frame we are displaying, i.e. the last I- or P-frame */
1052 if (st->last_IP_duration == 0)
1053 st->last_IP_duration = pkt->duration;
1054 if(pkt->dts != AV_NOPTS_VALUE)
1055 st->cur_dts = pkt->dts + st->last_IP_duration;
1056 st->last_IP_duration = pkt->duration;
1057 st->last_IP_pts= pkt->pts;
1058 /* cannot compute PTS if not present (we can compute it only
1059 by knowing the future */
1060 } else if (pkt->pts != AV_NOPTS_VALUE ||
1061 pkt->dts != AV_NOPTS_VALUE ||
1063 int duration = pkt->duration;
1065 if(pkt->pts != AV_NOPTS_VALUE && duration){
1066 int64_t old_diff= FFABS(st->cur_dts - duration - pkt->pts);
1067 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1068 if(old_diff < new_diff && old_diff < (duration>>3)){
1069 pkt->pts += duration;
1070 // av_log(NULL, AV_LOG_DEBUG, "id:%d old:%"PRId64" new:%"PRId64" dur:%d cur:%"PRId64" size:%d\n", pkt->stream_index, old_diff, new_diff, pkt->duration, st->cur_dts, pkt->size);
1074 /* presentation is not delayed : PTS and DTS are the same */
1075 if(pkt->pts == AV_NOPTS_VALUE)
1076 pkt->pts = pkt->dts;
1077 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1078 if(pkt->pts == AV_NOPTS_VALUE)
1079 pkt->pts = st->cur_dts;
1080 pkt->dts = pkt->pts;
1081 if(pkt->pts != AV_NOPTS_VALUE)
1082 st->cur_dts = pkt->pts + duration;
1086 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1087 st->pts_buffer[0]= pkt->pts;
1088 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1089 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1090 if(pkt->dts == AV_NOPTS_VALUE)
1091 pkt->dts= st->pts_buffer[0];
1092 if(st->codec->codec_id == CODEC_ID_H264){ // we skipped it above so we try here
1093 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1095 if(pkt->dts > st->cur_dts)
1096 st->cur_dts = pkt->dts;
1099 // av_log(NULL, AV_LOG_ERROR, "OUTdelayed:%d/%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64"\n", presentation_delayed, delay, pkt->pts, pkt->dts, st->cur_dts);
1102 if(is_intra_only(st->codec))
1103 pkt->flags |= AV_PKT_FLAG_KEY;
1105 pkt->convergence_duration = pc->convergence_duration;
1108 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1111 AVPacketList *pktl = *pkt_buf;
1112 *pkt_buf = pktl->next;
1113 av_free_packet(&pktl->pkt);
1116 *pkt_buf_end = NULL;
1120 * Parse a packet, add all split parts to parse_queue
1122 * @param pkt packet to parse, NULL when flushing the parser at end of stream
1124 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1126 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1127 AVStream *st = s->streams[stream_index];
1128 uint8_t *data = pkt ? pkt->data : NULL;
1129 int size = pkt ? pkt->size : 0;
1130 int ret = 0, got_output = 0;
1133 av_init_packet(&flush_pkt);
1136 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1137 // preserve 0-size sync packets
1138 compute_pkt_fields(s, st, st->parser, pkt);
1141 while (size > 0 || (pkt == &flush_pkt && got_output)) {
1144 av_init_packet(&out_pkt);
1145 len = av_parser_parse2(st->parser, st->codec,
1146 &out_pkt.data, &out_pkt.size, data, size,
1147 pkt->pts, pkt->dts, pkt->pos);
1149 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1150 /* increment read pointer */
1154 got_output = !!out_pkt.size;
1159 /* set the duration */
1160 out_pkt.duration = 0;
1161 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1162 if (st->codec->sample_rate > 0) {
1163 out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
1164 (AVRational){ 1, st->codec->sample_rate },
1168 } else if (st->codec->time_base.num != 0 &&
1169 st->codec->time_base.den != 0) {
1170 out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
1171 st->codec->time_base,
1176 out_pkt.stream_index = st->index;
1177 out_pkt.pts = st->parser->pts;
1178 out_pkt.dts = st->parser->dts;
1179 out_pkt.pos = st->parser->pos;
1181 if (st->parser->key_frame == 1 ||
1182 (st->parser->key_frame == -1 &&
1183 st->parser->pict_type == AV_PICTURE_TYPE_I))
1184 out_pkt.flags |= AV_PKT_FLAG_KEY;
1186 compute_pkt_fields(s, st, st->parser, &out_pkt);
1188 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1189 out_pkt.flags & AV_PKT_FLAG_KEY) {
1190 int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? out_pkt.pos : st->parser->frame_offset;
1191 ff_reduce_index(s, st->index);
1192 av_add_index_entry(st, pos, out_pkt.dts,
1193 0, 0, AVINDEX_KEYFRAME);
1196 if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
1197 out_pkt.destruct = pkt->destruct;
1198 pkt->destruct = NULL;
1200 if ((ret = av_dup_packet(&out_pkt)) < 0)
1203 if (!add_to_pktbuf(&s->parse_queue, &out_pkt, &s->parse_queue_end)) {
1204 av_free_packet(&out_pkt);
1205 ret = AVERROR(ENOMEM);
1211 /* end of the stream => close and free the parser */
1212 if (pkt == &flush_pkt) {
1213 av_parser_close(st->parser);
1218 av_free_packet(pkt);
1222 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1223 AVPacketList **pkt_buffer_end,
1227 av_assert0(*pkt_buffer);
1230 *pkt_buffer = pktl->next;
1232 *pkt_buffer_end = NULL;
1237 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1239 int ret = 0, i, got_packet = 0;
1241 av_init_packet(pkt);
1243 while (!got_packet && !s->parse_queue) {
1247 /* read next packet */
1248 ret = ff_read_packet(s, &cur_pkt);
1250 if (ret == AVERROR(EAGAIN))
1252 /* flush the parsers */
1253 for(i = 0; i < s->nb_streams; i++) {
1255 if (st->parser && st->need_parsing)
1256 parse_packet(s, NULL, st->index);
1258 /* all remaining packets are now in parse_queue =>
1259 * really terminate parsing */
1263 st = s->streams[cur_pkt.stream_index];
1265 if (cur_pkt.pts != AV_NOPTS_VALUE &&
1266 cur_pkt.dts != AV_NOPTS_VALUE &&
1267 cur_pkt.pts < cur_pkt.dts) {
1268 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1269 cur_pkt.stream_index,
1274 if (s->debug & FF_FDEBUG_TS)
1275 av_log(s, AV_LOG_DEBUG, "ff_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1276 cur_pkt.stream_index,
1283 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1284 st->parser = av_parser_init(st->codec->codec_id);
1286 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1287 "%s, packets or times may be invalid.\n",
1288 avcodec_get_name(st->codec->codec_id));
1289 /* no parser available: just output the raw packets */
1290 st->need_parsing = AVSTREAM_PARSE_NONE;
1291 } else if(st->need_parsing == AVSTREAM_PARSE_HEADERS) {
1292 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1293 } else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE) {
1294 st->parser->flags |= PARSER_FLAG_ONCE;
1298 if (!st->need_parsing || !st->parser) {
1299 /* no parsing needed: we just output the packet as is */
1301 compute_pkt_fields(s, st, NULL, pkt);
1302 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1303 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1304 ff_reduce_index(s, st->index);
1305 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1308 } else if (st->discard < AVDISCARD_ALL) {
1309 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1313 av_free_packet(&cur_pkt);
1317 if (!got_packet && s->parse_queue)
1318 ret = read_from_packet_buffer(&s->parse_queue, &s->parse_queue_end, pkt);
1320 if(s->debug & FF_FDEBUG_TS)
1321 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1332 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1334 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1339 ret = s->packet_buffer ? read_from_packet_buffer(&s->packet_buffer,
1340 &s->packet_buffer_end,
1342 read_frame_internal(s, pkt);
1347 AVPacketList *pktl = s->packet_buffer;
1350 AVPacket *next_pkt = &pktl->pkt;
1352 if (next_pkt->dts != AV_NOPTS_VALUE) {
1353 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1354 // last dts seen for this stream. if any of packets following
1355 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1356 int64_t last_dts = next_pkt->dts;
1357 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1358 if (pktl->pkt.stream_index == next_pkt->stream_index &&
1359 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0)) {
1360 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1361 next_pkt->pts = pktl->pkt.dts;
1363 if (last_dts != AV_NOPTS_VALUE) {
1364 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1365 last_dts = pktl->pkt.dts;
1370 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1371 // Fixing the last reference frame had none pts issue (For MXF etc).
1372 // We only do this when
1374 // 2. we are not able to resolve a pts value for current packet.
1375 // 3. the packets for this stream at the end of the files had valid dts.
1376 next_pkt->pts = last_dts + next_pkt->duration;
1378 pktl = s->packet_buffer;
1381 /* read packet from packet buffer, if there is data */
1382 if (!(next_pkt->pts == AV_NOPTS_VALUE &&
1383 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1384 ret = read_from_packet_buffer(&s->packet_buffer,
1385 &s->packet_buffer_end, pkt);
1390 ret = read_frame_internal(s, pkt);
1392 if (pktl && ret != AVERROR(EAGAIN)) {
1399 if (av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1400 &s->packet_buffer_end)) < 0)
1401 return AVERROR(ENOMEM);
1405 if (is_relative(pkt->dts))
1406 pkt->dts -= RELATIVE_TS_BASE;
1407 if (is_relative(pkt->pts))
1408 pkt->pts -= RELATIVE_TS_BASE;
1412 /* XXX: suppress the packet queue */
1413 static void flush_packet_queue(AVFormatContext *s)
1415 free_packet_buffer(&s->parse_queue, &s->parse_queue_end);
1416 free_packet_buffer(&s->packet_buffer, &s->packet_buffer_end);
1417 free_packet_buffer(&s->raw_packet_buffer, &s->raw_packet_buffer_end);
1419 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1422 /*******************************************************/
1425 int av_find_default_stream_index(AVFormatContext *s)
1427 int first_audio_index = -1;
1431 if (s->nb_streams <= 0)
1433 for(i = 0; i < s->nb_streams; i++) {
1435 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1436 !(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
1439 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1440 first_audio_index = i;
1442 return first_audio_index >= 0 ? first_audio_index : 0;
1446 * Flush the frame reader.
1448 void ff_read_frame_flush(AVFormatContext *s)
1453 flush_packet_queue(s);
1455 /* for each stream, reset read state */
1456 for(i = 0; i < s->nb_streams; i++) {
1460 av_parser_close(st->parser);
1463 st->last_IP_pts = AV_NOPTS_VALUE;
1464 if(st->first_dts == AV_NOPTS_VALUE) st->cur_dts = RELATIVE_TS_BASE;
1465 else st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1466 st->reference_dts = AV_NOPTS_VALUE;
1468 st->probe_packets = MAX_PROBE_PACKETS;
1470 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1471 st->pts_buffer[j]= AV_NOPTS_VALUE;
1475 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1479 for(i = 0; i < s->nb_streams; i++) {
1480 AVStream *st = s->streams[i];
1482 st->cur_dts = av_rescale(timestamp,
1483 st->time_base.den * (int64_t)ref_st->time_base.num,
1484 st->time_base.num * (int64_t)ref_st->time_base.den);
1488 void ff_reduce_index(AVFormatContext *s, int stream_index)
1490 AVStream *st= s->streams[stream_index];
1491 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1493 if((unsigned)st->nb_index_entries >= max_entries){
1495 for(i=0; 2*i<st->nb_index_entries; i++)
1496 st->index_entries[i]= st->index_entries[2*i];
1497 st->nb_index_entries= i;
1501 int ff_add_index_entry(AVIndexEntry **index_entries,
1502 int *nb_index_entries,
1503 unsigned int *index_entries_allocated_size,
1504 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1506 AVIndexEntry *entries, *ie;
1509 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1512 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1513 timestamp -= RELATIVE_TS_BASE;
1515 entries = av_fast_realloc(*index_entries,
1516 index_entries_allocated_size,
1517 (*nb_index_entries + 1) *
1518 sizeof(AVIndexEntry));
1522 *index_entries= entries;
1524 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1527 index= (*nb_index_entries)++;
1528 ie= &entries[index];
1529 assert(index==0 || ie[-1].timestamp < timestamp);
1531 ie= &entries[index];
1532 if(ie->timestamp != timestamp){
1533 if(ie->timestamp <= timestamp)
1535 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1536 (*nb_index_entries)++;
1537 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1538 distance= ie->min_distance;
1542 ie->timestamp = timestamp;
1543 ie->min_distance= distance;
1550 int av_add_index_entry(AVStream *st,
1551 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1553 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1554 &st->index_entries_allocated_size, pos,
1555 timestamp, size, distance, flags);
1558 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1559 int64_t wanted_timestamp, int flags)
1567 //optimize appending index entries at the end
1568 if(b && entries[b-1].timestamp < wanted_timestamp)
1573 timestamp = entries[m].timestamp;
1574 if(timestamp >= wanted_timestamp)
1576 if(timestamp <= wanted_timestamp)
1579 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1581 if(!(flags & AVSEEK_FLAG_ANY)){
1582 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1583 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1592 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1595 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1596 wanted_timestamp, flags);
1599 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
1601 AVInputFormat *avif= s->iformat;
1602 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1603 int64_t ts_min, ts_max, ts;
1608 if (stream_index < 0)
1611 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1614 ts_min= AV_NOPTS_VALUE;
1615 pos_limit= -1; //gcc falsely says it may be uninitialized
1617 st= s->streams[stream_index];
1618 if(st->index_entries){
1621 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()
1622 index= FFMAX(index, 0);
1623 e= &st->index_entries[index];
1625 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1627 ts_min= e->timestamp;
1628 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1634 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1635 assert(index < st->nb_index_entries);
1637 e= &st->index_entries[index];
1638 assert(e->timestamp >= target_ts);
1640 ts_max= e->timestamp;
1641 pos_limit= pos_max - e->min_distance;
1642 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1643 pos_max,pos_limit, ts_max);
1647 pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1652 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1655 ff_read_frame_flush(s);
1656 ff_update_cur_dts(s, st, ts);
1661 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1662 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1663 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1664 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1667 int64_t start_pos, filesize;
1670 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1672 if(ts_min == AV_NOPTS_VALUE){
1673 pos_min = s->data_offset;
1674 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1675 if (ts_min == AV_NOPTS_VALUE)
1679 if(ts_min >= target_ts){
1684 if(ts_max == AV_NOPTS_VALUE){
1686 filesize = avio_size(s->pb);
1687 pos_max = filesize - 1;
1690 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1692 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1693 if (ts_max == AV_NOPTS_VALUE)
1697 int64_t tmp_pos= pos_max + 1;
1698 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1699 if(tmp_ts == AV_NOPTS_VALUE)
1703 if(tmp_pos >= filesize)
1709 if(ts_max <= target_ts){
1714 if(ts_min > ts_max){
1716 }else if(ts_min == ts_max){
1721 while (pos_min < pos_limit) {
1722 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1723 pos_min, pos_max, ts_min, ts_max);
1724 assert(pos_limit <= pos_max);
1727 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1728 // interpolate position (better than dichotomy)
1729 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1730 + pos_min - approximate_keyframe_distance;
1731 }else if(no_change==1){
1732 // bisection, if interpolation failed to change min or max pos last time
1733 pos = (pos_min + pos_limit)>>1;
1735 /* linear search if bisection failed, can only happen if there
1736 are very few or no keyframes between min/max */
1741 else if(pos > pos_limit)
1745 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1750 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1751 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1752 pos_limit, start_pos, no_change);
1753 if(ts == AV_NOPTS_VALUE){
1754 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1757 assert(ts != AV_NOPTS_VALUE);
1758 if (target_ts <= ts) {
1759 pos_limit = start_pos - 1;
1763 if (target_ts >= ts) {
1769 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1770 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1773 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1775 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1776 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1777 pos, ts_min, target_ts, ts_max);
1783 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1784 int64_t pos_min, pos_max;
1786 pos_min = s->data_offset;
1787 pos_max = avio_size(s->pb) - 1;
1789 if (pos < pos_min) pos= pos_min;
1790 else if(pos > pos_max) pos= pos_max;
1792 avio_seek(s->pb, pos, SEEK_SET);
1797 static int seek_frame_generic(AVFormatContext *s,
1798 int stream_index, int64_t timestamp, int flags)
1805 st = s->streams[stream_index];
1807 index = av_index_search_timestamp(st, timestamp, flags);
1809 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1812 if(index < 0 || index==st->nb_index_entries-1){
1816 if(st->nb_index_entries){
1817 assert(st->index_entries);
1818 ie= &st->index_entries[st->nb_index_entries-1];
1819 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1821 ff_update_cur_dts(s, st, ie->timestamp);
1823 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1829 read_status = av_read_frame(s, &pkt);
1830 } while (read_status == AVERROR(EAGAIN));
1831 if (read_status < 0)
1833 av_free_packet(&pkt);
1834 if(stream_index == pkt.stream_index && pkt.dts > timestamp){
1835 if(pkt.flags & AV_PKT_FLAG_KEY)
1837 if(nonkey++ > 1000 && st->codec->codec_id != CODEC_ID_CDGRAPHICS){
1838 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);
1843 index = av_index_search_timestamp(st, timestamp, flags);
1848 ff_read_frame_flush(s);
1849 AV_NOWARN_DEPRECATED(
1850 if (s->iformat->read_seek){
1851 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1855 ie = &st->index_entries[index];
1856 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1858 ff_update_cur_dts(s, st, ie->timestamp);
1863 static int seek_frame_internal(AVFormatContext *s, int stream_index,
1864 int64_t timestamp, int flags)
1869 if (flags & AVSEEK_FLAG_BYTE) {
1870 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1872 ff_read_frame_flush(s);
1873 return seek_frame_byte(s, stream_index, timestamp, flags);
1876 if(stream_index < 0){
1877 stream_index= av_find_default_stream_index(s);
1878 if(stream_index < 0)
1881 st= s->streams[stream_index];
1882 /* timestamp for default must be expressed in AV_TIME_BASE units */
1883 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1886 /* first, we try the format specific seek */
1887 AV_NOWARN_DEPRECATED(
1888 if (s->iformat->read_seek) {
1889 ff_read_frame_flush(s);
1890 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1898 if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1899 ff_read_frame_flush(s);
1900 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1901 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1902 ff_read_frame_flush(s);
1903 return seek_frame_generic(s, stream_index, timestamp, flags);
1909 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1911 int ret = seek_frame_internal(s, stream_index, timestamp, flags);
1914 queue_attached_pictures(s);
1919 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1921 if(min_ts > ts || max_ts < ts)
1924 if (s->iformat->read_seek2) {
1926 ff_read_frame_flush(s);
1927 ret = s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1930 queue_attached_pictures(s);
1934 if(s->iformat->read_timestamp){
1935 //try to seek via read_timestamp()
1938 //Fallback to old API if new is not implemented but old is
1939 //Note the old has somewat different sematics
1940 AV_NOWARN_DEPRECATED(
1941 if (s->iformat->read_seek || 1) {
1942 int dir = (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0);
1943 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
1944 if (ret<0 && ts != min_ts && max_ts != ts) {
1945 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
1947 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
1953 // try some generic seek like seek_frame_generic() but with new ts semantics
1956 /*******************************************************/
1959 * Return TRUE if the stream has accurate duration in any stream.
1961 * @return TRUE if the stream has accurate duration for at least one component.
1963 static int has_duration(AVFormatContext *ic)
1967 if(ic->duration != AV_NOPTS_VALUE)
1970 for(i = 0;i < ic->nb_streams; i++) {
1971 st = ic->streams[i];
1972 if (st->duration != AV_NOPTS_VALUE)
1979 * Estimate the stream timings from the one of each components.
1981 * Also computes the global bitrate if possible.
1983 static void update_stream_timings(AVFormatContext *ic)
1985 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1986 int64_t duration, duration1, filesize;
1990 start_time = INT64_MAX;
1991 start_time_text = INT64_MAX;
1992 end_time = INT64_MIN;
1993 duration = INT64_MIN;
1994 for(i = 0;i < ic->nb_streams; i++) {
1995 st = ic->streams[i];
1996 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1997 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1998 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1999 if (start_time1 < start_time_text)
2000 start_time_text = start_time1;
2002 start_time = FFMIN(start_time, start_time1);
2003 if (st->duration != AV_NOPTS_VALUE) {
2004 end_time1 = start_time1
2005 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
2006 end_time = FFMAX(end_time, end_time1);
2009 if (st->duration != AV_NOPTS_VALUE) {
2010 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
2011 duration = FFMAX(duration, duration1);
2014 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2015 start_time = start_time_text;
2016 if (start_time != INT64_MAX) {
2017 ic->start_time = start_time;
2018 if (end_time != INT64_MIN)
2019 duration = FFMAX(duration, end_time - start_time);
2021 if (duration != INT64_MIN && ic->duration == AV_NOPTS_VALUE) {
2022 ic->duration = duration;
2024 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
2025 /* compute the bitrate */
2026 ic->bit_rate = (double)filesize * 8.0 * AV_TIME_BASE /
2027 (double)ic->duration;
2031 static void fill_all_stream_timings(AVFormatContext *ic)
2036 update_stream_timings(ic);
2037 for(i = 0;i < ic->nb_streams; i++) {
2038 st = ic->streams[i];
2039 if (st->start_time == AV_NOPTS_VALUE) {
2040 if(ic->start_time != AV_NOPTS_VALUE)
2041 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
2042 if(ic->duration != AV_NOPTS_VALUE)
2043 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
2048 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2050 int64_t filesize, duration;
2054 /* if bit_rate is already set, we believe it */
2055 if (ic->bit_rate <= 0) {
2057 for(i=0;i<ic->nb_streams;i++) {
2058 st = ic->streams[i];
2059 if (st->codec->bit_rate > 0)
2060 bit_rate += st->codec->bit_rate;
2062 ic->bit_rate = bit_rate;
2065 /* if duration is already set, we believe it */
2066 if (ic->duration == AV_NOPTS_VALUE &&
2067 ic->bit_rate != 0) {
2068 filesize = ic->pb ? avio_size(ic->pb) : 0;
2070 for(i = 0; i < ic->nb_streams; i++) {
2071 st = ic->streams[i];
2072 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
2073 if (st->duration == AV_NOPTS_VALUE)
2074 st->duration = duration;
2080 #define DURATION_MAX_READ_SIZE 250000
2081 #define DURATION_MAX_RETRY 3
2083 /* only usable for MPEG-PS streams */
2084 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2086 AVPacket pkt1, *pkt = &pkt1;
2088 int read_size, i, ret;
2090 int64_t filesize, offset, duration;
2093 /* flush packet queue */
2094 flush_packet_queue(ic);
2096 for (i=0; i<ic->nb_streams; i++) {
2097 st = ic->streams[i];
2098 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
2099 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2102 av_parser_close(st->parser);
2107 /* estimate the end time (duration) */
2108 /* XXX: may need to support wrapping */
2109 filesize = ic->pb ? avio_size(ic->pb) : 0;
2110 end_time = AV_NOPTS_VALUE;
2112 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2116 avio_seek(ic->pb, offset, SEEK_SET);
2119 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2123 ret = ff_read_packet(ic, pkt);
2124 } while(ret == AVERROR(EAGAIN));
2127 read_size += pkt->size;
2128 st = ic->streams[pkt->stream_index];
2129 if (pkt->pts != AV_NOPTS_VALUE &&
2130 (st->start_time != AV_NOPTS_VALUE ||
2131 st->first_dts != AV_NOPTS_VALUE)) {
2132 duration = end_time = pkt->pts;
2133 if (st->start_time != AV_NOPTS_VALUE)
2134 duration -= st->start_time;
2136 duration -= st->first_dts;
2138 duration += 1LL<<st->pts_wrap_bits;
2140 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2141 st->duration = duration;
2144 av_free_packet(pkt);
2146 }while( end_time==AV_NOPTS_VALUE
2147 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2148 && ++retry <= DURATION_MAX_RETRY);
2150 fill_all_stream_timings(ic);
2152 avio_seek(ic->pb, old_offset, SEEK_SET);
2153 for (i=0; i<ic->nb_streams; i++) {
2155 st->cur_dts= st->first_dts;
2156 st->last_IP_pts = AV_NOPTS_VALUE;
2157 st->reference_dts = AV_NOPTS_VALUE;
2161 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2165 /* get the file size, if possible */
2166 if (ic->iformat->flags & AVFMT_NOFILE) {
2169 file_size = avio_size(ic->pb);
2170 file_size = FFMAX(0, file_size);
2173 if ((!strcmp(ic->iformat->name, "mpeg") ||
2174 !strcmp(ic->iformat->name, "mpegts")) &&
2175 file_size && ic->pb->seekable) {
2176 /* get accurate estimate from the PTSes */
2177 estimate_timings_from_pts(ic, old_offset);
2178 } else if (has_duration(ic)) {
2179 /* at least one component has timings - we use them for all
2181 fill_all_stream_timings(ic);
2183 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2184 /* less precise: use bitrate info */
2185 estimate_timings_from_bit_rate(ic);
2187 update_stream_timings(ic);
2191 AVStream av_unused *st;
2192 for(i = 0;i < ic->nb_streams; i++) {
2193 st = ic->streams[i];
2194 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2195 (double) st->start_time / AV_TIME_BASE,
2196 (double) st->duration / AV_TIME_BASE);
2198 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2199 (double) ic->start_time / AV_TIME_BASE,
2200 (double) ic->duration / AV_TIME_BASE,
2201 ic->bit_rate / 1000);
2205 static int has_codec_parameters(AVStream *st)
2207 AVCodecContext *avctx = st->codec;
2209 switch (avctx->codec_type) {
2210 case AVMEDIA_TYPE_AUDIO:
2211 val = avctx->sample_rate && avctx->channels;
2212 if (!avctx->frame_size && determinable_frame_size(avctx))
2214 if (st->info->found_decoder >= 0 && avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2217 case AVMEDIA_TYPE_VIDEO:
2219 if (st->info->found_decoder >= 0 && avctx->pix_fmt == PIX_FMT_NONE)
2222 case AVMEDIA_TYPE_DATA:
2223 if(avctx->codec_id == CODEC_ID_NONE) return 1;
2228 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2231 static int has_decode_delay_been_guessed(AVStream *st)
2233 return st->codec->codec_id != CODEC_ID_H264 ||
2234 st->info->nb_decoded_frames >= 6;
2237 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2238 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2241 int got_picture = 1, ret = 0;
2243 AVPacket pkt = *avpkt;
2245 if (!avcodec_is_open(st->codec) && !st->info->found_decoder) {
2246 AVDictionary *thread_opt = NULL;
2248 codec = st->codec->codec ? st->codec->codec :
2249 avcodec_find_decoder(st->codec->codec_id);
2252 st->info->found_decoder = -1;
2256 /* force thread count to 1 since the h264 decoder will not extract SPS
2257 * and PPS to extradata during multi-threaded decoding */
2258 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2259 ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
2261 av_dict_free(&thread_opt);
2263 st->info->found_decoder = -1;
2266 st->info->found_decoder = 1;
2267 } else if (!st->info->found_decoder)
2268 st->info->found_decoder = 1;
2270 if (st->info->found_decoder < 0)
2273 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2275 (!has_codec_parameters(st) ||
2276 !has_decode_delay_been_guessed(st) ||
2277 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2279 avcodec_get_frame_defaults(&picture);
2280 switch(st->codec->codec_type) {
2281 case AVMEDIA_TYPE_VIDEO:
2282 ret = avcodec_decode_video2(st->codec, &picture,
2283 &got_picture, &pkt);
2285 case AVMEDIA_TYPE_AUDIO:
2286 ret = avcodec_decode_audio4(st->codec, &picture, &got_picture, &pkt);
2293 st->info->nb_decoded_frames++;
2299 if(!pkt.data && !got_picture)
2304 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2306 while (tags->id != CODEC_ID_NONE) {
2314 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2317 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2318 if(tag == tags[i].tag)
2321 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2322 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2325 return CODEC_ID_NONE;
2328 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2331 for(i=0; tags && tags[i]; i++){
2332 int tag= ff_codec_get_tag(tags[i], id);
2338 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2341 for(i=0; tags && tags[i]; i++){
2342 enum CodecID id= ff_codec_get_id(tags[i], tag);
2343 if(id!=CODEC_ID_NONE) return id;
2345 return CODEC_ID_NONE;
2348 static void compute_chapters_end(AVFormatContext *s)
2351 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2353 for (i = 0; i < s->nb_chapters; i++)
2354 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2355 AVChapter *ch = s->chapters[i];
2356 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2359 for (j = 0; j < s->nb_chapters; j++) {
2360 AVChapter *ch1 = s->chapters[j];
2361 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2362 if (j != i && next_start > ch->start && next_start < end)
2365 ch->end = (end == INT64_MAX) ? ch->start : end;
2369 static int get_std_framerate(int i){
2370 if(i<60*12) return i*1001;
2371 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2375 * Is the time base unreliable.
2376 * This is a heuristic to balance between quick acceptance of the values in
2377 * the headers vs. some extra checks.
2378 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2379 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2380 * And there are "variable" fps files this needs to detect as well.
2382 static int tb_unreliable(AVCodecContext *c){
2383 if( c->time_base.den >= 101L*c->time_base.num
2384 || c->time_base.den < 5L*c->time_base.num
2385 /* || c->codec_tag == AV_RL32("DIVX")
2386 || c->codec_tag == AV_RL32("XVID")*/
2387 || c->codec_id == CODEC_ID_MPEG2VIDEO
2388 || c->codec_id == CODEC_ID_H264
2394 #if FF_API_FORMAT_PARAMETERS
2395 int av_find_stream_info(AVFormatContext *ic)
2397 return avformat_find_stream_info(ic, NULL);
2401 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2403 int i, count, ret, read_size, j;
2405 AVPacket pkt1, *pkt;
2406 int64_t old_offset = avio_tell(ic->pb);
2407 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2408 int flush_codecs = 1;
2410 for(i=0;i<ic->nb_streams;i++) {
2412 AVDictionary *thread_opt = NULL;
2413 st = ic->streams[i];
2415 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2416 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2417 /* if(!st->time_base.num)
2419 if(!st->codec->time_base.num)
2420 st->codec->time_base= st->time_base;
2422 //only for the split stuff
2423 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2424 st->parser = av_parser_init(st->codec->codec_id);
2425 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2426 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2429 codec = st->codec->codec ? st->codec->codec :
2430 avcodec_find_decoder(st->codec->codec_id);
2432 /* force thread count to 1 since the h264 decoder will not extract SPS
2433 * and PPS to extradata during multi-threaded decoding */
2434 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
2436 /* Ensure that subtitle_header is properly set. */
2437 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2438 && codec && !st->codec->codec)
2439 avcodec_open2(st->codec, codec, options ? &options[i]
2442 //try to just open decoders, in case this is enough to get parameters
2443 if (!has_codec_parameters(st)) {
2444 if (codec && !st->codec->codec)
2445 avcodec_open2(st->codec, codec, options ? &options[i]
2449 av_dict_free(&thread_opt);
2452 for (i=0; i<ic->nb_streams; i++) {
2453 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2459 if (ff_check_interrupt(&ic->interrupt_callback)){
2461 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2465 /* check if one codec still needs to be handled */
2466 for(i=0;i<ic->nb_streams;i++) {
2467 int fps_analyze_framecount = 20;
2469 st = ic->streams[i];
2470 if (!has_codec_parameters(st))
2472 /* if the timebase is coarse (like the usual millisecond precision
2473 of mkv), we need to analyze more frames to reliably arrive at
2475 if (av_q2d(st->time_base) > 0.0005)
2476 fps_analyze_framecount *= 2;
2477 if (ic->fps_probe_size >= 0)
2478 fps_analyze_framecount = ic->fps_probe_size;
2479 /* variable fps and no guess at the real fps */
2480 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2481 && st->info->duration_count < fps_analyze_framecount
2482 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2484 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2486 if(st->first_dts == AV_NOPTS_VALUE && (st->codec->codec_type == AVMEDIA_TYPE_VIDEO || st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2489 if (i == ic->nb_streams) {
2490 /* NOTE: if the format has no header, then we need to read
2491 some packets to get most of the streams, so we cannot
2493 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2494 /* if we found the info for all the codecs, we can stop */
2496 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2501 /* we did not get all the codec info, but we read too much data */
2502 if (read_size >= ic->probesize) {
2504 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2508 /* NOTE: a new stream can be added there if no header in file
2509 (AVFMTCTX_NOHEADER) */
2510 ret = read_frame_internal(ic, &pkt1);
2511 if (ret == AVERROR(EAGAIN))
2519 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2520 if ((ret = av_dup_packet(pkt)) < 0)
2521 goto find_stream_info_err;
2523 read_size += pkt->size;
2525 st = ic->streams[pkt->stream_index];
2526 if (st->codec_info_nb_frames>1) {
2528 if (st->time_base.den > 0)
2529 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
2530 if (st->avg_frame_rate.num > 0)
2531 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, (AVRational){st->avg_frame_rate.den, st->avg_frame_rate.num}, AV_TIME_BASE_Q));
2533 if (t >= ic->max_analyze_duration) {
2534 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2537 st->info->codec_info_duration += pkt->duration;
2540 int64_t last = st->info->last_dts;
2542 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2543 double dts= (is_relative(pkt->dts) ? pkt->dts - RELATIVE_TS_BASE : pkt->dts) * av_q2d(st->time_base);
2544 int64_t duration= pkt->dts - last;
2546 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2547 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
2548 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) {
2549 int framerate= get_std_framerate(i);
2550 double sdts= dts*framerate/(1001*12);
2552 int ticks= lrintf(sdts+j*0.5);
2553 double error= sdts - ticks + j*0.5;
2554 st->info->duration_error[j][0][i] += error;
2555 st->info->duration_error[j][1][i] += error*error;
2558 st->info->duration_count++;
2559 // ignore the first 4 values, they might have some random jitter
2560 if (st->info->duration_count > 3)
2561 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2563 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2564 st->info->last_dts = pkt->dts;
2566 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2567 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2568 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
2569 st->codec->extradata_size= i;
2570 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2571 if (!st->codec->extradata)
2572 return AVERROR(ENOMEM);
2573 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2574 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2578 /* if still no information, we try to open the codec and to
2579 decompress the frame. We try to avoid that in most cases as
2580 it takes longer and uses more memory. For MPEG-4, we need to
2581 decompress for QuickTime.
2583 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2584 least one frame of codec data, this makes sure the codec initializes
2585 the channel configuration and does not only trust the values from the container.
2587 try_decode_frame(st, pkt, (options && i < orig_nb_streams ) ? &options[i] : NULL);
2589 st->codec_info_nb_frames++;
2594 AVPacket empty_pkt = { 0 };
2596 av_init_packet(&empty_pkt);
2598 ret = -1; /* we could not have all the codec parameters before EOF */
2599 for(i=0;i<ic->nb_streams;i++) {
2600 st = ic->streams[i];
2602 /* flush the decoders */
2603 if (st->info->found_decoder == 1) {
2605 err = try_decode_frame(st, &empty_pkt,
2606 (options && i < orig_nb_streams) ?
2607 &options[i] : NULL);
2608 } while (err > 0 && !has_codec_parameters(st));
2611 av_log(ic, AV_LOG_INFO,
2612 "decoding for stream %d failed\n", st->index);
2616 if (!has_codec_parameters(st)){
2618 avcodec_string(buf, sizeof(buf), st->codec, 0);
2619 av_log(ic, AV_LOG_WARNING,
2620 "Could not find codec parameters (%s)\n", buf);
2627 // close codecs which were opened in try_decode_frame()
2628 for(i=0;i<ic->nb_streams;i++) {
2629 st = ic->streams[i];
2630 avcodec_close(st->codec);
2632 for(i=0;i<ic->nb_streams;i++) {
2633 st = ic->streams[i];
2634 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2635 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2636 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2637 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2638 st->codec->codec_tag= tag;
2641 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2642 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2643 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2644 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2645 // the check for tb_unreliable() is not completely correct, since this is not about handling
2646 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2647 // ipmovie.c produces.
2648 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)
2649 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);
2650 if (st->info->duration_count && !st->r_frame_rate.num
2651 && tb_unreliable(st->codec) /*&&
2652 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2653 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2655 double best_error= 0.01;
2657 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) {
2660 if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2662 if(!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
2665 int n= st->info->duration_count;
2666 double a= st->info->duration_error[k][0][j] / n;
2667 double error= st->info->duration_error[k][1][j]/n - a*a;
2669 if(error < best_error && best_error> 0.000000001){
2671 num = get_std_framerate(j);
2674 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2677 // do not increase frame rate by more than 1 % in order to match a standard rate.
2678 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2679 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2682 if (!st->r_frame_rate.num){
2683 if( st->codec->time_base.den * (int64_t)st->time_base.num
2684 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2685 st->r_frame_rate.num = st->codec->time_base.den;
2686 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2688 st->r_frame_rate.num = st->time_base.den;
2689 st->r_frame_rate.den = st->time_base.num;
2692 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2693 if(!st->codec->bits_per_coded_sample)
2694 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2695 // set stream disposition based on audio service type
2696 switch (st->codec->audio_service_type) {
2697 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2698 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2699 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2700 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2701 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2702 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2703 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2704 st->disposition = AV_DISPOSITION_COMMENT; break;
2705 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2706 st->disposition = AV_DISPOSITION_KARAOKE; break;
2711 estimate_timings(ic, old_offset);
2713 compute_chapters_end(ic);
2715 find_stream_info_err:
2716 for (i=0; i < ic->nb_streams; i++) {
2717 if (ic->streams[i]->codec)
2718 ic->streams[i]->codec->thread_count = 0;
2719 av_freep(&ic->streams[i]->info);
2724 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2728 for (i = 0; i < ic->nb_programs; i++) {
2729 if (ic->programs[i] == last) {
2733 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2734 if (ic->programs[i]->stream_index[j] == s)
2735 return ic->programs[i];
2741 int av_find_best_stream(AVFormatContext *ic,
2742 enum AVMediaType type,
2743 int wanted_stream_nb,
2745 AVCodec **decoder_ret,
2748 int i, nb_streams = ic->nb_streams;
2749 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2750 unsigned *program = NULL;
2751 AVCodec *decoder = NULL, *best_decoder = NULL;
2753 if (related_stream >= 0 && wanted_stream_nb < 0) {
2754 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2756 program = p->stream_index;
2757 nb_streams = p->nb_stream_indexes;
2760 for (i = 0; i < nb_streams; i++) {
2761 int real_stream_index = program ? program[i] : i;
2762 AVStream *st = ic->streams[real_stream_index];
2763 AVCodecContext *avctx = st->codec;
2764 if (avctx->codec_type != type)
2766 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2768 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2771 decoder = avcodec_find_decoder(st->codec->codec_id);
2774 ret = AVERROR_DECODER_NOT_FOUND;
2778 if (best_count >= st->codec_info_nb_frames)
2780 best_count = st->codec_info_nb_frames;
2781 ret = real_stream_index;
2782 best_decoder = decoder;
2783 if (program && i == nb_streams - 1 && ret < 0) {
2785 nb_streams = ic->nb_streams;
2786 i = 0; /* no related stream found, try again with everything */
2790 *decoder_ret = best_decoder;
2794 /*******************************************************/
2796 int av_read_play(AVFormatContext *s)
2798 if (s->iformat->read_play)
2799 return s->iformat->read_play(s);
2801 return avio_pause(s->pb, 0);
2802 return AVERROR(ENOSYS);
2805 int av_read_pause(AVFormatContext *s)
2807 if (s->iformat->read_pause)
2808 return s->iformat->read_pause(s);
2810 return avio_pause(s->pb, 1);
2811 return AVERROR(ENOSYS);
2814 void avformat_free_context(AVFormatContext *s)
2820 if (s->iformat && s->iformat->priv_class && s->priv_data)
2821 av_opt_free(s->priv_data);
2823 for(i=0;i<s->nb_streams;i++) {
2824 /* free all data in a stream component */
2827 av_parser_close(st->parser);
2829 if (st->attached_pic.data)
2830 av_free_packet(&st->attached_pic);
2831 av_dict_free(&st->metadata);
2832 av_freep(&st->index_entries);
2833 av_freep(&st->codec->extradata);
2834 av_freep(&st->codec->subtitle_header);
2835 av_freep(&st->codec);
2836 av_freep(&st->priv_data);
2837 av_freep(&st->info);
2840 for(i=s->nb_programs-1; i>=0; i--) {
2841 av_dict_free(&s->programs[i]->metadata);
2842 av_freep(&s->programs[i]->stream_index);
2843 av_freep(&s->programs[i]);
2845 av_freep(&s->programs);
2846 av_freep(&s->priv_data);
2847 while(s->nb_chapters--) {
2848 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2849 av_freep(&s->chapters[s->nb_chapters]);
2851 av_freep(&s->chapters);
2852 av_dict_free(&s->metadata);
2853 av_freep(&s->streams);
2857 #if FF_API_CLOSE_INPUT_FILE
2858 void av_close_input_file(AVFormatContext *s)
2860 avformat_close_input(&s);
2864 void avformat_close_input(AVFormatContext **ps)
2866 AVFormatContext *s = *ps;
2867 AVIOContext *pb = (s->iformat && (s->iformat->flags & AVFMT_NOFILE)) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2869 flush_packet_queue(s);
2870 if (s->iformat && (s->iformat->read_close))
2871 s->iformat->read_close(s);
2872 avformat_free_context(s);
2878 #if FF_API_NEW_STREAM
2879 AVStream *av_new_stream(AVFormatContext *s, int id)
2881 AVStream *st = avformat_new_stream(s, NULL);
2888 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
2894 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2896 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2899 s->streams = streams;
2901 st = av_mallocz(sizeof(AVStream));
2904 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2908 st->info->last_dts = AV_NOPTS_VALUE;
2910 st->codec = avcodec_alloc_context3(c);
2912 /* no default bitrate if decoding */
2913 st->codec->bit_rate = 0;
2915 st->index = s->nb_streams;
2916 st->start_time = AV_NOPTS_VALUE;
2917 st->duration = AV_NOPTS_VALUE;
2918 /* we set the current DTS to 0 so that formats without any timestamps
2919 but durations get some timestamps, formats with some unknown
2920 timestamps have their first few packets buffered and the
2921 timestamps corrected before they are returned to the user */
2922 st->cur_dts = s->iformat ? RELATIVE_TS_BASE : 0;
2923 st->first_dts = AV_NOPTS_VALUE;
2924 st->probe_packets = MAX_PROBE_PACKETS;
2926 /* default pts setting is MPEG-like */
2927 avpriv_set_pts_info(st, 33, 1, 90000);
2928 st->last_IP_pts = AV_NOPTS_VALUE;
2929 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2930 st->pts_buffer[i]= AV_NOPTS_VALUE;
2931 st->reference_dts = AV_NOPTS_VALUE;
2933 st->sample_aspect_ratio = (AVRational){0,1};
2935 s->streams[s->nb_streams++] = st;
2939 AVProgram *av_new_program(AVFormatContext *ac, int id)
2941 AVProgram *program=NULL;
2944 av_dlog(ac, "new_program: id=0x%04x\n", id);
2946 for(i=0; i<ac->nb_programs; i++)
2947 if(ac->programs[i]->id == id)
2948 program = ac->programs[i];
2951 program = av_mallocz(sizeof(AVProgram));
2954 dynarray_add(&ac->programs, &ac->nb_programs, program);
2955 program->discard = AVDISCARD_NONE;
2962 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2964 AVChapter *chapter = NULL;
2967 for(i=0; i<s->nb_chapters; i++)
2968 if(s->chapters[i]->id == id)
2969 chapter = s->chapters[i];
2972 chapter= av_mallocz(sizeof(AVChapter));
2975 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2977 av_dict_set(&chapter->metadata, "title", title, 0);
2979 chapter->time_base= time_base;
2980 chapter->start = start;
2986 /************************************************************/
2987 /* output media file */
2989 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
2990 const char *format, const char *filename)
2992 AVFormatContext *s = avformat_alloc_context();
3001 oformat = av_guess_format(format, NULL, NULL);
3003 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
3004 ret = AVERROR(EINVAL);
3008 oformat = av_guess_format(NULL, filename, NULL);
3010 ret = AVERROR(EINVAL);
3011 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
3018 s->oformat = oformat;
3019 if (s->oformat->priv_data_size > 0) {
3020 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3023 if (s->oformat->priv_class) {
3024 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3025 av_opt_set_defaults(s->priv_data);
3028 s->priv_data = NULL;
3031 av_strlcpy(s->filename, filename, sizeof(s->filename));
3035 av_log(s, AV_LOG_ERROR, "Out of memory\n");
3036 ret = AVERROR(ENOMEM);
3038 avformat_free_context(s);
3042 #if FF_API_ALLOC_OUTPUT_CONTEXT
3043 AVFormatContext *avformat_alloc_output_context(const char *format,
3044 AVOutputFormat *oformat, const char *filename)
3046 AVFormatContext *avctx;
3047 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
3048 return ret < 0 ? NULL : avctx;
3052 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
3054 const AVCodecTag *avctag;
3056 enum CodecID id = CODEC_ID_NONE;
3057 unsigned int tag = 0;
3060 * Check that tag + id is in the table
3061 * If neither is in the table -> OK
3062 * If tag is in the table with another id -> FAIL
3063 * If id is in the table with another tag -> FAIL unless strict < normal
3065 for (n = 0; s->oformat->codec_tag[n]; n++) {
3066 avctag = s->oformat->codec_tag[n];
3067 while (avctag->id != CODEC_ID_NONE) {
3068 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
3070 if (id == st->codec->codec_id)
3073 if (avctag->id == st->codec->codec_id)
3078 if (id != CODEC_ID_NONE)
3080 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
3085 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
3089 AVDictionary *tmp = NULL;
3092 av_dict_copy(&tmp, *options, 0);
3093 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
3095 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
3096 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3099 // some sanity checks
3100 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
3101 av_log(s, AV_LOG_ERROR, "no streams\n");
3102 ret = AVERROR(EINVAL);
3106 for(i=0;i<s->nb_streams;i++) {
3109 switch (st->codec->codec_type) {
3110 case AVMEDIA_TYPE_AUDIO:
3111 if(st->codec->sample_rate<=0){
3112 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
3113 ret = AVERROR(EINVAL);
3116 if(!st->codec->block_align)
3117 st->codec->block_align = st->codec->channels *
3118 av_get_bits_per_sample(st->codec->codec_id) >> 3;
3120 case AVMEDIA_TYPE_VIDEO:
3121 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
3122 av_log(s, AV_LOG_ERROR, "time base not set\n");
3123 ret = AVERROR(EINVAL);
3126 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
3127 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
3128 ret = AVERROR(EINVAL);
3131 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
3132 && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
3134 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between muxer "
3135 "(%d/%d) and encoder layer (%d/%d)\n",
3136 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3137 st->codec->sample_aspect_ratio.num,
3138 st->codec->sample_aspect_ratio.den);
3139 ret = AVERROR(EINVAL);
3145 if(s->oformat->codec_tag){
3146 if(st->codec->codec_tag && st->codec->codec_id == CODEC_ID_RAWVIDEO && av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id) == 0 && !validate_codec_tag(s, st)){
3147 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
3148 st->codec->codec_tag= 0;
3150 if(st->codec->codec_tag){
3151 if (!validate_codec_tag(s, st)) {
3153 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
3154 av_log(s, AV_LOG_ERROR,
3155 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
3156 tagbuf, st->codec->codec_tag, st->codec->codec_id);
3157 ret = AVERROR_INVALIDDATA;
3161 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3164 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3165 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3166 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3169 if (!s->priv_data && s->oformat->priv_data_size > 0) {
3170 s->priv_data = av_mallocz(s->oformat->priv_data_size);
3171 if (!s->priv_data) {
3172 ret = AVERROR(ENOMEM);
3175 if (s->oformat->priv_class) {
3176 *(const AVClass**)s->priv_data= s->oformat->priv_class;
3177 av_opt_set_defaults(s->priv_data);
3178 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3183 /* set muxer identification string */
3184 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3185 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3188 if(s->oformat->write_header){
3189 ret = s->oformat->write_header(s);
3194 /* init PTS generation */
3195 for(i=0;i<s->nb_streams;i++) {
3196 int64_t den = AV_NOPTS_VALUE;
3199 switch (st->codec->codec_type) {
3200 case AVMEDIA_TYPE_AUDIO:
3201 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3203 case AVMEDIA_TYPE_VIDEO:
3204 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3209 if (den != AV_NOPTS_VALUE) {
3211 ret = AVERROR_INVALIDDATA;
3214 frac_init(&st->pts, 0, 0, den);
3219 av_dict_free(options);
3228 //FIXME merge with compute_pkt_fields
3229 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3230 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3231 int num, den, frame_size, i;
3233 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3234 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3236 /* duration field */
3237 if (pkt->duration == 0) {
3238 compute_frame_duration(&num, &den, st, NULL, pkt);
3240 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3244 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3247 //XXX/FIXME this is a temporary hack until all encoders output pts
3248 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3251 av_log(s, AV_LOG_WARNING, "Encoder did not produce proper pts, making some up.\n");
3255 // pkt->pts= st->cur_dts;
3256 pkt->pts= st->pts.val;
3259 //calculate dts from pts
3260 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3261 st->pts_buffer[0]= pkt->pts;
3262 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3263 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3264 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3265 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3267 pkt->dts= st->pts_buffer[0];
3270 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) && st->cur_dts >= pkt->dts) || st->cur_dts > pkt->dts)){
3271 av_log(s, AV_LOG_ERROR,
3272 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3273 st->index, st->cur_dts, pkt->dts);
3274 return AVERROR(EINVAL);
3276 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3277 av_log(s, AV_LOG_ERROR, "pts (%"PRId64") < dts (%"PRId64") in stream %d\n", pkt->pts, pkt->dts, st->index);
3278 return AVERROR(EINVAL);
3281 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3282 st->cur_dts= pkt->dts;
3283 st->pts.val= pkt->dts;
3286 switch (st->codec->codec_type) {
3287 case AVMEDIA_TYPE_AUDIO:
3288 frame_size = get_audio_frame_size(st->codec, pkt->size, 1);
3290 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3291 likely equal to the encoder delay, but it would be better if we
3292 had the real timestamps from the encoder */
3293 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3294 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3297 case AVMEDIA_TYPE_VIDEO:
3298 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3306 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3311 if (s->oformat->flags & AVFMT_ALLOW_FLUSH)
3312 return s->oformat->write_packet(s, pkt);
3316 ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3318 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3321 ret= s->oformat->write_packet(s, pkt);
3324 s->streams[pkt->stream_index]->nb_frames++;
3328 #define CHUNK_START 0x1000
3330 int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3331 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3333 AVPacketList **next_point, *this_pktl;
3334 AVStream *st= s->streams[pkt->stream_index];
3335 int chunked= s->max_chunk_size || s->max_chunk_duration;
3337 this_pktl = av_mallocz(sizeof(AVPacketList));
3339 return AVERROR(ENOMEM);
3340 this_pktl->pkt= *pkt;
3341 pkt->destruct= NULL; // do not free original but only the copy
3342 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3344 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3345 next_point = &(st->last_in_packet_buffer->next);
3347 next_point = &s->packet_buffer;
3352 uint64_t max= av_rescale_q(s->max_chunk_duration, AV_TIME_BASE_Q, st->time_base);
3353 if( st->interleaver_chunk_size + pkt->size <= s->max_chunk_size-1U
3354 && st->interleaver_chunk_duration + pkt->duration <= max-1U){
3355 st->interleaver_chunk_size += pkt->size;
3356 st->interleaver_chunk_duration += pkt->duration;
3359 st->interleaver_chunk_size =
3360 st->interleaver_chunk_duration = 0;
3361 this_pktl->pkt.flags |= CHUNK_START;
3365 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3367 && ((chunked && !((*next_point)->pkt.flags&CHUNK_START))
3368 || !compare(s, &(*next_point)->pkt, pkt))){
3369 next_point= &(*next_point)->next;
3374 next_point = &(s->packet_buffer_end->next);
3377 assert(!*next_point);
3379 s->packet_buffer_end= this_pktl;
3382 this_pktl->next= *next_point;
3384 s->streams[pkt->stream_index]->last_in_packet_buffer=
3385 *next_point= this_pktl;
3389 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3391 AVStream *st = s->streams[ pkt ->stream_index];
3392 AVStream *st2= s->streams[ next->stream_index];
3393 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3395 if(s->audio_preload && ((st->codec->codec_type == AVMEDIA_TYPE_AUDIO) != (st2->codec->codec_type == AVMEDIA_TYPE_AUDIO))){
3396 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);
3397 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);
3399 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
3400 -( 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;
3403 comp= (ts>ts2) - (ts<ts2);
3407 return pkt->stream_index < next->stream_index;
3411 int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
3412 AVPacket *pkt, int flush)
3415 int stream_count=0, noninterleaved_count=0;
3416 int64_t delta_dts_max = 0;
3420 ret = ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3425 for(i=0; i < s->nb_streams; i++) {
3426 if (s->streams[i]->last_in_packet_buffer) {
3428 } else if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3429 ++noninterleaved_count;
3433 if (s->nb_streams == stream_count) {
3436 for(i=0; i < s->nb_streams; i++) {
3437 if (s->streams[i]->last_in_packet_buffer) {
3439 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
3440 s->streams[i]->time_base,
3442 av_rescale_q(s->packet_buffer->pkt.dts,
3443 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
3445 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
3448 if(s->nb_streams == stream_count+noninterleaved_count &&
3449 delta_dts_max > 20*AV_TIME_BASE) {
3450 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
3454 if(stream_count && flush){
3455 pktl= s->packet_buffer;
3458 s->packet_buffer= pktl->next;
3459 if(!s->packet_buffer)
3460 s->packet_buffer_end= NULL;
3462 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3463 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3467 av_init_packet(out);
3472 #if FF_API_INTERLEAVE_PACKET
3473 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
3474 AVPacket *pkt, int flush)
3476 return ff_interleave_packet_per_dts(s, out, pkt, flush);
3481 * Interleave an AVPacket correctly so it can be muxed.
3482 * @param out the interleaved packet will be output here
3483 * @param in the input packet
3484 * @param flush 1 if no further packets are available as input and all
3485 * remaining packets should be output
3486 * @return 1 if a packet was output, 0 if no packet could be output,
3487 * < 0 if an error occurred
3489 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3490 if (s->oformat->interleave_packet) {
3491 int ret = s->oformat->interleave_packet(s, out, in, flush);
3496 return ff_interleave_packet_per_dts(s, out, in, flush);
3499 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3503 AVStream *st= s->streams[ pkt->stream_index];
3505 //FIXME/XXX/HACK drop zero sized packets
3506 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3509 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3510 pkt->size, pkt->dts, pkt->pts);
3511 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3514 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3515 return AVERROR(EINVAL);
3517 av_dlog(s, "av_interleaved_write_frame FLUSH\n");
3523 int ret= interleave_packet(s, &opkt, pkt, flush);
3524 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3527 ret= s->oformat->write_packet(s, &opkt);
3529 s->streams[opkt.stream_index]->nb_frames++;
3531 av_free_packet(&opkt);
3536 if(s->pb && s->pb->error)
3537 return s->pb->error;
3541 int av_write_trailer(AVFormatContext *s)
3547 ret= interleave_packet(s, &pkt, NULL, 1);
3548 if(ret<0) //FIXME cleanup needed for ret<0 ?
3553 ret= s->oformat->write_packet(s, &pkt);
3555 s->streams[pkt.stream_index]->nb_frames++;
3557 av_free_packet(&pkt);
3561 if(s->pb && s->pb->error)
3565 if(s->oformat->write_trailer)
3566 ret = s->oformat->write_trailer(s);
3569 ret = s->pb ? s->pb->error : 0;
3570 for(i=0;i<s->nb_streams;i++) {
3571 av_freep(&s->streams[i]->priv_data);
3572 av_freep(&s->streams[i]->index_entries);
3574 if (s->oformat->priv_class)
3575 av_opt_free(s->priv_data);
3576 av_freep(&s->priv_data);
3580 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
3581 int64_t *dts, int64_t *wall)
3583 if (!s->oformat || !s->oformat->get_output_timestamp)
3584 return AVERROR(ENOSYS);
3585 s->oformat->get_output_timestamp(s, stream, dts, wall);
3589 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3592 AVProgram *program=NULL;
3595 if (idx >= ac->nb_streams) {
3596 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3600 for(i=0; i<ac->nb_programs; i++){
3601 if(ac->programs[i]->id != progid)
3603 program = ac->programs[i];
3604 for(j=0; j<program->nb_stream_indexes; j++)
3605 if(program->stream_index[j] == idx)
3608 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3611 program->stream_index = tmp;
3612 program->stream_index[program->nb_stream_indexes++] = idx;
3617 static void print_fps(double d, const char *postfix){
3618 uint64_t v= lrintf(d*100);
3619 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3620 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3621 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3624 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3626 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3627 AVDictionaryEntry *tag=NULL;
3629 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3630 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3631 if(strcmp("language", tag->key)){
3632 const char *p = tag->value;
3633 av_log(ctx, AV_LOG_INFO, "%s %-16s: ", indent, tag->key);
3636 size_t len = strcspn(p, "\xd\xa");
3637 av_strlcpy(tmp, p, FFMIN(sizeof(tmp), len+1));
3638 av_log(ctx, AV_LOG_INFO, "%s", tmp);
3640 if (*p == 0xd) av_log(ctx, AV_LOG_INFO, " ");
3641 if (*p == 0xa) av_log(ctx, AV_LOG_INFO, "\n%s %-16s: ", indent, "");
3644 av_log(ctx, AV_LOG_INFO, "\n");
3650 /* "user interface" functions */
3651 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3654 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3655 AVStream *st = ic->streams[i];
3656 int g = av_gcd(st->time_base.num, st->time_base.den);
3657 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3658 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3659 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
3660 /* the pid is an important information, so we display it */
3661 /* XXX: add a generic system */
3662 if (flags & AVFMT_SHOW_IDS)
3663 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3665 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3666 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3667 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3668 if (st->sample_aspect_ratio.num && // default
3669 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3670 AVRational display_aspect_ratio;
3671 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3672 st->codec->width*st->sample_aspect_ratio.num,
3673 st->codec->height*st->sample_aspect_ratio.den,
3675 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3676 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3677 display_aspect_ratio.num, display_aspect_ratio.den);
3679 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3680 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3681 print_fps(av_q2d(st->avg_frame_rate), "fps");
3682 if(st->r_frame_rate.den && st->r_frame_rate.num)
3683 print_fps(av_q2d(st->r_frame_rate), "tbr");
3684 if(st->time_base.den && st->time_base.num)
3685 print_fps(1/av_q2d(st->time_base), "tbn");
3686 if(st->codec->time_base.den && st->codec->time_base.num)
3687 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3689 if (st->disposition & AV_DISPOSITION_DEFAULT)
3690 av_log(NULL, AV_LOG_INFO, " (default)");
3691 if (st->disposition & AV_DISPOSITION_DUB)
3692 av_log(NULL, AV_LOG_INFO, " (dub)");
3693 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3694 av_log(NULL, AV_LOG_INFO, " (original)");
3695 if (st->disposition & AV_DISPOSITION_COMMENT)
3696 av_log(NULL, AV_LOG_INFO, " (comment)");
3697 if (st->disposition & AV_DISPOSITION_LYRICS)
3698 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3699 if (st->disposition & AV_DISPOSITION_KARAOKE)
3700 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3701 if (st->disposition & AV_DISPOSITION_FORCED)
3702 av_log(NULL, AV_LOG_INFO, " (forced)");
3703 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3704 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3705 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3706 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3707 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3708 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3709 av_log(NULL, AV_LOG_INFO, "\n");
3710 dump_metadata(NULL, st->metadata, " ");
3713 void av_dump_format(AVFormatContext *ic,
3719 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3720 if (ic->nb_streams && !printed)
3723 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3724 is_output ? "Output" : "Input",
3726 is_output ? ic->oformat->name : ic->iformat->name,
3727 is_output ? "to" : "from", url);
3728 dump_metadata(NULL, ic->metadata, " ");
3730 av_log(NULL, AV_LOG_INFO, " Duration: ");
3731 if (ic->duration != AV_NOPTS_VALUE) {
3732 int hours, mins, secs, us;
3733 secs = ic->duration / AV_TIME_BASE;
3734 us = ic->duration % AV_TIME_BASE;
3739 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3740 (100 * us) / AV_TIME_BASE);
3742 av_log(NULL, AV_LOG_INFO, "N/A");
3744 if (ic->start_time != AV_NOPTS_VALUE) {
3746 av_log(NULL, AV_LOG_INFO, ", start: ");
3747 secs = ic->start_time / AV_TIME_BASE;
3748 us = abs(ic->start_time % AV_TIME_BASE);
3749 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3750 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3752 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3754 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3756 av_log(NULL, AV_LOG_INFO, "N/A");
3758 av_log(NULL, AV_LOG_INFO, "\n");
3760 for (i = 0; i < ic->nb_chapters; i++) {
3761 AVChapter *ch = ic->chapters[i];
3762 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3763 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3764 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3766 dump_metadata(NULL, ch->metadata, " ");
3768 if(ic->nb_programs) {
3769 int j, k, total = 0;
3770 for(j=0; j<ic->nb_programs; j++) {
3771 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3773 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3774 name ? name->value : "");
3775 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3776 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3777 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3778 printed[ic->programs[j]->stream_index[k]] = 1;
3780 total += ic->programs[j]->nb_stream_indexes;
3782 if (total < ic->nb_streams)
3783 av_log(NULL, AV_LOG_INFO, " No Program\n");
3785 for(i=0;i<ic->nb_streams;i++)
3787 dump_stream_format(ic, i, index, is_output);
3792 int64_t av_gettime(void)
3795 gettimeofday(&tv,NULL);
3796 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3799 uint64_t ff_ntp_time(void)
3801 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3804 int av_get_frame_filename(char *buf, int buf_size,
3805 const char *path, int number)
3808 char *q, buf1[20], c;
3809 int nd, len, percentd_found;
3821 while (isdigit(*p)) {
3822 nd = nd * 10 + *p++ - '0';
3825 } while (isdigit(c));
3834 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3836 if ((q - buf + len) > buf_size - 1)
3838 memcpy(q, buf1, len);
3846 if ((q - buf) < buf_size - 1)
3850 if (!percentd_found)
3859 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3863 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3865 for(i=0;i<size;i+=16) {
3872 PRINT(" %02x", buf[i+j]);
3877 for(j=0;j<len;j++) {
3879 if (c < ' ' || c > '~')
3888 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3890 hex_dump_internal(NULL, f, 0, buf, size);
3893 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3895 hex_dump_internal(avcl, NULL, level, buf, size);
3898 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3901 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3902 PRINT("stream #%d:\n", pkt->stream_index);
3903 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3904 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3905 /* DTS is _always_ valid after av_read_frame() */
3907 if (pkt->dts == AV_NOPTS_VALUE)
3910 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3911 /* PTS may not be known if B-frames are present. */
3913 if (pkt->pts == AV_NOPTS_VALUE)
3916 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3918 PRINT(" size=%d\n", pkt->size);
3921 av_hex_dump(f, pkt->data, pkt->size);
3925 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3927 AVRational tb = { 1, AV_TIME_BASE };
3928 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3932 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3934 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3938 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3940 AVRational tb = { 1, AV_TIME_BASE };
3941 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3945 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3948 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3951 void av_url_split(char *proto, int proto_size,
3952 char *authorization, int authorization_size,
3953 char *hostname, int hostname_size,
3955 char *path, int path_size,
3958 const char *p, *ls, *at, *col, *brk;
3960 if (port_ptr) *port_ptr = -1;
3961 if (proto_size > 0) proto[0] = 0;
3962 if (authorization_size > 0) authorization[0] = 0;
3963 if (hostname_size > 0) hostname[0] = 0;
3964 if (path_size > 0) path[0] = 0;
3966 /* parse protocol */
3967 if ((p = strchr(url, ':'))) {
3968 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3973 /* no protocol means plain filename */
3974 av_strlcpy(path, url, path_size);
3978 /* separate path from hostname */
3979 ls = strchr(p, '/');
3981 ls = strchr(p, '?');
3983 av_strlcpy(path, ls, path_size);
3985 ls = &p[strlen(p)]; // XXX
3987 /* the rest is hostname, use that to parse auth/port */
3989 /* authorization (user[:pass]@hostname) */
3990 if ((at = strchr(p, '@')) && at < ls) {
3991 av_strlcpy(authorization, p,
3992 FFMIN(authorization_size, at + 1 - p));
3993 p = at + 1; /* skip '@' */
3996 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3998 av_strlcpy(hostname, p + 1,
3999 FFMIN(hostname_size, brk - p));
4000 if (brk[1] == ':' && port_ptr)
4001 *port_ptr = atoi(brk + 2);
4002 } else if ((col = strchr(p, ':')) && col < ls) {
4003 av_strlcpy(hostname, p,
4004 FFMIN(col + 1 - p, hostname_size));
4005 if (port_ptr) *port_ptr = atoi(col + 1);
4007 av_strlcpy(hostname, p,
4008 FFMIN(ls + 1 - p, hostname_size));
4012 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4015 static const char hex_table_uc[16] = { '0', '1', '2', '3',
4018 'C', 'D', 'E', 'F' };
4019 static const char hex_table_lc[16] = { '0', '1', '2', '3',
4022 'c', 'd', 'e', 'f' };
4023 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4025 for(i = 0; i < s; i++) {
4026 buff[i * 2] = hex_table[src[i] >> 4];
4027 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4033 int ff_hex_to_data(uint8_t *data, const char *p)
4040 p += strspn(p, SPACE_CHARS);
4043 c = toupper((unsigned char) *p++);
4044 if (c >= '0' && c <= '9')
4046 else if (c >= 'A' && c <= 'F')
4061 #if FF_API_SET_PTS_INFO
4062 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
4063 unsigned int pts_num, unsigned int pts_den)
4065 avpriv_set_pts_info(s, pts_wrap_bits, pts_num, pts_den);
4069 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4070 unsigned int pts_num, unsigned int pts_den)
4073 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
4074 if(new_tb.num != pts_num)
4075 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
4077 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
4079 if(new_tb.num <= 0 || new_tb.den <= 0) {
4080 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
4083 s->time_base = new_tb;
4084 s->pts_wrap_bits = pts_wrap_bits;
4087 int ff_url_join(char *str, int size, const char *proto,
4088 const char *authorization, const char *hostname,
4089 int port, const char *fmt, ...)
4092 struct addrinfo hints = { 0 }, *ai;
4097 av_strlcatf(str, size, "%s://", proto);
4098 if (authorization && authorization[0])
4099 av_strlcatf(str, size, "%s@", authorization);
4100 #if CONFIG_NETWORK && defined(AF_INET6)
4101 /* Determine if hostname is a numerical IPv6 address,
4102 * properly escape it within [] in that case. */
4103 hints.ai_flags = AI_NUMERICHOST;
4104 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
4105 if (ai->ai_family == AF_INET6) {
4106 av_strlcat(str, "[", size);
4107 av_strlcat(str, hostname, size);
4108 av_strlcat(str, "]", size);
4110 av_strlcat(str, hostname, size);
4115 /* Not an IPv6 address, just output the plain string. */
4116 av_strlcat(str, hostname, size);
4119 av_strlcatf(str, size, ":%d", port);
4122 int len = strlen(str);
4125 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
4131 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
4132 AVFormatContext *src)
4137 local_pkt.stream_index = dst_stream;
4138 if (pkt->pts != AV_NOPTS_VALUE)
4139 local_pkt.pts = av_rescale_q(pkt->pts,
4140 src->streams[pkt->stream_index]->time_base,
4141 dst->streams[dst_stream]->time_base);
4142 if (pkt->dts != AV_NOPTS_VALUE)
4143 local_pkt.dts = av_rescale_q(pkt->dts,
4144 src->streams[pkt->stream_index]->time_base,
4145 dst->streams[dst_stream]->time_base);
4146 return av_write_frame(dst, &local_pkt);
4149 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4152 const char *ptr = str;
4154 /* Parse key=value pairs. */
4157 char *dest = NULL, *dest_end;
4158 int key_len, dest_len = 0;
4160 /* Skip whitespace and potential commas. */
4161 while (*ptr && (isspace(*ptr) || *ptr == ','))
4168 if (!(ptr = strchr(key, '=')))
4171 key_len = ptr - key;
4173 callback_get_buf(context, key, key_len, &dest, &dest_len);
4174 dest_end = dest + dest_len - 1;
4178 while (*ptr && *ptr != '\"') {
4182 if (dest && dest < dest_end)
4186 if (dest && dest < dest_end)
4194 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
4195 if (dest && dest < dest_end)
4203 int ff_find_stream_index(AVFormatContext *s, int id)
4206 for (i = 0; i < s->nb_streams; i++) {
4207 if (s->streams[i]->id == id)
4213 void ff_make_absolute_url(char *buf, int size, const char *base,
4217 /* Absolute path, relative to the current server */
4218 if (base && strstr(base, "://") && rel[0] == '/') {
4220 av_strlcpy(buf, base, size);
4221 sep = strstr(buf, "://");
4224 sep = strchr(sep, '/');
4228 av_strlcat(buf, rel, size);
4231 /* If rel actually is an absolute url, just copy it */
4232 if (!base || strstr(rel, "://") || rel[0] == '/') {
4233 av_strlcpy(buf, rel, size);
4237 av_strlcpy(buf, base, size);
4238 /* Remove the file name from the base url */
4239 sep = strrchr(buf, '/');
4244 while (av_strstart(rel, "../", NULL) && sep) {
4245 /* Remove the path delimiter at the end */
4247 sep = strrchr(buf, '/');
4248 /* If the next directory name to pop off is "..", break here */
4249 if (!strcmp(sep ? &sep[1] : buf, "..")) {
4250 /* Readd the slash we just removed */
4251 av_strlcat(buf, "/", size);
4254 /* Cut off the directory name */
4261 av_strlcat(buf, rel, size);
4264 int64_t ff_iso8601_to_unix_time(const char *datestr)
4267 struct tm time1 = {0}, time2 = {0};
4269 ret1 = strptime(datestr, "%Y - %m - %d %T", &time1);
4270 ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2);
4272 return av_timegm(&time2);
4274 return av_timegm(&time1);
4276 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
4277 "the date string.\n");
4282 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
4285 if (ofmt->query_codec)
4286 return ofmt->query_codec(codec_id, std_compliance);
4287 else if (ofmt->codec_tag)
4288 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
4289 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
4290 codec_id == ofmt->subtitle_codec)
4293 return AVERROR_PATCHWELCOME;
4296 int avformat_network_init(void)
4300 ff_network_inited_globally = 1;
4301 if ((ret = ff_network_init()) < 0)
4308 int avformat_network_deinit(void)
4317 int ff_add_param_change(AVPacket *pkt, int32_t channels,
4318 uint64_t channel_layout, int32_t sample_rate,
4319 int32_t width, int32_t height)
4325 return AVERROR(EINVAL);
4328 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
4330 if (channel_layout) {
4332 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
4336 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
4338 if (width || height) {
4340 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
4342 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
4344 return AVERROR(ENOMEM);
4345 bytestream_put_le32(&data, flags);
4347 bytestream_put_le32(&data, channels);
4349 bytestream_put_le64(&data, channel_layout);
4351 bytestream_put_le32(&data, sample_rate);
4352 if (width || height) {
4353 bytestream_put_le32(&data, width);
4354 bytestream_put_le32(&data, height);
4359 const struct AVCodecTag *avformat_get_riff_video_tags(void)
4361 return ff_codec_bmp_tags;
4363 const struct AVCodecTag *avformat_get_riff_audio_tags(void)
4365 return ff_codec_wav_tags;