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
22 #include "libavcodec/opt.h"
23 #include "libavutil/avstring.h"
32 * @file libavformat/utils.c
33 * various utility functions for use within FFmpeg
36 static void av_frac_init(AVFrac
*f
, int64_t val
, int64_t num
, int64_t den
);
37 static void av_frac_add(AVFrac
*f
, int64_t incr
);
39 /** head of registered input format linked list */
40 AVInputFormat
*first_iformat
= NULL
;
41 /** head of registered output format linked list */
42 AVOutputFormat
*first_oformat
= NULL
;
44 AVInputFormat
*av_iformat_next(AVInputFormat
*f
)
47 else return first_iformat
;
50 AVOutputFormat
*av_oformat_next(AVOutputFormat
*f
)
53 else return first_oformat
;
56 void av_register_input_format(AVInputFormat
*format
)
60 while (*p
!= NULL
) p
= &(*p
)->next
;
65 void av_register_output_format(AVOutputFormat
*format
)
69 while (*p
!= NULL
) p
= &(*p
)->next
;
74 int match_ext(const char *filename
, const char *extensions
)
82 ext
= strrchr(filename
, '.');
88 while (*p
!= '\0' && *p
!= ',' && q
-ext1
<sizeof(ext1
)-1)
91 if (!strcasecmp(ext1
, ext
))
101 AVOutputFormat
*guess_format(const char *short_name
, const char *filename
,
102 const char *mime_type
)
104 AVOutputFormat
*fmt
, *fmt_found
;
105 int score_max
, score
;
107 /* specific test for image sequences */
108 #ifdef CONFIG_IMAGE2_MUXER
109 if (!short_name
&& filename
&&
110 av_filename_number_test(filename
) &&
111 av_guess_image2_codec(filename
) != CODEC_ID_NONE
) {
112 return guess_format("image2", NULL
, NULL
);
115 /* Find the proper file type. */
119 while (fmt
!= NULL
) {
121 if (fmt
->name
&& short_name
&& !strcmp(fmt
->name
, short_name
))
123 if (fmt
->mime_type
&& mime_type
&& !strcmp(fmt
->mime_type
, mime_type
))
125 if (filename
&& fmt
->extensions
&&
126 match_ext(filename
, fmt
->extensions
)) {
129 if (score
> score_max
) {
138 AVOutputFormat
*guess_stream_format(const char *short_name
, const char *filename
,
139 const char *mime_type
)
141 AVOutputFormat
*fmt
= guess_format(short_name
, filename
, mime_type
);
144 AVOutputFormat
*stream_fmt
;
145 char stream_format_name
[64];
147 snprintf(stream_format_name
, sizeof(stream_format_name
), "%s_stream", fmt
->name
);
148 stream_fmt
= guess_format(stream_format_name
, NULL
, NULL
);
157 enum CodecID
av_guess_codec(AVOutputFormat
*fmt
, const char *short_name
,
158 const char *filename
, const char *mime_type
, enum CodecType type
){
159 if(type
== CODEC_TYPE_VIDEO
){
160 enum CodecID codec_id
= CODEC_ID_NONE
;
162 #ifdef CONFIG_IMAGE2_MUXER
163 if(!strcmp(fmt
->name
, "image2") || !strcmp(fmt
->name
, "image2pipe")){
164 codec_id
= av_guess_image2_codec(filename
);
167 if(codec_id
== CODEC_ID_NONE
)
168 codec_id
= fmt
->video_codec
;
170 }else if(type
== CODEC_TYPE_AUDIO
)
171 return fmt
->audio_codec
;
173 return CODEC_ID_NONE
;
176 AVInputFormat
*av_find_input_format(const char *short_name
)
179 for(fmt
= first_iformat
; fmt
!= NULL
; fmt
= fmt
->next
) {
180 if (!strcmp(fmt
->name
, short_name
))
186 /* memory handling */
188 void av_destruct_packet(AVPacket
*pkt
)
191 pkt
->data
= NULL
; pkt
->size
= 0;
194 void av_init_packet(AVPacket
*pkt
)
196 pkt
->pts
= AV_NOPTS_VALUE
;
197 pkt
->dts
= AV_NOPTS_VALUE
;
201 pkt
->stream_index
= 0;
202 pkt
->destruct
= av_destruct_packet_nofree
;
205 int av_new_packet(AVPacket
*pkt
, int size
)
208 if((unsigned)size
> (unsigned)size
+ FF_INPUT_BUFFER_PADDING_SIZE
)
209 return AVERROR(ENOMEM
);
210 data
= av_malloc(size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
212 return AVERROR(ENOMEM
);
213 memset(data
+ size
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
218 pkt
->destruct
= av_destruct_packet
;
222 int av_get_packet(ByteIOContext
*s
, AVPacket
*pkt
, int size
)
224 int ret
= av_new_packet(pkt
, size
);
229 pkt
->pos
= url_ftell(s
);
231 ret
= get_buffer(s
, pkt
->data
, size
);
240 int av_dup_packet(AVPacket
*pkt
)
242 if (pkt
->destruct
!= av_destruct_packet
) {
244 /* We duplicate the packet and don't forget to add the padding again. */
245 if((unsigned)pkt
->size
> (unsigned)pkt
->size
+ FF_INPUT_BUFFER_PADDING_SIZE
)
246 return AVERROR(ENOMEM
);
247 data
= av_malloc(pkt
->size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
249 return AVERROR(ENOMEM
);
251 memcpy(data
, pkt
->data
, pkt
->size
);
252 memset(data
+ pkt
->size
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
254 pkt
->destruct
= av_destruct_packet
;
259 int av_filename_number_test(const char *filename
)
262 return filename
&& (av_get_frame_filename(buf
, sizeof(buf
), filename
, 1)>=0);
265 static AVInputFormat
*av_probe_input_format2(AVProbeData
*pd
, int is_opened
, int *score_max
)
267 AVInputFormat
*fmt1
, *fmt
;
271 for(fmt1
= first_iformat
; fmt1
!= NULL
; fmt1
= fmt1
->next
) {
272 if (!is_opened
== !(fmt1
->flags
& AVFMT_NOFILE
))
275 if (fmt1
->read_probe
) {
276 score
= fmt1
->read_probe(pd
);
277 } else if (fmt1
->extensions
) {
278 if (match_ext(pd
->filename
, fmt1
->extensions
)) {
282 if (score
> *score_max
) {
285 }else if (score
== *score_max
)
291 AVInputFormat
*av_probe_input_format(AVProbeData
*pd
, int is_opened
){
293 return av_probe_input_format2(pd
, is_opened
, &score
);
296 /************************************************************/
297 /* input media file */
300 * Open a media file from an IO stream. 'fmt' must be specified.
302 static const char* format_to_name(void* ptr
)
304 AVFormatContext
* fc
= (AVFormatContext
*) ptr
;
305 if(fc
->iformat
) return fc
->iformat
->name
;
306 else if(fc
->oformat
) return fc
->oformat
->name
;
310 #define OFFSET(x) offsetof(AVFormatContext,x)
311 #define DEFAULT 0 //should be NAN but it does not work as it is not a constant in glibc as required by ANSI/ISO C
312 //these names are too long to be readable
313 #define E AV_OPT_FLAG_ENCODING_PARAM
314 #define D AV_OPT_FLAG_DECODING_PARAM
316 static const AVOption options
[]={
317 {"probesize", NULL
, OFFSET(probesize
), FF_OPT_TYPE_INT
, 32000, 32, INT_MAX
, D
}, /* 32000 from mpegts.c: 1.0 second at 24Mbit/s */
318 {"muxrate", "set mux rate", OFFSET(mux_rate
), FF_OPT_TYPE_INT
, DEFAULT
, 0, INT_MAX
, E
},
319 {"packetsize", "set packet size", OFFSET(packet_size
), FF_OPT_TYPE_INT
, DEFAULT
, 0, INT_MAX
, E
},
320 {"fflags", NULL
, OFFSET(flags
), FF_OPT_TYPE_FLAGS
, DEFAULT
, INT_MIN
, INT_MAX
, D
|E
, "fflags"},
321 {"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST
, AVFMT_FLAG_IGNIDX
, INT_MIN
, INT_MAX
, D
, "fflags"},
322 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST
, AVFMT_FLAG_GENPTS
, INT_MIN
, INT_MAX
, D
, "fflags"},
323 {"track", " set the track number", OFFSET(track
), FF_OPT_TYPE_INT
, DEFAULT
, 0, INT_MAX
, E
},
324 {"year", "set the year", OFFSET(year
), FF_OPT_TYPE_INT
, DEFAULT
, INT_MIN
, INT_MAX
, E
},
325 {"analyzeduration", "how many microseconds are analyzed to estimate duration", OFFSET(max_analyze_duration
), FF_OPT_TYPE_INT
, 3*AV_TIME_BASE
, 0, INT_MAX
, D
},
326 {"cryptokey", "decryption key", OFFSET(key
), FF_OPT_TYPE_BINARY
, 0, 0, 0, D
},
327 {"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size
), FF_OPT_TYPE_INT
, 1<<20, 0, INT_MAX
, D
},
328 {"rtbufsize", "max memory used for buffering real-time frames", OFFSET(max_picture_buffer
), FF_OPT_TYPE_INT
, 3041280, 0, INT_MAX
, D
}, /* defaults to 1s of 15fps 352x288 YUYV422 video */
329 {"fdebug", "print specific debug info", OFFSET(debug
), FF_OPT_TYPE_FLAGS
, DEFAULT
, 0, INT_MAX
, E
|D
, "fdebug"},
330 {"ts", NULL
, 0, FF_OPT_TYPE_CONST
, FF_FDEBUG_TS
, INT_MIN
, INT_MAX
, E
|D
, "fdebug"},
338 static const AVClass av_format_context_class
= { "AVFormatContext", format_to_name
, options
};
340 static void avformat_get_context_defaults(AVFormatContext
*s
)
342 memset(s
, 0, sizeof(AVFormatContext
));
344 s
->av_class
= &av_format_context_class
;
346 av_opt_set_defaults(s
);
349 AVFormatContext
*av_alloc_format_context(void)
352 ic
= av_malloc(sizeof(AVFormatContext
));
354 avformat_get_context_defaults(ic
);
355 ic
->av_class
= &av_format_context_class
;
359 int av_open_input_stream(AVFormatContext
**ic_ptr
,
360 ByteIOContext
*pb
, const char *filename
,
361 AVInputFormat
*fmt
, AVFormatParameters
*ap
)
365 AVFormatParameters default_ap
;
369 memset(ap
, 0, sizeof(default_ap
));
372 if(!ap
->prealloced_context
)
373 ic
= av_alloc_format_context();
377 err
= AVERROR(ENOMEM
);
382 ic
->duration
= AV_NOPTS_VALUE
;
383 ic
->start_time
= AV_NOPTS_VALUE
;
384 av_strlcpy(ic
->filename
, filename
, sizeof(ic
->filename
));
386 /* allocate private data */
387 if (fmt
->priv_data_size
> 0) {
388 ic
->priv_data
= av_mallocz(fmt
->priv_data_size
);
389 if (!ic
->priv_data
) {
390 err
= AVERROR(ENOMEM
);
394 ic
->priv_data
= NULL
;
397 err
= ic
->iformat
->read_header(ic
, ap
);
401 if (pb
&& !ic
->data_offset
)
402 ic
->data_offset
= url_ftell(ic
->pb
);
409 av_freep(&ic
->priv_data
);
410 for(i
=0;i
<ic
->nb_streams
;i
++) {
411 AVStream
*st
= ic
->streams
[i
];
413 av_free(st
->priv_data
);
414 av_free(st
->codec
->extradata
);
424 /** size of probe buffer, for guessing file type from file contents */
425 #define PROBE_BUF_MIN 2048
426 #define PROBE_BUF_MAX (1<<20)
428 int av_open_input_file(AVFormatContext
**ic_ptr
, const char *filename
,
431 AVFormatParameters
*ap
)
434 AVProbeData probe_data
, *pd
= &probe_data
;
435 ByteIOContext
*pb
= NULL
;
439 pd
->filename
= filename
;
444 /* guess format if no file can be opened */
445 fmt
= av_probe_input_format(pd
, 0);
448 /* Do not open file if the format does not need it. XXX: specific
449 hack needed to handle RTSP/TCP */
450 if (!fmt
|| !(fmt
->flags
& AVFMT_NOFILE
)) {
451 /* if no file needed do not try to open one */
452 if ((err
=url_fopen(&pb
, filename
, URL_RDONLY
)) < 0) {
456 url_setbufsize(pb
, buf_size
);
459 for(probe_size
= PROBE_BUF_MIN
; probe_size
<=PROBE_BUF_MAX
&& !fmt
; probe_size
<<=1){
460 int score
= probe_size
< PROBE_BUF_MAX
? AVPROBE_SCORE_MAX
/4 : 0;
461 /* read probe data */
462 pd
->buf
= av_realloc(pd
->buf
, probe_size
+ AVPROBE_PADDING_SIZE
);
463 pd
->buf_size
= get_buffer(pb
, pd
->buf
, probe_size
);
464 memset(pd
->buf
+pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
465 if (url_fseek(pb
, 0, SEEK_SET
) < 0) {
467 if (url_fopen(&pb
, filename
, URL_RDONLY
) < 0) {
473 /* guess file format */
474 fmt
= av_probe_input_format2(pd
, 1, &score
);
479 /* if still no format found, error */
485 /* check filename in case an image number is expected */
486 if (fmt
->flags
& AVFMT_NEEDNUMBER
) {
487 if (!av_filename_number_test(filename
)) {
488 err
= AVERROR_NUMEXPECTED
;
492 err
= av_open_input_stream(ic_ptr
, pb
, filename
, fmt
, ap
);
505 /*******************************************************/
507 int av_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
512 ret
= s
->iformat
->read_packet(s
, pkt
);
515 st
= s
->streams
[pkt
->stream_index
];
517 switch(st
->codec
->codec_type
){
518 case CODEC_TYPE_VIDEO
:
519 if(s
->video_codec_id
) st
->codec
->codec_id
= s
->video_codec_id
;
521 case CODEC_TYPE_AUDIO
:
522 if(s
->audio_codec_id
) st
->codec
->codec_id
= s
->audio_codec_id
;
524 case CODEC_TYPE_SUBTITLE
:
525 if(s
->subtitle_codec_id
)st
->codec
->codec_id
= s
->subtitle_codec_id
;
532 /**********************************************************/
535 * Get the number of samples of an audio frame. Return -1 on error.
537 static int get_audio_frame_size(AVCodecContext
*enc
, int size
)
541 if(enc
->codec_id
== CODEC_ID_VORBIS
)
544 if (enc
->frame_size
<= 1) {
545 int bits_per_sample
= av_get_bits_per_sample(enc
->codec_id
);
547 if (bits_per_sample
) {
548 if (enc
->channels
== 0)
550 frame_size
= (size
<< 3) / (bits_per_sample
* enc
->channels
);
552 /* used for example by ADPCM codecs */
553 if (enc
->bit_rate
== 0)
555 frame_size
= (size
* 8 * enc
->sample_rate
) / enc
->bit_rate
;
558 frame_size
= enc
->frame_size
;
565 * Return the frame duration in seconds. Return 0 if not available.
567 static void compute_frame_duration(int *pnum
, int *pden
, AVStream
*st
,
568 AVCodecParserContext
*pc
, AVPacket
*pkt
)
574 switch(st
->codec
->codec_type
) {
575 case CODEC_TYPE_VIDEO
:
576 if(st
->time_base
.num
*1000LL > st
->time_base
.den
){
577 *pnum
= st
->time_base
.num
;
578 *pden
= st
->time_base
.den
;
579 }else if(st
->codec
->time_base
.num
*1000LL > st
->codec
->time_base
.den
){
580 *pnum
= st
->codec
->time_base
.num
;
581 *pden
= st
->codec
->time_base
.den
;
582 if (pc
&& pc
->repeat_pict
) {
584 *pnum
= (*pnum
) * (2 + pc
->repeat_pict
);
588 case CODEC_TYPE_AUDIO
:
589 frame_size
= get_audio_frame_size(st
->codec
, pkt
->size
);
593 *pden
= st
->codec
->sample_rate
;
600 static int is_intra_only(AVCodecContext
*enc
){
601 if(enc
->codec_type
== CODEC_TYPE_AUDIO
){
603 }else if(enc
->codec_type
== CODEC_TYPE_VIDEO
){
604 switch(enc
->codec_id
){
606 case CODEC_ID_MJPEGB
:
608 case CODEC_ID_RAWVIDEO
:
609 case CODEC_ID_DVVIDEO
:
610 case CODEC_ID_HUFFYUV
:
611 case CODEC_ID_FFVHUFF
:
622 static void update_initial_timestamps(AVFormatContext
*s
, int stream_index
,
623 int64_t dts
, int64_t pts
)
625 AVStream
*st
= s
->streams
[stream_index
];
626 AVPacketList
*pktl
= s
->packet_buffer
;
628 if(st
->first_dts
!= AV_NOPTS_VALUE
|| dts
== AV_NOPTS_VALUE
)
631 st
->first_dts
= dts
- st
->cur_dts
;
634 for(; pktl
; pktl
= pktl
->next
){
635 if(pktl
->pkt
.stream_index
!= stream_index
)
637 //FIXME think more about this check
638 if(pktl
->pkt
.pts
!= AV_NOPTS_VALUE
&& pktl
->pkt
.pts
== pktl
->pkt
.dts
)
639 pktl
->pkt
.pts
+= st
->first_dts
;
641 if(pktl
->pkt
.dts
!= AV_NOPTS_VALUE
)
642 pktl
->pkt
.dts
+= st
->first_dts
;
644 if(st
->start_time
== AV_NOPTS_VALUE
&& pktl
->pkt
.pts
!= AV_NOPTS_VALUE
)
645 st
->start_time
= pktl
->pkt
.pts
;
647 if (st
->start_time
== AV_NOPTS_VALUE
)
648 st
->start_time
= pts
;
651 static void update_initial_durations(AVFormatContext
*s
, AVStream
*st
, AVPacket
*pkt
)
653 AVPacketList
*pktl
= s
->packet_buffer
;
656 if(st
->first_dts
!= AV_NOPTS_VALUE
){
657 cur_dts
= st
->first_dts
;
658 for(; pktl
; pktl
= pktl
->next
){
659 if(pktl
->pkt
.stream_index
== pkt
->stream_index
){
660 if(pktl
->pkt
.pts
!= pktl
->pkt
.dts
|| pktl
->pkt
.dts
!= AV_NOPTS_VALUE
|| pktl
->pkt
.duration
)
662 cur_dts
-= pkt
->duration
;
665 pktl
= s
->packet_buffer
;
666 st
->first_dts
= cur_dts
;
667 }else if(st
->cur_dts
)
670 for(; pktl
; pktl
= pktl
->next
){
671 if(pktl
->pkt
.stream_index
!= pkt
->stream_index
)
673 if(pktl
->pkt
.pts
== pktl
->pkt
.dts
&& pktl
->pkt
.dts
== AV_NOPTS_VALUE
674 && !pktl
->pkt
.duration
){
675 pktl
->pkt
.dts
= cur_dts
;
676 if(!st
->codec
->has_b_frames
)
677 pktl
->pkt
.pts
= cur_dts
;
678 cur_dts
+= pkt
->duration
;
679 pktl
->pkt
.duration
= pkt
->duration
;
683 if(st
->first_dts
== AV_NOPTS_VALUE
)
684 st
->cur_dts
= cur_dts
;
687 static void compute_pkt_fields(AVFormatContext
*s
, AVStream
*st
,
688 AVCodecParserContext
*pc
, AVPacket
*pkt
)
690 int num
, den
, presentation_delayed
, delay
, i
;
693 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->dts
> pkt
->pts
&& st
->pts_wrap_bits
<63
694 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
695 pkt
->dts
-= 1LL<<st
->pts_wrap_bits
;
698 if (pkt
->duration
== 0) {
699 compute_frame_duration(&num
, &den
, st
, pc
, pkt
);
701 pkt
->duration
= av_rescale(1, num
* (int64_t)st
->time_base
.den
, den
* (int64_t)st
->time_base
.num
);
703 if(pkt
->duration
!= 0 && s
->packet_buffer
)
704 update_initial_durations(s
, st
, pkt
);
708 /* correct timestamps with byte offset if demuxers only have timestamps
709 on packet boundaries */
710 if(pc
&& st
->need_parsing
== AVSTREAM_PARSE_TIMESTAMPS
&& pkt
->size
){
711 /* this will estimate bitrate based on this frame's duration and size */
712 offset
= av_rescale(pc
->offset
, pkt
->duration
, pkt
->size
);
713 if(pkt
->pts
!= AV_NOPTS_VALUE
)
715 if(pkt
->dts
!= AV_NOPTS_VALUE
)
719 /* do we have a video B-frame ? */
720 delay
= st
->codec
->has_b_frames
;
721 presentation_delayed
= 0;
722 /* XXX: need has_b_frame, but cannot get it if the codec is
725 pc
&& pc
->pict_type
!= FF_B_TYPE
)
726 presentation_delayed
= 1;
727 /* This may be redundant, but it should not hurt. */
728 if(pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->pts
> pkt
->dts
)
729 presentation_delayed
= 1;
731 if(st
->cur_dts
== AV_NOPTS_VALUE
){
732 st
->cur_dts
= 0; //FIXME maybe set it to 0 during init
735 // 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);
736 /* interpolate PTS and DTS if they are not present */
737 if(delay
==0 || (delay
==1 && pc
)){
738 if (presentation_delayed
) {
739 /* DTS = decompression timestamp */
740 /* PTS = presentation timestamp */
741 if (pkt
->dts
== AV_NOPTS_VALUE
)
742 pkt
->dts
= st
->last_IP_pts
;
743 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
);
744 if (pkt
->dts
== AV_NOPTS_VALUE
)
745 pkt
->dts
= st
->cur_dts
;
747 /* this is tricky: the dts must be incremented by the duration
748 of the frame we are displaying, i.e. the last I- or P-frame */
749 if (st
->last_IP_duration
== 0)
750 st
->last_IP_duration
= pkt
->duration
;
751 st
->cur_dts
= pkt
->dts
+ st
->last_IP_duration
;
752 st
->last_IP_duration
= pkt
->duration
;
753 st
->last_IP_pts
= pkt
->pts
;
754 /* cannot compute PTS if not present (we can compute it only
755 by knowing the future */
756 } else if(pkt
->pts
!= AV_NOPTS_VALUE
|| pkt
->dts
!= AV_NOPTS_VALUE
|| pkt
->duration
){
757 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->duration
){
758 int64_t old_diff
= FFABS(st
->cur_dts
- pkt
->duration
- pkt
->pts
);
759 int64_t new_diff
= FFABS(st
->cur_dts
- pkt
->pts
);
760 if(old_diff
< new_diff
&& old_diff
< (pkt
->duration
>>3)){
761 pkt
->pts
+= pkt
->duration
;
762 // 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);
766 /* presentation is not delayed : PTS and DTS are the same */
767 if(pkt
->pts
== AV_NOPTS_VALUE
)
769 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->pts
, pkt
->pts
);
770 if(pkt
->pts
== AV_NOPTS_VALUE
)
771 pkt
->pts
= st
->cur_dts
;
773 st
->cur_dts
= pkt
->pts
+ pkt
->duration
;
777 if(pkt
->pts
!= AV_NOPTS_VALUE
){
778 st
->pts_buffer
[0]= pkt
->pts
;
779 for(i
=1; i
<delay
+1 && st
->pts_buffer
[i
] == AV_NOPTS_VALUE
; i
++)
780 st
->pts_buffer
[i
]= (i
-delay
-1) * pkt
->duration
;
781 for(i
=0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+1]; i
++)
782 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+1]);
783 if(pkt
->dts
== AV_NOPTS_VALUE
)
784 pkt
->dts
= st
->pts_buffer
[0];
786 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
); // this should happen on the first packet
788 if(pkt
->dts
> st
->cur_dts
)
789 st
->cur_dts
= pkt
->dts
;
792 // 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);
795 if(is_intra_only(st
->codec
))
796 pkt
->flags
|= PKT_FLAG_KEY
;
799 /* keyframe computation */
800 if (pc
->pict_type
== FF_I_TYPE
)
801 pkt
->flags
|= PKT_FLAG_KEY
;
805 void av_destruct_packet_nofree(AVPacket
*pkt
)
807 pkt
->data
= NULL
; pkt
->size
= 0;
810 static int av_read_frame_internal(AVFormatContext
*s
, AVPacket
*pkt
)
818 /* select current input stream component */
821 if (!st
->need_parsing
|| !st
->parser
) {
822 /* no parsing needed: we just output the packet as is */
823 /* raw data support */
825 compute_pkt_fields(s
, st
, NULL
, pkt
);
828 } else if (s
->cur_len
> 0 && st
->discard
< AVDISCARD_ALL
) {
829 len
= av_parser_parse(st
->parser
, st
->codec
, &pkt
->data
, &pkt
->size
,
830 s
->cur_ptr
, s
->cur_len
,
831 s
->cur_pkt
.pts
, s
->cur_pkt
.dts
);
832 s
->cur_pkt
.pts
= AV_NOPTS_VALUE
;
833 s
->cur_pkt
.dts
= AV_NOPTS_VALUE
;
834 /* increment read pointer */
838 /* return packet if any */
841 pkt
->pos
= s
->cur_pkt
.pos
; // Isn't quite accurate but close.
843 pkt
->stream_index
= st
->index
;
844 pkt
->pts
= st
->parser
->pts
;
845 pkt
->dts
= st
->parser
->dts
;
846 pkt
->destruct
= av_destruct_packet_nofree
;
847 compute_pkt_fields(s
, st
, st
->parser
, pkt
);
849 if((s
->iformat
->flags
& AVFMT_GENERIC_INDEX
) && pkt
->flags
& PKT_FLAG_KEY
){
850 ff_reduce_index(s
, st
->index
);
851 av_add_index_entry(st
, st
->parser
->frame_offset
, pkt
->dts
,
852 0, 0, AVINDEX_KEYFRAME
);
859 av_free_packet(&s
->cur_pkt
);
863 /* read next packet */
864 ret
= av_read_packet(s
, &s
->cur_pkt
);
866 if (ret
== AVERROR(EAGAIN
))
868 /* return the last frames, if any */
869 for(i
= 0; i
< s
->nb_streams
; i
++) {
871 if (st
->parser
&& st
->need_parsing
) {
872 av_parser_parse(st
->parser
, st
->codec
,
873 &pkt
->data
, &pkt
->size
,
875 AV_NOPTS_VALUE
, AV_NOPTS_VALUE
);
880 /* no more packets: really terminate parsing */
884 if(s
->cur_pkt
.pts
!= AV_NOPTS_VALUE
&&
885 s
->cur_pkt
.dts
!= AV_NOPTS_VALUE
&&
886 s
->cur_pkt
.pts
< s
->cur_pkt
.dts
){
887 av_log(s
, AV_LOG_WARNING
, "Invalid timestamps stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d\n",
888 s
->cur_pkt
.stream_index
,
892 // av_free_packet(&s->cur_pkt);
896 st
= s
->streams
[s
->cur_pkt
.stream_index
];
897 if(s
->debug
& FF_FDEBUG_TS
)
898 av_log(s
, AV_LOG_DEBUG
, "av_read_packet stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d, flags=%d\n",
899 s
->cur_pkt
.stream_index
,
906 s
->cur_ptr
= s
->cur_pkt
.data
;
907 s
->cur_len
= s
->cur_pkt
.size
;
908 if (st
->need_parsing
&& !st
->parser
) {
909 st
->parser
= av_parser_init(st
->codec
->codec_id
);
911 /* no parser available: just output the raw packets */
912 st
->need_parsing
= AVSTREAM_PARSE_NONE
;
913 }else if(st
->need_parsing
== AVSTREAM_PARSE_HEADERS
){
914 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
916 if(st
->parser
&& (s
->iformat
->flags
& AVFMT_GENERIC_INDEX
)){
917 st
->parser
->next_frame_offset
=
918 st
->parser
->cur_offset
= s
->cur_pkt
.pos
;
923 if(s
->debug
& FF_FDEBUG_TS
)
924 av_log(s
, AV_LOG_DEBUG
, "av_read_frame_internal stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d, flags=%d\n",
934 static AVPacket
*add_to_pktbuf(AVFormatContext
*s
, AVPacket
*pkt
){
935 AVPacketList
*pktl
= s
->packet_buffer
;
936 AVPacketList
**plast_pktl
= &s
->packet_buffer
;
938 while(*plast_pktl
) plast_pktl
= &(*plast_pktl
)->next
; //FIXME maybe maintain pointer to the last?
940 pktl
= av_mallocz(sizeof(AVPacketList
));
944 /* add the packet in the buffered packet list */
950 int av_read_frame(AVFormatContext
*s
, AVPacket
*pkt
)
954 const int genpts
= s
->flags
& AVFMT_FLAG_GENPTS
;
957 pktl
= s
->packet_buffer
;
959 AVPacket
*next_pkt
= &pktl
->pkt
;
961 if(genpts
&& next_pkt
->dts
!= AV_NOPTS_VALUE
){
962 while(pktl
&& next_pkt
->pts
== AV_NOPTS_VALUE
){
963 if( pktl
->pkt
.stream_index
== next_pkt
->stream_index
964 && next_pkt
->dts
< pktl
->pkt
.dts
965 && pktl
->pkt
.pts
!= pktl
->pkt
.dts
//not b frame
966 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
967 next_pkt
->pts
= pktl
->pkt
.dts
;
971 pktl
= s
->packet_buffer
;
974 if( next_pkt
->pts
!= AV_NOPTS_VALUE
975 || next_pkt
->dts
== AV_NOPTS_VALUE
977 /* read packet from packet buffer, if there is data */
979 s
->packet_buffer
= pktl
->next
;
985 int ret
= av_read_frame_internal(s
, pkt
);
987 if(pktl
&& ret
!= AVERROR(EAGAIN
)){
994 if(av_dup_packet(add_to_pktbuf(s
, pkt
)) < 0)
995 return AVERROR(ENOMEM
);
997 assert(!s
->packet_buffer
);
998 return av_read_frame_internal(s
, pkt
);
1003 /* XXX: suppress the packet queue */
1004 static void flush_packet_queue(AVFormatContext
*s
)
1009 pktl
= s
->packet_buffer
;
1012 s
->packet_buffer
= pktl
->next
;
1013 av_free_packet(&pktl
->pkt
);
1018 /*******************************************************/
1021 int av_find_default_stream_index(AVFormatContext
*s
)
1023 int first_audio_index
= -1;
1027 if (s
->nb_streams
<= 0)
1029 for(i
= 0; i
< s
->nb_streams
; i
++) {
1031 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
1034 if (first_audio_index
< 0 && st
->codec
->codec_type
== CODEC_TYPE_AUDIO
)
1035 first_audio_index
= i
;
1037 return first_audio_index
>= 0 ? first_audio_index
: 0;
1041 * Flush the frame reader.
1043 static void av_read_frame_flush(AVFormatContext
*s
)
1048 flush_packet_queue(s
);
1050 /* free previous packet */
1052 if (s
->cur_st
->parser
)
1053 av_free_packet(&s
->cur_pkt
);
1060 /* for each stream, reset read state */
1061 for(i
= 0; i
< s
->nb_streams
; i
++) {
1065 av_parser_close(st
->parser
);
1068 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1069 st
->cur_dts
= AV_NOPTS_VALUE
; /* we set the current DTS to an unspecified origin */
1073 void av_update_cur_dts(AVFormatContext
*s
, AVStream
*ref_st
, int64_t timestamp
){
1076 for(i
= 0; i
< s
->nb_streams
; i
++) {
1077 AVStream
*st
= s
->streams
[i
];
1079 st
->cur_dts
= av_rescale(timestamp
,
1080 st
->time_base
.den
* (int64_t)ref_st
->time_base
.num
,
1081 st
->time_base
.num
* (int64_t)ref_st
->time_base
.den
);
1085 void ff_reduce_index(AVFormatContext
*s
, int stream_index
)
1087 AVStream
*st
= s
->streams
[stream_index
];
1088 unsigned int max_entries
= s
->max_index_size
/ sizeof(AVIndexEntry
);
1090 if((unsigned)st
->nb_index_entries
>= max_entries
){
1092 for(i
=0; 2*i
<st
->nb_index_entries
; i
++)
1093 st
->index_entries
[i
]= st
->index_entries
[2*i
];
1094 st
->nb_index_entries
= i
;
1098 int av_add_index_entry(AVStream
*st
,
1099 int64_t pos
, int64_t timestamp
, int size
, int distance
, int flags
)
1101 AVIndexEntry
*entries
, *ie
;
1104 if((unsigned)st
->nb_index_entries
+ 1 >= UINT_MAX
/ sizeof(AVIndexEntry
))
1107 entries
= av_fast_realloc(st
->index_entries
,
1108 &st
->index_entries_allocated_size
,
1109 (st
->nb_index_entries
+ 1) *
1110 sizeof(AVIndexEntry
));
1114 st
->index_entries
= entries
;
1116 index
= av_index_search_timestamp(st
, timestamp
, AVSEEK_FLAG_ANY
);
1119 index
= st
->nb_index_entries
++;
1120 ie
= &entries
[index
];
1121 assert(index
==0 || ie
[-1].timestamp
< timestamp
);
1123 ie
= &entries
[index
];
1124 if(ie
->timestamp
!= timestamp
){
1125 if(ie
->timestamp
<= timestamp
)
1127 memmove(entries
+ index
+ 1, entries
+ index
, sizeof(AVIndexEntry
)*(st
->nb_index_entries
- index
));
1128 st
->nb_index_entries
++;
1129 }else if(ie
->pos
== pos
&& distance
< ie
->min_distance
) //do not reduce the distance
1130 distance
= ie
->min_distance
;
1134 ie
->timestamp
= timestamp
;
1135 ie
->min_distance
= distance
;
1142 int av_index_search_timestamp(AVStream
*st
, int64_t wanted_timestamp
,
1145 AVIndexEntry
*entries
= st
->index_entries
;
1146 int nb_entries
= st
->nb_index_entries
;
1155 timestamp
= entries
[m
].timestamp
;
1156 if(timestamp
>= wanted_timestamp
)
1158 if(timestamp
<= wanted_timestamp
)
1161 m
= (flags
& AVSEEK_FLAG_BACKWARD
) ? a
: b
;
1163 if(!(flags
& AVSEEK_FLAG_ANY
)){
1164 while(m
>=0 && m
<nb_entries
&& !(entries
[m
].flags
& AVINDEX_KEYFRAME
)){
1165 m
+= (flags
& AVSEEK_FLAG_BACKWARD
) ? -1 : 1;
1176 int av_seek_frame_binary(AVFormatContext
*s
, int stream_index
, int64_t target_ts
, int flags
){
1177 AVInputFormat
*avif
= s
->iformat
;
1178 int64_t pos_min
, pos_max
, pos
, pos_limit
;
1179 int64_t ts_min
, ts_max
, ts
;
1183 if (stream_index
< 0)
1187 av_log(s
, AV_LOG_DEBUG
, "read_seek: %d %"PRId64
"\n", stream_index
, target_ts
);
1191 ts_min
= AV_NOPTS_VALUE
;
1192 pos_limit
= -1; //gcc falsely says it may be uninitialized
1194 st
= s
->streams
[stream_index
];
1195 if(st
->index_entries
){
1198 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()
1199 index
= FFMAX(index
, 0);
1200 e
= &st
->index_entries
[index
];
1202 if(e
->timestamp
<= target_ts
|| e
->pos
== e
->min_distance
){
1204 ts_min
= e
->timestamp
;
1206 av_log(s
, AV_LOG_DEBUG
, "using cached pos_min=0x%"PRIx64
" dts_min=%"PRId64
"\n",
1213 index
= av_index_search_timestamp(st
, target_ts
, flags
& ~AVSEEK_FLAG_BACKWARD
);
1214 assert(index
< st
->nb_index_entries
);
1216 e
= &st
->index_entries
[index
];
1217 assert(e
->timestamp
>= target_ts
);
1219 ts_max
= e
->timestamp
;
1220 pos_limit
= pos_max
- e
->min_distance
;
1222 av_log(s
, AV_LOG_DEBUG
, "using cached pos_max=0x%"PRIx64
" pos_limit=0x%"PRIx64
" dts_max=%"PRId64
"\n",
1223 pos_max
,pos_limit
, ts_max
);
1228 pos
= av_gen_search(s
, stream_index
, target_ts
, pos_min
, pos_max
, pos_limit
, ts_min
, ts_max
, flags
, &ts
, avif
->read_timestamp
);
1233 url_fseek(s
->pb
, pos
, SEEK_SET
);
1235 av_update_cur_dts(s
, st
, ts
);
1240 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 )){
1242 int64_t start_pos
, filesize
;
1246 av_log(s
, AV_LOG_DEBUG
, "gen_seek: %d %"PRId64
"\n", stream_index
, target_ts
);
1249 if(ts_min
== AV_NOPTS_VALUE
){
1250 pos_min
= s
->data_offset
;
1251 ts_min
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1252 if (ts_min
== AV_NOPTS_VALUE
)
1256 if(ts_max
== AV_NOPTS_VALUE
){
1258 filesize
= url_fsize(s
->pb
);
1259 pos_max
= filesize
- 1;
1262 ts_max
= read_timestamp(s
, stream_index
, &pos_max
, pos_max
+ step
);
1264 }while(ts_max
== AV_NOPTS_VALUE
&& pos_max
>= step
);
1265 if (ts_max
== AV_NOPTS_VALUE
)
1269 int64_t tmp_pos
= pos_max
+ 1;
1270 int64_t tmp_ts
= read_timestamp(s
, stream_index
, &tmp_pos
, INT64_MAX
);
1271 if(tmp_ts
== AV_NOPTS_VALUE
)
1275 if(tmp_pos
>= filesize
)
1281 if(ts_min
> ts_max
){
1283 }else if(ts_min
== ts_max
){
1288 while (pos_min
< pos_limit
) {
1290 av_log(s
, AV_LOG_DEBUG
, "pos_min=0x%"PRIx64
" pos_max=0x%"PRIx64
" dts_min=%"PRId64
" dts_max=%"PRId64
"\n",
1294 assert(pos_limit
<= pos_max
);
1297 int64_t approximate_keyframe_distance
= pos_max
- pos_limit
;
1298 // interpolate position (better than dichotomy)
1299 pos
= av_rescale(target_ts
- ts_min
, pos_max
- pos_min
, ts_max
- ts_min
)
1300 + pos_min
- approximate_keyframe_distance
;
1301 }else if(no_change
==1){
1302 // bisection, if interpolation failed to change min or max pos last time
1303 pos
= (pos_min
+ pos_limit
)>>1;
1305 /* linear search if bisection failed, can only happen if there
1306 are very few or no keyframes between min/max */
1311 else if(pos
> pos_limit
)
1315 ts
= read_timestamp(s
, stream_index
, &pos
, INT64_MAX
); //may pass pos_limit instead of -1
1321 av_log(s
, AV_LOG_DEBUG
, "%"PRId64
" %"PRId64
" %"PRId64
" / %"PRId64
" %"PRId64
" %"PRId64
" target:%"PRId64
" limit:%"PRId64
" start:%"PRId64
" noc:%d\n", pos_min
, pos
, pos_max
, ts_min
, ts
, ts_max
, target_ts
, pos_limit
, start_pos
, no_change
);
1323 if(ts
== AV_NOPTS_VALUE
){
1324 av_log(s
, AV_LOG_ERROR
, "read_timestamp() failed in the middle\n");
1327 assert(ts
!= AV_NOPTS_VALUE
);
1328 if (target_ts
<= ts
) {
1329 pos_limit
= start_pos
- 1;
1333 if (target_ts
>= ts
) {
1339 pos
= (flags
& AVSEEK_FLAG_BACKWARD
) ? pos_min
: pos_max
;
1340 ts
= (flags
& AVSEEK_FLAG_BACKWARD
) ? ts_min
: ts_max
;
1343 ts_min
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1345 ts_max
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1346 av_log(s
, AV_LOG_DEBUG
, "pos=0x%"PRIx64
" %"PRId64
"<=%"PRId64
"<=%"PRId64
"\n",
1347 pos
, ts_min
, target_ts
, ts_max
);
1353 static int av_seek_frame_byte(AVFormatContext
*s
, int stream_index
, int64_t pos
, int flags
){
1354 int64_t pos_min
, pos_max
;
1358 if (stream_index
< 0)
1361 st
= s
->streams
[stream_index
];
1364 pos_min
= s
->data_offset
;
1365 pos_max
= url_fsize(s
->pb
) - 1;
1367 if (pos
< pos_min
) pos
= pos_min
;
1368 else if(pos
> pos_max
) pos
= pos_max
;
1370 url_fseek(s
->pb
, pos
, SEEK_SET
);
1373 av_update_cur_dts(s
, st
, ts
);
1378 static int av_seek_frame_generic(AVFormatContext
*s
,
1379 int stream_index
, int64_t timestamp
, int flags
)
1385 st
= s
->streams
[stream_index
];
1387 index
= av_index_search_timestamp(st
, timestamp
, flags
);
1389 if(index
< 0 || index
==st
->nb_index_entries
-1){
1393 if(st
->nb_index_entries
){
1394 assert(st
->index_entries
);
1395 ie
= &st
->index_entries
[st
->nb_index_entries
-1];
1396 url_fseek(s
->pb
, ie
->pos
, SEEK_SET
);
1397 av_update_cur_dts(s
, st
, ie
->timestamp
);
1399 url_fseek(s
->pb
, 0, SEEK_SET
);
1402 int ret
= av_read_frame(s
, &pkt
);
1405 av_free_packet(&pkt
);
1406 if(stream_index
== pkt
.stream_index
){
1407 if((pkt
.flags
& PKT_FLAG_KEY
) && pkt
.dts
> timestamp
)
1411 index
= av_index_search_timestamp(st
, timestamp
, flags
);
1416 av_read_frame_flush(s
);
1417 if (s
->iformat
->read_seek
){
1418 if(s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
) >= 0)
1421 ie
= &st
->index_entries
[index
];
1422 url_fseek(s
->pb
, ie
->pos
, SEEK_SET
);
1424 av_update_cur_dts(s
, st
, ie
->timestamp
);
1429 int av_seek_frame(AVFormatContext
*s
, int stream_index
, int64_t timestamp
, int flags
)
1434 av_read_frame_flush(s
);
1436 if(flags
& AVSEEK_FLAG_BYTE
)
1437 return av_seek_frame_byte(s
, stream_index
, timestamp
, flags
);
1439 if(stream_index
< 0){
1440 stream_index
= av_find_default_stream_index(s
);
1441 if(stream_index
< 0)
1444 st
= s
->streams
[stream_index
];
1445 /* timestamp for default must be expressed in AV_TIME_BASE units */
1446 timestamp
= av_rescale(timestamp
, st
->time_base
.den
, AV_TIME_BASE
* (int64_t)st
->time_base
.num
);
1448 st
= s
->streams
[stream_index
];
1450 /* first, we try the format specific seek */
1451 if (s
->iformat
->read_seek
)
1452 ret
= s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
);
1459 if(s
->iformat
->read_timestamp
)
1460 return av_seek_frame_binary(s
, stream_index
, timestamp
, flags
);
1462 return av_seek_frame_generic(s
, stream_index
, timestamp
, flags
);
1465 /*******************************************************/
1468 * Returns TRUE if the stream has accurate duration in any stream.
1470 * @return TRUE if the stream has accurate duration for at least one component.
1472 static int av_has_duration(AVFormatContext
*ic
)
1477 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1478 st
= ic
->streams
[i
];
1479 if (st
->duration
!= AV_NOPTS_VALUE
)
1486 * Estimate the stream timings from the one of each components.
1488 * Also computes the global bitrate if possible.
1490 static void av_update_stream_timings(AVFormatContext
*ic
)
1492 int64_t start_time
, start_time1
, end_time
, end_time1
;
1493 int64_t duration
, duration1
;
1497 start_time
= INT64_MAX
;
1498 end_time
= INT64_MIN
;
1499 duration
= INT64_MIN
;
1500 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1501 st
= ic
->streams
[i
];
1502 if (st
->start_time
!= AV_NOPTS_VALUE
&& st
->time_base
.den
) {
1503 start_time1
= av_rescale_q(st
->start_time
, st
->time_base
, AV_TIME_BASE_Q
);
1504 if (start_time1
< start_time
)
1505 start_time
= start_time1
;
1506 if (st
->duration
!= AV_NOPTS_VALUE
) {
1507 end_time1
= start_time1
1508 + av_rescale_q(st
->duration
, st
->time_base
, AV_TIME_BASE_Q
);
1509 if (end_time1
> end_time
)
1510 end_time
= end_time1
;
1513 if (st
->duration
!= AV_NOPTS_VALUE
) {
1514 duration1
= av_rescale_q(st
->duration
, st
->time_base
, AV_TIME_BASE_Q
);
1515 if (duration1
> duration
)
1516 duration
= duration1
;
1519 if (start_time
!= INT64_MAX
) {
1520 ic
->start_time
= start_time
;
1521 if (end_time
!= INT64_MIN
) {
1522 if (end_time
- start_time
> duration
)
1523 duration
= end_time
- start_time
;
1526 if (duration
!= INT64_MIN
) {
1527 ic
->duration
= duration
;
1528 if (ic
->file_size
> 0) {
1529 /* compute the bitrate */
1530 ic
->bit_rate
= (double)ic
->file_size
* 8.0 * AV_TIME_BASE
/
1531 (double)ic
->duration
;
1536 static void fill_all_stream_timings(AVFormatContext
*ic
)
1541 av_update_stream_timings(ic
);
1542 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1543 st
= ic
->streams
[i
];
1544 if (st
->start_time
== AV_NOPTS_VALUE
) {
1545 if(ic
->start_time
!= AV_NOPTS_VALUE
)
1546 st
->start_time
= av_rescale_q(ic
->start_time
, AV_TIME_BASE_Q
, st
->time_base
);
1547 if(ic
->duration
!= AV_NOPTS_VALUE
)
1548 st
->duration
= av_rescale_q(ic
->duration
, AV_TIME_BASE_Q
, st
->time_base
);
1553 static void av_estimate_timings_from_bit_rate(AVFormatContext
*ic
)
1555 int64_t filesize
, duration
;
1559 /* if bit_rate is already set, we believe it */
1560 if (ic
->bit_rate
== 0) {
1562 for(i
=0;i
<ic
->nb_streams
;i
++) {
1563 st
= ic
->streams
[i
];
1564 bit_rate
+= st
->codec
->bit_rate
;
1566 ic
->bit_rate
= bit_rate
;
1569 /* if duration is already set, we believe it */
1570 if (ic
->duration
== AV_NOPTS_VALUE
&&
1571 ic
->bit_rate
!= 0 &&
1572 ic
->file_size
!= 0) {
1573 filesize
= ic
->file_size
;
1575 for(i
= 0; i
< ic
->nb_streams
; i
++) {
1576 st
= ic
->streams
[i
];
1577 duration
= av_rescale(8*filesize
, st
->time_base
.den
, ic
->bit_rate
*(int64_t)st
->time_base
.num
);
1578 if (st
->duration
== AV_NOPTS_VALUE
)
1579 st
->duration
= duration
;
1585 #define DURATION_MAX_READ_SIZE 250000
1587 /* only usable for MPEG-PS streams */
1588 static void av_estimate_timings_from_pts(AVFormatContext
*ic
, offset_t old_offset
)
1590 AVPacket pkt1
, *pkt
= &pkt1
;
1592 int read_size
, i
, ret
;
1594 int64_t filesize
, offset
, duration
;
1596 /* free previous packet */
1597 if (ic
->cur_st
&& ic
->cur_st
->parser
)
1598 av_free_packet(&ic
->cur_pkt
);
1601 /* flush packet queue */
1602 flush_packet_queue(ic
);
1604 for(i
=0;i
<ic
->nb_streams
;i
++) {
1605 st
= ic
->streams
[i
];
1607 av_parser_close(st
->parser
);
1612 /* we read the first packets to get the first PTS (not fully
1613 accurate, but it is enough now) */
1614 url_fseek(ic
->pb
, 0, SEEK_SET
);
1617 if (read_size
>= DURATION_MAX_READ_SIZE
)
1619 /* if all info is available, we can stop */
1620 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1621 st
= ic
->streams
[i
];
1622 if (st
->start_time
== AV_NOPTS_VALUE
)
1625 if (i
== ic
->nb_streams
)
1628 ret
= av_read_packet(ic
, pkt
);
1631 read_size
+= pkt
->size
;
1632 st
= ic
->streams
[pkt
->stream_index
];
1633 if (pkt
->pts
!= AV_NOPTS_VALUE
) {
1634 if (st
->start_time
== AV_NOPTS_VALUE
)
1635 st
->start_time
= pkt
->pts
;
1637 av_free_packet(pkt
);
1640 /* estimate the end time (duration) */
1641 /* XXX: may need to support wrapping */
1642 filesize
= ic
->file_size
;
1643 offset
= filesize
- DURATION_MAX_READ_SIZE
;
1647 url_fseek(ic
->pb
, offset
, SEEK_SET
);
1650 if (read_size
>= DURATION_MAX_READ_SIZE
)
1653 ret
= av_read_packet(ic
, pkt
);
1656 read_size
+= pkt
->size
;
1657 st
= ic
->streams
[pkt
->stream_index
];
1658 if (pkt
->pts
!= AV_NOPTS_VALUE
&&
1659 st
->start_time
!= AV_NOPTS_VALUE
) {
1660 end_time
= pkt
->pts
;
1661 duration
= end_time
- st
->start_time
;
1663 if (st
->duration
== AV_NOPTS_VALUE
||
1664 st
->duration
< duration
)
1665 st
->duration
= duration
;
1668 av_free_packet(pkt
);
1671 fill_all_stream_timings(ic
);
1673 url_fseek(ic
->pb
, old_offset
, SEEK_SET
);
1674 for(i
=0; i
<ic
->nb_streams
; i
++){
1676 st
->cur_dts
= st
->first_dts
;
1677 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1681 static void av_estimate_timings(AVFormatContext
*ic
, offset_t old_offset
)
1685 /* get the file size, if possible */
1686 if (ic
->iformat
->flags
& AVFMT_NOFILE
) {
1689 file_size
= url_fsize(ic
->pb
);
1693 ic
->file_size
= file_size
;
1695 if ((!strcmp(ic
->iformat
->name
, "mpeg") ||
1696 !strcmp(ic
->iformat
->name
, "mpegts")) &&
1697 file_size
&& !url_is_streamed(ic
->pb
)) {
1698 /* get accurate estimate from the PTSes */
1699 av_estimate_timings_from_pts(ic
, old_offset
);
1700 } else if (av_has_duration(ic
)) {
1701 /* at least one component has timings - we use them for all
1703 fill_all_stream_timings(ic
);
1705 /* less precise: use bitrate info */
1706 av_estimate_timings_from_bit_rate(ic
);
1708 av_update_stream_timings(ic
);
1714 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1715 st
= ic
->streams
[i
];
1716 printf("%d: start_time: %0.3f duration: %0.3f\n",
1717 i
, (double)st
->start_time
/ AV_TIME_BASE
,
1718 (double)st
->duration
/ AV_TIME_BASE
);
1720 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1721 (double)ic
->start_time
/ AV_TIME_BASE
,
1722 (double)ic
->duration
/ AV_TIME_BASE
,
1723 ic
->bit_rate
/ 1000);
1728 static int has_codec_parameters(AVCodecContext
*enc
)
1731 switch(enc
->codec_type
) {
1732 case CODEC_TYPE_AUDIO
:
1733 val
= enc
->sample_rate
&& enc
->channels
;
1734 if(!enc
->frame_size
&&
1735 (enc
->codec_id
== CODEC_ID_VORBIS
||
1736 enc
->codec_id
== CODEC_ID_AAC
))
1739 case CODEC_TYPE_VIDEO
:
1740 val
= enc
->width
&& enc
->pix_fmt
!= PIX_FMT_NONE
;
1746 return enc
->codec_id
!= CODEC_ID_NONE
&& val
!= 0;
1749 static int try_decode_frame(AVStream
*st
, const uint8_t *data
, int size
)
1753 int got_picture
, data_size
, ret
=0;
1756 if(!st
->codec
->codec
){
1757 codec
= avcodec_find_decoder(st
->codec
->codec_id
);
1760 ret
= avcodec_open(st
->codec
, codec
);
1765 if(!has_codec_parameters(st
->codec
)){
1766 switch(st
->codec
->codec_type
) {
1767 case CODEC_TYPE_VIDEO
:
1768 ret
= avcodec_decode_video(st
->codec
, &picture
,
1769 &got_picture
, data
, size
);
1771 case CODEC_TYPE_AUDIO
:
1772 data_size
= FFMAX(size
, AVCODEC_MAX_AUDIO_FRAME_SIZE
);
1773 samples
= av_malloc(data_size
);
1776 ret
= avcodec_decode_audio2(st
->codec
, samples
,
1777 &data_size
, data
, size
);
1788 static int set_codec_from_probe_data(AVStream
*st
, AVProbeData
*pd
, int score
)
1791 fmt
= av_probe_input_format2(pd
, 1, &score
);
1794 if (strncmp(fmt
->name
, "mp3", 3) == 0)
1795 st
->codec
->codec_id
= CODEC_ID_MP3
;
1796 else if (strncmp(fmt
->name
, "ac3", 3) == 0)
1797 st
->codec
->codec_id
= CODEC_ID_AC3
;
1802 unsigned int codec_get_tag(const AVCodecTag
*tags
, int id
)
1804 while (tags
->id
!= CODEC_ID_NONE
) {
1812 enum CodecID
codec_get_id(const AVCodecTag
*tags
, unsigned int tag
)
1815 for(i
=0; tags
[i
].id
!= CODEC_ID_NONE
;i
++) {
1816 if(tag
== tags
[i
].tag
)
1819 for(i
=0; tags
[i
].id
!= CODEC_ID_NONE
; i
++) {
1820 if( toupper((tag
>> 0)&0xFF) == toupper((tags
[i
].tag
>> 0)&0xFF)
1821 && toupper((tag
>> 8)&0xFF) == toupper((tags
[i
].tag
>> 8)&0xFF)
1822 && toupper((tag
>>16)&0xFF) == toupper((tags
[i
].tag
>>16)&0xFF)
1823 && toupper((tag
>>24)&0xFF) == toupper((tags
[i
].tag
>>24)&0xFF))
1826 return CODEC_ID_NONE
;
1829 unsigned int av_codec_get_tag(const AVCodecTag
*tags
[4], enum CodecID id
)
1832 for(i
=0; tags
&& tags
[i
]; i
++){
1833 int tag
= codec_get_tag(tags
[i
], id
);
1839 enum CodecID
av_codec_get_id(const AVCodecTag
*tags
[4], unsigned int tag
)
1842 for(i
=0; tags
&& tags
[i
]; i
++){
1843 enum CodecID id
= codec_get_id(tags
[i
], tag
);
1844 if(id
!=CODEC_ID_NONE
) return id
;
1846 return CODEC_ID_NONE
;
1849 static void compute_chapters_end(AVFormatContext
*s
)
1853 for (i
=0; i
+1<s
->nb_chapters
; i
++)
1854 if (s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
1855 assert(s
->chapters
[i
]->start
<= s
->chapters
[i
+1]->start
);
1856 assert(!av_cmp_q(s
->chapters
[i
]->time_base
, s
->chapters
[i
+1]->time_base
));
1857 s
->chapters
[i
]->end
= s
->chapters
[i
+1]->start
;
1860 if (s
->nb_chapters
&& s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
1861 assert(s
->start_time
!= AV_NOPTS_VALUE
);
1862 assert(s
->duration
> 0);
1863 s
->chapters
[i
]->end
= av_rescale_q(s
->start_time
+ s
->duration
,
1865 s
->chapters
[i
]->time_base
);
1869 /* absolute maximum size we read until we abort */
1870 #define MAX_READ_SIZE 5000000
1872 #define MAX_STD_TIMEBASES (60*12+5)
1873 static int get_std_framerate(int i
){
1874 if(i
<60*12) return i
*1001;
1875 else return ((int[]){24,30,60,12,15})[i
-60*12]*1000*12;
1879 * Is the time base unreliable.
1880 * This is a heuristic to balance between quick acceptance of the values in
1881 * the headers vs. some extra checks.
1882 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
1883 * MPEG-2 commonly misuses field repeat flags to store different framerates.
1884 * And there are "variable" fps files this needs to detect as well.
1886 static int tb_unreliable(AVCodecContext
*c
){
1887 if( c
->time_base
.den
>= 101L*c
->time_base
.num
1888 || c
->time_base
.den
< 5L*c
->time_base
.num
1889 /* || c->codec_tag == ff_get_fourcc("DIVX")
1890 || c->codec_tag == ff_get_fourcc("XVID")*/
1891 || c
->codec_id
== CODEC_ID_MPEG2VIDEO
)
1896 int av_find_stream_info(AVFormatContext
*ic
)
1898 int i
, count
, ret
, read_size
, j
;
1900 AVPacket pkt1
, *pkt
;
1901 int64_t last_dts
[MAX_STREAMS
];
1902 int duration_count
[MAX_STREAMS
]={0};
1903 double (*duration_error
)[MAX_STD_TIMEBASES
];
1904 offset_t old_offset
= url_ftell(ic
->pb
);
1905 int64_t codec_info_duration
[MAX_STREAMS
]={0};
1906 int codec_info_nb_frames
[MAX_STREAMS
]={0};
1907 AVProbeData probe_data
[MAX_STREAMS
];
1908 int codec_identified
[MAX_STREAMS
]={0};
1910 duration_error
= av_mallocz(MAX_STREAMS
* sizeof(*duration_error
));
1911 if (!duration_error
) return AVERROR(ENOMEM
);
1913 for(i
=0;i
<ic
->nb_streams
;i
++) {
1914 st
= ic
->streams
[i
];
1915 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
){
1916 /* if(!st->time_base.num)
1918 if(!st
->codec
->time_base
.num
)
1919 st
->codec
->time_base
= st
->time_base
;
1921 //only for the split stuff
1923 st
->parser
= av_parser_init(st
->codec
->codec_id
);
1924 if(st
->need_parsing
== AVSTREAM_PARSE_HEADERS
&& st
->parser
){
1925 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
1930 for(i
=0;i
<MAX_STREAMS
;i
++){
1931 last_dts
[i
]= AV_NOPTS_VALUE
;
1934 memset(probe_data
, 0, sizeof(probe_data
));
1938 /* check if one codec still needs to be handled */
1939 for(i
=0;i
<ic
->nb_streams
;i
++) {
1940 st
= ic
->streams
[i
];
1941 if (!has_codec_parameters(st
->codec
))
1943 /* variable fps and no guess at the real fps */
1944 if( tb_unreliable(st
->codec
)
1945 && duration_count
[i
]<20 && st
->codec
->codec_type
== CODEC_TYPE_VIDEO
)
1947 if(st
->parser
&& st
->parser
->parser
->split
&& !st
->codec
->extradata
)
1949 if(st
->first_dts
== AV_NOPTS_VALUE
)
1952 if (i
== ic
->nb_streams
) {
1953 /* NOTE: if the format has no header, then we need to read
1954 some packets to get most of the streams, so we cannot
1956 if (!(ic
->ctx_flags
& AVFMTCTX_NOHEADER
)) {
1957 /* if we found the info for all the codecs, we can stop */
1962 /* we did not get all the codec info, but we read too much data */
1963 if (read_size
>= MAX_READ_SIZE
) {
1968 /* NOTE: a new stream can be added there if no header in file
1969 (AVFMTCTX_NOHEADER) */
1970 ret
= av_read_frame_internal(ic
, &pkt1
);
1973 ret
= -1; /* we could not have all the codec parameters before EOF */
1974 for(i
=0;i
<ic
->nb_streams
;i
++) {
1975 st
= ic
->streams
[i
];
1976 if (!has_codec_parameters(st
->codec
)){
1978 avcodec_string(buf
, sizeof(buf
), st
->codec
, 0);
1979 av_log(ic
, AV_LOG_INFO
, "Could not find codec parameters (%s)\n", buf
);
1987 pkt
= add_to_pktbuf(ic
, &pkt1
);
1988 if(av_dup_packet(pkt
) < 0)
1989 return AVERROR(ENOMEM
);
1991 read_size
+= pkt
->size
;
1993 st
= ic
->streams
[pkt
->stream_index
];
1994 if(codec_info_nb_frames
[st
->index
]>1)
1995 codec_info_duration
[st
->index
] += pkt
->duration
;
1996 if (pkt
->duration
!= 0)
1997 codec_info_nb_frames
[st
->index
]++;
2000 int index
= pkt
->stream_index
;
2001 int64_t last
= last_dts
[index
];
2002 int64_t duration
= pkt
->dts
- last
;
2004 if(pkt
->dts
!= AV_NOPTS_VALUE
&& last
!= AV_NOPTS_VALUE
&& duration
>0){
2005 double dur
= duration
* av_q2d(st
->time_base
);
2007 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2008 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2009 if(duration_count
[index
] < 2)
2010 memset(duration_error
[index
], 0, sizeof(*duration_error
));
2011 for(i
=1; i
<MAX_STD_TIMEBASES
; i
++){
2012 int framerate
= get_std_framerate(i
);
2013 int ticks
= lrintf(dur
*framerate
/(1001*12));
2014 double error
= dur
- ticks
*1001*12/(double)framerate
;
2015 duration_error
[index
][i
] += error
*error
;
2017 duration_count
[index
]++;
2019 if(last
== AV_NOPTS_VALUE
|| duration_count
[index
]<=1)
2020 last_dts
[pkt
->stream_index
]= pkt
->dts
;
2022 if (st
->codec
->codec_id
== CODEC_ID_NONE
) {
2023 AVProbeData
*pd
= &(probe_data
[st
->index
]);
2024 pd
->buf
= av_realloc(pd
->buf
, pd
->buf_size
+pkt
->size
+AVPROBE_PADDING_SIZE
);
2025 memcpy(pd
->buf
+pd
->buf_size
, pkt
->data
, pkt
->size
);
2026 pd
->buf_size
+= pkt
->size
;
2027 memset(pd
->buf
+pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
2030 if(st
->parser
&& st
->parser
->parser
->split
&& !st
->codec
->extradata
){
2031 int i
= st
->parser
->parser
->split(st
->codec
, pkt
->data
, pkt
->size
);
2033 st
->codec
->extradata_size
= i
;
2034 st
->codec
->extradata
= av_malloc(st
->codec
->extradata_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
2035 memcpy(st
->codec
->extradata
, pkt
->data
, st
->codec
->extradata_size
);
2036 memset(st
->codec
->extradata
+ i
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
2040 /* if still no information, we try to open the codec and to
2041 decompress the frame. We try to avoid that in most cases as
2042 it takes longer and uses more memory. For MPEG-4, we need to
2043 decompress for QuickTime. */
2044 if (!has_codec_parameters(st
->codec
) /*&&
2045 (st->codec->codec_id == CODEC_ID_FLV1 ||
2046 st->codec->codec_id == CODEC_ID_H264 ||
2047 st->codec->codec_id == CODEC_ID_H263 ||
2048 st->codec->codec_id == CODEC_ID_H261 ||
2049 st->codec->codec_id == CODEC_ID_VORBIS ||
2050 st->codec->codec_id == CODEC_ID_MJPEG ||
2051 st->codec->codec_id == CODEC_ID_PNG ||
2052 st->codec->codec_id == CODEC_ID_PAM ||
2053 st->codec->codec_id == CODEC_ID_PGM ||
2054 st->codec->codec_id == CODEC_ID_PGMYUV ||
2055 st->codec->codec_id == CODEC_ID_PBM ||
2056 st->codec->codec_id == CODEC_ID_PPM ||
2057 st->codec->codec_id == CODEC_ID_SHORTEN ||
2058 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2059 try_decode_frame(st
, pkt
->data
, pkt
->size
);
2061 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
) {
2067 // close codecs which were opened in try_decode_frame()
2068 for(i
=0;i
<ic
->nb_streams
;i
++) {
2069 st
= ic
->streams
[i
];
2070 if(st
->codec
->codec
)
2071 avcodec_close(st
->codec
);
2073 for(i
=0;i
<ic
->nb_streams
;i
++) {
2074 st
= ic
->streams
[i
];
2075 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
2076 if(st
->codec
->codec_id
== CODEC_ID_RAWVIDEO
&& !st
->codec
->codec_tag
&& !st
->codec
->bits_per_sample
)
2077 st
->codec
->codec_tag
= avcodec_pix_fmt_to_codec_tag(st
->codec
->pix_fmt
);
2079 if(duration_count
[i
]
2080 && tb_unreliable(st
->codec
) /*&&
2081 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2082 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2083 double best_error
= 2*av_q2d(st
->time_base
);
2084 best_error
= best_error
*best_error
*duration_count
[i
]*1000*12*30;
2086 for(j
=1; j
<MAX_STD_TIMEBASES
; j
++){
2087 double error
= duration_error
[i
][j
] * get_std_framerate(j
);
2088 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2089 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2090 if(error
< best_error
){
2092 av_reduce(&st
->r_frame_rate
.num
, &st
->r_frame_rate
.den
, get_std_framerate(j
), 12*1001, INT_MAX
);
2097 if (!st
->r_frame_rate
.num
){
2098 if( st
->codec
->time_base
.den
* (int64_t)st
->time_base
.num
2099 <= st
->codec
->time_base
.num
* (int64_t)st
->time_base
.den
){
2100 st
->r_frame_rate
.num
= st
->codec
->time_base
.den
;
2101 st
->r_frame_rate
.den
= st
->codec
->time_base
.num
;
2103 st
->r_frame_rate
.num
= st
->time_base
.den
;
2104 st
->r_frame_rate
.den
= st
->time_base
.num
;
2107 }else if(st
->codec
->codec_type
== CODEC_TYPE_AUDIO
) {
2108 if (st
->codec
->codec_id
== CODEC_ID_NONE
&& probe_data
[st
->index
].buf_size
> 0) {
2109 codec_identified
[st
->index
] = set_codec_from_probe_data(st
, &(probe_data
[st
->index
]), 1);
2110 if (codec_identified
[st
->index
]) {
2111 st
->need_parsing
= AVSTREAM_PARSE_FULL
;
2114 if(!st
->codec
->bits_per_sample
)
2115 st
->codec
->bits_per_sample
= av_get_bits_per_sample(st
->codec
->codec_id
);
2119 av_estimate_timings(ic
, old_offset
);
2121 for(i
=0;i
<ic
->nb_streams
;i
++) {
2122 st
= ic
->streams
[i
];
2123 if (codec_identified
[st
->index
])
2126 //FIXME this is a mess
2127 if(i
!=ic
->nb_streams
){
2128 av_read_frame_flush(ic
);
2129 for(i
=0;i
<ic
->nb_streams
;i
++) {
2130 st
= ic
->streams
[i
];
2131 if (codec_identified
[st
->index
]) {
2132 av_seek_frame(ic
, st
->index
, 0.0, 0);
2134 st
->cur_dts
= st
->first_dts
;
2136 url_fseek(ic
->pb
, ic
->data_offset
, SEEK_SET
);
2139 compute_chapters_end(ic
);
2142 /* correct DTS for B-frame streams with no timestamps */
2143 for(i
=0;i
<ic
->nb_streams
;i
++) {
2144 st
= ic
->streams
[i
];
2145 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
2147 ppktl
= &ic
->packet_buffer
;
2149 if(ppkt1
->stream_index
!= i
)
2151 if(ppkt1
->pkt
->dts
< 0)
2153 if(ppkt1
->pkt
->pts
!= AV_NOPTS_VALUE
)
2155 ppkt1
->pkt
->dts
-= delta
;
2160 st
->cur_dts
-= delta
;
2166 av_free(duration_error
);
2167 for(i
=0;i
<MAX_STREAMS
;i
++){
2168 av_freep(&(probe_data
[i
].buf
));
2174 /*******************************************************/
2176 int av_read_play(AVFormatContext
*s
)
2178 if (s
->iformat
->read_play
)
2179 return s
->iformat
->read_play(s
);
2181 return av_url_read_fpause(s
->pb
, 0);
2182 return AVERROR(ENOSYS
);
2185 int av_read_pause(AVFormatContext
*s
)
2187 if (s
->iformat
->read_pause
)
2188 return s
->iformat
->read_pause(s
);
2190 return av_url_read_fpause(s
->pb
, 1);
2191 return AVERROR(ENOSYS
);
2194 void av_close_input_stream(AVFormatContext
*s
)
2199 /* free previous packet */
2200 if (s
->cur_st
&& s
->cur_st
->parser
)
2201 av_free_packet(&s
->cur_pkt
);
2203 if (s
->iformat
->read_close
)
2204 s
->iformat
->read_close(s
);
2205 for(i
=0;i
<s
->nb_streams
;i
++) {
2206 /* free all data in a stream component */
2209 av_parser_close(st
->parser
);
2211 av_free(st
->index_entries
);
2212 av_free(st
->codec
->extradata
);
2214 av_free(st
->filename
);
2215 av_free(st
->priv_data
);
2218 for(i
=s
->nb_programs
-1; i
>=0; i
--) {
2219 av_freep(&s
->programs
[i
]->provider_name
);
2220 av_freep(&s
->programs
[i
]->name
);
2221 av_freep(&s
->programs
[i
]->stream_index
);
2222 av_freep(&s
->programs
[i
]);
2224 av_freep(&s
->programs
);
2225 flush_packet_queue(s
);
2226 av_freep(&s
->priv_data
);
2227 while(s
->nb_chapters
--) {
2228 av_free(s
->chapters
[s
->nb_chapters
]->title
);
2229 av_free(s
->chapters
[s
->nb_chapters
]);
2231 av_freep(&s
->chapters
);
2235 void av_close_input_file(AVFormatContext
*s
)
2237 ByteIOContext
*pb
= s
->iformat
->flags
& AVFMT_NOFILE
? NULL
: s
->pb
;
2238 av_close_input_stream(s
);
2243 AVStream
*av_new_stream(AVFormatContext
*s
, int id
)
2248 if (s
->nb_streams
>= MAX_STREAMS
)
2251 st
= av_mallocz(sizeof(AVStream
));
2255 st
->codec
= avcodec_alloc_context();
2257 /* no default bitrate if decoding */
2258 st
->codec
->bit_rate
= 0;
2260 st
->index
= s
->nb_streams
;
2262 st
->start_time
= AV_NOPTS_VALUE
;
2263 st
->duration
= AV_NOPTS_VALUE
;
2264 st
->cur_dts
= AV_NOPTS_VALUE
;
2265 st
->first_dts
= AV_NOPTS_VALUE
;
2267 /* default pts setting is MPEG-like */
2268 av_set_pts_info(st
, 33, 1, 90000);
2269 st
->last_IP_pts
= AV_NOPTS_VALUE
;
2270 for(i
=0; i
<MAX_REORDER_DELAY
+1; i
++)
2271 st
->pts_buffer
[i
]= AV_NOPTS_VALUE
;
2273 s
->streams
[s
->nb_streams
++] = st
;
2277 AVProgram
*av_new_program(AVFormatContext
*ac
, int id
)
2279 AVProgram
*program
=NULL
;
2283 av_log(ac
, AV_LOG_DEBUG
, "new_program: id=0x%04x\n", id
);
2286 for(i
=0; i
<ac
->nb_programs
; i
++)
2287 if(ac
->programs
[i
]->id
== id
)
2288 program
= ac
->programs
[i
];
2291 program
= av_mallocz(sizeof(AVProgram
));
2294 dynarray_add(&ac
->programs
, &ac
->nb_programs
, program
);
2295 program
->discard
= AVDISCARD_NONE
;
2302 void av_set_program_name(AVProgram
*program
, char *provider_name
, char *name
)
2304 assert(!provider_name
== !name
);
2306 av_free(program
->provider_name
);
2307 av_free(program
-> name
);
2308 program
->provider_name
= av_strdup(provider_name
);
2309 program
-> name
= av_strdup( name
);
2313 AVChapter
*ff_new_chapter(AVFormatContext
*s
, int id
, AVRational time_base
, int64_t start
, int64_t end
, const char *title
)
2315 AVChapter
*chapter
= NULL
;
2318 for(i
=0; i
<s
->nb_chapters
; i
++)
2319 if(s
->chapters
[i
]->id
== id
)
2320 chapter
= s
->chapters
[i
];
2323 chapter
= av_mallocz(sizeof(AVChapter
));
2326 dynarray_add(&s
->chapters
, &s
->nb_chapters
, chapter
);
2328 av_free(chapter
->title
);
2329 chapter
->title
= av_strdup(title
);
2331 chapter
->time_base
= time_base
;
2332 chapter
->start
= start
;
2338 /************************************************************/
2339 /* output media file */
2341 int av_set_parameters(AVFormatContext
*s
, AVFormatParameters
*ap
)
2345 if (s
->oformat
->priv_data_size
> 0) {
2346 s
->priv_data
= av_mallocz(s
->oformat
->priv_data_size
);
2348 return AVERROR(ENOMEM
);
2350 s
->priv_data
= NULL
;
2352 if (s
->oformat
->set_parameters
) {
2353 ret
= s
->oformat
->set_parameters(s
, ap
);
2360 int av_write_header(AVFormatContext
*s
)
2365 // some sanity checks
2366 for(i
=0;i
<s
->nb_streams
;i
++) {
2369 switch (st
->codec
->codec_type
) {
2370 case CODEC_TYPE_AUDIO
:
2371 if(st
->codec
->sample_rate
<=0){
2372 av_log(s
, AV_LOG_ERROR
, "sample rate not set\n");
2376 case CODEC_TYPE_VIDEO
:
2377 if(st
->codec
->time_base
.num
<=0 || st
->codec
->time_base
.den
<=0){ //FIXME audio too?
2378 av_log(s
, AV_LOG_ERROR
, "time base not set\n");
2381 if(st
->codec
->width
<=0 || st
->codec
->height
<=0){
2382 av_log(s
, AV_LOG_ERROR
, "dimensions not set\n");
2388 if(s
->oformat
->codec_tag
){
2389 if(st
->codec
->codec_tag
){
2391 //check that tag + id is in the table
2392 //if neither is in the table -> OK
2393 //if tag is in the table with another id -> FAIL
2394 //if id is in the table with another tag -> FAIL unless strict < ?
2396 st
->codec
->codec_tag
= av_codec_get_tag(s
->oformat
->codec_tag
, st
->codec
->codec_id
);
2400 if (!s
->priv_data
&& s
->oformat
->priv_data_size
> 0) {
2401 s
->priv_data
= av_mallocz(s
->oformat
->priv_data_size
);
2403 return AVERROR(ENOMEM
);
2406 if(s
->oformat
->write_header
){
2407 ret
= s
->oformat
->write_header(s
);
2412 /* init PTS generation */
2413 for(i
=0;i
<s
->nb_streams
;i
++) {
2414 int64_t den
= AV_NOPTS_VALUE
;
2417 switch (st
->codec
->codec_type
) {
2418 case CODEC_TYPE_AUDIO
:
2419 den
= (int64_t)st
->time_base
.num
* st
->codec
->sample_rate
;
2421 case CODEC_TYPE_VIDEO
:
2422 den
= (int64_t)st
->time_base
.num
* st
->codec
->time_base
.den
;
2427 if (den
!= AV_NOPTS_VALUE
) {
2429 return AVERROR_INVALIDDATA
;
2430 av_frac_init(&st
->pts
, 0, 0, den
);
2436 //FIXME merge with compute_pkt_fields
2437 static int compute_pkt_fields2(AVStream
*st
, AVPacket
*pkt
){
2438 int delay
= FFMAX(st
->codec
->has_b_frames
, !!st
->codec
->max_b_frames
);
2439 int num
, den
, frame_size
, i
;
2441 // 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);
2443 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2446 /* duration field */
2447 if (pkt
->duration
== 0) {
2448 compute_frame_duration(&num
, &den
, st
, NULL
, pkt
);
2450 pkt
->duration
= av_rescale(1, num
* (int64_t)st
->time_base
.den
, den
* (int64_t)st
->time_base
.num
);
2454 if(pkt
->pts
== AV_NOPTS_VALUE
&& pkt
->dts
!= AV_NOPTS_VALUE
&& delay
==0)
2457 //XXX/FIXME this is a temporary hack until all encoders output pts
2458 if((pkt
->pts
== 0 || pkt
->pts
== AV_NOPTS_VALUE
) && pkt
->dts
== AV_NOPTS_VALUE
&& !delay
){
2460 // pkt->pts= st->cur_dts;
2461 pkt
->pts
= st
->pts
.val
;
2464 //calculate dts from pts
2465 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
== AV_NOPTS_VALUE
){
2466 st
->pts_buffer
[0]= pkt
->pts
;
2467 for(i
=1; i
<delay
+1 && st
->pts_buffer
[i
] == AV_NOPTS_VALUE
; i
++)
2468 st
->pts_buffer
[i
]= (i
-delay
-1) * pkt
->duration
;
2469 for(i
=0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+1]; i
++)
2470 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+1]);
2472 pkt
->dts
= st
->pts_buffer
[0];
2475 if(st
->cur_dts
&& st
->cur_dts
!= AV_NOPTS_VALUE
&& st
->cur_dts
>= pkt
->dts
){
2476 av_log(st
->codec
, AV_LOG_ERROR
, "error, non monotone timestamps %"PRId64
" >= %"PRId64
"\n", st
->cur_dts
, pkt
->dts
);
2479 if(pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->pts
< pkt
->dts
){
2480 av_log(st
->codec
, AV_LOG_ERROR
, "error, pts < dts\n");
2484 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2485 st
->cur_dts
= pkt
->dts
;
2486 st
->pts
.val
= pkt
->dts
;
2489 switch (st
->codec
->codec_type
) {
2490 case CODEC_TYPE_AUDIO
:
2491 frame_size
= get_audio_frame_size(st
->codec
, pkt
->size
);
2493 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2494 likely equal to the encoder delay, but it would be better if we
2495 had the real timestamps from the encoder */
2496 if (frame_size
>= 0 && (pkt
->size
|| st
->pts
.num
!=st
->pts
.den
>>1 || st
->pts
.val
)) {
2497 av_frac_add(&st
->pts
, (int64_t)st
->time_base
.den
* frame_size
);
2500 case CODEC_TYPE_VIDEO
:
2501 av_frac_add(&st
->pts
, (int64_t)st
->time_base
.den
* st
->codec
->time_base
.num
);
2509 static void truncate_ts(AVStream
*st
, AVPacket
*pkt
){
2510 int64_t pts_mask
= (2LL << (st
->pts_wrap_bits
-1)) - 1;
2513 // pkt->dts= 0; //this happens for low_delay=0 and B-frames, FIXME, needs further investigation about what we should do here
2515 if (pkt
->pts
!= AV_NOPTS_VALUE
)
2516 pkt
->pts
&= pts_mask
;
2517 if (pkt
->dts
!= AV_NOPTS_VALUE
)
2518 pkt
->dts
&= pts_mask
;
2521 int av_write_frame(AVFormatContext
*s
, AVPacket
*pkt
)
2523 int ret
= compute_pkt_fields2(s
->streams
[pkt
->stream_index
], pkt
);
2525 if(ret
<0 && !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2528 truncate_ts(s
->streams
[pkt
->stream_index
], pkt
);
2530 ret
= s
->oformat
->write_packet(s
, pkt
);
2532 ret
= url_ferror(s
->pb
);
2536 int av_interleave_packet_per_dts(AVFormatContext
*s
, AVPacket
*out
, AVPacket
*pkt
, int flush
){
2537 AVPacketList
*pktl
, **next_point
, *this_pktl
;
2539 int streams
[MAX_STREAMS
];
2542 AVStream
*st
= s
->streams
[ pkt
->stream_index
];
2544 // assert(pkt->destruct != av_destruct_packet); //FIXME
2546 this_pktl
= av_mallocz(sizeof(AVPacketList
));
2547 this_pktl
->pkt
= *pkt
;
2548 if(pkt
->destruct
== av_destruct_packet
)
2549 pkt
->destruct
= NULL
; // not shared -> must keep original from being freed
2551 av_dup_packet(&this_pktl
->pkt
); //shared -> must dup
2553 next_point
= &s
->packet_buffer
;
2555 AVStream
*st2
= s
->streams
[ (*next_point
)->pkt
.stream_index
];
2556 int64_t left
= st2
->time_base
.num
* (int64_t)st
->time_base
.den
;
2557 int64_t right
= st
->time_base
.num
* (int64_t)st2
->time_base
.den
;
2558 if((*next_point
)->pkt
.dts
* left
> pkt
->dts
* right
) //FIXME this can overflow
2560 next_point
= &(*next_point
)->next
;
2562 this_pktl
->next
= *next_point
;
2563 *next_point
= this_pktl
;
2566 memset(streams
, 0, sizeof(streams
));
2567 pktl
= s
->packet_buffer
;
2569 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2570 if(streams
[ pktl
->pkt
.stream_index
] == 0)
2572 streams
[ pktl
->pkt
.stream_index
]++;
2576 if(stream_count
&& (s
->nb_streams
== stream_count
|| flush
)){
2577 pktl
= s
->packet_buffer
;
2580 s
->packet_buffer
= pktl
->next
;
2584 av_init_packet(out
);
2590 * Interleaves an AVPacket correctly so it can be muxed.
2591 * @param out the interleaved packet will be output here
2592 * @param in the input packet
2593 * @param flush 1 if no further packets are available as input and all
2594 * remaining packets should be output
2595 * @return 1 if a packet was output, 0 if no packet could be output,
2596 * < 0 if an error occurred
2598 static int av_interleave_packet(AVFormatContext
*s
, AVPacket
*out
, AVPacket
*in
, int flush
){
2599 if(s
->oformat
->interleave_packet
)
2600 return s
->oformat
->interleave_packet(s
, out
, in
, flush
);
2602 return av_interleave_packet_per_dts(s
, out
, in
, flush
);
2605 int av_interleaved_write_frame(AVFormatContext
*s
, AVPacket
*pkt
){
2606 AVStream
*st
= s
->streams
[ pkt
->stream_index
];
2608 //FIXME/XXX/HACK drop zero sized packets
2609 if(st
->codec
->codec_type
== CODEC_TYPE_AUDIO
&& pkt
->size
==0)
2612 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2613 if(compute_pkt_fields2(st
, pkt
) < 0 && !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2616 if(pkt
->dts
== AV_NOPTS_VALUE
)
2621 int ret
= av_interleave_packet(s
, &opkt
, pkt
, 0);
2622 if(ret
<=0) //FIXME cleanup needed for ret<0 ?
2625 truncate_ts(s
->streams
[opkt
.stream_index
], &opkt
);
2626 ret
= s
->oformat
->write_packet(s
, &opkt
);
2628 av_free_packet(&opkt
);
2633 if(url_ferror(s
->pb
))
2634 return url_ferror(s
->pb
);
2638 int av_write_trailer(AVFormatContext
*s
)
2644 ret
= av_interleave_packet(s
, &pkt
, NULL
, 1);
2645 if(ret
<0) //FIXME cleanup needed for ret<0 ?
2650 truncate_ts(s
->streams
[pkt
.stream_index
], &pkt
);
2651 ret
= s
->oformat
->write_packet(s
, &pkt
);
2653 av_free_packet(&pkt
);
2657 if(url_ferror(s
->pb
))
2661 if(s
->oformat
->write_trailer
)
2662 ret
= s
->oformat
->write_trailer(s
);
2665 ret
=url_ferror(s
->pb
);
2666 for(i
=0;i
<s
->nb_streams
;i
++)
2667 av_freep(&s
->streams
[i
]->priv_data
);
2668 av_freep(&s
->priv_data
);
2672 void av_program_add_stream_index(AVFormatContext
*ac
, int progid
, unsigned int idx
)
2675 AVProgram
*program
=NULL
;
2678 for(i
=0; i
<ac
->nb_programs
; i
++){
2679 if(ac
->programs
[i
]->id
!= progid
)
2681 program
= ac
->programs
[i
];
2682 for(j
=0; j
<program
->nb_stream_indexes
; j
++)
2683 if(program
->stream_index
[j
] == idx
)
2686 tmp
= av_realloc(program
->stream_index
, sizeof(unsigned int)*(program
->nb_stream_indexes
+1));
2689 program
->stream_index
= tmp
;
2690 program
->stream_index
[program
->nb_stream_indexes
++] = idx
;
2695 /* "user interface" functions */
2696 static void dump_stream_format(AVFormatContext
*ic
, int i
, int index
, int is_output
)
2699 int flags
= (is_output
? ic
->oformat
->flags
: ic
->iformat
->flags
);
2700 AVStream
*st
= ic
->streams
[i
];
2701 int g
= ff_gcd(st
->time_base
.num
, st
->time_base
.den
);
2702 avcodec_string(buf
, sizeof(buf
), st
->codec
, is_output
);
2703 av_log(NULL
, AV_LOG_INFO
, " Stream #%d.%d", index
, i
);
2704 /* the pid is an important information, so we display it */
2705 /* XXX: add a generic system */
2706 if (flags
& AVFMT_SHOW_IDS
)
2707 av_log(NULL
, AV_LOG_INFO
, "[0x%x]", st
->id
);
2708 if (strlen(st
->language
) > 0)
2709 av_log(NULL
, AV_LOG_INFO
, "(%s)", st
->language
);
2710 av_log(NULL
, AV_LOG_DEBUG
, ", %d/%d", st
->time_base
.num
/g
, st
->time_base
.den
/g
);
2711 av_log(NULL
, AV_LOG_INFO
, ": %s", buf
);
2712 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
){
2713 if(st
->r_frame_rate
.den
&& st
->r_frame_rate
.num
)
2714 av_log(NULL
, AV_LOG_INFO
, ", %5.2f tb(r)", av_q2d(st
->r_frame_rate
));
2715 /* else if(st->time_base.den && st->time_base.num)
2716 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(m)", 1/av_q2d(st->time_base));*/
2718 av_log(NULL
, AV_LOG_INFO
, ", %5.2f tb(c)", 1/av_q2d(st
->codec
->time_base
));
2720 av_log(NULL
, AV_LOG_INFO
, "\n");
2723 void dump_format(AVFormatContext
*ic
,
2730 av_log(NULL
, AV_LOG_INFO
, "%s #%d, %s, %s '%s':\n",
2731 is_output
? "Output" : "Input",
2733 is_output
? ic
->oformat
->name
: ic
->iformat
->name
,
2734 is_output
? "to" : "from", url
);
2736 av_log(NULL
, AV_LOG_INFO
, " Duration: ");
2737 if (ic
->duration
!= AV_NOPTS_VALUE
) {
2738 int hours
, mins
, secs
, us
;
2739 secs
= ic
->duration
/ AV_TIME_BASE
;
2740 us
= ic
->duration
% AV_TIME_BASE
;
2745 av_log(NULL
, AV_LOG_INFO
, "%02d:%02d:%02d.%02d", hours
, mins
, secs
,
2746 (100 * us
) / AV_TIME_BASE
);
2748 av_log(NULL
, AV_LOG_INFO
, "N/A");
2750 if (ic
->start_time
!= AV_NOPTS_VALUE
) {
2752 av_log(NULL
, AV_LOG_INFO
, ", start: ");
2753 secs
= ic
->start_time
/ AV_TIME_BASE
;
2754 us
= ic
->start_time
% AV_TIME_BASE
;
2755 av_log(NULL
, AV_LOG_INFO
, "%d.%06d",
2756 secs
, (int)av_rescale(us
, 1000000, AV_TIME_BASE
));
2758 av_log(NULL
, AV_LOG_INFO
, ", bitrate: ");
2760 av_log(NULL
, AV_LOG_INFO
,"%d kb/s", ic
->bit_rate
/ 1000);
2762 av_log(NULL
, AV_LOG_INFO
, "N/A");
2764 av_log(NULL
, AV_LOG_INFO
, "\n");
2766 if(ic
->nb_programs
) {
2768 for(j
=0; j
<ic
->nb_programs
; j
++) {
2769 av_log(NULL
, AV_LOG_INFO
, " Program %d %s\n", ic
->programs
[j
]->id
,
2770 ic
->programs
[j
]->name
? ic
->programs
[j
]->name
: "");
2771 for(k
=0; k
<ic
->programs
[j
]->nb_stream_indexes
; k
++)
2772 dump_stream_format(ic
, ic
->programs
[j
]->stream_index
[k
], index
, is_output
);
2775 for(i
=0;i
<ic
->nb_streams
;i
++)
2776 dump_stream_format(ic
, i
, index
, is_output
);
2779 int parse_image_size(int *width_ptr
, int *height_ptr
, const char *str
)
2781 return av_parse_video_frame_size(width_ptr
, height_ptr
, str
);
2784 int parse_frame_rate(int *frame_rate_num
, int *frame_rate_den
, const char *arg
)
2786 AVRational frame_rate
;
2787 int ret
= av_parse_video_frame_rate(&frame_rate
, arg
);
2788 *frame_rate_num
= frame_rate
.num
;
2789 *frame_rate_den
= frame_rate
.den
;
2794 * Gets the current time in microseconds.
2796 int64_t av_gettime(void)
2799 gettimeofday(&tv
,NULL
);
2800 return (int64_t)tv
.tv_sec
* 1000000 + tv
.tv_usec
;
2803 int64_t parse_date(const char *datestr
, int duration
)
2809 static const char *date_fmt
[] = {
2813 static const char *time_fmt
[] = {
2823 time_t now
= time(0);
2825 len
= strlen(datestr
);
2827 lastch
= datestr
[len
- 1];
2830 is_utc
= (lastch
== 'z' || lastch
== 'Z');
2832 memset(&dt
, 0, sizeof(dt
));
2837 /* parse the year-month-day part */
2838 for (i
= 0; i
< sizeof(date_fmt
) / sizeof(date_fmt
[0]); i
++) {
2839 q
= small_strptime(p
, date_fmt
[i
], &dt
);
2845 /* if the year-month-day part is missing, then take the
2846 * current year-month-day time */
2851 dt
= *localtime(&now
);
2853 dt
.tm_hour
= dt
.tm_min
= dt
.tm_sec
= 0;
2858 if (*p
== 'T' || *p
== 't' || *p
== ' ')
2861 /* parse the hour-minute-second part */
2862 for (i
= 0; i
< sizeof(time_fmt
) / sizeof(time_fmt
[0]); i
++) {
2863 q
= small_strptime(p
, time_fmt
[i
], &dt
);
2869 /* parse datestr as a duration */
2874 /* parse datestr as HH:MM:SS */
2875 q
= small_strptime(p
, time_fmt
[0], &dt
);
2877 /* parse datestr as S+ */
2878 dt
.tm_sec
= strtol(p
, (char **)&q
, 10);
2880 /* the parsing didn't succeed */
2887 /* Now we have all the fields that we can get */
2893 t
= dt
.tm_hour
* 3600 + dt
.tm_min
* 60 + dt
.tm_sec
;
2895 dt
.tm_isdst
= -1; /* unknown */
2905 /* parse the .m... part */
2909 for (val
= 0, n
= 100000; n
>= 1; n
/= 10, q
++) {
2912 val
+= n
* (*q
- '0');
2916 return negative
? -t
: t
;
2919 int find_info_tag(char *arg
, int arg_size
, const char *tag1
, const char *info
)
2929 while (*p
!= '\0' && *p
!= '=' && *p
!= '&') {
2930 if ((q
- tag
) < sizeof(tag
) - 1)
2938 while (*p
!= '&' && *p
!= '\0') {
2939 if ((q
- arg
) < arg_size
- 1) {
2949 if (!strcmp(tag
, tag1
))
2958 int av_get_frame_filename(char *buf
, int buf_size
,
2959 const char *path
, int number
)
2962 char *q
, buf1
[20], c
;
2963 int nd
, len
, percentd_found
;
2975 while (isdigit(*p
)) {
2976 nd
= nd
* 10 + *p
++ - '0';
2979 } while (isdigit(c
));
2988 snprintf(buf1
, sizeof(buf1
), "%0*d", nd
, number
);
2990 if ((q
- buf
+ len
) > buf_size
- 1)
2992 memcpy(q
, buf1
, len
);
3000 if ((q
- buf
) < buf_size
- 1)
3004 if (!percentd_found
)
3013 static void hex_dump_internal(void *avcl
, FILE *f
, int level
, uint8_t *buf
, int size
)
3016 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3018 for(i
=0;i
<size
;i
+=16) {
3025 PRINT(" %02x", buf
[i
+j
]);
3030 for(j
=0;j
<len
;j
++) {
3032 if (c
< ' ' || c
> '~')
3041 void av_hex_dump(FILE *f
, uint8_t *buf
, int size
)
3043 hex_dump_internal(NULL
, f
, 0, buf
, size
);
3046 void av_hex_dump_log(void *avcl
, int level
, uint8_t *buf
, int size
)
3048 hex_dump_internal(avcl
, NULL
, level
, buf
, size
);
3051 //FIXME needs to know the time_base
3052 static void pkt_dump_internal(void *avcl
, FILE *f
, int level
, AVPacket
*pkt
, int dump_payload
)
3054 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3055 PRINT("stream #%d:\n", pkt
->stream_index
);
3056 PRINT(" keyframe=%d\n", ((pkt
->flags
& PKT_FLAG_KEY
) != 0));
3057 PRINT(" duration=%0.3f\n", (double)pkt
->duration
/ AV_TIME_BASE
);
3058 /* DTS is _always_ valid after av_read_frame() */
3060 if (pkt
->dts
== AV_NOPTS_VALUE
)
3063 PRINT("%0.3f", (double)pkt
->dts
/ AV_TIME_BASE
);
3064 /* PTS may not be known if B-frames are present. */
3066 if (pkt
->pts
== AV_NOPTS_VALUE
)
3069 PRINT("%0.3f", (double)pkt
->pts
/ AV_TIME_BASE
);
3071 PRINT(" size=%d\n", pkt
->size
);
3074 av_hex_dump(f
, pkt
->data
, pkt
->size
);
3077 void av_pkt_dump(FILE *f
, AVPacket
*pkt
, int dump_payload
)
3079 pkt_dump_internal(NULL
, f
, 0, pkt
, dump_payload
);
3082 void av_pkt_dump_log(void *avcl
, int level
, AVPacket
*pkt
, int dump_payload
)
3084 pkt_dump_internal(avcl
, NULL
, level
, pkt
, dump_payload
);
3087 void url_split(char *proto
, int proto_size
,
3088 char *authorization
, int authorization_size
,
3089 char *hostname
, int hostname_size
,
3091 char *path
, int path_size
,
3094 const char *p
, *ls
, *at
, *col
, *brk
;
3096 if (port_ptr
) *port_ptr
= -1;
3097 if (proto_size
> 0) proto
[0] = 0;
3098 if (authorization_size
> 0) authorization
[0] = 0;
3099 if (hostname_size
> 0) hostname
[0] = 0;
3100 if (path_size
> 0) path
[0] = 0;
3102 /* parse protocol */
3103 if ((p
= strchr(url
, ':'))) {
3104 av_strlcpy(proto
, url
, FFMIN(proto_size
, p
+ 1 - url
));
3109 /* no protocol means plain filename */
3110 av_strlcpy(path
, url
, path_size
);
3114 /* separate path from hostname */
3115 ls
= strchr(p
, '/');
3117 ls
= strchr(p
, '?');
3119 av_strlcpy(path
, ls
, path_size
);
3121 ls
= &p
[strlen(p
)]; // XXX
3123 /* the rest is hostname, use that to parse auth/port */
3125 /* authorization (user[:pass]@hostname) */
3126 if ((at
= strchr(p
, '@')) && at
< ls
) {
3127 av_strlcpy(authorization
, p
,
3128 FFMIN(authorization_size
, at
+ 1 - p
));
3129 p
= at
+ 1; /* skip '@' */
3132 if (*p
== '[' && (brk
= strchr(p
, ']')) && brk
< ls
) {
3134 av_strlcpy(hostname
, p
+ 1,
3135 FFMIN(hostname_size
, brk
- p
));
3136 if (brk
[1] == ':' && port_ptr
)
3137 *port_ptr
= atoi(brk
+ 2);
3138 } else if ((col
= strchr(p
, ':')) && col
< ls
) {
3139 av_strlcpy(hostname
, p
,
3140 FFMIN(col
+ 1 - p
, hostname_size
));
3141 if (port_ptr
) *port_ptr
= atoi(col
+ 1);
3143 av_strlcpy(hostname
, p
,
3144 FFMIN(ls
+ 1 - p
, hostname_size
));
3148 void av_set_pts_info(AVStream
*s
, int pts_wrap_bits
,
3149 int pts_num
, int pts_den
)
3151 s
->pts_wrap_bits
= pts_wrap_bits
;
3152 s
->time_base
.num
= pts_num
;
3153 s
->time_base
.den
= pts_den
;
3156 /* fraction handling */
3159 * f = val + (num / den) + 0.5.
3161 * 'num' is normalized so that it is such as 0 <= num < den.
3163 * @param f fractional number
3164 * @param val integer value
3165 * @param num must be >= 0
3166 * @param den must be >= 1
3168 static void av_frac_init(AVFrac
*f
, int64_t val
, int64_t num
, int64_t den
)
3181 * Fractional addition to f: f = f + (incr / f->den).
3183 * @param f fractional number
3184 * @param incr increment, can be positive or negative
3186 static void av_frac_add(AVFrac
*f
, int64_t incr
)
3190 num
= f
->num
+ incr
;
3193 f
->val
+= num
/ den
;
3199 } else if (num
>= den
) {
3200 f
->val
+= num
/ den
;