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;
1206 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1209 for(i = 0; i < s->nb_streams; i++) {
1210 AVStream *st = s->streams[i];
1212 st->cur_dts = av_rescale(timestamp,
1213 st->time_base.den * (int64_t)ref_st->time_base.num,
1214 st->time_base.num * (int64_t)ref_st->time_base.den);
1218 void ff_reduce_index(AVFormatContext *s, int stream_index)
1220 AVStream *st= s->streams[stream_index];
1221 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1223 if((unsigned)st->nb_index_entries >= max_entries){
1225 for(i=0; 2*i<st->nb_index_entries; i++)
1226 st->index_entries[i]= st->index_entries[2*i];
1227 st->nb_index_entries= i;
1231 int av_add_index_entry(AVStream *st,
1232 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1234 AVIndexEntry *entries, *ie;
1237 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1240 entries = av_fast_realloc(st->index_entries,
1241 &st->index_entries_allocated_size,
1242 (st->nb_index_entries + 1) *
1243 sizeof(AVIndexEntry));
1247 st->index_entries= entries;
1249 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1252 index= st->nb_index_entries++;
1253 ie= &entries[index];
1254 assert(index==0 || ie[-1].timestamp < timestamp);
1256 ie= &entries[index];
1257 if(ie->timestamp != timestamp){
1258 if(ie->timestamp <= timestamp)
1260 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1261 st->nb_index_entries++;
1262 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1263 distance= ie->min_distance;
1267 ie->timestamp = timestamp;
1268 ie->min_distance= distance;
1275 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1278 AVIndexEntry *entries= st->index_entries;
1279 int nb_entries= st->nb_index_entries;
1288 timestamp = entries[m].timestamp;
1289 if(timestamp >= wanted_timestamp)
1291 if(timestamp <= wanted_timestamp)
1294 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1296 if(!(flags & AVSEEK_FLAG_ANY)){
1297 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1298 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1309 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1310 AVInputFormat *avif= s->iformat;
1311 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1312 int64_t ts_min, ts_max, ts;
1316 if (stream_index < 0)
1320 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1324 ts_min= AV_NOPTS_VALUE;
1325 pos_limit= -1; //gcc falsely says it may be uninitialized
1327 st= s->streams[stream_index];
1328 if(st->index_entries){
1331 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()
1332 index= FFMAX(index, 0);
1333 e= &st->index_entries[index];
1335 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1337 ts_min= e->timestamp;
1339 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1346 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1347 assert(index < st->nb_index_entries);
1349 e= &st->index_entries[index];
1350 assert(e->timestamp >= target_ts);
1352 ts_max= e->timestamp;
1353 pos_limit= pos_max - e->min_distance;
1355 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1356 pos_max,pos_limit, ts_max);
1361 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1366 url_fseek(s->pb, pos, SEEK_SET);
1368 av_update_cur_dts(s, st, ts);
1373 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 )){
1375 int64_t start_pos, filesize;
1379 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1382 if(ts_min == AV_NOPTS_VALUE){
1383 pos_min = s->data_offset;
1384 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1385 if (ts_min == AV_NOPTS_VALUE)
1389 if(ts_max == AV_NOPTS_VALUE){
1391 filesize = url_fsize(s->pb);
1392 pos_max = filesize - 1;
1395 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1397 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1398 if (ts_max == AV_NOPTS_VALUE)
1402 int64_t tmp_pos= pos_max + 1;
1403 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1404 if(tmp_ts == AV_NOPTS_VALUE)
1408 if(tmp_pos >= filesize)
1414 if(ts_min > ts_max){
1416 }else if(ts_min == ts_max){
1421 while (pos_min < pos_limit) {
1423 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1427 assert(pos_limit <= pos_max);
1430 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1431 // interpolate position (better than dichotomy)
1432 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1433 + pos_min - approximate_keyframe_distance;
1434 }else if(no_change==1){
1435 // bisection, if interpolation failed to change min or max pos last time
1436 pos = (pos_min + pos_limit)>>1;
1438 /* linear search if bisection failed, can only happen if there
1439 are very few or no keyframes between min/max */
1444 else if(pos > pos_limit)
1448 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1454 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1455 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit,
1456 start_pos, no_change);
1458 if(ts == AV_NOPTS_VALUE){
1459 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1462 assert(ts != AV_NOPTS_VALUE);
1463 if (target_ts <= ts) {
1464 pos_limit = start_pos - 1;
1468 if (target_ts >= ts) {
1474 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1475 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1478 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1480 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1481 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1482 pos, ts_min, target_ts, ts_max);
1488 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1489 int64_t pos_min, pos_max;
1493 if (stream_index < 0)
1496 st= s->streams[stream_index];
1499 pos_min = s->data_offset;
1500 pos_max = url_fsize(s->pb) - 1;
1502 if (pos < pos_min) pos= pos_min;
1503 else if(pos > pos_max) pos= pos_max;
1505 url_fseek(s->pb, pos, SEEK_SET);
1508 av_update_cur_dts(s, st, ts);
1513 static int av_seek_frame_generic(AVFormatContext *s,
1514 int stream_index, int64_t timestamp, int flags)
1520 st = s->streams[stream_index];
1522 index = av_index_search_timestamp(st, timestamp, flags);
1524 if(index < 0 || index==st->nb_index_entries-1){
1528 if(st->nb_index_entries){
1529 assert(st->index_entries);
1530 ie= &st->index_entries[st->nb_index_entries-1];
1531 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1533 av_update_cur_dts(s, st, ie->timestamp);
1535 if ((ret = url_fseek(s->pb, s->data_offset, SEEK_SET)) < 0)
1541 ret = av_read_frame(s, &pkt);
1542 }while(ret == AVERROR(EAGAIN));
1545 av_free_packet(&pkt);
1546 if(stream_index == pkt.stream_index){
1547 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1551 index = av_index_search_timestamp(st, timestamp, flags);
1556 av_read_frame_flush(s);
1557 if (s->iformat->read_seek){
1558 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1561 ie = &st->index_entries[index];
1562 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1564 av_update_cur_dts(s, st, ie->timestamp);
1569 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1574 av_read_frame_flush(s);
1576 if(flags & AVSEEK_FLAG_BYTE)
1577 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1579 if(stream_index < 0){
1580 stream_index= av_find_default_stream_index(s);
1581 if(stream_index < 0)
1584 st= s->streams[stream_index];
1585 /* timestamp for default must be expressed in AV_TIME_BASE units */
1586 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1589 /* first, we try the format specific seek */
1590 if (s->iformat->read_seek)
1591 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1598 if(s->iformat->read_timestamp)
1599 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1601 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1604 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1606 if(min_ts > ts || max_ts < ts)
1609 av_read_frame_flush(s);
1611 if (s->iformat->read_seek2)
1612 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1614 if(s->iformat->read_timestamp){
1615 //try to seek via read_timestamp()
1618 //Fallback to old API if new is not implemented but old is
1619 //Note the old has somewat different sematics
1620 if(s->iformat->read_seek || 1)
1621 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1623 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1626 /*******************************************************/
1629 * Returns TRUE if the stream has accurate duration in any stream.
1631 * @return TRUE if the stream has accurate duration for at least one component.
1633 static int av_has_duration(AVFormatContext *ic)
1638 for(i = 0;i < ic->nb_streams; i++) {
1639 st = ic->streams[i];
1640 if (st->duration != AV_NOPTS_VALUE)
1647 * Estimate the stream timings from the one of each components.
1649 * Also computes the global bitrate if possible.
1651 static void av_update_stream_timings(AVFormatContext *ic)
1653 int64_t start_time, start_time1, end_time, end_time1;
1654 int64_t duration, duration1;
1658 start_time = INT64_MAX;
1659 end_time = INT64_MIN;
1660 duration = INT64_MIN;
1661 for(i = 0;i < ic->nb_streams; i++) {
1662 st = ic->streams[i];
1663 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1664 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1665 if (start_time1 < start_time)
1666 start_time = start_time1;
1667 if (st->duration != AV_NOPTS_VALUE) {
1668 end_time1 = start_time1
1669 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1670 if (end_time1 > end_time)
1671 end_time = end_time1;
1674 if (st->duration != AV_NOPTS_VALUE) {
1675 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1676 if (duration1 > duration)
1677 duration = duration1;
1680 if (start_time != INT64_MAX) {
1681 ic->start_time = start_time;
1682 if (end_time != INT64_MIN) {
1683 if (end_time - start_time > duration)
1684 duration = end_time - start_time;
1687 if (duration != INT64_MIN) {
1688 ic->duration = duration;
1689 if (ic->file_size > 0) {
1690 /* compute the bitrate */
1691 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1692 (double)ic->duration;
1697 static void fill_all_stream_timings(AVFormatContext *ic)
1702 av_update_stream_timings(ic);
1703 for(i = 0;i < ic->nb_streams; i++) {
1704 st = ic->streams[i];
1705 if (st->start_time == AV_NOPTS_VALUE) {
1706 if(ic->start_time != AV_NOPTS_VALUE)
1707 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1708 if(ic->duration != AV_NOPTS_VALUE)
1709 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1714 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1716 int64_t filesize, duration;
1720 /* if bit_rate is already set, we believe it */
1721 if (ic->bit_rate == 0) {
1723 for(i=0;i<ic->nb_streams;i++) {
1724 st = ic->streams[i];
1725 bit_rate += st->codec->bit_rate;
1727 ic->bit_rate = bit_rate;
1730 /* if duration is already set, we believe it */
1731 if (ic->duration == AV_NOPTS_VALUE &&
1732 ic->bit_rate != 0 &&
1733 ic->file_size != 0) {
1734 filesize = ic->file_size;
1736 for(i = 0; i < ic->nb_streams; i++) {
1737 st = ic->streams[i];
1738 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1739 if (st->duration == AV_NOPTS_VALUE)
1740 st->duration = duration;
1746 #define DURATION_MAX_READ_SIZE 250000
1748 /* only usable for MPEG-PS streams */
1749 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1751 AVPacket pkt1, *pkt = &pkt1;
1753 int read_size, i, ret;
1755 int64_t filesize, offset, duration;
1759 /* flush packet queue */
1760 flush_packet_queue(ic);
1762 for(i=0;i<ic->nb_streams;i++) {
1763 st = ic->streams[i];
1765 av_parser_close(st->parser);
1767 av_free_packet(&st->cur_pkt);
1771 /* we read the first packets to get the first PTS (not fully
1772 accurate, but it is enough now) */
1773 url_fseek(ic->pb, 0, SEEK_SET);
1776 if (read_size >= DURATION_MAX_READ_SIZE)
1778 /* if all info is available, we can stop */
1779 for(i = 0;i < ic->nb_streams; i++) {
1780 st = ic->streams[i];
1781 if (st->start_time == AV_NOPTS_VALUE)
1784 if (i == ic->nb_streams)
1788 ret = av_read_packet(ic, pkt);
1789 }while(ret == AVERROR(EAGAIN));
1792 read_size += pkt->size;
1793 st = ic->streams[pkt->stream_index];
1794 if (pkt->pts != AV_NOPTS_VALUE) {
1795 if (st->start_time == AV_NOPTS_VALUE)
1796 st->start_time = pkt->pts;
1798 av_free_packet(pkt);
1801 /* estimate the end time (duration) */
1802 /* XXX: may need to support wrapping */
1803 filesize = ic->file_size;
1804 offset = filesize - DURATION_MAX_READ_SIZE;
1808 url_fseek(ic->pb, offset, SEEK_SET);
1811 if (read_size >= DURATION_MAX_READ_SIZE)
1815 ret = av_read_packet(ic, pkt);
1816 }while(ret == AVERROR(EAGAIN));
1819 read_size += pkt->size;
1820 st = ic->streams[pkt->stream_index];
1821 if (pkt->pts != AV_NOPTS_VALUE &&
1822 st->start_time != AV_NOPTS_VALUE) {
1823 end_time = pkt->pts;
1824 duration = end_time - st->start_time;
1826 if (st->duration == AV_NOPTS_VALUE ||
1827 st->duration < duration)
1828 st->duration = duration;
1831 av_free_packet(pkt);
1834 fill_all_stream_timings(ic);
1836 url_fseek(ic->pb, old_offset, SEEK_SET);
1837 for(i=0; i<ic->nb_streams; i++){
1839 st->cur_dts= st->first_dts;
1840 st->last_IP_pts = AV_NOPTS_VALUE;
1844 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
1848 /* get the file size, if possible */
1849 if (ic->iformat->flags & AVFMT_NOFILE) {
1852 file_size = url_fsize(ic->pb);
1856 ic->file_size = file_size;
1858 if ((!strcmp(ic->iformat->name, "mpeg") ||
1859 !strcmp(ic->iformat->name, "mpegts")) &&
1860 file_size && !url_is_streamed(ic->pb)) {
1861 /* get accurate estimate from the PTSes */
1862 av_estimate_timings_from_pts(ic, old_offset);
1863 } else if (av_has_duration(ic)) {
1864 /* at least one component has timings - we use them for all
1866 fill_all_stream_timings(ic);
1868 /* less precise: use bitrate info */
1869 av_estimate_timings_from_bit_rate(ic);
1871 av_update_stream_timings(ic);
1877 for(i = 0;i < ic->nb_streams; i++) {
1878 st = ic->streams[i];
1879 printf("%d: start_time: %0.3f duration: %0.3f\n",
1880 i, (double)st->start_time / AV_TIME_BASE,
1881 (double)st->duration / AV_TIME_BASE);
1883 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1884 (double)ic->start_time / AV_TIME_BASE,
1885 (double)ic->duration / AV_TIME_BASE,
1886 ic->bit_rate / 1000);
1891 static int has_codec_parameters(AVCodecContext *enc)
1894 switch(enc->codec_type) {
1895 case CODEC_TYPE_AUDIO:
1896 val = enc->sample_rate && enc->channels && enc->sample_fmt != SAMPLE_FMT_NONE;
1897 if(!enc->frame_size &&
1898 (enc->codec_id == CODEC_ID_VORBIS ||
1899 enc->codec_id == CODEC_ID_AAC ||
1900 enc->codec_id == CODEC_ID_MP3 ||
1901 enc->codec_id == CODEC_ID_SPEEX))
1904 case CODEC_TYPE_VIDEO:
1905 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1911 return enc->codec_id != CODEC_ID_NONE && val != 0;
1914 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
1918 int got_picture, data_size, ret=0;
1921 if(!st->codec->codec){
1922 codec = avcodec_find_decoder(st->codec->codec_id);
1925 ret = avcodec_open(st->codec, codec);
1930 if(!has_codec_parameters(st->codec)){
1931 switch(st->codec->codec_type) {
1932 case CODEC_TYPE_VIDEO:
1933 avcodec_get_frame_defaults(&picture);
1934 ret = avcodec_decode_video2(st->codec, &picture,
1935 &got_picture, avpkt);
1937 case CODEC_TYPE_AUDIO:
1938 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1939 samples = av_malloc(data_size);
1942 ret = avcodec_decode_audio3(st->codec, samples,
1954 unsigned int ff_codec_get_tag(const AVCodecTag *tags, int id)
1956 while (tags->id != CODEC_ID_NONE) {
1964 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
1967 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1968 if(tag == tags[i].tag)
1971 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1972 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1973 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1974 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1975 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1978 return CODEC_ID_NONE;
1981 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
1984 for(i=0; tags && tags[i]; i++){
1985 int tag= ff_codec_get_tag(tags[i], id);
1991 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
1994 for(i=0; tags && tags[i]; i++){
1995 enum CodecID id= ff_codec_get_id(tags[i], tag);
1996 if(id!=CODEC_ID_NONE) return id;
1998 return CODEC_ID_NONE;
2001 static void compute_chapters_end(AVFormatContext *s)
2005 for (i=0; i+1<s->nb_chapters; i++)
2006 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2007 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
2008 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
2009 s->chapters[i]->end = s->chapters[i+1]->start;
2012 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
2013 assert(s->start_time != AV_NOPTS_VALUE);
2014 assert(s->duration > 0);
2015 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
2017 s->chapters[i]->time_base);
2021 #define MAX_STD_TIMEBASES (60*12+5)
2022 static int get_std_framerate(int i){
2023 if(i<60*12) return i*1001;
2024 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2028 * Is the time base unreliable.
2029 * This is a heuristic to balance between quick acceptance of the values in
2030 * the headers vs. some extra checks.
2031 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2032 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2033 * And there are "variable" fps files this needs to detect as well.
2035 static int tb_unreliable(AVCodecContext *c){
2036 if( c->time_base.den >= 101L*c->time_base.num
2037 || c->time_base.den < 5L*c->time_base.num
2038 /* || c->codec_tag == AV_RL32("DIVX")
2039 || c->codec_tag == AV_RL32("XVID")*/
2040 || c->codec_id == CODEC_ID_MPEG2VIDEO
2041 || c->codec_id == CODEC_ID_H264
2047 int av_find_stream_info(AVFormatContext *ic)
2049 int i, count, ret, read_size, j;
2051 AVPacket pkt1, *pkt;
2052 int64_t last_dts[MAX_STREAMS];
2053 int64_t duration_gcd[MAX_STREAMS]={0};
2054 int duration_count[MAX_STREAMS]={0};
2055 double (*duration_error)[MAX_STD_TIMEBASES];
2056 int64_t old_offset = url_ftell(ic->pb);
2057 int64_t codec_info_duration[MAX_STREAMS]={0};
2058 int codec_info_nb_frames[MAX_STREAMS]={0};
2060 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
2061 if (!duration_error) return AVERROR(ENOMEM);
2063 for(i=0;i<ic->nb_streams;i++) {
2064 st = ic->streams[i];
2065 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2066 /* if(!st->time_base.num)
2068 if(!st->codec->time_base.num)
2069 st->codec->time_base= st->time_base;
2071 //only for the split stuff
2073 st->parser = av_parser_init(st->codec->codec_id);
2074 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2075 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2080 for(i=0;i<MAX_STREAMS;i++){
2081 last_dts[i]= AV_NOPTS_VALUE;
2087 if(url_interrupt_cb()){
2088 ret= AVERROR(EINTR);
2089 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2093 /* check if one codec still needs to be handled */
2094 for(i=0;i<ic->nb_streams;i++) {
2095 st = ic->streams[i];
2096 if (!has_codec_parameters(st->codec))
2098 /* variable fps and no guess at the real fps */
2099 if( tb_unreliable(st->codec)
2100 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
2102 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2104 if(st->first_dts == AV_NOPTS_VALUE)
2107 if (i == ic->nb_streams) {
2108 /* NOTE: if the format has no header, then we need to read
2109 some packets to get most of the streams, so we cannot
2111 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2112 /* if we found the info for all the codecs, we can stop */
2114 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2118 /* we did not get all the codec info, but we read too much data */
2119 if (read_size >= ic->probesize) {
2121 av_log(ic, AV_LOG_WARNING, "MAX_READ_SIZE:%d reached\n", ic->probesize);
2125 /* NOTE: a new stream can be added there if no header in file
2126 (AVFMTCTX_NOHEADER) */
2127 ret = av_read_frame_internal(ic, &pkt1);
2128 if(ret == AVERROR(EAGAIN))
2132 ret = -1; /* we could not have all the codec parameters before EOF */
2133 for(i=0;i<ic->nb_streams;i++) {
2134 st = ic->streams[i];
2135 if (!has_codec_parameters(st->codec)){
2137 avcodec_string(buf, sizeof(buf), st->codec, 0);
2138 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2146 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2147 if(av_dup_packet(pkt) < 0) {
2148 av_free(duration_error);
2149 return AVERROR(ENOMEM);
2152 read_size += pkt->size;
2154 st = ic->streams[pkt->stream_index];
2155 if(codec_info_nb_frames[st->index]>1) {
2156 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){
2157 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2160 codec_info_duration[st->index] += pkt->duration;
2162 if (pkt->duration != 0)
2163 codec_info_nb_frames[st->index]++;
2166 int index= pkt->stream_index;
2167 int64_t last= last_dts[index];
2168 int64_t duration= pkt->dts - last;
2170 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2171 double dur= duration * av_q2d(st->time_base);
2173 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2174 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2175 if(duration_count[index] < 2)
2176 memset(duration_error[index], 0, sizeof(*duration_error));
2177 for(i=1; i<MAX_STD_TIMEBASES; i++){
2178 int framerate= get_std_framerate(i);
2179 int ticks= lrintf(dur*framerate/(1001*12));
2180 double error= dur - ticks*1001*12/(double)framerate;
2181 duration_error[index][i] += error*error;
2183 duration_count[index]++;
2184 // ignore the first 4 values, they might have some random jitter
2185 if (duration_count[index] > 3)
2186 duration_gcd[index] = av_gcd(duration_gcd[index], duration);
2188 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
2189 last_dts[pkt->stream_index]= pkt->dts;
2191 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2192 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2194 st->codec->extradata_size= i;
2195 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2196 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2197 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2201 /* if still no information, we try to open the codec and to
2202 decompress the frame. We try to avoid that in most cases as
2203 it takes longer and uses more memory. For MPEG-4, we need to
2204 decompress for QuickTime. */
2205 if (!has_codec_parameters(st->codec) /*&&
2206 (st->codec->codec_id == CODEC_ID_FLV1 ||
2207 st->codec->codec_id == CODEC_ID_H264 ||
2208 st->codec->codec_id == CODEC_ID_H263 ||
2209 st->codec->codec_id == CODEC_ID_H261 ||
2210 st->codec->codec_id == CODEC_ID_VORBIS ||
2211 st->codec->codec_id == CODEC_ID_MJPEG ||
2212 st->codec->codec_id == CODEC_ID_PNG ||
2213 st->codec->codec_id == CODEC_ID_PAM ||
2214 st->codec->codec_id == CODEC_ID_PGM ||
2215 st->codec->codec_id == CODEC_ID_PGMYUV ||
2216 st->codec->codec_id == CODEC_ID_PBM ||
2217 st->codec->codec_id == CODEC_ID_PPM ||
2218 st->codec->codec_id == CODEC_ID_SHORTEN ||
2219 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2220 try_decode_frame(st, pkt);
2225 // close codecs which were opened in try_decode_frame()
2226 for(i=0;i<ic->nb_streams;i++) {
2227 st = ic->streams[i];
2228 if(st->codec->codec)
2229 avcodec_close(st->codec);
2231 for(i=0;i<ic->nb_streams;i++) {
2232 st = ic->streams[i];
2233 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2234 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
2235 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2237 // the check for tb_unreliable() is not completely correct, since this is not about handling
2238 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2239 // ipmovie.c produces.
2240 if (tb_unreliable(st->codec) && duration_count[i] > 15 && duration_gcd[i] > 1)
2241 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);
2242 if(duration_count[i]
2243 && tb_unreliable(st->codec) /*&&
2244 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2245 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2247 double best_error= 2*av_q2d(st->time_base);
2248 best_error= best_error*best_error*duration_count[i]*1000*12*30;
2250 for(j=1; j<MAX_STD_TIMEBASES; j++){
2251 double error= duration_error[i][j] * get_std_framerate(j);
2252 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2253 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2254 if(error < best_error){
2256 num = get_std_framerate(j);
2259 // do not increase frame rate by more than 1 % in order to match a standard rate.
2260 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2261 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2264 if (!st->r_frame_rate.num){
2265 if( st->codec->time_base.den * (int64_t)st->time_base.num
2266 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2267 st->r_frame_rate.num = st->codec->time_base.den;
2268 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2270 st->r_frame_rate.num = st->time_base.den;
2271 st->r_frame_rate.den = st->time_base.num;
2274 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
2275 if(!st->codec->bits_per_coded_sample)
2276 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2280 av_estimate_timings(ic, old_offset);
2282 compute_chapters_end(ic);
2285 /* correct DTS for B-frame streams with no timestamps */
2286 for(i=0;i<ic->nb_streams;i++) {
2287 st = ic->streams[i];
2288 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2290 ppktl = &ic->packet_buffer;
2292 if(ppkt1->stream_index != i)
2294 if(ppkt1->pkt->dts < 0)
2296 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2298 ppkt1->pkt->dts -= delta;
2303 st->cur_dts -= delta;
2309 av_free(duration_error);
2314 /*******************************************************/
2316 int av_read_play(AVFormatContext *s)
2318 if (s->iformat->read_play)
2319 return s->iformat->read_play(s);
2321 return av_url_read_fpause(s->pb, 0);
2322 return AVERROR(ENOSYS);
2325 int av_read_pause(AVFormatContext *s)
2327 if (s->iformat->read_pause)
2328 return s->iformat->read_pause(s);
2330 return av_url_read_fpause(s->pb, 1);
2331 return AVERROR(ENOSYS);
2334 void av_close_input_stream(AVFormatContext *s)
2339 if (s->iformat->read_close)
2340 s->iformat->read_close(s);
2341 for(i=0;i<s->nb_streams;i++) {
2342 /* free all data in a stream component */
2345 av_parser_close(st->parser);
2346 av_free_packet(&st->cur_pkt);
2348 av_metadata_free(&st->metadata);
2349 av_free(st->index_entries);
2350 av_free(st->codec->extradata);
2352 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2353 av_free(st->filename);
2355 av_free(st->priv_data);
2358 for(i=s->nb_programs-1; i>=0; i--) {
2359 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2360 av_freep(&s->programs[i]->provider_name);
2361 av_freep(&s->programs[i]->name);
2363 av_metadata_free(&s->programs[i]->metadata);
2364 av_freep(&s->programs[i]->stream_index);
2365 av_freep(&s->programs[i]);
2367 av_freep(&s->programs);
2368 flush_packet_queue(s);
2369 av_freep(&s->priv_data);
2370 while(s->nb_chapters--) {
2371 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2372 av_free(s->chapters[s->nb_chapters]->title);
2374 av_metadata_free(&s->chapters[s->nb_chapters]->metadata);
2375 av_free(s->chapters[s->nb_chapters]);
2377 av_freep(&s->chapters);
2378 av_metadata_free(&s->metadata);
2382 void av_close_input_file(AVFormatContext *s)
2384 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2385 av_close_input_stream(s);
2390 AVStream *av_new_stream(AVFormatContext *s, int id)
2395 if (s->nb_streams >= MAX_STREAMS)
2398 st = av_mallocz(sizeof(AVStream));
2402 st->codec= avcodec_alloc_context();
2404 /* no default bitrate if decoding */
2405 st->codec->bit_rate = 0;
2407 st->index = s->nb_streams;
2409 st->start_time = AV_NOPTS_VALUE;
2410 st->duration = AV_NOPTS_VALUE;
2411 /* we set the current DTS to 0 so that formats without any timestamps
2412 but durations get some timestamps, formats with some unknown
2413 timestamps have their first few packets buffered and the
2414 timestamps corrected before they are returned to the user */
2416 st->first_dts = AV_NOPTS_VALUE;
2417 st->probe_packets = MAX_PROBE_PACKETS;
2419 /* default pts setting is MPEG-like */
2420 av_set_pts_info(st, 33, 1, 90000);
2421 st->last_IP_pts = AV_NOPTS_VALUE;
2422 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2423 st->pts_buffer[i]= AV_NOPTS_VALUE;
2424 st->reference_dts = AV_NOPTS_VALUE;
2426 st->sample_aspect_ratio = (AVRational){0,1};
2428 s->streams[s->nb_streams++] = st;
2432 AVProgram *av_new_program(AVFormatContext *ac, int id)
2434 AVProgram *program=NULL;
2438 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2441 for(i=0; i<ac->nb_programs; i++)
2442 if(ac->programs[i]->id == id)
2443 program = ac->programs[i];
2446 program = av_mallocz(sizeof(AVProgram));
2449 dynarray_add(&ac->programs, &ac->nb_programs, program);
2450 program->discard = AVDISCARD_NONE;
2457 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2459 AVChapter *chapter = NULL;
2462 for(i=0; i<s->nb_chapters; i++)
2463 if(s->chapters[i]->id == id)
2464 chapter = s->chapters[i];
2467 chapter= av_mallocz(sizeof(AVChapter));
2470 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2472 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2473 av_free(chapter->title);
2475 av_metadata_set(&chapter->metadata, "title", title);
2477 chapter->time_base= time_base;
2478 chapter->start = start;
2484 /************************************************************/
2485 /* output media file */
2487 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2491 if (s->oformat->priv_data_size > 0) {
2492 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2494 return AVERROR(ENOMEM);
2496 s->priv_data = NULL;
2498 if (s->oformat->set_parameters) {
2499 ret = s->oformat->set_parameters(s, ap);
2506 int av_write_header(AVFormatContext *s)
2511 // some sanity checks
2512 for(i=0;i<s->nb_streams;i++) {
2515 switch (st->codec->codec_type) {
2516 case CODEC_TYPE_AUDIO:
2517 if(st->codec->sample_rate<=0){
2518 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2521 if(!st->codec->block_align)
2522 st->codec->block_align = st->codec->channels *
2523 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2525 case CODEC_TYPE_VIDEO:
2526 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2527 av_log(s, AV_LOG_ERROR, "time base not set\n");
2530 if(st->codec->width<=0 || st->codec->height<=0){
2531 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2534 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2535 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2541 if(s->oformat->codec_tag){
2542 if(st->codec->codec_tag){
2544 //check that tag + id is in the table
2545 //if neither is in the table -> OK
2546 //if tag is in the table with another id -> FAIL
2547 //if id is in the table with another tag -> FAIL unless strict < ?
2549 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2552 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2553 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2554 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2557 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2558 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2560 return AVERROR(ENOMEM);
2563 #if LIBAVFORMAT_VERSION_MAJOR < 53
2564 ff_metadata_mux_compat(s);
2567 if(s->oformat->write_header){
2568 ret = s->oformat->write_header(s);
2573 /* init PTS generation */
2574 for(i=0;i<s->nb_streams;i++) {
2575 int64_t den = AV_NOPTS_VALUE;
2578 switch (st->codec->codec_type) {
2579 case CODEC_TYPE_AUDIO:
2580 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2582 case CODEC_TYPE_VIDEO:
2583 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2588 if (den != AV_NOPTS_VALUE) {
2590 return AVERROR_INVALIDDATA;
2591 av_frac_init(&st->pts, 0, 0, den);
2597 //FIXME merge with compute_pkt_fields
2598 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2599 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2600 int num, den, frame_size, i;
2602 // av_log(st->codec, 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);
2604 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2607 /* duration field */
2608 if (pkt->duration == 0) {
2609 compute_frame_duration(&num, &den, st, NULL, pkt);
2611 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2615 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2618 //XXX/FIXME this is a temporary hack until all encoders output pts
2619 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2621 // pkt->pts= st->cur_dts;
2622 pkt->pts= st->pts.val;
2625 //calculate dts from pts
2626 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2627 st->pts_buffer[0]= pkt->pts;
2628 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2629 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2630 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2631 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2633 pkt->dts= st->pts_buffer[0];
2636 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2637 av_log(st->codec, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2640 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2641 av_log(st->codec, AV_LOG_ERROR, "error, pts < dts\n");
2645 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2646 st->cur_dts= pkt->dts;
2647 st->pts.val= pkt->dts;
2650 switch (st->codec->codec_type) {
2651 case CODEC_TYPE_AUDIO:
2652 frame_size = get_audio_frame_size(st->codec, pkt->size);
2654 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2655 likely equal to the encoder delay, but it would be better if we
2656 had the real timestamps from the encoder */
2657 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2658 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2661 case CODEC_TYPE_VIDEO:
2662 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2670 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2672 int ret = compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2674 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2677 ret= s->oformat->write_packet(s, pkt);
2679 ret= url_ferror(s->pb);
2683 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
2684 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
2686 AVPacketList **next_point, *this_pktl;
2688 this_pktl = av_mallocz(sizeof(AVPacketList));
2689 this_pktl->pkt= *pkt;
2690 pkt->destruct= NULL; // do not free original but only the copy
2691 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
2693 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
2694 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
2696 next_point = &s->packet_buffer;
2699 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
2700 while(!compare(s, &(*next_point)->pkt, pkt)){
2701 next_point= &(*next_point)->next;
2705 next_point = &(s->packet_buffer_end->next);
2708 assert(!*next_point);
2710 s->packet_buffer_end= this_pktl;
2713 this_pktl->next= *next_point;
2715 s->streams[pkt->stream_index]->last_in_packet_buffer=
2716 *next_point= this_pktl;
2719 int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
2721 AVStream *st = s->streams[ pkt ->stream_index];
2722 AVStream *st2= s->streams[ next->stream_index];
2723 int64_t left = st2->time_base.num * (int64_t)st ->time_base.den;
2724 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2726 if (pkt->dts == AV_NOPTS_VALUE)
2729 return next->dts * left > pkt->dts * right; //FIXME this can overflow
2732 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2738 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
2741 for(i=0; i < s->nb_streams; i++)
2742 stream_count+= !!s->streams[i]->last_in_packet_buffer;
2744 if(stream_count && (s->nb_streams == stream_count || flush)){
2745 pktl= s->packet_buffer;
2748 s->packet_buffer= pktl->next;
2749 if(!s->packet_buffer)
2750 s->packet_buffer_end= NULL;
2752 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
2753 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
2757 av_init_packet(out);
2763 * Interleaves an AVPacket correctly so it can be muxed.
2764 * @param out the interleaved packet will be output here
2765 * @param in the input packet
2766 * @param flush 1 if no further packets are available as input and all
2767 * remaining packets should be output
2768 * @return 1 if a packet was output, 0 if no packet could be output,
2769 * < 0 if an error occurred
2771 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2772 if(s->oformat->interleave_packet)
2773 return s->oformat->interleave_packet(s, out, in, flush);
2775 return av_interleave_packet_per_dts(s, out, in, flush);
2778 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2779 AVStream *st= s->streams[ pkt->stream_index];
2781 //FIXME/XXX/HACK drop zero sized packets
2782 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2785 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2786 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2789 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2794 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2795 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2798 ret= s->oformat->write_packet(s, &opkt);
2800 av_free_packet(&opkt);
2805 if(url_ferror(s->pb))
2806 return url_ferror(s->pb);
2810 int av_write_trailer(AVFormatContext *s)
2816 ret= av_interleave_packet(s, &pkt, NULL, 1);
2817 if(ret<0) //FIXME cleanup needed for ret<0 ?
2822 ret= s->oformat->write_packet(s, &pkt);
2824 av_free_packet(&pkt);
2828 if(url_ferror(s->pb))
2832 if(s->oformat->write_trailer)
2833 ret = s->oformat->write_trailer(s);
2836 ret=url_ferror(s->pb);
2837 for(i=0;i<s->nb_streams;i++)
2838 av_freep(&s->streams[i]->priv_data);
2839 av_freep(&s->priv_data);
2843 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2846 AVProgram *program=NULL;
2849 if (idx >= ac->nb_streams) {
2850 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
2854 for(i=0; i<ac->nb_programs; i++){
2855 if(ac->programs[i]->id != progid)
2857 program = ac->programs[i];
2858 for(j=0; j<program->nb_stream_indexes; j++)
2859 if(program->stream_index[j] == idx)
2862 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2865 program->stream_index = tmp;
2866 program->stream_index[program->nb_stream_indexes++] = idx;
2871 static void print_fps(double d, const char *postfix){
2872 uint64_t v= lrintf(d*100);
2873 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
2874 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
2875 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
2878 /* "user interface" functions */
2879 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2882 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2883 AVStream *st = ic->streams[i];
2884 int g = av_gcd(st->time_base.num, st->time_base.den);
2885 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0);
2886 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2887 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2888 /* the pid is an important information, so we display it */
2889 /* XXX: add a generic system */
2890 if (flags & AVFMT_SHOW_IDS)
2891 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2893 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
2894 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2895 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2896 if (st->sample_aspect_ratio.num && // default
2897 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
2898 AVRational display_aspect_ratio;
2899 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
2900 st->codec->width*st->sample_aspect_ratio.num,
2901 st->codec->height*st->sample_aspect_ratio.den,
2903 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
2904 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
2905 display_aspect_ratio.num, display_aspect_ratio.den);
2907 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2908 if(st->r_frame_rate.den && st->r_frame_rate.num)
2909 print_fps(av_q2d(st->r_frame_rate), "tbr");
2910 if(st->time_base.den && st->time_base.num)
2911 print_fps(1/av_q2d(st->time_base), "tbn");
2912 if(st->codec->time_base.den && st->codec->time_base.num)
2913 print_fps(1/av_q2d(st->codec->time_base), "tbc");
2915 av_log(NULL, AV_LOG_INFO, "\n");
2918 void dump_format(AVFormatContext *ic,
2924 uint8_t *printed = av_mallocz(ic->nb_streams);
2925 if (ic->nb_streams && !printed)
2928 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2929 is_output ? "Output" : "Input",
2931 is_output ? ic->oformat->name : ic->iformat->name,
2932 is_output ? "to" : "from", url);
2934 av_log(NULL, AV_LOG_INFO, " Duration: ");
2935 if (ic->duration != AV_NOPTS_VALUE) {
2936 int hours, mins, secs, us;
2937 secs = ic->duration / AV_TIME_BASE;
2938 us = ic->duration % AV_TIME_BASE;
2943 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
2944 (100 * us) / AV_TIME_BASE);
2946 av_log(NULL, AV_LOG_INFO, "N/A");
2948 if (ic->start_time != AV_NOPTS_VALUE) {
2950 av_log(NULL, AV_LOG_INFO, ", start: ");
2951 secs = ic->start_time / AV_TIME_BASE;
2952 us = ic->start_time % AV_TIME_BASE;
2953 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2954 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2956 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2958 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2960 av_log(NULL, AV_LOG_INFO, "N/A");
2962 av_log(NULL, AV_LOG_INFO, "\n");
2964 if(ic->nb_programs) {
2965 int j, k, total = 0;
2966 for(j=0; j<ic->nb_programs; j++) {
2967 AVMetadataTag *name = av_metadata_get(ic->programs[j]->metadata,
2969 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2970 name ? name->value : "");
2971 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
2972 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2973 printed[ic->programs[j]->stream_index[k]] = 1;
2975 total += ic->programs[j]->nb_stream_indexes;
2977 if (total < ic->nb_streams)
2978 av_log(NULL, AV_LOG_INFO, " No Program\n");
2980 for(i=0;i<ic->nb_streams;i++)
2982 dump_stream_format(ic, i, index, is_output);
2985 AVMetadataTag *tag=NULL;
2986 av_log(NULL, AV_LOG_INFO, " Metadata\n");
2987 while((tag=av_metadata_get(ic->metadata, "", tag, AV_METADATA_IGNORE_SUFFIX))) {
2988 av_log(NULL, AV_LOG_INFO, " %-16s: %s\n", tag->key, tag->value);
2994 #if LIBAVFORMAT_VERSION_MAJOR < 53
2995 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2997 return av_parse_video_frame_size(width_ptr, height_ptr, str);
3000 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
3002 AVRational frame_rate;
3003 int ret = av_parse_video_frame_rate(&frame_rate, arg);
3004 *frame_rate_num= frame_rate.num;
3005 *frame_rate_den= frame_rate.den;
3010 int64_t av_gettime(void)
3013 gettimeofday(&tv,NULL);
3014 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3017 int64_t parse_date(const char *datestr, int duration)
3023 static const char * const date_fmt[] = {
3027 static const char * const time_fmt[] = {
3037 time_t now = time(0);
3039 len = strlen(datestr);
3041 lastch = datestr[len - 1];
3044 is_utc = (lastch == 'z' || lastch == 'Z');
3046 memset(&dt, 0, sizeof(dt));
3051 if (!strncasecmp(datestr, "now", len))
3052 return (int64_t) now * 1000000;
3054 /* parse the year-month-day part */
3055 for (i = 0; i < FF_ARRAY_ELEMS(date_fmt); i++) {
3056 q = small_strptime(p, date_fmt[i], &dt);
3062 /* if the year-month-day part is missing, then take the
3063 * current year-month-day time */
3068 dt = *localtime(&now);
3070 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
3075 if (*p == 'T' || *p == 't' || *p == ' ')
3078 /* parse the hour-minute-second part */
3079 for (i = 0; i < FF_ARRAY_ELEMS(time_fmt); i++) {
3080 q = small_strptime(p, time_fmt[i], &dt);
3086 /* parse datestr as a duration */
3091 /* parse datestr as HH:MM:SS */
3092 q = small_strptime(p, time_fmt[0], &dt);
3094 /* parse datestr as S+ */
3095 dt.tm_sec = strtol(p, (char **)&q, 10);
3097 /* the parsing didn't succeed */
3104 /* Now we have all the fields that we can get */
3110 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
3112 dt.tm_isdst = -1; /* unknown */
3122 /* parse the .m... part */
3126 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
3129 val += n * (*q - '0');
3133 return negative ? -t : t;
3136 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3146 while (*p != '\0' && *p != '=' && *p != '&') {
3147 if ((q - tag) < sizeof(tag) - 1)
3155 while (*p != '&' && *p != '\0') {
3156 if ((q - arg) < arg_size - 1) {
3166 if (!strcmp(tag, tag1))
3175 int av_get_frame_filename(char *buf, int buf_size,
3176 const char *path, int number)
3179 char *q, buf1[20], c;
3180 int nd, len, percentd_found;
3192 while (isdigit(*p)) {
3193 nd = nd * 10 + *p++ - '0';
3196 } while (isdigit(c));
3205 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3207 if ((q - buf + len) > buf_size - 1)
3209 memcpy(q, buf1, len);
3217 if ((q - buf) < buf_size - 1)
3221 if (!percentd_found)
3230 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3234 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3236 for(i=0;i<size;i+=16) {
3243 PRINT(" %02x", buf[i+j]);
3248 for(j=0;j<len;j++) {
3250 if (c < ' ' || c > '~')
3259 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3261 hex_dump_internal(NULL, f, 0, buf, size);
3264 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3266 hex_dump_internal(avcl, NULL, level, buf, size);
3269 //FIXME needs to know the time_base
3270 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
3273 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3274 PRINT("stream #%d:\n", pkt->stream_index);
3275 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3276 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3277 /* DTS is _always_ valid after av_read_frame() */
3279 if (pkt->dts == AV_NOPTS_VALUE)
3282 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
3283 /* PTS may not be known if B-frames are present. */
3285 if (pkt->pts == AV_NOPTS_VALUE)
3288 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
3290 PRINT(" size=%d\n", pkt->size);
3293 av_hex_dump(f, pkt->data, pkt->size);
3296 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3298 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
3301 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3303 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
3306 void url_split(char *proto, int proto_size,
3307 char *authorization, int authorization_size,
3308 char *hostname, int hostname_size,
3310 char *path, int path_size,
3313 const char *p, *ls, *at, *col, *brk;
3315 if (port_ptr) *port_ptr = -1;
3316 if (proto_size > 0) proto[0] = 0;
3317 if (authorization_size > 0) authorization[0] = 0;
3318 if (hostname_size > 0) hostname[0] = 0;
3319 if (path_size > 0) path[0] = 0;
3321 /* parse protocol */
3322 if ((p = strchr(url, ':'))) {
3323 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3328 /* no protocol means plain filename */
3329 av_strlcpy(path, url, path_size);
3333 /* separate path from hostname */
3334 ls = strchr(p, '/');
3336 ls = strchr(p, '?');
3338 av_strlcpy(path, ls, path_size);
3340 ls = &p[strlen(p)]; // XXX
3342 /* the rest is hostname, use that to parse auth/port */
3344 /* authorization (user[:pass]@hostname) */
3345 if ((at = strchr(p, '@')) && at < ls) {
3346 av_strlcpy(authorization, p,
3347 FFMIN(authorization_size, at + 1 - p));
3348 p = at + 1; /* skip '@' */
3351 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3353 av_strlcpy(hostname, p + 1,
3354 FFMIN(hostname_size, brk - p));
3355 if (brk[1] == ':' && port_ptr)
3356 *port_ptr = atoi(brk + 2);
3357 } else if ((col = strchr(p, ':')) && col < ls) {
3358 av_strlcpy(hostname, p,
3359 FFMIN(col + 1 - p, hostname_size));
3360 if (port_ptr) *port_ptr = atoi(col + 1);
3362 av_strlcpy(hostname, p,
3363 FFMIN(ls + 1 - p, hostname_size));
3367 char *ff_data_to_hex(char *buff, const uint8_t *src, int s)
3370 static const char hex_table[16] = { '0', '1', '2', '3',
3373 'C', 'D', 'E', 'F' };
3375 for(i = 0; i < s; i++) {
3376 buff[i * 2] = hex_table[src[i] >> 4];
3377 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3383 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3384 unsigned int pts_num, unsigned int pts_den)
3386 s->pts_wrap_bits = pts_wrap_bits;
3388 if(av_reduce(&s->time_base.num, &s->time_base.den, pts_num, pts_den, INT_MAX)){
3389 if(s->time_base.num != pts_num)
3390 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/s->time_base.num);
3392 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3394 if(!s->time_base.num || !s->time_base.den)
3395 s->time_base.num= s->time_base.den= 0;