2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "avio_internal.h"
27 #include "libavcodec/internal.h"
28 #include "libavcodec/raw.h"
29 #include "libavutil/opt.h"
30 #include "libavutil/dict.h"
31 #include "libavutil/pixdesc.h"
34 #include "libavutil/avstring.h"
36 #include "audiointerleave.h"
51 * various utility functions for use within FFmpeg
54 unsigned avformat_version(void)
56 return LIBAVFORMAT_VERSION_INT;
59 const char *avformat_configuration(void)
61 return FFMPEG_CONFIGURATION;
64 const char *avformat_license(void)
66 #define LICENSE_PREFIX "libavformat license: "
67 return LICENSE_PREFIX FFMPEG_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 av_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 av_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_format3(AVProbeData *pd, int is_opened, int *score_ret)
309 AVProbeData lpd = *pd;
310 AVInputFormat *fmt1 = NULL, *fmt;
311 int score, score_max=0;
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;
322 while ((fmt1 = av_iformat_next(fmt1))) {
323 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
326 if (fmt1->read_probe) {
327 score = fmt1->read_probe(&lpd);
328 if(!score && fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
330 } else if (fmt1->extensions) {
331 if (av_match_ext(lpd.filename, fmt1->extensions)) {
335 if (score > score_max) {
338 }else if (score == score_max)
341 *score_ret= score_max;
345 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
348 AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
349 if(score_ret > *score_max){
350 *score_max= score_ret;
356 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
358 return av_probe_input_format2(pd, is_opened, &score);
361 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
363 static const struct {
364 const char *name; enum CodecID id; enum AVMediaType type;
366 { "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
367 { "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
368 { "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
369 { "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
370 { "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
371 { "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
372 { "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
373 { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
377 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
381 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
382 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
383 for (i = 0; fmt_id_type[i].name; i++) {
384 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
385 st->codec->codec_id = fmt_id_type[i].id;
386 st->codec->codec_type = fmt_id_type[i].type;
394 /************************************************************/
395 /* input media file */
397 #if FF_API_FORMAT_PARAMETERS
398 static AVDictionary *convert_format_parameters(AVFormatParameters *ap)
401 AVDictionary *opts = NULL;
406 if (ap->time_base.num) {
407 snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
408 av_dict_set(&opts, "framerate", buf, 0);
410 if (ap->sample_rate) {
411 snprintf(buf, sizeof(buf), "%d", ap->sample_rate);
412 av_dict_set(&opts, "sample_rate", buf, 0);
415 snprintf(buf, sizeof(buf), "%d", ap->channels);
416 av_dict_set(&opts, "channels", buf, 0);
418 if (ap->width || ap->height) {
419 snprintf(buf, sizeof(buf), "%dx%d", ap->width, ap->height);
420 av_dict_set(&opts, "video_size", buf, 0);
422 if (ap->pix_fmt != PIX_FMT_NONE) {
423 av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(ap->pix_fmt), 0);
426 snprintf(buf, sizeof(buf), "%d", ap->channel);
427 av_dict_set(&opts, "channel", buf, 0);
430 av_dict_set(&opts, "standard", ap->standard, 0);
432 if (ap->mpeg2ts_compute_pcr) {
433 av_dict_set(&opts, "mpeg2ts_compute_pcr", "1", 0);
435 if (ap->initial_pause) {
436 av_dict_set(&opts, "initial_pause", "1", 0);
442 * Open a media file from an IO stream. 'fmt' must be specified.
444 int av_open_input_stream(AVFormatContext **ic_ptr,
445 AVIOContext *pb, const char *filename,
446 AVInputFormat *fmt, AVFormatParameters *ap)
451 AVFormatParameters default_ap;
455 memset(ap, 0, sizeof(default_ap));
457 opts = convert_format_parameters(ap);
459 if(!ap->prealloced_context)
460 ic = avformat_alloc_context();
464 err = AVERROR(ENOMEM);
469 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
477 int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap){
480 if (ic->iformat->read_header) {
481 err = ic->iformat->read_header(ic, ap);
486 if (ic->pb && !ic->data_offset)
487 ic->data_offset = avio_tell(ic->pb);
493 /** size of probe buffer, for guessing file type from file contents */
494 #define PROBE_BUF_MIN 2048
495 #define PROBE_BUF_MAX (1<<20)
497 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
498 const char *filename, void *logctx,
499 unsigned int offset, unsigned int max_probe_size)
501 AVProbeData pd = { filename ? filename : "", NULL, -offset };
502 unsigned char *buf = NULL;
503 int ret = 0, probe_size;
505 if (!max_probe_size) {
506 max_probe_size = PROBE_BUF_MAX;
507 } else if (max_probe_size > PROBE_BUF_MAX) {
508 max_probe_size = PROBE_BUF_MAX;
509 } else if (max_probe_size < PROBE_BUF_MIN) {
510 return AVERROR(EINVAL);
513 if (offset >= max_probe_size) {
514 return AVERROR(EINVAL);
517 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt && ret >= 0;
518 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
519 int ret, score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
520 int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
522 if (probe_size < offset) {
526 /* read probe data */
527 buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
528 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
529 /* fail if error was not end of file, otherwise, lower score */
530 if (ret != AVERROR_EOF) {
535 ret = 0; /* error was end of file, nothing read */
538 pd.buf = &buf[offset];
540 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
542 /* guess file format */
543 *fmt = av_probe_input_format2(&pd, 1, &score);
545 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
546 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
548 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
554 return AVERROR_INVALIDDATA;
557 /* rewind. reuse probe buffer to avoid seeking */
558 if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
564 #if FF_API_FORMAT_PARAMETERS
565 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
568 AVFormatParameters *ap)
571 AVDictionary *opts = convert_format_parameters(ap);
573 if (!ap || !ap->prealloced_context)
576 err = avformat_open_input(ic_ptr, filename, fmt, &opts);
583 /* open input file and probe the format if necessary */
584 static int init_input(AVFormatContext *s, const char *filename)
587 AVProbeData pd = {filename, NULL, 0};
590 s->flags |= AVFMT_FLAG_CUSTOM_IO;
592 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
593 else if (s->iformat->flags & AVFMT_NOFILE)
594 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
595 "will be ignored with AVFMT_NOFILE format.\n");
599 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
600 (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
603 if ((ret = avio_open(&s->pb, filename, AVIO_FLAG_READ)) < 0)
607 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
610 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
612 AVFormatContext *s = *ps;
614 AVFormatParameters ap = { 0 };
615 AVDictionary *tmp = NULL;
617 if (!s && !(s = avformat_alloc_context()))
618 return AVERROR(ENOMEM);
623 av_dict_copy(&tmp, *options, 0);
625 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
628 if ((ret = init_input(s, filename)) < 0)
631 /* check filename in case an image number is expected */
632 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
633 if (!av_filename_number_test(filename)) {
634 ret = AVERROR(EINVAL);
639 s->duration = s->start_time = AV_NOPTS_VALUE;
640 av_strlcpy(s->filename, filename, sizeof(s->filename));
642 /* allocate private data */
643 if (s->iformat->priv_data_size > 0) {
644 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
645 ret = AVERROR(ENOMEM);
648 if (s->iformat->priv_class) {
649 *(const AVClass**)s->priv_data = s->iformat->priv_class;
650 av_opt_set_defaults(s->priv_data);
651 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
656 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
658 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
660 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
661 if ((ret = s->iformat->read_header(s, &ap)) < 0)
664 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
665 s->data_offset = avio_tell(s->pb);
667 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
670 av_dict_free(options);
678 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
680 avformat_free_context(s);
685 /*******************************************************/
687 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
688 AVPacketList **plast_pktl){
689 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
694 (*plast_pktl)->next = pktl;
696 *packet_buffer = pktl;
698 /* add the packet in the buffered packet list */
704 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
710 AVPacketList *pktl = s->raw_packet_buffer;
714 if(s->streams[pkt->stream_index]->request_probe <= 0){
715 s->raw_packet_buffer = pktl->next;
716 s->raw_packet_buffer_remaining_size += pkt->size;
723 ret= s->iformat->read_packet(s, pkt);
725 if (!pktl || ret == AVERROR(EAGAIN))
727 for (i = 0; i < s->nb_streams; i++)
728 if(s->streams[i]->request_probe > 0)
729 s->streams[i]->request_probe = -1;
733 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
734 av_packet_merge_side_data(pkt);
735 st= s->streams[pkt->stream_index];
737 switch(st->codec->codec_type){
738 case AVMEDIA_TYPE_VIDEO:
739 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
741 case AVMEDIA_TYPE_AUDIO:
742 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
744 case AVMEDIA_TYPE_SUBTITLE:
745 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
749 if(!pktl && st->request_probe <= 0)
752 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
753 s->raw_packet_buffer_remaining_size -= pkt->size;
755 if(st->request_probe>0){
756 AVProbeData *pd = &st->probe_data;
758 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
761 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
762 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
763 pd->buf_size += pkt->size;
764 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
766 end= s->raw_packet_buffer_remaining_size <= 0
767 || st->probe_packets<=0;
769 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
770 int score= set_codec_from_probe_data(s, st, pd);
771 if( (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
775 st->request_probe= -1;
776 if(st->codec->codec_id != CODEC_ID_NONE){
777 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
779 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
786 /**********************************************************/
789 * Get the number of samples of an audio frame. Return -1 on error.
791 static int get_audio_frame_size(AVCodecContext *enc, int size)
795 if(enc->codec_id == CODEC_ID_VORBIS)
798 if (enc->frame_size <= 1) {
799 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
801 if (bits_per_sample) {
802 if (enc->channels == 0)
804 frame_size = (size << 3) / (bits_per_sample * enc->channels);
806 /* used for example by ADPCM codecs */
807 if (enc->bit_rate == 0)
809 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
812 frame_size = enc->frame_size;
819 * Return the frame duration in seconds. Return 0 if not available.
821 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
822 AVCodecParserContext *pc, AVPacket *pkt)
828 switch(st->codec->codec_type) {
829 case AVMEDIA_TYPE_VIDEO:
830 if(st->time_base.num*1000LL > st->time_base.den){
831 *pnum = st->time_base.num;
832 *pden = st->time_base.den;
833 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
834 *pnum = st->codec->time_base.num;
835 *pden = st->codec->time_base.den;
836 if (pc && pc->repeat_pict) {
837 *pnum = (*pnum) * (1 + pc->repeat_pict);
839 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
840 //Thus if we have no parser in such case leave duration undefined.
841 if(st->codec->ticks_per_frame>1 && !pc){
846 case AVMEDIA_TYPE_AUDIO:
847 frame_size = get_audio_frame_size(st->codec, pkt->size);
848 if (frame_size <= 0 || st->codec->sample_rate <= 0)
851 *pden = st->codec->sample_rate;
858 static int is_intra_only(AVCodecContext *enc){
859 if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
861 }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
862 switch(enc->codec_id){
864 case CODEC_ID_MJPEGB:
866 case CODEC_ID_RAWVIDEO:
867 case CODEC_ID_DVVIDEO:
868 case CODEC_ID_HUFFYUV:
869 case CODEC_ID_FFVHUFF:
874 case CODEC_ID_JPEG2000:
882 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
883 int64_t dts, int64_t pts)
885 AVStream *st= s->streams[stream_index];
886 AVPacketList *pktl= s->packet_buffer;
888 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
891 st->first_dts= dts - st->cur_dts;
894 for(; pktl; pktl= pktl->next){
895 if(pktl->pkt.stream_index != stream_index)
897 //FIXME think more about this check
898 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
899 pktl->pkt.pts += st->first_dts;
901 if(pktl->pkt.dts != AV_NOPTS_VALUE)
902 pktl->pkt.dts += st->first_dts;
904 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
905 st->start_time= pktl->pkt.pts;
907 if (st->start_time == AV_NOPTS_VALUE)
908 st->start_time = pts;
911 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
913 AVPacketList *pktl= s->packet_buffer;
916 if(st->first_dts != AV_NOPTS_VALUE){
917 cur_dts= st->first_dts;
918 for(; pktl; pktl= pktl->next){
919 if(pktl->pkt.stream_index == pkt->stream_index){
920 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
922 cur_dts -= pkt->duration;
925 pktl= s->packet_buffer;
926 st->first_dts = cur_dts;
927 }else if(st->cur_dts)
930 for(; pktl; pktl= pktl->next){
931 if(pktl->pkt.stream_index != pkt->stream_index)
933 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
934 && !pktl->pkt.duration){
935 pktl->pkt.dts= cur_dts;
936 if(!st->codec->has_b_frames)
937 pktl->pkt.pts= cur_dts;
938 cur_dts += pkt->duration;
939 pktl->pkt.duration= pkt->duration;
943 if(st->first_dts == AV_NOPTS_VALUE)
944 st->cur_dts= cur_dts;
947 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
948 AVCodecParserContext *pc, AVPacket *pkt)
950 int num, den, presentation_delayed, delay, i;
953 if (s->flags & AVFMT_FLAG_NOFILLIN)
956 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
957 pkt->dts= AV_NOPTS_VALUE;
959 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
960 //FIXME Set low_delay = 0 when has_b_frames = 1
961 st->codec->has_b_frames = 1;
963 /* do we have a video B-frame ? */
964 delay= st->codec->has_b_frames;
965 presentation_delayed = 0;
967 // ignore delay caused by frame threading so that the mpeg2-without-dts
968 // warning will not trigger
969 if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
970 delay -= st->codec->thread_count-1;
972 /* XXX: need has_b_frame, but cannot get it if the codec is
975 pc && pc->pict_type != AV_PICTURE_TYPE_B)
976 presentation_delayed = 1;
978 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
979 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
980 pkt->dts -= 1LL<<st->pts_wrap_bits;
983 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
984 // we take the conservative approach and discard both
985 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
986 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
987 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
988 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
991 if (pkt->duration == 0) {
992 compute_frame_duration(&num, &den, st, pc, pkt);
994 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
996 if(pkt->duration != 0 && s->packet_buffer)
997 update_initial_durations(s, st, pkt);
1001 /* correct timestamps with byte offset if demuxers only have timestamps
1002 on packet boundaries */
1003 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1004 /* this will estimate bitrate based on this frame's duration and size */
1005 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1006 if(pkt->pts != AV_NOPTS_VALUE)
1008 if(pkt->dts != AV_NOPTS_VALUE)
1012 if (pc && pc->dts_sync_point >= 0) {
1013 // we have synchronization info from the parser
1014 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1016 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1017 if (pkt->dts != AV_NOPTS_VALUE) {
1018 // got DTS from the stream, update reference timestamp
1019 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1020 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1021 } else if (st->reference_dts != AV_NOPTS_VALUE) {
1022 // compute DTS based on reference timestamp
1023 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1024 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1026 if (pc->dts_sync_point > 0)
1027 st->reference_dts = pkt->dts; // new reference
1031 /* This may be redundant, but it should not hurt. */
1032 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1033 presentation_delayed = 1;
1035 // 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);
1036 /* interpolate PTS and DTS if they are not present */
1037 //We skip H264 currently because delay and has_b_frames are not reliably set
1038 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1039 if (presentation_delayed) {
1040 /* DTS = decompression timestamp */
1041 /* PTS = presentation timestamp */
1042 if (pkt->dts == AV_NOPTS_VALUE)
1043 pkt->dts = st->last_IP_pts;
1044 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1045 if (pkt->dts == AV_NOPTS_VALUE)
1046 pkt->dts = st->cur_dts;
1048 /* this is tricky: the dts must be incremented by the duration
1049 of the frame we are displaying, i.e. the last I- or P-frame */
1050 if (st->last_IP_duration == 0)
1051 st->last_IP_duration = pkt->duration;
1052 if(pkt->dts != AV_NOPTS_VALUE)
1053 st->cur_dts = pkt->dts + st->last_IP_duration;
1054 st->last_IP_duration = pkt->duration;
1055 st->last_IP_pts= pkt->pts;
1056 /* cannot compute PTS if not present (we can compute it only
1057 by knowing the future */
1058 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1059 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1060 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1061 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1062 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1063 pkt->pts += pkt->duration;
1064 // 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);
1068 /* presentation is not delayed : PTS and DTS are the same */
1069 if(pkt->pts == AV_NOPTS_VALUE)
1070 pkt->pts = pkt->dts;
1071 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1072 if(pkt->pts == AV_NOPTS_VALUE)
1073 pkt->pts = st->cur_dts;
1074 pkt->dts = pkt->pts;
1075 if(pkt->pts != AV_NOPTS_VALUE)
1076 st->cur_dts = pkt->pts + pkt->duration;
1080 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1081 st->pts_buffer[0]= pkt->pts;
1082 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1083 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1084 if(pkt->dts == AV_NOPTS_VALUE)
1085 pkt->dts= st->pts_buffer[0];
1086 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1087 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1089 if(pkt->dts > st->cur_dts)
1090 st->cur_dts = pkt->dts;
1093 // 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);
1096 if(is_intra_only(st->codec))
1097 pkt->flags |= AV_PKT_FLAG_KEY;
1100 /* keyframe computation */
1101 if (pc->key_frame == 1)
1102 pkt->flags |= AV_PKT_FLAG_KEY;
1103 else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1104 pkt->flags |= AV_PKT_FLAG_KEY;
1107 pkt->convergence_duration = pc->convergence_duration;
1111 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1116 av_init_packet(pkt);
1119 /* select current input stream component */
1122 if (!st->need_parsing || !st->parser) {
1123 /* no parsing needed: we just output the packet as is */
1124 /* raw data support */
1125 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
1126 compute_pkt_fields(s, st, NULL, pkt);
1128 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1129 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1130 ff_reduce_index(s, st->index);
1131 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1134 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1135 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1136 st->cur_ptr, st->cur_len,
1137 st->cur_pkt.pts, st->cur_pkt.dts,
1139 st->cur_pkt.pts = AV_NOPTS_VALUE;
1140 st->cur_pkt.dts = AV_NOPTS_VALUE;
1141 /* increment read pointer */
1145 /* return packet if any */
1149 pkt->stream_index = st->index;
1150 pkt->pts = st->parser->pts;
1151 pkt->dts = st->parser->dts;
1152 pkt->pos = st->parser->pos;
1153 if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1155 pkt->destruct= st->cur_pkt.destruct;
1156 st->cur_pkt.destruct= NULL;
1157 st->cur_pkt.data = NULL;
1158 assert(st->cur_len == 0);
1160 pkt->destruct = NULL;
1162 compute_pkt_fields(s, st, st->parser, pkt);
1164 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1165 int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
1166 ff_reduce_index(s, st->index);
1167 av_add_index_entry(st, pos, pkt->dts,
1168 0, 0, AVINDEX_KEYFRAME);
1175 av_free_packet(&st->cur_pkt);
1180 /* read next packet */
1181 ret = av_read_packet(s, &cur_pkt);
1183 if (ret == AVERROR(EAGAIN))
1185 /* return the last frames, if any */
1186 for(i = 0; i < s->nb_streams; i++) {
1188 if (st->parser && st->need_parsing) {
1189 av_parser_parse2(st->parser, st->codec,
1190 &pkt->data, &pkt->size,
1192 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1198 /* no more packets: really terminate parsing */
1201 st = s->streams[cur_pkt.stream_index];
1202 st->cur_pkt= cur_pkt;
1204 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1205 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1206 st->cur_pkt.pts < st->cur_pkt.dts){
1207 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1208 st->cur_pkt.stream_index,
1212 // av_free_packet(&st->cur_pkt);
1216 if(s->debug & FF_FDEBUG_TS)
1217 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1218 st->cur_pkt.stream_index,
1222 st->cur_pkt.duration,
1226 st->cur_ptr = st->cur_pkt.data;
1227 st->cur_len = st->cur_pkt.size;
1228 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1229 st->parser = av_parser_init(st->codec->codec_id);
1231 /* no parser available: just output the raw packets */
1232 st->need_parsing = AVSTREAM_PARSE_NONE;
1233 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1234 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1235 }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1236 st->parser->flags |= PARSER_FLAG_ONCE;
1241 if(s->debug & FF_FDEBUG_TS)
1242 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1253 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1257 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1260 pktl = s->packet_buffer;
1262 AVPacket *next_pkt= &pktl->pkt;
1264 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1265 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1266 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1267 if( pktl->pkt.stream_index == next_pkt->stream_index
1268 && (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1269 && av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1270 next_pkt->pts= pktl->pkt.dts;
1274 pktl = s->packet_buffer;
1277 if( next_pkt->pts != AV_NOPTS_VALUE
1278 || next_pkt->dts == AV_NOPTS_VALUE
1280 /* read packet from packet buffer, if there is data */
1282 s->packet_buffer = pktl->next;
1288 int ret= av_read_frame_internal(s, pkt);
1290 if(pktl && ret != AVERROR(EAGAIN)){
1297 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1298 &s->packet_buffer_end)) < 0)
1299 return AVERROR(ENOMEM);
1301 assert(!s->packet_buffer);
1302 return av_read_frame_internal(s, pkt);
1307 /* XXX: suppress the packet queue */
1308 static void flush_packet_queue(AVFormatContext *s)
1313 pktl = s->packet_buffer;
1316 s->packet_buffer = pktl->next;
1317 av_free_packet(&pktl->pkt);
1320 while(s->raw_packet_buffer){
1321 pktl = s->raw_packet_buffer;
1322 s->raw_packet_buffer = pktl->next;
1323 av_free_packet(&pktl->pkt);
1326 s->packet_buffer_end=
1327 s->raw_packet_buffer_end= NULL;
1328 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1331 /*******************************************************/
1334 int av_find_default_stream_index(AVFormatContext *s)
1336 int first_audio_index = -1;
1340 if (s->nb_streams <= 0)
1342 for(i = 0; i < s->nb_streams; i++) {
1344 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1347 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1348 first_audio_index = i;
1350 return first_audio_index >= 0 ? first_audio_index : 0;
1354 * Flush the frame reader.
1356 void ff_read_frame_flush(AVFormatContext *s)
1361 flush_packet_queue(s);
1365 /* for each stream, reset read state */
1366 for(i = 0; i < s->nb_streams; i++) {
1370 av_parser_close(st->parser);
1372 av_free_packet(&st->cur_pkt);
1374 st->last_IP_pts = AV_NOPTS_VALUE;
1375 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1376 st->reference_dts = AV_NOPTS_VALUE;
1381 st->probe_packets = MAX_PROBE_PACKETS;
1383 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1384 st->pts_buffer[j]= AV_NOPTS_VALUE;
1388 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1391 for(i = 0; i < s->nb_streams; i++) {
1392 AVStream *st = s->streams[i];
1394 st->cur_dts = av_rescale(timestamp,
1395 st->time_base.den * (int64_t)ref_st->time_base.num,
1396 st->time_base.num * (int64_t)ref_st->time_base.den);
1400 void ff_reduce_index(AVFormatContext *s, int stream_index)
1402 AVStream *st= s->streams[stream_index];
1403 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1405 if((unsigned)st->nb_index_entries >= max_entries){
1407 for(i=0; 2*i<st->nb_index_entries; i++)
1408 st->index_entries[i]= st->index_entries[2*i];
1409 st->nb_index_entries= i;
1413 int ff_add_index_entry(AVIndexEntry **index_entries,
1414 int *nb_index_entries,
1415 unsigned int *index_entries_allocated_size,
1416 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1418 AVIndexEntry *entries, *ie;
1421 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1424 entries = av_fast_realloc(*index_entries,
1425 index_entries_allocated_size,
1426 (*nb_index_entries + 1) *
1427 sizeof(AVIndexEntry));
1431 *index_entries= entries;
1433 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1436 index= (*nb_index_entries)++;
1437 ie= &entries[index];
1438 assert(index==0 || ie[-1].timestamp < timestamp);
1440 ie= &entries[index];
1441 if(ie->timestamp != timestamp){
1442 if(ie->timestamp <= timestamp)
1444 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1445 (*nb_index_entries)++;
1446 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1447 distance= ie->min_distance;
1451 ie->timestamp = timestamp;
1452 ie->min_distance= distance;
1459 int av_add_index_entry(AVStream *st,
1460 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1462 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1463 &st->index_entries_allocated_size, pos,
1464 timestamp, size, distance, flags);
1467 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1468 int64_t wanted_timestamp, int flags)
1476 //optimize appending index entries at the end
1477 if(b && entries[b-1].timestamp < wanted_timestamp)
1482 timestamp = entries[m].timestamp;
1483 if(timestamp >= wanted_timestamp)
1485 if(timestamp <= wanted_timestamp)
1488 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1490 if(!(flags & AVSEEK_FLAG_ANY)){
1491 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1492 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1501 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1504 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1505 wanted_timestamp, flags);
1508 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1509 AVInputFormat *avif= s->iformat;
1510 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1511 int64_t ts_min, ts_max, ts;
1516 if (stream_index < 0)
1519 av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1522 ts_min= AV_NOPTS_VALUE;
1523 pos_limit= -1; //gcc falsely says it may be uninitialized
1525 st= s->streams[stream_index];
1526 if(st->index_entries){
1529 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()
1530 index= FFMAX(index, 0);
1531 e= &st->index_entries[index];
1533 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1535 ts_min= e->timestamp;
1536 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1542 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1543 assert(index < st->nb_index_entries);
1545 e= &st->index_entries[index];
1546 assert(e->timestamp >= target_ts);
1548 ts_max= e->timestamp;
1549 pos_limit= pos_max - e->min_distance;
1550 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1551 pos_max,pos_limit, ts_max);
1555 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1560 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1563 av_update_cur_dts(s, st, ts);
1568 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 )){
1570 int64_t start_pos, filesize;
1573 av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1575 if(ts_min == AV_NOPTS_VALUE){
1576 pos_min = s->data_offset;
1577 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1578 if (ts_min == AV_NOPTS_VALUE)
1582 if(ts_max == AV_NOPTS_VALUE){
1584 filesize = avio_size(s->pb);
1585 pos_max = filesize - 1;
1588 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1590 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1591 if (ts_max == AV_NOPTS_VALUE)
1595 int64_t tmp_pos= pos_max + 1;
1596 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1597 if(tmp_ts == AV_NOPTS_VALUE)
1601 if(tmp_pos >= filesize)
1607 if(ts_min > ts_max){
1609 }else if(ts_min == ts_max){
1614 while (pos_min < pos_limit) {
1615 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1616 pos_min, pos_max, ts_min, ts_max);
1617 assert(pos_limit <= pos_max);
1620 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1621 // interpolate position (better than dichotomy)
1622 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1623 + pos_min - approximate_keyframe_distance;
1624 }else if(no_change==1){
1625 // bisection, if interpolation failed to change min or max pos last time
1626 pos = (pos_min + pos_limit)>>1;
1628 /* linear search if bisection failed, can only happen if there
1629 are very few or no keyframes between min/max */
1634 else if(pos > pos_limit)
1638 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1643 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1644 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1645 pos_limit, start_pos, no_change);
1646 if(ts == AV_NOPTS_VALUE){
1647 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1650 assert(ts != AV_NOPTS_VALUE);
1651 if (target_ts <= ts) {
1652 pos_limit = start_pos - 1;
1656 if (target_ts >= ts) {
1662 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1663 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1665 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1667 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1668 av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1669 pos, ts_min, target_ts, ts_max);
1674 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1675 int64_t pos_min, pos_max;
1679 if (stream_index < 0)
1682 st= s->streams[stream_index];
1685 pos_min = s->data_offset;
1686 pos_max = avio_size(s->pb) - 1;
1688 if (pos < pos_min) pos= pos_min;
1689 else if(pos > pos_max) pos= pos_max;
1691 avio_seek(s->pb, pos, SEEK_SET);
1694 av_update_cur_dts(s, st, ts);
1699 static int av_seek_frame_generic(AVFormatContext *s,
1700 int stream_index, int64_t timestamp, int flags)
1707 st = s->streams[stream_index];
1709 index = av_index_search_timestamp(st, timestamp, flags);
1711 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1714 if(index < 0 || index==st->nb_index_entries-1){
1718 if(st->nb_index_entries){
1719 assert(st->index_entries);
1720 ie= &st->index_entries[st->nb_index_entries-1];
1721 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1723 av_update_cur_dts(s, st, ie->timestamp);
1725 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1731 ret = av_read_frame(s, &pkt);
1732 }while(ret == AVERROR(EAGAIN));
1735 av_free_packet(&pkt);
1736 if(stream_index == pkt.stream_index){
1737 if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1741 index = av_index_search_timestamp(st, timestamp, flags);
1746 ff_read_frame_flush(s);
1747 if (s->iformat->read_seek){
1748 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1751 ie = &st->index_entries[index];
1752 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1754 av_update_cur_dts(s, st, ie->timestamp);
1759 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1764 ff_read_frame_flush(s);
1766 if(flags & AVSEEK_FLAG_BYTE)
1767 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1769 if(stream_index < 0){
1770 stream_index= av_find_default_stream_index(s);
1771 if(stream_index < 0)
1774 st= s->streams[stream_index];
1775 /* timestamp for default must be expressed in AV_TIME_BASE units */
1776 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1779 /* first, we try the format specific seek */
1780 if (s->iformat->read_seek)
1781 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1788 if(s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH))
1789 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1790 else if (!(s->iformat->flags & AVFMT_NOGENSEARCH))
1791 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1796 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1798 if(min_ts > ts || max_ts < ts)
1801 ff_read_frame_flush(s);
1803 if (s->iformat->read_seek2)
1804 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1806 if(s->iformat->read_timestamp){
1807 //try to seek via read_timestamp()
1810 //Fallback to old API if new is not implemented but old is
1811 //Note the old has somewat different sematics
1812 if(s->iformat->read_seek || 1)
1813 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1815 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1818 /*******************************************************/
1821 * Return TRUE if the stream has accurate duration in any stream.
1823 * @return TRUE if the stream has accurate duration for at least one component.
1825 static int av_has_duration(AVFormatContext *ic)
1830 for(i = 0;i < ic->nb_streams; i++) {
1831 st = ic->streams[i];
1832 if (st->duration != AV_NOPTS_VALUE)
1839 * Estimate the stream timings from the one of each components.
1841 * Also computes the global bitrate if possible.
1843 static void av_update_stream_timings(AVFormatContext *ic)
1845 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
1846 int64_t duration, duration1;
1850 start_time = INT64_MAX;
1851 start_time_text = INT64_MAX;
1852 end_time = INT64_MIN;
1853 duration = INT64_MIN;
1854 for(i = 0;i < ic->nb_streams; i++) {
1855 st = ic->streams[i];
1856 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1857 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1858 if (st->codec->codec_id == CODEC_ID_DVB_TELETEXT) {
1859 if (start_time1 < start_time_text)
1860 start_time_text = start_time1;
1862 if (start_time1 < start_time)
1863 start_time = start_time1;
1864 if (st->duration != AV_NOPTS_VALUE) {
1865 end_time1 = start_time1
1866 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1867 if (end_time1 > end_time)
1868 end_time = end_time1;
1871 if (st->duration != AV_NOPTS_VALUE) {
1872 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1873 if (duration1 > duration)
1874 duration = duration1;
1877 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
1878 start_time = start_time_text;
1879 if (start_time != INT64_MAX) {
1880 ic->start_time = start_time;
1881 if (end_time != INT64_MIN) {
1882 if (end_time - start_time > duration)
1883 duration = end_time - start_time;
1886 if (duration != INT64_MIN) {
1887 ic->duration = duration;
1888 if (ic->file_size > 0) {
1889 /* compute the bitrate */
1890 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1891 (double)ic->duration;
1896 static void fill_all_stream_timings(AVFormatContext *ic)
1901 av_update_stream_timings(ic);
1902 for(i = 0;i < ic->nb_streams; i++) {
1903 st = ic->streams[i];
1904 if (st->start_time == AV_NOPTS_VALUE) {
1905 if(ic->start_time != AV_NOPTS_VALUE)
1906 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1907 if(ic->duration != AV_NOPTS_VALUE)
1908 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1913 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1915 int64_t filesize, duration;
1919 /* if bit_rate is already set, we believe it */
1920 if (ic->bit_rate <= 0) {
1922 for(i=0;i<ic->nb_streams;i++) {
1923 st = ic->streams[i];
1924 if (st->codec->bit_rate > 0)
1925 bit_rate += st->codec->bit_rate;
1927 ic->bit_rate = bit_rate;
1930 /* if duration is already set, we believe it */
1931 if (ic->duration == AV_NOPTS_VALUE &&
1932 ic->bit_rate != 0 &&
1933 ic->file_size != 0) {
1934 filesize = ic->file_size;
1936 for(i = 0; i < ic->nb_streams; i++) {
1937 st = ic->streams[i];
1938 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1939 if (st->duration == AV_NOPTS_VALUE)
1940 st->duration = duration;
1946 #define DURATION_MAX_READ_SIZE 250000
1947 #define DURATION_MAX_RETRY 3
1949 /* only usable for MPEG-PS streams */
1950 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1952 AVPacket pkt1, *pkt = &pkt1;
1954 int read_size, i, ret;
1956 int64_t filesize, offset, duration;
1961 /* flush packet queue */
1962 flush_packet_queue(ic);
1964 for (i=0; i<ic->nb_streams; i++) {
1965 st = ic->streams[i];
1966 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1967 av_log(st->codec, AV_LOG_WARNING, "start time is not set in av_estimate_timings_from_pts\n");
1970 av_parser_close(st->parser);
1972 av_free_packet(&st->cur_pkt);
1976 /* estimate the end time (duration) */
1977 /* XXX: may need to support wrapping */
1978 filesize = ic->file_size;
1979 end_time = AV_NOPTS_VALUE;
1981 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
1985 avio_seek(ic->pb, offset, SEEK_SET);
1988 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
1992 ret = av_read_packet(ic, pkt);
1993 }while(ret == AVERROR(EAGAIN));
1996 read_size += pkt->size;
1997 st = ic->streams[pkt->stream_index];
1998 if (pkt->pts != AV_NOPTS_VALUE &&
1999 (st->start_time != AV_NOPTS_VALUE ||
2000 st->first_dts != AV_NOPTS_VALUE)) {
2001 duration = end_time = pkt->pts;
2002 if (st->start_time != AV_NOPTS_VALUE) duration -= st->start_time;
2003 else duration -= st->first_dts;
2005 duration += 1LL<<st->pts_wrap_bits;
2007 if (st->duration == AV_NOPTS_VALUE ||
2008 st->duration < duration)
2009 st->duration = duration;
2012 av_free_packet(pkt);
2014 }while( end_time==AV_NOPTS_VALUE
2015 && filesize > (DURATION_MAX_READ_SIZE<<retry)
2016 && ++retry <= DURATION_MAX_RETRY);
2018 fill_all_stream_timings(ic);
2020 avio_seek(ic->pb, old_offset, SEEK_SET);
2021 for (i=0; i<ic->nb_streams; i++) {
2023 st->cur_dts= st->first_dts;
2024 st->last_IP_pts = AV_NOPTS_VALUE;
2025 st->reference_dts = AV_NOPTS_VALUE;
2029 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
2033 /* get the file size, if possible */
2034 if (ic->iformat->flags & AVFMT_NOFILE) {
2037 file_size = avio_size(ic->pb);
2041 ic->file_size = file_size;
2043 if ((!strcmp(ic->iformat->name, "mpeg") ||
2044 !strcmp(ic->iformat->name, "mpegts")) &&
2045 file_size && ic->pb->seekable) {
2046 /* get accurate estimate from the PTSes */
2047 av_estimate_timings_from_pts(ic, old_offset);
2048 } else if (av_has_duration(ic)) {
2049 /* at least one component has timings - we use them for all
2051 fill_all_stream_timings(ic);
2053 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2054 /* less precise: use bitrate info */
2055 av_estimate_timings_from_bit_rate(ic);
2057 av_update_stream_timings(ic);
2062 AVStream av_unused *st;
2063 for(i = 0;i < ic->nb_streams; i++) {
2064 st = ic->streams[i];
2065 printf("%d: start_time: %0.3f duration: %0.3f\n",
2066 i, (double)st->start_time / AV_TIME_BASE,
2067 (double)st->duration / AV_TIME_BASE);
2069 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2070 (double)ic->start_time / AV_TIME_BASE,
2071 (double)ic->duration / AV_TIME_BASE,
2072 ic->bit_rate / 1000);
2077 static int has_codec_parameters(AVCodecContext *enc)
2080 switch(enc->codec_type) {
2081 case AVMEDIA_TYPE_AUDIO:
2082 val = enc->sample_rate && enc->channels && enc->sample_fmt != AV_SAMPLE_FMT_NONE;
2083 if(!enc->frame_size &&
2084 (enc->codec_id == CODEC_ID_VORBIS ||
2085 enc->codec_id == CODEC_ID_AAC ||
2086 enc->codec_id == CODEC_ID_MP1 ||
2087 enc->codec_id == CODEC_ID_MP2 ||
2088 enc->codec_id == CODEC_ID_MP3 ||
2089 enc->codec_id == CODEC_ID_SPEEX ||
2090 enc->codec_id == CODEC_ID_CELT))
2093 case AVMEDIA_TYPE_VIDEO:
2094 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
2100 return enc->codec_id != CODEC_ID_NONE && val != 0;
2103 static int has_decode_delay_been_guessed(AVStream *st)
2105 return st->codec->codec_id != CODEC_ID_H264 ||
2106 st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2109 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
2113 int got_picture, data_size, ret=0;
2116 if(!st->codec->codec){
2117 codec = avcodec_find_decoder(st->codec->codec_id);
2120 ret = avcodec_open(st->codec, codec);
2125 if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st)){
2126 switch(st->codec->codec_type) {
2127 case AVMEDIA_TYPE_VIDEO:
2128 avcodec_get_frame_defaults(&picture);
2129 ret = avcodec_decode_video2(st->codec, &picture,
2130 &got_picture, avpkt);
2132 case AVMEDIA_TYPE_AUDIO:
2133 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2134 samples = av_malloc(data_size);
2137 ret = avcodec_decode_audio3(st->codec, samples,
2149 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2151 while (tags->id != CODEC_ID_NONE) {
2159 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2162 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2163 if(tag == tags[i].tag)
2166 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2167 if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2170 return CODEC_ID_NONE;
2173 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2176 for(i=0; tags && tags[i]; i++){
2177 int tag= ff_codec_get_tag(tags[i], id);
2183 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2186 for(i=0; tags && tags[i]; i++){
2187 enum CodecID id= ff_codec_get_id(tags[i], tag);
2188 if(id!=CODEC_ID_NONE) return id;
2190 return CODEC_ID_NONE;
2193 static void compute_chapters_end(AVFormatContext *s)
2196 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2198 for (i = 0; i < s->nb_chapters; i++)
2199 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2200 AVChapter *ch = s->chapters[i];
2201 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2204 for (j = 0; j < s->nb_chapters; j++) {
2205 AVChapter *ch1 = s->chapters[j];
2206 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2207 if (j != i && next_start > ch->start && next_start < end)
2210 ch->end = (end == INT64_MAX) ? ch->start : end;
2214 static int get_std_framerate(int i){
2215 if(i<60*12) return i*1001;
2216 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2220 * Is the time base unreliable.
2221 * This is a heuristic to balance between quick acceptance of the values in
2222 * the headers vs. some extra checks.
2223 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2224 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2225 * And there are "variable" fps files this needs to detect as well.
2227 static int tb_unreliable(AVCodecContext *c){
2228 if( c->time_base.den >= 101L*c->time_base.num
2229 || c->time_base.den < 5L*c->time_base.num
2230 /* || c->codec_tag == AV_RL32("DIVX")
2231 || c->codec_tag == AV_RL32("XVID")*/
2232 || c->codec_id == CODEC_ID_MPEG2VIDEO
2233 || c->codec_id == CODEC_ID_H264
2239 int av_find_stream_info(AVFormatContext *ic)
2241 int i, count, ret, read_size, j;
2243 AVPacket pkt1, *pkt;
2244 int64_t old_offset = avio_tell(ic->pb);
2246 for(i=0;i<ic->nb_streams;i++) {
2248 st = ic->streams[i];
2249 if (st->codec->codec_id == CODEC_ID_AAC) {
2250 st->codec->sample_rate = 0;
2251 st->codec->frame_size = 0;
2252 st->codec->channels = 0;
2254 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2255 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2256 /* if(!st->time_base.num)
2258 if(!st->codec->time_base.num)
2259 st->codec->time_base= st->time_base;
2261 //only for the split stuff
2262 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2263 st->parser = av_parser_init(st->codec->codec_id);
2264 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2265 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2268 assert(!st->codec->codec);
2269 codec = avcodec_find_decoder(st->codec->codec_id);
2271 /* Force decoding of at least one frame of codec data
2272 * this makes sure the codec initializes the channel configuration
2273 * and does not trust the values from the container.
2275 if (codec && codec->capabilities & CODEC_CAP_CHANNEL_CONF)
2276 st->codec->channels = 0;
2278 /* Ensure that subtitle_header is properly set. */
2279 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2280 && codec && !st->codec->codec)
2281 avcodec_open(st->codec, codec);
2283 //try to just open decoders, in case this is enough to get parameters
2284 if(!has_codec_parameters(st->codec)){
2285 if (codec && !st->codec->codec)
2286 avcodec_open(st->codec, codec);
2290 for (i=0; i<ic->nb_streams; i++) {
2291 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2297 if(url_interrupt_cb()){
2299 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2303 /* check if one codec still needs to be handled */
2304 for(i=0;i<ic->nb_streams;i++) {
2305 int fps_analyze_framecount = 20;
2307 st = ic->streams[i];
2308 if (!has_codec_parameters(st->codec))
2310 /* if the timebase is coarse (like the usual millisecond precision
2311 of mkv), we need to analyze more frames to reliably arrive at
2313 if (av_q2d(st->time_base) > 0.0005)
2314 fps_analyze_framecount *= 2;
2315 if (ic->fps_probe_size >= 0)
2316 fps_analyze_framecount = ic->fps_probe_size;
2317 /* variable fps and no guess at the real fps */
2318 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2319 && st->info->duration_count < fps_analyze_framecount
2320 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2322 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2324 if(st->first_dts == AV_NOPTS_VALUE)
2327 if (i == ic->nb_streams) {
2328 /* NOTE: if the format has no header, then we need to read
2329 some packets to get most of the streams, so we cannot
2331 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2332 /* if we found the info for all the codecs, we can stop */
2334 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2338 /* we did not get all the codec info, but we read too much data */
2339 if (read_size >= ic->probesize) {
2341 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2345 /* NOTE: a new stream can be added there if no header in file
2346 (AVFMTCTX_NOHEADER) */
2347 ret = av_read_frame_internal(ic, &pkt1);
2348 if (ret < 0 && ret != AVERROR(EAGAIN)) {
2350 ret = -1; /* we could not have all the codec parameters before EOF */
2351 for(i=0;i<ic->nb_streams;i++) {
2352 st = ic->streams[i];
2353 if (!has_codec_parameters(st->codec)){
2355 avcodec_string(buf, sizeof(buf), st->codec, 0);
2356 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2364 if (ret == AVERROR(EAGAIN))
2367 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2368 if ((ret = av_dup_packet(pkt)) < 0)
2369 goto find_stream_info_err;
2371 read_size += pkt->size;
2373 st = ic->streams[pkt->stream_index];
2374 if (st->codec_info_nb_frames>1) {
2376 if (st->time_base.den > 0 && (t=av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q)) >= ic->max_analyze_duration) {
2377 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2380 st->info->codec_info_duration += pkt->duration;
2383 int64_t last = st->info->last_dts;
2384 int64_t duration= pkt->dts - last;
2386 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2387 double dur= duration * av_q2d(st->time_base);
2389 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2390 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2391 if (st->info->duration_count < 2)
2392 memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2393 for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2394 int framerate= get_std_framerate(i);
2395 int ticks= lrintf(dur*framerate/(1001*12));
2396 double error= dur - ticks*1001*12/(double)framerate;
2397 st->info->duration_error[i] += error*error;
2399 st->info->duration_count++;
2400 // ignore the first 4 values, they might have some random jitter
2401 if (st->info->duration_count > 3)
2402 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2404 if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2405 st->info->last_dts = pkt->dts;
2407 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2408 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2410 st->codec->extradata_size= i;
2411 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2412 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2413 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2417 /* if still no information, we try to open the codec and to
2418 decompress the frame. We try to avoid that in most cases as
2419 it takes longer and uses more memory. For MPEG-4, we need to
2420 decompress for QuickTime. */
2421 if (!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st))
2422 try_decode_frame(st, pkt);
2424 st->codec_info_nb_frames++;
2428 // close codecs which were opened in try_decode_frame()
2429 for(i=0;i<ic->nb_streams;i++) {
2430 st = ic->streams[i];
2431 if(st->codec->codec)
2432 avcodec_close(st->codec);
2434 for(i=0;i<ic->nb_streams;i++) {
2435 st = ic->streams[i];
2436 if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2437 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2438 (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2439 st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2440 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2441 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2442 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2443 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2444 st->codec->codec_tag= tag;
2447 // the check for tb_unreliable() is not completely correct, since this is not about handling
2448 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2449 // ipmovie.c produces.
2450 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
2451 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);
2452 if (st->info->duration_count && !st->r_frame_rate.num
2453 && tb_unreliable(st->codec) /*&&
2454 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2455 st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2457 double best_error= 2*av_q2d(st->time_base);
2458 best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2460 for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2461 double error = st->info->duration_error[j] * get_std_framerate(j);
2462 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2463 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2464 if(error < best_error){
2466 num = get_std_framerate(j);
2469 // do not increase frame rate by more than 1 % in order to match a standard rate.
2470 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2471 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2474 if (!st->r_frame_rate.num){
2475 if( st->codec->time_base.den * (int64_t)st->time_base.num
2476 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2477 st->r_frame_rate.num = st->codec->time_base.den;
2478 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2480 st->r_frame_rate.num = st->time_base.den;
2481 st->r_frame_rate.den = st->time_base.num;
2484 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2485 if(!st->codec->bits_per_coded_sample)
2486 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2487 // set stream disposition based on audio service type
2488 switch (st->codec->audio_service_type) {
2489 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2490 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2491 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2492 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2493 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2494 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2495 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2496 st->disposition = AV_DISPOSITION_COMMENT; break;
2497 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2498 st->disposition = AV_DISPOSITION_KARAOKE; break;
2503 av_estimate_timings(ic, old_offset);
2505 compute_chapters_end(ic);
2508 /* correct DTS for B-frame streams with no timestamps */
2509 for(i=0;i<ic->nb_streams;i++) {
2510 st = ic->streams[i];
2511 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2513 ppktl = &ic->packet_buffer;
2515 if(ppkt1->stream_index != i)
2517 if(ppkt1->pkt->dts < 0)
2519 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2521 ppkt1->pkt->dts -= delta;
2526 st->cur_dts -= delta;
2532 find_stream_info_err:
2533 for (i=0; i < ic->nb_streams; i++)
2534 av_freep(&ic->streams[i]->info);
2538 static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2542 for (i = 0; i < ic->nb_programs; i++)
2543 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2544 if (ic->programs[i]->stream_index[j] == s)
2545 return ic->programs[i];
2549 int av_find_best_stream(AVFormatContext *ic,
2550 enum AVMediaType type,
2551 int wanted_stream_nb,
2553 AVCodec **decoder_ret,
2556 int i, nb_streams = ic->nb_streams;
2557 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2558 unsigned *program = NULL;
2559 AVCodec *decoder = NULL, *best_decoder = NULL;
2561 if (related_stream >= 0 && wanted_stream_nb < 0) {
2562 AVProgram *p = find_program_from_stream(ic, related_stream);
2564 program = p->stream_index;
2565 nb_streams = p->nb_stream_indexes;
2568 for (i = 0; i < nb_streams; i++) {
2569 int real_stream_index = program ? program[i] : i;
2570 AVStream *st = ic->streams[real_stream_index];
2571 AVCodecContext *avctx = st->codec;
2572 if (avctx->codec_type != type)
2574 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2576 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2579 decoder = avcodec_find_decoder(st->codec->codec_id);
2582 ret = AVERROR_DECODER_NOT_FOUND;
2586 if (best_count >= st->codec_info_nb_frames)
2588 best_count = st->codec_info_nb_frames;
2589 ret = real_stream_index;
2590 best_decoder = decoder;
2591 if (program && i == nb_streams - 1 && ret < 0) {
2593 nb_streams = ic->nb_streams;
2594 i = 0; /* no related stream found, try again with everything */
2598 *decoder_ret = best_decoder;
2602 /*******************************************************/
2604 int av_read_play(AVFormatContext *s)
2606 if (s->iformat->read_play)
2607 return s->iformat->read_play(s);
2609 return avio_pause(s->pb, 0);
2610 return AVERROR(ENOSYS);
2613 int av_read_pause(AVFormatContext *s)
2615 if (s->iformat->read_pause)
2616 return s->iformat->read_pause(s);
2618 return avio_pause(s->pb, 1);
2619 return AVERROR(ENOSYS);
2622 void av_close_input_stream(AVFormatContext *s)
2624 flush_packet_queue(s);
2625 if (s->iformat->read_close)
2626 s->iformat->read_close(s);
2627 avformat_free_context(s);
2630 void avformat_free_context(AVFormatContext *s)
2636 if (s->iformat && s->iformat->priv_class && s->priv_data)
2637 av_opt_free(s->priv_data);
2639 for(i=0;i<s->nb_streams;i++) {
2640 /* free all data in a stream component */
2643 av_parser_close(st->parser);
2644 av_free_packet(&st->cur_pkt);
2646 av_dict_free(&st->metadata);
2647 av_free(st->index_entries);
2648 av_free(st->codec->extradata);
2649 av_free(st->codec->subtitle_header);
2651 av_free(st->priv_data);
2655 for(i=s->nb_programs-1; i>=0; i--) {
2656 av_dict_free(&s->programs[i]->metadata);
2657 av_freep(&s->programs[i]->stream_index);
2658 av_freep(&s->programs[i]);
2660 av_freep(&s->programs);
2661 av_freep(&s->priv_data);
2662 while(s->nb_chapters--) {
2663 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2664 av_free(s->chapters[s->nb_chapters]);
2666 av_freep(&s->chapters);
2667 av_dict_free(&s->metadata);
2668 av_freep(&s->streams);
2672 void av_close_input_file(AVFormatContext *s)
2674 AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2676 av_close_input_stream(s);
2681 AVStream *av_new_stream(AVFormatContext *s, int id)
2687 if (s->nb_streams >= INT_MAX/sizeof(*streams))
2689 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2692 s->streams = streams;
2694 st = av_mallocz(sizeof(AVStream));
2697 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2702 st->codec= avcodec_alloc_context();
2704 /* no default bitrate if decoding */
2705 st->codec->bit_rate = 0;
2707 st->index = s->nb_streams;
2709 st->start_time = AV_NOPTS_VALUE;
2710 st->duration = AV_NOPTS_VALUE;
2711 /* we set the current DTS to 0 so that formats without any timestamps
2712 but durations get some timestamps, formats with some unknown
2713 timestamps have their first few packets buffered and the
2714 timestamps corrected before they are returned to the user */
2716 st->first_dts = AV_NOPTS_VALUE;
2717 st->probe_packets = MAX_PROBE_PACKETS;
2719 /* default pts setting is MPEG-like */
2720 av_set_pts_info(st, 33, 1, 90000);
2721 st->last_IP_pts = AV_NOPTS_VALUE;
2722 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2723 st->pts_buffer[i]= AV_NOPTS_VALUE;
2724 st->reference_dts = AV_NOPTS_VALUE;
2726 st->sample_aspect_ratio = (AVRational){0,1};
2728 s->streams[s->nb_streams++] = st;
2732 AVProgram *av_new_program(AVFormatContext *ac, int id)
2734 AVProgram *program=NULL;
2737 av_dlog(ac, "new_program: id=0x%04x\n", id);
2739 for(i=0; i<ac->nb_programs; i++)
2740 if(ac->programs[i]->id == id)
2741 program = ac->programs[i];
2744 program = av_mallocz(sizeof(AVProgram));
2747 dynarray_add(&ac->programs, &ac->nb_programs, program);
2748 program->discard = AVDISCARD_NONE;
2755 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2757 AVChapter *chapter = NULL;
2760 for(i=0; i<s->nb_chapters; i++)
2761 if(s->chapters[i]->id == id)
2762 chapter = s->chapters[i];
2765 chapter= av_mallocz(sizeof(AVChapter));
2768 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2770 av_dict_set(&chapter->metadata, "title", title, 0);
2772 chapter->time_base= time_base;
2773 chapter->start = start;
2779 /************************************************************/
2780 /* output media file */
2782 #if FF_API_FORMAT_PARAMETERS
2783 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2785 if (s->oformat->priv_data_size > 0) {
2786 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2788 return AVERROR(ENOMEM);
2789 if (s->oformat->priv_class) {
2790 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2791 av_opt_set_defaults(s->priv_data);
2794 s->priv_data = NULL;
2800 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
2801 const char *format, const char *filename)
2803 AVFormatContext *s = avformat_alloc_context();
2812 oformat = av_guess_format(format, NULL, NULL);
2814 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
2815 ret = AVERROR(EINVAL);
2819 oformat = av_guess_format(NULL, filename, NULL);
2821 ret = AVERROR(EINVAL);
2822 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
2829 s->oformat = oformat;
2830 if (s->oformat->priv_data_size > 0) {
2831 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2834 if (s->oformat->priv_class) {
2835 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2836 av_opt_set_defaults(s->priv_data);
2839 s->priv_data = NULL;
2842 av_strlcpy(s->filename, filename, sizeof(s->filename));
2846 av_log(s, AV_LOG_ERROR, "Out of memory\n");
2847 ret = AVERROR(ENOMEM);
2849 avformat_free_context(s);
2853 #if FF_API_ALLOC_OUTPUT_CONTEXT
2854 AVFormatContext *avformat_alloc_output_context(const char *format,
2855 AVOutputFormat *oformat, const char *filename)
2857 AVFormatContext *avctx;
2858 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
2859 return ret < 0 ? NULL : avctx;
2863 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2865 const AVCodecTag *avctag;
2867 enum CodecID id = CODEC_ID_NONE;
2868 unsigned int tag = 0;
2871 * Check that tag + id is in the table
2872 * If neither is in the table -> OK
2873 * If tag is in the table with another id -> FAIL
2874 * If id is in the table with another tag -> FAIL unless strict < normal
2876 for (n = 0; s->oformat->codec_tag[n]; n++) {
2877 avctag = s->oformat->codec_tag[n];
2878 while (avctag->id != CODEC_ID_NONE) {
2879 if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2881 if (id == st->codec->codec_id)
2884 if (avctag->id == st->codec->codec_id)
2889 if (id != CODEC_ID_NONE)
2891 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2896 #if FF_API_FORMAT_PARAMETERS
2897 int av_write_header(AVFormatContext *s)
2899 return avformat_write_header(s, NULL);
2903 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2907 AVDictionary *tmp = NULL;
2910 av_dict_copy(&tmp, *options, 0);
2911 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2914 // some sanity checks
2915 if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2916 av_log(s, AV_LOG_ERROR, "no streams\n");
2917 ret = AVERROR(EINVAL);
2921 for(i=0;i<s->nb_streams;i++) {
2924 switch (st->codec->codec_type) {
2925 case AVMEDIA_TYPE_AUDIO:
2926 if(st->codec->sample_rate<=0){
2927 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2928 ret = AVERROR(EINVAL);
2931 if(!st->codec->block_align)
2932 st->codec->block_align = st->codec->channels *
2933 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2935 case AVMEDIA_TYPE_VIDEO:
2936 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2937 av_log(s, AV_LOG_ERROR, "time base not set\n");
2938 ret = AVERROR(EINVAL);
2941 if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2942 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2943 ret = AVERROR(EINVAL);
2946 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2947 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2948 ret = AVERROR(EINVAL);
2954 if(s->oformat->codec_tag){
2955 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)){
2956 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2957 st->codec->codec_tag= 0;
2959 if(st->codec->codec_tag){
2960 if (!validate_codec_tag(s, st)) {
2962 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2963 av_log(s, AV_LOG_ERROR,
2964 "Tag %s/0x%08x incompatible with output codec id '%d'\n",
2965 tagbuf, st->codec->codec_tag, st->codec->codec_id);
2966 ret = AVERROR_INVALIDDATA;
2970 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2973 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2974 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2975 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2978 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2979 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2980 if (!s->priv_data) {
2981 ret = AVERROR(ENOMEM);
2984 if (s->oformat->priv_class) {
2985 *(const AVClass**)s->priv_data= s->oformat->priv_class;
2986 av_opt_set_defaults(s->priv_data);
2987 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2992 /* set muxer identification string */
2993 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2994 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
2997 if(s->oformat->write_header){
2998 ret = s->oformat->write_header(s);
3003 /* init PTS generation */
3004 for(i=0;i<s->nb_streams;i++) {
3005 int64_t den = AV_NOPTS_VALUE;
3008 switch (st->codec->codec_type) {
3009 case AVMEDIA_TYPE_AUDIO:
3010 den = (int64_t)st->time_base.num * st->codec->sample_rate;
3012 case AVMEDIA_TYPE_VIDEO:
3013 den = (int64_t)st->time_base.num * st->codec->time_base.den;
3018 if (den != AV_NOPTS_VALUE) {
3020 ret = AVERROR_INVALIDDATA;
3023 av_frac_init(&st->pts, 0, 0, den);
3028 av_dict_free(options);
3037 //FIXME merge with compute_pkt_fields
3038 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3039 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3040 int num, den, frame_size, i;
3042 av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
3043 pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
3045 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
3046 return AVERROR(EINVAL);*/
3048 /* duration field */
3049 if (pkt->duration == 0) {
3050 compute_frame_duration(&num, &den, st, NULL, pkt);
3052 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3056 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3059 //XXX/FIXME this is a temporary hack until all encoders output pts
3060 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3062 // pkt->pts= st->cur_dts;
3063 pkt->pts= st->pts.val;
3066 //calculate dts from pts
3067 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3068 st->pts_buffer[0]= pkt->pts;
3069 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3070 st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3071 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3072 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3074 pkt->dts= st->pts_buffer[0];
3077 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) && st->cur_dts >= pkt->dts) || st->cur_dts > pkt->dts)){
3078 av_log(s, AV_LOG_ERROR,
3079 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
3080 st->index, st->cur_dts, pkt->dts);
3081 return AVERROR(EINVAL);
3083 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3084 av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
3085 return AVERROR(EINVAL);
3088 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
3089 st->cur_dts= pkt->dts;
3090 st->pts.val= pkt->dts;
3093 switch (st->codec->codec_type) {
3094 case AVMEDIA_TYPE_AUDIO:
3095 frame_size = get_audio_frame_size(st->codec, pkt->size);
3097 /* HACK/FIXME, we skip the initial 0 size packets as they are most
3098 likely equal to the encoder delay, but it would be better if we
3099 had the real timestamps from the encoder */
3100 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3101 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3104 case AVMEDIA_TYPE_VIDEO:
3105 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3113 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3115 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3117 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3120 ret= s->oformat->write_packet(s, pkt);
3122 ret= url_ferror(s->pb);
3126 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3127 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3129 AVPacketList **next_point, *this_pktl;
3131 this_pktl = av_mallocz(sizeof(AVPacketList));
3132 this_pktl->pkt= *pkt;
3133 pkt->destruct= NULL; // do not free original but only the copy
3134 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3136 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3137 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3139 next_point = &s->packet_buffer;
3142 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3143 while(!compare(s, &(*next_point)->pkt, pkt)){
3144 next_point= &(*next_point)->next;
3148 next_point = &(s->packet_buffer_end->next);
3151 assert(!*next_point);
3153 s->packet_buffer_end= this_pktl;
3156 this_pktl->next= *next_point;
3158 s->streams[pkt->stream_index]->last_in_packet_buffer=
3159 *next_point= this_pktl;
3162 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3164 AVStream *st = s->streams[ pkt ->stream_index];
3165 AVStream *st2= s->streams[ next->stream_index];
3166 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3170 return pkt->stream_index < next->stream_index;
3174 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3180 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3183 for(i=0; i < s->nb_streams; i++)
3184 stream_count+= !!s->streams[i]->last_in_packet_buffer;
3186 if(stream_count && (s->nb_streams == stream_count || flush)){
3187 pktl= s->packet_buffer;
3190 s->packet_buffer= pktl->next;
3191 if(!s->packet_buffer)
3192 s->packet_buffer_end= NULL;
3194 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3195 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3199 av_init_packet(out);
3205 * Interleave an AVPacket correctly so it can be muxed.
3206 * @param out the interleaved packet will be output here
3207 * @param in the input packet
3208 * @param flush 1 if no further packets are available as input and all
3209 * remaining packets should be output
3210 * @return 1 if a packet was output, 0 if no packet could be output,
3211 * < 0 if an error occurred
3213 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3214 if(s->oformat->interleave_packet)
3215 return s->oformat->interleave_packet(s, out, in, flush);
3217 return av_interleave_packet_per_dts(s, out, in, flush);
3220 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3221 AVStream *st= s->streams[ pkt->stream_index];
3224 //FIXME/XXX/HACK drop zero sized packets
3225 if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3228 av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3229 pkt->size, pkt->dts, pkt->pts);
3230 if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3233 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3234 return AVERROR(EINVAL);
3238 int ret= av_interleave_packet(s, &opkt, pkt, 0);
3239 if(ret<=0) //FIXME cleanup needed for ret<0 ?
3242 ret= s->oformat->write_packet(s, &opkt);
3244 av_free_packet(&opkt);
3249 if(url_ferror(s->pb))
3250 return url_ferror(s->pb);
3254 int av_write_trailer(AVFormatContext *s)
3260 ret= av_interleave_packet(s, &pkt, NULL, 1);
3261 if(ret<0) //FIXME cleanup needed for ret<0 ?
3266 ret= s->oformat->write_packet(s, &pkt);
3268 av_free_packet(&pkt);
3272 if(url_ferror(s->pb))
3276 if(s->oformat->write_trailer)
3277 ret = s->oformat->write_trailer(s);
3280 ret=url_ferror(s->pb);
3281 for(i=0;i<s->nb_streams;i++) {
3282 av_freep(&s->streams[i]->priv_data);
3283 av_freep(&s->streams[i]->index_entries);
3285 if (s->iformat && s->iformat->priv_class)
3286 av_opt_free(s->priv_data);
3287 av_freep(&s->priv_data);
3291 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3294 AVProgram *program=NULL;
3297 if (idx >= ac->nb_streams) {
3298 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3302 for(i=0; i<ac->nb_programs; i++){
3303 if(ac->programs[i]->id != progid)
3305 program = ac->programs[i];
3306 for(j=0; j<program->nb_stream_indexes; j++)
3307 if(program->stream_index[j] == idx)
3310 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3313 program->stream_index = tmp;
3314 program->stream_index[program->nb_stream_indexes++] = idx;
3319 static void print_fps(double d, const char *postfix){
3320 uint64_t v= lrintf(d*100);
3321 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3322 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3323 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3326 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3328 if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3329 AVDictionaryEntry *tag=NULL;
3331 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3332 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3333 if(strcmp("language", tag->key)){
3336 av_strlcpy(tmp, tag->value, sizeof(tmp));
3337 for(i=0; i<strlen(tmp); i++) if(tmp[i]==0xd) tmp[i]=' ';
3338 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tmp);
3344 /* "user interface" functions */
3345 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3348 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3349 AVStream *st = ic->streams[i];
3350 int g = av_gcd(st->time_base.num, st->time_base.den);
3351 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3352 avcodec_string(buf, sizeof(buf), st->codec, is_output);
3353 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3354 /* the pid is an important information, so we display it */
3355 /* XXX: add a generic system */
3356 if (flags & AVFMT_SHOW_IDS)
3357 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3359 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3360 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3361 av_log(NULL, AV_LOG_INFO, ": %s", buf);
3362 if (st->sample_aspect_ratio.num && // default
3363 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3364 AVRational display_aspect_ratio;
3365 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3366 st->codec->width*st->sample_aspect_ratio.num,
3367 st->codec->height*st->sample_aspect_ratio.den,
3369 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3370 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3371 display_aspect_ratio.num, display_aspect_ratio.den);
3373 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3374 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3375 print_fps(av_q2d(st->avg_frame_rate), "fps");
3376 if(st->r_frame_rate.den && st->r_frame_rate.num)
3377 print_fps(av_q2d(st->r_frame_rate), "tbr");
3378 if(st->time_base.den && st->time_base.num)
3379 print_fps(1/av_q2d(st->time_base), "tbn");
3380 if(st->codec->time_base.den && st->codec->time_base.num)
3381 print_fps(1/av_q2d(st->codec->time_base), "tbc");
3383 if (st->disposition & AV_DISPOSITION_DEFAULT)
3384 av_log(NULL, AV_LOG_INFO, " (default)");
3385 if (st->disposition & AV_DISPOSITION_DUB)
3386 av_log(NULL, AV_LOG_INFO, " (dub)");
3387 if (st->disposition & AV_DISPOSITION_ORIGINAL)
3388 av_log(NULL, AV_LOG_INFO, " (original)");
3389 if (st->disposition & AV_DISPOSITION_COMMENT)
3390 av_log(NULL, AV_LOG_INFO, " (comment)");
3391 if (st->disposition & AV_DISPOSITION_LYRICS)
3392 av_log(NULL, AV_LOG_INFO, " (lyrics)");
3393 if (st->disposition & AV_DISPOSITION_KARAOKE)
3394 av_log(NULL, AV_LOG_INFO, " (karaoke)");
3395 if (st->disposition & AV_DISPOSITION_FORCED)
3396 av_log(NULL, AV_LOG_INFO, " (forced)");
3397 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3398 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3399 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3400 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3401 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3402 av_log(NULL, AV_LOG_INFO, " (clean effects)");
3403 av_log(NULL, AV_LOG_INFO, "\n");
3404 dump_metadata(NULL, st->metadata, " ");
3407 #if FF_API_DUMP_FORMAT
3408 void dump_format(AVFormatContext *ic,
3413 av_dump_format(ic, index, url, is_output);
3417 void av_dump_format(AVFormatContext *ic,
3423 uint8_t *printed = av_mallocz(ic->nb_streams);
3424 if (ic->nb_streams && !printed)
3427 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3428 is_output ? "Output" : "Input",
3430 is_output ? ic->oformat->name : ic->iformat->name,
3431 is_output ? "to" : "from", url);
3432 dump_metadata(NULL, ic->metadata, " ");
3434 av_log(NULL, AV_LOG_INFO, " Duration: ");
3435 if (ic->duration != AV_NOPTS_VALUE) {
3436 int hours, mins, secs, us;
3437 secs = ic->duration / AV_TIME_BASE;
3438 us = ic->duration % AV_TIME_BASE;
3443 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3444 (100 * us) / AV_TIME_BASE);
3446 av_log(NULL, AV_LOG_INFO, "N/A");
3448 if (ic->start_time != AV_NOPTS_VALUE) {
3450 av_log(NULL, AV_LOG_INFO, ", start: ");
3451 secs = ic->start_time / AV_TIME_BASE;
3452 us = abs(ic->start_time % AV_TIME_BASE);
3453 av_log(NULL, AV_LOG_INFO, "%d.%06d",
3454 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3456 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3458 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3460 av_log(NULL, AV_LOG_INFO, "N/A");
3462 av_log(NULL, AV_LOG_INFO, "\n");
3464 for (i = 0; i < ic->nb_chapters; i++) {
3465 AVChapter *ch = ic->chapters[i];
3466 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3467 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3468 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3470 dump_metadata(NULL, ch->metadata, " ");
3472 if(ic->nb_programs) {
3473 int j, k, total = 0;
3474 for(j=0; j<ic->nb_programs; j++) {
3475 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3477 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3478 name ? name->value : "");
3479 dump_metadata(NULL, ic->programs[j]->metadata, " ");
3480 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3481 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3482 printed[ic->programs[j]->stream_index[k]] = 1;
3484 total += ic->programs[j]->nb_stream_indexes;
3486 if (total < ic->nb_streams)
3487 av_log(NULL, AV_LOG_INFO, " No Program\n");
3489 for(i=0;i<ic->nb_streams;i++)
3491 dump_stream_format(ic, i, index, is_output);
3496 int64_t av_gettime(void)
3499 gettimeofday(&tv,NULL);
3500 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3503 uint64_t ff_ntp_time(void)
3505 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3508 #if FF_API_PARSE_DATE
3509 #include "libavutil/parseutils.h"
3511 int64_t parse_date(const char *timestr, int duration)
3514 av_parse_time(&timeval, timestr, duration);
3519 #if FF_API_FIND_INFO_TAG
3520 #include "libavutil/parseutils.h"
3522 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3524 return av_find_info_tag(arg, arg_size, tag1, info);
3528 int av_get_frame_filename(char *buf, int buf_size,
3529 const char *path, int number)
3532 char *q, buf1[20], c;
3533 int nd, len, percentd_found;
3545 while (isdigit(*p)) {
3546 nd = nd * 10 + *p++ - '0';
3549 } while (isdigit(c));
3558 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3560 if ((q - buf + len) > buf_size - 1)
3562 memcpy(q, buf1, len);
3570 if ((q - buf) < buf_size - 1)
3574 if (!percentd_found)
3583 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3587 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3589 for(i=0;i<size;i+=16) {
3596 PRINT(" %02x", buf[i+j]);
3601 for(j=0;j<len;j++) {
3603 if (c < ' ' || c > '~')
3612 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3614 hex_dump_internal(NULL, f, 0, buf, size);
3617 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3619 hex_dump_internal(avcl, NULL, level, buf, size);
3622 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3625 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3626 PRINT("stream #%d:\n", pkt->stream_index);
3627 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3628 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3629 /* DTS is _always_ valid after av_read_frame() */
3631 if (pkt->dts == AV_NOPTS_VALUE)
3634 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3635 /* PTS may not be known if B-frames are present. */
3637 if (pkt->pts == AV_NOPTS_VALUE)
3640 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3642 PRINT(" size=%d\n", pkt->size);
3645 av_hex_dump(f, pkt->data, pkt->size);
3649 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3651 AVRational tb = { 1, AV_TIME_BASE };
3652 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3656 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3658 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3662 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3664 AVRational tb = { 1, AV_TIME_BASE };
3665 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3669 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3672 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3675 void av_url_split(char *proto, int proto_size,
3676 char *authorization, int authorization_size,
3677 char *hostname, int hostname_size,
3679 char *path, int path_size,
3682 const char *p, *ls, *at, *col, *brk;
3684 if (port_ptr) *port_ptr = -1;
3685 if (proto_size > 0) proto[0] = 0;
3686 if (authorization_size > 0) authorization[0] = 0;
3687 if (hostname_size > 0) hostname[0] = 0;
3688 if (path_size > 0) path[0] = 0;
3690 /* parse protocol */
3691 if ((p = strchr(url, ':'))) {
3692 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3697 /* no protocol means plain filename */
3698 av_strlcpy(path, url, path_size);
3702 /* separate path from hostname */
3703 ls = strchr(p, '/');
3705 ls = strchr(p, '?');
3707 av_strlcpy(path, ls, path_size);
3709 ls = &p[strlen(p)]; // XXX
3711 /* the rest is hostname, use that to parse auth/port */
3713 /* authorization (user[:pass]@hostname) */
3714 if ((at = strchr(p, '@')) && at < ls) {
3715 av_strlcpy(authorization, p,
3716 FFMIN(authorization_size, at + 1 - p));
3717 p = at + 1; /* skip '@' */
3720 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3722 av_strlcpy(hostname, p + 1,
3723 FFMIN(hostname_size, brk - p));
3724 if (brk[1] == ':' && port_ptr)
3725 *port_ptr = atoi(brk + 2);
3726 } else if ((col = strchr(p, ':')) && col < ls) {
3727 av_strlcpy(hostname, p,
3728 FFMIN(col + 1 - p, hostname_size));
3729 if (port_ptr) *port_ptr = atoi(col + 1);
3731 av_strlcpy(hostname, p,
3732 FFMIN(ls + 1 - p, hostname_size));
3736 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3739 static const char hex_table_uc[16] = { '0', '1', '2', '3',
3742 'C', 'D', 'E', 'F' };
3743 static const char hex_table_lc[16] = { '0', '1', '2', '3',
3746 'c', 'd', 'e', 'f' };
3747 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3749 for(i = 0; i < s; i++) {
3750 buff[i * 2] = hex_table[src[i] >> 4];
3751 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3757 int ff_hex_to_data(uint8_t *data, const char *p)
3764 p += strspn(p, SPACE_CHARS);
3767 c = toupper((unsigned char) *p++);
3768 if (c >= '0' && c <= '9')
3770 else if (c >= 'A' && c <= 'F')
3785 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3786 unsigned int pts_num, unsigned int pts_den)
3789 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3790 if(new_tb.num != pts_num)
3791 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3793 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3795 if(new_tb.num <= 0 || new_tb.den <= 0) {
3796 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3799 s->time_base = new_tb;
3800 s->pts_wrap_bits = pts_wrap_bits;
3803 int ff_url_join(char *str, int size, const char *proto,
3804 const char *authorization, const char *hostname,
3805 int port, const char *fmt, ...)
3808 struct addrinfo hints, *ai;
3813 av_strlcatf(str, size, "%s://", proto);
3814 if (authorization && authorization[0])
3815 av_strlcatf(str, size, "%s@", authorization);
3816 #if CONFIG_NETWORK && defined(AF_INET6)
3817 /* Determine if hostname is a numerical IPv6 address,
3818 * properly escape it within [] in that case. */
3819 memset(&hints, 0, sizeof(hints));
3820 hints.ai_flags = AI_NUMERICHOST;
3821 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3822 if (ai->ai_family == AF_INET6) {
3823 av_strlcat(str, "[", size);
3824 av_strlcat(str, hostname, size);
3825 av_strlcat(str, "]", size);
3827 av_strlcat(str, hostname, size);
3832 /* Not an IPv6 address, just output the plain string. */
3833 av_strlcat(str, hostname, size);
3836 av_strlcatf(str, size, ":%d", port);
3839 int len = strlen(str);
3842 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3848 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3849 AVFormatContext *src)
3854 local_pkt.stream_index = dst_stream;
3855 if (pkt->pts != AV_NOPTS_VALUE)
3856 local_pkt.pts = av_rescale_q(pkt->pts,
3857 src->streams[pkt->stream_index]->time_base,
3858 dst->streams[dst_stream]->time_base);
3859 if (pkt->dts != AV_NOPTS_VALUE)
3860 local_pkt.dts = av_rescale_q(pkt->dts,
3861 src->streams[pkt->stream_index]->time_base,
3862 dst->streams[dst_stream]->time_base);
3863 return av_write_frame(dst, &local_pkt);
3866 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3869 const char *ptr = str;
3871 /* Parse key=value pairs. */
3874 char *dest = NULL, *dest_end;
3875 int key_len, dest_len = 0;
3877 /* Skip whitespace and potential commas. */
3878 while (*ptr && (isspace(*ptr) || *ptr == ','))
3885 if (!(ptr = strchr(key, '=')))
3888 key_len = ptr - key;
3890 callback_get_buf(context, key, key_len, &dest, &dest_len);
3891 dest_end = dest + dest_len - 1;
3895 while (*ptr && *ptr != '\"') {
3899 if (dest && dest < dest_end)
3903 if (dest && dest < dest_end)
3911 for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3912 if (dest && dest < dest_end)
3920 int ff_find_stream_index(AVFormatContext *s, int id)
3923 for (i = 0; i < s->nb_streams; i++) {
3924 if (s->streams[i]->id == id)
3930 void ff_make_absolute_url(char *buf, int size, const char *base,
3934 /* Absolute path, relative to the current server */
3935 if (base && strstr(base, "://") && rel[0] == '/') {
3937 av_strlcpy(buf, base, size);
3938 sep = strstr(buf, "://");
3941 sep = strchr(sep, '/');
3945 av_strlcat(buf, rel, size);
3948 /* If rel actually is an absolute url, just copy it */
3949 if (!base || strstr(rel, "://") || rel[0] == '/') {
3950 av_strlcpy(buf, rel, size);
3954 av_strlcpy(buf, base, size);
3955 /* Remove the file name from the base url */
3956 sep = strrchr(buf, '/');
3961 while (av_strstart(rel, "../", NULL) && sep) {
3962 /* Remove the path delimiter at the end */
3964 sep = strrchr(buf, '/');
3965 /* If the next directory name to pop off is "..", break here */
3966 if (!strcmp(sep ? &sep[1] : buf, "..")) {
3967 /* Readd the slash we just removed */
3968 av_strlcat(buf, "/", size);
3971 /* Cut off the directory name */
3978 av_strlcat(buf, rel, size);