2 * various utility functions for use within Libav
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "avio_internal.h"
27 #include "libavcodec/internal.h"
28 #include "libavutil/opt.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/pixdesc.h"
33 #include "libavutil/avstring.h"
34 #include "libavutil/mathematics.h"
36 #include "audiointerleave.h"
51 * various utility functions for use within Libav
54 unsigned avformat_version(void)
56 return LIBAVFORMAT_VERSION_INT;
59 const char *avformat_configuration(void)
61 return LIBAV_CONFIGURATION;
64 const char *avformat_license(void)
66 #define LICENSE_PREFIX "libavformat license: "
67 return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
70 /* fraction handling */
73 * f = val + (num / den) + 0.5.
75 * 'num' is normalized so that it is such as 0 <= num < den.
77 * @param f fractional number
78 * @param val integer value
79 * @param num must be >= 0
80 * @param den must be >= 1
82 static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
95 * Fractional addition to f: f = f + (incr / f->den).
97 * @param f fractional number
98 * @param incr increment, can be positive or negative
100 static void frac_add(AVFrac *f, int64_t incr)
113 } else if (num >= den) {
120 /** head of registered input format linked list */
121 static AVInputFormat *first_iformat = NULL;
122 /** head of registered output format linked list */
123 static AVOutputFormat *first_oformat = NULL;
125 AVInputFormat *av_iformat_next(AVInputFormat *f)
127 if(f) return f->next;
128 else return first_iformat;
131 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
133 if(f) return f->next;
134 else return first_oformat;
137 void av_register_input_format(AVInputFormat *format)
141 while (*p != NULL) p = &(*p)->next;
146 void av_register_output_format(AVOutputFormat *format)
150 while (*p != NULL) p = &(*p)->next;
155 int av_match_ext(const char *filename, const char *extensions)
163 ext = strrchr(filename, '.');
169 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
172 if (!strcasecmp(ext1, ext))
182 static int match_format(const char *name, const char *names)
190 namelen = strlen(name);
191 while ((p = strchr(names, ','))) {
192 len = FFMAX(p - names, namelen);
193 if (!strncasecmp(name, names, len))
197 return !strcasecmp(name, names);
200 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
201 const char *mime_type)
203 AVOutputFormat *fmt = NULL, *fmt_found;
204 int score_max, score;
206 /* specific test for image sequences */
207 #if CONFIG_IMAGE2_MUXER
208 if (!short_name && filename &&
209 av_filename_number_test(filename) &&
210 ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
211 return av_guess_format("image2", NULL, NULL);
214 /* Find the proper file type. */
217 while ((fmt = av_oformat_next(fmt))) {
219 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
221 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
223 if (filename && fmt->extensions &&
224 av_match_ext(filename, fmt->extensions)) {
227 if (score > score_max) {
235 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
236 const char *filename, const char *mime_type, enum AVMediaType type){
237 if(type == AVMEDIA_TYPE_VIDEO){
238 enum CodecID codec_id= CODEC_ID_NONE;
240 #if CONFIG_IMAGE2_MUXER
241 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
242 codec_id= ff_guess_image2_codec(filename);
245 if(codec_id == CODEC_ID_NONE)
246 codec_id= fmt->video_codec;
248 }else if(type == AVMEDIA_TYPE_AUDIO)
249 return fmt->audio_codec;
250 else if (type == AVMEDIA_TYPE_SUBTITLE)
251 return fmt->subtitle_codec;
253 return CODEC_ID_NONE;
256 AVInputFormat *av_find_input_format(const char *short_name)
258 AVInputFormat *fmt = NULL;
259 while ((fmt = av_iformat_next(fmt))) {
260 if (match_format(short_name, fmt->name))
267 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
269 int ret= av_new_packet(pkt, size);
274 pkt->pos= avio_tell(s);
276 ret= avio_read(s, pkt->data, size);
280 av_shrink_packet(pkt, ret);
285 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
290 return av_get_packet(s, pkt, size);
291 old_size = pkt->size;
292 ret = av_grow_packet(pkt, size);
295 ret = avio_read(s, pkt->data + old_size, size);
296 av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
301 int av_filename_number_test(const char *filename)
304 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
307 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
309 AVProbeData lpd = *pd;
310 AVInputFormat *fmt1 = NULL, *fmt;
313 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
314 int id3len = ff_id3v2_tag_len(lpd.buf);
315 if (lpd.buf_size > id3len + 16) {
317 lpd.buf_size -= id3len;
323 while ((fmt1 = av_iformat_next(fmt1))) {
324 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
327 if (fmt1->read_probe) {
328 score = fmt1->read_probe(&lpd);
329 } else if (fmt1->extensions) {
330 if (av_match_ext(lpd.filename, fmt1->extensions)) {
334 if (score > *score_max) {
337 }else if (score == *score_max)
341 /* a hack for files with huge id3v2 tags -- try to guess by file extension. */
342 if (!fmt && id3 && *score_max < AVPROBE_SCORE_MAX/4) {
343 while ((fmt = av_iformat_next(fmt)))
344 if (fmt->extensions && av_match_ext(lpd.filename, fmt->extensions)) {
345 *score_max = AVPROBE_SCORE_MAX/4;
353 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
355 return av_probe_input_format2(pd, is_opened, &score);
358 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
360 static const struct {
361 const char *name; enum CodecID id; enum AVMediaType type;
363 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
364 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
365 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
366 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
367 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
368 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
369 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
370 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
373 AVInputFormat *fmt = av_probe_input_format2(pd, 1, &score);
377 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
378 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
379 for (i = 0; fmt_id_type[i].name; i++) {
380 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
381 st->codec->codec_id = fmt_id_type[i].id;
382 st->codec->codec_type = fmt_id_type[i].type;
390 /************************************************************/
391 /* input media file */
393 #if FF_API_FORMAT_PARAMETERS
394 static AVDictionary *convert_format_parameters(AVFormatParameters *ap)
397 AVDictionary *opts = NULL;
402 if (ap->time_base.num) {
403 snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
404 av_dict_set(&opts, "framerate", buf, 0);
406 if (ap->sample_rate) {
407 snprintf(buf, sizeof(buf), "%d", ap->sample_rate);
408 av_dict_set(&opts, "sample_rate", buf, 0);
411 snprintf(buf, sizeof(buf), "%d", ap->channels);
412 av_dict_set(&opts, "channels", buf, 0);
414 if (ap->width || ap->height) {
415 snprintf(buf, sizeof(buf), "%dx%d", ap->width, ap->height);
416 av_dict_set(&opts, "video_size", buf, 0);
418 if (ap->pix_fmt != PIX_FMT_NONE) {
419 av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(ap->pix_fmt), 0);
422 snprintf(buf, sizeof(buf), "%d", ap->channel);
423 av_dict_set(&opts, "channel", buf, 0);
426 av_dict_set(&opts, "standard", ap->standard, 0);
428 if (ap->mpeg2ts_compute_pcr) {
429 av_dict_set(&opts, "mpeg2ts_compute_pcr", "1", 0);
431 if (ap->initial_pause) {
432 av_dict_set(&opts, "initial_pause", "1", 0);
438 * Open a media file from an IO stream. 'fmt' must be specified.
440 int av_open_input_stream(AVFormatContext **ic_ptr,
441 AVIOContext *pb, const char *filename,
442 AVInputFormat *fmt, AVFormatParameters *ap)
447 AVFormatParameters default_ap;
451 memset(ap, 0, sizeof(default_ap));
453 opts = convert_format_parameters(ap);
455 if(!ap->prealloced_context)
456 ic = avformat_alloc_context();
460 err = AVERROR(ENOMEM);
463 if (pb && fmt && fmt->flags & AVFMT_NOFILE)
464 av_log(ic, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
465 "will be ignored with AVFMT_NOFILE format.\n");
469 if ((err = avformat_open_input(&ic, filename, fmt, &opts)) < 0)
471 ic->pb = ic->pb ? ic->pb : pb; // don't leak custom pb if it wasn't set above
480 /** size of probe buffer, for guessing file type from file contents */
481 #define PROBE_BUF_MIN 2048
482 #define PROBE_BUF_MAX (1<<20)
484 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
485 const char *filename, void *logctx,
486 unsigned int offset, unsigned int max_probe_size)
488 AVProbeData pd = { filename ? filename : "", NULL, -offset };
489 unsigned char *buf = NULL;
490 int ret = 0, probe_size;
492 if (!max_probe_size) {
493 max_probe_size = PROBE_BUF_MAX;
494 } else if (max_probe_size > PROBE_BUF_MAX) {
495 max_probe_size = PROBE_BUF_MAX;
496 } else if (max_probe_size < PROBE_BUF_MIN) {
497 return AVERROR(EINVAL);
500 if (offset >= max_probe_size) {
501 return AVERROR(EINVAL);
504 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
505 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
506 int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
507 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
509 if (probe_size < offset) {
513 /* read probe data */
514 buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
515 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
516 /* fail if error was not end of file, otherwise, lower score */
517 if (ret != AVERROR_EOF) {
522 ret = 0; /* error was end of file, nothing read */
525 pd.buf = &buf[offset];
527 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
529 /* guess file format */
530 *fmt = av_probe_input_format2(&pd, 1, &score);
532 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
533 av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
535 av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
541 return AVERROR_INVALIDDATA;
544 /* rewind. reuse probe buffer to avoid seeking */
545 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
551 #if FF_API_FORMAT_PARAMETERS
552 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
555 AVFormatParameters *ap)
558 AVDictionary *opts = convert_format_parameters(ap);
560 if (!ap || !ap->prealloced_context)
563 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
570 /* open input file and probe the format if necessary */
571 static int init_input(AVFormatContext *s, const char *filename)
574 AVProbeData pd = {filename, NULL, 0};
577 s->flags |= AVFMT_FLAG_CUSTOM_IO;
579 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
580 else if (s->iformat->flags & AVFMT_NOFILE)
581 return AVERROR(EINVAL);
585 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
586 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
589 if ((ret = avio_open(&s->pb, filename, AVIO_FLAG_READ)) < 0)
593 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
596 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
598 AVFormatContext *s = *ps;
600 AVFormatParameters ap = { { 0 } };
601 AVDictionary *tmp = NULL;
603 if (!s && !(s = avformat_alloc_context()))
604 return AVERROR(ENOMEM);
609 av_dict_copy(&tmp, *options, 0);
611 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
614 if ((ret = init_input(s, filename)) < 0)
617 /* check filename in case an image number is expected */
618 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
619 if (!av_filename_number_test(filename)) {
620 ret = AVERROR(EINVAL);
625 s->duration = s->start_time = AV_NOPTS_VALUE;
626 av_strlcpy(s->filename, filename, sizeof(s->filename));
628 /* allocate private data */
629 if (s->iformat->priv_data_size > 0) {
630 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
631 ret = AVERROR(ENOMEM);
634 if (s->iformat->priv_class) {
635 *(const AVClass**)s->priv_data = s->iformat->priv_class;
636 av_opt_set_defaults(s->priv_data);
637 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
642 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
644 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
646 if (s->iformat->read_header)
647 if ((ret = s->iformat->read_header(s, &ap)) < 0)
650 if (s->pb && !s->data_offset)
651 s->data_offset = avio_tell(s->pb);
653 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
656 av_dict_free(options);
664 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
666 avformat_free_context(s);
671 /*******************************************************/
673 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
674 AVPacketList **plast_pktl){
675 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
680 (*plast_pktl)->next = pktl;
682 *packet_buffer = pktl;
684 /* add the packet in the buffered packet list */
690 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
696 AVPacketList *pktl = s->raw_packet_buffer;
700 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
701 !s->streams[pkt->stream_index]->probe_packets ||
702 s->raw_packet_buffer_remaining_size < pkt->size){
703 AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
706 s->raw_packet_buffer = pktl->next;
707 s->raw_packet_buffer_remaining_size += pkt->size;
714 ret= s->iformat->read_packet(s, pkt);
716 if (!pktl || ret == AVERROR(EAGAIN))
718 for (i = 0; i < s->nb_streams; i++)
719 s->streams[i]->probe_packets = 0;
723 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
724 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
725 av_log(s, AV_LOG_WARNING,
726 "Dropped corrupted packet (stream = %d)\n",
731 st= s->streams[pkt->stream_index];
733 switch(st->codec->codec_type){
734 case AVMEDIA_TYPE_VIDEO:
735 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
737 case AVMEDIA_TYPE_AUDIO:
738 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
740 case AVMEDIA_TYPE_SUBTITLE:
741 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
745 if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
749 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
750 s->raw_packet_buffer_remaining_size -= pkt->size;
752 if(st->codec->codec_id == CODEC_ID_PROBE){
753 AVProbeData *pd = &st->probe_data;
754 av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
757 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
758 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
759 pd->buf_size += pkt->size;
760 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
762 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
763 //FIXME we dont reduce score to 0 for the case of running out of buffer space in bytes
764 set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0);
765 if(st->codec->codec_id != CODEC_ID_PROBE){
768 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
775 /**********************************************************/
778 * Get the number of samples of an audio frame. Return -1 on error.
780 static int get_audio_frame_size(AVCodecContext *enc, int size)
784 if(enc->codec_id == CODEC_ID_VORBIS)
787 if (enc->frame_size <= 1) {
788 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
790 if (bits_per_sample) {
791 if (enc->channels == 0)
793 frame_size = (size << 3) / (bits_per_sample * enc->channels);
795 /* used for example by ADPCM codecs */
796 if (enc->bit_rate == 0)
798 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
801 frame_size = enc->frame_size;
808 * Return the frame duration in seconds. Return 0 if not available.
810 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
811 AVCodecParserContext *pc, AVPacket *pkt)
817 switch(st->codec->codec_type) {
818 case AVMEDIA_TYPE_VIDEO:
819 if(st->time_base.num*1000LL > st->time_base.den){
820 *pnum = st->time_base.num;
821 *pden = st->time_base.den;
822 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
823 *pnum = st->codec->time_base.num;
824 *pden = st->codec->time_base.den;
825 if (pc && pc->repeat_pict) {
826 *pnum = (*pnum) * (1 + pc->repeat_pict);
828 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
829 //Thus if we have no parser in such case leave duration undefined.
830 if(st->codec->ticks_per_frame>1 && !pc){
835 case AVMEDIA_TYPE_AUDIO:
836 frame_size = get_audio_frame_size(st->codec, pkt->size);
837 if (frame_size <= 0 || st->codec->sample_rate <= 0)
840 *pden = st->codec->sample_rate;
847 static int is_intra_only(AVCodecContext *enc){
848 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
850 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
851 switch(enc->codec_id){
853 case CODEC_ID_MJPEGB:
855 case CODEC_ID_PRORES:
856 case CODEC_ID_RAWVIDEO:
857 case CODEC_ID_DVVIDEO:
858 case CODEC_ID_HUFFYUV:
859 case CODEC_ID_FFVHUFF:
864 case CODEC_ID_JPEG2000:
872 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
873 int64_t dts, int64_t pts)
875 AVStream *st= s->streams[stream_index];
876 AVPacketList *pktl= s->packet_buffer;
878 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
881 st->first_dts= dts - st->cur_dts;
884 for(; pktl; pktl= pktl->next){
885 if(pktl->pkt.stream_index != stream_index)
887 //FIXME think more about this check
888 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
889 pktl->pkt.pts += st->first_dts;
891 if(pktl->pkt.dts != AV_NOPTS_VALUE)
892 pktl->pkt.dts += st->first_dts;
894 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
895 st->start_time= pktl->pkt.pts;
897 if (st->start_time == AV_NOPTS_VALUE)
898 st->start_time = pts;
901 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
903 AVPacketList *pktl= s->packet_buffer;
906 if(st->first_dts != AV_NOPTS_VALUE){
907 cur_dts= st->first_dts;
908 for(; pktl; pktl= pktl->next){
909 if(pktl->pkt.stream_index == pkt->stream_index){
910 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
912 cur_dts -= pkt->duration;
915 pktl= s->packet_buffer;
916 st->first_dts = cur_dts;
917 }else if(st->cur_dts)
920 for(; pktl; pktl= pktl->next){
921 if(pktl->pkt.stream_index != pkt->stream_index)
923 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
924 && !pktl->pkt.duration){
925 pktl->pkt.dts= cur_dts;
926 if(!st->codec->has_b_frames)
927 pktl->pkt.pts= cur_dts;
928 cur_dts += pkt->duration;
929 pktl->pkt.duration= pkt->duration;
933 if(st->first_dts == AV_NOPTS_VALUE)
934 st->cur_dts= cur_dts;
937 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
938 AVCodecParserContext *pc, AVPacket *pkt)
940 int num, den, presentation_delayed, delay, i;
943 if (s->flags & AVFMT_FLAG_NOFILLIN)
946 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
947 pkt->dts= AV_NOPTS_VALUE;
949 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
950 //FIXME Set low_delay = 0 when has_b_frames = 1
951 st->codec->has_b_frames = 1;
953 /* do we have a video B-frame ? */
954 delay= st->codec->has_b_frames;
955 presentation_delayed = 0;
957 // ignore delay caused by frame threading so that the mpeg2-without-dts
958 // warning will not trigger
959 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
960 delay -= st->codec->thread_count-1;
962 /* XXX: need has_b_frame, but cannot get it if the codec is
965 pc && pc->pict_type != AV_PICTURE_TYPE_B)
966 presentation_delayed = 1;
968 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
969 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
970 pkt->dts -= 1LL<<st->pts_wrap_bits;
973 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
974 // we take the conservative approach and discard both
975 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
976 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
977 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
978 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
981 if (pkt->duration == 0) {
982 compute_frame_duration(&num, &den, st, pc, pkt);
984 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
986 if(pkt->duration != 0 && s->packet_buffer)
987 update_initial_durations(s, st, pkt);
991 /* correct timestamps with byte offset if demuxers only have timestamps
992 on packet boundaries */
993 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
994 /* this will estimate bitrate based on this frame's duration and size */
995 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
996 if(pkt->pts != AV_NOPTS_VALUE)
998 if(pkt->dts != AV_NOPTS_VALUE)
1002 if (pc && pc->dts_sync_point >= 0) {
1003 // we have synchronization info from the parser
1004 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1006 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1007 if (pkt->dts != AV_NOPTS_VALUE) {
1008 // got DTS from the stream, update reference timestamp
1009 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1010 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1011 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1012 // compute DTS based on reference timestamp
1013 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1014 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1016 if (pc->dts_sync_point > 0)
1017 st->reference_dts = pkt->dts; // new reference
1021 /* This may be redundant, but it should not hurt. */
1022 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1023 presentation_delayed = 1;
1025 // av_log(NULL, AV_LOG_DEBUG, "IN delayed:%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64" st:%d pc:%p\n", presentation_delayed, pkt->pts, pkt->dts, st->cur_dts, pkt->stream_index, pc);
1026 /* interpolate PTS and DTS if they are not present */
1027 //We skip H264 currently because delay and has_b_frames are not reliably set
1028 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1029 if (presentation_delayed) {
1030 /* DTS = decompression timestamp */
1031 /* PTS = presentation timestamp */
1032 if (pkt->dts == AV_NOPTS_VALUE)
1033 pkt->dts = st->last_IP_pts;
1034 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1035 if (pkt->dts == AV_NOPTS_VALUE)
1036 pkt->dts = st->cur_dts;
1038 /* this is tricky: the dts must be incremented by the duration
1039 of the frame we are displaying, i.e. the last I- or P-frame */
1040 if (st->last_IP_duration == 0)
1041 st->last_IP_duration = pkt->duration;
1042 if(pkt->dts != AV_NOPTS_VALUE)
1043 st->cur_dts = pkt->dts + st->last_IP_duration;
1044 st->last_IP_duration = pkt->duration;
1045 st->last_IP_pts= pkt->pts;
1046 /* cannot compute PTS if not present (we can compute it only
1047 by knowing the future */
1048 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1049 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1050 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1051 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1052 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1053 pkt->pts += pkt->duration;
1054 // 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);
1058 /* presentation is not delayed : PTS and DTS are the same */
1059 if(pkt->pts == AV_NOPTS_VALUE)
1060 pkt->pts = pkt->dts;
1061 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1062 if(pkt->pts == AV_NOPTS_VALUE)
1063 pkt->pts = st->cur_dts;
1064 pkt->dts = pkt->pts;
1065 if(pkt->pts != AV_NOPTS_VALUE)
1066 st->cur_dts = pkt->pts + pkt->duration;
1070 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1071 st->pts_buffer[0]= pkt->pts;
1072 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1073 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1074 if(pkt->dts == AV_NOPTS_VALUE)
1075 pkt->dts= st->pts_buffer[0];
1076 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1077 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1079 if(pkt->dts > st->cur_dts)
1080 st->cur_dts = pkt->dts;
1083 // 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);
1086 if(is_intra_only(st->codec))
1087 pkt->flags |= AV_PKT_FLAG_KEY;
1090 /* keyframe computation */
1091 if (pc->key_frame == 1)
1092 pkt->flags |= AV_PKT_FLAG_KEY;
1093 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1094 pkt->flags |= AV_PKT_FLAG_KEY;
1097 pkt->convergence_duration = pc->convergence_duration;
1101 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1106 av_init_packet(pkt);
1109 /* select current input stream component */
1112 if (!st->need_parsing || !st->parser) {
1113 /* no parsing needed: we just output the packet as is */
1114 /* raw data support */
1115 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
1116 compute_pkt_fields(s, st, NULL, pkt);
1118 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1119 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1120 ff_reduce_index(s, st->index);
1121 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1124 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1125 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1126 st->cur_ptr, st->cur_len,
1127 st->cur_pkt.pts, st->cur_pkt.dts,
1129 st->cur_pkt.pts = AV_NOPTS_VALUE;
1130 st->cur_pkt.dts = AV_NOPTS_VALUE;
1131 /* increment read pointer */
1135 /* return packet if any */
1139 pkt->stream_index = st->index;
1140 pkt->pts = st->parser->pts;
1141 pkt->dts = st->parser->dts;
1142 pkt->pos = st->parser->pos;
1143 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1145 pkt->destruct= st->cur_pkt.destruct;
1146 st->cur_pkt.destruct= NULL;
1147 st->cur_pkt.data = NULL;
1148 assert(st->cur_len == 0);
1150 pkt->destruct = NULL;
1152 compute_pkt_fields(s, st, st->parser, pkt);
1154 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1155 ff_reduce_index(s, st->index);
1156 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1157 0, 0, AVINDEX_KEYFRAME);
1164 av_free_packet(&st->cur_pkt);
1169 /* read next packet */
1170 ret = av_read_packet(s, &cur_pkt);
1172 if (ret == AVERROR(EAGAIN))
1174 /* return the last frames, if any */
1175 for(i = 0; i < s->nb_streams; i++) {
1177 if (st->parser && st->need_parsing) {
1178 av_parser_parse2(st->parser, st->codec,
1179 &pkt->data, &pkt->size,
1181 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1187 /* no more packets: really terminate parsing */
1190 st = s->streams[cur_pkt.stream_index];
1191 st->cur_pkt= cur_pkt;
1193 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1194 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1195 st->cur_pkt.pts < st->cur_pkt.dts){
1196 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1197 st->cur_pkt.stream_index,
1201 // av_free_packet(&st->cur_pkt);
1205 if(s->debug & FF_FDEBUG_TS)
1206 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1207 st->cur_pkt.stream_index,
1211 st->cur_pkt.duration,
1215 st->cur_ptr = st->cur_pkt.data;
1216 st->cur_len = st->cur_pkt.size;
1217 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1218 st->parser = av_parser_init(st->codec->codec_id);
1220 /* no parser available: just output the raw packets */
1221 st->need_parsing = AVSTREAM_PARSE_NONE;
1222 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1223 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1224 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1225 st->parser->flags |= PARSER_FLAG_ONCE;
1230 if(s->debug & FF_FDEBUG_TS)
1231 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1242 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1246 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1249 pktl = s->packet_buffer;
1251 AVPacket *next_pkt= &pktl->pkt;
1253 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1254 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1255 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1256 if( pktl->pkt.stream_index == next_pkt->stream_index
1257 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1258 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1259 next_pkt->pts= pktl->pkt.dts;
1263 pktl = s->packet_buffer;
1266 if( next_pkt->pts != AV_NOPTS_VALUE
1267 || next_pkt->dts == AV_NOPTS_VALUE
1269 /* read packet from packet buffer, if there is data */
1271 s->packet_buffer = pktl->next;
1277 int ret= read_frame_internal(s, pkt);
1279 if(pktl && ret != AVERROR(EAGAIN)){
1286 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1287 &s->packet_buffer_end)) < 0)
1288 return AVERROR(ENOMEM);
1290 assert(!s->packet_buffer);
1291 return read_frame_internal(s, pkt);
1296 /* XXX: suppress the packet queue */
1297 static void flush_packet_queue(AVFormatContext *s)
1302 pktl = s->packet_buffer;
1305 s->packet_buffer = pktl->next;
1306 av_free_packet(&pktl->pkt);
1309 while(s->raw_packet_buffer){
1310 pktl = s->raw_packet_buffer;
1311 s->raw_packet_buffer = pktl->next;
1312 av_free_packet(&pktl->pkt);
1315 s->packet_buffer_end=
1316 s->raw_packet_buffer_end= NULL;
1317 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1320 /*******************************************************/
1323 int av_find_default_stream_index(AVFormatContext *s)
1325 int first_audio_index = -1;
1329 if (s->nb_streams <= 0)
1331 for(i = 0; i < s->nb_streams; i++) {
1333 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1336 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1337 first_audio_index = i;
1339 return first_audio_index >= 0 ? first_audio_index : 0;
1343 * Flush the frame reader.
1345 void ff_read_frame_flush(AVFormatContext *s)
1350 flush_packet_queue(s);
1354 /* for each stream, reset read state */
1355 for(i = 0; i < s->nb_streams; i++) {
1359 av_parser_close(st->parser);
1361 av_free_packet(&st->cur_pkt);
1363 st->last_IP_pts = AV_NOPTS_VALUE;
1364 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1365 st->reference_dts = AV_NOPTS_VALUE;
1370 st->probe_packets = MAX_PROBE_PACKETS;
1372 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1373 st->pts_buffer[j]= AV_NOPTS_VALUE;
1377 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1380 for(i = 0; i < s->nb_streams; i++) {
1381 AVStream *st = s->streams[i];
1383 st->cur_dts = av_rescale(timestamp,
1384 st->time_base.den * (int64_t)ref_st->time_base.num,
1385 st->time_base.num * (int64_t)ref_st->time_base.den);
1389 void ff_reduce_index(AVFormatContext *s, int stream_index)
1391 AVStream *st= s->streams[stream_index];
1392 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1394 if((unsigned)st->nb_index_entries >= max_entries){
1396 for(i=0; 2*i<st->nb_index_entries; i++)
1397 st->index_entries[i]= st->index_entries[2*i];
1398 st->nb_index_entries= i;
1402 int ff_add_index_entry(AVIndexEntry **index_entries,
1403 int *nb_index_entries,
1404 unsigned int *index_entries_allocated_size,
1405 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1407 AVIndexEntry *entries, *ie;
1410 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1413 entries = av_fast_realloc(*index_entries,
1414 index_entries_allocated_size,
1415 (*nb_index_entries + 1) *
1416 sizeof(AVIndexEntry));
1420 *index_entries= entries;
1422 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1425 index= (*nb_index_entries)++;
1426 ie= &entries[index];
1427 assert(index==0 || ie[-1].timestamp < timestamp);
1429 ie= &entries[index];
1430 if(ie->timestamp != timestamp){
1431 if(ie->timestamp <= timestamp)
1433 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1434 (*nb_index_entries)++;
1435 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1436 distance= ie->min_distance;
1440 ie->timestamp = timestamp;
1441 ie->min_distance= distance;
1448 int av_add_index_entry(AVStream *st,
1449 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1451 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1452 &st->index_entries_allocated_size, pos,
1453 timestamp, size, distance, flags);
1456 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1457 int64_t wanted_timestamp, int flags)
1465 //optimize appending index entries at the end
1466 if(b && entries[b-1].timestamp < wanted_timestamp)
1471 timestamp = entries[m].timestamp;
1472 if(timestamp >= wanted_timestamp)
1474 if(timestamp <= wanted_timestamp)
1477 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1479 if(!(flags & AVSEEK_FLAG_ANY)){
1480 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1481 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1490 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1493 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1494 wanted_timestamp, flags);
1497 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1498 AVInputFormat *avif= s->iformat;
1499 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1500 int64_t ts_min, ts_max, ts;
1505 if (stream_index < 0)
1508 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1511 ts_min= AV_NOPTS_VALUE;
1512 pos_limit= -1; //gcc falsely says it may be uninitialized
1514 st= s->streams[stream_index];
1515 if(st->index_entries){
1518 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()
1519 index= FFMAX(index, 0);
1520 e= &st->index_entries[index];
1522 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1524 ts_min= e->timestamp;
1525 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1531 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1532 assert(index < st->nb_index_entries);
1534 e= &st->index_entries[index];
1535 assert(e->timestamp >= target_ts);
1537 ts_max= e->timestamp;
1538 pos_limit= pos_max - e->min_distance;
1539 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1540 pos_max,pos_limit, ts_max);
1544 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1549 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1552 av_update_cur_dts(s, st, ts);
1557 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, int64_t pos_min, int64_t pos_max, int64_t pos_limit, int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret, int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t )){
1559 int64_t start_pos, filesize;
1562 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1564 if(ts_min == AV_NOPTS_VALUE){
1565 pos_min = s->data_offset;
1566 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1567 if (ts_min == AV_NOPTS_VALUE)
1571 if(ts_max == AV_NOPTS_VALUE){
1573 filesize = avio_size(s->pb);
1574 pos_max = filesize - 1;
1577 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1579 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1580 if (ts_max == AV_NOPTS_VALUE)
1584 int64_t tmp_pos= pos_max + 1;
1585 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1586 if(tmp_ts == AV_NOPTS_VALUE)
1590 if(tmp_pos >= filesize)
1596 if(ts_min > ts_max){
1598 }else if(ts_min == ts_max){
1603 while (pos_min < pos_limit) {
1604 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1605 pos_min, pos_max, ts_min, ts_max);
1606 assert(pos_limit <= pos_max);
1609 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1610 // interpolate position (better than dichotomy)
1611 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1612 + pos_min - approximate_keyframe_distance;
1613 }else if(no_change==1){
1614 // bisection, if interpolation failed to change min or max pos last time
1615 pos = (pos_min + pos_limit)>>1;
1617 /* linear search if bisection failed, can only happen if there
1618 are very few or no keyframes between min/max */
1623 else if(pos > pos_limit)
1627 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1632 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1633 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1634 pos_limit, start_pos, no_change);
1635 if(ts == AV_NOPTS_VALUE){
1636 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1639 assert(ts != AV_NOPTS_VALUE);
1640 if (target_ts <= ts) {
1641 pos_limit = start_pos - 1;
1645 if (target_ts >= ts) {
1651 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1652 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1654 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1656 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1657 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1658 pos, ts_min, target_ts, ts_max);
1663 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1664 int64_t pos_min, pos_max;
1668 if (stream_index < 0)
1671 st= s->streams[stream_index];
1674 pos_min = s->data_offset;
1675 pos_max = avio_size(s->pb) - 1;
1677 if (pos < pos_min) pos= pos_min;
1678 else if(pos > pos_max) pos= pos_max;
1680 avio_seek(s->pb, pos, SEEK_SET);
1683 av_update_cur_dts(s, st, ts);
1688 static int seek_frame_generic(AVFormatContext *s,
1689 int stream_index, int64_t timestamp, int flags)
1696 st = s->streams[stream_index];
1698 index = av_index_search_timestamp(st, timestamp, flags);
1700 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1703 if(index < 0 || index==st->nb_index_entries-1){
1706 if(st->nb_index_entries){
1707 assert(st->index_entries);
1708 ie= &st->index_entries[st->nb_index_entries-1];
1709 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1711 av_update_cur_dts(s, st, ie->timestamp);
1713 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1719 read_status = av_read_frame(s, &pkt);
1720 } while (read_status == AVERROR(EAGAIN));
1721 if (read_status < 0)
1723 av_free_packet(&pkt);
1724 if(stream_index == pkt.stream_index){
1725 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1729 index = av_index_search_timestamp(st, timestamp, flags);
1734 ff_read_frame_flush(s);
1735 if (s->iformat->read_seek){
1736 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1739 ie = &st->index_entries[index];
1740 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1742 av_update_cur_dts(s, st, ie->timestamp);
1747 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1752 if (flags & AVSEEK_FLAG_BYTE) {
1753 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1755 ff_read_frame_flush(s);
1756 return seek_frame_byte(s, stream_index, timestamp, flags);
1759 if(stream_index < 0){
1760 stream_index= av_find_default_stream_index(s);
1761 if(stream_index < 0)
1764 st= s->streams[stream_index];
1765 /* timestamp for default must be expressed in AV_TIME_BASE units */
1766 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1769 /* first, we try the format specific seek */
1770 if (s->iformat->read_seek) {
1771 ff_read_frame_flush(s);
1772 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1779 if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1780 ff_read_frame_flush(s);
1781 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1782 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1783 ff_read_frame_flush(s);
1784 return seek_frame_generic(s, stream_index, timestamp, flags);
1790 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1792 if(min_ts > ts || max_ts < ts)
1795 if (s->iformat->read_seek2) {
1796 ff_read_frame_flush(s);
1797 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1800 if(s->iformat->read_timestamp){
1801 //try to seek via read_timestamp()
1804 //Fallback to old API if new is not implemented but old is
1805 //Note the old has somewat different sematics
1806 if(s->iformat->read_seek || 1)
1807 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1809 // try some generic seek like seek_frame_generic() but with new ts semantics
1812 /*******************************************************/
1815 * Return TRUE if the stream has accurate duration in any stream.
1817 * @return TRUE if the stream has accurate duration for at least one component.
1819 static int has_duration(AVFormatContext *ic)
1824 for(i = 0;i < ic->nb_streams; i++) {
1825 st = ic->streams[i];
1826 if (st->duration != AV_NOPTS_VALUE)
1833 * Estimate the stream timings from the one of each components.
1835 * Also computes the global bitrate if possible.
1837 static void update_stream_timings(AVFormatContext *ic)
1839 int64_t start_time, start_time1, end_time, end_time1;
1840 int64_t duration, duration1, filesize;
1844 start_time = INT64_MAX;
1845 end_time = INT64_MIN;
1846 duration = INT64_MIN;
1847 for(i = 0;i < ic->nb_streams; i++) {
1848 st = ic->streams[i];
1849 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1850 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1851 if (start_time1 < start_time)
1852 start_time = start_time1;
1853 if (st->duration != AV_NOPTS_VALUE) {
1854 end_time1 = start_time1
1855 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1856 if (end_time1 > end_time)
1857 end_time = end_time1;
1860 if (st->duration != AV_NOPTS_VALUE) {
1861 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1862 if (duration1 > duration)
1863 duration = duration1;
1866 if (start_time != INT64_MAX) {
1867 ic->start_time = start_time;
1868 if (end_time != INT64_MIN) {
1869 if (end_time - start_time > duration)
1870 duration = end_time - start_time;
1873 if (duration != INT64_MIN) {
1874 ic->duration = duration;
1875 if (ic->pb && (filesize = avio_size(ic->pb)) > 0) {
1876 /* compute the bitrate */
1877 ic->bit_rate = (double)filesize * 8.0 * AV_TIME_BASE /
1878 (double)ic->duration;
1883 static void fill_all_stream_timings(AVFormatContext *ic)
1888 update_stream_timings(ic);
1889 for(i = 0;i < ic->nb_streams; i++) {
1890 st = ic->streams[i];
1891 if (st->start_time == AV_NOPTS_VALUE) {
1892 if(ic->start_time != AV_NOPTS_VALUE)
1893 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1894 if(ic->duration != AV_NOPTS_VALUE)
1895 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1900 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
1902 int64_t filesize, duration;
1906 /* if bit_rate is already set, we believe it */
1907 if (ic->bit_rate <= 0) {
1909 for(i=0;i<ic->nb_streams;i++) {
1910 st = ic->streams[i];
1911 if (st->codec->bit_rate > 0)
1912 bit_rate += st->codec->bit_rate;
1914 ic->bit_rate = bit_rate;
1917 /* if duration is already set, we believe it */
1918 if (ic->duration == AV_NOPTS_VALUE &&
1919 ic->bit_rate != 0) {
1920 filesize = ic->pb ? avio_size(ic->pb) : 0;
1922 for(i = 0; i < ic->nb_streams; i++) {
1923 st = ic->streams[i];
1924 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1925 if (st->duration == AV_NOPTS_VALUE)
1926 st->duration = duration;
1932 #define DURATION_MAX_READ_SIZE 250000
1933 #define DURATION_MAX_RETRY 3
1935 /* only usable for MPEG-PS streams */
1936 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1938 AVPacket pkt1, *pkt = &pkt1;
1940 int read_size, i, ret;
1942 int64_t filesize, offset, duration;
1947 /* flush packet queue */
1948 flush_packet_queue(ic);
1950 for (i=0; i<ic->nb_streams; i++) {
1951 st = ic->streams[i];
1952 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1953 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
1956 av_parser_close(st->parser);
1958 av_free_packet(&st->cur_pkt);
1962 /* estimate the end time (duration) */
1963 /* XXX: may need to support wrapping */
1964 filesize = ic->pb ? avio_size(ic->pb) : 0;
1965 end_time = AV_NOPTS_VALUE;
1967 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
1971 avio_seek(ic->pb, offset, SEEK_SET);
1974 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
1978 ret = av_read_packet(ic, pkt);
1979 } while(ret == AVERROR(EAGAIN));
1982 read_size += pkt->size;
1983 st = ic->streams[pkt->stream_index];
1984 if (pkt->pts != AV_NOPTS_VALUE &&
1985 (st->start_time != AV_NOPTS_VALUE ||
1986 st->first_dts != AV_NOPTS_VALUE)) {
1987 duration = end_time = pkt->pts;
1988 if (st->start_time != AV_NOPTS_VALUE)
1989 duration -= st->start_time;
1991 duration -= st->first_dts;
1993 duration += 1LL<<st->pts_wrap_bits;
1995 if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
1996 st->duration = duration;
1999 av_free_packet(pkt);
2001 }while( end_time==AV_NOPTS_VALUE
2002 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2003 && ++retry <= DURATION_MAX_RETRY);
2005 fill_all_stream_timings(ic);
2007 avio_seek(ic->pb, old_offset, SEEK_SET);
2008 for (i=0; i<ic->nb_streams; i++) {
2010 st->cur_dts= st->first_dts;
2011 st->last_IP_pts = AV_NOPTS_VALUE;
2012 st->reference_dts = AV_NOPTS_VALUE;
2016 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2020 /* get the file size, if possible */
2021 if (ic->iformat->flags & AVFMT_NOFILE) {
2024 file_size = avio_size(ic->pb);
2029 if ((!strcmp(ic->iformat->name, "mpeg") ||
2030 !strcmp(ic->iformat->name, "mpegts")) &&
2031 file_size && ic->pb->seekable) {
2032 /* get accurate estimate from the PTSes */
2033 estimate_timings_from_pts(ic, old_offset);
2034 } else if (has_duration(ic)) {
2035 /* at least one component has timings - we use them for all
2037 fill_all_stream_timings(ic);
2039 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2040 /* less precise: use bitrate info */
2041 estimate_timings_from_bit_rate(ic);
2043 update_stream_timings(ic);
2047 AVStream av_unused *st;
2048 for(i = 0;i < ic->nb_streams; i++) {
2049 st = ic->streams[i];
2050 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2051 (double) st->start_time / AV_TIME_BASE,
2052 (double) st->duration / AV_TIME_BASE);
2054 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2055 (double) ic->start_time / AV_TIME_BASE,
2056 (double) ic->duration / AV_TIME_BASE,
2057 ic->bit_rate / 1000);
2061 static int has_codec_parameters(AVCodecContext *avctx)
2064 switch (avctx->codec_type) {
2065 case AVMEDIA_TYPE_AUDIO:
2066 val = avctx->sample_rate && avctx->channels && avctx->sample_fmt != AV_SAMPLE_FMT_NONE;
2067 if (!avctx->frame_size &&
2068 (avctx->codec_id == CODEC_ID_VORBIS ||
2069 avctx->codec_id == CODEC_ID_AAC ||
2070 avctx->codec_id == CODEC_ID_MP1 ||
2071 avctx->codec_id == CODEC_ID_MP2 ||
2072 avctx->codec_id == CODEC_ID_MP3 ||
2073 avctx->codec_id == CODEC_ID_CELT))
2076 case AVMEDIA_TYPE_VIDEO:
2077 val = avctx->width && avctx->pix_fmt != PIX_FMT_NONE;
2083 return avctx->codec_id != CODEC_ID_NONE && val != 0;
2086 static int has_decode_delay_been_guessed(AVStream *st)
2088 return st->codec->codec_id != CODEC_ID_H264 ||
2089 st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2092 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2096 int got_picture, data_size, ret=0;
2099 if(!st->codec->codec){
2100 codec = avcodec_find_decoder(st->codec->codec_id);
2103 ret = avcodec_open2(st->codec, codec, options);
2108 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st) ||
2109 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF)) {
2110 switch(st->codec->codec_type) {
2111 case AVMEDIA_TYPE_VIDEO:
2112 avcodec_get_frame_defaults(&picture);
2113 ret = avcodec_decode_video2(st->codec, &picture,
2114 &got_picture, avpkt);
2116 case AVMEDIA_TYPE_AUDIO:
2117 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2118 samples = av_malloc(data_size);
2121 ret = avcodec_decode_audio3(st->codec, samples,
2133 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2135 while (tags->id != CODEC_ID_NONE) {
2143 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2146 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2147 if(tag == tags[i].tag)
2150 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2151 if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2154 return CODEC_ID_NONE;
2157 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2160 for(i=0; tags && tags[i]; i++){
2161 int tag= ff_codec_get_tag(tags[i], id);
2167 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2170 for(i=0; tags && tags[i]; i++){
2171 enum CodecID id= ff_codec_get_id(tags[i], tag);
2172 if(id!=CODEC_ID_NONE) return id;
2174 return CODEC_ID_NONE;
2177 static void compute_chapters_end(AVFormatContext *s)
2180 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2182 for (i = 0; i < s->nb_chapters; i++)
2183 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2184 AVChapter *ch = s->chapters[i];
2185 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2188 for (j = 0; j < s->nb_chapters; j++) {
2189 AVChapter *ch1 = s->chapters[j];
2190 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2191 if (j != i && next_start > ch->start && next_start < end)
2194 ch->end = (end == INT64_MAX) ? ch->start : end;
2198 static int get_std_framerate(int i){
2199 if(i<60*12) return i*1001;
2200 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2204 * Is the time base unreliable.
2205 * This is a heuristic to balance between quick acceptance of the values in
2206 * the headers vs. some extra checks.
2207 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2208 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2209 * And there are "variable" fps files this needs to detect as well.
2211 static int tb_unreliable(AVCodecContext *c){
2212 if( c->time_base.den >= 101L*c->time_base.num
2213 || c->time_base.den < 5L*c->time_base.num
2214 /* || c->codec_tag == AV_RL32("DIVX")
2215 || c->codec_tag == AV_RL32("XVID")*/
2216 || c->codec_id == CODEC_ID_MPEG2VIDEO
2217 || c->codec_id == CODEC_ID_H264
2223 #if FF_API_FORMAT_PARAMETERS
2224 int av_find_stream_info(AVFormatContext *ic)
2226 return avformat_find_stream_info(ic, NULL);
2230 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2232 int i, count, ret, read_size, j;
2234 AVPacket pkt1, *pkt;
2235 int64_t old_offset = avio_tell(ic->pb);
2236 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2238 for(i=0;i<ic->nb_streams;i++) {
2240 st = ic->streams[i];
2242 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2243 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2244 /* if(!st->time_base.num)
2246 if(!st->codec->time_base.num)
2247 st->codec->time_base= st->time_base;
2249 //only for the split stuff
2250 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2251 st->parser = av_parser_init(st->codec->codec_id);
2252 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2253 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2256 assert(!st->codec->codec);
2257 codec = avcodec_find_decoder(st->codec->codec_id);
2259 /* Ensure that subtitle_header is properly set. */
2260 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2261 && codec && !st->codec->codec)
2262 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2264 //try to just open decoders, in case this is enough to get parameters
2265 if(!has_codec_parameters(st->codec)){
2266 if (codec && !st->codec->codec)
2267 avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
2271 for (i=0; i<ic->nb_streams; i++) {
2272 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2278 if(url_interrupt_cb()){
2280 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2284 /* check if one codec still needs to be handled */
2285 for(i=0;i<ic->nb_streams;i++) {
2286 int fps_analyze_framecount = 20;
2288 st = ic->streams[i];
2289 if (!has_codec_parameters(st->codec))
2291 /* if the timebase is coarse (like the usual millisecond precision
2292 of mkv), we need to analyze more frames to reliably arrive at
2294 if (av_q2d(st->time_base) > 0.0005)
2295 fps_analyze_framecount *= 2;
2296 if (ic->fps_probe_size >= 0)
2297 fps_analyze_framecount = ic->fps_probe_size;
2298 /* variable fps and no guess at the real fps */
2299 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2300 && st->info->duration_count < fps_analyze_framecount
2301 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2303 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2305 if(st->first_dts == AV_NOPTS_VALUE)
2308 if (i == ic->nb_streams) {
2309 /* NOTE: if the format has no header, then we need to read
2310 some packets to get most of the streams, so we cannot
2312 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2313 /* if we found the info for all the codecs, we can stop */
2315 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2319 /* we did not get all the codec info, but we read too much data */
2320 if (read_size >= ic->probesize) {
2322 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2326 /* NOTE: a new stream can be added there if no header in file
2327 (AVFMTCTX_NOHEADER) */
2328 ret = read_frame_internal(ic, &pkt1);
2329 if (ret == AVERROR(EAGAIN))
2334 ret = -1; /* we could not have all the codec parameters before EOF */
2335 for(i=0;i<ic->nb_streams;i++) {
2336 st = ic->streams[i];
2337 if (!has_codec_parameters(st->codec)){
2339 avcodec_string(buf, sizeof(buf), st->codec, 0);
2340 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2348 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2349 if ((ret = av_dup_packet(pkt)) < 0)
2350 goto find_stream_info_err;
2352 read_size += pkt->size;
2354 st = ic->streams[pkt->stream_index];
2355 if (st->codec_info_nb_frames>1) {
2356 if (st->time_base.den > 0 && av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
2357 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2360 st->info->codec_info_duration += pkt->duration;
2363 int64_t last = st->info->last_dts;
2365 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2366 int64_t duration= pkt->dts - last;
2367 double dur= duration * av_q2d(st->time_base);
2369 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2370 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2371 if (st->info->duration_count < 2)
2372 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2373 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2374 int framerate= get_std_framerate(i);
2375 int ticks= lrintf(dur*framerate/(1001*12));
2376 double error= dur - ticks*1001*12/(double)framerate;
2377 st->info->duration_error[i] += error*error;
2379 st->info->duration_count++;
2380 // ignore the first 4 values, they might have some random jitter
2381 if (st->info->duration_count > 3)
2382 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2384 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2385 st->info->last_dts = pkt->dts;
2387 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2388 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2390 st->codec->extradata_size= i;
2391 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2392 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2393 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2397 /* if still no information, we try to open the codec and to
2398 decompress the frame. We try to avoid that in most cases as
2399 it takes longer and uses more memory. For MPEG-4, we need to
2400 decompress for QuickTime.
2402 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2403 least one frame of codec data, this makes sure the codec initializes
2404 the channel configuration and does not only trust the values from the container.
2406 try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
2408 st->codec_info_nb_frames++;
2412 // close codecs which were opened in try_decode_frame()
2413 for(i=0;i<ic->nb_streams;i++) {
2414 st = ic->streams[i];
2415 if(st->codec->codec)
2416 avcodec_close(st->codec);
2418 for(i=0;i<ic->nb_streams;i++) {
2419 st = ic->streams[i];
2420 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2421 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2422 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2423 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2424 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2425 // the check for tb_unreliable() is not completely correct, since this is not about handling
2426 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2427 // ipmovie.c produces.
2428 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > 1 && !st->r_frame_rate.num)
2429 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);
2430 if (st->info->duration_count && !st->r_frame_rate.num
2431 && tb_unreliable(st->codec) /*&&
2432 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2433 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2435 double best_error= 2*av_q2d(st->time_base);
2436 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2438 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2439 double error = st->info->duration_error[j] * get_std_framerate(j);
2440 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2441 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2442 if(error < best_error){
2444 num = get_std_framerate(j);
2447 // do not increase frame rate by more than 1 % in order to match a standard rate.
2448 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2449 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2452 if (!st->r_frame_rate.num){
2453 if( st->codec->time_base.den * (int64_t)st->time_base.num
2454 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2455 st->r_frame_rate.num = st->codec->time_base.den;
2456 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2458 st->r_frame_rate.num = st->time_base.den;
2459 st->r_frame_rate.den = st->time_base.num;
2462 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2463 if(!st->codec->bits_per_coded_sample)
2464 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2465 // set stream disposition based on audio service type
2466 switch (st->codec->audio_service_type) {
2467 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2468 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2469 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2470 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2471 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2472 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2473 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2474 st->disposition = AV_DISPOSITION_COMMENT; break;
2475 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2476 st->disposition = AV_DISPOSITION_KARAOKE; break;
2481 estimate_timings(ic, old_offset);
2483 compute_chapters_end(ic);
2486 /* correct DTS for B-frame streams with no timestamps */
2487 for(i=0;i<ic->nb_streams;i++) {
2488 st = ic->streams[i];
2489 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2491 ppktl = &ic->packet_buffer;
2493 if(ppkt1->stream_index != i)
2495 if(ppkt1->pkt->dts < 0)
2497 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2499 ppkt1->pkt->dts -= delta;
2504 st->cur_dts -= delta;
2510 find_stream_info_err:
2511 for (i=0; i < ic->nb_streams; i++)
2512 av_freep(&ic->streams[i]->info);
2516 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2520 for (i = 0; i < ic->nb_programs; i++)
2521 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2522 if (ic->programs[i]->stream_index[j] == s)
2523 return ic->programs[i];
2527 int av_find_best_stream(AVFormatContext *ic,
2528 enum AVMediaType type,
2529 int wanted_stream_nb,
2531 AVCodec **decoder_ret,
2534 int i, nb_streams = ic->nb_streams;
2535 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2536 unsigned *program = NULL;
2537 AVCodec *decoder = NULL, *best_decoder = NULL;
2539 if (related_stream >= 0 && wanted_stream_nb < 0) {
2540 AVProgram *p = find_program_from_stream(ic, related_stream);
2542 program = p->stream_index;
2543 nb_streams = p->nb_stream_indexes;
2546 for (i = 0; i < nb_streams; i++) {
2547 int real_stream_index = program ? program[i] : i;
2548 AVStream *st = ic->streams[real_stream_index];
2549 AVCodecContext *avctx = st->codec;
2550 if (avctx->codec_type != type)
2552 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2554 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2557 decoder = avcodec_find_decoder(st->codec->codec_id);
2560 ret = AVERROR_DECODER_NOT_FOUND;
2564 if (best_count >= st->codec_info_nb_frames)
2566 best_count = st->codec_info_nb_frames;
2567 ret = real_stream_index;
2568 best_decoder = decoder;
2569 if (program && i == nb_streams - 1 && ret < 0) {
2571 nb_streams = ic->nb_streams;
2572 i = 0; /* no related stream found, try again with everything */
2576 *decoder_ret = best_decoder;
2580 /*******************************************************/
2582 int av_read_play(AVFormatContext *s)
2584 if (s->iformat->read_play)
2585 return s->iformat->read_play(s);
2587 return avio_pause(s->pb, 0);
2588 return AVERROR(ENOSYS);
2591 int av_read_pause(AVFormatContext *s)
2593 if (s->iformat->read_pause)
2594 return s->iformat->read_pause(s);
2596 return avio_pause(s->pb, 1);
2597 return AVERROR(ENOSYS);
2600 void av_close_input_stream(AVFormatContext *s)
2602 flush_packet_queue(s);
2603 if (s->iformat->read_close)
2604 s->iformat->read_close(s);
2605 avformat_free_context(s);
2608 void avformat_free_context(AVFormatContext *s)
2614 if (s->iformat && s->iformat->priv_class && s->priv_data)
2615 av_opt_free(s->priv_data);
2617 for(i=0;i<s->nb_streams;i++) {
2618 /* free all data in a stream component */
2621 av_parser_close(st->parser);
2622 av_free_packet(&st->cur_pkt);
2624 av_dict_free(&st->metadata);
2625 av_free(st->index_entries);
2626 av_free(st->codec->extradata);
2627 av_free(st->codec->subtitle_header);
2629 av_free(st->priv_data);
2633 for(i=s->nb_programs-1; i>=0; i--) {
2634 av_dict_free(&s->programs[i]->metadata);
2635 av_freep(&s->programs[i]->stream_index);
2636 av_freep(&s->programs[i]);
2638 av_freep(&s->programs);
2639 av_freep(&s->priv_data);
2640 while(s->nb_chapters--) {
2641 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2642 av_free(s->chapters[s->nb_chapters]);
2644 av_freep(&s->chapters);
2645 av_dict_free(&s->metadata);
2646 av_freep(&s->streams);
2650 void av_close_input_file(AVFormatContext *s)
2652 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2654 av_close_input_stream(s);
2659 #if FF_API_NEW_STREAM
2660 AVStream *av_new_stream(AVFormatContext *s, int id)
2662 AVStream *st = avformat_new_stream(s, NULL);
2669 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
2675 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2677 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2680 s->streams = streams;
2682 st = av_mallocz(sizeof(AVStream));
2685 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2690 st->codec = avcodec_alloc_context3(c);
2692 /* no default bitrate if decoding */
2693 st->codec->bit_rate = 0;
2695 st->index = s->nb_streams;
2696 st->start_time = AV_NOPTS_VALUE;
2697 st->duration = AV_NOPTS_VALUE;
2698 /* we set the current DTS to 0 so that formats without any timestamps
2699 but durations get some timestamps, formats with some unknown
2700 timestamps have their first few packets buffered and the
2701 timestamps corrected before they are returned to the user */
2703 st->first_dts = AV_NOPTS_VALUE;
2704 st->probe_packets = MAX_PROBE_PACKETS;
2706 /* default pts setting is MPEG-like */
2707 av_set_pts_info(st, 33, 1, 90000);
2708 st->last_IP_pts = AV_NOPTS_VALUE;
2709 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2710 st->pts_buffer[i]= AV_NOPTS_VALUE;
2711 st->reference_dts = AV_NOPTS_VALUE;
2713 st->sample_aspect_ratio = (AVRational){0,1};
2715 s->streams[s->nb_streams++] = st;
2719 AVProgram *av_new_program(AVFormatContext *ac, int id)
2721 AVProgram *program=NULL;
2724 av_dlog(ac, "new_program: id=0x%04x\n", id);
2726 for(i=0; i<ac->nb_programs; i++)
2727 if(ac->programs[i]->id == id)
2728 program = ac->programs[i];
2731 program = av_mallocz(sizeof(AVProgram));
2734 dynarray_add(&ac->programs, &ac->nb_programs, program);
2735 program->discard = AVDISCARD_NONE;
2742 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2744 AVChapter *chapter = NULL;
2747 for(i=0; i<s->nb_chapters; i++)
2748 if(s->chapters[i]->id == id)
2749 chapter = s->chapters[i];
2752 chapter= av_mallocz(sizeof(AVChapter));
2755 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2757 av_dict_set(&chapter->metadata, "title", title, 0);
2759 chapter->time_base= time_base;
2760 chapter->start = start;
2766 /************************************************************/
2767 /* output media file */
2769 #if FF_API_FORMAT_PARAMETERS
2770 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2774 if (s->oformat->priv_data_size > 0) {
2775 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2777 return AVERROR(ENOMEM);
2778 if (s->oformat->priv_class) {
2779 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2780 av_opt_set_defaults(s->priv_data);
2783 s->priv_data = NULL;
2785 if (s->oformat->set_parameters) {
2786 ret = s->oformat->set_parameters(s, ap);
2794 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2796 const AVCodecTag *avctag;
2798 enum CodecID id = CODEC_ID_NONE;
2799 unsigned int tag = 0;
2802 * Check that tag + id is in the table
2803 * If neither is in the table -> OK
2804 * If tag is in the table with another id -> FAIL
2805 * If id is in the table with another tag -> FAIL unless strict < normal
2807 for (n = 0; s->oformat->codec_tag[n]; n++) {
2808 avctag = s->oformat->codec_tag[n];
2809 while (avctag->id != CODEC_ID_NONE) {
2810 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2812 if (id == st->codec->codec_id)
2815 if (avctag->id == st->codec->codec_id)
2820 if (id != CODEC_ID_NONE)
2822 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2827 #if FF_API_FORMAT_PARAMETERS
2828 int av_write_header(AVFormatContext *s)
2830 return avformat_write_header(s, NULL);
2834 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2838 AVDictionary *tmp = NULL;
2841 av_dict_copy(&tmp, *options, 0);
2842 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2845 // some sanity checks
2846 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2847 av_log(s, AV_LOG_ERROR, "no streams\n");
2848 ret = AVERROR(EINVAL);
2852 for(i=0;i<s->nb_streams;i++) {
2855 switch (st->codec->codec_type) {
2856 case AVMEDIA_TYPE_AUDIO:
2857 if(st->codec->sample_rate<=0){
2858 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2859 ret = AVERROR(EINVAL);
2862 if(!st->codec->block_align)
2863 st->codec->block_align = st->codec->channels *
2864 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2866 case AVMEDIA_TYPE_VIDEO:
2867 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2868 av_log(s, AV_LOG_ERROR, "time base not set\n");
2869 ret = AVERROR(EINVAL);
2872 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2873 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2874 ret = AVERROR(EINVAL);
2877 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2878 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2879 ret = AVERROR(EINVAL);
2885 if(s->oformat->codec_tag){
2886 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)){
2887 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2888 st->codec->codec_tag= 0;
2890 if(st->codec->codec_tag){
2891 if (!validate_codec_tag(s, st)) {
2893 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2894 av_log(s, AV_LOG_ERROR,
2895 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
2896 tagbuf, st->codec->codec_tag, st->codec->codec_id);
2897 ret = AVERROR_INVALIDDATA;
2901 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2904 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2905 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2906 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2909 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2910 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2911 if (!s->priv_data) {
2912 ret = AVERROR(ENOMEM);
2915 if (s->oformat->priv_class) {
2916 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2917 av_opt_set_defaults(s->priv_data);
2918 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2923 /* set muxer identification string */
2924 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2925 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
2928 if(s->oformat->write_header){
2929 ret = s->oformat->write_header(s);
2934 /* init PTS generation */
2935 for(i=0;i<s->nb_streams;i++) {
2936 int64_t den = AV_NOPTS_VALUE;
2939 switch (st->codec->codec_type) {
2940 case AVMEDIA_TYPE_AUDIO:
2941 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2943 case AVMEDIA_TYPE_VIDEO:
2944 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2949 if (den != AV_NOPTS_VALUE) {
2951 ret = AVERROR_INVALIDDATA;
2954 frac_init(&st->pts, 0, 0, den);
2959 av_dict_free(options);
2968 //FIXME merge with compute_pkt_fields
2969 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
2970 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2971 int num, den, frame_size, i;
2973 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
2974 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
2976 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2977 return AVERROR(EINVAL);*/
2979 /* duration field */
2980 if (pkt->duration == 0) {
2981 compute_frame_duration(&num, &den, st, NULL, pkt);
2983 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2987 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2990 //XXX/FIXME this is a temporary hack until all encoders output pts
2991 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2993 // pkt->pts= st->cur_dts;
2994 pkt->pts= st->pts.val;
2997 //calculate dts from pts
2998 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2999 st->pts_buffer[0]= pkt->pts;
3000 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3001 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3002 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3003 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3005 pkt->dts= st->pts_buffer[0];
3008 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
3009 av_log(s, AV_LOG_ERROR,
3010 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3011 st->index, st->cur_dts, pkt->dts);
3012 return AVERROR(EINVAL);
3014 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3015 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3016 return AVERROR(EINVAL);
3019 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3020 st->cur_dts= pkt->dts;
3021 st->pts.val= pkt->dts;
3024 switch (st->codec->codec_type) {
3025 case AVMEDIA_TYPE_AUDIO:
3026 frame_size = get_audio_frame_size(st->codec, pkt->size);
3028 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3029 likely equal to the encoder delay, but it would be better if we
3030 had the real timestamps from the encoder */
3031 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3032 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3035 case AVMEDIA_TYPE_VIDEO:
3036 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3044 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3046 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3048 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3051 ret= s->oformat->write_packet(s, pkt);
3054 s->streams[pkt->stream_index]->nb_frames++;
3058 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3059 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3061 AVPacketList **next_point, *this_pktl;
3063 this_pktl = av_mallocz(sizeof(AVPacketList));
3064 this_pktl->pkt= *pkt;
3065 pkt->destruct= NULL; // do not free original but only the copy
3066 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3068 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3069 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3071 next_point = &s->packet_buffer;
3074 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3075 while(!compare(s, &(*next_point)->pkt, pkt)){
3076 next_point= &(*next_point)->next;
3080 next_point = &(s->packet_buffer_end->next);
3083 assert(!*next_point);
3085 s->packet_buffer_end= this_pktl;
3088 this_pktl->next= *next_point;
3090 s->streams[pkt->stream_index]->last_in_packet_buffer=
3091 *next_point= this_pktl;
3094 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3096 AVStream *st = s->streams[ pkt ->stream_index];
3097 AVStream *st2= s->streams[ next->stream_index];
3098 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3102 return pkt->stream_index < next->stream_index;
3106 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3112 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3115 for(i=0; i < s->nb_streams; i++)
3116 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3118 if(stream_count && (s->nb_streams == stream_count || flush)){
3119 pktl= s->packet_buffer;
3122 s->packet_buffer= pktl->next;
3123 if(!s->packet_buffer)
3124 s->packet_buffer_end= NULL;
3126 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3127 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3131 av_init_packet(out);
3137 * Interleave an AVPacket correctly so it can be muxed.
3138 * @param out the interleaved packet will be output here
3139 * @param in the input packet
3140 * @param flush 1 if no further packets are available as input and all
3141 * remaining packets should be output
3142 * @return 1 if a packet was output, 0 if no packet could be output,
3143 * < 0 if an error occurred
3145 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3146 if(s->oformat->interleave_packet)
3147 return s->oformat->interleave_packet(s, out, in, flush);
3149 return av_interleave_packet_per_dts(s, out, in, flush);
3152 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3153 AVStream *st= s->streams[ pkt->stream_index];
3156 //FIXME/XXX/HACK drop zero sized packets
3157 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3160 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3161 pkt->size, pkt->dts, pkt->pts);
3162 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3165 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3166 return AVERROR(EINVAL);
3170 int ret= interleave_packet(s, &opkt, pkt, 0);
3171 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3174 ret= s->oformat->write_packet(s, &opkt);
3176 s->streams[opkt.stream_index]->nb_frames++;
3178 av_free_packet(&opkt);
3186 int av_write_trailer(AVFormatContext *s)
3192 ret= interleave_packet(s, &pkt, NULL, 1);
3193 if(ret<0) //FIXME cleanup needed for ret<0 ?
3198 ret= s->oformat->write_packet(s, &pkt);
3200 s->streams[pkt.stream_index]->nb_frames++;
3202 av_free_packet(&pkt);
3208 if(s->oformat->write_trailer)
3209 ret = s->oformat->write_trailer(s);
3211 for(i=0;i<s->nb_streams;i++) {
3212 av_freep(&s->streams[i]->priv_data);
3213 av_freep(&s->streams[i]->index_entries);
3215 if (s->iformat && s->iformat->priv_class)
3216 av_opt_free(s->priv_data);
3217 av_freep(&s->priv_data);
3221 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3224 AVProgram *program=NULL;
3227 if (idx >= ac->nb_streams) {
3228 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3232 for(i=0; i<ac->nb_programs; i++){
3233 if(ac->programs[i]->id != progid)
3235 program = ac->programs[i];
3236 for(j=0; j<program->nb_stream_indexes; j++)
3237 if(program->stream_index[j] == idx)
3240 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3243 program->stream_index = tmp;
3244 program->stream_index[program->nb_stream_indexes++] = idx;
3249 static void print_fps(double d, const char *postfix){
3250 uint64_t v= lrintf(d*100);
3251 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3252 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3253 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3256 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3258 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3259 AVDictionaryEntry *tag=NULL;
3261 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3262 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3263 if(strcmp("language", tag->key))
3264 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
3269 /* "user interface" functions */
3270 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3273 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3274 AVStream *st = ic->streams[i];
3275 int g = av_gcd(st->time_base.num, st->time_base.den);
3276 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3277 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3278 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3279 /* the pid is an important information, so we display it */
3280 /* XXX: add a generic system */
3281 if (flags & AVFMT_SHOW_IDS)
3282 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3284 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3285 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3286 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3287 if (st->sample_aspect_ratio.num && // default
3288 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3289 AVRational display_aspect_ratio;
3290 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3291 st->codec->width*st->sample_aspect_ratio.num,
3292 st->codec->height*st->sample_aspect_ratio.den,
3294 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3295 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3296 display_aspect_ratio.num, display_aspect_ratio.den);
3298 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3299 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3300 print_fps(av_q2d(st->avg_frame_rate), "fps");
3301 if(st->r_frame_rate.den && st->r_frame_rate.num)
3302 print_fps(av_q2d(st->r_frame_rate), "tbr");
3303 if(st->time_base.den && st->time_base.num)
3304 print_fps(1/av_q2d(st->time_base), "tbn");
3305 if(st->codec->time_base.den && st->codec->time_base.num)
3306 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3308 if (st->disposition & AV_DISPOSITION_DEFAULT)
3309 av_log(NULL, AV_LOG_INFO, " (default)");
3310 if (st->disposition & AV_DISPOSITION_DUB)
3311 av_log(NULL, AV_LOG_INFO, " (dub)");
3312 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3313 av_log(NULL, AV_LOG_INFO, " (original)");
3314 if (st->disposition & AV_DISPOSITION_COMMENT)
3315 av_log(NULL, AV_LOG_INFO, " (comment)");
3316 if (st->disposition & AV_DISPOSITION_LYRICS)
3317 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3318 if (st->disposition & AV_DISPOSITION_KARAOKE)
3319 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3320 if (st->disposition & AV_DISPOSITION_FORCED)
3321 av_log(NULL, AV_LOG_INFO, " (forced)");
3322 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3323 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3324 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3325 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3326 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3327 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3328 av_log(NULL, AV_LOG_INFO, "\n");
3329 dump_metadata(NULL, st->metadata, " ");
3332 #if FF_API_DUMP_FORMAT
3333 void dump_format(AVFormatContext *ic,
3338 av_dump_format(ic, index, url, is_output);
3342 void av_dump_format(AVFormatContext *ic,
3348 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3349 if (ic->nb_streams && !printed)
3352 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3353 is_output ? "Output" : "Input",
3355 is_output ? ic->oformat->name : ic->iformat->name,
3356 is_output ? "to" : "from", url);
3357 dump_metadata(NULL, ic->metadata, " ");
3359 av_log(NULL, AV_LOG_INFO, " Duration: ");
3360 if (ic->duration != AV_NOPTS_VALUE) {
3361 int hours, mins, secs, us;
3362 secs = ic->duration / AV_TIME_BASE;
3363 us = ic->duration % AV_TIME_BASE;
3368 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3369 (100 * us) / AV_TIME_BASE);
3371 av_log(NULL, AV_LOG_INFO, "N/A");
3373 if (ic->start_time != AV_NOPTS_VALUE) {
3375 av_log(NULL, AV_LOG_INFO, ", start: ");
3376 secs = ic->start_time / AV_TIME_BASE;
3377 us = abs(ic->start_time % AV_TIME_BASE);
3378 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3379 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3381 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3383 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3385 av_log(NULL, AV_LOG_INFO, "N/A");
3387 av_log(NULL, AV_LOG_INFO, "\n");
3389 for (i = 0; i < ic->nb_chapters; i++) {
3390 AVChapter *ch = ic->chapters[i];
3391 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3392 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3393 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3395 dump_metadata(NULL, ch->metadata, " ");
3397 if(ic->nb_programs) {
3398 int j, k, total = 0;
3399 for(j=0; j<ic->nb_programs; j++) {
3400 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3402 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3403 name ? name->value : "");
3404 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3405 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3406 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3407 printed[ic->programs[j]->stream_index[k]] = 1;
3409 total += ic->programs[j]->nb_stream_indexes;
3411 if (total < ic->nb_streams)
3412 av_log(NULL, AV_LOG_INFO, " No Program\n");
3414 for(i=0;i<ic->nb_streams;i++)
3416 dump_stream_format(ic, i, index, is_output);
3421 int64_t av_gettime(void)
3424 gettimeofday(&tv,NULL);
3425 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3428 uint64_t ff_ntp_time(void)
3430 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3433 #if FF_API_PARSE_DATE
3434 #include "libavutil/parseutils.h"
3436 int64_t parse_date(const char *timestr, int duration)
3439 av_parse_time(&timeval, timestr, duration);
3444 #if FF_API_FIND_INFO_TAG
3445 #include "libavutil/parseutils.h"
3447 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3449 return av_find_info_tag(arg, arg_size, tag1, info);
3453 int av_get_frame_filename(char *buf, int buf_size,
3454 const char *path, int number)
3457 char *q, buf1[20], c;
3458 int nd, len, percentd_found;
3470 while (isdigit(*p)) {
3471 nd = nd * 10 + *p++ - '0';
3474 } while (isdigit(c));
3483 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3485 if ((q - buf + len) > buf_size - 1)
3487 memcpy(q, buf1, len);
3495 if ((q - buf) < buf_size - 1)
3499 if (!percentd_found)
3508 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3512 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3514 for(i=0;i<size;i+=16) {
3521 PRINT(" %02x", buf[i+j]);
3526 for(j=0;j<len;j++) {
3528 if (c < ' ' || c > '~')
3537 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3539 hex_dump_internal(NULL, f, 0, buf, size);
3542 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3544 hex_dump_internal(avcl, NULL, level, buf, size);
3547 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3550 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3551 PRINT("stream #%d:\n", pkt->stream_index);
3552 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3553 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3554 /* DTS is _always_ valid after av_read_frame() */
3556 if (pkt->dts == AV_NOPTS_VALUE)
3559 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3560 /* PTS may not be known if B-frames are present. */
3562 if (pkt->pts == AV_NOPTS_VALUE)
3565 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3567 PRINT(" size=%d\n", pkt->size);
3570 av_hex_dump(f, pkt->data, pkt->size);
3574 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3576 AVRational tb = { 1, AV_TIME_BASE };
3577 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3581 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3583 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3587 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3589 AVRational tb = { 1, AV_TIME_BASE };
3590 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3594 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3597 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3600 void av_url_split(char *proto, int proto_size,
3601 char *authorization, int authorization_size,
3602 char *hostname, int hostname_size,
3604 char *path, int path_size,
3607 const char *p, *ls, *at, *col, *brk;
3609 if (port_ptr) *port_ptr = -1;
3610 if (proto_size > 0) proto[0] = 0;
3611 if (authorization_size > 0) authorization[0] = 0;
3612 if (hostname_size > 0) hostname[0] = 0;
3613 if (path_size > 0) path[0] = 0;
3615 /* parse protocol */
3616 if ((p = strchr(url, ':'))) {
3617 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3622 /* no protocol means plain filename */
3623 av_strlcpy(path, url, path_size);
3627 /* separate path from hostname */
3628 ls = strchr(p, '/');
3630 ls = strchr(p, '?');
3632 av_strlcpy(path, ls, path_size);
3634 ls = &p[strlen(p)]; // XXX
3636 /* the rest is hostname, use that to parse auth/port */
3638 /* authorization (user[:pass]@hostname) */
3639 if ((at = strchr(p, '@')) && at < ls) {
3640 av_strlcpy(authorization, p,
3641 FFMIN(authorization_size, at + 1 - p));
3642 p = at + 1; /* skip '@' */
3645 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3647 av_strlcpy(hostname, p + 1,
3648 FFMIN(hostname_size, brk - p));
3649 if (brk[1] == ':' && port_ptr)
3650 *port_ptr = atoi(brk + 2);
3651 } else if ((col = strchr(p, ':')) && col < ls) {
3652 av_strlcpy(hostname, p,
3653 FFMIN(col + 1 - p, hostname_size));
3654 if (port_ptr) *port_ptr = atoi(col + 1);
3656 av_strlcpy(hostname, p,
3657 FFMIN(ls + 1 - p, hostname_size));
3661 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3664 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3667 'C', 'D', 'E', 'F' };
3668 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3671 'c', 'd', 'e', 'f' };
3672 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3674 for(i = 0; i < s; i++) {
3675 buff[i * 2] = hex_table[src[i] >> 4];
3676 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3682 int ff_hex_to_data(uint8_t *data, const char *p)
3689 p += strspn(p, SPACE_CHARS);
3692 c = toupper((unsigned char) *p++);
3693 if (c >= '0' && c <= '9')
3695 else if (c >= 'A' && c <= 'F')
3710 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3711 unsigned int pts_num, unsigned int pts_den)
3714 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3715 if(new_tb.num != pts_num)
3716 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3718 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3720 if(new_tb.num <= 0 || new_tb.den <= 0) {
3721 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3724 s->time_base = new_tb;
3725 s->pts_wrap_bits = pts_wrap_bits;
3728 int ff_url_join(char *str, int size, const char *proto,
3729 const char *authorization, const char *hostname,
3730 int port, const char *fmt, ...)
3733 struct addrinfo hints, *ai;
3738 av_strlcatf(str, size, "%s://", proto);
3739 if (authorization && authorization[0])
3740 av_strlcatf(str, size, "%s@", authorization);
3741 #if CONFIG_NETWORK && defined(AF_INET6)
3742 /* Determine if hostname is a numerical IPv6 address,
3743 * properly escape it within [] in that case. */
3744 memset(&hints, 0, sizeof(hints));
3745 hints.ai_flags = AI_NUMERICHOST;
3746 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3747 if (ai->ai_family == AF_INET6) {
3748 av_strlcat(str, "[", size);
3749 av_strlcat(str, hostname, size);
3750 av_strlcat(str, "]", size);
3752 av_strlcat(str, hostname, size);
3757 /* Not an IPv6 address, just output the plain string. */
3758 av_strlcat(str, hostname, size);
3761 av_strlcatf(str, size, ":%d", port);
3764 int len = strlen(str);
3767 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3773 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3774 AVFormatContext *src)
3779 local_pkt.stream_index = dst_stream;
3780 if (pkt->pts != AV_NOPTS_VALUE)
3781 local_pkt.pts = av_rescale_q(pkt->pts,
3782 src->streams[pkt->stream_index]->time_base,
3783 dst->streams[dst_stream]->time_base);
3784 if (pkt->dts != AV_NOPTS_VALUE)
3785 local_pkt.dts = av_rescale_q(pkt->dts,
3786 src->streams[pkt->stream_index]->time_base,
3787 dst->streams[dst_stream]->time_base);
3788 return av_write_frame(dst, &local_pkt);
3791 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3794 const char *ptr = str;
3796 /* Parse key=value pairs. */
3799 char *dest = NULL, *dest_end;
3800 int key_len, dest_len = 0;
3802 /* Skip whitespace and potential commas. */
3803 while (*ptr && (isspace(*ptr) || *ptr == ','))
3810 if (!(ptr = strchr(key, '=')))
3813 key_len = ptr - key;
3815 callback_get_buf(context, key, key_len, &dest, &dest_len);
3816 dest_end = dest + dest_len - 1;
3820 while (*ptr && *ptr != '\"') {
3824 if (dest && dest < dest_end)
3828 if (dest && dest < dest_end)
3836 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3837 if (dest && dest < dest_end)
3845 int ff_find_stream_index(AVFormatContext *s, int id)
3848 for (i = 0; i < s->nb_streams; i++) {
3849 if (s->streams[i]->id == id)
3855 void ff_make_absolute_url(char *buf, int size, const char *base,
3859 /* Absolute path, relative to the current server */
3860 if (base && strstr(base, "://") && rel[0] == '/') {
3862 av_strlcpy(buf, base, size);
3863 sep = strstr(buf, "://");
3866 sep = strchr(sep, '/');
3870 av_strlcat(buf, rel, size);
3873 /* If rel actually is an absolute url, just copy it */
3874 if (!base || strstr(rel, "://") || rel[0] == '/') {
3875 av_strlcpy(buf, rel, size);
3879 av_strlcpy(buf, base, size);
3880 /* Remove the file name from the base url */
3881 sep = strrchr(buf, '/');
3886 while (av_strstart(rel, "../", NULL) && sep) {
3887 /* Remove the path delimiter at the end */
3889 sep = strrchr(buf, '/');
3890 /* If the next directory name to pop off is "..", break here */
3891 if (!strcmp(sep ? &sep[1] : buf, "..")) {
3892 /* Readd the slash we just removed */
3893 av_strlcat(buf, "/", size);
3896 /* Cut off the directory name */
3903 av_strlcat(buf, rel, size);
3906 int64_t ff_iso8601_to_unix_time(const char *datestr)
3909 struct tm time = {0};
3910 strptime(datestr, "%Y - %m - %dT%T", &time);
3911 return mktime(&time);
3913 av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert "
3914 "the date string.\n");
3919 int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
3922 if (ofmt->query_codec)
3923 return ofmt->query_codec(codec_id, std_compliance);
3924 else if (ofmt->codec_tag)
3925 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
3926 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
3927 codec_id == ofmt->subtitle_codec)
3930 return AVERROR_PATCHWELCOME;