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
23 #include "libavcodec/opt.h"
25 #include "libavutil/avstring.h"
35 * @file libavformat/utils.c
36 * various utility functions for use within FFmpeg
39 unsigned avformat_version(void)
41 return LIBAVFORMAT_VERSION_INT;
44 const char * avformat_configuration(void)
46 return FFMPEG_CONFIGURATION;
49 const char * avformat_license(void)
51 #define LICENSE_PREFIX "libavformat license: "
52 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
55 /* fraction handling */
58 * f = val + (num / den) + 0.5.
60 * 'num' is normalized so that it is such as 0 <= num < den.
62 * @param f fractional number
63 * @param val integer value
64 * @param num must be >= 0
65 * @param den must be >= 1
67 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
80 * Fractional addition to f: f = f + (incr / f->den).
82 * @param f fractional number
83 * @param incr increment, can be positive or negative
85 static void av_frac_add(AVFrac *f, int64_t incr)
98 } else if (num >= den) {
105 /** head of registered input format linked list */
106 AVInputFormat *first_iformat = NULL;
107 /** head of registered output format linked list */
108 AVOutputFormat *first_oformat = NULL;
110 AVInputFormat *av_iformat_next(AVInputFormat *f)
112 if(f) return f->next;
113 else return first_iformat;
116 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
118 if(f) return f->next;
119 else return first_oformat;
122 void av_register_input_format(AVInputFormat *format)
126 while (*p != NULL) p = &(*p)->next;
131 void av_register_output_format(AVOutputFormat *format)
135 while (*p != NULL) p = &(*p)->next;
140 int match_ext(const char *filename, const char *extensions)
148 ext = strrchr(filename, '.');
154 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
157 if (!strcasecmp(ext1, ext))
167 static int match_format(const char *name, const char *names)
175 namelen = strlen(name);
176 while ((p = strchr(names, ','))) {
177 len = FFMAX(p - names, namelen);
178 if (!strncasecmp(name, names, len))
182 return !strcasecmp(name, names);
185 AVOutputFormat *guess_format(const char *short_name, const char *filename,
186 const char *mime_type)
188 AVOutputFormat *fmt, *fmt_found;
189 int score_max, score;
191 /* specific test for image sequences */
192 #if CONFIG_IMAGE2_MUXER
193 if (!short_name && filename &&
194 av_filename_number_test(filename) &&
195 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
196 return guess_format("image2", NULL, NULL);
199 /* Find the proper file type. */
203 while (fmt != NULL) {
205 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
207 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
209 if (filename && fmt->extensions &&
210 match_ext(filename, fmt->extensions)) {
213 if (score > score_max) {
222 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
223 const char *mime_type)
225 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
228 AVOutputFormat *stream_fmt;
229 char stream_format_name[64];
231 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
232 stream_fmt = guess_format(stream_format_name, NULL, NULL);
241 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
242 const char *filename, const char *mime_type, enum CodecType type){
243 if(type == CODEC_TYPE_VIDEO){
244 enum CodecID codec_id= CODEC_ID_NONE;
246 #if CONFIG_IMAGE2_MUXER
247 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
248 codec_id= av_guess_image2_codec(filename);
251 if(codec_id == CODEC_ID_NONE)
252 codec_id= fmt->video_codec;
254 }else if(type == CODEC_TYPE_AUDIO)
255 return fmt->audio_codec;
257 return CODEC_ID_NONE;
260 AVInputFormat *av_find_input_format(const char *short_name)
263 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
264 if (match_format(short_name, fmt->name))
270 /* memory handling */
273 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
275 int ret= av_new_packet(pkt, size);
280 pkt->pos= url_ftell(s);
282 ret= get_buffer(s, pkt->data, size);
286 av_shrink_packet(pkt, ret);
292 int av_filename_number_test(const char *filename)
295 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
298 static AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
300 AVInputFormat *fmt1, *fmt;
304 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
305 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
308 if (fmt1->read_probe) {
309 score = fmt1->read_probe(pd);
310 } else if (fmt1->extensions) {
311 if (match_ext(pd->filename, fmt1->extensions)) {
315 if (score > *score_max) {
318 }else if (score == *score_max)
324 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
326 return av_probe_input_format2(pd, is_opened, &score);
329 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
332 fmt = av_probe_input_format2(pd, 1, &score);
335 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
336 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
337 if (!strcmp(fmt->name, "mp3")) {
338 st->codec->codec_id = CODEC_ID_MP3;
339 st->codec->codec_type = CODEC_TYPE_AUDIO;
340 } else if (!strcmp(fmt->name, "ac3")) {
341 st->codec->codec_id = CODEC_ID_AC3;
342 st->codec->codec_type = CODEC_TYPE_AUDIO;
343 } else if (!strcmp(fmt->name, "eac3")) {
344 st->codec->codec_id = CODEC_ID_EAC3;
345 st->codec->codec_type = CODEC_TYPE_AUDIO;
346 } else if (!strcmp(fmt->name, "mpegvideo")) {
347 st->codec->codec_id = CODEC_ID_MPEG2VIDEO;
348 st->codec->codec_type = CODEC_TYPE_VIDEO;
349 } else if (!strcmp(fmt->name, "m4v")) {
350 st->codec->codec_id = CODEC_ID_MPEG4;
351 st->codec->codec_type = CODEC_TYPE_VIDEO;
352 } else if (!strcmp(fmt->name, "h264")) {
353 st->codec->codec_id = CODEC_ID_H264;
354 st->codec->codec_type = CODEC_TYPE_VIDEO;
355 } else if (!strcmp(fmt->name, "dts")) {
356 st->codec->codec_id = CODEC_ID_DTS;
357 st->codec->codec_type = CODEC_TYPE_AUDIO;
363 /************************************************************/
364 /* input media file */
367 * Open a media file from an IO stream. 'fmt' must be specified.
369 int av_open_input_stream(AVFormatContext **ic_ptr,
370 ByteIOContext *pb, const char *filename,
371 AVInputFormat *fmt, AVFormatParameters *ap)
375 AVFormatParameters default_ap;
379 memset(ap, 0, sizeof(default_ap));
382 if(!ap->prealloced_context)
383 ic = avformat_alloc_context();
387 err = AVERROR(ENOMEM);
392 ic->duration = AV_NOPTS_VALUE;
393 ic->start_time = AV_NOPTS_VALUE;
394 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
396 /* allocate private data */
397 if (fmt->priv_data_size > 0) {
398 ic->priv_data = av_mallocz(fmt->priv_data_size);
399 if (!ic->priv_data) {
400 err = AVERROR(ENOMEM);
404 ic->priv_data = NULL;
407 if (ic->iformat->read_header) {
408 err = ic->iformat->read_header(ic, ap);
413 if (pb && !ic->data_offset)
414 ic->data_offset = url_ftell(ic->pb);
416 #if LIBAVFORMAT_VERSION_MAJOR < 53
417 ff_metadata_demux_compat(ic);
420 ic->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
427 av_freep(&ic->priv_data);
428 for(i=0;i<ic->nb_streams;i++) {
429 AVStream *st = ic->streams[i];
431 av_free(st->priv_data);
432 av_free(st->codec->extradata);
442 /** size of probe buffer, for guessing file type from file contents */
443 #define PROBE_BUF_MIN 2048
444 #define PROBE_BUF_MAX (1<<20)
446 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
449 AVFormatParameters *ap)
452 AVProbeData probe_data, *pd = &probe_data;
453 ByteIOContext *pb = NULL;
454 void *logctx= ap && ap->prealloced_context ? *ic_ptr : NULL;
458 pd->filename = filename;
463 /* guess format if no file can be opened */
464 fmt = av_probe_input_format(pd, 0);
467 /* Do not open file if the format does not need it. XXX: specific
468 hack needed to handle RTSP/TCP */
469 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
470 /* if no file needed do not try to open one */
471 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
475 url_setbufsize(pb, buf_size);
478 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
479 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
480 /* read probe data */
481 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
482 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
484 if ((int)pd->buf_size < 0) {
489 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
490 if (url_fseek(pb, 0, SEEK_SET) < 0) {
492 if (url_fopen(&pb, filename, URL_RDONLY) < 0) {
498 /* guess file format */
499 fmt = av_probe_input_format2(pd, 1, &score);
501 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
502 av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
504 av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
510 /* if still no format found, error */
516 /* check filename in case an image number is expected */
517 if (fmt->flags & AVFMT_NEEDNUMBER) {
518 if (!av_filename_number_test(filename)) {
519 err = AVERROR_NUMEXPECTED;
523 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
531 if (ap && ap->prealloced_context)
538 /*******************************************************/
540 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
541 AVPacketList **plast_pktl){
542 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
547 (*plast_pktl)->next = pktl;
549 *packet_buffer = pktl;
551 /* add the packet in the buffered packet list */
557 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
563 AVPacketList *pktl = s->raw_packet_buffer;
567 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
568 !s->streams[pkt->stream_index]->probe_packets ||
569 s->raw_packet_buffer_remaining_size < pkt->size){
570 AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
573 s->raw_packet_buffer = pktl->next;
574 s->raw_packet_buffer_remaining_size += pkt->size;
581 ret= s->iformat->read_packet(s, pkt);
583 if (!pktl || ret == AVERROR(EAGAIN))
585 for (i = 0; i < s->nb_streams; i++)
586 s->streams[i]->probe_packets = 0;
589 st= s->streams[pkt->stream_index];
591 switch(st->codec->codec_type){
592 case CODEC_TYPE_VIDEO:
593 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
595 case CODEC_TYPE_AUDIO:
596 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
598 case CODEC_TYPE_SUBTITLE:
599 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
603 if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
607 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
608 s->raw_packet_buffer_remaining_size -= pkt->size;
610 if(st->codec->codec_id == CODEC_ID_PROBE){
611 AVProbeData *pd = &st->probe_data;
615 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
616 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
617 pd->buf_size += pkt->size;
618 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
620 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
621 set_codec_from_probe_data(s, st, pd, 1);
622 if(st->codec->codec_id != CODEC_ID_PROBE){
631 /**********************************************************/
634 * Get the number of samples of an audio frame. Return -1 on error.
636 static int get_audio_frame_size(AVCodecContext *enc, int size)
640 if(enc->codec_id == CODEC_ID_VORBIS)
643 if (enc->frame_size <= 1) {
644 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
646 if (bits_per_sample) {
647 if (enc->channels == 0)
649 frame_size = (size << 3) / (bits_per_sample * enc->channels);
651 /* used for example by ADPCM codecs */
652 if (enc->bit_rate == 0)
654 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
657 frame_size = enc->frame_size;
664 * Return the frame duration in seconds. Return 0 if not available.
666 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
667 AVCodecParserContext *pc, AVPacket *pkt)
673 switch(st->codec->codec_type) {
674 case CODEC_TYPE_VIDEO:
675 if(st->time_base.num*1000LL > st->time_base.den){
676 *pnum = st->time_base.num;
677 *pden = st->time_base.den;
678 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
679 *pnum = st->codec->time_base.num;
680 *pden = st->codec->time_base.den;
681 if (pc && pc->repeat_pict) {
682 *pnum = (*pnum) * (1 + pc->repeat_pict);
686 case CODEC_TYPE_AUDIO:
687 frame_size = get_audio_frame_size(st->codec, pkt->size);
691 *pden = st->codec->sample_rate;
698 static int is_intra_only(AVCodecContext *enc){
699 if(enc->codec_type == CODEC_TYPE_AUDIO){
701 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
702 switch(enc->codec_id){
704 case CODEC_ID_MJPEGB:
706 case CODEC_ID_RAWVIDEO:
707 case CODEC_ID_DVVIDEO:
708 case CODEC_ID_HUFFYUV:
709 case CODEC_ID_FFVHUFF:
714 case CODEC_ID_JPEG2000:
722 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
723 int64_t dts, int64_t pts)
725 AVStream *st= s->streams[stream_index];
726 AVPacketList *pktl= s->packet_buffer;
728 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
731 st->first_dts= dts - st->cur_dts;
734 for(; pktl; pktl= pktl->next){
735 if(pktl->pkt.stream_index != stream_index)
737 //FIXME think more about this check
738 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
739 pktl->pkt.pts += st->first_dts;
741 if(pktl->pkt.dts != AV_NOPTS_VALUE)
742 pktl->pkt.dts += st->first_dts;
744 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
745 st->start_time= pktl->pkt.pts;
747 if (st->start_time == AV_NOPTS_VALUE)
748 st->start_time = pts;
751 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
753 AVPacketList *pktl= s->packet_buffer;
756 if(st->first_dts != AV_NOPTS_VALUE){
757 cur_dts= st->first_dts;
758 for(; pktl; pktl= pktl->next){
759 if(pktl->pkt.stream_index == pkt->stream_index){
760 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
762 cur_dts -= pkt->duration;
765 pktl= s->packet_buffer;
766 st->first_dts = cur_dts;
767 }else if(st->cur_dts)
770 for(; pktl; pktl= pktl->next){
771 if(pktl->pkt.stream_index != pkt->stream_index)
773 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
774 && !pktl->pkt.duration){
775 pktl->pkt.dts= cur_dts;
776 if(!st->codec->has_b_frames)
777 pktl->pkt.pts= cur_dts;
778 cur_dts += pkt->duration;
779 pktl->pkt.duration= pkt->duration;
783 if(st->first_dts == AV_NOPTS_VALUE)
784 st->cur_dts= cur_dts;
787 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
788 AVCodecParserContext *pc, AVPacket *pkt)
790 int num, den, presentation_delayed, delay, i;
793 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == FF_B_TYPE)
794 //FIXME Set low_delay = 0 when has_b_frames = 1
795 st->codec->has_b_frames = 1;
797 /* do we have a video B-frame ? */
798 delay= st->codec->has_b_frames;
799 presentation_delayed = 0;
800 /* XXX: need has_b_frame, but cannot get it if the codec is
803 pc && pc->pict_type != FF_B_TYPE)
804 presentation_delayed = 1;
806 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
807 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
808 pkt->dts -= 1LL<<st->pts_wrap_bits;
811 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
812 // we take the conservative approach and discard both
813 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
814 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
815 av_log(s, AV_LOG_WARNING, "invalid dts/pts combination\n");
816 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
819 if (pkt->duration == 0) {
820 compute_frame_duration(&num, &den, st, pc, pkt);
822 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
824 if(pkt->duration != 0 && s->packet_buffer)
825 update_initial_durations(s, st, pkt);
829 /* correct timestamps with byte offset if demuxers only have timestamps
830 on packet boundaries */
831 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
832 /* this will estimate bitrate based on this frame's duration and size */
833 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
834 if(pkt->pts != AV_NOPTS_VALUE)
836 if(pkt->dts != AV_NOPTS_VALUE)
840 if (pc && pc->dts_sync_point >= 0) {
841 // we have synchronization info from the parser
842 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
844 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
845 if (pkt->dts != AV_NOPTS_VALUE) {
846 // got DTS from the stream, update reference timestamp
847 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
848 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
849 } else if (st->reference_dts != AV_NOPTS_VALUE) {
850 // compute DTS based on reference timestamp
851 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
852 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
854 if (pc->dts_sync_point > 0)
855 st->reference_dts = pkt->dts; // new reference
859 /* This may be redundant, but it should not hurt. */
860 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
861 presentation_delayed = 1;
863 // 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);
864 /* interpolate PTS and DTS if they are not present */
865 //We skip H264 currently because delay and has_b_frames are not reliably set
866 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
867 if (presentation_delayed) {
868 /* DTS = decompression timestamp */
869 /* PTS = presentation timestamp */
870 if (pkt->dts == AV_NOPTS_VALUE)
871 pkt->dts = st->last_IP_pts;
872 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
873 if (pkt->dts == AV_NOPTS_VALUE)
874 pkt->dts = st->cur_dts;
876 /* this is tricky: the dts must be incremented by the duration
877 of the frame we are displaying, i.e. the last I- or P-frame */
878 if (st->last_IP_duration == 0)
879 st->last_IP_duration = pkt->duration;
880 if(pkt->dts != AV_NOPTS_VALUE)
881 st->cur_dts = pkt->dts + st->last_IP_duration;
882 st->last_IP_duration = pkt->duration;
883 st->last_IP_pts= pkt->pts;
884 /* cannot compute PTS if not present (we can compute it only
885 by knowing the future */
886 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
887 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
888 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
889 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
890 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
891 pkt->pts += pkt->duration;
892 // 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);
896 /* presentation is not delayed : PTS and DTS are the same */
897 if(pkt->pts == AV_NOPTS_VALUE)
899 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
900 if(pkt->pts == AV_NOPTS_VALUE)
901 pkt->pts = st->cur_dts;
903 if(pkt->pts != AV_NOPTS_VALUE)
904 st->cur_dts = pkt->pts + pkt->duration;
908 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
909 st->pts_buffer[0]= pkt->pts;
910 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
911 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
912 if(pkt->dts == AV_NOPTS_VALUE)
913 pkt->dts= st->pts_buffer[0];
914 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
915 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
917 if(pkt->dts > st->cur_dts)
918 st->cur_dts = pkt->dts;
921 // 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);
924 if(is_intra_only(st->codec))
925 pkt->flags |= PKT_FLAG_KEY;
928 /* keyframe computation */
929 if (pc->key_frame == 1)
930 pkt->flags |= PKT_FLAG_KEY;
931 else if (pc->key_frame == -1 && pc->pict_type == FF_I_TYPE)
932 pkt->flags |= PKT_FLAG_KEY;
935 pkt->convergence_duration = pc->convergence_duration;
939 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
947 /* select current input stream component */
950 if (!st->need_parsing || !st->parser) {
951 /* no parsing needed: we just output the packet as is */
952 /* raw data support */
953 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
954 compute_pkt_fields(s, st, NULL, pkt);
956 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
957 (pkt->flags & PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
958 ff_reduce_index(s, st->index);
959 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
962 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
963 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
964 st->cur_ptr, st->cur_len,
965 st->cur_pkt.pts, st->cur_pkt.dts,
967 st->cur_pkt.pts = AV_NOPTS_VALUE;
968 st->cur_pkt.dts = AV_NOPTS_VALUE;
969 /* increment read pointer */
973 /* return packet if any */
977 pkt->stream_index = st->index;
978 pkt->pts = st->parser->pts;
979 pkt->dts = st->parser->dts;
980 pkt->pos = st->parser->pos;
981 pkt->destruct = NULL;
982 compute_pkt_fields(s, st, st->parser, pkt);
984 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
985 ff_reduce_index(s, st->index);
986 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
987 0, 0, AVINDEX_KEYFRAME);
994 av_free_packet(&st->cur_pkt);
999 /* read next packet */
1000 ret = av_read_packet(s, &cur_pkt);
1002 if (ret == AVERROR(EAGAIN))
1004 /* return the last frames, if any */
1005 for(i = 0; i < s->nb_streams; i++) {
1007 if (st->parser && st->need_parsing) {
1008 av_parser_parse2(st->parser, st->codec,
1009 &pkt->data, &pkt->size,
1011 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1017 /* no more packets: really terminate parsing */
1020 st = s->streams[cur_pkt.stream_index];
1021 st->cur_pkt= cur_pkt;
1023 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1024 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1025 st->cur_pkt.pts < st->cur_pkt.dts){
1026 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1027 st->cur_pkt.stream_index,
1031 // av_free_packet(&st->cur_pkt);
1035 if(s->debug & FF_FDEBUG_TS)
1036 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1037 st->cur_pkt.stream_index,
1041 st->cur_pkt.duration,
1045 st->cur_ptr = st->cur_pkt.data;
1046 st->cur_len = st->cur_pkt.size;
1047 if (st->need_parsing && !st->parser) {
1048 st->parser = av_parser_init(st->codec->codec_id);
1050 /* no parser available: just output the raw packets */
1051 st->need_parsing = AVSTREAM_PARSE_NONE;
1052 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1053 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1055 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
1056 st->parser->next_frame_offset=
1057 st->parser->cur_offset= st->cur_pkt.pos;
1062 if(s->debug & FF_FDEBUG_TS)
1063 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1074 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1078 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1081 pktl = s->packet_buffer;
1083 AVPacket *next_pkt= &pktl->pkt;
1085 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1086 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1087 if( pktl->pkt.stream_index == next_pkt->stream_index
1088 && next_pkt->dts < pktl->pkt.dts
1089 && pktl->pkt.pts != pktl->pkt.dts //not b frame
1090 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1091 next_pkt->pts= pktl->pkt.dts;
1095 pktl = s->packet_buffer;
1098 if( next_pkt->pts != AV_NOPTS_VALUE
1099 || next_pkt->dts == AV_NOPTS_VALUE
1101 /* read packet from packet buffer, if there is data */
1103 s->packet_buffer = pktl->next;
1109 int ret= av_read_frame_internal(s, pkt);
1111 if(pktl && ret != AVERROR(EAGAIN)){
1118 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1119 &s->packet_buffer_end)) < 0)
1120 return AVERROR(ENOMEM);
1122 assert(!s->packet_buffer);
1123 return av_read_frame_internal(s, pkt);
1128 /* XXX: suppress the packet queue */
1129 static void flush_packet_queue(AVFormatContext *s)
1134 pktl = s->packet_buffer;
1137 s->packet_buffer = pktl->next;
1138 av_free_packet(&pktl->pkt);
1141 while(s->raw_packet_buffer){
1142 pktl = s->raw_packet_buffer;
1143 s->raw_packet_buffer = pktl->next;
1144 av_free_packet(&pktl->pkt);
1147 s->packet_buffer_end=
1148 s->raw_packet_buffer_end= NULL;
1149 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1152 /*******************************************************/
1155 int av_find_default_stream_index(AVFormatContext *s)
1157 int first_audio_index = -1;
1161 if (s->nb_streams <= 0)
1163 for(i = 0; i < s->nb_streams; i++) {
1165 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1168 if (first_audio_index < 0 && st->codec->codec_type == CODEC_TYPE_AUDIO)
1169 first_audio_index = i;
1171 return first_audio_index >= 0 ? first_audio_index : 0;
1175 * Flush the frame reader.
1177 void av_read_frame_flush(AVFormatContext *s)
1182 flush_packet_queue(s);
1186 /* for each stream, reset read state */
1187 for(i = 0; i < s->nb_streams; i++) {
1191 av_parser_close(st->parser);
1193 av_free_packet(&st->cur_pkt);
1195 st->last_IP_pts = AV_NOPTS_VALUE;
1196 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1197 st->reference_dts = AV_NOPTS_VALUE;
1202 st->probe_packets = MAX_PROBE_PACKETS;
1204 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1205 st->pts_buffer[j]= AV_NOPTS_VALUE;
1209 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1212 for(i = 0; i < s->nb_streams; i++) {
1213 AVStream *st = s->streams[i];
1215 st->cur_dts = av_rescale(timestamp,
1216 st->time_base.den * (int64_t)ref_st->time_base.num,
1217 st->time_base.num * (int64_t)ref_st->time_base.den);
1221 void ff_reduce_index(AVFormatContext *s, int stream_index)
1223 AVStream *st= s->streams[stream_index];
1224 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1226 if((unsigned)st->nb_index_entries >= max_entries){
1228 for(i=0; 2*i<st->nb_index_entries; i++)
1229 st->index_entries[i]= st->index_entries[2*i];
1230 st->nb_index_entries= i;
1234 int av_add_index_entry(AVStream *st,
1235 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1237 AVIndexEntry *entries, *ie;
1240 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1243 entries = av_fast_realloc(st->index_entries,
1244 &st->index_entries_allocated_size,
1245 (st->nb_index_entries + 1) *
1246 sizeof(AVIndexEntry));
1250 st->index_entries= entries;
1252 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1255 index= st->nb_index_entries++;
1256 ie= &entries[index];
1257 assert(index==0 || ie[-1].timestamp < timestamp);
1259 ie= &entries[index];
1260 if(ie->timestamp != timestamp){
1261 if(ie->timestamp <= timestamp)
1263 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1264 st->nb_index_entries++;
1265 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1266 distance= ie->min_distance;
1270 ie->timestamp = timestamp;
1271 ie->min_distance= distance;
1278 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1281 AVIndexEntry *entries= st->index_entries;
1282 int nb_entries= st->nb_index_entries;
1291 timestamp = entries[m].timestamp;
1292 if(timestamp >= wanted_timestamp)
1294 if(timestamp <= wanted_timestamp)
1297 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1299 if(!(flags & AVSEEK_FLAG_ANY)){
1300 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1301 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1312 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1313 AVInputFormat *avif= s->iformat;
1314 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1315 int64_t ts_min, ts_max, ts;
1320 if (stream_index < 0)
1324 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1328 ts_min= AV_NOPTS_VALUE;
1329 pos_limit= -1; //gcc falsely says it may be uninitialized
1331 st= s->streams[stream_index];
1332 if(st->index_entries){
1335 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()
1336 index= FFMAX(index, 0);
1337 e= &st->index_entries[index];
1339 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1341 ts_min= e->timestamp;
1343 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1350 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1351 assert(index < st->nb_index_entries);
1353 e= &st->index_entries[index];
1354 assert(e->timestamp >= target_ts);
1356 ts_max= e->timestamp;
1357 pos_limit= pos_max - e->min_distance;
1359 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1360 pos_max,pos_limit, ts_max);
1365 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1370 if ((ret = url_fseek(s->pb, pos, SEEK_SET)) < 0)
1373 av_update_cur_dts(s, st, ts);
1378 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 )){
1380 int64_t start_pos, filesize;
1384 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1387 if(ts_min == AV_NOPTS_VALUE){
1388 pos_min = s->data_offset;
1389 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1390 if (ts_min == AV_NOPTS_VALUE)
1394 if(ts_max == AV_NOPTS_VALUE){
1396 filesize = url_fsize(s->pb);
1397 pos_max = filesize - 1;
1400 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1402 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1403 if (ts_max == AV_NOPTS_VALUE)
1407 int64_t tmp_pos= pos_max + 1;
1408 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1409 if(tmp_ts == AV_NOPTS_VALUE)
1413 if(tmp_pos >= filesize)
1419 if(ts_min > ts_max){
1421 }else if(ts_min == ts_max){
1426 while (pos_min < pos_limit) {
1428 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1432 assert(pos_limit <= pos_max);
1435 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1436 // interpolate position (better than dichotomy)
1437 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1438 + pos_min - approximate_keyframe_distance;
1439 }else if(no_change==1){
1440 // bisection, if interpolation failed to change min or max pos last time
1441 pos = (pos_min + pos_limit)>>1;
1443 /* linear search if bisection failed, can only happen if there
1444 are very few or no keyframes between min/max */
1449 else if(pos > pos_limit)
1453 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1459 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1460 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit,
1461 start_pos, no_change);
1463 if(ts == AV_NOPTS_VALUE){
1464 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1467 assert(ts != AV_NOPTS_VALUE);
1468 if (target_ts <= ts) {
1469 pos_limit = start_pos - 1;
1473 if (target_ts >= ts) {
1479 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1480 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1483 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1485 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1486 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1487 pos, ts_min, target_ts, ts_max);
1493 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1494 int64_t pos_min, pos_max;
1498 if (stream_index < 0)
1501 st= s->streams[stream_index];
1504 pos_min = s->data_offset;
1505 pos_max = url_fsize(s->pb) - 1;
1507 if (pos < pos_min) pos= pos_min;
1508 else if(pos > pos_max) pos= pos_max;
1510 url_fseek(s->pb, pos, SEEK_SET);
1513 av_update_cur_dts(s, st, ts);
1518 static int av_seek_frame_generic(AVFormatContext *s,
1519 int stream_index, int64_t timestamp, int flags)
1526 st = s->streams[stream_index];
1528 index = av_index_search_timestamp(st, timestamp, flags);
1530 if(index < 0 || index==st->nb_index_entries-1){
1534 if(st->nb_index_entries){
1535 assert(st->index_entries);
1536 ie= &st->index_entries[st->nb_index_entries-1];
1537 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1539 av_update_cur_dts(s, st, ie->timestamp);
1541 if ((ret = url_fseek(s->pb, s->data_offset, SEEK_SET)) < 0)
1547 ret = av_read_frame(s, &pkt);
1548 }while(ret == AVERROR(EAGAIN));
1551 av_free_packet(&pkt);
1552 if(stream_index == pkt.stream_index){
1553 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1557 index = av_index_search_timestamp(st, timestamp, flags);
1562 av_read_frame_flush(s);
1563 if (s->iformat->read_seek){
1564 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1567 ie = &st->index_entries[index];
1568 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1570 av_update_cur_dts(s, st, ie->timestamp);
1575 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1580 av_read_frame_flush(s);
1582 if(flags & AVSEEK_FLAG_BYTE)
1583 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1585 if(stream_index < 0){
1586 stream_index= av_find_default_stream_index(s);
1587 if(stream_index < 0)
1590 st= s->streams[stream_index];
1591 /* timestamp for default must be expressed in AV_TIME_BASE units */
1592 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1595 /* first, we try the format specific seek */
1596 if (s->iformat->read_seek)
1597 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1604 if(s->iformat->read_timestamp)
1605 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1607 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1610 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1612 if(min_ts > ts || max_ts < ts)
1615 av_read_frame_flush(s);
1617 if (s->iformat->read_seek2)
1618 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1620 if(s->iformat->read_timestamp){
1621 //try to seek via read_timestamp()
1624 //Fallback to old API if new is not implemented but old is
1625 //Note the old has somewat different sematics
1626 if(s->iformat->read_seek || 1)
1627 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1629 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1632 /*******************************************************/
1635 * Returns TRUE if the stream has accurate duration in any stream.
1637 * @return TRUE if the stream has accurate duration for at least one component.
1639 static int av_has_duration(AVFormatContext *ic)
1644 for(i = 0;i < ic->nb_streams; i++) {
1645 st = ic->streams[i];
1646 if (st->duration != AV_NOPTS_VALUE)
1653 * Estimate the stream timings from the one of each components.
1655 * Also computes the global bitrate if possible.
1657 static void av_update_stream_timings(AVFormatContext *ic)
1659 int64_t start_time, start_time1, end_time, end_time1;
1660 int64_t duration, duration1;
1664 start_time = INT64_MAX;
1665 end_time = INT64_MIN;
1666 duration = INT64_MIN;
1667 for(i = 0;i < ic->nb_streams; i++) {
1668 st = ic->streams[i];
1669 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1670 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1671 if (start_time1 < start_time)
1672 start_time = start_time1;
1673 if (st->duration != AV_NOPTS_VALUE) {
1674 end_time1 = start_time1
1675 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1676 if (end_time1 > end_time)
1677 end_time = end_time1;
1680 if (st->duration != AV_NOPTS_VALUE) {
1681 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1682 if (duration1 > duration)
1683 duration = duration1;
1686 if (start_time != INT64_MAX) {
1687 ic->start_time = start_time;
1688 if (end_time != INT64_MIN) {
1689 if (end_time - start_time > duration)
1690 duration = end_time - start_time;
1693 if (duration != INT64_MIN) {
1694 ic->duration = duration;
1695 if (ic->file_size > 0) {
1696 /* compute the bitrate */
1697 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1698 (double)ic->duration;
1703 static void fill_all_stream_timings(AVFormatContext *ic)
1708 av_update_stream_timings(ic);
1709 for(i = 0;i < ic->nb_streams; i++) {
1710 st = ic->streams[i];
1711 if (st->start_time == AV_NOPTS_VALUE) {
1712 if(ic->start_time != AV_NOPTS_VALUE)
1713 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1714 if(ic->duration != AV_NOPTS_VALUE)
1715 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1720 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1722 int64_t filesize, duration;
1726 /* if bit_rate is already set, we believe it */
1727 if (ic->bit_rate == 0) {
1729 for(i=0;i<ic->nb_streams;i++) {
1730 st = ic->streams[i];
1731 bit_rate += st->codec->bit_rate;
1733 ic->bit_rate = bit_rate;
1736 /* if duration is already set, we believe it */
1737 if (ic->duration == AV_NOPTS_VALUE &&
1738 ic->bit_rate != 0 &&
1739 ic->file_size != 0) {
1740 filesize = ic->file_size;
1742 for(i = 0; i < ic->nb_streams; i++) {
1743 st = ic->streams[i];
1744 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1745 if (st->duration == AV_NOPTS_VALUE)
1746 st->duration = duration;
1752 #define DURATION_MAX_READ_SIZE 250000
1754 /* only usable for MPEG-PS streams */
1755 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1757 AVPacket pkt1, *pkt = &pkt1;
1759 int read_size, i, ret;
1761 int64_t filesize, offset, duration;
1765 /* flush packet queue */
1766 flush_packet_queue(ic);
1768 for(i=0;i<ic->nb_streams;i++) {
1769 st = ic->streams[i];
1771 av_parser_close(st->parser);
1773 av_free_packet(&st->cur_pkt);
1777 /* we read the first packets to get the first PTS (not fully
1778 accurate, but it is enough now) */
1779 url_fseek(ic->pb, 0, SEEK_SET);
1782 if (read_size >= DURATION_MAX_READ_SIZE)
1784 /* if all info is available, we can stop */
1785 for(i = 0;i < ic->nb_streams; i++) {
1786 st = ic->streams[i];
1787 if (st->start_time == AV_NOPTS_VALUE)
1790 if (i == ic->nb_streams)
1794 ret = av_read_packet(ic, pkt);
1795 }while(ret == AVERROR(EAGAIN));
1798 read_size += pkt->size;
1799 st = ic->streams[pkt->stream_index];
1800 if (pkt->pts != AV_NOPTS_VALUE) {
1801 if (st->start_time == AV_NOPTS_VALUE)
1802 st->start_time = pkt->pts;
1804 av_free_packet(pkt);
1807 /* estimate the end time (duration) */
1808 /* XXX: may need to support wrapping */
1809 filesize = ic->file_size;
1810 offset = filesize - DURATION_MAX_READ_SIZE;
1814 url_fseek(ic->pb, offset, SEEK_SET);
1817 if (read_size >= DURATION_MAX_READ_SIZE)
1821 ret = av_read_packet(ic, pkt);
1822 }while(ret == AVERROR(EAGAIN));
1825 read_size += pkt->size;
1826 st = ic->streams[pkt->stream_index];
1827 if (pkt->pts != AV_NOPTS_VALUE &&
1828 st->start_time != AV_NOPTS_VALUE) {
1829 end_time = pkt->pts;
1830 duration = end_time - st->start_time;
1832 if (st->duration == AV_NOPTS_VALUE ||
1833 st->duration < duration)
1834 st->duration = duration;
1837 av_free_packet(pkt);
1840 fill_all_stream_timings(ic);
1842 url_fseek(ic->pb, old_offset, SEEK_SET);
1843 for(i=0; i<ic->nb_streams; i++){
1845 st->cur_dts= st->first_dts;
1846 st->last_IP_pts = AV_NOPTS_VALUE;
1850 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
1854 /* get the file size, if possible */
1855 if (ic->iformat->flags & AVFMT_NOFILE) {
1858 file_size = url_fsize(ic->pb);
1862 ic->file_size = file_size;
1864 if ((!strcmp(ic->iformat->name, "mpeg") ||
1865 !strcmp(ic->iformat->name, "mpegts")) &&
1866 file_size && !url_is_streamed(ic->pb)) {
1867 /* get accurate estimate from the PTSes */
1868 av_estimate_timings_from_pts(ic, old_offset);
1869 } else if (av_has_duration(ic)) {
1870 /* at least one component has timings - we use them for all
1872 fill_all_stream_timings(ic);
1874 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
1875 /* less precise: use bitrate info */
1876 av_estimate_timings_from_bit_rate(ic);
1878 av_update_stream_timings(ic);
1884 for(i = 0;i < ic->nb_streams; i++) {
1885 st = ic->streams[i];
1886 printf("%d: start_time: %0.3f duration: %0.3f\n",
1887 i, (double)st->start_time / AV_TIME_BASE,
1888 (double)st->duration / AV_TIME_BASE);
1890 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1891 (double)ic->start_time / AV_TIME_BASE,
1892 (double)ic->duration / AV_TIME_BASE,
1893 ic->bit_rate / 1000);
1898 static int has_codec_parameters(AVCodecContext *enc)
1901 switch(enc->codec_type) {
1902 case CODEC_TYPE_AUDIO:
1903 val = enc->sample_rate && enc->channels && enc->sample_fmt != SAMPLE_FMT_NONE;
1904 if(!enc->frame_size &&
1905 (enc->codec_id == CODEC_ID_VORBIS ||
1906 enc->codec_id == CODEC_ID_AAC ||
1907 enc->codec_id == CODEC_ID_MP3 ||
1908 enc->codec_id == CODEC_ID_SPEEX))
1911 case CODEC_TYPE_VIDEO:
1912 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1918 return enc->codec_id != CODEC_ID_NONE && val != 0;
1921 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
1925 int got_picture, data_size, ret=0;
1928 if(!st->codec->codec){
1929 codec = avcodec_find_decoder(st->codec->codec_id);
1932 ret = avcodec_open(st->codec, codec);
1937 if(!has_codec_parameters(st->codec)){
1938 switch(st->codec->codec_type) {
1939 case CODEC_TYPE_VIDEO:
1940 avcodec_get_frame_defaults(&picture);
1941 ret = avcodec_decode_video2(st->codec, &picture,
1942 &got_picture, avpkt);
1944 case CODEC_TYPE_AUDIO:
1945 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1946 samples = av_malloc(data_size);
1949 ret = avcodec_decode_audio3(st->codec, samples,
1961 unsigned int ff_codec_get_tag(const AVCodecTag *tags, int id)
1963 while (tags->id != CODEC_ID_NONE) {
1971 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
1974 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1975 if(tag == tags[i].tag)
1978 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1979 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1980 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1981 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1982 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1985 return CODEC_ID_NONE;
1988 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
1991 for(i=0; tags && tags[i]; i++){
1992 int tag= ff_codec_get_tag(tags[i], id);
1998 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2001 for(i=0; tags && tags[i]; i++){
2002 enum CodecID id= ff_codec_get_id(tags[i], tag);
2003 if(id!=CODEC_ID_NONE) return id;
2005 return CODEC_ID_NONE;
2008 static void compute_chapters_end(AVFormatContext *s)
2012 for (i=0; i+1<s->nb_chapters; i++)
2013 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2014 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
2015 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
2016 s->chapters[i]->end = s->chapters[i+1]->start;
2019 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
2020 assert(s->start_time != AV_NOPTS_VALUE);
2021 assert(s->duration > 0);
2022 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
2024 s->chapters[i]->time_base);
2028 #define MAX_STD_TIMEBASES (60*12+5)
2029 static int get_std_framerate(int i){
2030 if(i<60*12) return i*1001;
2031 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2035 * Is the time base unreliable.
2036 * This is a heuristic to balance between quick acceptance of the values in
2037 * the headers vs. some extra checks.
2038 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2039 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2040 * And there are "variable" fps files this needs to detect as well.
2042 static int tb_unreliable(AVCodecContext *c){
2043 if( c->time_base.den >= 101L*c->time_base.num
2044 || c->time_base.den < 5L*c->time_base.num
2045 /* || c->codec_tag == AV_RL32("DIVX")
2046 || c->codec_tag == AV_RL32("XVID")*/
2047 || c->codec_id == CODEC_ID_MPEG2VIDEO
2048 || c->codec_id == CODEC_ID_H264
2054 int av_find_stream_info(AVFormatContext *ic)
2056 int i, count, ret, read_size, j;
2058 AVPacket pkt1, *pkt;
2059 int64_t last_dts[MAX_STREAMS];
2060 int64_t duration_gcd[MAX_STREAMS]={0};
2061 int duration_count[MAX_STREAMS]={0};
2062 double (*duration_error)[MAX_STD_TIMEBASES];
2063 int64_t old_offset = url_ftell(ic->pb);
2064 int64_t codec_info_duration[MAX_STREAMS]={0};
2065 int codec_info_nb_frames[MAX_STREAMS]={0};
2067 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
2068 if (!duration_error) return AVERROR(ENOMEM);
2070 for(i=0;i<ic->nb_streams;i++) {
2071 st = ic->streams[i];
2072 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2073 /* if(!st->time_base.num)
2075 if(!st->codec->time_base.num)
2076 st->codec->time_base= st->time_base;
2078 //only for the split stuff
2080 st->parser = av_parser_init(st->codec->codec_id);
2081 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2082 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2087 for(i=0;i<MAX_STREAMS;i++){
2088 last_dts[i]= AV_NOPTS_VALUE;
2094 if(url_interrupt_cb()){
2095 ret= AVERROR(EINTR);
2096 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2100 /* check if one codec still needs to be handled */
2101 for(i=0;i<ic->nb_streams;i++) {
2102 st = ic->streams[i];
2103 if (!has_codec_parameters(st->codec))
2105 /* variable fps and no guess at the real fps */
2106 if( tb_unreliable(st->codec)
2107 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
2109 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2111 if(st->first_dts == AV_NOPTS_VALUE)
2114 if (i == ic->nb_streams) {
2115 /* NOTE: if the format has no header, then we need to read
2116 some packets to get most of the streams, so we cannot
2118 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2119 /* if we found the info for all the codecs, we can stop */
2121 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2125 /* we did not get all the codec info, but we read too much data */
2126 if (read_size >= ic->probesize) {
2128 av_log(ic, AV_LOG_WARNING, "MAX_READ_SIZE:%d reached\n", ic->probesize);
2132 /* NOTE: a new stream can be added there if no header in file
2133 (AVFMTCTX_NOHEADER) */
2134 ret = av_read_frame_internal(ic, &pkt1);
2135 if(ret == AVERROR(EAGAIN))
2139 ret = -1; /* we could not have all the codec parameters before EOF */
2140 for(i=0;i<ic->nb_streams;i++) {
2141 st = ic->streams[i];
2142 if (!has_codec_parameters(st->codec)){
2144 avcodec_string(buf, sizeof(buf), st->codec, 0);
2145 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2153 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2154 if(av_dup_packet(pkt) < 0) {
2155 av_free(duration_error);
2156 return AVERROR(ENOMEM);
2159 read_size += pkt->size;
2161 st = ic->streams[pkt->stream_index];
2162 if(codec_info_nb_frames[st->index]>1) {
2163 if (st->time_base.den > 0 && av_rescale_q(codec_info_duration[st->index], st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration){
2164 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2167 codec_info_duration[st->index] += pkt->duration;
2169 if (pkt->duration != 0)
2170 codec_info_nb_frames[st->index]++;
2173 int index= pkt->stream_index;
2174 int64_t last= last_dts[index];
2175 int64_t duration= pkt->dts - last;
2177 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2178 double dur= duration * av_q2d(st->time_base);
2180 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2181 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2182 if(duration_count[index] < 2)
2183 memset(duration_error[index], 0, sizeof(*duration_error));
2184 for(i=1; i<MAX_STD_TIMEBASES; i++){
2185 int framerate= get_std_framerate(i);
2186 int ticks= lrintf(dur*framerate/(1001*12));
2187 double error= dur - ticks*1001*12/(double)framerate;
2188 duration_error[index][i] += error*error;
2190 duration_count[index]++;
2191 // ignore the first 4 values, they might have some random jitter
2192 if (duration_count[index] > 3)
2193 duration_gcd[index] = av_gcd(duration_gcd[index], duration);
2195 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
2196 last_dts[pkt->stream_index]= pkt->dts;
2198 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2199 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2201 st->codec->extradata_size= i;
2202 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2203 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2204 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2208 /* if still no information, we try to open the codec and to
2209 decompress the frame. We try to avoid that in most cases as
2210 it takes longer and uses more memory. For MPEG-4, we need to
2211 decompress for QuickTime. */
2212 if (!has_codec_parameters(st->codec))
2213 try_decode_frame(st, pkt);
2218 // close codecs which were opened in try_decode_frame()
2219 for(i=0;i<ic->nb_streams;i++) {
2220 st = ic->streams[i];
2221 if(st->codec->codec)
2222 avcodec_close(st->codec);
2224 for(i=0;i<ic->nb_streams;i++) {
2225 st = ic->streams[i];
2226 if(codec_info_nb_frames[i]>2)
2227 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2228 (codec_info_nb_frames[i]-2)*(int64_t)st->time_base.den,
2229 codec_info_duration[i] *(int64_t)st->time_base.num, 60000);
2230 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2231 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
2232 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2234 // the check for tb_unreliable() is not completely correct, since this is not about handling
2235 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2236 // ipmovie.c produces.
2237 if (tb_unreliable(st->codec) && duration_count[i] > 15 && duration_gcd[i] > 1)
2238 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * duration_gcd[i], INT_MAX);
2239 if(duration_count[i]
2240 && tb_unreliable(st->codec) /*&&
2241 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2242 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2244 double best_error= 2*av_q2d(st->time_base);
2245 best_error= best_error*best_error*duration_count[i]*1000*12*30;
2247 for(j=1; j<MAX_STD_TIMEBASES; j++){
2248 double error= duration_error[i][j] * get_std_framerate(j);
2249 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2250 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2251 if(error < best_error){
2253 num = get_std_framerate(j);
2256 // do not increase frame rate by more than 1 % in order to match a standard rate.
2257 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2258 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2261 if (!st->r_frame_rate.num){
2262 if( st->codec->time_base.den * (int64_t)st->time_base.num
2263 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2264 st->r_frame_rate.num = st->codec->time_base.den;
2265 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2267 st->r_frame_rate.num = st->time_base.den;
2268 st->r_frame_rate.den = st->time_base.num;
2271 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
2272 if(!st->codec->bits_per_coded_sample)
2273 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2277 av_estimate_timings(ic, old_offset);
2279 compute_chapters_end(ic);
2282 /* correct DTS for B-frame streams with no timestamps */
2283 for(i=0;i<ic->nb_streams;i++) {
2284 st = ic->streams[i];
2285 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2287 ppktl = &ic->packet_buffer;
2289 if(ppkt1->stream_index != i)
2291 if(ppkt1->pkt->dts < 0)
2293 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2295 ppkt1->pkt->dts -= delta;
2300 st->cur_dts -= delta;
2306 av_free(duration_error);
2311 /*******************************************************/
2313 int av_read_play(AVFormatContext *s)
2315 if (s->iformat->read_play)
2316 return s->iformat->read_play(s);
2318 return av_url_read_fpause(s->pb, 0);
2319 return AVERROR(ENOSYS);
2322 int av_read_pause(AVFormatContext *s)
2324 if (s->iformat->read_pause)
2325 return s->iformat->read_pause(s);
2327 return av_url_read_fpause(s->pb, 1);
2328 return AVERROR(ENOSYS);
2331 void av_close_input_stream(AVFormatContext *s)
2336 if (s->iformat->read_close)
2337 s->iformat->read_close(s);
2338 for(i=0;i<s->nb_streams;i++) {
2339 /* free all data in a stream component */
2342 av_parser_close(st->parser);
2343 av_free_packet(&st->cur_pkt);
2345 av_metadata_free(&st->metadata);
2346 av_free(st->index_entries);
2347 av_free(st->codec->extradata);
2349 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2350 av_free(st->filename);
2352 av_free(st->priv_data);
2355 for(i=s->nb_programs-1; i>=0; i--) {
2356 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2357 av_freep(&s->programs[i]->provider_name);
2358 av_freep(&s->programs[i]->name);
2360 av_metadata_free(&s->programs[i]->metadata);
2361 av_freep(&s->programs[i]->stream_index);
2362 av_freep(&s->programs[i]);
2364 av_freep(&s->programs);
2365 flush_packet_queue(s);
2366 av_freep(&s->priv_data);
2367 while(s->nb_chapters--) {
2368 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2369 av_free(s->chapters[s->nb_chapters]->title);
2371 av_metadata_free(&s->chapters[s->nb_chapters]->metadata);
2372 av_free(s->chapters[s->nb_chapters]);
2374 av_freep(&s->chapters);
2375 av_metadata_free(&s->metadata);
2379 void av_close_input_file(AVFormatContext *s)
2381 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2382 av_close_input_stream(s);
2387 AVStream *av_new_stream(AVFormatContext *s, int id)
2392 if (s->nb_streams >= MAX_STREAMS)
2395 st = av_mallocz(sizeof(AVStream));
2399 st->codec= avcodec_alloc_context();
2401 /* no default bitrate if decoding */
2402 st->codec->bit_rate = 0;
2404 st->index = s->nb_streams;
2406 st->start_time = AV_NOPTS_VALUE;
2407 st->duration = AV_NOPTS_VALUE;
2408 /* we set the current DTS to 0 so that formats without any timestamps
2409 but durations get some timestamps, formats with some unknown
2410 timestamps have their first few packets buffered and the
2411 timestamps corrected before they are returned to the user */
2413 st->first_dts = AV_NOPTS_VALUE;
2414 st->probe_packets = MAX_PROBE_PACKETS;
2416 /* default pts setting is MPEG-like */
2417 av_set_pts_info(st, 33, 1, 90000);
2418 st->last_IP_pts = AV_NOPTS_VALUE;
2419 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2420 st->pts_buffer[i]= AV_NOPTS_VALUE;
2421 st->reference_dts = AV_NOPTS_VALUE;
2423 st->sample_aspect_ratio = (AVRational){0,1};
2425 s->streams[s->nb_streams++] = st;
2429 AVProgram *av_new_program(AVFormatContext *ac, int id)
2431 AVProgram *program=NULL;
2435 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2438 for(i=0; i<ac->nb_programs; i++)
2439 if(ac->programs[i]->id == id)
2440 program = ac->programs[i];
2443 program = av_mallocz(sizeof(AVProgram));
2446 dynarray_add(&ac->programs, &ac->nb_programs, program);
2447 program->discard = AVDISCARD_NONE;
2454 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2456 AVChapter *chapter = NULL;
2459 for(i=0; i<s->nb_chapters; i++)
2460 if(s->chapters[i]->id == id)
2461 chapter = s->chapters[i];
2464 chapter= av_mallocz(sizeof(AVChapter));
2467 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2469 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2470 av_free(chapter->title);
2472 av_metadata_set(&chapter->metadata, "title", title);
2474 chapter->time_base= time_base;
2475 chapter->start = start;
2481 /************************************************************/
2482 /* output media file */
2484 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2488 if (s->oformat->priv_data_size > 0) {
2489 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2491 return AVERROR(ENOMEM);
2493 s->priv_data = NULL;
2495 if (s->oformat->set_parameters) {
2496 ret = s->oformat->set_parameters(s, ap);
2503 int av_write_header(AVFormatContext *s)
2508 // some sanity checks
2509 for(i=0;i<s->nb_streams;i++) {
2512 switch (st->codec->codec_type) {
2513 case CODEC_TYPE_AUDIO:
2514 if(st->codec->sample_rate<=0){
2515 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2518 if(!st->codec->block_align)
2519 st->codec->block_align = st->codec->channels *
2520 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2522 case CODEC_TYPE_VIDEO:
2523 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2524 av_log(s, AV_LOG_ERROR, "time base not set\n");
2527 if(st->codec->width<=0 || st->codec->height<=0){
2528 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2531 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2532 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2538 if(s->oformat->codec_tag){
2539 if(st->codec->codec_tag){
2541 //check that tag + id is in the table
2542 //if neither is in the table -> OK
2543 //if tag is in the table with another id -> FAIL
2544 //if id is in the table with another tag -> FAIL unless strict < ?
2546 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2549 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2550 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2551 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2554 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2555 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2557 return AVERROR(ENOMEM);
2560 #if LIBAVFORMAT_VERSION_MAJOR < 53
2561 ff_metadata_mux_compat(s);
2564 if(s->oformat->write_header){
2565 ret = s->oformat->write_header(s);
2570 /* init PTS generation */
2571 for(i=0;i<s->nb_streams;i++) {
2572 int64_t den = AV_NOPTS_VALUE;
2575 switch (st->codec->codec_type) {
2576 case CODEC_TYPE_AUDIO:
2577 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2579 case CODEC_TYPE_VIDEO:
2580 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2585 if (den != AV_NOPTS_VALUE) {
2587 return AVERROR_INVALIDDATA;
2588 av_frac_init(&st->pts, 0, 0, den);
2594 //FIXME merge with compute_pkt_fields
2595 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
2596 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2597 int num, den, frame_size, i;
2599 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n", pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
2601 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2604 /* duration field */
2605 if (pkt->duration == 0) {
2606 compute_frame_duration(&num, &den, st, NULL, pkt);
2608 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2612 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2615 //XXX/FIXME this is a temporary hack until all encoders output pts
2616 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2618 // pkt->pts= st->cur_dts;
2619 pkt->pts= st->pts.val;
2622 //calculate dts from pts
2623 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2624 st->pts_buffer[0]= pkt->pts;
2625 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2626 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2627 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2628 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2630 pkt->dts= st->pts_buffer[0];
2633 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2634 av_log(s, AV_LOG_ERROR,
2635 "st:%d error, non monotone timestamps %"PRId64" >= %"PRId64"\n",
2636 st->index, st->cur_dts, pkt->dts);
2639 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2640 av_log(s, AV_LOG_ERROR, "st:%d error, pts < dts\n", st->index);
2644 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2645 st->cur_dts= pkt->dts;
2646 st->pts.val= pkt->dts;
2649 switch (st->codec->codec_type) {
2650 case CODEC_TYPE_AUDIO:
2651 frame_size = get_audio_frame_size(st->codec, pkt->size);
2653 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2654 likely equal to the encoder delay, but it would be better if we
2655 had the real timestamps from the encoder */
2656 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2657 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2660 case CODEC_TYPE_VIDEO:
2661 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2669 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2671 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
2673 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2676 ret= s->oformat->write_packet(s, pkt);
2678 ret= url_ferror(s->pb);
2682 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
2683 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
2685 AVPacketList **next_point, *this_pktl;
2687 this_pktl = av_mallocz(sizeof(AVPacketList));
2688 this_pktl->pkt= *pkt;
2689 pkt->destruct= NULL; // do not free original but only the copy
2690 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
2692 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
2693 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
2695 next_point = &s->packet_buffer;
2698 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
2699 while(!compare(s, &(*next_point)->pkt, pkt)){
2700 next_point= &(*next_point)->next;
2704 next_point = &(s->packet_buffer_end->next);
2707 assert(!*next_point);
2709 s->packet_buffer_end= this_pktl;
2712 this_pktl->next= *next_point;
2714 s->streams[pkt->stream_index]->last_in_packet_buffer=
2715 *next_point= this_pktl;
2718 int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
2720 AVStream *st = s->streams[ pkt ->stream_index];
2721 AVStream *st2= s->streams[ next->stream_index];
2722 int64_t left = st2->time_base.num * (int64_t)st ->time_base.den;
2723 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2725 if (pkt->dts == AV_NOPTS_VALUE)
2728 return next->dts * left > pkt->dts * right; //FIXME this can overflow
2731 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2737 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
2740 for(i=0; i < s->nb_streams; i++)
2741 stream_count+= !!s->streams[i]->last_in_packet_buffer;
2743 if(stream_count && (s->nb_streams == stream_count || flush)){
2744 pktl= s->packet_buffer;
2747 s->packet_buffer= pktl->next;
2748 if(!s->packet_buffer)
2749 s->packet_buffer_end= NULL;
2751 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
2752 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
2756 av_init_packet(out);
2762 * Interleaves an AVPacket correctly so it can be muxed.
2763 * @param out the interleaved packet will be output here
2764 * @param in the input packet
2765 * @param flush 1 if no further packets are available as input and all
2766 * remaining packets should be output
2767 * @return 1 if a packet was output, 0 if no packet could be output,
2768 * < 0 if an error occurred
2770 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2771 if(s->oformat->interleave_packet)
2772 return s->oformat->interleave_packet(s, out, in, flush);
2774 return av_interleave_packet_per_dts(s, out, in, flush);
2777 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2778 AVStream *st= s->streams[ pkt->stream_index];
2780 //FIXME/XXX/HACK drop zero sized packets
2781 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2784 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2785 if(compute_pkt_fields2(s, st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2788 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2793 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2794 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2797 ret= s->oformat->write_packet(s, &opkt);
2799 av_free_packet(&opkt);
2804 if(url_ferror(s->pb))
2805 return url_ferror(s->pb);
2809 int av_write_trailer(AVFormatContext *s)
2815 ret= av_interleave_packet(s, &pkt, NULL, 1);
2816 if(ret<0) //FIXME cleanup needed for ret<0 ?
2821 ret= s->oformat->write_packet(s, &pkt);
2823 av_free_packet(&pkt);
2827 if(url_ferror(s->pb))
2831 if(s->oformat->write_trailer)
2832 ret = s->oformat->write_trailer(s);
2835 ret=url_ferror(s->pb);
2836 for(i=0;i<s->nb_streams;i++)
2837 av_freep(&s->streams[i]->priv_data);
2838 av_freep(&s->priv_data);
2842 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2845 AVProgram *program=NULL;
2848 if (idx >= ac->nb_streams) {
2849 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
2853 for(i=0; i<ac->nb_programs; i++){
2854 if(ac->programs[i]->id != progid)
2856 program = ac->programs[i];
2857 for(j=0; j<program->nb_stream_indexes; j++)
2858 if(program->stream_index[j] == idx)
2861 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2864 program->stream_index = tmp;
2865 program->stream_index[program->nb_stream_indexes++] = idx;
2870 static void print_fps(double d, const char *postfix){
2871 uint64_t v= lrintf(d*100);
2872 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
2873 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
2874 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
2877 /* "user interface" functions */
2878 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2881 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2882 AVStream *st = ic->streams[i];
2883 int g = av_gcd(st->time_base.num, st->time_base.den);
2884 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0);
2885 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2886 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2887 /* the pid is an important information, so we display it */
2888 /* XXX: add a generic system */
2889 if (flags & AVFMT_SHOW_IDS)
2890 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2892 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
2893 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2894 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2895 if (st->sample_aspect_ratio.num && // default
2896 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
2897 AVRational display_aspect_ratio;
2898 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
2899 st->codec->width*st->sample_aspect_ratio.num,
2900 st->codec->height*st->sample_aspect_ratio.den,
2902 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
2903 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
2904 display_aspect_ratio.num, display_aspect_ratio.den);
2906 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2907 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
2908 print_fps(av_q2d(st->avg_frame_rate), "fps");
2909 if(st->r_frame_rate.den && st->r_frame_rate.num)
2910 print_fps(av_q2d(st->r_frame_rate), "tbr");
2911 if(st->time_base.den && st->time_base.num)
2912 print_fps(1/av_q2d(st->time_base), "tbn");
2913 if(st->codec->time_base.den && st->codec->time_base.num)
2914 print_fps(1/av_q2d(st->codec->time_base), "tbc");
2916 av_log(NULL, AV_LOG_INFO, "\n");
2919 void dump_format(AVFormatContext *ic,
2925 uint8_t *printed = av_mallocz(ic->nb_streams);
2926 if (ic->nb_streams && !printed)
2929 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2930 is_output ? "Output" : "Input",
2932 is_output ? ic->oformat->name : ic->iformat->name,
2933 is_output ? "to" : "from", url);
2935 av_log(NULL, AV_LOG_INFO, " Duration: ");
2936 if (ic->duration != AV_NOPTS_VALUE) {
2937 int hours, mins, secs, us;
2938 secs = ic->duration / AV_TIME_BASE;
2939 us = ic->duration % AV_TIME_BASE;
2944 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
2945 (100 * us) / AV_TIME_BASE);
2947 av_log(NULL, AV_LOG_INFO, "N/A");
2949 if (ic->start_time != AV_NOPTS_VALUE) {
2951 av_log(NULL, AV_LOG_INFO, ", start: ");
2952 secs = ic->start_time / AV_TIME_BASE;
2953 us = ic->start_time % AV_TIME_BASE;
2954 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2955 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2957 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2959 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2961 av_log(NULL, AV_LOG_INFO, "N/A");
2963 av_log(NULL, AV_LOG_INFO, "\n");
2965 if(ic->nb_programs) {
2966 int j, k, total = 0;
2967 for(j=0; j<ic->nb_programs; j++) {
2968 AVMetadataTag *name = av_metadata_get(ic->programs[j]->metadata,
2970 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2971 name ? name->value : "");
2972 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
2973 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2974 printed[ic->programs[j]->stream_index[k]] = 1;
2976 total += ic->programs[j]->nb_stream_indexes;
2978 if (total < ic->nb_streams)
2979 av_log(NULL, AV_LOG_INFO, " No Program\n");
2981 for(i=0;i<ic->nb_streams;i++)
2983 dump_stream_format(ic, i, index, is_output);
2986 AVMetadataTag *tag=NULL;
2987 av_log(NULL, AV_LOG_INFO, " Metadata\n");
2988 while((tag=av_metadata_get(ic->metadata, "", tag, AV_METADATA_IGNORE_SUFFIX))) {
2989 av_log(NULL, AV_LOG_INFO, " %-16s: %s\n", tag->key, tag->value);
2995 #if LIBAVFORMAT_VERSION_MAJOR < 53
2996 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2998 return av_parse_video_frame_size(width_ptr, height_ptr, str);
3001 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
3003 AVRational frame_rate;
3004 int ret = av_parse_video_frame_rate(&frame_rate, arg);
3005 *frame_rate_num= frame_rate.num;
3006 *frame_rate_den= frame_rate.den;
3011 int64_t av_gettime(void)
3014 gettimeofday(&tv,NULL);
3015 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3018 int64_t parse_date(const char *datestr, int duration)
3024 static const char * const date_fmt[] = {
3028 static const char * const time_fmt[] = {
3038 time_t now = time(0);
3040 len = strlen(datestr);
3042 lastch = datestr[len - 1];
3045 is_utc = (lastch == 'z' || lastch == 'Z');
3047 memset(&dt, 0, sizeof(dt));
3052 if (!strncasecmp(datestr, "now", len))
3053 return (int64_t) now * 1000000;
3055 /* parse the year-month-day part */
3056 for (i = 0; i < FF_ARRAY_ELEMS(date_fmt); i++) {
3057 q = small_strptime(p, date_fmt[i], &dt);
3063 /* if the year-month-day part is missing, then take the
3064 * current year-month-day time */
3069 dt = *localtime(&now);
3071 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
3076 if (*p == 'T' || *p == 't' || *p == ' ')
3079 /* parse the hour-minute-second part */
3080 for (i = 0; i < FF_ARRAY_ELEMS(time_fmt); i++) {
3081 q = small_strptime(p, time_fmt[i], &dt);
3087 /* parse datestr as a duration */
3092 /* parse datestr as HH:MM:SS */
3093 q = small_strptime(p, time_fmt[0], &dt);
3095 /* parse datestr as S+ */
3096 dt.tm_sec = strtol(p, (char **)&q, 10);
3098 /* the parsing didn't succeed */
3105 /* Now we have all the fields that we can get */
3111 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
3113 dt.tm_isdst = -1; /* unknown */
3123 /* parse the .m... part */
3127 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
3130 val += n * (*q - '0');
3134 return negative ? -t : t;
3137 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3147 while (*p != '\0' && *p != '=' && *p != '&') {
3148 if ((q - tag) < sizeof(tag) - 1)
3156 while (*p != '&' && *p != '\0') {
3157 if ((q - arg) < arg_size - 1) {
3167 if (!strcmp(tag, tag1))
3176 int av_get_frame_filename(char *buf, int buf_size,
3177 const char *path, int number)
3180 char *q, buf1[20], c;
3181 int nd, len, percentd_found;
3193 while (isdigit(*p)) {
3194 nd = nd * 10 + *p++ - '0';
3197 } while (isdigit(c));
3206 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3208 if ((q - buf + len) > buf_size - 1)
3210 memcpy(q, buf1, len);
3218 if ((q - buf) < buf_size - 1)
3222 if (!percentd_found)
3231 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3235 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3237 for(i=0;i<size;i+=16) {
3244 PRINT(" %02x", buf[i+j]);
3249 for(j=0;j<len;j++) {
3251 if (c < ' ' || c > '~')
3260 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3262 hex_dump_internal(NULL, f, 0, buf, size);
3265 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3267 hex_dump_internal(avcl, NULL, level, buf, size);
3270 //FIXME needs to know the time_base
3271 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
3274 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3275 PRINT("stream #%d:\n", pkt->stream_index);
3276 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3277 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3278 /* DTS is _always_ valid after av_read_frame() */
3280 if (pkt->dts == AV_NOPTS_VALUE)
3283 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
3284 /* PTS may not be known if B-frames are present. */
3286 if (pkt->pts == AV_NOPTS_VALUE)
3289 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
3291 PRINT(" size=%d\n", pkt->size);
3294 av_hex_dump(f, pkt->data, pkt->size);
3297 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3299 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
3302 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3304 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
3307 void url_split(char *proto, int proto_size,
3308 char *authorization, int authorization_size,
3309 char *hostname, int hostname_size,
3311 char *path, int path_size,
3314 const char *p, *ls, *at, *col, *brk;
3316 if (port_ptr) *port_ptr = -1;
3317 if (proto_size > 0) proto[0] = 0;
3318 if (authorization_size > 0) authorization[0] = 0;
3319 if (hostname_size > 0) hostname[0] = 0;
3320 if (path_size > 0) path[0] = 0;
3322 /* parse protocol */
3323 if ((p = strchr(url, ':'))) {
3324 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3329 /* no protocol means plain filename */
3330 av_strlcpy(path, url, path_size);
3334 /* separate path from hostname */
3335 ls = strchr(p, '/');
3337 ls = strchr(p, '?');
3339 av_strlcpy(path, ls, path_size);
3341 ls = &p[strlen(p)]; // XXX
3343 /* the rest is hostname, use that to parse auth/port */
3345 /* authorization (user[:pass]@hostname) */
3346 if ((at = strchr(p, '@')) && at < ls) {
3347 av_strlcpy(authorization, p,
3348 FFMIN(authorization_size, at + 1 - p));
3349 p = at + 1; /* skip '@' */
3352 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3354 av_strlcpy(hostname, p + 1,
3355 FFMIN(hostname_size, brk - p));
3356 if (brk[1] == ':' && port_ptr)
3357 *port_ptr = atoi(brk + 2);
3358 } else if ((col = strchr(p, ':')) && col < ls) {
3359 av_strlcpy(hostname, p,
3360 FFMIN(col + 1 - p, hostname_size));
3361 if (port_ptr) *port_ptr = atoi(col + 1);
3363 av_strlcpy(hostname, p,
3364 FFMIN(ls + 1 - p, hostname_size));
3368 char *ff_data_to_hex(char *buff, const uint8_t *src, int s)
3371 static const char hex_table[16] = { '0', '1', '2', '3',
3374 'C', 'D', 'E', 'F' };
3376 for(i = 0; i < s; i++) {
3377 buff[i * 2] = hex_table[src[i] >> 4];
3378 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3384 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3385 unsigned int pts_num, unsigned int pts_den)
3387 s->pts_wrap_bits = pts_wrap_bits;
3389 if(av_reduce(&s->time_base.num, &s->time_base.den, pts_num, pts_den, INT_MAX)){
3390 if(s->time_base.num != pts_num)
3391 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/s->time_base.num);
3393 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3395 if(!s->time_base.num || !s->time_base.den)
3396 s->time_base.num= s->time_base.den= 0;