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;
612 av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
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){
625 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
632 /**********************************************************/
635 * Get the number of samples of an audio frame. Return -1 on error.
637 static int get_audio_frame_size(AVCodecContext *enc, int size)
641 if(enc->codec_id == CODEC_ID_VORBIS)
644 if (enc->frame_size <= 1) {
645 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
647 if (bits_per_sample) {
648 if (enc->channels == 0)
650 frame_size = (size << 3) / (bits_per_sample * enc->channels);
652 /* used for example by ADPCM codecs */
653 if (enc->bit_rate == 0)
655 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
658 frame_size = enc->frame_size;
665 * Return the frame duration in seconds. Return 0 if not available.
667 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
668 AVCodecParserContext *pc, AVPacket *pkt)
674 switch(st->codec->codec_type) {
675 case CODEC_TYPE_VIDEO:
676 if(st->time_base.num*1000LL > st->time_base.den){
677 *pnum = st->time_base.num;
678 *pden = st->time_base.den;
679 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
680 *pnum = st->codec->time_base.num;
681 *pden = st->codec->time_base.den;
682 if (pc && pc->repeat_pict) {
683 *pnum = (*pnum) * (1 + pc->repeat_pict);
687 case CODEC_TYPE_AUDIO:
688 frame_size = get_audio_frame_size(st->codec, pkt->size);
692 *pden = st->codec->sample_rate;
699 static int is_intra_only(AVCodecContext *enc){
700 if(enc->codec_type == CODEC_TYPE_AUDIO){
702 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
703 switch(enc->codec_id){
705 case CODEC_ID_MJPEGB:
707 case CODEC_ID_RAWVIDEO:
708 case CODEC_ID_DVVIDEO:
709 case CODEC_ID_HUFFYUV:
710 case CODEC_ID_FFVHUFF:
715 case CODEC_ID_JPEG2000:
723 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
724 int64_t dts, int64_t pts)
726 AVStream *st= s->streams[stream_index];
727 AVPacketList *pktl= s->packet_buffer;
729 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
732 st->first_dts= dts - st->cur_dts;
735 for(; pktl; pktl= pktl->next){
736 if(pktl->pkt.stream_index != stream_index)
738 //FIXME think more about this check
739 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
740 pktl->pkt.pts += st->first_dts;
742 if(pktl->pkt.dts != AV_NOPTS_VALUE)
743 pktl->pkt.dts += st->first_dts;
745 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
746 st->start_time= pktl->pkt.pts;
748 if (st->start_time == AV_NOPTS_VALUE)
749 st->start_time = pts;
752 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
754 AVPacketList *pktl= s->packet_buffer;
757 if(st->first_dts != AV_NOPTS_VALUE){
758 cur_dts= st->first_dts;
759 for(; pktl; pktl= pktl->next){
760 if(pktl->pkt.stream_index == pkt->stream_index){
761 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
763 cur_dts -= pkt->duration;
766 pktl= s->packet_buffer;
767 st->first_dts = cur_dts;
768 }else if(st->cur_dts)
771 for(; pktl; pktl= pktl->next){
772 if(pktl->pkt.stream_index != pkt->stream_index)
774 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
775 && !pktl->pkt.duration){
776 pktl->pkt.dts= cur_dts;
777 if(!st->codec->has_b_frames)
778 pktl->pkt.pts= cur_dts;
779 cur_dts += pkt->duration;
780 pktl->pkt.duration= pkt->duration;
784 if(st->first_dts == AV_NOPTS_VALUE)
785 st->cur_dts= cur_dts;
788 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
789 AVCodecParserContext *pc, AVPacket *pkt)
791 int num, den, presentation_delayed, delay, i;
794 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == FF_B_TYPE)
795 //FIXME Set low_delay = 0 when has_b_frames = 1
796 st->codec->has_b_frames = 1;
798 /* do we have a video B-frame ? */
799 delay= st->codec->has_b_frames;
800 presentation_delayed = 0;
801 /* XXX: need has_b_frame, but cannot get it if the codec is
804 pc && pc->pict_type != FF_B_TYPE)
805 presentation_delayed = 1;
807 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
808 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
809 pkt->dts -= 1LL<<st->pts_wrap_bits;
812 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
813 // we take the conservative approach and discard both
814 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
815 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
816 av_log(s, AV_LOG_WARNING, "invalid dts/pts combination\n");
817 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
820 if (pkt->duration == 0) {
821 compute_frame_duration(&num, &den, st, pc, pkt);
823 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
825 if(pkt->duration != 0 && s->packet_buffer)
826 update_initial_durations(s, st, pkt);
830 /* correct timestamps with byte offset if demuxers only have timestamps
831 on packet boundaries */
832 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
833 /* this will estimate bitrate based on this frame's duration and size */
834 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
835 if(pkt->pts != AV_NOPTS_VALUE)
837 if(pkt->dts != AV_NOPTS_VALUE)
841 if (pc && pc->dts_sync_point >= 0) {
842 // we have synchronization info from the parser
843 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
845 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
846 if (pkt->dts != AV_NOPTS_VALUE) {
847 // got DTS from the stream, update reference timestamp
848 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
849 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
850 } else if (st->reference_dts != AV_NOPTS_VALUE) {
851 // compute DTS based on reference timestamp
852 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
853 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
855 if (pc->dts_sync_point > 0)
856 st->reference_dts = pkt->dts; // new reference
860 /* This may be redundant, but it should not hurt. */
861 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
862 presentation_delayed = 1;
864 // 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);
865 /* interpolate PTS and DTS if they are not present */
866 //We skip H264 currently because delay and has_b_frames are not reliably set
867 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
868 if (presentation_delayed) {
869 /* DTS = decompression timestamp */
870 /* PTS = presentation timestamp */
871 if (pkt->dts == AV_NOPTS_VALUE)
872 pkt->dts = st->last_IP_pts;
873 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
874 if (pkt->dts == AV_NOPTS_VALUE)
875 pkt->dts = st->cur_dts;
877 /* this is tricky: the dts must be incremented by the duration
878 of the frame we are displaying, i.e. the last I- or P-frame */
879 if (st->last_IP_duration == 0)
880 st->last_IP_duration = pkt->duration;
881 if(pkt->dts != AV_NOPTS_VALUE)
882 st->cur_dts = pkt->dts + st->last_IP_duration;
883 st->last_IP_duration = pkt->duration;
884 st->last_IP_pts= pkt->pts;
885 /* cannot compute PTS if not present (we can compute it only
886 by knowing the future */
887 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
888 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
889 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
890 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
891 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
892 pkt->pts += pkt->duration;
893 // 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);
897 /* presentation is not delayed : PTS and DTS are the same */
898 if(pkt->pts == AV_NOPTS_VALUE)
900 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
901 if(pkt->pts == AV_NOPTS_VALUE)
902 pkt->pts = st->cur_dts;
904 if(pkt->pts != AV_NOPTS_VALUE)
905 st->cur_dts = pkt->pts + pkt->duration;
909 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
910 st->pts_buffer[0]= pkt->pts;
911 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
912 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
913 if(pkt->dts == AV_NOPTS_VALUE)
914 pkt->dts= st->pts_buffer[0];
915 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
916 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
918 if(pkt->dts > st->cur_dts)
919 st->cur_dts = pkt->dts;
922 // 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);
925 if(is_intra_only(st->codec))
926 pkt->flags |= PKT_FLAG_KEY;
929 /* keyframe computation */
930 if (pc->key_frame == 1)
931 pkt->flags |= PKT_FLAG_KEY;
932 else if (pc->key_frame == -1 && pc->pict_type == FF_I_TYPE)
933 pkt->flags |= PKT_FLAG_KEY;
936 pkt->convergence_duration = pc->convergence_duration;
940 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
948 /* select current input stream component */
951 if (!st->need_parsing || !st->parser) {
952 /* no parsing needed: we just output the packet as is */
953 /* raw data support */
954 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
955 compute_pkt_fields(s, st, NULL, pkt);
957 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
958 (pkt->flags & PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
959 ff_reduce_index(s, st->index);
960 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
963 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
964 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
965 st->cur_ptr, st->cur_len,
966 st->cur_pkt.pts, st->cur_pkt.dts,
968 st->cur_pkt.pts = AV_NOPTS_VALUE;
969 st->cur_pkt.dts = AV_NOPTS_VALUE;
970 /* increment read pointer */
974 /* return packet if any */
978 pkt->stream_index = st->index;
979 pkt->pts = st->parser->pts;
980 pkt->dts = st->parser->dts;
981 pkt->pos = st->parser->pos;
982 pkt->destruct = NULL;
983 compute_pkt_fields(s, st, st->parser, pkt);
985 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
986 ff_reduce_index(s, st->index);
987 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
988 0, 0, AVINDEX_KEYFRAME);
995 av_free_packet(&st->cur_pkt);
1000 /* read next packet */
1001 ret = av_read_packet(s, &cur_pkt);
1003 if (ret == AVERROR(EAGAIN))
1005 /* return the last frames, if any */
1006 for(i = 0; i < s->nb_streams; i++) {
1008 if (st->parser && st->need_parsing) {
1009 av_parser_parse2(st->parser, st->codec,
1010 &pkt->data, &pkt->size,
1012 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1018 /* no more packets: really terminate parsing */
1021 st = s->streams[cur_pkt.stream_index];
1022 st->cur_pkt= cur_pkt;
1024 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1025 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1026 st->cur_pkt.pts < st->cur_pkt.dts){
1027 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1028 st->cur_pkt.stream_index,
1032 // av_free_packet(&st->cur_pkt);
1036 if(s->debug & FF_FDEBUG_TS)
1037 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1038 st->cur_pkt.stream_index,
1042 st->cur_pkt.duration,
1046 st->cur_ptr = st->cur_pkt.data;
1047 st->cur_len = st->cur_pkt.size;
1048 if (st->need_parsing && !st->parser) {
1049 st->parser = av_parser_init(st->codec->codec_id);
1051 /* no parser available: just output the raw packets */
1052 st->need_parsing = AVSTREAM_PARSE_NONE;
1053 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1054 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1056 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
1057 st->parser->next_frame_offset=
1058 st->parser->cur_offset= st->cur_pkt.pos;
1063 if(s->debug & FF_FDEBUG_TS)
1064 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1075 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1079 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1082 pktl = s->packet_buffer;
1084 AVPacket *next_pkt= &pktl->pkt;
1086 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1087 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1088 if( pktl->pkt.stream_index == next_pkt->stream_index
1089 && next_pkt->dts < pktl->pkt.dts
1090 && pktl->pkt.pts != pktl->pkt.dts //not b frame
1091 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1092 next_pkt->pts= pktl->pkt.dts;
1096 pktl = s->packet_buffer;
1099 if( next_pkt->pts != AV_NOPTS_VALUE
1100 || next_pkt->dts == AV_NOPTS_VALUE
1102 /* read packet from packet buffer, if there is data */
1104 s->packet_buffer = pktl->next;
1110 int ret= av_read_frame_internal(s, pkt);
1112 if(pktl && ret != AVERROR(EAGAIN)){
1119 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1120 &s->packet_buffer_end)) < 0)
1121 return AVERROR(ENOMEM);
1123 assert(!s->packet_buffer);
1124 return av_read_frame_internal(s, pkt);
1129 /* XXX: suppress the packet queue */
1130 static void flush_packet_queue(AVFormatContext *s)
1135 pktl = s->packet_buffer;
1138 s->packet_buffer = pktl->next;
1139 av_free_packet(&pktl->pkt);
1142 while(s->raw_packet_buffer){
1143 pktl = s->raw_packet_buffer;
1144 s->raw_packet_buffer = pktl->next;
1145 av_free_packet(&pktl->pkt);
1148 s->packet_buffer_end=
1149 s->raw_packet_buffer_end= NULL;
1150 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1153 /*******************************************************/
1156 int av_find_default_stream_index(AVFormatContext *s)
1158 int first_audio_index = -1;
1162 if (s->nb_streams <= 0)
1164 for(i = 0; i < s->nb_streams; i++) {
1166 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1169 if (first_audio_index < 0 && st->codec->codec_type == CODEC_TYPE_AUDIO)
1170 first_audio_index = i;
1172 return first_audio_index >= 0 ? first_audio_index : 0;
1176 * Flush the frame reader.
1178 void av_read_frame_flush(AVFormatContext *s)
1183 flush_packet_queue(s);
1187 /* for each stream, reset read state */
1188 for(i = 0; i < s->nb_streams; i++) {
1192 av_parser_close(st->parser);
1194 av_free_packet(&st->cur_pkt);
1196 st->last_IP_pts = AV_NOPTS_VALUE;
1197 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1198 st->reference_dts = AV_NOPTS_VALUE;
1203 st->probe_packets = MAX_PROBE_PACKETS;
1205 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1206 st->pts_buffer[j]= AV_NOPTS_VALUE;
1210 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1213 for(i = 0; i < s->nb_streams; i++) {
1214 AVStream *st = s->streams[i];
1216 st->cur_dts = av_rescale(timestamp,
1217 st->time_base.den * (int64_t)ref_st->time_base.num,
1218 st->time_base.num * (int64_t)ref_st->time_base.den);
1222 void ff_reduce_index(AVFormatContext *s, int stream_index)
1224 AVStream *st= s->streams[stream_index];
1225 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1227 if((unsigned)st->nb_index_entries >= max_entries){
1229 for(i=0; 2*i<st->nb_index_entries; i++)
1230 st->index_entries[i]= st->index_entries[2*i];
1231 st->nb_index_entries= i;
1235 int av_add_index_entry(AVStream *st,
1236 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1238 AVIndexEntry *entries, *ie;
1241 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1244 entries = av_fast_realloc(st->index_entries,
1245 &st->index_entries_allocated_size,
1246 (st->nb_index_entries + 1) *
1247 sizeof(AVIndexEntry));
1251 st->index_entries= entries;
1253 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1256 index= st->nb_index_entries++;
1257 ie= &entries[index];
1258 assert(index==0 || ie[-1].timestamp < timestamp);
1260 ie= &entries[index];
1261 if(ie->timestamp != timestamp){
1262 if(ie->timestamp <= timestamp)
1264 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1265 st->nb_index_entries++;
1266 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1267 distance= ie->min_distance;
1271 ie->timestamp = timestamp;
1272 ie->min_distance= distance;
1279 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1282 AVIndexEntry *entries= st->index_entries;
1283 int nb_entries= st->nb_index_entries;
1292 timestamp = entries[m].timestamp;
1293 if(timestamp >= wanted_timestamp)
1295 if(timestamp <= wanted_timestamp)
1298 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1300 if(!(flags & AVSEEK_FLAG_ANY)){
1301 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1302 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1313 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1314 AVInputFormat *avif= s->iformat;
1315 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1316 int64_t ts_min, ts_max, ts;
1321 if (stream_index < 0)
1325 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1329 ts_min= AV_NOPTS_VALUE;
1330 pos_limit= -1; //gcc falsely says it may be uninitialized
1332 st= s->streams[stream_index];
1333 if(st->index_entries){
1336 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()
1337 index= FFMAX(index, 0);
1338 e= &st->index_entries[index];
1340 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1342 ts_min= e->timestamp;
1344 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1351 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1352 assert(index < st->nb_index_entries);
1354 e= &st->index_entries[index];
1355 assert(e->timestamp >= target_ts);
1357 ts_max= e->timestamp;
1358 pos_limit= pos_max - e->min_distance;
1360 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1361 pos_max,pos_limit, ts_max);
1366 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1371 if ((ret = url_fseek(s->pb, pos, SEEK_SET)) < 0)
1374 av_update_cur_dts(s, st, ts);
1379 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 )){
1381 int64_t start_pos, filesize;
1385 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1388 if(ts_min == AV_NOPTS_VALUE){
1389 pos_min = s->data_offset;
1390 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1391 if (ts_min == AV_NOPTS_VALUE)
1395 if(ts_max == AV_NOPTS_VALUE){
1397 filesize = url_fsize(s->pb);
1398 pos_max = filesize - 1;
1401 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1403 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1404 if (ts_max == AV_NOPTS_VALUE)
1408 int64_t tmp_pos= pos_max + 1;
1409 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1410 if(tmp_ts == AV_NOPTS_VALUE)
1414 if(tmp_pos >= filesize)
1420 if(ts_min > ts_max){
1422 }else if(ts_min == ts_max){
1427 while (pos_min < pos_limit) {
1429 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1433 assert(pos_limit <= pos_max);
1436 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1437 // interpolate position (better than dichotomy)
1438 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1439 + pos_min - approximate_keyframe_distance;
1440 }else if(no_change==1){
1441 // bisection, if interpolation failed to change min or max pos last time
1442 pos = (pos_min + pos_limit)>>1;
1444 /* linear search if bisection failed, can only happen if there
1445 are very few or no keyframes between min/max */
1450 else if(pos > pos_limit)
1454 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1460 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1461 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit,
1462 start_pos, no_change);
1464 if(ts == AV_NOPTS_VALUE){
1465 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1468 assert(ts != AV_NOPTS_VALUE);
1469 if (target_ts <= ts) {
1470 pos_limit = start_pos - 1;
1474 if (target_ts >= ts) {
1480 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1481 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1484 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1486 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1487 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1488 pos, ts_min, target_ts, ts_max);
1494 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1495 int64_t pos_min, pos_max;
1499 if (stream_index < 0)
1502 st= s->streams[stream_index];
1505 pos_min = s->data_offset;
1506 pos_max = url_fsize(s->pb) - 1;
1508 if (pos < pos_min) pos= pos_min;
1509 else if(pos > pos_max) pos= pos_max;
1511 url_fseek(s->pb, pos, SEEK_SET);
1514 av_update_cur_dts(s, st, ts);
1519 static int av_seek_frame_generic(AVFormatContext *s,
1520 int stream_index, int64_t timestamp, int flags)
1527 st = s->streams[stream_index];
1529 index = av_index_search_timestamp(st, timestamp, flags);
1531 if(index < 0 || index==st->nb_index_entries-1){
1535 if(st->nb_index_entries){
1536 assert(st->index_entries);
1537 ie= &st->index_entries[st->nb_index_entries-1];
1538 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1540 av_update_cur_dts(s, st, ie->timestamp);
1542 if ((ret = url_fseek(s->pb, s->data_offset, SEEK_SET)) < 0)
1548 ret = av_read_frame(s, &pkt);
1549 }while(ret == AVERROR(EAGAIN));
1552 av_free_packet(&pkt);
1553 if(stream_index == pkt.stream_index){
1554 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1558 index = av_index_search_timestamp(st, timestamp, flags);
1563 av_read_frame_flush(s);
1564 if (s->iformat->read_seek){
1565 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1568 ie = &st->index_entries[index];
1569 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1571 av_update_cur_dts(s, st, ie->timestamp);
1576 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1581 av_read_frame_flush(s);
1583 if(flags & AVSEEK_FLAG_BYTE)
1584 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1586 if(stream_index < 0){
1587 stream_index= av_find_default_stream_index(s);
1588 if(stream_index < 0)
1591 st= s->streams[stream_index];
1592 /* timestamp for default must be expressed in AV_TIME_BASE units */
1593 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1596 /* first, we try the format specific seek */
1597 if (s->iformat->read_seek)
1598 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1605 if(s->iformat->read_timestamp)
1606 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1608 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1611 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1613 if(min_ts > ts || max_ts < ts)
1616 av_read_frame_flush(s);
1618 if (s->iformat->read_seek2)
1619 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1621 if(s->iformat->read_timestamp){
1622 //try to seek via read_timestamp()
1625 //Fallback to old API if new is not implemented but old is
1626 //Note the old has somewat different sematics
1627 if(s->iformat->read_seek || 1)
1628 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1630 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1633 /*******************************************************/
1636 * Returns TRUE if the stream has accurate duration in any stream.
1638 * @return TRUE if the stream has accurate duration for at least one component.
1640 static int av_has_duration(AVFormatContext *ic)
1645 for(i = 0;i < ic->nb_streams; i++) {
1646 st = ic->streams[i];
1647 if (st->duration != AV_NOPTS_VALUE)
1654 * Estimate the stream timings from the one of each components.
1656 * Also computes the global bitrate if possible.
1658 static void av_update_stream_timings(AVFormatContext *ic)
1660 int64_t start_time, start_time1, end_time, end_time1;
1661 int64_t duration, duration1;
1665 start_time = INT64_MAX;
1666 end_time = INT64_MIN;
1667 duration = INT64_MIN;
1668 for(i = 0;i < ic->nb_streams; i++) {
1669 st = ic->streams[i];
1670 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1671 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1672 if (start_time1 < start_time)
1673 start_time = start_time1;
1674 if (st->duration != AV_NOPTS_VALUE) {
1675 end_time1 = start_time1
1676 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1677 if (end_time1 > end_time)
1678 end_time = end_time1;
1681 if (st->duration != AV_NOPTS_VALUE) {
1682 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1683 if (duration1 > duration)
1684 duration = duration1;
1687 if (start_time != INT64_MAX) {
1688 ic->start_time = start_time;
1689 if (end_time != INT64_MIN) {
1690 if (end_time - start_time > duration)
1691 duration = end_time - start_time;
1694 if (duration != INT64_MIN) {
1695 ic->duration = duration;
1696 if (ic->file_size > 0) {
1697 /* compute the bitrate */
1698 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1699 (double)ic->duration;
1704 static void fill_all_stream_timings(AVFormatContext *ic)
1709 av_update_stream_timings(ic);
1710 for(i = 0;i < ic->nb_streams; i++) {
1711 st = ic->streams[i];
1712 if (st->start_time == AV_NOPTS_VALUE) {
1713 if(ic->start_time != AV_NOPTS_VALUE)
1714 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1715 if(ic->duration != AV_NOPTS_VALUE)
1716 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1721 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1723 int64_t filesize, duration;
1727 /* if bit_rate is already set, we believe it */
1728 if (ic->bit_rate == 0) {
1730 for(i=0;i<ic->nb_streams;i++) {
1731 st = ic->streams[i];
1732 bit_rate += st->codec->bit_rate;
1734 ic->bit_rate = bit_rate;
1737 /* if duration is already set, we believe it */
1738 if (ic->duration == AV_NOPTS_VALUE &&
1739 ic->bit_rate != 0 &&
1740 ic->file_size != 0) {
1741 filesize = ic->file_size;
1743 for(i = 0; i < ic->nb_streams; i++) {
1744 st = ic->streams[i];
1745 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1746 if (st->duration == AV_NOPTS_VALUE)
1747 st->duration = duration;
1753 #define DURATION_MAX_READ_SIZE 250000
1755 /* only usable for MPEG-PS streams */
1756 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1758 AVPacket pkt1, *pkt = &pkt1;
1760 int read_size, i, ret;
1761 int64_t end_time, start_time[MAX_STREAMS];
1762 int64_t filesize, offset, duration;
1766 /* flush packet queue */
1767 flush_packet_queue(ic);
1769 for(i=0;i<ic->nb_streams;i++) {
1770 st = ic->streams[i];
1771 if(st->start_time != AV_NOPTS_VALUE){
1772 start_time[i]= st->start_time;
1773 }else if(st->first_dts != AV_NOPTS_VALUE){
1774 start_time[i]= st->first_dts;
1776 av_log(st->codec, AV_LOG_WARNING, "start time is not set in av_estimate_timings_from_pts\n");
1779 av_parser_close(st->parser);
1781 av_free_packet(&st->cur_pkt);
1785 /* estimate the end time (duration) */
1786 /* XXX: may need to support wrapping */
1787 filesize = ic->file_size;
1788 offset = filesize - DURATION_MAX_READ_SIZE;
1792 url_fseek(ic->pb, offset, SEEK_SET);
1795 if (read_size >= DURATION_MAX_READ_SIZE)
1799 ret = av_read_packet(ic, pkt);
1800 }while(ret == AVERROR(EAGAIN));
1803 read_size += pkt->size;
1804 st = ic->streams[pkt->stream_index];
1805 if (pkt->pts != AV_NOPTS_VALUE &&
1806 start_time[pkt->stream_index] != AV_NOPTS_VALUE) {
1807 end_time = pkt->pts;
1808 duration = end_time - start_time[pkt->stream_index];
1810 if (st->duration == AV_NOPTS_VALUE ||
1811 st->duration < duration)
1812 st->duration = duration;
1815 av_free_packet(pkt);
1818 fill_all_stream_timings(ic);
1820 url_fseek(ic->pb, old_offset, SEEK_SET);
1821 for(i=0; i<ic->nb_streams; i++){
1823 st->cur_dts= st->first_dts;
1824 st->last_IP_pts = AV_NOPTS_VALUE;
1828 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
1832 /* get the file size, if possible */
1833 if (ic->iformat->flags & AVFMT_NOFILE) {
1836 file_size = url_fsize(ic->pb);
1840 ic->file_size = file_size;
1842 if ((!strcmp(ic->iformat->name, "mpeg") ||
1843 !strcmp(ic->iformat->name, "mpegts")) &&
1844 file_size && !url_is_streamed(ic->pb)) {
1845 /* get accurate estimate from the PTSes */
1846 av_estimate_timings_from_pts(ic, old_offset);
1847 } else if (av_has_duration(ic)) {
1848 /* at least one component has timings - we use them for all
1850 fill_all_stream_timings(ic);
1852 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
1853 /* less precise: use bitrate info */
1854 av_estimate_timings_from_bit_rate(ic);
1856 av_update_stream_timings(ic);
1862 for(i = 0;i < ic->nb_streams; i++) {
1863 st = ic->streams[i];
1864 printf("%d: start_time: %0.3f duration: %0.3f\n",
1865 i, (double)st->start_time / AV_TIME_BASE,
1866 (double)st->duration / AV_TIME_BASE);
1868 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1869 (double)ic->start_time / AV_TIME_BASE,
1870 (double)ic->duration / AV_TIME_BASE,
1871 ic->bit_rate / 1000);
1876 static int has_codec_parameters(AVCodecContext *enc)
1879 switch(enc->codec_type) {
1880 case CODEC_TYPE_AUDIO:
1881 val = enc->sample_rate && enc->channels && enc->sample_fmt != SAMPLE_FMT_NONE;
1882 if(!enc->frame_size &&
1883 (enc->codec_id == CODEC_ID_VORBIS ||
1884 enc->codec_id == CODEC_ID_AAC ||
1885 enc->codec_id == CODEC_ID_MP3 ||
1886 enc->codec_id == CODEC_ID_SPEEX))
1889 case CODEC_TYPE_VIDEO:
1890 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1896 return enc->codec_id != CODEC_ID_NONE && val != 0;
1899 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
1903 int got_picture, data_size, ret=0;
1906 if(!st->codec->codec){
1907 codec = avcodec_find_decoder(st->codec->codec_id);
1910 ret = avcodec_open(st->codec, codec);
1915 if(!has_codec_parameters(st->codec)){
1916 switch(st->codec->codec_type) {
1917 case CODEC_TYPE_VIDEO:
1918 avcodec_get_frame_defaults(&picture);
1919 ret = avcodec_decode_video2(st->codec, &picture,
1920 &got_picture, avpkt);
1922 case CODEC_TYPE_AUDIO:
1923 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1924 samples = av_malloc(data_size);
1927 ret = avcodec_decode_audio3(st->codec, samples,
1939 unsigned int ff_codec_get_tag(const AVCodecTag *tags, int id)
1941 while (tags->id != CODEC_ID_NONE) {
1949 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
1952 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1953 if(tag == tags[i].tag)
1956 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1957 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1958 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1959 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1960 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1963 return CODEC_ID_NONE;
1966 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
1969 for(i=0; tags && tags[i]; i++){
1970 int tag= ff_codec_get_tag(tags[i], id);
1976 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
1979 for(i=0; tags && tags[i]; i++){
1980 enum CodecID id= ff_codec_get_id(tags[i], tag);
1981 if(id!=CODEC_ID_NONE) return id;
1983 return CODEC_ID_NONE;
1986 static void compute_chapters_end(AVFormatContext *s)
1990 for (i=0; i+1<s->nb_chapters; i++)
1991 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
1992 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
1993 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
1994 s->chapters[i]->end = s->chapters[i+1]->start;
1997 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
1998 assert(s->start_time != AV_NOPTS_VALUE);
1999 assert(s->duration > 0);
2000 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
2002 s->chapters[i]->time_base);
2006 #define MAX_STD_TIMEBASES (60*12+5)
2007 static int get_std_framerate(int i){
2008 if(i<60*12) return i*1001;
2009 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2013 * Is the time base unreliable.
2014 * This is a heuristic to balance between quick acceptance of the values in
2015 * the headers vs. some extra checks.
2016 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2017 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2018 * And there are "variable" fps files this needs to detect as well.
2020 static int tb_unreliable(AVCodecContext *c){
2021 if( c->time_base.den >= 101L*c->time_base.num
2022 || c->time_base.den < 5L*c->time_base.num
2023 /* || c->codec_tag == AV_RL32("DIVX")
2024 || c->codec_tag == AV_RL32("XVID")*/
2025 || c->codec_id == CODEC_ID_MPEG2VIDEO
2026 || c->codec_id == CODEC_ID_H264
2032 int av_find_stream_info(AVFormatContext *ic)
2034 int i, count, ret, read_size, j;
2036 AVPacket pkt1, *pkt;
2037 int64_t last_dts[MAX_STREAMS];
2038 int64_t duration_gcd[MAX_STREAMS]={0};
2039 int duration_count[MAX_STREAMS]={0};
2040 double (*duration_error)[MAX_STD_TIMEBASES];
2041 int64_t old_offset = url_ftell(ic->pb);
2042 int64_t codec_info_duration[MAX_STREAMS]={0};
2043 int codec_info_nb_frames[MAX_STREAMS]={0};
2045 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
2046 if (!duration_error) return AVERROR(ENOMEM);
2048 for(i=0;i<ic->nb_streams;i++) {
2049 st = ic->streams[i];
2050 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2051 /* if(!st->time_base.num)
2053 if(!st->codec->time_base.num)
2054 st->codec->time_base= st->time_base;
2056 //only for the split stuff
2058 st->parser = av_parser_init(st->codec->codec_id);
2059 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2060 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2065 for(i=0;i<MAX_STREAMS;i++){
2066 last_dts[i]= AV_NOPTS_VALUE;
2072 if(url_interrupt_cb()){
2073 ret= AVERROR(EINTR);
2074 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2078 /* check if one codec still needs to be handled */
2079 for(i=0;i<ic->nb_streams;i++) {
2080 st = ic->streams[i];
2081 if (!has_codec_parameters(st->codec))
2083 /* variable fps and no guess at the real fps */
2084 if( tb_unreliable(st->codec)
2085 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
2087 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2089 if(st->first_dts == AV_NOPTS_VALUE)
2092 if (i == ic->nb_streams) {
2093 /* NOTE: if the format has no header, then we need to read
2094 some packets to get most of the streams, so we cannot
2096 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2097 /* if we found the info for all the codecs, we can stop */
2099 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2103 /* we did not get all the codec info, but we read too much data */
2104 if (read_size >= ic->probesize) {
2106 av_log(ic, AV_LOG_WARNING, "MAX_READ_SIZE:%d reached\n", ic->probesize);
2110 /* NOTE: a new stream can be added there if no header in file
2111 (AVFMTCTX_NOHEADER) */
2112 ret = av_read_frame_internal(ic, &pkt1);
2113 if(ret == AVERROR(EAGAIN))
2117 ret = -1; /* we could not have all the codec parameters before EOF */
2118 for(i=0;i<ic->nb_streams;i++) {
2119 st = ic->streams[i];
2120 if (!has_codec_parameters(st->codec)){
2122 avcodec_string(buf, sizeof(buf), st->codec, 0);
2123 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2131 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2132 if(av_dup_packet(pkt) < 0) {
2133 av_free(duration_error);
2134 return AVERROR(ENOMEM);
2137 read_size += pkt->size;
2139 st = ic->streams[pkt->stream_index];
2140 if(codec_info_nb_frames[st->index]>1) {
2141 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){
2142 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2145 codec_info_duration[st->index] += pkt->duration;
2147 if (pkt->duration != 0)
2148 codec_info_nb_frames[st->index]++;
2151 int index= pkt->stream_index;
2152 int64_t last= last_dts[index];
2153 int64_t duration= pkt->dts - last;
2155 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2156 double dur= duration * av_q2d(st->time_base);
2158 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2159 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2160 if(duration_count[index] < 2)
2161 memset(duration_error[index], 0, sizeof(*duration_error));
2162 for(i=1; i<MAX_STD_TIMEBASES; i++){
2163 int framerate= get_std_framerate(i);
2164 int ticks= lrintf(dur*framerate/(1001*12));
2165 double error= dur - ticks*1001*12/(double)framerate;
2166 duration_error[index][i] += error*error;
2168 duration_count[index]++;
2169 // ignore the first 4 values, they might have some random jitter
2170 if (duration_count[index] > 3)
2171 duration_gcd[index] = av_gcd(duration_gcd[index], duration);
2173 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
2174 last_dts[pkt->stream_index]= pkt->dts;
2176 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2177 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2179 st->codec->extradata_size= i;
2180 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2181 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2182 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2186 /* if still no information, we try to open the codec and to
2187 decompress the frame. We try to avoid that in most cases as
2188 it takes longer and uses more memory. For MPEG-4, we need to
2189 decompress for QuickTime. */
2190 if (!has_codec_parameters(st->codec))
2191 try_decode_frame(st, pkt);
2196 // close codecs which were opened in try_decode_frame()
2197 for(i=0;i<ic->nb_streams;i++) {
2198 st = ic->streams[i];
2199 if(st->codec->codec)
2200 avcodec_close(st->codec);
2202 for(i=0;i<ic->nb_streams;i++) {
2203 st = ic->streams[i];
2204 if(codec_info_nb_frames[i]>2)
2205 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2206 (codec_info_nb_frames[i]-2)*(int64_t)st->time_base.den,
2207 codec_info_duration[i] *(int64_t)st->time_base.num, 60000);
2208 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2209 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
2210 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2212 // the check for tb_unreliable() is not completely correct, since this is not about handling
2213 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2214 // ipmovie.c produces.
2215 if (tb_unreliable(st->codec) && duration_count[i] > 15 && duration_gcd[i] > 1)
2216 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);
2217 if(duration_count[i]
2218 && tb_unreliable(st->codec) /*&&
2219 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2220 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2222 double best_error= 2*av_q2d(st->time_base);
2223 best_error= best_error*best_error*duration_count[i]*1000*12*30;
2225 for(j=1; j<MAX_STD_TIMEBASES; j++){
2226 double error= duration_error[i][j] * get_std_framerate(j);
2227 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2228 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2229 if(error < best_error){
2231 num = get_std_framerate(j);
2234 // do not increase frame rate by more than 1 % in order to match a standard rate.
2235 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2236 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2239 if (!st->r_frame_rate.num){
2240 if( st->codec->time_base.den * (int64_t)st->time_base.num
2241 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2242 st->r_frame_rate.num = st->codec->time_base.den;
2243 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2245 st->r_frame_rate.num = st->time_base.den;
2246 st->r_frame_rate.den = st->time_base.num;
2249 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
2250 if(!st->codec->bits_per_coded_sample)
2251 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2255 av_estimate_timings(ic, old_offset);
2257 compute_chapters_end(ic);
2260 /* correct DTS for B-frame streams with no timestamps */
2261 for(i=0;i<ic->nb_streams;i++) {
2262 st = ic->streams[i];
2263 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2265 ppktl = &ic->packet_buffer;
2267 if(ppkt1->stream_index != i)
2269 if(ppkt1->pkt->dts < 0)
2271 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2273 ppkt1->pkt->dts -= delta;
2278 st->cur_dts -= delta;
2284 av_free(duration_error);
2289 /*******************************************************/
2291 int av_read_play(AVFormatContext *s)
2293 if (s->iformat->read_play)
2294 return s->iformat->read_play(s);
2296 return av_url_read_fpause(s->pb, 0);
2297 return AVERROR(ENOSYS);
2300 int av_read_pause(AVFormatContext *s)
2302 if (s->iformat->read_pause)
2303 return s->iformat->read_pause(s);
2305 return av_url_read_fpause(s->pb, 1);
2306 return AVERROR(ENOSYS);
2309 void av_close_input_stream(AVFormatContext *s)
2314 if (s->iformat->read_close)
2315 s->iformat->read_close(s);
2316 for(i=0;i<s->nb_streams;i++) {
2317 /* free all data in a stream component */
2320 av_parser_close(st->parser);
2321 av_free_packet(&st->cur_pkt);
2323 av_metadata_free(&st->metadata);
2324 av_free(st->index_entries);
2325 av_free(st->codec->extradata);
2327 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2328 av_free(st->filename);
2330 av_free(st->priv_data);
2333 for(i=s->nb_programs-1; i>=0; i--) {
2334 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2335 av_freep(&s->programs[i]->provider_name);
2336 av_freep(&s->programs[i]->name);
2338 av_metadata_free(&s->programs[i]->metadata);
2339 av_freep(&s->programs[i]->stream_index);
2340 av_freep(&s->programs[i]);
2342 av_freep(&s->programs);
2343 flush_packet_queue(s);
2344 av_freep(&s->priv_data);
2345 while(s->nb_chapters--) {
2346 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2347 av_free(s->chapters[s->nb_chapters]->title);
2349 av_metadata_free(&s->chapters[s->nb_chapters]->metadata);
2350 av_free(s->chapters[s->nb_chapters]);
2352 av_freep(&s->chapters);
2353 av_metadata_free(&s->metadata);
2357 void av_close_input_file(AVFormatContext *s)
2359 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2360 av_close_input_stream(s);
2365 AVStream *av_new_stream(AVFormatContext *s, int id)
2370 if (s->nb_streams >= MAX_STREAMS)
2373 st = av_mallocz(sizeof(AVStream));
2377 st->codec= avcodec_alloc_context();
2379 /* no default bitrate if decoding */
2380 st->codec->bit_rate = 0;
2382 st->index = s->nb_streams;
2384 st->start_time = AV_NOPTS_VALUE;
2385 st->duration = AV_NOPTS_VALUE;
2386 /* we set the current DTS to 0 so that formats without any timestamps
2387 but durations get some timestamps, formats with some unknown
2388 timestamps have their first few packets buffered and the
2389 timestamps corrected before they are returned to the user */
2391 st->first_dts = AV_NOPTS_VALUE;
2392 st->probe_packets = MAX_PROBE_PACKETS;
2394 /* default pts setting is MPEG-like */
2395 av_set_pts_info(st, 33, 1, 90000);
2396 st->last_IP_pts = AV_NOPTS_VALUE;
2397 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2398 st->pts_buffer[i]= AV_NOPTS_VALUE;
2399 st->reference_dts = AV_NOPTS_VALUE;
2401 st->sample_aspect_ratio = (AVRational){0,1};
2403 s->streams[s->nb_streams++] = st;
2407 AVProgram *av_new_program(AVFormatContext *ac, int id)
2409 AVProgram *program=NULL;
2413 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2416 for(i=0; i<ac->nb_programs; i++)
2417 if(ac->programs[i]->id == id)
2418 program = ac->programs[i];
2421 program = av_mallocz(sizeof(AVProgram));
2424 dynarray_add(&ac->programs, &ac->nb_programs, program);
2425 program->discard = AVDISCARD_NONE;
2432 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2434 AVChapter *chapter = NULL;
2437 for(i=0; i<s->nb_chapters; i++)
2438 if(s->chapters[i]->id == id)
2439 chapter = s->chapters[i];
2442 chapter= av_mallocz(sizeof(AVChapter));
2445 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2447 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2448 av_free(chapter->title);
2450 av_metadata_set(&chapter->metadata, "title", title);
2452 chapter->time_base= time_base;
2453 chapter->start = start;
2459 /************************************************************/
2460 /* output media file */
2462 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2466 if (s->oformat->priv_data_size > 0) {
2467 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2469 return AVERROR(ENOMEM);
2471 s->priv_data = NULL;
2473 if (s->oformat->set_parameters) {
2474 ret = s->oformat->set_parameters(s, ap);
2481 int av_write_header(AVFormatContext *s)
2486 // some sanity checks
2487 for(i=0;i<s->nb_streams;i++) {
2490 switch (st->codec->codec_type) {
2491 case CODEC_TYPE_AUDIO:
2492 if(st->codec->sample_rate<=0){
2493 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2496 if(!st->codec->block_align)
2497 st->codec->block_align = st->codec->channels *
2498 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2500 case CODEC_TYPE_VIDEO:
2501 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2502 av_log(s, AV_LOG_ERROR, "time base not set\n");
2505 if(st->codec->width<=0 || st->codec->height<=0){
2506 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2509 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2510 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2516 if(s->oformat->codec_tag){
2517 if(st->codec->codec_tag){
2519 //check that tag + id is in the table
2520 //if neither is in the table -> OK
2521 //if tag is in the table with another id -> FAIL
2522 //if id is in the table with another tag -> FAIL unless strict < ?
2524 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2527 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2528 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2529 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2532 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2533 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2535 return AVERROR(ENOMEM);
2538 #if LIBAVFORMAT_VERSION_MAJOR < 53
2539 ff_metadata_mux_compat(s);
2542 if(s->oformat->write_header){
2543 ret = s->oformat->write_header(s);
2548 /* init PTS generation */
2549 for(i=0;i<s->nb_streams;i++) {
2550 int64_t den = AV_NOPTS_VALUE;
2553 switch (st->codec->codec_type) {
2554 case CODEC_TYPE_AUDIO:
2555 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2557 case CODEC_TYPE_VIDEO:
2558 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2563 if (den != AV_NOPTS_VALUE) {
2565 return AVERROR_INVALIDDATA;
2566 av_frac_init(&st->pts, 0, 0, den);
2572 //FIXME merge with compute_pkt_fields
2573 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
2574 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2575 int num, den, frame_size, i;
2577 // 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);
2579 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2582 /* duration field */
2583 if (pkt->duration == 0) {
2584 compute_frame_duration(&num, &den, st, NULL, pkt);
2586 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2590 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2593 //XXX/FIXME this is a temporary hack until all encoders output pts
2594 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2596 // pkt->pts= st->cur_dts;
2597 pkt->pts= st->pts.val;
2600 //calculate dts from pts
2601 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2602 st->pts_buffer[0]= pkt->pts;
2603 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2604 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2605 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2606 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2608 pkt->dts= st->pts_buffer[0];
2611 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2612 av_log(s, AV_LOG_ERROR,
2613 "st:%d error, non monotone timestamps %"PRId64" >= %"PRId64"\n",
2614 st->index, st->cur_dts, pkt->dts);
2617 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2618 av_log(s, AV_LOG_ERROR, "st:%d error, pts < dts\n", st->index);
2622 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2623 st->cur_dts= pkt->dts;
2624 st->pts.val= pkt->dts;
2627 switch (st->codec->codec_type) {
2628 case CODEC_TYPE_AUDIO:
2629 frame_size = get_audio_frame_size(st->codec, pkt->size);
2631 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2632 likely equal to the encoder delay, but it would be better if we
2633 had the real timestamps from the encoder */
2634 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2635 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2638 case CODEC_TYPE_VIDEO:
2639 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2647 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2649 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
2651 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2654 ret= s->oformat->write_packet(s, pkt);
2656 ret= url_ferror(s->pb);
2660 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
2661 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
2663 AVPacketList **next_point, *this_pktl;
2665 this_pktl = av_mallocz(sizeof(AVPacketList));
2666 this_pktl->pkt= *pkt;
2667 pkt->destruct= NULL; // do not free original but only the copy
2668 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
2670 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
2671 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
2673 next_point = &s->packet_buffer;
2676 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
2677 while(!compare(s, &(*next_point)->pkt, pkt)){
2678 next_point= &(*next_point)->next;
2682 next_point = &(s->packet_buffer_end->next);
2685 assert(!*next_point);
2687 s->packet_buffer_end= this_pktl;
2690 this_pktl->next= *next_point;
2692 s->streams[pkt->stream_index]->last_in_packet_buffer=
2693 *next_point= this_pktl;
2696 int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
2698 AVStream *st = s->streams[ pkt ->stream_index];
2699 AVStream *st2= s->streams[ next->stream_index];
2700 int64_t left = st2->time_base.num * (int64_t)st ->time_base.den;
2701 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2703 if (pkt->dts == AV_NOPTS_VALUE)
2706 return next->dts * left > pkt->dts * right; //FIXME this can overflow
2709 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2715 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
2718 for(i=0; i < s->nb_streams; i++)
2719 stream_count+= !!s->streams[i]->last_in_packet_buffer;
2721 if(stream_count && (s->nb_streams == stream_count || flush)){
2722 pktl= s->packet_buffer;
2725 s->packet_buffer= pktl->next;
2726 if(!s->packet_buffer)
2727 s->packet_buffer_end= NULL;
2729 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
2730 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
2734 av_init_packet(out);
2740 * Interleaves an AVPacket correctly so it can be muxed.
2741 * @param out the interleaved packet will be output here
2742 * @param in the input packet
2743 * @param flush 1 if no further packets are available as input and all
2744 * remaining packets should be output
2745 * @return 1 if a packet was output, 0 if no packet could be output,
2746 * < 0 if an error occurred
2748 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2749 if(s->oformat->interleave_packet)
2750 return s->oformat->interleave_packet(s, out, in, flush);
2752 return av_interleave_packet_per_dts(s, out, in, flush);
2755 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2756 AVStream *st= s->streams[ pkt->stream_index];
2758 //FIXME/XXX/HACK drop zero sized packets
2759 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2762 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2763 if(compute_pkt_fields2(s, st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2766 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2771 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2772 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2775 ret= s->oformat->write_packet(s, &opkt);
2777 av_free_packet(&opkt);
2782 if(url_ferror(s->pb))
2783 return url_ferror(s->pb);
2787 int av_write_trailer(AVFormatContext *s)
2793 ret= av_interleave_packet(s, &pkt, NULL, 1);
2794 if(ret<0) //FIXME cleanup needed for ret<0 ?
2799 ret= s->oformat->write_packet(s, &pkt);
2801 av_free_packet(&pkt);
2805 if(url_ferror(s->pb))
2809 if(s->oformat->write_trailer)
2810 ret = s->oformat->write_trailer(s);
2813 ret=url_ferror(s->pb);
2814 for(i=0;i<s->nb_streams;i++)
2815 av_freep(&s->streams[i]->priv_data);
2816 av_freep(&s->priv_data);
2820 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2823 AVProgram *program=NULL;
2826 if (idx >= ac->nb_streams) {
2827 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
2831 for(i=0; i<ac->nb_programs; i++){
2832 if(ac->programs[i]->id != progid)
2834 program = ac->programs[i];
2835 for(j=0; j<program->nb_stream_indexes; j++)
2836 if(program->stream_index[j] == idx)
2839 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2842 program->stream_index = tmp;
2843 program->stream_index[program->nb_stream_indexes++] = idx;
2848 static void print_fps(double d, const char *postfix){
2849 uint64_t v= lrintf(d*100);
2850 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
2851 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
2852 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
2855 static void dump_metadata(void *ctx, AVMetadata *m, const char *indent)
2857 if(m && !(m->count == 1 && av_metadata_get(m, "language", NULL, 0))){
2858 AVMetadataTag *tag=NULL;
2860 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
2861 while((tag=av_metadata_get(m, "", tag, AV_METADATA_IGNORE_SUFFIX))) {
2862 if(strcmp("language", tag->key))
2863 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
2868 /* "user interface" functions */
2869 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2872 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2873 AVStream *st = ic->streams[i];
2874 int g = av_gcd(st->time_base.num, st->time_base.den);
2875 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0);
2876 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2877 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2878 /* the pid is an important information, so we display it */
2879 /* XXX: add a generic system */
2880 if (flags & AVFMT_SHOW_IDS)
2881 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2883 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
2884 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2885 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2886 if (st->sample_aspect_ratio.num && // default
2887 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
2888 AVRational display_aspect_ratio;
2889 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
2890 st->codec->width*st->sample_aspect_ratio.num,
2891 st->codec->height*st->sample_aspect_ratio.den,
2893 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
2894 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
2895 display_aspect_ratio.num, display_aspect_ratio.den);
2897 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2898 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
2899 print_fps(av_q2d(st->avg_frame_rate), "fps");
2900 if(st->r_frame_rate.den && st->r_frame_rate.num)
2901 print_fps(av_q2d(st->r_frame_rate), "tbr");
2902 if(st->time_base.den && st->time_base.num)
2903 print_fps(1/av_q2d(st->time_base), "tbn");
2904 if(st->codec->time_base.den && st->codec->time_base.num)
2905 print_fps(1/av_q2d(st->codec->time_base), "tbc");
2907 av_log(NULL, AV_LOG_INFO, "\n");
2908 dump_metadata(NULL, st->metadata, " ");
2911 void dump_format(AVFormatContext *ic,
2917 uint8_t *printed = av_mallocz(ic->nb_streams);
2918 if (ic->nb_streams && !printed)
2921 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2922 is_output ? "Output" : "Input",
2924 is_output ? ic->oformat->name : ic->iformat->name,
2925 is_output ? "to" : "from", url);
2926 dump_metadata(NULL, ic->metadata, " ");
2928 av_log(NULL, AV_LOG_INFO, " Duration: ");
2929 if (ic->duration != AV_NOPTS_VALUE) {
2930 int hours, mins, secs, us;
2931 secs = ic->duration / AV_TIME_BASE;
2932 us = ic->duration % AV_TIME_BASE;
2937 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
2938 (100 * us) / AV_TIME_BASE);
2940 av_log(NULL, AV_LOG_INFO, "N/A");
2942 if (ic->start_time != AV_NOPTS_VALUE) {
2944 av_log(NULL, AV_LOG_INFO, ", start: ");
2945 secs = ic->start_time / AV_TIME_BASE;
2946 us = ic->start_time % AV_TIME_BASE;
2947 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2948 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2950 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2952 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2954 av_log(NULL, AV_LOG_INFO, "N/A");
2956 av_log(NULL, AV_LOG_INFO, "\n");
2958 if(ic->nb_programs) {
2959 int j, k, total = 0;
2960 for(j=0; j<ic->nb_programs; j++) {
2961 AVMetadataTag *name = av_metadata_get(ic->programs[j]->metadata,
2963 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2964 name ? name->value : "");
2965 dump_metadata(NULL, ic->programs[j]->metadata, " ");
2966 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
2967 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2968 printed[ic->programs[j]->stream_index[k]] = 1;
2970 total += ic->programs[j]->nb_stream_indexes;
2972 if (total < ic->nb_streams)
2973 av_log(NULL, AV_LOG_INFO, " No Program\n");
2975 for(i=0;i<ic->nb_streams;i++)
2977 dump_stream_format(ic, i, index, is_output);
2982 #if LIBAVFORMAT_VERSION_MAJOR < 53
2983 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2985 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2988 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2990 AVRational frame_rate;
2991 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2992 *frame_rate_num= frame_rate.num;
2993 *frame_rate_den= frame_rate.den;
2998 int64_t av_gettime(void)
3001 gettimeofday(&tv,NULL);
3002 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3005 int64_t parse_date(const char *datestr, int duration)
3011 static const char * const date_fmt[] = {
3015 static const char * const time_fmt[] = {
3025 time_t now = time(0);
3027 len = strlen(datestr);
3029 lastch = datestr[len - 1];
3032 is_utc = (lastch == 'z' || lastch == 'Z');
3034 memset(&dt, 0, sizeof(dt));
3039 if (!strncasecmp(datestr, "now", len))
3040 return (int64_t) now * 1000000;
3042 /* parse the year-month-day part */
3043 for (i = 0; i < FF_ARRAY_ELEMS(date_fmt); i++) {
3044 q = small_strptime(p, date_fmt[i], &dt);
3050 /* if the year-month-day part is missing, then take the
3051 * current year-month-day time */
3056 dt = *localtime(&now);
3058 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
3063 if (*p == 'T' || *p == 't' || *p == ' ')
3066 /* parse the hour-minute-second part */
3067 for (i = 0; i < FF_ARRAY_ELEMS(time_fmt); i++) {
3068 q = small_strptime(p, time_fmt[i], &dt);
3074 /* parse datestr as a duration */
3079 /* parse datestr as HH:MM:SS */
3080 q = small_strptime(p, time_fmt[0], &dt);
3082 /* parse datestr as S+ */
3083 dt.tm_sec = strtol(p, (char **)&q, 10);
3085 /* the parsing didn't succeed */
3092 /* Now we have all the fields that we can get */
3098 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
3100 dt.tm_isdst = -1; /* unknown */
3110 /* parse the .m... part */
3114 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
3117 val += n * (*q - '0');
3121 return negative ? -t : t;
3124 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3134 while (*p != '\0' && *p != '=' && *p != '&') {
3135 if ((q - tag) < sizeof(tag) - 1)
3143 while (*p != '&' && *p != '\0') {
3144 if ((q - arg) < arg_size - 1) {
3154 if (!strcmp(tag, tag1))
3163 int av_get_frame_filename(char *buf, int buf_size,
3164 const char *path, int number)
3167 char *q, buf1[20], c;
3168 int nd, len, percentd_found;
3180 while (isdigit(*p)) {
3181 nd = nd * 10 + *p++ - '0';
3184 } while (isdigit(c));
3193 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3195 if ((q - buf + len) > buf_size - 1)
3197 memcpy(q, buf1, len);
3205 if ((q - buf) < buf_size - 1)
3209 if (!percentd_found)
3218 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3222 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3224 for(i=0;i<size;i+=16) {
3231 PRINT(" %02x", buf[i+j]);
3236 for(j=0;j<len;j++) {
3238 if (c < ' ' || c > '~')
3247 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3249 hex_dump_internal(NULL, f, 0, buf, size);
3252 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3254 hex_dump_internal(avcl, NULL, level, buf, size);
3257 //FIXME needs to know the time_base
3258 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
3261 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3262 PRINT("stream #%d:\n", pkt->stream_index);
3263 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3264 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3265 /* DTS is _always_ valid after av_read_frame() */
3267 if (pkt->dts == AV_NOPTS_VALUE)
3270 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
3271 /* PTS may not be known if B-frames are present. */
3273 if (pkt->pts == AV_NOPTS_VALUE)
3276 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
3278 PRINT(" size=%d\n", pkt->size);
3281 av_hex_dump(f, pkt->data, pkt->size);
3284 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3286 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
3289 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3291 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
3294 void url_split(char *proto, int proto_size,
3295 char *authorization, int authorization_size,
3296 char *hostname, int hostname_size,
3298 char *path, int path_size,
3301 const char *p, *ls, *at, *col, *brk;
3303 if (port_ptr) *port_ptr = -1;
3304 if (proto_size > 0) proto[0] = 0;
3305 if (authorization_size > 0) authorization[0] = 0;
3306 if (hostname_size > 0) hostname[0] = 0;
3307 if (path_size > 0) path[0] = 0;
3309 /* parse protocol */
3310 if ((p = strchr(url, ':'))) {
3311 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3316 /* no protocol means plain filename */
3317 av_strlcpy(path, url, path_size);
3321 /* separate path from hostname */
3322 ls = strchr(p, '/');
3324 ls = strchr(p, '?');
3326 av_strlcpy(path, ls, path_size);
3328 ls = &p[strlen(p)]; // XXX
3330 /* the rest is hostname, use that to parse auth/port */
3332 /* authorization (user[:pass]@hostname) */
3333 if ((at = strchr(p, '@')) && at < ls) {
3334 av_strlcpy(authorization, p,
3335 FFMIN(authorization_size, at + 1 - p));
3336 p = at + 1; /* skip '@' */
3339 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3341 av_strlcpy(hostname, p + 1,
3342 FFMIN(hostname_size, brk - p));
3343 if (brk[1] == ':' && port_ptr)
3344 *port_ptr = atoi(brk + 2);
3345 } else if ((col = strchr(p, ':')) && col < ls) {
3346 av_strlcpy(hostname, p,
3347 FFMIN(col + 1 - p, hostname_size));
3348 if (port_ptr) *port_ptr = atoi(col + 1);
3350 av_strlcpy(hostname, p,
3351 FFMIN(ls + 1 - p, hostname_size));
3355 char *ff_data_to_hex(char *buff, const uint8_t *src, int s)
3358 static const char hex_table[16] = { '0', '1', '2', '3',
3361 'C', 'D', 'E', 'F' };
3363 for(i = 0; i < s; i++) {
3364 buff[i * 2] = hex_table[src[i] >> 4];
3365 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3371 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3372 unsigned int pts_num, unsigned int pts_den)
3374 s->pts_wrap_bits = pts_wrap_bits;
3376 if(av_reduce(&s->time_base.num, &s->time_base.den, pts_num, pts_den, INT_MAX)){
3377 if(s->time_base.num != pts_num)
3378 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/s->time_base.num);
3380 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3382 if(!s->time_base.num || !s->time_base.den)
3383 s->time_base.num= s->time_base.den= 0;