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 /* fraction handling */
47 * f = val + (num / den) + 0.5.
49 * 'num' is normalized so that it is such as 0 <= num < den.
51 * @param f fractional number
52 * @param val integer value
53 * @param num must be >= 0
54 * @param den must be >= 1
56 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
69 * Fractional addition to f: f = f + (incr / f->den).
71 * @param f fractional number
72 * @param incr increment, can be positive or negative
74 static void av_frac_add(AVFrac *f, int64_t incr)
87 } else if (num >= den) {
94 /** head of registered input format linked list */
95 AVInputFormat *first_iformat = NULL;
96 /** head of registered output format linked list */
97 AVOutputFormat *first_oformat = NULL;
99 AVInputFormat *av_iformat_next(AVInputFormat *f)
101 if(f) return f->next;
102 else return first_iformat;
105 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
107 if(f) return f->next;
108 else return first_oformat;
111 void av_register_input_format(AVInputFormat *format)
115 while (*p != NULL) p = &(*p)->next;
120 void av_register_output_format(AVOutputFormat *format)
124 while (*p != NULL) p = &(*p)->next;
129 int match_ext(const char *filename, const char *extensions)
137 ext = strrchr(filename, '.');
143 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
146 if (!strcasecmp(ext1, ext))
156 static int match_format(const char *name, const char *names)
164 namelen = strlen(name);
165 while ((p = strchr(names, ','))) {
166 len = FFMAX(p - names, namelen);
167 if (!strncasecmp(name, names, len))
171 return !strcasecmp(name, names);
174 AVOutputFormat *guess_format(const char *short_name, const char *filename,
175 const char *mime_type)
177 AVOutputFormat *fmt, *fmt_found;
178 int score_max, score;
180 /* specific test for image sequences */
181 #if CONFIG_IMAGE2_MUXER
182 if (!short_name && filename &&
183 av_filename_number_test(filename) &&
184 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
185 return guess_format("image2", NULL, NULL);
188 /* Find the proper file type. */
192 while (fmt != NULL) {
194 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
196 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
198 if (filename && fmt->extensions &&
199 match_ext(filename, fmt->extensions)) {
202 if (score > score_max) {
211 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
212 const char *mime_type)
214 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
217 AVOutputFormat *stream_fmt;
218 char stream_format_name[64];
220 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
221 stream_fmt = guess_format(stream_format_name, NULL, NULL);
230 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
231 const char *filename, const char *mime_type, enum CodecType type){
232 if(type == CODEC_TYPE_VIDEO){
233 enum CodecID codec_id= CODEC_ID_NONE;
235 #if CONFIG_IMAGE2_MUXER
236 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
237 codec_id= av_guess_image2_codec(filename);
240 if(codec_id == CODEC_ID_NONE)
241 codec_id= fmt->video_codec;
243 }else if(type == CODEC_TYPE_AUDIO)
244 return fmt->audio_codec;
246 return CODEC_ID_NONE;
249 AVInputFormat *av_find_input_format(const char *short_name)
252 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
253 if (match_format(short_name, fmt->name))
259 /* memory handling */
262 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
264 int ret= av_new_packet(pkt, size);
269 pkt->pos= url_ftell(s);
271 ret= get_buffer(s, pkt->data, size);
275 av_shrink_packet(pkt, ret);
281 int av_filename_number_test(const char *filename)
284 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
287 static AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
289 AVInputFormat *fmt1, *fmt;
293 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
294 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
297 if (fmt1->read_probe) {
298 score = fmt1->read_probe(pd);
299 } else if (fmt1->extensions) {
300 if (match_ext(pd->filename, fmt1->extensions)) {
304 if (score > *score_max) {
307 }else if (score == *score_max)
313 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
315 return av_probe_input_format2(pd, is_opened, &score);
318 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
321 fmt = av_probe_input_format2(pd, 1, &score);
324 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
325 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
326 if (!strcmp(fmt->name, "mp3")) {
327 st->codec->codec_id = CODEC_ID_MP3;
328 st->codec->codec_type = CODEC_TYPE_AUDIO;
329 } else if (!strcmp(fmt->name, "ac3")) {
330 st->codec->codec_id = CODEC_ID_AC3;
331 st->codec->codec_type = CODEC_TYPE_AUDIO;
332 } else if (!strcmp(fmt->name, "mpegvideo")) {
333 st->codec->codec_id = CODEC_ID_MPEG2VIDEO;
334 st->codec->codec_type = CODEC_TYPE_VIDEO;
335 } else if (!strcmp(fmt->name, "m4v")) {
336 st->codec->codec_id = CODEC_ID_MPEG4;
337 st->codec->codec_type = CODEC_TYPE_VIDEO;
338 } else if (!strcmp(fmt->name, "h264")) {
339 st->codec->codec_id = CODEC_ID_H264;
340 st->codec->codec_type = CODEC_TYPE_VIDEO;
341 } else if (!strcmp(fmt->name, "dts")) {
342 st->codec->codec_id = CODEC_ID_DTS;
343 st->codec->codec_type = CODEC_TYPE_AUDIO;
349 /************************************************************/
350 /* input media file */
353 * Open a media file from an IO stream. 'fmt' must be specified.
355 int av_open_input_stream(AVFormatContext **ic_ptr,
356 ByteIOContext *pb, const char *filename,
357 AVInputFormat *fmt, AVFormatParameters *ap)
361 AVFormatParameters default_ap;
365 memset(ap, 0, sizeof(default_ap));
368 if(!ap->prealloced_context)
369 ic = avformat_alloc_context();
373 err = AVERROR(ENOMEM);
378 ic->duration = AV_NOPTS_VALUE;
379 ic->start_time = AV_NOPTS_VALUE;
380 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
382 /* allocate private data */
383 if (fmt->priv_data_size > 0) {
384 ic->priv_data = av_mallocz(fmt->priv_data_size);
385 if (!ic->priv_data) {
386 err = AVERROR(ENOMEM);
390 ic->priv_data = NULL;
393 if (ic->iformat->read_header) {
394 err = ic->iformat->read_header(ic, ap);
399 if (pb && !ic->data_offset)
400 ic->data_offset = url_ftell(ic->pb);
402 #if LIBAVFORMAT_VERSION_MAJOR < 53
403 ff_metadata_demux_compat(ic);
406 ic->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
413 av_freep(&ic->priv_data);
414 for(i=0;i<ic->nb_streams;i++) {
415 AVStream *st = ic->streams[i];
417 av_free(st->priv_data);
418 av_free(st->codec->extradata);
428 /** size of probe buffer, for guessing file type from file contents */
429 #define PROBE_BUF_MIN 2048
430 #define PROBE_BUF_MAX (1<<20)
432 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
435 AVFormatParameters *ap)
438 AVProbeData probe_data, *pd = &probe_data;
439 ByteIOContext *pb = NULL;
440 void *logctx= ap && ap->prealloced_context ? *ic_ptr : NULL;
444 pd->filename = filename;
449 /* guess format if no file can be opened */
450 fmt = av_probe_input_format(pd, 0);
453 /* Do not open file if the format does not need it. XXX: specific
454 hack needed to handle RTSP/TCP */
455 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
456 /* if no file needed do not try to open one */
457 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
461 url_setbufsize(pb, buf_size);
464 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
465 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
466 /* read probe data */
467 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
468 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
469 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
470 if (url_fseek(pb, 0, SEEK_SET) < 0) {
472 if (url_fopen(&pb, filename, URL_RDONLY) < 0) {
478 /* guess file format */
479 fmt = av_probe_input_format2(pd, 1, &score);
481 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
482 av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
484 av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
490 /* if still no format found, error */
496 /* check filename in case an image number is expected */
497 if (fmt->flags & AVFMT_NEEDNUMBER) {
498 if (!av_filename_number_test(filename)) {
499 err = AVERROR_NUMEXPECTED;
503 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
511 if (ap && ap->prealloced_context)
518 /*******************************************************/
520 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
521 AVPacketList **plast_pktl){
522 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
527 (*plast_pktl)->next = pktl;
529 *packet_buffer = pktl;
531 /* add the packet in the buffered packet list */
537 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
543 AVPacketList *pktl = s->raw_packet_buffer;
547 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
548 !s->streams[pkt->stream_index]->probe_packets ||
549 s->raw_packet_buffer_remaining_size < pkt->size){
550 AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
553 s->raw_packet_buffer = pktl->next;
554 s->raw_packet_buffer_remaining_size += pkt->size;
561 ret= s->iformat->read_packet(s, pkt);
563 if (!pktl || ret == AVERROR(EAGAIN))
565 for (i = 0; i < s->nb_streams; i++)
566 s->streams[i]->probe_packets = 0;
569 st= s->streams[pkt->stream_index];
571 switch(st->codec->codec_type){
572 case CODEC_TYPE_VIDEO:
573 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
575 case CODEC_TYPE_AUDIO:
576 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
578 case CODEC_TYPE_SUBTITLE:
579 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
583 if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
587 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
588 s->raw_packet_buffer_remaining_size -= pkt->size;
590 if(st->codec->codec_id == CODEC_ID_PROBE){
591 AVProbeData *pd = &st->probe_data;
595 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
596 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
597 pd->buf_size += pkt->size;
598 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
600 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
601 set_codec_from_probe_data(s, st, pd, 1);
602 if(st->codec->codec_id != CODEC_ID_PROBE){
611 /**********************************************************/
614 * Get the number of samples of an audio frame. Return -1 on error.
616 static int get_audio_frame_size(AVCodecContext *enc, int size)
620 if(enc->codec_id == CODEC_ID_VORBIS)
623 if (enc->frame_size <= 1) {
624 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
626 if (bits_per_sample) {
627 if (enc->channels == 0)
629 frame_size = (size << 3) / (bits_per_sample * enc->channels);
631 /* used for example by ADPCM codecs */
632 if (enc->bit_rate == 0)
634 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
637 frame_size = enc->frame_size;
644 * Return the frame duration in seconds. Return 0 if not available.
646 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
647 AVCodecParserContext *pc, AVPacket *pkt)
653 switch(st->codec->codec_type) {
654 case CODEC_TYPE_VIDEO:
655 if(st->time_base.num*1000LL > st->time_base.den){
656 *pnum = st->time_base.num;
657 *pden = st->time_base.den;
658 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
659 *pnum = st->codec->time_base.num;
660 *pden = st->codec->time_base.den;
661 if (pc && pc->repeat_pict) {
662 *pnum = (*pnum) * (1 + pc->repeat_pict);
666 case CODEC_TYPE_AUDIO:
667 frame_size = get_audio_frame_size(st->codec, pkt->size);
671 *pden = st->codec->sample_rate;
678 static int is_intra_only(AVCodecContext *enc){
679 if(enc->codec_type == CODEC_TYPE_AUDIO){
681 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
682 switch(enc->codec_id){
684 case CODEC_ID_MJPEGB:
686 case CODEC_ID_RAWVIDEO:
687 case CODEC_ID_DVVIDEO:
688 case CODEC_ID_HUFFYUV:
689 case CODEC_ID_FFVHUFF:
694 case CODEC_ID_JPEG2000:
702 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
703 int64_t dts, int64_t pts)
705 AVStream *st= s->streams[stream_index];
706 AVPacketList *pktl= s->packet_buffer;
708 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
711 st->first_dts= dts - st->cur_dts;
714 for(; pktl; pktl= pktl->next){
715 if(pktl->pkt.stream_index != stream_index)
717 //FIXME think more about this check
718 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
719 pktl->pkt.pts += st->first_dts;
721 if(pktl->pkt.dts != AV_NOPTS_VALUE)
722 pktl->pkt.dts += st->first_dts;
724 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
725 st->start_time= pktl->pkt.pts;
727 if (st->start_time == AV_NOPTS_VALUE)
728 st->start_time = pts;
731 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
733 AVPacketList *pktl= s->packet_buffer;
736 if(st->first_dts != AV_NOPTS_VALUE){
737 cur_dts= st->first_dts;
738 for(; pktl; pktl= pktl->next){
739 if(pktl->pkt.stream_index == pkt->stream_index){
740 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
742 cur_dts -= pkt->duration;
745 pktl= s->packet_buffer;
746 st->first_dts = cur_dts;
747 }else if(st->cur_dts)
750 for(; pktl; pktl= pktl->next){
751 if(pktl->pkt.stream_index != pkt->stream_index)
753 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
754 && !pktl->pkt.duration){
755 pktl->pkt.dts= cur_dts;
756 if(!st->codec->has_b_frames)
757 pktl->pkt.pts= cur_dts;
758 cur_dts += pkt->duration;
759 pktl->pkt.duration= pkt->duration;
763 if(st->first_dts == AV_NOPTS_VALUE)
764 st->cur_dts= cur_dts;
767 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
768 AVCodecParserContext *pc, AVPacket *pkt)
770 int num, den, presentation_delayed, delay, i;
773 if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == FF_B_TYPE)
774 //FIXME Set low_delay = 0 when has_b_frames = 1
775 st->codec->has_b_frames = 1;
777 /* do we have a video B-frame ? */
778 delay= st->codec->has_b_frames;
779 presentation_delayed = 0;
780 /* XXX: need has_b_frame, but cannot get it if the codec is
783 pc && pc->pict_type != FF_B_TYPE)
784 presentation_delayed = 1;
786 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
787 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
788 pkt->dts -= 1LL<<st->pts_wrap_bits;
791 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
792 // we take the conservative approach and discard both
793 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
794 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
795 av_log(s, AV_LOG_WARNING, "invalid dts/pts combination\n");
796 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
799 if (pkt->duration == 0) {
800 compute_frame_duration(&num, &den, st, pc, pkt);
802 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
804 if(pkt->duration != 0 && s->packet_buffer)
805 update_initial_durations(s, st, pkt);
809 /* correct timestamps with byte offset if demuxers only have timestamps
810 on packet boundaries */
811 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
812 /* this will estimate bitrate based on this frame's duration and size */
813 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
814 if(pkt->pts != AV_NOPTS_VALUE)
816 if(pkt->dts != AV_NOPTS_VALUE)
820 if (pc && pc->dts_sync_point >= 0) {
821 // we have synchronization info from the parser
822 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
824 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
825 if (pkt->dts != AV_NOPTS_VALUE) {
826 // got DTS from the stream, update reference timestamp
827 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
828 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
829 } else if (st->reference_dts != AV_NOPTS_VALUE) {
830 // compute DTS based on reference timestamp
831 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
832 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
834 if (pc->dts_sync_point > 0)
835 st->reference_dts = pkt->dts; // new reference
839 /* This may be redundant, but it should not hurt. */
840 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
841 presentation_delayed = 1;
843 // 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);
844 /* interpolate PTS and DTS if they are not present */
845 //We skip H264 currently because delay and has_b_frames are not reliably set
846 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
847 if (presentation_delayed) {
848 /* DTS = decompression timestamp */
849 /* PTS = presentation timestamp */
850 if (pkt->dts == AV_NOPTS_VALUE)
851 pkt->dts = st->last_IP_pts;
852 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
853 if (pkt->dts == AV_NOPTS_VALUE)
854 pkt->dts = st->cur_dts;
856 /* this is tricky: the dts must be incremented by the duration
857 of the frame we are displaying, i.e. the last I- or P-frame */
858 if (st->last_IP_duration == 0)
859 st->last_IP_duration = pkt->duration;
860 if(pkt->dts != AV_NOPTS_VALUE)
861 st->cur_dts = pkt->dts + st->last_IP_duration;
862 st->last_IP_duration = pkt->duration;
863 st->last_IP_pts= pkt->pts;
864 /* cannot compute PTS if not present (we can compute it only
865 by knowing the future */
866 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
867 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
868 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
869 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
870 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
871 pkt->pts += pkt->duration;
872 // 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);
876 /* presentation is not delayed : PTS and DTS are the same */
877 if(pkt->pts == AV_NOPTS_VALUE)
879 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
880 if(pkt->pts == AV_NOPTS_VALUE)
881 pkt->pts = st->cur_dts;
883 if(pkt->pts != AV_NOPTS_VALUE)
884 st->cur_dts = pkt->pts + pkt->duration;
888 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
889 st->pts_buffer[0]= pkt->pts;
890 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
891 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
892 if(pkt->dts == AV_NOPTS_VALUE)
893 pkt->dts= st->pts_buffer[0];
894 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
895 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
897 if(pkt->dts > st->cur_dts)
898 st->cur_dts = pkt->dts;
901 // 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);
904 if(is_intra_only(st->codec))
905 pkt->flags |= PKT_FLAG_KEY;
908 /* keyframe computation */
909 if (pc->key_frame == 1)
910 pkt->flags |= PKT_FLAG_KEY;
911 else if (pc->key_frame == -1 && pc->pict_type == FF_I_TYPE)
912 pkt->flags |= PKT_FLAG_KEY;
915 pkt->convergence_duration = pc->convergence_duration;
919 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
927 /* select current input stream component */
930 if (!st->need_parsing || !st->parser) {
931 /* no parsing needed: we just output the packet as is */
932 /* raw data support */
933 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
934 compute_pkt_fields(s, st, NULL, pkt);
936 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
937 (pkt->flags & PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
938 ff_reduce_index(s, st->index);
939 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
942 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
943 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
944 st->cur_ptr, st->cur_len,
945 st->cur_pkt.pts, st->cur_pkt.dts,
947 st->cur_pkt.pts = AV_NOPTS_VALUE;
948 st->cur_pkt.dts = AV_NOPTS_VALUE;
949 /* increment read pointer */
953 /* return packet if any */
957 pkt->stream_index = st->index;
958 pkt->pts = st->parser->pts;
959 pkt->dts = st->parser->dts;
960 pkt->pos = st->parser->pos;
961 pkt->destruct = NULL;
962 compute_pkt_fields(s, st, st->parser, pkt);
964 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
965 ff_reduce_index(s, st->index);
966 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
967 0, 0, AVINDEX_KEYFRAME);
974 av_free_packet(&st->cur_pkt);
979 /* read next packet */
980 ret = av_read_packet(s, &cur_pkt);
982 if (ret == AVERROR(EAGAIN))
984 /* return the last frames, if any */
985 for(i = 0; i < s->nb_streams; i++) {
987 if (st->parser && st->need_parsing) {
988 av_parser_parse2(st->parser, st->codec,
989 &pkt->data, &pkt->size,
991 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
997 /* no more packets: really terminate parsing */
1000 st = s->streams[cur_pkt.stream_index];
1001 st->cur_pkt= cur_pkt;
1003 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1004 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1005 st->cur_pkt.pts < st->cur_pkt.dts){
1006 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1007 st->cur_pkt.stream_index,
1011 // av_free_packet(&st->cur_pkt);
1015 if(s->debug & FF_FDEBUG_TS)
1016 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, flags=%d\n",
1017 st->cur_pkt.stream_index,
1024 st->cur_ptr = st->cur_pkt.data;
1025 st->cur_len = st->cur_pkt.size;
1026 if (st->need_parsing && !st->parser) {
1027 st->parser = av_parser_init(st->codec->codec_id);
1029 /* no parser available: just output the raw packets */
1030 st->need_parsing = AVSTREAM_PARSE_NONE;
1031 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1032 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1034 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
1035 st->parser->next_frame_offset=
1036 st->parser->cur_offset= st->cur_pkt.pos;
1041 if(s->debug & FF_FDEBUG_TS)
1042 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, flags=%d\n",
1052 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1056 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1059 pktl = s->packet_buffer;
1061 AVPacket *next_pkt= &pktl->pkt;
1063 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1064 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1065 if( pktl->pkt.stream_index == next_pkt->stream_index
1066 && next_pkt->dts < pktl->pkt.dts
1067 && pktl->pkt.pts != pktl->pkt.dts //not b frame
1068 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1069 next_pkt->pts= pktl->pkt.dts;
1073 pktl = s->packet_buffer;
1076 if( next_pkt->pts != AV_NOPTS_VALUE
1077 || next_pkt->dts == AV_NOPTS_VALUE
1079 /* read packet from packet buffer, if there is data */
1081 s->packet_buffer = pktl->next;
1087 int ret= av_read_frame_internal(s, pkt);
1089 if(pktl && ret != AVERROR(EAGAIN)){
1096 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1097 &s->packet_buffer_end)) < 0)
1098 return AVERROR(ENOMEM);
1100 assert(!s->packet_buffer);
1101 return av_read_frame_internal(s, pkt);
1106 /* XXX: suppress the packet queue */
1107 static void flush_packet_queue(AVFormatContext *s)
1112 pktl = s->packet_buffer;
1115 s->packet_buffer = pktl->next;
1116 av_free_packet(&pktl->pkt);
1119 while(s->raw_packet_buffer){
1120 pktl = s->raw_packet_buffer;
1121 s->raw_packet_buffer = pktl->next;
1122 av_free_packet(&pktl->pkt);
1125 s->packet_buffer_end=
1126 s->raw_packet_buffer_end= NULL;
1127 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1130 /*******************************************************/
1133 int av_find_default_stream_index(AVFormatContext *s)
1135 int first_audio_index = -1;
1139 if (s->nb_streams <= 0)
1141 for(i = 0; i < s->nb_streams; i++) {
1143 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1146 if (first_audio_index < 0 && st->codec->codec_type == CODEC_TYPE_AUDIO)
1147 first_audio_index = i;
1149 return first_audio_index >= 0 ? first_audio_index : 0;
1153 * Flush the frame reader.
1155 void av_read_frame_flush(AVFormatContext *s)
1160 flush_packet_queue(s);
1164 /* for each stream, reset read state */
1165 for(i = 0; i < s->nb_streams; i++) {
1169 av_parser_close(st->parser);
1171 av_free_packet(&st->cur_pkt);
1173 st->last_IP_pts = AV_NOPTS_VALUE;
1174 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1175 st->reference_dts = AV_NOPTS_VALUE;
1180 st->probe_packets = MAX_PROBE_PACKETS;
1184 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1187 for(i = 0; i < s->nb_streams; i++) {
1188 AVStream *st = s->streams[i];
1190 st->cur_dts = av_rescale(timestamp,
1191 st->time_base.den * (int64_t)ref_st->time_base.num,
1192 st->time_base.num * (int64_t)ref_st->time_base.den);
1196 void ff_reduce_index(AVFormatContext *s, int stream_index)
1198 AVStream *st= s->streams[stream_index];
1199 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1201 if((unsigned)st->nb_index_entries >= max_entries){
1203 for(i=0; 2*i<st->nb_index_entries; i++)
1204 st->index_entries[i]= st->index_entries[2*i];
1205 st->nb_index_entries= i;
1209 int av_add_index_entry(AVStream *st,
1210 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1212 AVIndexEntry *entries, *ie;
1215 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1218 entries = av_fast_realloc(st->index_entries,
1219 &st->index_entries_allocated_size,
1220 (st->nb_index_entries + 1) *
1221 sizeof(AVIndexEntry));
1225 st->index_entries= entries;
1227 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1230 index= st->nb_index_entries++;
1231 ie= &entries[index];
1232 assert(index==0 || ie[-1].timestamp < timestamp);
1234 ie= &entries[index];
1235 if(ie->timestamp != timestamp){
1236 if(ie->timestamp <= timestamp)
1238 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1239 st->nb_index_entries++;
1240 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1241 distance= ie->min_distance;
1245 ie->timestamp = timestamp;
1246 ie->min_distance= distance;
1253 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1256 AVIndexEntry *entries= st->index_entries;
1257 int nb_entries= st->nb_index_entries;
1266 timestamp = entries[m].timestamp;
1267 if(timestamp >= wanted_timestamp)
1269 if(timestamp <= wanted_timestamp)
1272 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1274 if(!(flags & AVSEEK_FLAG_ANY)){
1275 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1276 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1287 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1288 AVInputFormat *avif= s->iformat;
1289 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1290 int64_t ts_min, ts_max, ts;
1294 if (stream_index < 0)
1298 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1302 ts_min= AV_NOPTS_VALUE;
1303 pos_limit= -1; //gcc falsely says it may be uninitialized
1305 st= s->streams[stream_index];
1306 if(st->index_entries){
1309 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()
1310 index= FFMAX(index, 0);
1311 e= &st->index_entries[index];
1313 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1315 ts_min= e->timestamp;
1317 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1324 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1325 assert(index < st->nb_index_entries);
1327 e= &st->index_entries[index];
1328 assert(e->timestamp >= target_ts);
1330 ts_max= e->timestamp;
1331 pos_limit= pos_max - e->min_distance;
1333 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1334 pos_max,pos_limit, ts_max);
1339 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1344 url_fseek(s->pb, pos, SEEK_SET);
1346 av_update_cur_dts(s, st, ts);
1351 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 )){
1353 int64_t start_pos, filesize;
1357 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1360 if(ts_min == AV_NOPTS_VALUE){
1361 pos_min = s->data_offset;
1362 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1363 if (ts_min == AV_NOPTS_VALUE)
1367 if(ts_max == AV_NOPTS_VALUE){
1369 filesize = url_fsize(s->pb);
1370 pos_max = filesize - 1;
1373 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1375 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1376 if (ts_max == AV_NOPTS_VALUE)
1380 int64_t tmp_pos= pos_max + 1;
1381 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1382 if(tmp_ts == AV_NOPTS_VALUE)
1386 if(tmp_pos >= filesize)
1392 if(ts_min > ts_max){
1394 }else if(ts_min == ts_max){
1399 while (pos_min < pos_limit) {
1401 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1405 assert(pos_limit <= pos_max);
1408 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1409 // interpolate position (better than dichotomy)
1410 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1411 + pos_min - approximate_keyframe_distance;
1412 }else if(no_change==1){
1413 // bisection, if interpolation failed to change min or max pos last time
1414 pos = (pos_min + pos_limit)>>1;
1416 /* linear search if bisection failed, can only happen if there
1417 are very few or no keyframes between min/max */
1422 else if(pos > pos_limit)
1426 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1432 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1433 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit,
1434 start_pos, no_change);
1436 if(ts == AV_NOPTS_VALUE){
1437 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1440 assert(ts != AV_NOPTS_VALUE);
1441 if (target_ts <= ts) {
1442 pos_limit = start_pos - 1;
1446 if (target_ts >= ts) {
1452 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1453 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1456 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1458 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1459 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1460 pos, ts_min, target_ts, ts_max);
1466 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1467 int64_t pos_min, pos_max;
1471 if (stream_index < 0)
1474 st= s->streams[stream_index];
1477 pos_min = s->data_offset;
1478 pos_max = url_fsize(s->pb) - 1;
1480 if (pos < pos_min) pos= pos_min;
1481 else if(pos > pos_max) pos= pos_max;
1483 url_fseek(s->pb, pos, SEEK_SET);
1486 av_update_cur_dts(s, st, ts);
1491 static int av_seek_frame_generic(AVFormatContext *s,
1492 int stream_index, int64_t timestamp, int flags)
1498 st = s->streams[stream_index];
1500 index = av_index_search_timestamp(st, timestamp, flags);
1502 if(index < 0 || index==st->nb_index_entries-1){
1506 if(st->nb_index_entries){
1507 assert(st->index_entries);
1508 ie= &st->index_entries[st->nb_index_entries-1];
1509 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1511 av_update_cur_dts(s, st, ie->timestamp);
1513 if ((ret = url_fseek(s->pb, s->data_offset, SEEK_SET)) < 0)
1519 ret = av_read_frame(s, &pkt);
1520 }while(ret == AVERROR(EAGAIN));
1523 av_free_packet(&pkt);
1524 if(stream_index == pkt.stream_index){
1525 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1529 index = av_index_search_timestamp(st, timestamp, flags);
1534 av_read_frame_flush(s);
1535 if (s->iformat->read_seek){
1536 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1539 ie = &st->index_entries[index];
1540 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1542 av_update_cur_dts(s, st, ie->timestamp);
1547 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1552 av_read_frame_flush(s);
1554 if(flags & AVSEEK_FLAG_BYTE)
1555 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1557 if(stream_index < 0){
1558 stream_index= av_find_default_stream_index(s);
1559 if(stream_index < 0)
1562 st= s->streams[stream_index];
1563 /* timestamp for default must be expressed in AV_TIME_BASE units */
1564 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1567 /* first, we try the format specific seek */
1568 if (s->iformat->read_seek)
1569 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1576 if(s->iformat->read_timestamp)
1577 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1579 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1582 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1584 if(min_ts > ts || max_ts < ts)
1587 av_read_frame_flush(s);
1589 if (s->iformat->read_seek2)
1590 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1592 if(s->iformat->read_timestamp){
1593 //try to seek via read_timestamp()
1596 //Fallback to old API if new is not implemented but old is
1597 //Note the old has somewat different sematics
1598 if(s->iformat->read_seek || 1)
1599 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1601 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1604 /*******************************************************/
1607 * Returns TRUE if the stream has accurate duration in any stream.
1609 * @return TRUE if the stream has accurate duration for at least one component.
1611 static int av_has_duration(AVFormatContext *ic)
1616 for(i = 0;i < ic->nb_streams; i++) {
1617 st = ic->streams[i];
1618 if (st->duration != AV_NOPTS_VALUE)
1625 * Estimate the stream timings from the one of each components.
1627 * Also computes the global bitrate if possible.
1629 static void av_update_stream_timings(AVFormatContext *ic)
1631 int64_t start_time, start_time1, end_time, end_time1;
1632 int64_t duration, duration1;
1636 start_time = INT64_MAX;
1637 end_time = INT64_MIN;
1638 duration = INT64_MIN;
1639 for(i = 0;i < ic->nb_streams; i++) {
1640 st = ic->streams[i];
1641 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1642 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1643 if (start_time1 < start_time)
1644 start_time = start_time1;
1645 if (st->duration != AV_NOPTS_VALUE) {
1646 end_time1 = start_time1
1647 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1648 if (end_time1 > end_time)
1649 end_time = end_time1;
1652 if (st->duration != AV_NOPTS_VALUE) {
1653 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1654 if (duration1 > duration)
1655 duration = duration1;
1658 if (start_time != INT64_MAX) {
1659 ic->start_time = start_time;
1660 if (end_time != INT64_MIN) {
1661 if (end_time - start_time > duration)
1662 duration = end_time - start_time;
1665 if (duration != INT64_MIN) {
1666 ic->duration = duration;
1667 if (ic->file_size > 0) {
1668 /* compute the bitrate */
1669 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1670 (double)ic->duration;
1675 static void fill_all_stream_timings(AVFormatContext *ic)
1680 av_update_stream_timings(ic);
1681 for(i = 0;i < ic->nb_streams; i++) {
1682 st = ic->streams[i];
1683 if (st->start_time == AV_NOPTS_VALUE) {
1684 if(ic->start_time != AV_NOPTS_VALUE)
1685 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1686 if(ic->duration != AV_NOPTS_VALUE)
1687 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1692 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1694 int64_t filesize, duration;
1698 /* if bit_rate is already set, we believe it */
1699 if (ic->bit_rate == 0) {
1701 for(i=0;i<ic->nb_streams;i++) {
1702 st = ic->streams[i];
1703 bit_rate += st->codec->bit_rate;
1705 ic->bit_rate = bit_rate;
1708 /* if duration is already set, we believe it */
1709 if (ic->duration == AV_NOPTS_VALUE &&
1710 ic->bit_rate != 0 &&
1711 ic->file_size != 0) {
1712 filesize = ic->file_size;
1714 for(i = 0; i < ic->nb_streams; i++) {
1715 st = ic->streams[i];
1716 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1717 if (st->duration == AV_NOPTS_VALUE)
1718 st->duration = duration;
1724 #define DURATION_MAX_READ_SIZE 250000
1726 /* only usable for MPEG-PS streams */
1727 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1729 AVPacket pkt1, *pkt = &pkt1;
1731 int read_size, i, ret;
1733 int64_t filesize, offset, duration;
1737 /* flush packet queue */
1738 flush_packet_queue(ic);
1740 for(i=0;i<ic->nb_streams;i++) {
1741 st = ic->streams[i];
1743 av_parser_close(st->parser);
1745 av_free_packet(&st->cur_pkt);
1749 /* we read the first packets to get the first PTS (not fully
1750 accurate, but it is enough now) */
1751 url_fseek(ic->pb, 0, SEEK_SET);
1754 if (read_size >= DURATION_MAX_READ_SIZE)
1756 /* if all info is available, we can stop */
1757 for(i = 0;i < ic->nb_streams; i++) {
1758 st = ic->streams[i];
1759 if (st->start_time == AV_NOPTS_VALUE)
1762 if (i == ic->nb_streams)
1766 ret = av_read_packet(ic, pkt);
1767 }while(ret == AVERROR(EAGAIN));
1770 read_size += pkt->size;
1771 st = ic->streams[pkt->stream_index];
1772 if (pkt->pts != AV_NOPTS_VALUE) {
1773 if (st->start_time == AV_NOPTS_VALUE)
1774 st->start_time = pkt->pts;
1776 av_free_packet(pkt);
1779 /* estimate the end time (duration) */
1780 /* XXX: may need to support wrapping */
1781 filesize = ic->file_size;
1782 offset = filesize - DURATION_MAX_READ_SIZE;
1786 url_fseek(ic->pb, offset, SEEK_SET);
1789 if (read_size >= DURATION_MAX_READ_SIZE)
1793 ret = av_read_packet(ic, pkt);
1794 }while(ret == AVERROR(EAGAIN));
1797 read_size += pkt->size;
1798 st = ic->streams[pkt->stream_index];
1799 if (pkt->pts != AV_NOPTS_VALUE &&
1800 st->start_time != AV_NOPTS_VALUE) {
1801 end_time = pkt->pts;
1802 duration = end_time - st->start_time;
1804 if (st->duration == AV_NOPTS_VALUE ||
1805 st->duration < duration)
1806 st->duration = duration;
1809 av_free_packet(pkt);
1812 fill_all_stream_timings(ic);
1814 url_fseek(ic->pb, old_offset, SEEK_SET);
1815 for(i=0; i<ic->nb_streams; i++){
1817 st->cur_dts= st->first_dts;
1818 st->last_IP_pts = AV_NOPTS_VALUE;
1822 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
1826 /* get the file size, if possible */
1827 if (ic->iformat->flags & AVFMT_NOFILE) {
1830 file_size = url_fsize(ic->pb);
1834 ic->file_size = file_size;
1836 if ((!strcmp(ic->iformat->name, "mpeg") ||
1837 !strcmp(ic->iformat->name, "mpegts")) &&
1838 file_size && !url_is_streamed(ic->pb)) {
1839 /* get accurate estimate from the PTSes */
1840 av_estimate_timings_from_pts(ic, old_offset);
1841 } else if (av_has_duration(ic)) {
1842 /* at least one component has timings - we use them for all
1844 fill_all_stream_timings(ic);
1846 /* less precise: use bitrate info */
1847 av_estimate_timings_from_bit_rate(ic);
1849 av_update_stream_timings(ic);
1855 for(i = 0;i < ic->nb_streams; i++) {
1856 st = ic->streams[i];
1857 printf("%d: start_time: %0.3f duration: %0.3f\n",
1858 i, (double)st->start_time / AV_TIME_BASE,
1859 (double)st->duration / AV_TIME_BASE);
1861 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1862 (double)ic->start_time / AV_TIME_BASE,
1863 (double)ic->duration / AV_TIME_BASE,
1864 ic->bit_rate / 1000);
1869 static int has_codec_parameters(AVCodecContext *enc)
1872 switch(enc->codec_type) {
1873 case CODEC_TYPE_AUDIO:
1874 val = enc->sample_rate && enc->channels && enc->sample_fmt != SAMPLE_FMT_NONE;
1875 if(!enc->frame_size &&
1876 (enc->codec_id == CODEC_ID_VORBIS ||
1877 enc->codec_id == CODEC_ID_AAC ||
1878 enc->codec_id == CODEC_ID_SPEEX))
1881 case CODEC_TYPE_VIDEO:
1882 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1888 return enc->codec_id != CODEC_ID_NONE && val != 0;
1891 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
1895 int got_picture, data_size, ret=0;
1898 if(!st->codec->codec){
1899 codec = avcodec_find_decoder(st->codec->codec_id);
1902 ret = avcodec_open(st->codec, codec);
1907 if(!has_codec_parameters(st->codec)){
1908 switch(st->codec->codec_type) {
1909 case CODEC_TYPE_VIDEO:
1910 avcodec_get_frame_defaults(&picture);
1911 ret = avcodec_decode_video2(st->codec, &picture,
1912 &got_picture, avpkt);
1914 case CODEC_TYPE_AUDIO:
1915 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1916 samples = av_malloc(data_size);
1919 ret = avcodec_decode_audio3(st->codec, samples,
1931 unsigned int ff_codec_get_tag(const AVCodecTag *tags, int id)
1933 while (tags->id != CODEC_ID_NONE) {
1941 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
1944 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1945 if(tag == tags[i].tag)
1948 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1949 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1950 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1951 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1952 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1955 return CODEC_ID_NONE;
1958 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
1961 for(i=0; tags && tags[i]; i++){
1962 int tag= ff_codec_get_tag(tags[i], id);
1968 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
1971 for(i=0; tags && tags[i]; i++){
1972 enum CodecID id= ff_codec_get_id(tags[i], tag);
1973 if(id!=CODEC_ID_NONE) return id;
1975 return CODEC_ID_NONE;
1978 static void compute_chapters_end(AVFormatContext *s)
1982 for (i=0; i+1<s->nb_chapters; i++)
1983 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
1984 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
1985 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
1986 s->chapters[i]->end = s->chapters[i+1]->start;
1989 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
1990 assert(s->start_time != AV_NOPTS_VALUE);
1991 assert(s->duration > 0);
1992 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
1994 s->chapters[i]->time_base);
1998 #define MAX_STD_TIMEBASES (60*12+5)
1999 static int get_std_framerate(int i){
2000 if(i<60*12) return i*1001;
2001 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2005 * Is the time base unreliable.
2006 * This is a heuristic to balance between quick acceptance of the values in
2007 * the headers vs. some extra checks.
2008 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2009 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2010 * And there are "variable" fps files this needs to detect as well.
2012 static int tb_unreliable(AVCodecContext *c){
2013 if( c->time_base.den >= 101L*c->time_base.num
2014 || c->time_base.den < 5L*c->time_base.num
2015 /* || c->codec_tag == AV_RL32("DIVX")
2016 || c->codec_tag == AV_RL32("XVID")*/
2017 || c->codec_id == CODEC_ID_MPEG2VIDEO
2018 || c->codec_id == CODEC_ID_H264
2024 int av_find_stream_info(AVFormatContext *ic)
2026 int i, count, ret, read_size, j;
2028 AVPacket pkt1, *pkt;
2029 int64_t last_dts[MAX_STREAMS];
2030 int64_t duration_gcd[MAX_STREAMS]={0};
2031 int duration_count[MAX_STREAMS]={0};
2032 double (*duration_error)[MAX_STD_TIMEBASES];
2033 int64_t old_offset = url_ftell(ic->pb);
2034 int64_t codec_info_duration[MAX_STREAMS]={0};
2035 int codec_info_nb_frames[MAX_STREAMS]={0};
2037 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
2038 if (!duration_error) return AVERROR(ENOMEM);
2040 for(i=0;i<ic->nb_streams;i++) {
2041 st = ic->streams[i];
2042 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2043 /* if(!st->time_base.num)
2045 if(!st->codec->time_base.num)
2046 st->codec->time_base= st->time_base;
2048 //only for the split stuff
2050 st->parser = av_parser_init(st->codec->codec_id);
2051 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2052 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2057 for(i=0;i<MAX_STREAMS;i++){
2058 last_dts[i]= AV_NOPTS_VALUE;
2064 if(url_interrupt_cb()){
2065 ret= AVERROR(EINTR);
2066 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2070 /* check if one codec still needs to be handled */
2071 for(i=0;i<ic->nb_streams;i++) {
2072 st = ic->streams[i];
2073 if (!has_codec_parameters(st->codec))
2075 /* variable fps and no guess at the real fps */
2076 if( tb_unreliable(st->codec)
2077 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
2079 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2081 if(st->first_dts == AV_NOPTS_VALUE)
2084 if (i == ic->nb_streams) {
2085 /* NOTE: if the format has no header, then we need to read
2086 some packets to get most of the streams, so we cannot
2088 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2089 /* if we found the info for all the codecs, we can stop */
2091 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2095 /* we did not get all the codec info, but we read too much data */
2096 if (read_size >= ic->probesize) {
2098 av_log(ic, AV_LOG_WARNING, "MAX_READ_SIZE:%d reached\n", ic->probesize);
2102 /* NOTE: a new stream can be added there if no header in file
2103 (AVFMTCTX_NOHEADER) */
2104 ret = av_read_frame_internal(ic, &pkt1);
2105 if(ret == AVERROR(EAGAIN))
2109 ret = -1; /* we could not have all the codec parameters before EOF */
2110 for(i=0;i<ic->nb_streams;i++) {
2111 st = ic->streams[i];
2112 if (!has_codec_parameters(st->codec)){
2114 avcodec_string(buf, sizeof(buf), st->codec, 0);
2115 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2123 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2124 if(av_dup_packet(pkt) < 0) {
2125 av_free(duration_error);
2126 return AVERROR(ENOMEM);
2129 read_size += pkt->size;
2131 st = ic->streams[pkt->stream_index];
2132 if(codec_info_nb_frames[st->index]>1) {
2133 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){
2134 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2137 codec_info_duration[st->index] += pkt->duration;
2139 if (pkt->duration != 0)
2140 codec_info_nb_frames[st->index]++;
2143 int index= pkt->stream_index;
2144 int64_t last= last_dts[index];
2145 int64_t duration= pkt->dts - last;
2147 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2148 double dur= duration * av_q2d(st->time_base);
2150 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2151 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2152 if(duration_count[index] < 2)
2153 memset(duration_error[index], 0, sizeof(*duration_error));
2154 for(i=1; i<MAX_STD_TIMEBASES; i++){
2155 int framerate= get_std_framerate(i);
2156 int ticks= lrintf(dur*framerate/(1001*12));
2157 double error= dur - ticks*1001*12/(double)framerate;
2158 duration_error[index][i] += error*error;
2160 duration_count[index]++;
2161 // ignore the first 4 values, they might have some random jitter
2162 if (duration_count[index] > 3)
2163 duration_gcd[index] = av_gcd(duration_gcd[index], duration);
2165 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
2166 last_dts[pkt->stream_index]= pkt->dts;
2168 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2169 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2171 st->codec->extradata_size= i;
2172 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2173 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2174 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2178 /* if still no information, we try to open the codec and to
2179 decompress the frame. We try to avoid that in most cases as
2180 it takes longer and uses more memory. For MPEG-4, we need to
2181 decompress for QuickTime. */
2182 if (!has_codec_parameters(st->codec) /*&&
2183 (st->codec->codec_id == CODEC_ID_FLV1 ||
2184 st->codec->codec_id == CODEC_ID_H264 ||
2185 st->codec->codec_id == CODEC_ID_H263 ||
2186 st->codec->codec_id == CODEC_ID_H261 ||
2187 st->codec->codec_id == CODEC_ID_VORBIS ||
2188 st->codec->codec_id == CODEC_ID_MJPEG ||
2189 st->codec->codec_id == CODEC_ID_PNG ||
2190 st->codec->codec_id == CODEC_ID_PAM ||
2191 st->codec->codec_id == CODEC_ID_PGM ||
2192 st->codec->codec_id == CODEC_ID_PGMYUV ||
2193 st->codec->codec_id == CODEC_ID_PBM ||
2194 st->codec->codec_id == CODEC_ID_PPM ||
2195 st->codec->codec_id == CODEC_ID_SHORTEN ||
2196 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2197 try_decode_frame(st, pkt);
2202 // close codecs which were opened in try_decode_frame()
2203 for(i=0;i<ic->nb_streams;i++) {
2204 st = ic->streams[i];
2205 if(st->codec->codec)
2206 avcodec_close(st->codec);
2208 for(i=0;i<ic->nb_streams;i++) {
2209 st = ic->streams[i];
2210 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2211 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
2212 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2214 // the check for tb_unreliable() is not completely correct, since this is not about handling
2215 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2216 // ipmovie.c produces.
2217 if (tb_unreliable(st->codec) && duration_count[i] > 15 && duration_gcd[i] > 1)
2218 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);
2219 if(duration_count[i]
2220 && tb_unreliable(st->codec) /*&&
2221 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2222 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2224 double best_error= 2*av_q2d(st->time_base);
2225 best_error= best_error*best_error*duration_count[i]*1000*12*30;
2227 for(j=1; j<MAX_STD_TIMEBASES; j++){
2228 double error= duration_error[i][j] * get_std_framerate(j);
2229 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2230 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2231 if(error < best_error){
2233 num = get_std_framerate(j);
2236 // do not increase frame rate by more than 1 % in order to match a standard rate.
2237 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2238 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2241 if (!st->r_frame_rate.num){
2242 if( st->codec->time_base.den * (int64_t)st->time_base.num
2243 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2244 st->r_frame_rate.num = st->codec->time_base.den;
2245 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2247 st->r_frame_rate.num = st->time_base.den;
2248 st->r_frame_rate.den = st->time_base.num;
2251 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
2252 if(!st->codec->bits_per_coded_sample)
2253 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2257 av_estimate_timings(ic, old_offset);
2259 compute_chapters_end(ic);
2262 /* correct DTS for B-frame streams with no timestamps */
2263 for(i=0;i<ic->nb_streams;i++) {
2264 st = ic->streams[i];
2265 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2267 ppktl = &ic->packet_buffer;
2269 if(ppkt1->stream_index != i)
2271 if(ppkt1->pkt->dts < 0)
2273 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2275 ppkt1->pkt->dts -= delta;
2280 st->cur_dts -= delta;
2286 av_free(duration_error);
2291 /*******************************************************/
2293 int av_read_play(AVFormatContext *s)
2295 if (s->iformat->read_play)
2296 return s->iformat->read_play(s);
2298 return av_url_read_fpause(s->pb, 0);
2299 return AVERROR(ENOSYS);
2302 int av_read_pause(AVFormatContext *s)
2304 if (s->iformat->read_pause)
2305 return s->iformat->read_pause(s);
2307 return av_url_read_fpause(s->pb, 1);
2308 return AVERROR(ENOSYS);
2311 void av_close_input_stream(AVFormatContext *s)
2316 if (s->iformat->read_close)
2317 s->iformat->read_close(s);
2318 for(i=0;i<s->nb_streams;i++) {
2319 /* free all data in a stream component */
2322 av_parser_close(st->parser);
2323 av_free_packet(&st->cur_pkt);
2325 av_metadata_free(&st->metadata);
2326 av_free(st->index_entries);
2327 av_free(st->codec->extradata);
2329 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2330 av_free(st->filename);
2332 av_free(st->priv_data);
2335 for(i=s->nb_programs-1; i>=0; i--) {
2336 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2337 av_freep(&s->programs[i]->provider_name);
2338 av_freep(&s->programs[i]->name);
2340 av_metadata_free(&s->programs[i]->metadata);
2341 av_freep(&s->programs[i]->stream_index);
2342 av_freep(&s->programs[i]);
2344 av_freep(&s->programs);
2345 flush_packet_queue(s);
2346 av_freep(&s->priv_data);
2347 while(s->nb_chapters--) {
2348 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2349 av_free(s->chapters[s->nb_chapters]->title);
2351 av_metadata_free(&s->chapters[s->nb_chapters]->metadata);
2352 av_free(s->chapters[s->nb_chapters]);
2354 av_freep(&s->chapters);
2355 av_metadata_free(&s->metadata);
2359 void av_close_input_file(AVFormatContext *s)
2361 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2362 av_close_input_stream(s);
2367 AVStream *av_new_stream(AVFormatContext *s, int id)
2372 if (s->nb_streams >= MAX_STREAMS)
2375 st = av_mallocz(sizeof(AVStream));
2379 st->codec= avcodec_alloc_context();
2381 /* no default bitrate if decoding */
2382 st->codec->bit_rate = 0;
2384 st->index = s->nb_streams;
2386 st->start_time = AV_NOPTS_VALUE;
2387 st->duration = AV_NOPTS_VALUE;
2388 /* we set the current DTS to 0 so that formats without any timestamps
2389 but durations get some timestamps, formats with some unknown
2390 timestamps have their first few packets buffered and the
2391 timestamps corrected before they are returned to the user */
2393 st->first_dts = AV_NOPTS_VALUE;
2394 st->probe_packets = MAX_PROBE_PACKETS;
2396 /* default pts setting is MPEG-like */
2397 av_set_pts_info(st, 33, 1, 90000);
2398 st->last_IP_pts = AV_NOPTS_VALUE;
2399 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2400 st->pts_buffer[i]= AV_NOPTS_VALUE;
2401 st->reference_dts = AV_NOPTS_VALUE;
2403 st->sample_aspect_ratio = (AVRational){0,1};
2405 s->streams[s->nb_streams++] = st;
2409 AVProgram *av_new_program(AVFormatContext *ac, int id)
2411 AVProgram *program=NULL;
2415 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2418 for(i=0; i<ac->nb_programs; i++)
2419 if(ac->programs[i]->id == id)
2420 program = ac->programs[i];
2423 program = av_mallocz(sizeof(AVProgram));
2426 dynarray_add(&ac->programs, &ac->nb_programs, program);
2427 program->discard = AVDISCARD_NONE;
2434 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2436 AVChapter *chapter = NULL;
2439 for(i=0; i<s->nb_chapters; i++)
2440 if(s->chapters[i]->id == id)
2441 chapter = s->chapters[i];
2444 chapter= av_mallocz(sizeof(AVChapter));
2447 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2449 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2450 av_free(chapter->title);
2452 av_metadata_set(&chapter->metadata, "title", title);
2454 chapter->time_base= time_base;
2455 chapter->start = start;
2461 /************************************************************/
2462 /* output media file */
2464 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2468 if (s->oformat->priv_data_size > 0) {
2469 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2471 return AVERROR(ENOMEM);
2473 s->priv_data = NULL;
2475 if (s->oformat->set_parameters) {
2476 ret = s->oformat->set_parameters(s, ap);
2483 int av_write_header(AVFormatContext *s)
2488 // some sanity checks
2489 for(i=0;i<s->nb_streams;i++) {
2492 switch (st->codec->codec_type) {
2493 case CODEC_TYPE_AUDIO:
2494 if(st->codec->sample_rate<=0){
2495 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2498 if(!st->codec->block_align)
2499 st->codec->block_align = st->codec->channels *
2500 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2502 case CODEC_TYPE_VIDEO:
2503 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2504 av_log(s, AV_LOG_ERROR, "time base not set\n");
2507 if(st->codec->width<=0 || st->codec->height<=0){
2508 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2511 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2512 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2518 if(s->oformat->codec_tag){
2519 if(st->codec->codec_tag){
2521 //check that tag + id is in the table
2522 //if neither is in the table -> OK
2523 //if tag is in the table with another id -> FAIL
2524 //if id is in the table with another tag -> FAIL unless strict < ?
2526 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2529 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2530 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2531 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2534 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2535 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2537 return AVERROR(ENOMEM);
2540 #if LIBAVFORMAT_VERSION_MAJOR < 53
2541 ff_metadata_mux_compat(s);
2544 if(s->oformat->write_header){
2545 ret = s->oformat->write_header(s);
2550 /* init PTS generation */
2551 for(i=0;i<s->nb_streams;i++) {
2552 int64_t den = AV_NOPTS_VALUE;
2555 switch (st->codec->codec_type) {
2556 case CODEC_TYPE_AUDIO:
2557 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2559 case CODEC_TYPE_VIDEO:
2560 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2565 if (den != AV_NOPTS_VALUE) {
2567 return AVERROR_INVALIDDATA;
2568 av_frac_init(&st->pts, 0, 0, den);
2574 //FIXME merge with compute_pkt_fields
2575 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2576 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2577 int num, den, frame_size, i;
2579 // av_log(st->codec, AV_LOG_DEBUG, "av_write_frame: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n", pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
2581 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2584 /* duration field */
2585 if (pkt->duration == 0) {
2586 compute_frame_duration(&num, &den, st, NULL, pkt);
2588 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2592 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2595 //XXX/FIXME this is a temporary hack until all encoders output pts
2596 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2598 // pkt->pts= st->cur_dts;
2599 pkt->pts= st->pts.val;
2602 //calculate dts from pts
2603 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2604 st->pts_buffer[0]= pkt->pts;
2605 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2606 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2607 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2608 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2610 pkt->dts= st->pts_buffer[0];
2613 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2614 av_log(st->codec, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2617 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2618 av_log(st->codec, AV_LOG_ERROR, "error, pts < dts\n");
2622 // av_log(NULL, 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->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(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 for(i=0; i<ac->nb_programs; i++){
2827 if(ac->programs[i]->id != progid)
2829 program = ac->programs[i];
2830 for(j=0; j<program->nb_stream_indexes; j++)
2831 if(program->stream_index[j] == idx)
2834 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2837 program->stream_index = tmp;
2838 program->stream_index[program->nb_stream_indexes++] = idx;
2843 static void print_fps(double d, const char *postfix){
2844 uint64_t v= lrintf(d*100);
2845 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
2846 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
2847 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
2850 /* "user interface" functions */
2851 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2854 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2855 AVStream *st = ic->streams[i];
2856 int g = av_gcd(st->time_base.num, st->time_base.den);
2857 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0);
2858 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2859 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2860 /* the pid is an important information, so we display it */
2861 /* XXX: add a generic system */
2862 if (flags & AVFMT_SHOW_IDS)
2863 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2865 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
2866 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2867 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2868 if (st->sample_aspect_ratio.num && // default
2869 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
2870 AVRational display_aspect_ratio;
2871 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
2872 st->codec->width*st->sample_aspect_ratio.num,
2873 st->codec->height*st->sample_aspect_ratio.den,
2875 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
2876 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
2877 display_aspect_ratio.num, display_aspect_ratio.den);
2879 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2880 if(st->r_frame_rate.den && st->r_frame_rate.num)
2881 print_fps(av_q2d(st->r_frame_rate), "tbr");
2882 if(st->time_base.den && st->time_base.num)
2883 print_fps(1/av_q2d(st->time_base), "tbn");
2884 if(st->codec->time_base.den && st->codec->time_base.num)
2885 print_fps(1/av_q2d(st->codec->time_base), "tbc");
2887 av_log(NULL, AV_LOG_INFO, "\n");
2890 void dump_format(AVFormatContext *ic,
2897 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2898 is_output ? "Output" : "Input",
2900 is_output ? ic->oformat->name : ic->iformat->name,
2901 is_output ? "to" : "from", url);
2903 av_log(NULL, AV_LOG_INFO, " Duration: ");
2904 if (ic->duration != AV_NOPTS_VALUE) {
2905 int hours, mins, secs, us;
2906 secs = ic->duration / AV_TIME_BASE;
2907 us = ic->duration % AV_TIME_BASE;
2912 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
2913 (100 * us) / AV_TIME_BASE);
2915 av_log(NULL, AV_LOG_INFO, "N/A");
2917 if (ic->start_time != AV_NOPTS_VALUE) {
2919 av_log(NULL, AV_LOG_INFO, ", start: ");
2920 secs = ic->start_time / AV_TIME_BASE;
2921 us = ic->start_time % AV_TIME_BASE;
2922 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2923 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2925 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2927 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2929 av_log(NULL, AV_LOG_INFO, "N/A");
2931 av_log(NULL, AV_LOG_INFO, "\n");
2933 if(ic->nb_programs) {
2935 for(j=0; j<ic->nb_programs; j++) {
2936 AVMetadataTag *name = av_metadata_get(ic->programs[j]->metadata,
2938 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2939 name ? name->value : "");
2940 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++)
2941 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2944 for(i=0;i<ic->nb_streams;i++)
2945 dump_stream_format(ic, i, index, is_output);
2947 AVMetadataTag *tag=NULL;
2948 av_log(NULL, AV_LOG_INFO, " Metadata\n");
2949 while((tag=av_metadata_get(ic->metadata, "", tag, AV_METADATA_IGNORE_SUFFIX))) {
2950 av_log(NULL, AV_LOG_INFO, " %-16s: %s\n", tag->key, tag->value);
2956 #if LIBAVFORMAT_VERSION_MAJOR < 53
2957 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2959 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2962 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2964 AVRational frame_rate;
2965 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2966 *frame_rate_num= frame_rate.num;
2967 *frame_rate_den= frame_rate.den;
2972 int64_t av_gettime(void)
2975 gettimeofday(&tv,NULL);
2976 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2979 int64_t parse_date(const char *datestr, int duration)
2985 static const char * const date_fmt[] = {
2989 static const char * const time_fmt[] = {
2999 time_t now = time(0);
3001 len = strlen(datestr);
3003 lastch = datestr[len - 1];
3006 is_utc = (lastch == 'z' || lastch == 'Z');
3008 memset(&dt, 0, sizeof(dt));
3013 if (!strncasecmp(datestr, "now", len))
3014 return (int64_t) now * 1000000;
3016 /* parse the year-month-day part */
3017 for (i = 0; i < FF_ARRAY_ELEMS(date_fmt); i++) {
3018 q = small_strptime(p, date_fmt[i], &dt);
3024 /* if the year-month-day part is missing, then take the
3025 * current year-month-day time */
3030 dt = *localtime(&now);
3032 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
3037 if (*p == 'T' || *p == 't' || *p == ' ')
3040 /* parse the hour-minute-second part */
3041 for (i = 0; i < FF_ARRAY_ELEMS(time_fmt); i++) {
3042 q = small_strptime(p, time_fmt[i], &dt);
3048 /* parse datestr as a duration */
3053 /* parse datestr as HH:MM:SS */
3054 q = small_strptime(p, time_fmt[0], &dt);
3056 /* parse datestr as S+ */
3057 dt.tm_sec = strtol(p, (char **)&q, 10);
3059 /* the parsing didn't succeed */
3066 /* Now we have all the fields that we can get */
3072 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
3074 dt.tm_isdst = -1; /* unknown */
3084 /* parse the .m... part */
3088 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
3091 val += n * (*q - '0');
3095 return negative ? -t : t;
3098 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3108 while (*p != '\0' && *p != '=' && *p != '&') {
3109 if ((q - tag) < sizeof(tag) - 1)
3117 while (*p != '&' && *p != '\0') {
3118 if ((q - arg) < arg_size - 1) {
3128 if (!strcmp(tag, tag1))
3137 int av_get_frame_filename(char *buf, int buf_size,
3138 const char *path, int number)
3141 char *q, buf1[20], c;
3142 int nd, len, percentd_found;
3154 while (isdigit(*p)) {
3155 nd = nd * 10 + *p++ - '0';
3158 } while (isdigit(c));
3167 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3169 if ((q - buf + len) > buf_size - 1)
3171 memcpy(q, buf1, len);
3179 if ((q - buf) < buf_size - 1)
3183 if (!percentd_found)
3192 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3195 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3197 for(i=0;i<size;i+=16) {
3204 PRINT(" %02x", buf[i+j]);
3209 for(j=0;j<len;j++) {
3211 if (c < ' ' || c > '~')
3220 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3222 hex_dump_internal(NULL, f, 0, buf, size);
3225 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3227 hex_dump_internal(avcl, NULL, level, buf, size);
3230 //FIXME needs to know the time_base
3231 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
3233 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3234 PRINT("stream #%d:\n", pkt->stream_index);
3235 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3236 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3237 /* DTS is _always_ valid after av_read_frame() */
3239 if (pkt->dts == AV_NOPTS_VALUE)
3242 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
3243 /* PTS may not be known if B-frames are present. */
3245 if (pkt->pts == AV_NOPTS_VALUE)
3248 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
3250 PRINT(" size=%d\n", pkt->size);
3253 av_hex_dump(f, pkt->data, pkt->size);
3256 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3258 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
3261 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3263 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
3266 void url_split(char *proto, int proto_size,
3267 char *authorization, int authorization_size,
3268 char *hostname, int hostname_size,
3270 char *path, int path_size,
3273 const char *p, *ls, *at, *col, *brk;
3275 if (port_ptr) *port_ptr = -1;
3276 if (proto_size > 0) proto[0] = 0;
3277 if (authorization_size > 0) authorization[0] = 0;
3278 if (hostname_size > 0) hostname[0] = 0;
3279 if (path_size > 0) path[0] = 0;
3281 /* parse protocol */
3282 if ((p = strchr(url, ':'))) {
3283 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3288 /* no protocol means plain filename */
3289 av_strlcpy(path, url, path_size);
3293 /* separate path from hostname */
3294 ls = strchr(p, '/');
3296 ls = strchr(p, '?');
3298 av_strlcpy(path, ls, path_size);
3300 ls = &p[strlen(p)]; // XXX
3302 /* the rest is hostname, use that to parse auth/port */
3304 /* authorization (user[:pass]@hostname) */
3305 if ((at = strchr(p, '@')) && at < ls) {
3306 av_strlcpy(authorization, p,
3307 FFMIN(authorization_size, at + 1 - p));
3308 p = at + 1; /* skip '@' */
3311 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3313 av_strlcpy(hostname, p + 1,
3314 FFMIN(hostname_size, brk - p));
3315 if (brk[1] == ':' && port_ptr)
3316 *port_ptr = atoi(brk + 2);
3317 } else if ((col = strchr(p, ':')) && col < ls) {
3318 av_strlcpy(hostname, p,
3319 FFMIN(col + 1 - p, hostname_size));
3320 if (port_ptr) *port_ptr = atoi(col + 1);
3322 av_strlcpy(hostname, p,
3323 FFMIN(ls + 1 - p, hostname_size));
3327 char *ff_data_to_hex(char *buff, const uint8_t *src, int s)
3330 static const char hex_table[16] = { '0', '1', '2', '3',
3333 'C', 'D', 'E', 'F' };
3335 for(i = 0; i < s; i++) {
3336 buff[i * 2] = hex_table[src[i] >> 4];
3337 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3343 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3344 unsigned int pts_num, unsigned int pts_den)
3346 s->pts_wrap_bits = pts_wrap_bits;
3348 if(av_reduce(&s->time_base.num, &s->time_base.den, pts_num, pts_den, INT_MAX)){
3349 if(s->time_base.num != pts_num)
3350 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/s->time_base.num);
3352 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3354 if(!s->time_base.num || !s->time_base.den)
3355 s->time_base.num= s->time_base.den= 0;