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 #if LIBAVFORMAT_VERSION_MAJOR < 53
186 AVOutputFormat *guess_format(const char *short_name, const char *filename,
187 const char *mime_type)
189 return av_guess_format(short_name, filename, mime_type);
193 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
194 const char *mime_type)
196 AVOutputFormat *fmt, *fmt_found;
197 int score_max, score;
199 /* specific test for image sequences */
200 #if CONFIG_IMAGE2_MUXER
201 if (!short_name && filename &&
202 av_filename_number_test(filename) &&
203 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
204 return guess_format("image2", NULL, NULL);
207 /* Find the proper file type. */
211 while (fmt != NULL) {
213 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
215 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
217 if (filename && fmt->extensions &&
218 match_ext(filename, fmt->extensions)) {
221 if (score > score_max) {
230 #if LIBAVFORMAT_VERSION_MAJOR < 53
231 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
232 const char *mime_type)
234 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
237 AVOutputFormat *stream_fmt;
238 char stream_format_name[64];
240 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
241 stream_fmt = guess_format(stream_format_name, NULL, NULL);
251 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
252 const char *filename, const char *mime_type, enum CodecType type){
253 if(type == CODEC_TYPE_VIDEO){
254 enum CodecID codec_id= CODEC_ID_NONE;
256 #if CONFIG_IMAGE2_MUXER
257 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
258 codec_id= av_guess_image2_codec(filename);
261 if(codec_id == CODEC_ID_NONE)
262 codec_id= fmt->video_codec;
264 }else if(type == CODEC_TYPE_AUDIO)
265 return fmt->audio_codec;
267 return CODEC_ID_NONE;
270 AVInputFormat *av_find_input_format(const char *short_name)
273 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
274 if (match_format(short_name, fmt->name))
280 /* memory handling */
283 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
285 int ret= av_new_packet(pkt, size);
290 pkt->pos= url_ftell(s);
292 ret= get_buffer(s, pkt->data, size);
296 av_shrink_packet(pkt, ret);
302 int av_filename_number_test(const char *filename)
305 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
308 static AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
310 AVInputFormat *fmt1, *fmt;
314 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
315 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
318 if (fmt1->read_probe) {
319 score = fmt1->read_probe(pd);
320 } else if (fmt1->extensions) {
321 if (match_ext(pd->filename, fmt1->extensions)) {
325 if (score > *score_max) {
328 }else if (score == *score_max)
334 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
336 return av_probe_input_format2(pd, is_opened, &score);
339 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
342 fmt = av_probe_input_format2(pd, 1, &score);
345 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
346 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
347 if (!strcmp(fmt->name, "mp3")) {
348 st->codec->codec_id = CODEC_ID_MP3;
349 st->codec->codec_type = CODEC_TYPE_AUDIO;
350 } else if (!strcmp(fmt->name, "ac3")) {
351 st->codec->codec_id = CODEC_ID_AC3;
352 st->codec->codec_type = CODEC_TYPE_AUDIO;
353 } else if (!strcmp(fmt->name, "eac3")) {
354 st->codec->codec_id = CODEC_ID_EAC3;
355 st->codec->codec_type = CODEC_TYPE_AUDIO;
356 } else if (!strcmp(fmt->name, "mpegvideo")) {
357 st->codec->codec_id = CODEC_ID_MPEG2VIDEO;
358 st->codec->codec_type = CODEC_TYPE_VIDEO;
359 } else if (!strcmp(fmt->name, "m4v")) {
360 st->codec->codec_id = CODEC_ID_MPEG4;
361 st->codec->codec_type = CODEC_TYPE_VIDEO;
362 } else if (!strcmp(fmt->name, "h264")) {
363 st->codec->codec_id = CODEC_ID_H264;
364 st->codec->codec_type = CODEC_TYPE_VIDEO;
365 } else if (!strcmp(fmt->name, "dts")) {
366 st->codec->codec_id = CODEC_ID_DTS;
367 st->codec->codec_type = CODEC_TYPE_AUDIO;
373 /************************************************************/
374 /* input media file */
377 * Open a media file from an IO stream. 'fmt' must be specified.
379 int av_open_input_stream(AVFormatContext **ic_ptr,
380 ByteIOContext *pb, const char *filename,
381 AVInputFormat *fmt, AVFormatParameters *ap)
385 AVFormatParameters default_ap;
389 memset(ap, 0, sizeof(default_ap));
392 if(!ap->prealloced_context)
393 ic = avformat_alloc_context();
397 err = AVERROR(ENOMEM);
402 ic->duration = AV_NOPTS_VALUE;
403 ic->start_time = AV_NOPTS_VALUE;
404 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
406 /* allocate private data */
407 if (fmt->priv_data_size > 0) {
408 ic->priv_data = av_mallocz(fmt->priv_data_size);
409 if (!ic->priv_data) {
410 err = AVERROR(ENOMEM);
414 ic->priv_data = NULL;
417 if (ic->iformat->read_header) {
418 err = ic->iformat->read_header(ic, ap);
423 if (pb && !ic->data_offset)
424 ic->data_offset = url_ftell(ic->pb);
426 #if LIBAVFORMAT_VERSION_MAJOR < 53
427 ff_metadata_demux_compat(ic);
430 ic->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
437 av_freep(&ic->priv_data);
438 for(i=0;i<ic->nb_streams;i++) {
439 AVStream *st = ic->streams[i];
441 av_free(st->priv_data);
442 av_free(st->codec->extradata);
452 /** size of probe buffer, for guessing file type from file contents */
453 #define PROBE_BUF_MIN 2048
454 #define PROBE_BUF_MAX (1<<20)
456 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
459 AVFormatParameters *ap)
462 AVProbeData probe_data, *pd = &probe_data;
463 ByteIOContext *pb = NULL;
464 void *logctx= ap && ap->prealloced_context ? *ic_ptr : NULL;
468 pd->filename = filename;
473 /* guess format if no file can be opened */
474 fmt = av_probe_input_format(pd, 0);
477 /* Do not open file if the format does not need it. XXX: specific
478 hack needed to handle RTSP/TCP */
479 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
480 /* if no file needed do not try to open one */
481 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
485 url_setbufsize(pb, buf_size);
488 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
489 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
490 /* read probe data */
491 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
492 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
494 if ((int)pd->buf_size < 0) {
499 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
500 if (url_fseek(pb, 0, SEEK_SET) < 0) {
502 if (url_fopen(&pb, filename, URL_RDONLY) < 0) {
508 /* guess file format */
509 fmt = av_probe_input_format2(pd, 1, &score);
511 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
512 av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
514 av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
520 /* if still no format found, error */
526 /* check filename in case an image number is expected */
527 if (fmt->flags & AVFMT_NEEDNUMBER) {
528 if (!av_filename_number_test(filename)) {
529 err = AVERROR_NUMEXPECTED;
533 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
541 if (ap && ap->prealloced_context)
548 /*******************************************************/
550 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
551 AVPacketList **plast_pktl){
552 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
557 (*plast_pktl)->next = pktl;
559 *packet_buffer = pktl;
561 /* add the packet in the buffered packet list */
567 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
573 AVPacketList *pktl = s->raw_packet_buffer;
577 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
578 !s->streams[pkt->stream_index]->probe_packets ||
579 s->raw_packet_buffer_remaining_size < pkt->size){
580 AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
583 s->raw_packet_buffer = pktl->next;
584 s->raw_packet_buffer_remaining_size += pkt->size;
591 ret= s->iformat->read_packet(s, pkt);
593 if (!pktl || ret == AVERROR(EAGAIN))
595 for (i = 0; i < s->nb_streams; i++)
596 s->streams[i]->probe_packets = 0;
599 st= s->streams[pkt->stream_index];
601 switch(st->codec->codec_type){
602 case CODEC_TYPE_VIDEO:
603 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
605 case CODEC_TYPE_AUDIO:
606 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
608 case CODEC_TYPE_SUBTITLE:
609 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
613 if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
617 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
618 s->raw_packet_buffer_remaining_size -= pkt->size;
620 if(st->codec->codec_id == CODEC_ID_PROBE){
621 AVProbeData *pd = &st->probe_data;
622 av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
625 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
626 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
627 pd->buf_size += pkt->size;
628 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
630 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
631 set_codec_from_probe_data(s, st, pd, 1);
632 if(st->codec->codec_id != CODEC_ID_PROBE){
635 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
642 /**********************************************************/
645 * Get the number of samples of an audio frame. Return -1 on error.
647 static int get_audio_frame_size(AVCodecContext *enc, int size)
651 if(enc->codec_id == CODEC_ID_VORBIS)
654 if (enc->frame_size <= 1) {
655 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
657 if (bits_per_sample) {
658 if (enc->channels == 0)
660 frame_size = (size << 3) / (bits_per_sample * enc->channels);
662 /* used for example by ADPCM codecs */
663 if (enc->bit_rate == 0)
665 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
668 frame_size = enc->frame_size;
675 * Return the frame duration in seconds. Return 0 if not available.
677 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
678 AVCodecParserContext *pc, AVPacket *pkt)
684 switch(st->codec->codec_type) {
685 case CODEC_TYPE_VIDEO:
686 if(st->time_base.num*1000LL > st->time_base.den){
687 *pnum = st->time_base.num;
688 *pden = st->time_base.den;
689 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
690 *pnum = st->codec->time_base.num;
691 *pden = st->codec->time_base.den;
692 if (pc && pc->repeat_pict) {
693 *pnum = (*pnum) * (1 + pc->repeat_pict);
697 case CODEC_TYPE_AUDIO:
698 frame_size = get_audio_frame_size(st->codec, pkt->size);
702 *pden = st->codec->sample_rate;
709 static int is_intra_only(AVCodecContext *enc){
710 if(enc->codec_type == CODEC_TYPE_AUDIO){
712 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
713 switch(enc->codec_id){
715 case CODEC_ID_MJPEGB:
717 case CODEC_ID_RAWVIDEO:
718 case CODEC_ID_DVVIDEO:
719 case CODEC_ID_HUFFYUV:
720 case CODEC_ID_FFVHUFF:
725 case CODEC_ID_JPEG2000:
733 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
734 int64_t dts, int64_t pts)
736 AVStream *st= s->streams[stream_index];
737 AVPacketList *pktl= s->packet_buffer;
739 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
742 st->first_dts= dts - st->cur_dts;
745 for(; pktl; pktl= pktl->next){
746 if(pktl->pkt.stream_index != stream_index)
748 //FIXME think more about this check
749 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
750 pktl->pkt.pts += st->first_dts;
752 if(pktl->pkt.dts != AV_NOPTS_VALUE)
753 pktl->pkt.dts += st->first_dts;
755 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
756 st->start_time= pktl->pkt.pts;
758 if (st->start_time == AV_NOPTS_VALUE)
759 st->start_time = pts;
762 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
764 AVPacketList *pktl= s->packet_buffer;
767 if(st->first_dts != AV_NOPTS_VALUE){
768 cur_dts= st->first_dts;
769 for(; pktl; pktl= pktl->next){
770 if(pktl->pkt.stream_index == pkt->stream_index){
771 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
773 cur_dts -= pkt->duration;
776 pktl= s->packet_buffer;
777 st->first_dts = cur_dts;
778 }else if(st->cur_dts)
781 for(; pktl; pktl= pktl->next){
782 if(pktl->pkt.stream_index != pkt->stream_index)
784 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
785 && !pktl->pkt.duration){
786 pktl->pkt.dts= cur_dts;
787 if(!st->codec->has_b_frames)
788 pktl->pkt.pts= cur_dts;
789 cur_dts += pkt->duration;
790 pktl->pkt.duration= pkt->duration;
794 if(st->first_dts == AV_NOPTS_VALUE)
795 st->cur_dts= cur_dts;
798 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
799 AVCodecParserContext *pc, AVPacket *pkt)
801 int num, den, presentation_delayed, delay, i;
804 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == FF_B_TYPE)
805 //FIXME Set low_delay = 0 when has_b_frames = 1
806 st->codec->has_b_frames = 1;
808 /* do we have a video B-frame ? */
809 delay= st->codec->has_b_frames;
810 presentation_delayed = 0;
811 /* XXX: need has_b_frame, but cannot get it if the codec is
814 pc && pc->pict_type != FF_B_TYPE)
815 presentation_delayed = 1;
817 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
818 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
819 pkt->dts -= 1LL<<st->pts_wrap_bits;
822 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
823 // we take the conservative approach and discard both
824 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
825 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
826 av_log(s, AV_LOG_WARNING, "invalid dts/pts combination\n");
827 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
830 if (pkt->duration == 0) {
831 compute_frame_duration(&num, &den, st, pc, pkt);
833 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
835 if(pkt->duration != 0 && s->packet_buffer)
836 update_initial_durations(s, st, pkt);
840 /* correct timestamps with byte offset if demuxers only have timestamps
841 on packet boundaries */
842 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
843 /* this will estimate bitrate based on this frame's duration and size */
844 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
845 if(pkt->pts != AV_NOPTS_VALUE)
847 if(pkt->dts != AV_NOPTS_VALUE)
851 if (pc && pc->dts_sync_point >= 0) {
852 // we have synchronization info from the parser
853 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
855 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
856 if (pkt->dts != AV_NOPTS_VALUE) {
857 // got DTS from the stream, update reference timestamp
858 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
859 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
860 } else if (st->reference_dts != AV_NOPTS_VALUE) {
861 // compute DTS based on reference timestamp
862 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
863 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
865 if (pc->dts_sync_point > 0)
866 st->reference_dts = pkt->dts; // new reference
870 /* This may be redundant, but it should not hurt. */
871 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
872 presentation_delayed = 1;
874 // 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);
875 /* interpolate PTS and DTS if they are not present */
876 //We skip H264 currently because delay and has_b_frames are not reliably set
877 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
878 if (presentation_delayed) {
879 /* DTS = decompression timestamp */
880 /* PTS = presentation timestamp */
881 if (pkt->dts == AV_NOPTS_VALUE)
882 pkt->dts = st->last_IP_pts;
883 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
884 if (pkt->dts == AV_NOPTS_VALUE)
885 pkt->dts = st->cur_dts;
887 /* this is tricky: the dts must be incremented by the duration
888 of the frame we are displaying, i.e. the last I- or P-frame */
889 if (st->last_IP_duration == 0)
890 st->last_IP_duration = pkt->duration;
891 if(pkt->dts != AV_NOPTS_VALUE)
892 st->cur_dts = pkt->dts + st->last_IP_duration;
893 st->last_IP_duration = pkt->duration;
894 st->last_IP_pts= pkt->pts;
895 /* cannot compute PTS if not present (we can compute it only
896 by knowing the future */
897 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
898 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
899 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
900 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
901 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
902 pkt->pts += pkt->duration;
903 // 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);
907 /* presentation is not delayed : PTS and DTS are the same */
908 if(pkt->pts == AV_NOPTS_VALUE)
910 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
911 if(pkt->pts == AV_NOPTS_VALUE)
912 pkt->pts = st->cur_dts;
914 if(pkt->pts != AV_NOPTS_VALUE)
915 st->cur_dts = pkt->pts + pkt->duration;
919 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
920 st->pts_buffer[0]= pkt->pts;
921 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
922 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
923 if(pkt->dts == AV_NOPTS_VALUE)
924 pkt->dts= st->pts_buffer[0];
925 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
926 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
928 if(pkt->dts > st->cur_dts)
929 st->cur_dts = pkt->dts;
932 // 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);
935 if(is_intra_only(st->codec))
936 pkt->flags |= PKT_FLAG_KEY;
939 /* keyframe computation */
940 if (pc->key_frame == 1)
941 pkt->flags |= PKT_FLAG_KEY;
942 else if (pc->key_frame == -1 && pc->pict_type == FF_I_TYPE)
943 pkt->flags |= PKT_FLAG_KEY;
946 pkt->convergence_duration = pc->convergence_duration;
950 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
958 /* select current input stream component */
961 if (!st->need_parsing || !st->parser) {
962 /* no parsing needed: we just output the packet as is */
963 /* raw data support */
964 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
965 compute_pkt_fields(s, st, NULL, pkt);
967 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
968 (pkt->flags & PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
969 ff_reduce_index(s, st->index);
970 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
973 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
974 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
975 st->cur_ptr, st->cur_len,
976 st->cur_pkt.pts, st->cur_pkt.dts,
978 st->cur_pkt.pts = AV_NOPTS_VALUE;
979 st->cur_pkt.dts = AV_NOPTS_VALUE;
980 /* increment read pointer */
984 /* return packet if any */
988 pkt->stream_index = st->index;
989 pkt->pts = st->parser->pts;
990 pkt->dts = st->parser->dts;
991 pkt->pos = st->parser->pos;
992 pkt->destruct = NULL;
993 compute_pkt_fields(s, st, st->parser, pkt);
995 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
996 ff_reduce_index(s, st->index);
997 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
998 0, 0, AVINDEX_KEYFRAME);
1005 av_free_packet(&st->cur_pkt);
1010 /* read next packet */
1011 ret = av_read_packet(s, &cur_pkt);
1013 if (ret == AVERROR(EAGAIN))
1015 /* return the last frames, if any */
1016 for(i = 0; i < s->nb_streams; i++) {
1018 if (st->parser && st->need_parsing) {
1019 av_parser_parse2(st->parser, st->codec,
1020 &pkt->data, &pkt->size,
1022 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1028 /* no more packets: really terminate parsing */
1031 st = s->streams[cur_pkt.stream_index];
1032 st->cur_pkt= cur_pkt;
1034 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1035 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1036 st->cur_pkt.pts < st->cur_pkt.dts){
1037 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1038 st->cur_pkt.stream_index,
1042 // av_free_packet(&st->cur_pkt);
1046 if(s->debug & FF_FDEBUG_TS)
1047 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1048 st->cur_pkt.stream_index,
1052 st->cur_pkt.duration,
1056 st->cur_ptr = st->cur_pkt.data;
1057 st->cur_len = st->cur_pkt.size;
1058 if (st->need_parsing && !st->parser) {
1059 st->parser = av_parser_init(st->codec->codec_id);
1061 /* no parser available: just output the raw packets */
1062 st->need_parsing = AVSTREAM_PARSE_NONE;
1063 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1064 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1066 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
1067 st->parser->next_frame_offset=
1068 st->parser->cur_offset= st->cur_pkt.pos;
1073 if(s->debug & FF_FDEBUG_TS)
1074 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1085 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1089 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1092 pktl = s->packet_buffer;
1094 AVPacket *next_pkt= &pktl->pkt;
1096 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1097 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1098 if( pktl->pkt.stream_index == next_pkt->stream_index
1099 && next_pkt->dts < pktl->pkt.dts
1100 && pktl->pkt.pts != pktl->pkt.dts //not b frame
1101 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1102 next_pkt->pts= pktl->pkt.dts;
1106 pktl = s->packet_buffer;
1109 if( next_pkt->pts != AV_NOPTS_VALUE
1110 || next_pkt->dts == AV_NOPTS_VALUE
1112 /* read packet from packet buffer, if there is data */
1114 s->packet_buffer = pktl->next;
1120 int ret= av_read_frame_internal(s, pkt);
1122 if(pktl && ret != AVERROR(EAGAIN)){
1129 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1130 &s->packet_buffer_end)) < 0)
1131 return AVERROR(ENOMEM);
1133 assert(!s->packet_buffer);
1134 return av_read_frame_internal(s, pkt);
1139 /* XXX: suppress the packet queue */
1140 static void flush_packet_queue(AVFormatContext *s)
1145 pktl = s->packet_buffer;
1148 s->packet_buffer = pktl->next;
1149 av_free_packet(&pktl->pkt);
1152 while(s->raw_packet_buffer){
1153 pktl = s->raw_packet_buffer;
1154 s->raw_packet_buffer = pktl->next;
1155 av_free_packet(&pktl->pkt);
1158 s->packet_buffer_end=
1159 s->raw_packet_buffer_end= NULL;
1160 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1163 /*******************************************************/
1166 int av_find_default_stream_index(AVFormatContext *s)
1168 int first_audio_index = -1;
1172 if (s->nb_streams <= 0)
1174 for(i = 0; i < s->nb_streams; i++) {
1176 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1179 if (first_audio_index < 0 && st->codec->codec_type == CODEC_TYPE_AUDIO)
1180 first_audio_index = i;
1182 return first_audio_index >= 0 ? first_audio_index : 0;
1186 * Flush the frame reader.
1188 void av_read_frame_flush(AVFormatContext *s)
1193 flush_packet_queue(s);
1197 /* for each stream, reset read state */
1198 for(i = 0; i < s->nb_streams; i++) {
1202 av_parser_close(st->parser);
1204 av_free_packet(&st->cur_pkt);
1206 st->last_IP_pts = AV_NOPTS_VALUE;
1207 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1208 st->reference_dts = AV_NOPTS_VALUE;
1213 st->probe_packets = MAX_PROBE_PACKETS;
1215 for(j=0; j<MAX_REORDER_DELAY+1; j++)
1216 st->pts_buffer[j]= AV_NOPTS_VALUE;
1220 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1223 for(i = 0; i < s->nb_streams; i++) {
1224 AVStream *st = s->streams[i];
1226 st->cur_dts = av_rescale(timestamp,
1227 st->time_base.den * (int64_t)ref_st->time_base.num,
1228 st->time_base.num * (int64_t)ref_st->time_base.den);
1232 void ff_reduce_index(AVFormatContext *s, int stream_index)
1234 AVStream *st= s->streams[stream_index];
1235 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1237 if((unsigned)st->nb_index_entries >= max_entries){
1239 for(i=0; 2*i<st->nb_index_entries; i++)
1240 st->index_entries[i]= st->index_entries[2*i];
1241 st->nb_index_entries= i;
1245 int av_add_index_entry(AVStream *st,
1246 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1248 AVIndexEntry *entries, *ie;
1251 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1254 entries = av_fast_realloc(st->index_entries,
1255 &st->index_entries_allocated_size,
1256 (st->nb_index_entries + 1) *
1257 sizeof(AVIndexEntry));
1261 st->index_entries= entries;
1263 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1266 index= st->nb_index_entries++;
1267 ie= &entries[index];
1268 assert(index==0 || ie[-1].timestamp < timestamp);
1270 ie= &entries[index];
1271 if(ie->timestamp != timestamp){
1272 if(ie->timestamp <= timestamp)
1274 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1275 st->nb_index_entries++;
1276 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1277 distance= ie->min_distance;
1281 ie->timestamp = timestamp;
1282 ie->min_distance= distance;
1289 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1292 AVIndexEntry *entries= st->index_entries;
1293 int nb_entries= st->nb_index_entries;
1302 timestamp = entries[m].timestamp;
1303 if(timestamp >= wanted_timestamp)
1305 if(timestamp <= wanted_timestamp)
1308 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1310 if(!(flags & AVSEEK_FLAG_ANY)){
1311 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1312 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1323 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1324 AVInputFormat *avif= s->iformat;
1325 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1326 int64_t ts_min, ts_max, ts;
1331 if (stream_index < 0)
1335 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1339 ts_min= AV_NOPTS_VALUE;
1340 pos_limit= -1; //gcc falsely says it may be uninitialized
1342 st= s->streams[stream_index];
1343 if(st->index_entries){
1346 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()
1347 index= FFMAX(index, 0);
1348 e= &st->index_entries[index];
1350 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1352 ts_min= e->timestamp;
1354 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1361 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1362 assert(index < st->nb_index_entries);
1364 e= &st->index_entries[index];
1365 assert(e->timestamp >= target_ts);
1367 ts_max= e->timestamp;
1368 pos_limit= pos_max - e->min_distance;
1370 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1371 pos_max,pos_limit, ts_max);
1376 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1381 if ((ret = url_fseek(s->pb, pos, SEEK_SET)) < 0)
1384 av_update_cur_dts(s, st, ts);
1389 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 )){
1391 int64_t start_pos, filesize;
1395 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1398 if(ts_min == AV_NOPTS_VALUE){
1399 pos_min = s->data_offset;
1400 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1401 if (ts_min == AV_NOPTS_VALUE)
1405 if(ts_max == AV_NOPTS_VALUE){
1407 filesize = url_fsize(s->pb);
1408 pos_max = filesize - 1;
1411 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1413 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1414 if (ts_max == AV_NOPTS_VALUE)
1418 int64_t tmp_pos= pos_max + 1;
1419 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1420 if(tmp_ts == AV_NOPTS_VALUE)
1424 if(tmp_pos >= filesize)
1430 if(ts_min > ts_max){
1432 }else if(ts_min == ts_max){
1437 while (pos_min < pos_limit) {
1439 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1443 assert(pos_limit <= pos_max);
1446 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1447 // interpolate position (better than dichotomy)
1448 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1449 + pos_min - approximate_keyframe_distance;
1450 }else if(no_change==1){
1451 // bisection, if interpolation failed to change min or max pos last time
1452 pos = (pos_min + pos_limit)>>1;
1454 /* linear search if bisection failed, can only happen if there
1455 are very few or no keyframes between min/max */
1460 else if(pos > pos_limit)
1464 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1470 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1471 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit,
1472 start_pos, no_change);
1474 if(ts == AV_NOPTS_VALUE){
1475 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1478 assert(ts != AV_NOPTS_VALUE);
1479 if (target_ts <= ts) {
1480 pos_limit = start_pos - 1;
1484 if (target_ts >= ts) {
1490 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1491 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1494 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1496 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1497 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1498 pos, ts_min, target_ts, ts_max);
1504 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1505 int64_t pos_min, pos_max;
1509 if (stream_index < 0)
1512 st= s->streams[stream_index];
1515 pos_min = s->data_offset;
1516 pos_max = url_fsize(s->pb) - 1;
1518 if (pos < pos_min) pos= pos_min;
1519 else if(pos > pos_max) pos= pos_max;
1521 url_fseek(s->pb, pos, SEEK_SET);
1524 av_update_cur_dts(s, st, ts);
1529 static int av_seek_frame_generic(AVFormatContext *s,
1530 int stream_index, int64_t timestamp, int flags)
1537 st = s->streams[stream_index];
1539 index = av_index_search_timestamp(st, timestamp, flags);
1541 if(index < 0 || index==st->nb_index_entries-1){
1545 if(st->nb_index_entries){
1546 assert(st->index_entries);
1547 ie= &st->index_entries[st->nb_index_entries-1];
1548 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1550 av_update_cur_dts(s, st, ie->timestamp);
1552 if ((ret = url_fseek(s->pb, s->data_offset, SEEK_SET)) < 0)
1558 ret = av_read_frame(s, &pkt);
1559 }while(ret == AVERROR(EAGAIN));
1562 av_free_packet(&pkt);
1563 if(stream_index == pkt.stream_index){
1564 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1568 index = av_index_search_timestamp(st, timestamp, flags);
1573 av_read_frame_flush(s);
1574 if (s->iformat->read_seek){
1575 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1578 ie = &st->index_entries[index];
1579 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1581 av_update_cur_dts(s, st, ie->timestamp);
1586 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1591 av_read_frame_flush(s);
1593 if(flags & AVSEEK_FLAG_BYTE)
1594 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1596 if(stream_index < 0){
1597 stream_index= av_find_default_stream_index(s);
1598 if(stream_index < 0)
1601 st= s->streams[stream_index];
1602 /* timestamp for default must be expressed in AV_TIME_BASE units */
1603 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1606 /* first, we try the format specific seek */
1607 if (s->iformat->read_seek)
1608 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1615 if(s->iformat->read_timestamp)
1616 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1618 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1621 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1623 if(min_ts > ts || max_ts < ts)
1626 av_read_frame_flush(s);
1628 if (s->iformat->read_seek2)
1629 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1631 if(s->iformat->read_timestamp){
1632 //try to seek via read_timestamp()
1635 //Fallback to old API if new is not implemented but old is
1636 //Note the old has somewat different sematics
1637 if(s->iformat->read_seek || 1)
1638 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1640 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1643 /*******************************************************/
1646 * Returns TRUE if the stream has accurate duration in any stream.
1648 * @return TRUE if the stream has accurate duration for at least one component.
1650 static int av_has_duration(AVFormatContext *ic)
1655 for(i = 0;i < ic->nb_streams; i++) {
1656 st = ic->streams[i];
1657 if (st->duration != AV_NOPTS_VALUE)
1664 * Estimate the stream timings from the one of each components.
1666 * Also computes the global bitrate if possible.
1668 static void av_update_stream_timings(AVFormatContext *ic)
1670 int64_t start_time, start_time1, end_time, end_time1;
1671 int64_t duration, duration1;
1675 start_time = INT64_MAX;
1676 end_time = INT64_MIN;
1677 duration = INT64_MIN;
1678 for(i = 0;i < ic->nb_streams; i++) {
1679 st = ic->streams[i];
1680 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1681 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1682 if (start_time1 < start_time)
1683 start_time = start_time1;
1684 if (st->duration != AV_NOPTS_VALUE) {
1685 end_time1 = start_time1
1686 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1687 if (end_time1 > end_time)
1688 end_time = end_time1;
1691 if (st->duration != AV_NOPTS_VALUE) {
1692 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1693 if (duration1 > duration)
1694 duration = duration1;
1697 if (start_time != INT64_MAX) {
1698 ic->start_time = start_time;
1699 if (end_time != INT64_MIN) {
1700 if (end_time - start_time > duration)
1701 duration = end_time - start_time;
1704 if (duration != INT64_MIN) {
1705 ic->duration = duration;
1706 if (ic->file_size > 0) {
1707 /* compute the bitrate */
1708 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1709 (double)ic->duration;
1714 static void fill_all_stream_timings(AVFormatContext *ic)
1719 av_update_stream_timings(ic);
1720 for(i = 0;i < ic->nb_streams; i++) {
1721 st = ic->streams[i];
1722 if (st->start_time == AV_NOPTS_VALUE) {
1723 if(ic->start_time != AV_NOPTS_VALUE)
1724 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1725 if(ic->duration != AV_NOPTS_VALUE)
1726 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1731 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1733 int64_t filesize, duration;
1737 /* if bit_rate is already set, we believe it */
1738 if (ic->bit_rate == 0) {
1740 for(i=0;i<ic->nb_streams;i++) {
1741 st = ic->streams[i];
1742 bit_rate += st->codec->bit_rate;
1744 ic->bit_rate = bit_rate;
1747 /* if duration is already set, we believe it */
1748 if (ic->duration == AV_NOPTS_VALUE &&
1749 ic->bit_rate != 0 &&
1750 ic->file_size != 0) {
1751 filesize = ic->file_size;
1753 for(i = 0; i < ic->nb_streams; i++) {
1754 st = ic->streams[i];
1755 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1756 if (st->duration == AV_NOPTS_VALUE)
1757 st->duration = duration;
1763 #define DURATION_MAX_READ_SIZE 250000
1765 /* only usable for MPEG-PS streams */
1766 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1768 AVPacket pkt1, *pkt = &pkt1;
1770 int read_size, i, ret;
1771 int64_t end_time, start_time[MAX_STREAMS];
1772 int64_t filesize, offset, duration;
1776 /* flush packet queue */
1777 flush_packet_queue(ic);
1779 for(i=0;i<ic->nb_streams;i++) {
1780 st = ic->streams[i];
1781 if(st->start_time != AV_NOPTS_VALUE){
1782 start_time[i]= st->start_time;
1783 }else if(st->first_dts != AV_NOPTS_VALUE){
1784 start_time[i]= st->first_dts;
1786 av_log(st->codec, AV_LOG_WARNING, "start time is not set in av_estimate_timings_from_pts\n");
1789 av_parser_close(st->parser);
1791 av_free_packet(&st->cur_pkt);
1795 /* estimate the end time (duration) */
1796 /* XXX: may need to support wrapping */
1797 filesize = ic->file_size;
1798 offset = filesize - DURATION_MAX_READ_SIZE;
1802 url_fseek(ic->pb, offset, SEEK_SET);
1805 if (read_size >= DURATION_MAX_READ_SIZE)
1809 ret = av_read_packet(ic, pkt);
1810 }while(ret == AVERROR(EAGAIN));
1813 read_size += pkt->size;
1814 st = ic->streams[pkt->stream_index];
1815 if (pkt->pts != AV_NOPTS_VALUE &&
1816 start_time[pkt->stream_index] != AV_NOPTS_VALUE) {
1817 end_time = pkt->pts;
1818 duration = end_time - start_time[pkt->stream_index];
1820 if (st->duration == AV_NOPTS_VALUE ||
1821 st->duration < duration)
1822 st->duration = duration;
1825 av_free_packet(pkt);
1828 fill_all_stream_timings(ic);
1830 url_fseek(ic->pb, old_offset, SEEK_SET);
1831 for(i=0; i<ic->nb_streams; i++){
1833 st->cur_dts= st->first_dts;
1834 st->last_IP_pts = AV_NOPTS_VALUE;
1838 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
1842 /* get the file size, if possible */
1843 if (ic->iformat->flags & AVFMT_NOFILE) {
1846 file_size = url_fsize(ic->pb);
1850 ic->file_size = file_size;
1852 if ((!strcmp(ic->iformat->name, "mpeg") ||
1853 !strcmp(ic->iformat->name, "mpegts")) &&
1854 file_size && !url_is_streamed(ic->pb)) {
1855 /* get accurate estimate from the PTSes */
1856 av_estimate_timings_from_pts(ic, old_offset);
1857 } else if (av_has_duration(ic)) {
1858 /* at least one component has timings - we use them for all
1860 fill_all_stream_timings(ic);
1862 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
1863 /* less precise: use bitrate info */
1864 av_estimate_timings_from_bit_rate(ic);
1866 av_update_stream_timings(ic);
1872 for(i = 0;i < ic->nb_streams; i++) {
1873 st = ic->streams[i];
1874 printf("%d: start_time: %0.3f duration: %0.3f\n",
1875 i, (double)st->start_time / AV_TIME_BASE,
1876 (double)st->duration / AV_TIME_BASE);
1878 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1879 (double)ic->start_time / AV_TIME_BASE,
1880 (double)ic->duration / AV_TIME_BASE,
1881 ic->bit_rate / 1000);
1886 static int has_codec_parameters(AVCodecContext *enc)
1889 switch(enc->codec_type) {
1890 case CODEC_TYPE_AUDIO:
1891 val = enc->sample_rate && enc->channels && enc->sample_fmt != SAMPLE_FMT_NONE;
1892 if(!enc->frame_size &&
1893 (enc->codec_id == CODEC_ID_VORBIS ||
1894 enc->codec_id == CODEC_ID_AAC ||
1895 enc->codec_id == CODEC_ID_MP3 ||
1896 enc->codec_id == CODEC_ID_SPEEX))
1899 case CODEC_TYPE_VIDEO:
1900 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1906 return enc->codec_id != CODEC_ID_NONE && val != 0;
1909 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
1913 int got_picture, data_size, ret=0;
1916 if(!st->codec->codec){
1917 codec = avcodec_find_decoder(st->codec->codec_id);
1920 ret = avcodec_open(st->codec, codec);
1925 if(!has_codec_parameters(st->codec)){
1926 switch(st->codec->codec_type) {
1927 case CODEC_TYPE_VIDEO:
1928 avcodec_get_frame_defaults(&picture);
1929 ret = avcodec_decode_video2(st->codec, &picture,
1930 &got_picture, avpkt);
1932 case CODEC_TYPE_AUDIO:
1933 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1934 samples = av_malloc(data_size);
1937 ret = avcodec_decode_audio3(st->codec, samples,
1949 unsigned int ff_codec_get_tag(const AVCodecTag *tags, int id)
1951 while (tags->id != CODEC_ID_NONE) {
1959 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
1962 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1963 if(tag == tags[i].tag)
1966 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1967 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1968 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1969 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1970 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1973 return CODEC_ID_NONE;
1976 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
1979 for(i=0; tags && tags[i]; i++){
1980 int tag= ff_codec_get_tag(tags[i], id);
1986 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
1989 for(i=0; tags && tags[i]; i++){
1990 enum CodecID id= ff_codec_get_id(tags[i], tag);
1991 if(id!=CODEC_ID_NONE) return id;
1993 return CODEC_ID_NONE;
1996 static void compute_chapters_end(AVFormatContext *s)
2000 for (i=0; i+1<s->nb_chapters; i++)
2001 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2002 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
2003 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
2004 s->chapters[i]->end = s->chapters[i+1]->start;
2007 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
2008 assert(s->start_time != AV_NOPTS_VALUE);
2009 assert(s->duration > 0);
2010 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
2012 s->chapters[i]->time_base);
2016 #define MAX_STD_TIMEBASES (60*12+5)
2017 static int get_std_framerate(int i){
2018 if(i<60*12) return i*1001;
2019 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2023 * Is the time base unreliable.
2024 * This is a heuristic to balance between quick acceptance of the values in
2025 * the headers vs. some extra checks.
2026 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2027 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2028 * And there are "variable" fps files this needs to detect as well.
2030 static int tb_unreliable(AVCodecContext *c){
2031 if( c->time_base.den >= 101L*c->time_base.num
2032 || c->time_base.den < 5L*c->time_base.num
2033 /* || c->codec_tag == AV_RL32("DIVX")
2034 || c->codec_tag == AV_RL32("XVID")*/
2035 || c->codec_id == CODEC_ID_MPEG2VIDEO
2036 || c->codec_id == CODEC_ID_H264
2042 int av_find_stream_info(AVFormatContext *ic)
2044 int i, count, ret, read_size, j;
2046 AVPacket pkt1, *pkt;
2047 int64_t last_dts[MAX_STREAMS];
2048 int64_t duration_gcd[MAX_STREAMS]={0};
2049 int duration_count[MAX_STREAMS]={0};
2050 double (*duration_error)[MAX_STD_TIMEBASES];
2051 int64_t old_offset = url_ftell(ic->pb);
2052 int64_t codec_info_duration[MAX_STREAMS]={0};
2053 int codec_info_nb_frames[MAX_STREAMS]={0};
2055 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
2056 if (!duration_error) return AVERROR(ENOMEM);
2058 for(i=0;i<ic->nb_streams;i++) {
2059 st = ic->streams[i];
2060 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2061 /* if(!st->time_base.num)
2063 if(!st->codec->time_base.num)
2064 st->codec->time_base= st->time_base;
2066 //only for the split stuff
2068 st->parser = av_parser_init(st->codec->codec_id);
2069 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2070 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2075 for(i=0;i<MAX_STREAMS;i++){
2076 last_dts[i]= AV_NOPTS_VALUE;
2082 if(url_interrupt_cb()){
2083 ret= AVERROR(EINTR);
2084 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2088 /* check if one codec still needs to be handled */
2089 for(i=0;i<ic->nb_streams;i++) {
2090 st = ic->streams[i];
2091 if (!has_codec_parameters(st->codec))
2093 /* variable fps and no guess at the real fps */
2094 if( tb_unreliable(st->codec)
2095 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
2097 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2099 if(st->first_dts == AV_NOPTS_VALUE)
2102 if (i == ic->nb_streams) {
2103 /* NOTE: if the format has no header, then we need to read
2104 some packets to get most of the streams, so we cannot
2106 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2107 /* if we found the info for all the codecs, we can stop */
2109 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2113 /* we did not get all the codec info, but we read too much data */
2114 if (read_size >= ic->probesize) {
2116 av_log(ic, AV_LOG_WARNING, "MAX_READ_SIZE:%d reached\n", ic->probesize);
2120 /* NOTE: a new stream can be added there if no header in file
2121 (AVFMTCTX_NOHEADER) */
2122 ret = av_read_frame_internal(ic, &pkt1);
2123 if(ret == AVERROR(EAGAIN))
2127 ret = -1; /* we could not have all the codec parameters before EOF */
2128 for(i=0;i<ic->nb_streams;i++) {
2129 st = ic->streams[i];
2130 if (!has_codec_parameters(st->codec)){
2132 avcodec_string(buf, sizeof(buf), st->codec, 0);
2133 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2141 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2142 if(av_dup_packet(pkt) < 0) {
2143 av_free(duration_error);
2144 return AVERROR(ENOMEM);
2147 read_size += pkt->size;
2149 st = ic->streams[pkt->stream_index];
2150 if(codec_info_nb_frames[st->index]>1) {
2151 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){
2152 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2155 codec_info_duration[st->index] += pkt->duration;
2157 if (pkt->duration != 0)
2158 codec_info_nb_frames[st->index]++;
2161 int index= pkt->stream_index;
2162 int64_t last= last_dts[index];
2163 int64_t duration= pkt->dts - last;
2165 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2166 double dur= duration * av_q2d(st->time_base);
2168 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2169 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2170 if(duration_count[index] < 2)
2171 memset(duration_error[index], 0, sizeof(*duration_error));
2172 for(i=1; i<MAX_STD_TIMEBASES; i++){
2173 int framerate= get_std_framerate(i);
2174 int ticks= lrintf(dur*framerate/(1001*12));
2175 double error= dur - ticks*1001*12/(double)framerate;
2176 duration_error[index][i] += error*error;
2178 duration_count[index]++;
2179 // ignore the first 4 values, they might have some random jitter
2180 if (duration_count[index] > 3)
2181 duration_gcd[index] = av_gcd(duration_gcd[index], duration);
2183 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
2184 last_dts[pkt->stream_index]= pkt->dts;
2186 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2187 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2189 st->codec->extradata_size= i;
2190 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2191 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2192 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2196 /* if still no information, we try to open the codec and to
2197 decompress the frame. We try to avoid that in most cases as
2198 it takes longer and uses more memory. For MPEG-4, we need to
2199 decompress for QuickTime. */
2200 if (!has_codec_parameters(st->codec))
2201 try_decode_frame(st, pkt);
2206 // close codecs which were opened in try_decode_frame()
2207 for(i=0;i<ic->nb_streams;i++) {
2208 st = ic->streams[i];
2209 if(st->codec->codec)
2210 avcodec_close(st->codec);
2212 for(i=0;i<ic->nb_streams;i++) {
2213 st = ic->streams[i];
2214 if(codec_info_nb_frames[i]>2)
2215 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2216 (codec_info_nb_frames[i]-2)*(int64_t)st->time_base.den,
2217 codec_info_duration[i] *(int64_t)st->time_base.num, 60000);
2218 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2219 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
2220 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2222 // the check for tb_unreliable() is not completely correct, since this is not about handling
2223 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2224 // ipmovie.c produces.
2225 if (tb_unreliable(st->codec) && duration_count[i] > 15 && duration_gcd[i] > 1)
2226 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);
2227 if(duration_count[i]
2228 && tb_unreliable(st->codec) /*&&
2229 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2230 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2232 double best_error= 2*av_q2d(st->time_base);
2233 best_error= best_error*best_error*duration_count[i]*1000*12*30;
2235 for(j=1; j<MAX_STD_TIMEBASES; j++){
2236 double error= duration_error[i][j] * get_std_framerate(j);
2237 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2238 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2239 if(error < best_error){
2241 num = get_std_framerate(j);
2244 // do not increase frame rate by more than 1 % in order to match a standard rate.
2245 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2246 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2249 if (!st->r_frame_rate.num){
2250 if( st->codec->time_base.den * (int64_t)st->time_base.num
2251 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2252 st->r_frame_rate.num = st->codec->time_base.den;
2253 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2255 st->r_frame_rate.num = st->time_base.den;
2256 st->r_frame_rate.den = st->time_base.num;
2259 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
2260 if(!st->codec->bits_per_coded_sample)
2261 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2265 av_estimate_timings(ic, old_offset);
2267 compute_chapters_end(ic);
2270 /* correct DTS for B-frame streams with no timestamps */
2271 for(i=0;i<ic->nb_streams;i++) {
2272 st = ic->streams[i];
2273 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2275 ppktl = &ic->packet_buffer;
2277 if(ppkt1->stream_index != i)
2279 if(ppkt1->pkt->dts < 0)
2281 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2283 ppkt1->pkt->dts -= delta;
2288 st->cur_dts -= delta;
2294 av_free(duration_error);
2299 /*******************************************************/
2301 int av_read_play(AVFormatContext *s)
2303 if (s->iformat->read_play)
2304 return s->iformat->read_play(s);
2306 return av_url_read_fpause(s->pb, 0);
2307 return AVERROR(ENOSYS);
2310 int av_read_pause(AVFormatContext *s)
2312 if (s->iformat->read_pause)
2313 return s->iformat->read_pause(s);
2315 return av_url_read_fpause(s->pb, 1);
2316 return AVERROR(ENOSYS);
2319 void av_close_input_stream(AVFormatContext *s)
2324 if (s->iformat->read_close)
2325 s->iformat->read_close(s);
2326 for(i=0;i<s->nb_streams;i++) {
2327 /* free all data in a stream component */
2330 av_parser_close(st->parser);
2331 av_free_packet(&st->cur_pkt);
2333 av_metadata_free(&st->metadata);
2334 av_free(st->index_entries);
2335 av_free(st->codec->extradata);
2337 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2338 av_free(st->filename);
2340 av_free(st->priv_data);
2343 for(i=s->nb_programs-1; i>=0; i--) {
2344 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2345 av_freep(&s->programs[i]->provider_name);
2346 av_freep(&s->programs[i]->name);
2348 av_metadata_free(&s->programs[i]->metadata);
2349 av_freep(&s->programs[i]->stream_index);
2350 av_freep(&s->programs[i]);
2352 av_freep(&s->programs);
2353 flush_packet_queue(s);
2354 av_freep(&s->priv_data);
2355 while(s->nb_chapters--) {
2356 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2357 av_free(s->chapters[s->nb_chapters]->title);
2359 av_metadata_free(&s->chapters[s->nb_chapters]->metadata);
2360 av_free(s->chapters[s->nb_chapters]);
2362 av_freep(&s->chapters);
2363 av_metadata_free(&s->metadata);
2367 void av_close_input_file(AVFormatContext *s)
2369 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2370 av_close_input_stream(s);
2375 AVStream *av_new_stream(AVFormatContext *s, int id)
2380 if (s->nb_streams >= MAX_STREAMS)
2383 st = av_mallocz(sizeof(AVStream));
2387 st->codec= avcodec_alloc_context();
2389 /* no default bitrate if decoding */
2390 st->codec->bit_rate = 0;
2392 st->index = s->nb_streams;
2394 st->start_time = AV_NOPTS_VALUE;
2395 st->duration = AV_NOPTS_VALUE;
2396 /* we set the current DTS to 0 so that formats without any timestamps
2397 but durations get some timestamps, formats with some unknown
2398 timestamps have their first few packets buffered and the
2399 timestamps corrected before they are returned to the user */
2401 st->first_dts = AV_NOPTS_VALUE;
2402 st->probe_packets = MAX_PROBE_PACKETS;
2404 /* default pts setting is MPEG-like */
2405 av_set_pts_info(st, 33, 1, 90000);
2406 st->last_IP_pts = AV_NOPTS_VALUE;
2407 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2408 st->pts_buffer[i]= AV_NOPTS_VALUE;
2409 st->reference_dts = AV_NOPTS_VALUE;
2411 st->sample_aspect_ratio = (AVRational){0,1};
2413 s->streams[s->nb_streams++] = st;
2417 AVProgram *av_new_program(AVFormatContext *ac, int id)
2419 AVProgram *program=NULL;
2423 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2426 for(i=0; i<ac->nb_programs; i++)
2427 if(ac->programs[i]->id == id)
2428 program = ac->programs[i];
2431 program = av_mallocz(sizeof(AVProgram));
2434 dynarray_add(&ac->programs, &ac->nb_programs, program);
2435 program->discard = AVDISCARD_NONE;
2442 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2444 AVChapter *chapter = NULL;
2447 for(i=0; i<s->nb_chapters; i++)
2448 if(s->chapters[i]->id == id)
2449 chapter = s->chapters[i];
2452 chapter= av_mallocz(sizeof(AVChapter));
2455 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2457 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2458 av_free(chapter->title);
2460 av_metadata_set(&chapter->metadata, "title", title);
2462 chapter->time_base= time_base;
2463 chapter->start = start;
2469 /************************************************************/
2470 /* output media file */
2472 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2476 if (s->oformat->priv_data_size > 0) {
2477 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2479 return AVERROR(ENOMEM);
2481 s->priv_data = NULL;
2483 if (s->oformat->set_parameters) {
2484 ret = s->oformat->set_parameters(s, ap);
2491 int av_write_header(AVFormatContext *s)
2496 // some sanity checks
2497 for(i=0;i<s->nb_streams;i++) {
2500 switch (st->codec->codec_type) {
2501 case CODEC_TYPE_AUDIO:
2502 if(st->codec->sample_rate<=0){
2503 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2506 if(!st->codec->block_align)
2507 st->codec->block_align = st->codec->channels *
2508 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2510 case CODEC_TYPE_VIDEO:
2511 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2512 av_log(s, AV_LOG_ERROR, "time base not set\n");
2515 if(st->codec->width<=0 || st->codec->height<=0){
2516 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2519 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2520 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2526 if(s->oformat->codec_tag){
2527 if(st->codec->codec_tag){
2529 //check that tag + id is in the table
2530 //if neither is in the table -> OK
2531 //if tag is in the table with another id -> FAIL
2532 //if id is in the table with another tag -> FAIL unless strict < ?
2534 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2537 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2538 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2539 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2542 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2543 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2545 return AVERROR(ENOMEM);
2548 #if LIBAVFORMAT_VERSION_MAJOR < 53
2549 ff_metadata_mux_compat(s);
2552 if(s->oformat->write_header){
2553 ret = s->oformat->write_header(s);
2558 /* init PTS generation */
2559 for(i=0;i<s->nb_streams;i++) {
2560 int64_t den = AV_NOPTS_VALUE;
2563 switch (st->codec->codec_type) {
2564 case CODEC_TYPE_AUDIO:
2565 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2567 case CODEC_TYPE_VIDEO:
2568 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2573 if (den != AV_NOPTS_VALUE) {
2575 return AVERROR_INVALIDDATA;
2576 av_frac_init(&st->pts, 0, 0, den);
2582 //FIXME merge with compute_pkt_fields
2583 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
2584 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2585 int num, den, frame_size, i;
2587 // 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);
2589 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2592 /* duration field */
2593 if (pkt->duration == 0) {
2594 compute_frame_duration(&num, &den, st, NULL, pkt);
2596 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2600 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2603 //XXX/FIXME this is a temporary hack until all encoders output pts
2604 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2606 // pkt->pts= st->cur_dts;
2607 pkt->pts= st->pts.val;
2610 //calculate dts from pts
2611 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2612 st->pts_buffer[0]= pkt->pts;
2613 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2614 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2615 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2616 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2618 pkt->dts= st->pts_buffer[0];
2621 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2622 av_log(s, AV_LOG_ERROR,
2623 "st:%d error, non monotone timestamps %"PRId64" >= %"PRId64"\n",
2624 st->index, st->cur_dts, pkt->dts);
2627 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2628 av_log(s, AV_LOG_ERROR, "st:%d error, pts < dts\n", st->index);
2632 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2633 st->cur_dts= pkt->dts;
2634 st->pts.val= pkt->dts;
2637 switch (st->codec->codec_type) {
2638 case CODEC_TYPE_AUDIO:
2639 frame_size = get_audio_frame_size(st->codec, pkt->size);
2641 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2642 likely equal to the encoder delay, but it would be better if we
2643 had the real timestamps from the encoder */
2644 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2645 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2648 case CODEC_TYPE_VIDEO:
2649 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2657 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2659 int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
2661 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2664 ret= s->oformat->write_packet(s, pkt);
2666 ret= url_ferror(s->pb);
2670 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
2671 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
2673 AVPacketList **next_point, *this_pktl;
2675 this_pktl = av_mallocz(sizeof(AVPacketList));
2676 this_pktl->pkt= *pkt;
2677 pkt->destruct= NULL; // do not free original but only the copy
2678 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
2680 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
2681 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
2683 next_point = &s->packet_buffer;
2686 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
2687 while(!compare(s, &(*next_point)->pkt, pkt)){
2688 next_point= &(*next_point)->next;
2692 next_point = &(s->packet_buffer_end->next);
2695 assert(!*next_point);
2697 s->packet_buffer_end= this_pktl;
2700 this_pktl->next= *next_point;
2702 s->streams[pkt->stream_index]->last_in_packet_buffer=
2703 *next_point= this_pktl;
2706 int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
2708 AVStream *st = s->streams[ pkt ->stream_index];
2709 AVStream *st2= s->streams[ next->stream_index];
2710 int64_t left = st2->time_base.num * (int64_t)st ->time_base.den;
2711 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2713 if (pkt->dts == AV_NOPTS_VALUE)
2716 return next->dts * left > pkt->dts * right; //FIXME this can overflow
2719 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2725 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
2728 for(i=0; i < s->nb_streams; i++)
2729 stream_count+= !!s->streams[i]->last_in_packet_buffer;
2731 if(stream_count && (s->nb_streams == stream_count || flush)){
2732 pktl= s->packet_buffer;
2735 s->packet_buffer= pktl->next;
2736 if(!s->packet_buffer)
2737 s->packet_buffer_end= NULL;
2739 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
2740 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
2744 av_init_packet(out);
2750 * Interleaves an AVPacket correctly so it can be muxed.
2751 * @param out the interleaved packet will be output here
2752 * @param in the input packet
2753 * @param flush 1 if no further packets are available as input and all
2754 * remaining packets should be output
2755 * @return 1 if a packet was output, 0 if no packet could be output,
2756 * < 0 if an error occurred
2758 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2759 if(s->oformat->interleave_packet)
2760 return s->oformat->interleave_packet(s, out, in, flush);
2762 return av_interleave_packet_per_dts(s, out, in, flush);
2765 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2766 AVStream *st= s->streams[ pkt->stream_index];
2768 //FIXME/XXX/HACK drop zero sized packets
2769 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2772 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2773 if(compute_pkt_fields2(s, st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2776 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2781 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2782 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2785 ret= s->oformat->write_packet(s, &opkt);
2787 av_free_packet(&opkt);
2792 if(url_ferror(s->pb))
2793 return url_ferror(s->pb);
2797 int av_write_trailer(AVFormatContext *s)
2803 ret= av_interleave_packet(s, &pkt, NULL, 1);
2804 if(ret<0) //FIXME cleanup needed for ret<0 ?
2809 ret= s->oformat->write_packet(s, &pkt);
2811 av_free_packet(&pkt);
2815 if(url_ferror(s->pb))
2819 if(s->oformat->write_trailer)
2820 ret = s->oformat->write_trailer(s);
2823 ret=url_ferror(s->pb);
2824 for(i=0;i<s->nb_streams;i++)
2825 av_freep(&s->streams[i]->priv_data);
2826 av_freep(&s->priv_data);
2830 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2833 AVProgram *program=NULL;
2836 if (idx >= ac->nb_streams) {
2837 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
2841 for(i=0; i<ac->nb_programs; i++){
2842 if(ac->programs[i]->id != progid)
2844 program = ac->programs[i];
2845 for(j=0; j<program->nb_stream_indexes; j++)
2846 if(program->stream_index[j] == idx)
2849 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2852 program->stream_index = tmp;
2853 program->stream_index[program->nb_stream_indexes++] = idx;
2858 static void print_fps(double d, const char *postfix){
2859 uint64_t v= lrintf(d*100);
2860 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
2861 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
2862 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
2865 static void dump_metadata(void *ctx, AVMetadata *m, const char *indent)
2867 if(m && !(m->count == 1 && av_metadata_get(m, "language", NULL, 0))){
2868 AVMetadataTag *tag=NULL;
2870 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
2871 while((tag=av_metadata_get(m, "", tag, AV_METADATA_IGNORE_SUFFIX))) {
2872 if(strcmp("language", tag->key))
2873 av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
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->avg_frame_rate.den && st->avg_frame_rate.num)
2909 print_fps(av_q2d(st->avg_frame_rate), "fps");
2910 if(st->r_frame_rate.den && st->r_frame_rate.num)
2911 print_fps(av_q2d(st->r_frame_rate), "tbr");
2912 if(st->time_base.den && st->time_base.num)
2913 print_fps(1/av_q2d(st->time_base), "tbn");
2914 if(st->codec->time_base.den && st->codec->time_base.num)
2915 print_fps(1/av_q2d(st->codec->time_base), "tbc");
2917 av_log(NULL, AV_LOG_INFO, "\n");
2918 dump_metadata(NULL, st->metadata, " ");
2921 void dump_format(AVFormatContext *ic,
2927 uint8_t *printed = av_mallocz(ic->nb_streams);
2928 if (ic->nb_streams && !printed)
2931 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2932 is_output ? "Output" : "Input",
2934 is_output ? ic->oformat->name : ic->iformat->name,
2935 is_output ? "to" : "from", url);
2936 dump_metadata(NULL, ic->metadata, " ");
2938 av_log(NULL, AV_LOG_INFO, " Duration: ");
2939 if (ic->duration != AV_NOPTS_VALUE) {
2940 int hours, mins, secs, us;
2941 secs = ic->duration / AV_TIME_BASE;
2942 us = ic->duration % AV_TIME_BASE;
2947 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
2948 (100 * us) / AV_TIME_BASE);
2950 av_log(NULL, AV_LOG_INFO, "N/A");
2952 if (ic->start_time != AV_NOPTS_VALUE) {
2954 av_log(NULL, AV_LOG_INFO, ", start: ");
2955 secs = ic->start_time / AV_TIME_BASE;
2956 us = ic->start_time % AV_TIME_BASE;
2957 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2958 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2960 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2962 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2964 av_log(NULL, AV_LOG_INFO, "N/A");
2966 av_log(NULL, AV_LOG_INFO, "\n");
2968 if(ic->nb_programs) {
2969 int j, k, total = 0;
2970 for(j=0; j<ic->nb_programs; j++) {
2971 AVMetadataTag *name = av_metadata_get(ic->programs[j]->metadata,
2973 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2974 name ? name->value : "");
2975 dump_metadata(NULL, ic->programs[j]->metadata, " ");
2976 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
2977 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2978 printed[ic->programs[j]->stream_index[k]] = 1;
2980 total += ic->programs[j]->nb_stream_indexes;
2982 if (total < ic->nb_streams)
2983 av_log(NULL, AV_LOG_INFO, " No Program\n");
2985 for(i=0;i<ic->nb_streams;i++)
2987 dump_stream_format(ic, i, index, is_output);
2992 #if LIBAVFORMAT_VERSION_MAJOR < 53
2993 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2995 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2998 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
3000 AVRational frame_rate;
3001 int ret = av_parse_video_frame_rate(&frame_rate, arg);
3002 *frame_rate_num= frame_rate.num;
3003 *frame_rate_den= frame_rate.den;
3008 int64_t av_gettime(void)
3011 gettimeofday(&tv,NULL);
3012 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3015 int64_t parse_date(const char *datestr, int duration)
3021 static const char * const date_fmt[] = {
3025 static const char * const time_fmt[] = {
3035 time_t now = time(0);
3037 len = strlen(datestr);
3039 lastch = datestr[len - 1];
3042 is_utc = (lastch == 'z' || lastch == 'Z');
3044 memset(&dt, 0, sizeof(dt));
3049 if (!strncasecmp(datestr, "now", len))
3050 return (int64_t) now * 1000000;
3052 /* parse the year-month-day part */
3053 for (i = 0; i < FF_ARRAY_ELEMS(date_fmt); i++) {
3054 q = small_strptime(p, date_fmt[i], &dt);
3060 /* if the year-month-day part is missing, then take the
3061 * current year-month-day time */
3066 dt = *localtime(&now);
3068 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
3073 if (*p == 'T' || *p == 't' || *p == ' ')
3076 /* parse the hour-minute-second part */
3077 for (i = 0; i < FF_ARRAY_ELEMS(time_fmt); i++) {
3078 q = small_strptime(p, time_fmt[i], &dt);
3084 /* parse datestr as a duration */
3089 /* parse datestr as HH:MM:SS */
3090 q = small_strptime(p, time_fmt[0], &dt);
3092 /* parse datestr as S+ */
3093 dt.tm_sec = strtol(p, (char **)&q, 10);
3095 /* the parsing didn't succeed */
3102 /* Now we have all the fields that we can get */
3108 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
3110 dt.tm_isdst = -1; /* unknown */
3120 /* parse the .m... part */
3124 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
3127 val += n * (*q - '0');
3131 return negative ? -t : t;
3134 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3144 while (*p != '\0' && *p != '=' && *p != '&') {
3145 if ((q - tag) < sizeof(tag) - 1)
3153 while (*p != '&' && *p != '\0') {
3154 if ((q - arg) < arg_size - 1) {
3164 if (!strcmp(tag, tag1))
3173 int av_get_frame_filename(char *buf, int buf_size,
3174 const char *path, int number)
3177 char *q, buf1[20], c;
3178 int nd, len, percentd_found;
3190 while (isdigit(*p)) {
3191 nd = nd * 10 + *p++ - '0';
3194 } while (isdigit(c));
3203 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3205 if ((q - buf + len) > buf_size - 1)
3207 memcpy(q, buf1, len);
3215 if ((q - buf) < buf_size - 1)
3219 if (!percentd_found)
3228 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3232 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3234 for(i=0;i<size;i+=16) {
3241 PRINT(" %02x", buf[i+j]);
3246 for(j=0;j<len;j++) {
3248 if (c < ' ' || c > '~')
3257 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3259 hex_dump_internal(NULL, f, 0, buf, size);
3262 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3264 hex_dump_internal(avcl, NULL, level, buf, size);
3267 //FIXME needs to know the time_base
3268 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
3271 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3272 PRINT("stream #%d:\n", pkt->stream_index);
3273 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3274 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3275 /* DTS is _always_ valid after av_read_frame() */
3277 if (pkt->dts == AV_NOPTS_VALUE)
3280 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
3281 /* PTS may not be known if B-frames are present. */
3283 if (pkt->pts == AV_NOPTS_VALUE)
3286 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
3288 PRINT(" size=%d\n", pkt->size);
3291 av_hex_dump(f, pkt->data, pkt->size);
3294 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3296 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
3299 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3301 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
3304 void url_split(char *proto, int proto_size,
3305 char *authorization, int authorization_size,
3306 char *hostname, int hostname_size,
3308 char *path, int path_size,
3311 const char *p, *ls, *at, *col, *brk;
3313 if (port_ptr) *port_ptr = -1;
3314 if (proto_size > 0) proto[0] = 0;
3315 if (authorization_size > 0) authorization[0] = 0;
3316 if (hostname_size > 0) hostname[0] = 0;
3317 if (path_size > 0) path[0] = 0;
3319 /* parse protocol */
3320 if ((p = strchr(url, ':'))) {
3321 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3326 /* no protocol means plain filename */
3327 av_strlcpy(path, url, path_size);
3331 /* separate path from hostname */
3332 ls = strchr(p, '/');
3334 ls = strchr(p, '?');
3336 av_strlcpy(path, ls, path_size);
3338 ls = &p[strlen(p)]; // XXX
3340 /* the rest is hostname, use that to parse auth/port */
3342 /* authorization (user[:pass]@hostname) */
3343 if ((at = strchr(p, '@')) && at < ls) {
3344 av_strlcpy(authorization, p,
3345 FFMIN(authorization_size, at + 1 - p));
3346 p = at + 1; /* skip '@' */
3349 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3351 av_strlcpy(hostname, p + 1,
3352 FFMIN(hostname_size, brk - p));
3353 if (brk[1] == ':' && port_ptr)
3354 *port_ptr = atoi(brk + 2);
3355 } else if ((col = strchr(p, ':')) && col < ls) {
3356 av_strlcpy(hostname, p,
3357 FFMIN(col + 1 - p, hostname_size));
3358 if (port_ptr) *port_ptr = atoi(col + 1);
3360 av_strlcpy(hostname, p,
3361 FFMIN(ls + 1 - p, hostname_size));
3365 char *ff_data_to_hex(char *buff, const uint8_t *src, int s)
3368 static const char hex_table[16] = { '0', '1', '2', '3',
3371 'C', 'D', 'E', 'F' };
3373 for(i = 0; i < s; i++) {
3374 buff[i * 2] = hex_table[src[i] >> 4];
3375 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3381 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3382 unsigned int pts_num, unsigned int pts_den)
3384 s->pts_wrap_bits = pts_wrap_bits;
3386 if(av_reduce(&s->time_base.num, &s->time_base.den, pts_num, pts_den, INT_MAX)){
3387 if(s->time_base.num != pts_num)
3388 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/s->time_base.num);
3390 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3392 if(!s->time_base.num || !s->time_base.den)
3393 s->time_base.num= s->time_base.den= 0;