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;
443 pd->filename = filename;
448 /* guess format if no file can be opened */
449 fmt = av_probe_input_format(pd, 0);
452 /* Do not open file if the format does not need it. XXX: specific
453 hack needed to handle RTSP/TCP */
454 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
455 /* if no file needed do not try to open one */
456 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
460 url_setbufsize(pb, buf_size);
463 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
464 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
465 /* read probe data */
466 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
467 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
468 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
469 if (url_fseek(pb, 0, SEEK_SET) < 0) {
471 if (url_fopen(&pb, filename, URL_RDONLY) < 0) {
477 /* guess file format */
478 fmt = av_probe_input_format2(pd, 1, &score);
480 if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
481 av_log(*ic_ptr, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
483 av_log(*ic_ptr, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
489 /* if still no format found, error */
495 /* check filename in case an image number is expected */
496 if (fmt->flags & AVFMT_NEEDNUMBER) {
497 if (!av_filename_number_test(filename)) {
498 err = AVERROR_NUMEXPECTED;
502 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
510 if (ap && ap->prealloced_context)
517 /*******************************************************/
519 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
520 AVPacketList **plast_pktl){
521 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
526 (*plast_pktl)->next = pktl;
528 *packet_buffer = pktl;
530 /* add the packet in the buffered packet list */
536 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
542 AVPacketList *pktl = s->raw_packet_buffer;
546 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
547 !s->streams[pkt->stream_index]->probe_packets ||
548 s->raw_packet_buffer_remaining_size < pkt->size){
549 AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
552 s->raw_packet_buffer = pktl->next;
553 s->raw_packet_buffer_remaining_size += pkt->size;
560 ret= s->iformat->read_packet(s, pkt);
562 if (!pktl || ret == AVERROR(EAGAIN))
564 for (i = 0; i < s->nb_streams; i++)
565 s->streams[i]->probe_packets = 0;
568 st= s->streams[pkt->stream_index];
570 switch(st->codec->codec_type){
571 case CODEC_TYPE_VIDEO:
572 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
574 case CODEC_TYPE_AUDIO:
575 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
577 case CODEC_TYPE_SUBTITLE:
578 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
582 if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
586 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
587 s->raw_packet_buffer_remaining_size -= pkt->size;
589 if(st->codec->codec_id == CODEC_ID_PROBE){
590 AVProbeData *pd = &st->probe_data;
594 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
595 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
596 pd->buf_size += pkt->size;
597 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
599 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
600 set_codec_from_probe_data(s, st, pd, 1);
601 if(st->codec->codec_id != CODEC_ID_PROBE){
610 /**********************************************************/
613 * Get the number of samples of an audio frame. Return -1 on error.
615 static int get_audio_frame_size(AVCodecContext *enc, int size)
619 if(enc->codec_id == CODEC_ID_VORBIS)
622 if (enc->frame_size <= 1) {
623 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
625 if (bits_per_sample) {
626 if (enc->channels == 0)
628 frame_size = (size << 3) / (bits_per_sample * enc->channels);
630 /* used for example by ADPCM codecs */
631 if (enc->bit_rate == 0)
633 frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
636 frame_size = enc->frame_size;
643 * Return the frame duration in seconds. Return 0 if not available.
645 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
646 AVCodecParserContext *pc, AVPacket *pkt)
652 switch(st->codec->codec_type) {
653 case CODEC_TYPE_VIDEO:
654 if(st->time_base.num*1000LL > st->time_base.den){
655 *pnum = st->time_base.num;
656 *pden = st->time_base.den;
657 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
658 *pnum = st->codec->time_base.num;
659 *pden = st->codec->time_base.den;
660 if (pc && pc->repeat_pict) {
661 *pnum = (*pnum) * (1 + pc->repeat_pict);
665 case CODEC_TYPE_AUDIO:
666 frame_size = get_audio_frame_size(st->codec, pkt->size);
670 *pden = st->codec->sample_rate;
677 static int is_intra_only(AVCodecContext *enc){
678 if(enc->codec_type == CODEC_TYPE_AUDIO){
680 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
681 switch(enc->codec_id){
683 case CODEC_ID_MJPEGB:
685 case CODEC_ID_RAWVIDEO:
686 case CODEC_ID_DVVIDEO:
687 case CODEC_ID_HUFFYUV:
688 case CODEC_ID_FFVHUFF:
693 case CODEC_ID_JPEG2000:
701 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
702 int64_t dts, int64_t pts)
704 AVStream *st= s->streams[stream_index];
705 AVPacketList *pktl= s->packet_buffer;
707 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
710 st->first_dts= dts - st->cur_dts;
713 for(; pktl; pktl= pktl->next){
714 if(pktl->pkt.stream_index != stream_index)
716 //FIXME think more about this check
717 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
718 pktl->pkt.pts += st->first_dts;
720 if(pktl->pkt.dts != AV_NOPTS_VALUE)
721 pktl->pkt.dts += st->first_dts;
723 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
724 st->start_time= pktl->pkt.pts;
726 if (st->start_time == AV_NOPTS_VALUE)
727 st->start_time = pts;
730 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
732 AVPacketList *pktl= s->packet_buffer;
735 if(st->first_dts != AV_NOPTS_VALUE){
736 cur_dts= st->first_dts;
737 for(; pktl; pktl= pktl->next){
738 if(pktl->pkt.stream_index == pkt->stream_index){
739 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
741 cur_dts -= pkt->duration;
744 pktl= s->packet_buffer;
745 st->first_dts = cur_dts;
746 }else if(st->cur_dts)
749 for(; pktl; pktl= pktl->next){
750 if(pktl->pkt.stream_index != pkt->stream_index)
752 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
753 && !pktl->pkt.duration){
754 pktl->pkt.dts= cur_dts;
755 if(!st->codec->has_b_frames)
756 pktl->pkt.pts= cur_dts;
757 cur_dts += pkt->duration;
758 pktl->pkt.duration= pkt->duration;
762 if(st->first_dts == AV_NOPTS_VALUE)
763 st->cur_dts= cur_dts;
766 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
767 AVCodecParserContext *pc, AVPacket *pkt)
769 int num, den, presentation_delayed, delay, i;
772 if (pc && pc->pict_type == FF_B_TYPE)
773 st->codec->has_b_frames = 1;
775 /* do we have a video B-frame ? */
776 delay= st->codec->has_b_frames;
777 presentation_delayed = 0;
778 /* XXX: need has_b_frame, but cannot get it if the codec is
781 pc && pc->pict_type != FF_B_TYPE)
782 presentation_delayed = 1;
784 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
785 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
786 pkt->dts -= 1LL<<st->pts_wrap_bits;
789 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
790 // we take the conservative approach and discard both
791 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
792 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
793 av_log(s, AV_LOG_WARNING, "invalid dts/pts combination\n");
794 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
797 if (pkt->duration == 0) {
798 compute_frame_duration(&num, &den, st, pc, pkt);
800 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
802 if(pkt->duration != 0 && s->packet_buffer)
803 update_initial_durations(s, st, pkt);
807 /* correct timestamps with byte offset if demuxers only have timestamps
808 on packet boundaries */
809 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
810 /* this will estimate bitrate based on this frame's duration and size */
811 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
812 if(pkt->pts != AV_NOPTS_VALUE)
814 if(pkt->dts != AV_NOPTS_VALUE)
818 if (pc && pc->dts_sync_point >= 0) {
819 // we have synchronization info from the parser
820 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
822 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
823 if (pkt->dts != AV_NOPTS_VALUE) {
824 // got DTS from the stream, update reference timestamp
825 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
826 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
827 } else if (st->reference_dts != AV_NOPTS_VALUE) {
828 // compute DTS based on reference timestamp
829 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
830 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
832 if (pc->dts_sync_point > 0)
833 st->reference_dts = pkt->dts; // new reference
837 /* This may be redundant, but it should not hurt. */
838 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
839 presentation_delayed = 1;
841 // 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);
842 /* interpolate PTS and DTS if they are not present */
843 //We skip H264 currently because delay and has_b_frames are not reliably set
844 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
845 if (presentation_delayed) {
846 /* DTS = decompression timestamp */
847 /* PTS = presentation timestamp */
848 if (pkt->dts == AV_NOPTS_VALUE)
849 pkt->dts = st->last_IP_pts;
850 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
851 if (pkt->dts == AV_NOPTS_VALUE)
852 pkt->dts = st->cur_dts;
854 /* this is tricky: the dts must be incremented by the duration
855 of the frame we are displaying, i.e. the last I- or P-frame */
856 if (st->last_IP_duration == 0)
857 st->last_IP_duration = pkt->duration;
858 if(pkt->dts != AV_NOPTS_VALUE)
859 st->cur_dts = pkt->dts + st->last_IP_duration;
860 st->last_IP_duration = pkt->duration;
861 st->last_IP_pts= pkt->pts;
862 /* cannot compute PTS if not present (we can compute it only
863 by knowing the future */
864 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
865 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
866 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
867 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
868 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
869 pkt->pts += pkt->duration;
870 // 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);
874 /* presentation is not delayed : PTS and DTS are the same */
875 if(pkt->pts == AV_NOPTS_VALUE)
877 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
878 if(pkt->pts == AV_NOPTS_VALUE)
879 pkt->pts = st->cur_dts;
881 if(pkt->pts != AV_NOPTS_VALUE)
882 st->cur_dts = pkt->pts + pkt->duration;
886 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
887 st->pts_buffer[0]= pkt->pts;
888 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
889 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
890 if(pkt->dts == AV_NOPTS_VALUE)
891 pkt->dts= st->pts_buffer[0];
892 if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
893 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
895 if(pkt->dts > st->cur_dts)
896 st->cur_dts = pkt->dts;
899 // 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);
902 if(is_intra_only(st->codec))
903 pkt->flags |= PKT_FLAG_KEY;
906 /* keyframe computation */
907 if (pc->key_frame == 1)
908 pkt->flags |= PKT_FLAG_KEY;
909 else if (pc->key_frame == -1 && pc->pict_type == FF_I_TYPE)
910 pkt->flags |= PKT_FLAG_KEY;
913 pkt->convergence_duration = pc->convergence_duration;
917 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
925 /* select current input stream component */
928 if (!st->need_parsing || !st->parser) {
929 /* no parsing needed: we just output the packet as is */
930 /* raw data support */
931 *pkt = st->cur_pkt; st->cur_pkt.data= NULL;
932 compute_pkt_fields(s, st, NULL, pkt);
934 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
935 (pkt->flags & PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
936 ff_reduce_index(s, st->index);
937 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
940 } else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
941 len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
942 st->cur_ptr, st->cur_len,
943 st->cur_pkt.pts, st->cur_pkt.dts,
945 st->cur_pkt.pts = AV_NOPTS_VALUE;
946 st->cur_pkt.dts = AV_NOPTS_VALUE;
947 /* increment read pointer */
951 /* return packet if any */
955 pkt->stream_index = st->index;
956 pkt->pts = st->parser->pts;
957 pkt->dts = st->parser->dts;
958 pkt->pos = st->parser->pos;
959 pkt->destruct = NULL;
960 compute_pkt_fields(s, st, st->parser, pkt);
962 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
963 ff_reduce_index(s, st->index);
964 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
965 0, 0, AVINDEX_KEYFRAME);
972 av_free_packet(&st->cur_pkt);
977 /* read next packet */
978 ret = av_read_packet(s, &cur_pkt);
980 if (ret == AVERROR(EAGAIN))
982 /* return the last frames, if any */
983 for(i = 0; i < s->nb_streams; i++) {
985 if (st->parser && st->need_parsing) {
986 av_parser_parse2(st->parser, st->codec,
987 &pkt->data, &pkt->size,
989 AV_NOPTS_VALUE, AV_NOPTS_VALUE,
995 /* no more packets: really terminate parsing */
998 st = s->streams[cur_pkt.stream_index];
999 st->cur_pkt= cur_pkt;
1001 if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1002 st->cur_pkt.dts != AV_NOPTS_VALUE &&
1003 st->cur_pkt.pts < st->cur_pkt.dts){
1004 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1005 st->cur_pkt.stream_index,
1009 // av_free_packet(&st->cur_pkt);
1013 if(s->debug & FF_FDEBUG_TS)
1014 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, flags=%d\n",
1015 st->cur_pkt.stream_index,
1022 st->cur_ptr = st->cur_pkt.data;
1023 st->cur_len = st->cur_pkt.size;
1024 if (st->need_parsing && !st->parser) {
1025 st->parser = av_parser_init(st->codec->codec_id);
1027 /* no parser available: just output the raw packets */
1028 st->need_parsing = AVSTREAM_PARSE_NONE;
1029 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1030 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1032 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
1033 st->parser->next_frame_offset=
1034 st->parser->cur_offset= st->cur_pkt.pos;
1039 if(s->debug & FF_FDEBUG_TS)
1040 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, flags=%d\n",
1050 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1054 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1057 pktl = s->packet_buffer;
1059 AVPacket *next_pkt= &pktl->pkt;
1061 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1062 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1063 if( pktl->pkt.stream_index == next_pkt->stream_index
1064 && next_pkt->dts < pktl->pkt.dts
1065 && pktl->pkt.pts != pktl->pkt.dts //not b frame
1066 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1067 next_pkt->pts= pktl->pkt.dts;
1071 pktl = s->packet_buffer;
1074 if( next_pkt->pts != AV_NOPTS_VALUE
1075 || next_pkt->dts == AV_NOPTS_VALUE
1077 /* read packet from packet buffer, if there is data */
1079 s->packet_buffer = pktl->next;
1085 int ret= av_read_frame_internal(s, pkt);
1087 if(pktl && ret != AVERROR(EAGAIN)){
1094 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1095 &s->packet_buffer_end)) < 0)
1096 return AVERROR(ENOMEM);
1098 assert(!s->packet_buffer);
1099 return av_read_frame_internal(s, pkt);
1104 /* XXX: suppress the packet queue */
1105 static void flush_packet_queue(AVFormatContext *s)
1110 pktl = s->packet_buffer;
1113 s->packet_buffer = pktl->next;
1114 av_free_packet(&pktl->pkt);
1117 while(s->raw_packet_buffer){
1118 pktl = s->raw_packet_buffer;
1119 s->raw_packet_buffer = pktl->next;
1120 av_free_packet(&pktl->pkt);
1123 s->packet_buffer_end=
1124 s->raw_packet_buffer_end= NULL;
1125 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1128 /*******************************************************/
1131 int av_find_default_stream_index(AVFormatContext *s)
1133 int first_audio_index = -1;
1137 if (s->nb_streams <= 0)
1139 for(i = 0; i < s->nb_streams; i++) {
1141 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1144 if (first_audio_index < 0 && st->codec->codec_type == CODEC_TYPE_AUDIO)
1145 first_audio_index = i;
1147 return first_audio_index >= 0 ? first_audio_index : 0;
1151 * Flush the frame reader.
1153 void av_read_frame_flush(AVFormatContext *s)
1158 flush_packet_queue(s);
1162 /* for each stream, reset read state */
1163 for(i = 0; i < s->nb_streams; i++) {
1167 av_parser_close(st->parser);
1169 av_free_packet(&st->cur_pkt);
1171 st->last_IP_pts = AV_NOPTS_VALUE;
1172 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1173 st->reference_dts = AV_NOPTS_VALUE;
1178 st->probe_packets = MAX_PROBE_PACKETS;
1182 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1185 for(i = 0; i < s->nb_streams; i++) {
1186 AVStream *st = s->streams[i];
1188 st->cur_dts = av_rescale(timestamp,
1189 st->time_base.den * (int64_t)ref_st->time_base.num,
1190 st->time_base.num * (int64_t)ref_st->time_base.den);
1194 void ff_reduce_index(AVFormatContext *s, int stream_index)
1196 AVStream *st= s->streams[stream_index];
1197 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1199 if((unsigned)st->nb_index_entries >= max_entries){
1201 for(i=0; 2*i<st->nb_index_entries; i++)
1202 st->index_entries[i]= st->index_entries[2*i];
1203 st->nb_index_entries= i;
1207 int av_add_index_entry(AVStream *st,
1208 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1210 AVIndexEntry *entries, *ie;
1213 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1216 entries = av_fast_realloc(st->index_entries,
1217 &st->index_entries_allocated_size,
1218 (st->nb_index_entries + 1) *
1219 sizeof(AVIndexEntry));
1223 st->index_entries= entries;
1225 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1228 index= st->nb_index_entries++;
1229 ie= &entries[index];
1230 assert(index==0 || ie[-1].timestamp < timestamp);
1232 ie= &entries[index];
1233 if(ie->timestamp != timestamp){
1234 if(ie->timestamp <= timestamp)
1236 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1237 st->nb_index_entries++;
1238 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1239 distance= ie->min_distance;
1243 ie->timestamp = timestamp;
1244 ie->min_distance= distance;
1251 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1254 AVIndexEntry *entries= st->index_entries;
1255 int nb_entries= st->nb_index_entries;
1264 timestamp = entries[m].timestamp;
1265 if(timestamp >= wanted_timestamp)
1267 if(timestamp <= wanted_timestamp)
1270 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1272 if(!(flags & AVSEEK_FLAG_ANY)){
1273 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1274 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1285 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1286 AVInputFormat *avif= s->iformat;
1287 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1288 int64_t ts_min, ts_max, ts;
1292 if (stream_index < 0)
1296 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1300 ts_min= AV_NOPTS_VALUE;
1301 pos_limit= -1; //gcc falsely says it may be uninitialized
1303 st= s->streams[stream_index];
1304 if(st->index_entries){
1307 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()
1308 index= FFMAX(index, 0);
1309 e= &st->index_entries[index];
1311 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1313 ts_min= e->timestamp;
1315 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1322 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1323 assert(index < st->nb_index_entries);
1325 e= &st->index_entries[index];
1326 assert(e->timestamp >= target_ts);
1328 ts_max= e->timestamp;
1329 pos_limit= pos_max - e->min_distance;
1331 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1332 pos_max,pos_limit, ts_max);
1337 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1342 url_fseek(s->pb, pos, SEEK_SET);
1344 av_update_cur_dts(s, st, ts);
1349 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 )){
1351 int64_t start_pos, filesize;
1355 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1358 if(ts_min == AV_NOPTS_VALUE){
1359 pos_min = s->data_offset;
1360 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1361 if (ts_min == AV_NOPTS_VALUE)
1365 if(ts_max == AV_NOPTS_VALUE){
1367 filesize = url_fsize(s->pb);
1368 pos_max = filesize - 1;
1371 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1373 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1374 if (ts_max == AV_NOPTS_VALUE)
1378 int64_t tmp_pos= pos_max + 1;
1379 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1380 if(tmp_ts == AV_NOPTS_VALUE)
1384 if(tmp_pos >= filesize)
1390 if(ts_min > ts_max){
1392 }else if(ts_min == ts_max){
1397 while (pos_min < pos_limit) {
1399 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1403 assert(pos_limit <= pos_max);
1406 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1407 // interpolate position (better than dichotomy)
1408 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1409 + pos_min - approximate_keyframe_distance;
1410 }else if(no_change==1){
1411 // bisection, if interpolation failed to change min or max pos last time
1412 pos = (pos_min + pos_limit)>>1;
1414 /* linear search if bisection failed, can only happen if there
1415 are very few or no keyframes between min/max */
1420 else if(pos > pos_limit)
1424 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1430 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1431 pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit,
1432 start_pos, no_change);
1434 if(ts == AV_NOPTS_VALUE){
1435 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1438 assert(ts != AV_NOPTS_VALUE);
1439 if (target_ts <= ts) {
1440 pos_limit = start_pos - 1;
1444 if (target_ts >= ts) {
1450 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1451 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1454 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1456 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1457 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1458 pos, ts_min, target_ts, ts_max);
1464 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1465 int64_t pos_min, pos_max;
1469 if (stream_index < 0)
1472 st= s->streams[stream_index];
1475 pos_min = s->data_offset;
1476 pos_max = url_fsize(s->pb) - 1;
1478 if (pos < pos_min) pos= pos_min;
1479 else if(pos > pos_max) pos= pos_max;
1481 url_fseek(s->pb, pos, SEEK_SET);
1484 av_update_cur_dts(s, st, ts);
1489 static int av_seek_frame_generic(AVFormatContext *s,
1490 int stream_index, int64_t timestamp, int flags)
1496 st = s->streams[stream_index];
1498 index = av_index_search_timestamp(st, timestamp, flags);
1500 if(index < 0 || index==st->nb_index_entries-1){
1504 if(st->nb_index_entries){
1505 assert(st->index_entries);
1506 ie= &st->index_entries[st->nb_index_entries-1];
1507 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1509 av_update_cur_dts(s, st, ie->timestamp);
1511 if ((ret = url_fseek(s->pb, s->data_offset, SEEK_SET)) < 0)
1517 ret = av_read_frame(s, &pkt);
1518 }while(ret == AVERROR(EAGAIN));
1521 av_free_packet(&pkt);
1522 if(stream_index == pkt.stream_index){
1523 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1527 index = av_index_search_timestamp(st, timestamp, flags);
1532 av_read_frame_flush(s);
1533 if (s->iformat->read_seek){
1534 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1537 ie = &st->index_entries[index];
1538 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1540 av_update_cur_dts(s, st, ie->timestamp);
1545 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1550 av_read_frame_flush(s);
1552 if(flags & AVSEEK_FLAG_BYTE)
1553 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1555 if(stream_index < 0){
1556 stream_index= av_find_default_stream_index(s);
1557 if(stream_index < 0)
1560 st= s->streams[stream_index];
1561 /* timestamp for default must be expressed in AV_TIME_BASE units */
1562 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1565 /* first, we try the format specific seek */
1566 if (s->iformat->read_seek)
1567 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1574 if(s->iformat->read_timestamp)
1575 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1577 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1580 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1582 if(min_ts > ts || max_ts < ts)
1585 av_read_frame_flush(s);
1587 if (s->iformat->read_seek2)
1588 return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1590 if(s->iformat->read_timestamp){
1591 //try to seek via read_timestamp()
1594 //Fallback to old API if new is not implemented but old is
1595 //Note the old has somewat different sematics
1596 if(s->iformat->read_seek || 1)
1597 return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1599 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1602 /*******************************************************/
1605 * Returns TRUE if the stream has accurate duration in any stream.
1607 * @return TRUE if the stream has accurate duration for at least one component.
1609 static int av_has_duration(AVFormatContext *ic)
1614 for(i = 0;i < ic->nb_streams; i++) {
1615 st = ic->streams[i];
1616 if (st->duration != AV_NOPTS_VALUE)
1623 * Estimate the stream timings from the one of each components.
1625 * Also computes the global bitrate if possible.
1627 static void av_update_stream_timings(AVFormatContext *ic)
1629 int64_t start_time, start_time1, end_time, end_time1;
1630 int64_t duration, duration1;
1634 start_time = INT64_MAX;
1635 end_time = INT64_MIN;
1636 duration = INT64_MIN;
1637 for(i = 0;i < ic->nb_streams; i++) {
1638 st = ic->streams[i];
1639 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1640 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1641 if (start_time1 < start_time)
1642 start_time = start_time1;
1643 if (st->duration != AV_NOPTS_VALUE) {
1644 end_time1 = start_time1
1645 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1646 if (end_time1 > end_time)
1647 end_time = end_time1;
1650 if (st->duration != AV_NOPTS_VALUE) {
1651 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1652 if (duration1 > duration)
1653 duration = duration1;
1656 if (start_time != INT64_MAX) {
1657 ic->start_time = start_time;
1658 if (end_time != INT64_MIN) {
1659 if (end_time - start_time > duration)
1660 duration = end_time - start_time;
1663 if (duration != INT64_MIN) {
1664 ic->duration = duration;
1665 if (ic->file_size > 0) {
1666 /* compute the bitrate */
1667 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1668 (double)ic->duration;
1673 static void fill_all_stream_timings(AVFormatContext *ic)
1678 av_update_stream_timings(ic);
1679 for(i = 0;i < ic->nb_streams; i++) {
1680 st = ic->streams[i];
1681 if (st->start_time == AV_NOPTS_VALUE) {
1682 if(ic->start_time != AV_NOPTS_VALUE)
1683 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1684 if(ic->duration != AV_NOPTS_VALUE)
1685 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1690 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1692 int64_t filesize, duration;
1696 /* if bit_rate is already set, we believe it */
1697 if (ic->bit_rate == 0) {
1699 for(i=0;i<ic->nb_streams;i++) {
1700 st = ic->streams[i];
1701 bit_rate += st->codec->bit_rate;
1703 ic->bit_rate = bit_rate;
1706 /* if duration is already set, we believe it */
1707 if (ic->duration == AV_NOPTS_VALUE &&
1708 ic->bit_rate != 0 &&
1709 ic->file_size != 0) {
1710 filesize = ic->file_size;
1712 for(i = 0; i < ic->nb_streams; i++) {
1713 st = ic->streams[i];
1714 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1715 if (st->duration == AV_NOPTS_VALUE)
1716 st->duration = duration;
1722 #define DURATION_MAX_READ_SIZE 250000
1724 /* only usable for MPEG-PS streams */
1725 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1727 AVPacket pkt1, *pkt = &pkt1;
1729 int read_size, i, ret;
1731 int64_t filesize, offset, duration;
1735 /* flush packet queue */
1736 flush_packet_queue(ic);
1738 for(i=0;i<ic->nb_streams;i++) {
1739 st = ic->streams[i];
1741 av_parser_close(st->parser);
1743 av_free_packet(&st->cur_pkt);
1747 /* we read the first packets to get the first PTS (not fully
1748 accurate, but it is enough now) */
1749 url_fseek(ic->pb, 0, SEEK_SET);
1752 if (read_size >= DURATION_MAX_READ_SIZE)
1754 /* if all info is available, we can stop */
1755 for(i = 0;i < ic->nb_streams; i++) {
1756 st = ic->streams[i];
1757 if (st->start_time == AV_NOPTS_VALUE)
1760 if (i == ic->nb_streams)
1764 ret = av_read_packet(ic, pkt);
1765 }while(ret == AVERROR(EAGAIN));
1768 read_size += pkt->size;
1769 st = ic->streams[pkt->stream_index];
1770 if (pkt->pts != AV_NOPTS_VALUE) {
1771 if (st->start_time == AV_NOPTS_VALUE)
1772 st->start_time = pkt->pts;
1774 av_free_packet(pkt);
1777 /* estimate the end time (duration) */
1778 /* XXX: may need to support wrapping */
1779 filesize = ic->file_size;
1780 offset = filesize - DURATION_MAX_READ_SIZE;
1784 url_fseek(ic->pb, offset, SEEK_SET);
1787 if (read_size >= DURATION_MAX_READ_SIZE)
1791 ret = av_read_packet(ic, pkt);
1792 }while(ret == AVERROR(EAGAIN));
1795 read_size += pkt->size;
1796 st = ic->streams[pkt->stream_index];
1797 if (pkt->pts != AV_NOPTS_VALUE &&
1798 st->start_time != AV_NOPTS_VALUE) {
1799 end_time = pkt->pts;
1800 duration = end_time - st->start_time;
1802 if (st->duration == AV_NOPTS_VALUE ||
1803 st->duration < duration)
1804 st->duration = duration;
1807 av_free_packet(pkt);
1810 fill_all_stream_timings(ic);
1812 url_fseek(ic->pb, old_offset, SEEK_SET);
1813 for(i=0; i<ic->nb_streams; i++){
1815 st->cur_dts= st->first_dts;
1816 st->last_IP_pts = AV_NOPTS_VALUE;
1820 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
1824 /* get the file size, if possible */
1825 if (ic->iformat->flags & AVFMT_NOFILE) {
1828 file_size = url_fsize(ic->pb);
1832 ic->file_size = file_size;
1834 if ((!strcmp(ic->iformat->name, "mpeg") ||
1835 !strcmp(ic->iformat->name, "mpegts")) &&
1836 file_size && !url_is_streamed(ic->pb)) {
1837 /* get accurate estimate from the PTSes */
1838 av_estimate_timings_from_pts(ic, old_offset);
1839 } else if (av_has_duration(ic)) {
1840 /* at least one component has timings - we use them for all
1842 fill_all_stream_timings(ic);
1844 /* less precise: use bitrate info */
1845 av_estimate_timings_from_bit_rate(ic);
1847 av_update_stream_timings(ic);
1853 for(i = 0;i < ic->nb_streams; i++) {
1854 st = ic->streams[i];
1855 printf("%d: start_time: %0.3f duration: %0.3f\n",
1856 i, (double)st->start_time / AV_TIME_BASE,
1857 (double)st->duration / AV_TIME_BASE);
1859 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1860 (double)ic->start_time / AV_TIME_BASE,
1861 (double)ic->duration / AV_TIME_BASE,
1862 ic->bit_rate / 1000);
1867 static int has_codec_parameters(AVCodecContext *enc)
1870 switch(enc->codec_type) {
1871 case CODEC_TYPE_AUDIO:
1872 val = enc->sample_rate && enc->channels && enc->sample_fmt != SAMPLE_FMT_NONE;
1873 if(!enc->frame_size &&
1874 (enc->codec_id == CODEC_ID_VORBIS ||
1875 enc->codec_id == CODEC_ID_AAC ||
1876 enc->codec_id == CODEC_ID_SPEEX))
1879 case CODEC_TYPE_VIDEO:
1880 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1886 return enc->codec_id != CODEC_ID_NONE && val != 0;
1889 static int try_decode_frame(AVStream *st, AVPacket *avpkt)
1893 int got_picture, data_size, ret=0;
1896 if(!st->codec->codec){
1897 codec = avcodec_find_decoder(st->codec->codec_id);
1900 ret = avcodec_open(st->codec, codec);
1905 if(!has_codec_parameters(st->codec)){
1906 switch(st->codec->codec_type) {
1907 case CODEC_TYPE_VIDEO:
1908 avcodec_get_frame_defaults(&picture);
1909 ret = avcodec_decode_video2(st->codec, &picture,
1910 &got_picture, avpkt);
1912 case CODEC_TYPE_AUDIO:
1913 data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1914 samples = av_malloc(data_size);
1917 ret = avcodec_decode_audio3(st->codec, samples,
1929 unsigned int ff_codec_get_tag(const AVCodecTag *tags, int id)
1931 while (tags->id != CODEC_ID_NONE) {
1939 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
1942 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1943 if(tag == tags[i].tag)
1946 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1947 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1948 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1949 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1950 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1953 return CODEC_ID_NONE;
1956 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
1959 for(i=0; tags && tags[i]; i++){
1960 int tag= ff_codec_get_tag(tags[i], id);
1966 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
1969 for(i=0; tags && tags[i]; i++){
1970 enum CodecID id= ff_codec_get_id(tags[i], tag);
1971 if(id!=CODEC_ID_NONE) return id;
1973 return CODEC_ID_NONE;
1976 static void compute_chapters_end(AVFormatContext *s)
1980 for (i=0; i+1<s->nb_chapters; i++)
1981 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
1982 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
1983 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
1984 s->chapters[i]->end = s->chapters[i+1]->start;
1987 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
1988 assert(s->start_time != AV_NOPTS_VALUE);
1989 assert(s->duration > 0);
1990 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
1992 s->chapters[i]->time_base);
1996 #define MAX_STD_TIMEBASES (60*12+5)
1997 static int get_std_framerate(int i){
1998 if(i<60*12) return i*1001;
1999 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2003 * Is the time base unreliable.
2004 * This is a heuristic to balance between quick acceptance of the values in
2005 * the headers vs. some extra checks.
2006 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2007 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2008 * And there are "variable" fps files this needs to detect as well.
2010 static int tb_unreliable(AVCodecContext *c){
2011 if( c->time_base.den >= 101L*c->time_base.num
2012 || c->time_base.den < 5L*c->time_base.num
2013 /* || c->codec_tag == AV_RL32("DIVX")
2014 || c->codec_tag == AV_RL32("XVID")*/
2015 || c->codec_id == CODEC_ID_MPEG2VIDEO
2016 || c->codec_id == CODEC_ID_H264
2022 int av_find_stream_info(AVFormatContext *ic)
2024 int i, count, ret, read_size, j;
2026 AVPacket pkt1, *pkt;
2027 int64_t last_dts[MAX_STREAMS];
2028 int64_t duration_gcd[MAX_STREAMS]={0};
2029 int duration_count[MAX_STREAMS]={0};
2030 double (*duration_error)[MAX_STD_TIMEBASES];
2031 int64_t old_offset = url_ftell(ic->pb);
2032 int64_t codec_info_duration[MAX_STREAMS]={0};
2033 int codec_info_nb_frames[MAX_STREAMS]={0};
2035 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
2036 if (!duration_error) return AVERROR(ENOMEM);
2038 for(i=0;i<ic->nb_streams;i++) {
2039 st = ic->streams[i];
2040 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2041 /* if(!st->time_base.num)
2043 if(!st->codec->time_base.num)
2044 st->codec->time_base= st->time_base;
2046 //only for the split stuff
2048 st->parser = av_parser_init(st->codec->codec_id);
2049 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2050 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2055 for(i=0;i<MAX_STREAMS;i++){
2056 last_dts[i]= AV_NOPTS_VALUE;
2062 if(url_interrupt_cb()){
2063 ret= AVERROR(EINTR);
2064 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2068 /* check if one codec still needs to be handled */
2069 for(i=0;i<ic->nb_streams;i++) {
2070 st = ic->streams[i];
2071 if (!has_codec_parameters(st->codec))
2073 /* variable fps and no guess at the real fps */
2074 if( tb_unreliable(st->codec)
2075 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
2077 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2079 if(st->first_dts == AV_NOPTS_VALUE)
2082 if (i == ic->nb_streams) {
2083 /* NOTE: if the format has no header, then we need to read
2084 some packets to get most of the streams, so we cannot
2086 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2087 /* if we found the info for all the codecs, we can stop */
2089 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2093 /* we did not get all the codec info, but we read too much data */
2094 if (read_size >= ic->probesize) {
2096 av_log(ic, AV_LOG_WARNING, "MAX_READ_SIZE:%d reached\n", ic->probesize);
2100 /* NOTE: a new stream can be added there if no header in file
2101 (AVFMTCTX_NOHEADER) */
2102 ret = av_read_frame_internal(ic, &pkt1);
2103 if(ret == AVERROR(EAGAIN))
2107 ret = -1; /* we could not have all the codec parameters before EOF */
2108 for(i=0;i<ic->nb_streams;i++) {
2109 st = ic->streams[i];
2110 if (!has_codec_parameters(st->codec)){
2112 avcodec_string(buf, sizeof(buf), st->codec, 0);
2113 av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2121 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2122 if(av_dup_packet(pkt) < 0) {
2123 av_free(duration_error);
2124 return AVERROR(ENOMEM);
2127 read_size += pkt->size;
2129 st = ic->streams[pkt->stream_index];
2130 if(codec_info_nb_frames[st->index]>1) {
2131 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){
2132 av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2135 codec_info_duration[st->index] += pkt->duration;
2137 if (pkt->duration != 0)
2138 codec_info_nb_frames[st->index]++;
2141 int index= pkt->stream_index;
2142 int64_t last= last_dts[index];
2143 int64_t duration= pkt->dts - last;
2145 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2146 double dur= duration * av_q2d(st->time_base);
2148 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2149 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2150 if(duration_count[index] < 2)
2151 memset(duration_error[index], 0, sizeof(*duration_error));
2152 for(i=1; i<MAX_STD_TIMEBASES; i++){
2153 int framerate= get_std_framerate(i);
2154 int ticks= lrintf(dur*framerate/(1001*12));
2155 double error= dur - ticks*1001*12/(double)framerate;
2156 duration_error[index][i] += error*error;
2158 duration_count[index]++;
2159 // ignore the first 4 values, they might have some random jitter
2160 if (duration_count[index] > 3)
2161 duration_gcd[index] = av_gcd(duration_gcd[index], duration);
2163 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
2164 last_dts[pkt->stream_index]= pkt->dts;
2166 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2167 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2169 st->codec->extradata_size= i;
2170 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2171 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2172 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2176 /* if still no information, we try to open the codec and to
2177 decompress the frame. We try to avoid that in most cases as
2178 it takes longer and uses more memory. For MPEG-4, we need to
2179 decompress for QuickTime. */
2180 if (!has_codec_parameters(st->codec) /*&&
2181 (st->codec->codec_id == CODEC_ID_FLV1 ||
2182 st->codec->codec_id == CODEC_ID_H264 ||
2183 st->codec->codec_id == CODEC_ID_H263 ||
2184 st->codec->codec_id == CODEC_ID_H261 ||
2185 st->codec->codec_id == CODEC_ID_VORBIS ||
2186 st->codec->codec_id == CODEC_ID_MJPEG ||
2187 st->codec->codec_id == CODEC_ID_PNG ||
2188 st->codec->codec_id == CODEC_ID_PAM ||
2189 st->codec->codec_id == CODEC_ID_PGM ||
2190 st->codec->codec_id == CODEC_ID_PGMYUV ||
2191 st->codec->codec_id == CODEC_ID_PBM ||
2192 st->codec->codec_id == CODEC_ID_PPM ||
2193 st->codec->codec_id == CODEC_ID_SHORTEN ||
2194 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2195 try_decode_frame(st, pkt);
2200 // close codecs which were opened in try_decode_frame()
2201 for(i=0;i<ic->nb_streams;i++) {
2202 st = ic->streams[i];
2203 if(st->codec->codec)
2204 avcodec_close(st->codec);
2206 for(i=0;i<ic->nb_streams;i++) {
2207 st = ic->streams[i];
2208 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2209 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
2210 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2212 // the check for tb_unreliable() is not completely correct, since this is not about handling
2213 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2214 // ipmovie.c produces.
2215 if (tb_unreliable(st->codec) && duration_count[i] > 15 && duration_gcd[i] > 1)
2216 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * duration_gcd[i], INT_MAX);
2217 if(duration_count[i]
2218 && tb_unreliable(st->codec) /*&&
2219 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2220 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2222 double best_error= 2*av_q2d(st->time_base);
2223 best_error= best_error*best_error*duration_count[i]*1000*12*30;
2225 for(j=1; j<MAX_STD_TIMEBASES; j++){
2226 double error= duration_error[i][j] * get_std_framerate(j);
2227 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2228 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2229 if(error < best_error){
2231 num = get_std_framerate(j);
2234 // do not increase frame rate by more than 1 % in order to match a standard rate.
2235 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2236 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2239 if (!st->r_frame_rate.num){
2240 if( st->codec->time_base.den * (int64_t)st->time_base.num
2241 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2242 st->r_frame_rate.num = st->codec->time_base.den;
2243 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2245 st->r_frame_rate.num = st->time_base.den;
2246 st->r_frame_rate.den = st->time_base.num;
2249 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
2250 if(!st->codec->bits_per_coded_sample)
2251 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2255 av_estimate_timings(ic, old_offset);
2257 compute_chapters_end(ic);
2260 /* correct DTS for B-frame streams with no timestamps */
2261 for(i=0;i<ic->nb_streams;i++) {
2262 st = ic->streams[i];
2263 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2265 ppktl = &ic->packet_buffer;
2267 if(ppkt1->stream_index != i)
2269 if(ppkt1->pkt->dts < 0)
2271 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2273 ppkt1->pkt->dts -= delta;
2278 st->cur_dts -= delta;
2284 av_free(duration_error);
2289 /*******************************************************/
2291 int av_read_play(AVFormatContext *s)
2293 if (s->iformat->read_play)
2294 return s->iformat->read_play(s);
2296 return av_url_read_fpause(s->pb, 0);
2297 return AVERROR(ENOSYS);
2300 int av_read_pause(AVFormatContext *s)
2302 if (s->iformat->read_pause)
2303 return s->iformat->read_pause(s);
2305 return av_url_read_fpause(s->pb, 1);
2306 return AVERROR(ENOSYS);
2309 void av_close_input_stream(AVFormatContext *s)
2314 if (s->iformat->read_close)
2315 s->iformat->read_close(s);
2316 for(i=0;i<s->nb_streams;i++) {
2317 /* free all data in a stream component */
2320 av_parser_close(st->parser);
2321 av_free_packet(&st->cur_pkt);
2323 av_metadata_free(&st->metadata);
2324 av_free(st->index_entries);
2325 av_free(st->codec->extradata);
2327 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2328 av_free(st->filename);
2330 av_free(st->priv_data);
2333 for(i=s->nb_programs-1; i>=0; i--) {
2334 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2335 av_freep(&s->programs[i]->provider_name);
2336 av_freep(&s->programs[i]->name);
2338 av_metadata_free(&s->programs[i]->metadata);
2339 av_freep(&s->programs[i]->stream_index);
2340 av_freep(&s->programs[i]);
2342 av_freep(&s->programs);
2343 flush_packet_queue(s);
2344 av_freep(&s->priv_data);
2345 while(s->nb_chapters--) {
2346 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2347 av_free(s->chapters[s->nb_chapters]->title);
2349 av_metadata_free(&s->chapters[s->nb_chapters]->metadata);
2350 av_free(s->chapters[s->nb_chapters]);
2352 av_freep(&s->chapters);
2353 av_metadata_free(&s->metadata);
2357 void av_close_input_file(AVFormatContext *s)
2359 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2360 av_close_input_stream(s);
2365 AVStream *av_new_stream(AVFormatContext *s, int id)
2370 if (s->nb_streams >= MAX_STREAMS)
2373 st = av_mallocz(sizeof(AVStream));
2377 st->codec= avcodec_alloc_context();
2379 /* no default bitrate if decoding */
2380 st->codec->bit_rate = 0;
2382 st->index = s->nb_streams;
2384 st->start_time = AV_NOPTS_VALUE;
2385 st->duration = AV_NOPTS_VALUE;
2386 /* we set the current DTS to 0 so that formats without any timestamps
2387 but durations get some timestamps, formats with some unknown
2388 timestamps have their first few packets buffered and the
2389 timestamps corrected before they are returned to the user */
2391 st->first_dts = AV_NOPTS_VALUE;
2392 st->probe_packets = MAX_PROBE_PACKETS;
2394 /* default pts setting is MPEG-like */
2395 av_set_pts_info(st, 33, 1, 90000);
2396 st->last_IP_pts = AV_NOPTS_VALUE;
2397 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2398 st->pts_buffer[i]= AV_NOPTS_VALUE;
2399 st->reference_dts = AV_NOPTS_VALUE;
2401 st->sample_aspect_ratio = (AVRational){0,1};
2403 s->streams[s->nb_streams++] = st;
2407 AVProgram *av_new_program(AVFormatContext *ac, int id)
2409 AVProgram *program=NULL;
2413 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2416 for(i=0; i<ac->nb_programs; i++)
2417 if(ac->programs[i]->id == id)
2418 program = ac->programs[i];
2421 program = av_mallocz(sizeof(AVProgram));
2424 dynarray_add(&ac->programs, &ac->nb_programs, program);
2425 program->discard = AVDISCARD_NONE;
2432 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2434 AVChapter *chapter = NULL;
2437 for(i=0; i<s->nb_chapters; i++)
2438 if(s->chapters[i]->id == id)
2439 chapter = s->chapters[i];
2442 chapter= av_mallocz(sizeof(AVChapter));
2445 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2447 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2448 av_free(chapter->title);
2450 av_metadata_set(&chapter->metadata, "title", title);
2452 chapter->time_base= time_base;
2453 chapter->start = start;
2459 /************************************************************/
2460 /* output media file */
2462 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2466 if (s->oformat->priv_data_size > 0) {
2467 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2469 return AVERROR(ENOMEM);
2471 s->priv_data = NULL;
2473 if (s->oformat->set_parameters) {
2474 ret = s->oformat->set_parameters(s, ap);
2481 int av_write_header(AVFormatContext *s)
2486 // some sanity checks
2487 for(i=0;i<s->nb_streams;i++) {
2490 switch (st->codec->codec_type) {
2491 case CODEC_TYPE_AUDIO:
2492 if(st->codec->sample_rate<=0){
2493 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2496 if(!st->codec->block_align)
2497 st->codec->block_align = st->codec->channels *
2498 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2500 case CODEC_TYPE_VIDEO:
2501 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2502 av_log(s, AV_LOG_ERROR, "time base not set\n");
2505 if(st->codec->width<=0 || st->codec->height<=0){
2506 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2509 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2510 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2516 if(s->oformat->codec_tag){
2517 if(st->codec->codec_tag){
2519 //check that tag + id is in the table
2520 //if neither is in the table -> OK
2521 //if tag is in the table with another id -> FAIL
2522 //if id is in the table with another tag -> FAIL unless strict < ?
2524 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2527 if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2528 !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2529 av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2532 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2533 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2535 return AVERROR(ENOMEM);
2538 #if LIBAVFORMAT_VERSION_MAJOR < 53
2539 ff_metadata_mux_compat(s);
2542 if(s->oformat->write_header){
2543 ret = s->oformat->write_header(s);
2548 /* init PTS generation */
2549 for(i=0;i<s->nb_streams;i++) {
2550 int64_t den = AV_NOPTS_VALUE;
2553 switch (st->codec->codec_type) {
2554 case CODEC_TYPE_AUDIO:
2555 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2557 case CODEC_TYPE_VIDEO:
2558 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2563 if (den != AV_NOPTS_VALUE) {
2565 return AVERROR_INVALIDDATA;
2566 av_frac_init(&st->pts, 0, 0, den);
2572 //FIXME merge with compute_pkt_fields
2573 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2574 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2575 int num, den, frame_size, i;
2577 // av_log(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);
2579 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2582 /* duration field */
2583 if (pkt->duration == 0) {
2584 compute_frame_duration(&num, &den, st, NULL, pkt);
2586 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2590 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2593 //XXX/FIXME this is a temporary hack until all encoders output pts
2594 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2596 // pkt->pts= st->cur_dts;
2597 pkt->pts= st->pts.val;
2600 //calculate dts from pts
2601 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2602 st->pts_buffer[0]= pkt->pts;
2603 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2604 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2605 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2606 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2608 pkt->dts= st->pts_buffer[0];
2611 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2612 av_log(st->codec, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2615 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2616 av_log(st->codec, AV_LOG_ERROR, "error, pts < dts\n");
2620 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2621 st->cur_dts= pkt->dts;
2622 st->pts.val= pkt->dts;
2625 switch (st->codec->codec_type) {
2626 case CODEC_TYPE_AUDIO:
2627 frame_size = get_audio_frame_size(st->codec, pkt->size);
2629 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2630 likely equal to the encoder delay, but it would be better if we
2631 had the real timestamps from the encoder */
2632 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2633 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2636 case CODEC_TYPE_VIDEO:
2637 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2645 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2647 int ret = compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2649 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2652 ret= s->oformat->write_packet(s, pkt);
2654 ret= url_ferror(s->pb);
2658 void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
2659 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
2661 AVPacketList **next_point, *this_pktl;
2663 this_pktl = av_mallocz(sizeof(AVPacketList));
2664 this_pktl->pkt= *pkt;
2665 pkt->destruct= NULL; // do not free original but only the copy
2666 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
2668 if(s->streams[pkt->stream_index]->last_in_packet_buffer){
2669 next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
2671 next_point = &s->packet_buffer;
2674 if(compare(s, &s->packet_buffer_end->pkt, pkt)){
2675 while(!compare(s, &(*next_point)->pkt, pkt)){
2676 next_point= &(*next_point)->next;
2680 next_point = &(s->packet_buffer_end->next);
2683 assert(!*next_point);
2685 s->packet_buffer_end= this_pktl;
2688 this_pktl->next= *next_point;
2690 s->streams[pkt->stream_index]->last_in_packet_buffer=
2691 *next_point= this_pktl;
2694 int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
2696 AVStream *st = s->streams[ pkt ->stream_index];
2697 AVStream *st2= s->streams[ next->stream_index];
2698 int64_t left = st2->time_base.num * (int64_t)st ->time_base.den;
2699 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2701 if (pkt->dts == AV_NOPTS_VALUE)
2704 return next->dts * left > pkt->dts * right; //FIXME this can overflow
2707 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2713 ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
2716 for(i=0; i < s->nb_streams; i++)
2717 stream_count+= !!s->streams[i]->last_in_packet_buffer;
2719 if(stream_count && (s->nb_streams == stream_count || flush)){
2720 pktl= s->packet_buffer;
2723 s->packet_buffer= pktl->next;
2724 if(!s->packet_buffer)
2725 s->packet_buffer_end= NULL;
2727 if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
2728 s->streams[out->stream_index]->last_in_packet_buffer= NULL;
2732 av_init_packet(out);
2738 * Interleaves an AVPacket correctly so it can be muxed.
2739 * @param out the interleaved packet will be output here
2740 * @param in the input packet
2741 * @param flush 1 if no further packets are available as input and all
2742 * remaining packets should be output
2743 * @return 1 if a packet was output, 0 if no packet could be output,
2744 * < 0 if an error occurred
2746 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2747 if(s->oformat->interleave_packet)
2748 return s->oformat->interleave_packet(s, out, in, flush);
2750 return av_interleave_packet_per_dts(s, out, in, flush);
2753 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2754 AVStream *st= s->streams[ pkt->stream_index];
2756 //FIXME/XXX/HACK drop zero sized packets
2757 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2760 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2761 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2764 if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2769 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2770 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2773 ret= s->oformat->write_packet(s, &opkt);
2775 av_free_packet(&opkt);
2780 if(url_ferror(s->pb))
2781 return url_ferror(s->pb);
2785 int av_write_trailer(AVFormatContext *s)
2791 ret= av_interleave_packet(s, &pkt, NULL, 1);
2792 if(ret<0) //FIXME cleanup needed for ret<0 ?
2797 ret= s->oformat->write_packet(s, &pkt);
2799 av_free_packet(&pkt);
2803 if(url_ferror(s->pb))
2807 if(s->oformat->write_trailer)
2808 ret = s->oformat->write_trailer(s);
2811 ret=url_ferror(s->pb);
2812 for(i=0;i<s->nb_streams;i++)
2813 av_freep(&s->streams[i]->priv_data);
2814 av_freep(&s->priv_data);
2818 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2821 AVProgram *program=NULL;
2824 for(i=0; i<ac->nb_programs; i++){
2825 if(ac->programs[i]->id != progid)
2827 program = ac->programs[i];
2828 for(j=0; j<program->nb_stream_indexes; j++)
2829 if(program->stream_index[j] == idx)
2832 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2835 program->stream_index = tmp;
2836 program->stream_index[program->nb_stream_indexes++] = idx;
2841 static void print_fps(double d, const char *postfix){
2842 uint64_t v= lrintf(d*100);
2843 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
2844 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
2845 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
2848 /* "user interface" functions */
2849 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2852 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2853 AVStream *st = ic->streams[i];
2854 int g = av_gcd(st->time_base.num, st->time_base.den);
2855 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0);
2856 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2857 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2858 /* the pid is an important information, so we display it */
2859 /* XXX: add a generic system */
2860 if (flags & AVFMT_SHOW_IDS)
2861 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2863 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
2864 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2865 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2866 if (st->sample_aspect_ratio.num && // default
2867 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
2868 AVRational display_aspect_ratio;
2869 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
2870 st->codec->width*st->sample_aspect_ratio.num,
2871 st->codec->height*st->sample_aspect_ratio.den,
2873 av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
2874 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
2875 display_aspect_ratio.num, display_aspect_ratio.den);
2877 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2878 if(st->r_frame_rate.den && st->r_frame_rate.num)
2879 print_fps(av_q2d(st->r_frame_rate), "tbr");
2880 if(st->time_base.den && st->time_base.num)
2881 print_fps(1/av_q2d(st->time_base), "tbn");
2882 if(st->codec->time_base.den && st->codec->time_base.num)
2883 print_fps(1/av_q2d(st->codec->time_base), "tbc");
2885 av_log(NULL, AV_LOG_INFO, "\n");
2888 void dump_format(AVFormatContext *ic,
2895 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2896 is_output ? "Output" : "Input",
2898 is_output ? ic->oformat->name : ic->iformat->name,
2899 is_output ? "to" : "from", url);
2901 av_log(NULL, AV_LOG_INFO, " Duration: ");
2902 if (ic->duration != AV_NOPTS_VALUE) {
2903 int hours, mins, secs, us;
2904 secs = ic->duration / AV_TIME_BASE;
2905 us = ic->duration % AV_TIME_BASE;
2910 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
2911 (100 * us) / AV_TIME_BASE);
2913 av_log(NULL, AV_LOG_INFO, "N/A");
2915 if (ic->start_time != AV_NOPTS_VALUE) {
2917 av_log(NULL, AV_LOG_INFO, ", start: ");
2918 secs = ic->start_time / AV_TIME_BASE;
2919 us = ic->start_time % AV_TIME_BASE;
2920 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2921 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2923 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2925 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2927 av_log(NULL, AV_LOG_INFO, "N/A");
2929 av_log(NULL, AV_LOG_INFO, "\n");
2931 if(ic->nb_programs) {
2933 for(j=0; j<ic->nb_programs; j++) {
2934 AVMetadataTag *name = av_metadata_get(ic->programs[j]->metadata,
2936 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2937 name ? name->value : "");
2938 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++)
2939 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2942 for(i=0;i<ic->nb_streams;i++)
2943 dump_stream_format(ic, i, index, is_output);
2945 AVMetadataTag *tag=NULL;
2946 av_log(NULL, AV_LOG_INFO, " Metadata\n");
2947 while((tag=av_metadata_get(ic->metadata, "", tag, AV_METADATA_IGNORE_SUFFIX))) {
2948 av_log(NULL, AV_LOG_INFO, " %-16s: %s\n", tag->key, tag->value);
2954 #if LIBAVFORMAT_VERSION_MAJOR < 53
2955 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2957 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2960 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2962 AVRational frame_rate;
2963 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2964 *frame_rate_num= frame_rate.num;
2965 *frame_rate_den= frame_rate.den;
2970 int64_t av_gettime(void)
2973 gettimeofday(&tv,NULL);
2974 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2977 int64_t parse_date(const char *datestr, int duration)
2983 static const char * const date_fmt[] = {
2987 static const char * const time_fmt[] = {
2997 time_t now = time(0);
2999 len = strlen(datestr);
3001 lastch = datestr[len - 1];
3004 is_utc = (lastch == 'z' || lastch == 'Z');
3006 memset(&dt, 0, sizeof(dt));
3011 if (!strncasecmp(datestr, "now", len))
3012 return (int64_t) now * 1000000;
3014 /* parse the year-month-day part */
3015 for (i = 0; i < FF_ARRAY_ELEMS(date_fmt); i++) {
3016 q = small_strptime(p, date_fmt[i], &dt);
3022 /* if the year-month-day part is missing, then take the
3023 * current year-month-day time */
3028 dt = *localtime(&now);
3030 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
3035 if (*p == 'T' || *p == 't' || *p == ' ')
3038 /* parse the hour-minute-second part */
3039 for (i = 0; i < FF_ARRAY_ELEMS(time_fmt); i++) {
3040 q = small_strptime(p, time_fmt[i], &dt);
3046 /* parse datestr as a duration */
3051 /* parse datestr as HH:MM:SS */
3052 q = small_strptime(p, time_fmt[0], &dt);
3054 /* parse datestr as S+ */
3055 dt.tm_sec = strtol(p, (char **)&q, 10);
3057 /* the parsing didn't succeed */
3064 /* Now we have all the fields that we can get */
3070 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
3072 dt.tm_isdst = -1; /* unknown */
3082 /* parse the .m... part */
3086 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
3089 val += n * (*q - '0');
3093 return negative ? -t : t;
3096 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3106 while (*p != '\0' && *p != '=' && *p != '&') {
3107 if ((q - tag) < sizeof(tag) - 1)
3115 while (*p != '&' && *p != '\0') {
3116 if ((q - arg) < arg_size - 1) {
3126 if (!strcmp(tag, tag1))
3135 int av_get_frame_filename(char *buf, int buf_size,
3136 const char *path, int number)
3139 char *q, buf1[20], c;
3140 int nd, len, percentd_found;
3152 while (isdigit(*p)) {
3153 nd = nd * 10 + *p++ - '0';
3156 } while (isdigit(c));
3165 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3167 if ((q - buf + len) > buf_size - 1)
3169 memcpy(q, buf1, len);
3177 if ((q - buf) < buf_size - 1)
3181 if (!percentd_found)
3190 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3193 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3195 for(i=0;i<size;i+=16) {
3202 PRINT(" %02x", buf[i+j]);
3207 for(j=0;j<len;j++) {
3209 if (c < ' ' || c > '~')
3218 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3220 hex_dump_internal(NULL, f, 0, buf, size);
3223 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3225 hex_dump_internal(avcl, NULL, level, buf, size);
3228 //FIXME needs to know the time_base
3229 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
3231 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3232 PRINT("stream #%d:\n", pkt->stream_index);
3233 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3234 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3235 /* DTS is _always_ valid after av_read_frame() */
3237 if (pkt->dts == AV_NOPTS_VALUE)
3240 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
3241 /* PTS may not be known if B-frames are present. */
3243 if (pkt->pts == AV_NOPTS_VALUE)
3246 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
3248 PRINT(" size=%d\n", pkt->size);
3251 av_hex_dump(f, pkt->data, pkt->size);
3254 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3256 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
3259 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3261 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
3264 void url_split(char *proto, int proto_size,
3265 char *authorization, int authorization_size,
3266 char *hostname, int hostname_size,
3268 char *path, int path_size,
3271 const char *p, *ls, *at, *col, *brk;
3273 if (port_ptr) *port_ptr = -1;
3274 if (proto_size > 0) proto[0] = 0;
3275 if (authorization_size > 0) authorization[0] = 0;
3276 if (hostname_size > 0) hostname[0] = 0;
3277 if (path_size > 0) path[0] = 0;
3279 /* parse protocol */
3280 if ((p = strchr(url, ':'))) {
3281 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3286 /* no protocol means plain filename */
3287 av_strlcpy(path, url, path_size);
3291 /* separate path from hostname */
3292 ls = strchr(p, '/');
3294 ls = strchr(p, '?');
3296 av_strlcpy(path, ls, path_size);
3298 ls = &p[strlen(p)]; // XXX
3300 /* the rest is hostname, use that to parse auth/port */
3302 /* authorization (user[:pass]@hostname) */
3303 if ((at = strchr(p, '@')) && at < ls) {
3304 av_strlcpy(authorization, p,
3305 FFMIN(authorization_size, at + 1 - p));
3306 p = at + 1; /* skip '@' */
3309 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3311 av_strlcpy(hostname, p + 1,
3312 FFMIN(hostname_size, brk - p));
3313 if (brk[1] == ':' && port_ptr)
3314 *port_ptr = atoi(brk + 2);
3315 } else if ((col = strchr(p, ':')) && col < ls) {
3316 av_strlcpy(hostname, p,
3317 FFMIN(col + 1 - p, hostname_size));
3318 if (port_ptr) *port_ptr = atoi(col + 1);
3320 av_strlcpy(hostname, p,
3321 FFMIN(ls + 1 - p, hostname_size));
3325 char *ff_data_to_hex(char *buff, const uint8_t *src, int s)
3328 static const char hex_table[16] = { '0', '1', '2', '3',
3331 'C', 'D', 'E', 'F' };
3333 for(i = 0; i < s; i++) {
3334 buff[i * 2] = hex_table[src[i] >> 4];
3335 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3341 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3342 unsigned int pts_num, unsigned int pts_den)
3344 s->pts_wrap_bits = pts_wrap_bits;
3346 if(av_reduce(&s->time_base.num, &s->time_base.den, pts_num, pts_den, INT_MAX)){
3347 if(s->time_base.num != pts_num)
3348 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/s->time_base.num);
3350 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3352 if(!s->time_base.num || !s->time_base.den)
3353 s->time_base.num= s->time_base.den= 0;