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
);
408 av_freep(&ic
->priv_data
);
415 /** size of probe buffer, for guessing file type from file contents */
416 #define PROBE_BUF_MIN 2048
417 #define PROBE_BUF_MAX (1<<20)
419 int av_open_input_file(AVFormatContext
**ic_ptr
, const char *filename
,
422 AVFormatParameters
*ap
)
425 AVProbeData probe_data
, *pd
= &probe_data
;
426 ByteIOContext
*pb
= NULL
;
430 pd
->filename
= filename
;
435 /* guess format if no file can be opened */
436 fmt
= av_probe_input_format(pd
, 0);
439 /* Do not open file if the format does not need it. XXX: specific
440 hack needed to handle RTSP/TCP */
441 if (!fmt
|| !(fmt
->flags
& AVFMT_NOFILE
)) {
442 /* if no file needed do not try to open one */
443 if ((err
=url_fopen(&pb
, filename
, URL_RDONLY
)) < 0) {
447 url_setbufsize(pb
, buf_size
);
450 for(probe_size
= PROBE_BUF_MIN
; probe_size
<=PROBE_BUF_MAX
&& !fmt
; probe_size
<<=1){
451 int score
= probe_size
< PROBE_BUF_MAX
? AVPROBE_SCORE_MAX
/4 : 0;
452 /* read probe data */
453 pd
->buf
= av_realloc(pd
->buf
, probe_size
+ AVPROBE_PADDING_SIZE
);
454 pd
->buf_size
= get_buffer(pb
, pd
->buf
, probe_size
);
455 memset(pd
->buf
+pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
456 if (url_fseek(pb
, 0, SEEK_SET
) < 0) {
458 if (url_fopen(&pb
, filename
, URL_RDONLY
) < 0) {
464 /* guess file format */
465 fmt
= av_probe_input_format2(pd
, 1, &score
);
470 /* if still no format found, error */
476 /* check filename in case an image number is expected */
477 if (fmt
->flags
& AVFMT_NEEDNUMBER
) {
478 if (!av_filename_number_test(filename
)) {
479 err
= AVERROR_NUMEXPECTED
;
483 err
= av_open_input_stream(ic_ptr
, pb
, filename
, fmt
, ap
);
496 /*******************************************************/
498 int av_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
503 ret
= s
->iformat
->read_packet(s
, pkt
);
506 st
= s
->streams
[pkt
->stream_index
];
508 switch(st
->codec
->codec_type
){
509 case CODEC_TYPE_VIDEO
:
510 if(s
->video_codec_id
) st
->codec
->codec_id
= s
->video_codec_id
;
512 case CODEC_TYPE_AUDIO
:
513 if(s
->audio_codec_id
) st
->codec
->codec_id
= s
->audio_codec_id
;
515 case CODEC_TYPE_SUBTITLE
:
516 if(s
->subtitle_codec_id
)st
->codec
->codec_id
= s
->subtitle_codec_id
;
523 /**********************************************************/
526 * Get the number of samples of an audio frame. Return -1 on error.
528 static int get_audio_frame_size(AVCodecContext
*enc
, int size
)
532 if (enc
->frame_size
<= 1) {
533 int bits_per_sample
= av_get_bits_per_sample(enc
->codec_id
);
535 if (bits_per_sample
) {
536 if (enc
->channels
== 0)
538 frame_size
= (size
<< 3) / (bits_per_sample
* enc
->channels
);
540 /* used for example by ADPCM codecs */
541 if (enc
->bit_rate
== 0)
543 frame_size
= (size
* 8 * enc
->sample_rate
) / enc
->bit_rate
;
546 frame_size
= enc
->frame_size
;
553 * Return the frame duration in seconds. Return 0 if not available.
555 static void compute_frame_duration(int *pnum
, int *pden
, AVStream
*st
,
556 AVCodecParserContext
*pc
, AVPacket
*pkt
)
562 switch(st
->codec
->codec_type
) {
563 case CODEC_TYPE_VIDEO
:
564 if(st
->time_base
.num
*1000LL > st
->time_base
.den
){
565 *pnum
= st
->time_base
.num
;
566 *pden
= st
->time_base
.den
;
567 }else if(st
->codec
->time_base
.num
*1000LL > st
->codec
->time_base
.den
){
568 *pnum
= st
->codec
->time_base
.num
;
569 *pden
= st
->codec
->time_base
.den
;
570 if (pc
&& pc
->repeat_pict
) {
572 *pnum
= (*pnum
) * (2 + pc
->repeat_pict
);
576 case CODEC_TYPE_AUDIO
:
577 frame_size
= get_audio_frame_size(st
->codec
, pkt
->size
);
581 *pden
= st
->codec
->sample_rate
;
588 static int is_intra_only(AVCodecContext
*enc
){
589 if(enc
->codec_type
== CODEC_TYPE_AUDIO
){
591 }else if(enc
->codec_type
== CODEC_TYPE_VIDEO
){
592 switch(enc
->codec_id
){
594 case CODEC_ID_MJPEGB
:
596 case CODEC_ID_RAWVIDEO
:
597 case CODEC_ID_DVVIDEO
:
598 case CODEC_ID_HUFFYUV
:
599 case CODEC_ID_FFVHUFF
:
610 static void update_initial_timestamps(AVFormatContext
*s
, int stream_index
,
611 int64_t dts
, int64_t pts
)
613 AVStream
*st
= s
->streams
[stream_index
];
614 AVPacketList
*pktl
= s
->packet_buffer
;
616 if(st
->first_dts
!= AV_NOPTS_VALUE
|| dts
== AV_NOPTS_VALUE
)
619 st
->first_dts
= dts
- st
->cur_dts
;
622 for(; pktl
; pktl
= pktl
->next
){
623 if(pktl
->pkt
.stream_index
!= stream_index
)
625 //FIXME think more about this check
626 if(pktl
->pkt
.pts
!= AV_NOPTS_VALUE
&& pktl
->pkt
.pts
== pktl
->pkt
.dts
)
627 pktl
->pkt
.pts
+= st
->first_dts
;
629 if(pktl
->pkt
.dts
!= AV_NOPTS_VALUE
)
630 pktl
->pkt
.dts
+= st
->first_dts
;
632 if(st
->start_time
== AV_NOPTS_VALUE
&& pktl
->pkt
.pts
!= AV_NOPTS_VALUE
)
633 st
->start_time
= pktl
->pkt
.pts
;
635 if (st
->start_time
== AV_NOPTS_VALUE
)
636 st
->start_time
= pts
;
639 static void update_initial_durations(AVFormatContext
*s
, AVStream
*st
, AVPacket
*pkt
)
641 AVPacketList
*pktl
= s
->packet_buffer
;
644 if(st
->first_dts
!= AV_NOPTS_VALUE
){
645 cur_dts
= st
->first_dts
;
646 for(; pktl
; pktl
= pktl
->next
){
647 if(pktl
->pkt
.stream_index
== pkt
->stream_index
){
648 if(pktl
->pkt
.pts
!= pktl
->pkt
.dts
|| pktl
->pkt
.dts
!= AV_NOPTS_VALUE
|| pktl
->pkt
.duration
)
650 cur_dts
-= pkt
->duration
;
653 pktl
= s
->packet_buffer
;
654 st
->first_dts
= cur_dts
;
655 }else if(st
->cur_dts
)
658 for(; pktl
; pktl
= pktl
->next
){
659 if(pktl
->pkt
.stream_index
!= pkt
->stream_index
)
661 if(pktl
->pkt
.pts
== pktl
->pkt
.dts
&& pktl
->pkt
.dts
== AV_NOPTS_VALUE
662 && !pktl
->pkt
.duration
){
663 pktl
->pkt
.dts
= cur_dts
;
664 if(!st
->codec
->has_b_frames
)
665 pktl
->pkt
.pts
= cur_dts
;
666 cur_dts
+= pkt
->duration
;
667 pktl
->pkt
.duration
= pkt
->duration
;
671 if(st
->first_dts
== AV_NOPTS_VALUE
)
672 st
->cur_dts
= cur_dts
;
675 static void compute_pkt_fields(AVFormatContext
*s
, AVStream
*st
,
676 AVCodecParserContext
*pc
, AVPacket
*pkt
)
678 int num
, den
, presentation_delayed
, delay
, i
;
681 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->dts
> pkt
->pts
&& st
->pts_wrap_bits
<63
682 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
683 pkt
->dts
-= 1LL<<st
->pts_wrap_bits
;
686 if (pkt
->duration
== 0) {
687 compute_frame_duration(&num
, &den
, st
, pc
, pkt
);
689 pkt
->duration
= av_rescale(1, num
* (int64_t)st
->time_base
.den
, den
* (int64_t)st
->time_base
.num
);
691 if(pkt
->duration
!= 0 && s
->packet_buffer
)
692 update_initial_durations(s
, st
, pkt
);
696 /* correct timestamps with byte offset if demuxers only have timestamps
697 on packet boundaries */
698 if(pc
&& st
->need_parsing
== AVSTREAM_PARSE_TIMESTAMPS
&& pkt
->size
){
699 /* this will estimate bitrate based on this frame's duration and size */
700 offset
= av_rescale(pc
->offset
, pkt
->duration
, pkt
->size
);
701 if(pkt
->pts
!= AV_NOPTS_VALUE
)
703 if(pkt
->dts
!= AV_NOPTS_VALUE
)
707 /* do we have a video B-frame ? */
708 delay
= st
->codec
->has_b_frames
;
709 presentation_delayed
= 0;
710 /* XXX: need has_b_frame, but cannot get it if the codec is
713 pc
&& pc
->pict_type
!= FF_B_TYPE
)
714 presentation_delayed
= 1;
715 /* This may be redundant, but it should not hurt. */
716 if(pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->pts
> pkt
->dts
)
717 presentation_delayed
= 1;
719 if(st
->cur_dts
== AV_NOPTS_VALUE
){
720 st
->cur_dts
= 0; //FIXME maybe set it to 0 during init
723 // 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);
724 /* interpolate PTS and DTS if they are not present */
725 if(delay
==0 || (delay
==1 && pc
)){
726 if (presentation_delayed
) {
727 /* DTS = decompression timestamp */
728 /* PTS = presentation timestamp */
729 if (pkt
->dts
== AV_NOPTS_VALUE
)
730 pkt
->dts
= st
->last_IP_pts
;
731 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
);
732 if (pkt
->dts
== AV_NOPTS_VALUE
)
733 pkt
->dts
= st
->cur_dts
;
735 /* this is tricky: the dts must be incremented by the duration
736 of the frame we are displaying, i.e. the last I- or P-frame */
737 if (st
->last_IP_duration
== 0)
738 st
->last_IP_duration
= pkt
->duration
;
739 st
->cur_dts
= pkt
->dts
+ st
->last_IP_duration
;
740 st
->last_IP_duration
= pkt
->duration
;
741 st
->last_IP_pts
= pkt
->pts
;
742 /* cannot compute PTS if not present (we can compute it only
743 by knowing the future */
744 } else if(pkt
->pts
!= AV_NOPTS_VALUE
|| pkt
->dts
!= AV_NOPTS_VALUE
|| pkt
->duration
){
745 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->duration
){
746 int64_t old_diff
= FFABS(st
->cur_dts
- pkt
->duration
- pkt
->pts
);
747 int64_t new_diff
= FFABS(st
->cur_dts
- pkt
->pts
);
748 if(old_diff
< new_diff
&& old_diff
< (pkt
->duration
>>3)){
749 pkt
->pts
+= pkt
->duration
;
750 // 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);
754 /* presentation is not delayed : PTS and DTS are the same */
755 if(pkt
->pts
== AV_NOPTS_VALUE
)
757 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->pts
, pkt
->pts
);
758 if(pkt
->pts
== AV_NOPTS_VALUE
)
759 pkt
->pts
= st
->cur_dts
;
761 st
->cur_dts
= pkt
->pts
+ pkt
->duration
;
765 if(pkt
->pts
!= AV_NOPTS_VALUE
){
766 st
->pts_buffer
[0]= pkt
->pts
;
767 for(i
=1; i
<delay
+1 && st
->pts_buffer
[i
] == AV_NOPTS_VALUE
; i
++)
768 st
->pts_buffer
[i
]= (i
-delay
-1) * pkt
->duration
;
769 for(i
=0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+1]; i
++)
770 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+1]);
771 if(pkt
->dts
== AV_NOPTS_VALUE
)
772 pkt
->dts
= st
->pts_buffer
[0];
774 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
); // this should happen on the first packet
776 if(pkt
->dts
> st
->cur_dts
)
777 st
->cur_dts
= pkt
->dts
;
780 // 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);
783 if(is_intra_only(st
->codec
))
784 pkt
->flags
|= PKT_FLAG_KEY
;
787 /* keyframe computation */
788 if (pc
->pict_type
== FF_I_TYPE
)
789 pkt
->flags
|= PKT_FLAG_KEY
;
793 void av_destruct_packet_nofree(AVPacket
*pkt
)
795 pkt
->data
= NULL
; pkt
->size
= 0;
798 static int av_read_frame_internal(AVFormatContext
*s
, AVPacket
*pkt
)
806 /* select current input stream component */
809 if (!st
->need_parsing
|| !st
->parser
) {
810 /* no parsing needed: we just output the packet as is */
811 /* raw data support */
813 compute_pkt_fields(s
, st
, NULL
, pkt
);
816 } else if (s
->cur_len
> 0 && st
->discard
< AVDISCARD_ALL
) {
817 len
= av_parser_parse(st
->parser
, st
->codec
, &pkt
->data
, &pkt
->size
,
818 s
->cur_ptr
, s
->cur_len
,
819 s
->cur_pkt
.pts
, s
->cur_pkt
.dts
);
820 s
->cur_pkt
.pts
= AV_NOPTS_VALUE
;
821 s
->cur_pkt
.dts
= AV_NOPTS_VALUE
;
822 /* increment read pointer */
826 /* return packet if any */
829 pkt
->pos
= s
->cur_pkt
.pos
; // Isn't quite accurate but close.
831 pkt
->stream_index
= st
->index
;
832 pkt
->pts
= st
->parser
->pts
;
833 pkt
->dts
= st
->parser
->dts
;
834 pkt
->destruct
= av_destruct_packet_nofree
;
835 compute_pkt_fields(s
, st
, st
->parser
, pkt
);
837 if((s
->iformat
->flags
& AVFMT_GENERIC_INDEX
) && pkt
->flags
& PKT_FLAG_KEY
){
838 ff_reduce_index(s
, st
->index
);
839 av_add_index_entry(st
, st
->parser
->frame_offset
, pkt
->dts
,
840 0, 0, AVINDEX_KEYFRAME
);
847 av_free_packet(&s
->cur_pkt
);
851 /* read next packet */
852 ret
= av_read_packet(s
, &s
->cur_pkt
);
854 if (ret
== AVERROR(EAGAIN
))
856 /* return the last frames, if any */
857 for(i
= 0; i
< s
->nb_streams
; i
++) {
859 if (st
->parser
&& st
->need_parsing
) {
860 av_parser_parse(st
->parser
, st
->codec
,
861 &pkt
->data
, &pkt
->size
,
863 AV_NOPTS_VALUE
, AV_NOPTS_VALUE
);
868 /* no more packets: really terminate parsing */
872 if(s
->cur_pkt
.pts
!= AV_NOPTS_VALUE
&&
873 s
->cur_pkt
.dts
!= AV_NOPTS_VALUE
&&
874 s
->cur_pkt
.pts
< s
->cur_pkt
.dts
){
875 av_log(s
, AV_LOG_WARNING
, "Invalid timestamps stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d\n",
876 s
->cur_pkt
.stream_index
,
880 // av_free_packet(&s->cur_pkt);
884 st
= s
->streams
[s
->cur_pkt
.stream_index
];
885 if(s
->debug
& FF_FDEBUG_TS
)
886 av_log(s
, AV_LOG_DEBUG
, "av_read_packet stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d\n",
887 s
->cur_pkt
.stream_index
,
893 s
->cur_ptr
= s
->cur_pkt
.data
;
894 s
->cur_len
= s
->cur_pkt
.size
;
895 if (st
->need_parsing
&& !st
->parser
) {
896 st
->parser
= av_parser_init(st
->codec
->codec_id
);
898 /* no parser available: just output the raw packets */
899 st
->need_parsing
= AVSTREAM_PARSE_NONE
;
900 }else if(st
->need_parsing
== AVSTREAM_PARSE_HEADERS
){
901 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
903 if(st
->parser
&& (s
->iformat
->flags
& AVFMT_GENERIC_INDEX
)){
904 st
->parser
->next_frame_offset
=
905 st
->parser
->cur_offset
= s
->cur_pkt
.pos
;
910 if(s
->debug
& FF_FDEBUG_TS
)
911 av_log(s
, AV_LOG_DEBUG
, "av_read_frame_internal stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d\n",
920 static AVPacket
*add_to_pktbuf(AVFormatContext
*s
, AVPacket
*pkt
){
921 AVPacketList
*pktl
= s
->packet_buffer
;
922 AVPacketList
**plast_pktl
= &s
->packet_buffer
;
924 while(*plast_pktl
) plast_pktl
= &(*plast_pktl
)->next
; //FIXME maybe maintain pointer to the last?
926 pktl
= av_mallocz(sizeof(AVPacketList
));
930 /* add the packet in the buffered packet list */
936 int av_read_frame(AVFormatContext
*s
, AVPacket
*pkt
)
940 const int genpts
= s
->flags
& AVFMT_FLAG_GENPTS
;
943 pktl
= s
->packet_buffer
;
945 AVPacket
*next_pkt
= &pktl
->pkt
;
947 if(genpts
&& next_pkt
->dts
!= AV_NOPTS_VALUE
){
948 while(pktl
&& next_pkt
->pts
== AV_NOPTS_VALUE
){
949 if( pktl
->pkt
.stream_index
== next_pkt
->stream_index
950 && next_pkt
->dts
< pktl
->pkt
.dts
951 && pktl
->pkt
.pts
!= pktl
->pkt
.dts
//not b frame
952 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
953 next_pkt
->pts
= pktl
->pkt
.dts
;
957 pktl
= s
->packet_buffer
;
960 if( next_pkt
->pts
!= AV_NOPTS_VALUE
961 || next_pkt
->dts
== AV_NOPTS_VALUE
963 /* read packet from packet buffer, if there is data */
965 s
->packet_buffer
= pktl
->next
;
971 int ret
= av_read_frame_internal(s
, pkt
);
973 if(pktl
&& ret
!= AVERROR(EAGAIN
)){
980 if(av_dup_packet(add_to_pktbuf(s
, pkt
)) < 0)
981 return AVERROR(ENOMEM
);
983 assert(!s
->packet_buffer
);
984 return av_read_frame_internal(s
, pkt
);
989 /* XXX: suppress the packet queue */
990 static void flush_packet_queue(AVFormatContext
*s
)
995 pktl
= s
->packet_buffer
;
998 s
->packet_buffer
= pktl
->next
;
999 av_free_packet(&pktl
->pkt
);
1004 /*******************************************************/
1007 int av_find_default_stream_index(AVFormatContext
*s
)
1009 int first_audio_index
= -1;
1013 if (s
->nb_streams
<= 0)
1015 for(i
= 0; i
< s
->nb_streams
; i
++) {
1017 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
1020 if (first_audio_index
< 0 && st
->codec
->codec_type
== CODEC_TYPE_AUDIO
)
1021 first_audio_index
= i
;
1023 return first_audio_index
>= 0 ? first_audio_index
: 0;
1027 * Flush the frame reader.
1029 static void av_read_frame_flush(AVFormatContext
*s
)
1034 flush_packet_queue(s
);
1036 /* free previous packet */
1038 if (s
->cur_st
->parser
)
1039 av_free_packet(&s
->cur_pkt
);
1046 /* for each stream, reset read state */
1047 for(i
= 0; i
< s
->nb_streams
; i
++) {
1051 av_parser_close(st
->parser
);
1054 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1055 st
->cur_dts
= AV_NOPTS_VALUE
; /* we set the current DTS to an unspecified origin */
1059 void av_update_cur_dts(AVFormatContext
*s
, AVStream
*ref_st
, int64_t timestamp
){
1062 for(i
= 0; i
< s
->nb_streams
; i
++) {
1063 AVStream
*st
= s
->streams
[i
];
1065 st
->cur_dts
= av_rescale(timestamp
,
1066 st
->time_base
.den
* (int64_t)ref_st
->time_base
.num
,
1067 st
->time_base
.num
* (int64_t)ref_st
->time_base
.den
);
1071 void ff_reduce_index(AVFormatContext
*s
, int stream_index
)
1073 AVStream
*st
= s
->streams
[stream_index
];
1074 unsigned int max_entries
= s
->max_index_size
/ sizeof(AVIndexEntry
);
1076 if((unsigned)st
->nb_index_entries
>= max_entries
){
1078 for(i
=0; 2*i
<st
->nb_index_entries
; i
++)
1079 st
->index_entries
[i
]= st
->index_entries
[2*i
];
1080 st
->nb_index_entries
= i
;
1084 int av_add_index_entry(AVStream
*st
,
1085 int64_t pos
, int64_t timestamp
, int size
, int distance
, int flags
)
1087 AVIndexEntry
*entries
, *ie
;
1090 if((unsigned)st
->nb_index_entries
+ 1 >= UINT_MAX
/ sizeof(AVIndexEntry
))
1093 entries
= av_fast_realloc(st
->index_entries
,
1094 &st
->index_entries_allocated_size
,
1095 (st
->nb_index_entries
+ 1) *
1096 sizeof(AVIndexEntry
));
1100 st
->index_entries
= entries
;
1102 index
= av_index_search_timestamp(st
, timestamp
, AVSEEK_FLAG_ANY
);
1105 index
= st
->nb_index_entries
++;
1106 ie
= &entries
[index
];
1107 assert(index
==0 || ie
[-1].timestamp
< timestamp
);
1109 ie
= &entries
[index
];
1110 if(ie
->timestamp
!= timestamp
){
1111 if(ie
->timestamp
<= timestamp
)
1113 memmove(entries
+ index
+ 1, entries
+ index
, sizeof(AVIndexEntry
)*(st
->nb_index_entries
- index
));
1114 st
->nb_index_entries
++;
1115 }else if(ie
->pos
== pos
&& distance
< ie
->min_distance
) //do not reduce the distance
1116 distance
= ie
->min_distance
;
1120 ie
->timestamp
= timestamp
;
1121 ie
->min_distance
= distance
;
1128 int av_index_search_timestamp(AVStream
*st
, int64_t wanted_timestamp
,
1131 AVIndexEntry
*entries
= st
->index_entries
;
1132 int nb_entries
= st
->nb_index_entries
;
1141 timestamp
= entries
[m
].timestamp
;
1142 if(timestamp
>= wanted_timestamp
)
1144 if(timestamp
<= wanted_timestamp
)
1147 m
= (flags
& AVSEEK_FLAG_BACKWARD
) ? a
: b
;
1149 if(!(flags
& AVSEEK_FLAG_ANY
)){
1150 while(m
>=0 && m
<nb_entries
&& !(entries
[m
].flags
& AVINDEX_KEYFRAME
)){
1151 m
+= (flags
& AVSEEK_FLAG_BACKWARD
) ? -1 : 1;
1162 int av_seek_frame_binary(AVFormatContext
*s
, int stream_index
, int64_t target_ts
, int flags
){
1163 AVInputFormat
*avif
= s
->iformat
;
1164 int64_t pos_min
, pos_max
, pos
, pos_limit
;
1165 int64_t ts_min
, ts_max
, ts
;
1169 if (stream_index
< 0)
1173 av_log(s
, AV_LOG_DEBUG
, "read_seek: %d %"PRId64
"\n", stream_index
, target_ts
);
1177 ts_min
= AV_NOPTS_VALUE
;
1178 pos_limit
= -1; //gcc falsely says it may be uninitialized
1180 st
= s
->streams
[stream_index
];
1181 if(st
->index_entries
){
1184 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()
1185 index
= FFMAX(index
, 0);
1186 e
= &st
->index_entries
[index
];
1188 if(e
->timestamp
<= target_ts
|| e
->pos
== e
->min_distance
){
1190 ts_min
= e
->timestamp
;
1192 av_log(s
, AV_LOG_DEBUG
, "using cached pos_min=0x%"PRIx64
" dts_min=%"PRId64
"\n",
1199 index
= av_index_search_timestamp(st
, target_ts
, flags
& ~AVSEEK_FLAG_BACKWARD
);
1200 assert(index
< st
->nb_index_entries
);
1202 e
= &st
->index_entries
[index
];
1203 assert(e
->timestamp
>= target_ts
);
1205 ts_max
= e
->timestamp
;
1206 pos_limit
= pos_max
- e
->min_distance
;
1208 av_log(s
, AV_LOG_DEBUG
, "using cached pos_max=0x%"PRIx64
" pos_limit=0x%"PRIx64
" dts_max=%"PRId64
"\n",
1209 pos_max
,pos_limit
, ts_max
);
1214 pos
= av_gen_search(s
, stream_index
, target_ts
, pos_min
, pos_max
, pos_limit
, ts_min
, ts_max
, flags
, &ts
, avif
->read_timestamp
);
1219 url_fseek(s
->pb
, pos
, SEEK_SET
);
1221 av_update_cur_dts(s
, st
, ts
);
1226 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 )){
1228 int64_t start_pos
, filesize
;
1232 av_log(s
, AV_LOG_DEBUG
, "gen_seek: %d %"PRId64
"\n", stream_index
, target_ts
);
1235 if(ts_min
== AV_NOPTS_VALUE
){
1236 pos_min
= s
->data_offset
;
1237 ts_min
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1238 if (ts_min
== AV_NOPTS_VALUE
)
1242 if(ts_max
== AV_NOPTS_VALUE
){
1244 filesize
= url_fsize(s
->pb
);
1245 pos_max
= filesize
- 1;
1248 ts_max
= read_timestamp(s
, stream_index
, &pos_max
, pos_max
+ step
);
1250 }while(ts_max
== AV_NOPTS_VALUE
&& pos_max
>= step
);
1251 if (ts_max
== AV_NOPTS_VALUE
)
1255 int64_t tmp_pos
= pos_max
+ 1;
1256 int64_t tmp_ts
= read_timestamp(s
, stream_index
, &tmp_pos
, INT64_MAX
);
1257 if(tmp_ts
== AV_NOPTS_VALUE
)
1261 if(tmp_pos
>= filesize
)
1267 if(ts_min
> ts_max
){
1269 }else if(ts_min
== ts_max
){
1274 while (pos_min
< pos_limit
) {
1276 av_log(s
, AV_LOG_DEBUG
, "pos_min=0x%"PRIx64
" pos_max=0x%"PRIx64
" dts_min=%"PRId64
" dts_max=%"PRId64
"\n",
1280 assert(pos_limit
<= pos_max
);
1283 int64_t approximate_keyframe_distance
= pos_max
- pos_limit
;
1284 // interpolate position (better than dichotomy)
1285 pos
= av_rescale(target_ts
- ts_min
, pos_max
- pos_min
, ts_max
- ts_min
)
1286 + pos_min
- approximate_keyframe_distance
;
1287 }else if(no_change
==1){
1288 // bisection, if interpolation failed to change min or max pos last time
1289 pos
= (pos_min
+ pos_limit
)>>1;
1291 /* linear search if bisection failed, can only happen if there
1292 are very few or no keyframes between min/max */
1297 else if(pos
> pos_limit
)
1301 ts
= read_timestamp(s
, stream_index
, &pos
, INT64_MAX
); //may pass pos_limit instead of -1
1307 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
);
1309 if(ts
== AV_NOPTS_VALUE
){
1310 av_log(s
, AV_LOG_ERROR
, "read_timestamp() failed in the middle\n");
1313 assert(ts
!= AV_NOPTS_VALUE
);
1314 if (target_ts
<= ts
) {
1315 pos_limit
= start_pos
- 1;
1319 if (target_ts
>= ts
) {
1325 pos
= (flags
& AVSEEK_FLAG_BACKWARD
) ? pos_min
: pos_max
;
1326 ts
= (flags
& AVSEEK_FLAG_BACKWARD
) ? ts_min
: ts_max
;
1329 ts_min
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1331 ts_max
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1332 av_log(s
, AV_LOG_DEBUG
, "pos=0x%"PRIx64
" %"PRId64
"<=%"PRId64
"<=%"PRId64
"\n",
1333 pos
, ts_min
, target_ts
, ts_max
);
1339 static int av_seek_frame_byte(AVFormatContext
*s
, int stream_index
, int64_t pos
, int flags
){
1340 int64_t pos_min
, pos_max
;
1344 if (stream_index
< 0)
1347 st
= s
->streams
[stream_index
];
1350 pos_min
= s
->data_offset
;
1351 pos_max
= url_fsize(s
->pb
) - 1;
1353 if (pos
< pos_min
) pos
= pos_min
;
1354 else if(pos
> pos_max
) pos
= pos_max
;
1356 url_fseek(s
->pb
, pos
, SEEK_SET
);
1359 av_update_cur_dts(s
, st
, ts
);
1364 static int av_seek_frame_generic(AVFormatContext
*s
,
1365 int stream_index
, int64_t timestamp
, int flags
)
1371 st
= s
->streams
[stream_index
];
1373 index
= av_index_search_timestamp(st
, timestamp
, flags
);
1375 if(index
< 0 || index
==st
->nb_index_entries
-1){
1379 if(st
->nb_index_entries
){
1380 assert(st
->index_entries
);
1381 ie
= &st
->index_entries
[st
->nb_index_entries
-1];
1382 url_fseek(s
->pb
, ie
->pos
, SEEK_SET
);
1383 av_update_cur_dts(s
, st
, ie
->timestamp
);
1385 url_fseek(s
->pb
, 0, SEEK_SET
);
1388 int ret
= av_read_frame(s
, &pkt
);
1391 av_free_packet(&pkt
);
1392 if(stream_index
== pkt
.stream_index
){
1393 if((pkt
.flags
& PKT_FLAG_KEY
) && pkt
.dts
> timestamp
)
1397 index
= av_index_search_timestamp(st
, timestamp
, flags
);
1402 av_read_frame_flush(s
);
1403 if (s
->iformat
->read_seek
){
1404 if(s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
) >= 0)
1407 ie
= &st
->index_entries
[index
];
1408 url_fseek(s
->pb
, ie
->pos
, SEEK_SET
);
1410 av_update_cur_dts(s
, st
, ie
->timestamp
);
1415 int av_seek_frame(AVFormatContext
*s
, int stream_index
, int64_t timestamp
, int flags
)
1420 av_read_frame_flush(s
);
1422 if(flags
& AVSEEK_FLAG_BYTE
)
1423 return av_seek_frame_byte(s
, stream_index
, timestamp
, flags
);
1425 if(stream_index
< 0){
1426 stream_index
= av_find_default_stream_index(s
);
1427 if(stream_index
< 0)
1430 st
= s
->streams
[stream_index
];
1431 /* timestamp for default must be expressed in AV_TIME_BASE units */
1432 timestamp
= av_rescale(timestamp
, st
->time_base
.den
, AV_TIME_BASE
* (int64_t)st
->time_base
.num
);
1434 st
= s
->streams
[stream_index
];
1436 /* first, we try the format specific seek */
1437 if (s
->iformat
->read_seek
)
1438 ret
= s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
);
1445 if(s
->iformat
->read_timestamp
)
1446 return av_seek_frame_binary(s
, stream_index
, timestamp
, flags
);
1448 return av_seek_frame_generic(s
, stream_index
, timestamp
, flags
);
1451 /*******************************************************/
1454 * Returns TRUE if the stream has accurate duration in any stream.
1456 * @return TRUE if the stream has accurate duration for at least one component.
1458 static int av_has_duration(AVFormatContext
*ic
)
1463 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1464 st
= ic
->streams
[i
];
1465 if (st
->duration
!= AV_NOPTS_VALUE
)
1472 * Estimate the stream timings from the one of each components.
1474 * Also computes the global bitrate if possible.
1476 static void av_update_stream_timings(AVFormatContext
*ic
)
1478 int64_t start_time
, start_time1
, end_time
, end_time1
;
1479 int64_t duration
, duration1
;
1483 start_time
= INT64_MAX
;
1484 end_time
= INT64_MIN
;
1485 duration
= INT64_MIN
;
1486 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1487 st
= ic
->streams
[i
];
1488 if (st
->start_time
!= AV_NOPTS_VALUE
&& st
->time_base
.den
) {
1489 start_time1
= av_rescale_q(st
->start_time
, st
->time_base
, AV_TIME_BASE_Q
);
1490 if (start_time1
< start_time
)
1491 start_time
= start_time1
;
1492 if (st
->duration
!= AV_NOPTS_VALUE
) {
1493 end_time1
= start_time1
1494 + av_rescale_q(st
->duration
, st
->time_base
, AV_TIME_BASE_Q
);
1495 if (end_time1
> end_time
)
1496 end_time
= end_time1
;
1499 if (st
->duration
!= AV_NOPTS_VALUE
) {
1500 duration1
= av_rescale_q(st
->duration
, st
->time_base
, AV_TIME_BASE_Q
);
1501 if (duration1
> duration
)
1502 duration
= duration1
;
1505 if (start_time
!= INT64_MAX
) {
1506 ic
->start_time
= start_time
;
1507 if (end_time
!= INT64_MIN
) {
1508 if (end_time
- start_time
> duration
)
1509 duration
= end_time
- start_time
;
1512 if (duration
!= INT64_MIN
) {
1513 ic
->duration
= duration
;
1514 if (ic
->file_size
> 0) {
1515 /* compute the bitrate */
1516 ic
->bit_rate
= (double)ic
->file_size
* 8.0 * AV_TIME_BASE
/
1517 (double)ic
->duration
;
1522 static void fill_all_stream_timings(AVFormatContext
*ic
)
1527 av_update_stream_timings(ic
);
1528 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1529 st
= ic
->streams
[i
];
1530 if (st
->start_time
== AV_NOPTS_VALUE
) {
1531 if(ic
->start_time
!= AV_NOPTS_VALUE
)
1532 st
->start_time
= av_rescale_q(ic
->start_time
, AV_TIME_BASE_Q
, st
->time_base
);
1533 if(ic
->duration
!= AV_NOPTS_VALUE
)
1534 st
->duration
= av_rescale_q(ic
->duration
, AV_TIME_BASE_Q
, st
->time_base
);
1539 static void av_estimate_timings_from_bit_rate(AVFormatContext
*ic
)
1541 int64_t filesize
, duration
;
1545 /* if bit_rate is already set, we believe it */
1546 if (ic
->bit_rate
== 0) {
1548 for(i
=0;i
<ic
->nb_streams
;i
++) {
1549 st
= ic
->streams
[i
];
1550 bit_rate
+= st
->codec
->bit_rate
;
1552 ic
->bit_rate
= bit_rate
;
1555 /* if duration is already set, we believe it */
1556 if (ic
->duration
== AV_NOPTS_VALUE
&&
1557 ic
->bit_rate
!= 0 &&
1558 ic
->file_size
!= 0) {
1559 filesize
= ic
->file_size
;
1561 for(i
= 0; i
< ic
->nb_streams
; i
++) {
1562 st
= ic
->streams
[i
];
1563 duration
= av_rescale(8*filesize
, st
->time_base
.den
, ic
->bit_rate
*(int64_t)st
->time_base
.num
);
1564 if (st
->duration
== AV_NOPTS_VALUE
)
1565 st
->duration
= duration
;
1571 #define DURATION_MAX_READ_SIZE 250000
1573 /* only usable for MPEG-PS streams */
1574 static void av_estimate_timings_from_pts(AVFormatContext
*ic
, offset_t old_offset
)
1576 AVPacket pkt1
, *pkt
= &pkt1
;
1578 int read_size
, i
, ret
;
1580 int64_t filesize
, offset
, duration
;
1582 /* free previous packet */
1583 if (ic
->cur_st
&& ic
->cur_st
->parser
)
1584 av_free_packet(&ic
->cur_pkt
);
1587 /* flush packet queue */
1588 flush_packet_queue(ic
);
1590 for(i
=0;i
<ic
->nb_streams
;i
++) {
1591 st
= ic
->streams
[i
];
1593 av_parser_close(st
->parser
);
1598 /* we read the first packets to get the first PTS (not fully
1599 accurate, but it is enough now) */
1600 url_fseek(ic
->pb
, 0, SEEK_SET
);
1603 if (read_size
>= DURATION_MAX_READ_SIZE
)
1605 /* if all info is available, we can stop */
1606 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1607 st
= ic
->streams
[i
];
1608 if (st
->start_time
== AV_NOPTS_VALUE
)
1611 if (i
== ic
->nb_streams
)
1614 ret
= av_read_packet(ic
, pkt
);
1617 read_size
+= pkt
->size
;
1618 st
= ic
->streams
[pkt
->stream_index
];
1619 if (pkt
->pts
!= AV_NOPTS_VALUE
) {
1620 if (st
->start_time
== AV_NOPTS_VALUE
)
1621 st
->start_time
= pkt
->pts
;
1623 av_free_packet(pkt
);
1626 /* estimate the end time (duration) */
1627 /* XXX: may need to support wrapping */
1628 filesize
= ic
->file_size
;
1629 offset
= filesize
- DURATION_MAX_READ_SIZE
;
1633 url_fseek(ic
->pb
, offset
, SEEK_SET
);
1636 if (read_size
>= DURATION_MAX_READ_SIZE
)
1639 ret
= av_read_packet(ic
, pkt
);
1642 read_size
+= pkt
->size
;
1643 st
= ic
->streams
[pkt
->stream_index
];
1644 if (pkt
->pts
!= AV_NOPTS_VALUE
&&
1645 st
->start_time
!= AV_NOPTS_VALUE
) {
1646 end_time
= pkt
->pts
;
1647 duration
= end_time
- st
->start_time
;
1649 if (st
->duration
== AV_NOPTS_VALUE
||
1650 st
->duration
< duration
)
1651 st
->duration
= duration
;
1654 av_free_packet(pkt
);
1657 fill_all_stream_timings(ic
);
1659 url_fseek(ic
->pb
, old_offset
, SEEK_SET
);
1660 for(i
=0; i
<ic
->nb_streams
; i
++){
1662 st
->cur_dts
= st
->first_dts
;
1663 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1667 static void av_estimate_timings(AVFormatContext
*ic
, offset_t old_offset
)
1671 /* get the file size, if possible */
1672 if (ic
->iformat
->flags
& AVFMT_NOFILE
) {
1675 file_size
= url_fsize(ic
->pb
);
1679 ic
->file_size
= file_size
;
1681 if ((!strcmp(ic
->iformat
->name
, "mpeg") ||
1682 !strcmp(ic
->iformat
->name
, "mpegts")) &&
1683 file_size
&& !url_is_streamed(ic
->pb
)) {
1684 /* get accurate estimate from the PTSes */
1685 av_estimate_timings_from_pts(ic
, old_offset
);
1686 } else if (av_has_duration(ic
)) {
1687 /* at least one component has timings - we use them for all
1689 fill_all_stream_timings(ic
);
1691 /* less precise: use bitrate info */
1692 av_estimate_timings_from_bit_rate(ic
);
1694 av_update_stream_timings(ic
);
1700 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1701 st
= ic
->streams
[i
];
1702 printf("%d: start_time: %0.3f duration: %0.3f\n",
1703 i
, (double)st
->start_time
/ AV_TIME_BASE
,
1704 (double)st
->duration
/ AV_TIME_BASE
);
1706 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1707 (double)ic
->start_time
/ AV_TIME_BASE
,
1708 (double)ic
->duration
/ AV_TIME_BASE
,
1709 ic
->bit_rate
/ 1000);
1714 static int has_codec_parameters(AVCodecContext
*enc
)
1717 switch(enc
->codec_type
) {
1718 case CODEC_TYPE_AUDIO
:
1719 val
= enc
->sample_rate
&& enc
->channels
;
1721 case CODEC_TYPE_VIDEO
:
1722 val
= enc
->width
&& enc
->pix_fmt
!= PIX_FMT_NONE
;
1728 return enc
->codec_id
!= CODEC_ID_NONE
&& val
!= 0;
1731 static int try_decode_frame(AVStream
*st
, const uint8_t *data
, int size
)
1735 int got_picture
, data_size
, ret
=0;
1738 if(!st
->codec
->codec
){
1739 codec
= avcodec_find_decoder(st
->codec
->codec_id
);
1742 ret
= avcodec_open(st
->codec
, codec
);
1747 if(!has_codec_parameters(st
->codec
)){
1748 switch(st
->codec
->codec_type
) {
1749 case CODEC_TYPE_VIDEO
:
1750 ret
= avcodec_decode_video(st
->codec
, &picture
,
1751 &got_picture
, data
, size
);
1753 case CODEC_TYPE_AUDIO
:
1754 data_size
= FFMAX(size
, AVCODEC_MAX_AUDIO_FRAME_SIZE
);
1755 samples
= av_malloc(data_size
);
1758 ret
= avcodec_decode_audio2(st
->codec
, samples
,
1759 &data_size
, data
, size
);
1770 static int set_codec_from_probe_data(AVStream
*st
, AVProbeData
*pd
, int score
)
1773 fmt
= av_probe_input_format2(pd
, 1, &score
);
1776 if (strncmp(fmt
->name
, "mp3", 3) == 0)
1777 st
->codec
->codec_id
= CODEC_ID_MP3
;
1778 else if (strncmp(fmt
->name
, "ac3", 3) == 0)
1779 st
->codec
->codec_id
= CODEC_ID_AC3
;
1784 unsigned int codec_get_tag(const AVCodecTag
*tags
, int id
)
1786 while (tags
->id
!= CODEC_ID_NONE
) {
1794 enum CodecID
codec_get_id(const AVCodecTag
*tags
, unsigned int tag
)
1797 for(i
=0; tags
[i
].id
!= CODEC_ID_NONE
;i
++) {
1798 if(tag
== tags
[i
].tag
)
1801 for(i
=0; tags
[i
].id
!= CODEC_ID_NONE
; i
++) {
1802 if( toupper((tag
>> 0)&0xFF) == toupper((tags
[i
].tag
>> 0)&0xFF)
1803 && toupper((tag
>> 8)&0xFF) == toupper((tags
[i
].tag
>> 8)&0xFF)
1804 && toupper((tag
>>16)&0xFF) == toupper((tags
[i
].tag
>>16)&0xFF)
1805 && toupper((tag
>>24)&0xFF) == toupper((tags
[i
].tag
>>24)&0xFF))
1808 return CODEC_ID_NONE
;
1811 unsigned int av_codec_get_tag(const AVCodecTag
*tags
[4], enum CodecID id
)
1814 for(i
=0; tags
&& tags
[i
]; i
++){
1815 int tag
= codec_get_tag(tags
[i
], id
);
1821 enum CodecID
av_codec_get_id(const AVCodecTag
*tags
[4], unsigned int tag
)
1824 for(i
=0; tags
&& tags
[i
]; i
++){
1825 enum CodecID id
= codec_get_id(tags
[i
], tag
);
1826 if(id
!=CODEC_ID_NONE
) return id
;
1828 return CODEC_ID_NONE
;
1831 static void compute_chapters_end(AVFormatContext
*s
)
1835 for (i
=0; i
+1<s
->nb_chapters
; i
++)
1836 if (s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
1837 assert(s
->chapters
[i
]->start
<= s
->chapters
[i
+1]->start
);
1838 assert(!av_cmp_q(s
->chapters
[i
]->time_base
, s
->chapters
[i
+1]->time_base
));
1839 s
->chapters
[i
]->end
= s
->chapters
[i
+1]->start
;
1842 if (s
->nb_chapters
&& s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
1843 assert(s
->start_time
!= AV_NOPTS_VALUE
);
1844 assert(s
->duration
> 0);
1845 s
->chapters
[i
]->end
= av_rescale_q(s
->start_time
+ s
->duration
,
1847 s
->chapters
[i
]->time_base
);
1851 /* absolute maximum size we read until we abort */
1852 #define MAX_READ_SIZE 5000000
1854 #define MAX_STD_TIMEBASES (60*12+5)
1855 static int get_std_framerate(int i
){
1856 if(i
<60*12) return i
*1001;
1857 else return ((int[]){24,30,60,12,15})[i
-60*12]*1000*12;
1861 * Is the time base unreliable.
1862 * This is a heuristic to balance between quick acceptance of the values in
1863 * the headers vs. some extra checks.
1864 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
1865 * MPEG-2 commonly misuses field repeat flags to store different framerates.
1866 * And there are "variable" fps files this needs to detect as well.
1868 static int tb_unreliable(AVCodecContext
*c
){
1869 if( c
->time_base
.den
>= 101L*c
->time_base
.num
1870 || c
->time_base
.den
< 5L*c
->time_base
.num
1871 /* || c->codec_tag == ff_get_fourcc("DIVX")
1872 || c->codec_tag == ff_get_fourcc("XVID")*/
1873 || c
->codec_id
== CODEC_ID_MPEG2VIDEO
)
1878 int av_find_stream_info(AVFormatContext
*ic
)
1880 int i
, count
, ret
, read_size
, j
;
1882 AVPacket pkt1
, *pkt
;
1883 int64_t last_dts
[MAX_STREAMS
];
1884 int duration_count
[MAX_STREAMS
]={0};
1885 double (*duration_error
)[MAX_STD_TIMEBASES
];
1886 offset_t old_offset
= url_ftell(ic
->pb
);
1887 int64_t codec_info_duration
[MAX_STREAMS
]={0};
1888 int codec_info_nb_frames
[MAX_STREAMS
]={0};
1889 AVProbeData probe_data
[MAX_STREAMS
];
1890 int codec_identified
[MAX_STREAMS
]={0};
1892 duration_error
= av_mallocz(MAX_STREAMS
* sizeof(*duration_error
));
1893 if (!duration_error
) return AVERROR(ENOMEM
);
1895 for(i
=0;i
<ic
->nb_streams
;i
++) {
1896 st
= ic
->streams
[i
];
1897 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
){
1898 /* if(!st->time_base.num)
1900 if(!st
->codec
->time_base
.num
)
1901 st
->codec
->time_base
= st
->time_base
;
1903 //only for the split stuff
1905 st
->parser
= av_parser_init(st
->codec
->codec_id
);
1906 if(st
->need_parsing
== AVSTREAM_PARSE_HEADERS
&& st
->parser
){
1907 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
1912 for(i
=0;i
<MAX_STREAMS
;i
++){
1913 last_dts
[i
]= AV_NOPTS_VALUE
;
1916 memset(probe_data
, 0, sizeof(probe_data
));
1920 /* check if one codec still needs to be handled */
1921 for(i
=0;i
<ic
->nb_streams
;i
++) {
1922 st
= ic
->streams
[i
];
1923 if (!has_codec_parameters(st
->codec
))
1925 /* variable fps and no guess at the real fps */
1926 if( tb_unreliable(st
->codec
)
1927 && duration_count
[i
]<20 && st
->codec
->codec_type
== CODEC_TYPE_VIDEO
)
1929 if(st
->parser
&& st
->parser
->parser
->split
&& !st
->codec
->extradata
)
1931 if(st
->first_dts
== AV_NOPTS_VALUE
)
1934 if (i
== ic
->nb_streams
) {
1935 /* NOTE: if the format has no header, then we need to read
1936 some packets to get most of the streams, so we cannot
1938 if (!(ic
->ctx_flags
& AVFMTCTX_NOHEADER
)) {
1939 /* if we found the info for all the codecs, we can stop */
1944 /* we did not get all the codec info, but we read too much data */
1945 if (read_size
>= MAX_READ_SIZE
) {
1950 /* NOTE: a new stream can be added there if no header in file
1951 (AVFMTCTX_NOHEADER) */
1952 ret
= av_read_frame_internal(ic
, &pkt1
);
1955 ret
= -1; /* we could not have all the codec parameters before EOF */
1956 for(i
=0;i
<ic
->nb_streams
;i
++) {
1957 st
= ic
->streams
[i
];
1958 if (!has_codec_parameters(st
->codec
)){
1960 avcodec_string(buf
, sizeof(buf
), st
->codec
, 0);
1961 av_log(ic
, AV_LOG_INFO
, "Could not find codec parameters (%s)\n", buf
);
1969 pkt
= add_to_pktbuf(ic
, &pkt1
);
1970 if(av_dup_packet(pkt
) < 0)
1971 return AVERROR(ENOMEM
);
1973 read_size
+= pkt
->size
;
1975 st
= ic
->streams
[pkt
->stream_index
];
1976 if(codec_info_nb_frames
[st
->index
]>1)
1977 codec_info_duration
[st
->index
] += pkt
->duration
;
1978 if (pkt
->duration
!= 0)
1979 codec_info_nb_frames
[st
->index
]++;
1982 int index
= pkt
->stream_index
;
1983 int64_t last
= last_dts
[index
];
1984 int64_t duration
= pkt
->dts
- last
;
1986 if(pkt
->dts
!= AV_NOPTS_VALUE
&& last
!= AV_NOPTS_VALUE
&& duration
>0){
1987 double dur
= duration
* av_q2d(st
->time_base
);
1989 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
1990 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
1991 if(duration_count
[index
] < 2)
1992 memset(duration_error
[index
], 0, sizeof(*duration_error
));
1993 for(i
=1; i
<MAX_STD_TIMEBASES
; i
++){
1994 int framerate
= get_std_framerate(i
);
1995 int ticks
= lrintf(dur
*framerate
/(1001*12));
1996 double error
= dur
- ticks
*1001*12/(double)framerate
;
1997 duration_error
[index
][i
] += error
*error
;
1999 duration_count
[index
]++;
2001 if(last
== AV_NOPTS_VALUE
|| duration_count
[index
]<=1)
2002 last_dts
[pkt
->stream_index
]= pkt
->dts
;
2004 if (st
->codec
->codec_id
== CODEC_ID_NONE
) {
2005 AVProbeData
*pd
= &(probe_data
[st
->index
]);
2006 pd
->buf
= av_realloc(pd
->buf
, pd
->buf_size
+pkt
->size
+AVPROBE_PADDING_SIZE
);
2007 memcpy(pd
->buf
+pd
->buf_size
, pkt
->data
, pkt
->size
);
2008 pd
->buf_size
+= pkt
->size
;
2009 memset(pd
->buf
+pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
2012 if(st
->parser
&& st
->parser
->parser
->split
&& !st
->codec
->extradata
){
2013 int i
= st
->parser
->parser
->split(st
->codec
, pkt
->data
, pkt
->size
);
2015 st
->codec
->extradata_size
= i
;
2016 st
->codec
->extradata
= av_malloc(st
->codec
->extradata_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
2017 memcpy(st
->codec
->extradata
, pkt
->data
, st
->codec
->extradata_size
);
2018 memset(st
->codec
->extradata
+ i
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
2022 /* if still no information, we try to open the codec and to
2023 decompress the frame. We try to avoid that in most cases as
2024 it takes longer and uses more memory. For MPEG-4, we need to
2025 decompress for QuickTime. */
2026 if (!has_codec_parameters(st
->codec
) /*&&
2027 (st->codec->codec_id == CODEC_ID_FLV1 ||
2028 st->codec->codec_id == CODEC_ID_H264 ||
2029 st->codec->codec_id == CODEC_ID_H263 ||
2030 st->codec->codec_id == CODEC_ID_H261 ||
2031 st->codec->codec_id == CODEC_ID_VORBIS ||
2032 st->codec->codec_id == CODEC_ID_MJPEG ||
2033 st->codec->codec_id == CODEC_ID_PNG ||
2034 st->codec->codec_id == CODEC_ID_PAM ||
2035 st->codec->codec_id == CODEC_ID_PGM ||
2036 st->codec->codec_id == CODEC_ID_PGMYUV ||
2037 st->codec->codec_id == CODEC_ID_PBM ||
2038 st->codec->codec_id == CODEC_ID_PPM ||
2039 st->codec->codec_id == CODEC_ID_SHORTEN ||
2040 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2041 try_decode_frame(st
, pkt
->data
, pkt
->size
);
2043 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
) {
2049 // close codecs which were opened in try_decode_frame()
2050 for(i
=0;i
<ic
->nb_streams
;i
++) {
2051 st
= ic
->streams
[i
];
2052 if(st
->codec
->codec
)
2053 avcodec_close(st
->codec
);
2055 for(i
=0;i
<ic
->nb_streams
;i
++) {
2056 st
= ic
->streams
[i
];
2057 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
2058 if(st
->codec
->codec_id
== CODEC_ID_RAWVIDEO
&& !st
->codec
->codec_tag
&& !st
->codec
->bits_per_sample
)
2059 st
->codec
->codec_tag
= avcodec_pix_fmt_to_codec_tag(st
->codec
->pix_fmt
);
2061 if(duration_count
[i
]
2062 && tb_unreliable(st
->codec
) /*&&
2063 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2064 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2065 double best_error
= 2*av_q2d(st
->time_base
);
2066 best_error
= best_error
*best_error
*duration_count
[i
]*1000*12*30;
2068 for(j
=1; j
<MAX_STD_TIMEBASES
; j
++){
2069 double error
= duration_error
[i
][j
] * get_std_framerate(j
);
2070 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2071 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2072 if(error
< best_error
){
2074 av_reduce(&st
->r_frame_rate
.num
, &st
->r_frame_rate
.den
, get_std_framerate(j
), 12*1001, INT_MAX
);
2079 if (!st
->r_frame_rate
.num
){
2080 if( st
->codec
->time_base
.den
* (int64_t)st
->time_base
.num
2081 <= st
->codec
->time_base
.num
* (int64_t)st
->time_base
.den
){
2082 st
->r_frame_rate
.num
= st
->codec
->time_base
.den
;
2083 st
->r_frame_rate
.den
= st
->codec
->time_base
.num
;
2085 st
->r_frame_rate
.num
= st
->time_base
.den
;
2086 st
->r_frame_rate
.den
= st
->time_base
.num
;
2089 }else if(st
->codec
->codec_type
== CODEC_TYPE_AUDIO
) {
2090 if (st
->codec
->codec_id
== CODEC_ID_NONE
&& probe_data
[st
->index
].buf_size
> 0) {
2091 codec_identified
[st
->index
] = set_codec_from_probe_data(st
, &(probe_data
[st
->index
]), 1);
2092 if (codec_identified
[st
->index
]) {
2093 st
->need_parsing
= AVSTREAM_PARSE_FULL
;
2096 if(!st
->codec
->bits_per_sample
)
2097 st
->codec
->bits_per_sample
= av_get_bits_per_sample(st
->codec
->codec_id
);
2101 av_estimate_timings(ic
, old_offset
);
2103 for(i
=0;i
<ic
->nb_streams
;i
++) {
2104 st
= ic
->streams
[i
];
2105 if (codec_identified
[st
->index
])
2108 //FIXME this is a mess
2109 if(i
!=ic
->nb_streams
){
2110 av_read_frame_flush(ic
);
2111 for(i
=0;i
<ic
->nb_streams
;i
++) {
2112 st
= ic
->streams
[i
];
2113 if (codec_identified
[st
->index
]) {
2114 av_seek_frame(ic
, st
->index
, 0.0, 0);
2116 st
->cur_dts
= st
->first_dts
;
2118 url_fseek(ic
->pb
, ic
->data_offset
, SEEK_SET
);
2121 compute_chapters_end(ic
);
2124 /* correct DTS for B-frame streams with no timestamps */
2125 for(i
=0;i
<ic
->nb_streams
;i
++) {
2126 st
= ic
->streams
[i
];
2127 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
2129 ppktl
= &ic
->packet_buffer
;
2131 if(ppkt1
->stream_index
!= i
)
2133 if(ppkt1
->pkt
->dts
< 0)
2135 if(ppkt1
->pkt
->pts
!= AV_NOPTS_VALUE
)
2137 ppkt1
->pkt
->dts
-= delta
;
2142 st
->cur_dts
-= delta
;
2148 av_free(duration_error
);
2149 for(i
=0;i
<MAX_STREAMS
;i
++){
2150 av_freep(&(probe_data
[i
].buf
));
2156 /*******************************************************/
2158 int av_read_play(AVFormatContext
*s
)
2160 if (s
->iformat
->read_play
)
2161 return s
->iformat
->read_play(s
);
2163 return av_url_read_fpause(s
->pb
, 0);
2164 return AVERROR(ENOSYS
);
2167 int av_read_pause(AVFormatContext
*s
)
2169 if (s
->iformat
->read_pause
)
2170 return s
->iformat
->read_pause(s
);
2172 return av_url_read_fpause(s
->pb
, 1);
2173 return AVERROR(ENOSYS
);
2176 void av_close_input_stream(AVFormatContext
*s
)
2181 /* free previous packet */
2182 if (s
->cur_st
&& s
->cur_st
->parser
)
2183 av_free_packet(&s
->cur_pkt
);
2185 if (s
->iformat
->read_close
)
2186 s
->iformat
->read_close(s
);
2187 for(i
=0;i
<s
->nb_streams
;i
++) {
2188 /* free all data in a stream component */
2191 av_parser_close(st
->parser
);
2193 av_free(st
->index_entries
);
2194 av_free(st
->codec
->extradata
);
2196 av_free(st
->filename
);
2199 for(i
=s
->nb_programs
-1; i
>=0; i
--) {
2200 av_freep(&s
->programs
[i
]->provider_name
);
2201 av_freep(&s
->programs
[i
]->name
);
2202 av_freep(&s
->programs
[i
]->stream_index
);
2203 av_freep(&s
->programs
[i
]);
2205 av_freep(&s
->programs
);
2206 flush_packet_queue(s
);
2207 av_freep(&s
->priv_data
);
2208 while(s
->nb_chapters
--) {
2209 av_free(s
->chapters
[s
->nb_chapters
]->title
);
2210 av_free(s
->chapters
[s
->nb_chapters
]);
2212 av_freep(&s
->chapters
);
2216 void av_close_input_file(AVFormatContext
*s
)
2218 ByteIOContext
*pb
= s
->iformat
->flags
& AVFMT_NOFILE
? NULL
: s
->pb
;
2219 av_close_input_stream(s
);
2224 AVStream
*av_new_stream(AVFormatContext
*s
, int id
)
2229 if (s
->nb_streams
>= MAX_STREAMS
)
2232 st
= av_mallocz(sizeof(AVStream
));
2236 st
->codec
= avcodec_alloc_context();
2238 /* no default bitrate if decoding */
2239 st
->codec
->bit_rate
= 0;
2241 st
->index
= s
->nb_streams
;
2243 st
->start_time
= AV_NOPTS_VALUE
;
2244 st
->duration
= AV_NOPTS_VALUE
;
2245 st
->cur_dts
= AV_NOPTS_VALUE
;
2246 st
->first_dts
= AV_NOPTS_VALUE
;
2248 /* default pts setting is MPEG-like */
2249 av_set_pts_info(st
, 33, 1, 90000);
2250 st
->last_IP_pts
= AV_NOPTS_VALUE
;
2251 for(i
=0; i
<MAX_REORDER_DELAY
+1; i
++)
2252 st
->pts_buffer
[i
]= AV_NOPTS_VALUE
;
2254 s
->streams
[s
->nb_streams
++] = st
;
2258 AVProgram
*av_new_program(AVFormatContext
*ac
, int id
)
2260 AVProgram
*program
=NULL
;
2264 av_log(ac
, AV_LOG_DEBUG
, "new_program: id=0x%04x\n", id
);
2267 for(i
=0; i
<ac
->nb_programs
; i
++)
2268 if(ac
->programs
[i
]->id
== id
)
2269 program
= ac
->programs
[i
];
2272 program
= av_mallocz(sizeof(AVProgram
));
2275 dynarray_add(&ac
->programs
, &ac
->nb_programs
, program
);
2276 program
->discard
= AVDISCARD_NONE
;
2283 void av_set_program_name(AVProgram
*program
, char *provider_name
, char *name
)
2285 assert(!provider_name
== !name
);
2287 av_free(program
->provider_name
);
2288 av_free(program
-> name
);
2289 program
->provider_name
= av_strdup(provider_name
);
2290 program
-> name
= av_strdup( name
);
2294 AVChapter
*ff_new_chapter(AVFormatContext
*s
, int id
, AVRational time_base
, int64_t start
, int64_t end
, const char *title
)
2296 AVChapter
*chapter
= NULL
;
2299 for(i
=0; i
<s
->nb_chapters
; i
++)
2300 if(s
->chapters
[i
]->id
== id
)
2301 chapter
= s
->chapters
[i
];
2304 chapter
= av_mallocz(sizeof(AVChapter
));
2307 dynarray_add(&s
->chapters
, &s
->nb_chapters
, chapter
);
2309 av_free(chapter
->title
);
2310 chapter
->title
= av_strdup(title
);
2312 chapter
->time_base
= time_base
;
2313 chapter
->start
= start
;
2319 /************************************************************/
2320 /* output media file */
2322 int av_set_parameters(AVFormatContext
*s
, AVFormatParameters
*ap
)
2326 if (s
->oformat
->priv_data_size
> 0) {
2327 s
->priv_data
= av_mallocz(s
->oformat
->priv_data_size
);
2329 return AVERROR(ENOMEM
);
2331 s
->priv_data
= NULL
;
2333 if (s
->oformat
->set_parameters
) {
2334 ret
= s
->oformat
->set_parameters(s
, ap
);
2341 int av_write_header(AVFormatContext
*s
)
2346 // some sanity checks
2347 for(i
=0;i
<s
->nb_streams
;i
++) {
2350 switch (st
->codec
->codec_type
) {
2351 case CODEC_TYPE_AUDIO
:
2352 if(st
->codec
->sample_rate
<=0){
2353 av_log(s
, AV_LOG_ERROR
, "sample rate not set\n");
2357 case CODEC_TYPE_VIDEO
:
2358 if(st
->codec
->time_base
.num
<=0 || st
->codec
->time_base
.den
<=0){ //FIXME audio too?
2359 av_log(s
, AV_LOG_ERROR
, "time base not set\n");
2362 if(st
->codec
->width
<=0 || st
->codec
->height
<=0){
2363 av_log(s
, AV_LOG_ERROR
, "dimensions not set\n");
2369 if(s
->oformat
->codec_tag
){
2370 if(st
->codec
->codec_tag
){
2372 //check that tag + id is in the table
2373 //if neither is in the table -> OK
2374 //if tag is in the table with another id -> FAIL
2375 //if id is in the table with another tag -> FAIL unless strict < ?
2377 st
->codec
->codec_tag
= av_codec_get_tag(s
->oformat
->codec_tag
, st
->codec
->codec_id
);
2381 if (!s
->priv_data
&& s
->oformat
->priv_data_size
> 0) {
2382 s
->priv_data
= av_mallocz(s
->oformat
->priv_data_size
);
2384 return AVERROR(ENOMEM
);
2387 if(s
->oformat
->write_header
){
2388 ret
= s
->oformat
->write_header(s
);
2393 /* init PTS generation */
2394 for(i
=0;i
<s
->nb_streams
;i
++) {
2395 int64_t den
= AV_NOPTS_VALUE
;
2398 switch (st
->codec
->codec_type
) {
2399 case CODEC_TYPE_AUDIO
:
2400 den
= (int64_t)st
->time_base
.num
* st
->codec
->sample_rate
;
2402 case CODEC_TYPE_VIDEO
:
2403 den
= (int64_t)st
->time_base
.num
* st
->codec
->time_base
.den
;
2408 if (den
!= AV_NOPTS_VALUE
) {
2410 return AVERROR_INVALIDDATA
;
2411 av_frac_init(&st
->pts
, 0, 0, den
);
2417 //FIXME merge with compute_pkt_fields
2418 static int compute_pkt_fields2(AVStream
*st
, AVPacket
*pkt
){
2419 int delay
= FFMAX(st
->codec
->has_b_frames
, !!st
->codec
->max_b_frames
);
2420 int num
, den
, frame_size
, i
;
2422 // 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);
2424 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2427 /* duration field */
2428 if (pkt
->duration
== 0) {
2429 compute_frame_duration(&num
, &den
, st
, NULL
, pkt
);
2431 pkt
->duration
= av_rescale(1, num
* (int64_t)st
->time_base
.den
, den
* (int64_t)st
->time_base
.num
);
2435 //XXX/FIXME this is a temporary hack until all encoders output pts
2436 if((pkt
->pts
== 0 || pkt
->pts
== AV_NOPTS_VALUE
) && pkt
->dts
== AV_NOPTS_VALUE
&& !delay
){
2438 // pkt->pts= st->cur_dts;
2439 pkt
->pts
= st
->pts
.val
;
2442 //calculate dts from pts
2443 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
== AV_NOPTS_VALUE
){
2444 st
->pts_buffer
[0]= pkt
->pts
;
2445 for(i
=1; i
<delay
+1 && st
->pts_buffer
[i
] == AV_NOPTS_VALUE
; i
++)
2446 st
->pts_buffer
[i
]= (i
-delay
-1) * pkt
->duration
;
2447 for(i
=0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+1]; i
++)
2448 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+1]);
2450 pkt
->dts
= st
->pts_buffer
[0];
2453 if(st
->cur_dts
&& st
->cur_dts
!= AV_NOPTS_VALUE
&& st
->cur_dts
>= pkt
->dts
){
2454 av_log(NULL
, AV_LOG_ERROR
, "error, non monotone timestamps %"PRId64
" >= %"PRId64
"\n", st
->cur_dts
, pkt
->dts
);
2457 if(pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->pts
< pkt
->dts
){
2458 av_log(NULL
, AV_LOG_ERROR
, "error, pts < dts\n");
2462 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2463 st
->cur_dts
= pkt
->dts
;
2464 st
->pts
.val
= pkt
->dts
;
2467 switch (st
->codec
->codec_type
) {
2468 case CODEC_TYPE_AUDIO
:
2469 frame_size
= get_audio_frame_size(st
->codec
, pkt
->size
);
2471 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2472 likely equal to the encoder delay, but it would be better if we
2473 had the real timestamps from the encoder */
2474 if (frame_size
>= 0 && (pkt
->size
|| st
->pts
.num
!=st
->pts
.den
>>1 || st
->pts
.val
)) {
2475 av_frac_add(&st
->pts
, (int64_t)st
->time_base
.den
* frame_size
);
2478 case CODEC_TYPE_VIDEO
:
2479 av_frac_add(&st
->pts
, (int64_t)st
->time_base
.den
* st
->codec
->time_base
.num
);
2487 static void truncate_ts(AVStream
*st
, AVPacket
*pkt
){
2488 int64_t pts_mask
= (2LL << (st
->pts_wrap_bits
-1)) - 1;
2491 // pkt->dts= 0; //this happens for low_delay=0 and B-frames, FIXME, needs further investigation about what we should do here
2493 if (pkt
->pts
!= AV_NOPTS_VALUE
)
2494 pkt
->pts
&= pts_mask
;
2495 if (pkt
->dts
!= AV_NOPTS_VALUE
)
2496 pkt
->dts
&= pts_mask
;
2499 int av_write_frame(AVFormatContext
*s
, AVPacket
*pkt
)
2501 int ret
= compute_pkt_fields2(s
->streams
[pkt
->stream_index
], pkt
);
2503 if(ret
<0 && !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2506 truncate_ts(s
->streams
[pkt
->stream_index
], pkt
);
2508 ret
= s
->oformat
->write_packet(s
, pkt
);
2510 ret
= url_ferror(s
->pb
);
2514 int av_interleave_packet_per_dts(AVFormatContext
*s
, AVPacket
*out
, AVPacket
*pkt
, int flush
){
2515 AVPacketList
*pktl
, **next_point
, *this_pktl
;
2517 int streams
[MAX_STREAMS
];
2520 AVStream
*st
= s
->streams
[ pkt
->stream_index
];
2522 // assert(pkt->destruct != av_destruct_packet); //FIXME
2524 this_pktl
= av_mallocz(sizeof(AVPacketList
));
2525 this_pktl
->pkt
= *pkt
;
2526 if(pkt
->destruct
== av_destruct_packet
)
2527 pkt
->destruct
= NULL
; // not shared -> must keep original from being freed
2529 av_dup_packet(&this_pktl
->pkt
); //shared -> must dup
2531 next_point
= &s
->packet_buffer
;
2533 AVStream
*st2
= s
->streams
[ (*next_point
)->pkt
.stream_index
];
2534 int64_t left
= st2
->time_base
.num
* (int64_t)st
->time_base
.den
;
2535 int64_t right
= st
->time_base
.num
* (int64_t)st2
->time_base
.den
;
2536 if((*next_point
)->pkt
.dts
* left
> pkt
->dts
* right
) //FIXME this can overflow
2538 next_point
= &(*next_point
)->next
;
2540 this_pktl
->next
= *next_point
;
2541 *next_point
= this_pktl
;
2544 memset(streams
, 0, sizeof(streams
));
2545 pktl
= s
->packet_buffer
;
2547 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2548 if(streams
[ pktl
->pkt
.stream_index
] == 0)
2550 streams
[ pktl
->pkt
.stream_index
]++;
2554 if(s
->nb_streams
== stream_count
|| (flush
&& stream_count
)){
2555 pktl
= s
->packet_buffer
;
2558 s
->packet_buffer
= pktl
->next
;
2562 av_init_packet(out
);
2568 * Interleaves an AVPacket correctly so it can be muxed.
2569 * @param out the interleaved packet will be output here
2570 * @param in the input packet
2571 * @param flush 1 if no further packets are available as input and all
2572 * remaining packets should be output
2573 * @return 1 if a packet was output, 0 if no packet could be output,
2574 * < 0 if an error occurred
2576 static int av_interleave_packet(AVFormatContext
*s
, AVPacket
*out
, AVPacket
*in
, int flush
){
2577 if(s
->oformat
->interleave_packet
)
2578 return s
->oformat
->interleave_packet(s
, out
, in
, flush
);
2580 return av_interleave_packet_per_dts(s
, out
, in
, flush
);
2583 int av_interleaved_write_frame(AVFormatContext
*s
, AVPacket
*pkt
){
2584 AVStream
*st
= s
->streams
[ pkt
->stream_index
];
2586 //FIXME/XXX/HACK drop zero sized packets
2587 if(st
->codec
->codec_type
== CODEC_TYPE_AUDIO
&& pkt
->size
==0)
2590 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2591 if(compute_pkt_fields2(st
, pkt
) < 0 && !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2594 if(pkt
->dts
== AV_NOPTS_VALUE
)
2599 int ret
= av_interleave_packet(s
, &opkt
, pkt
, 0);
2600 if(ret
<=0) //FIXME cleanup needed for ret<0 ?
2603 truncate_ts(s
->streams
[opkt
.stream_index
], &opkt
);
2604 ret
= s
->oformat
->write_packet(s
, &opkt
);
2606 av_free_packet(&opkt
);
2611 if(url_ferror(s
->pb
))
2612 return url_ferror(s
->pb
);
2616 int av_write_trailer(AVFormatContext
*s
)
2622 ret
= av_interleave_packet(s
, &pkt
, NULL
, 1);
2623 if(ret
<0) //FIXME cleanup needed for ret<0 ?
2628 truncate_ts(s
->streams
[pkt
.stream_index
], &pkt
);
2629 ret
= s
->oformat
->write_packet(s
, &pkt
);
2631 av_free_packet(&pkt
);
2635 if(url_ferror(s
->pb
))
2639 if(s
->oformat
->write_trailer
)
2640 ret
= s
->oformat
->write_trailer(s
);
2643 ret
=url_ferror(s
->pb
);
2644 for(i
=0;i
<s
->nb_streams
;i
++)
2645 av_freep(&s
->streams
[i
]->priv_data
);
2646 av_freep(&s
->priv_data
);
2650 void av_program_add_stream_index(AVFormatContext
*ac
, int progid
, unsigned int idx
)
2653 AVProgram
*program
=NULL
;
2656 for(i
=0; i
<ac
->nb_programs
; i
++){
2657 if(ac
->programs
[i
]->id
!= progid
)
2659 program
= ac
->programs
[i
];
2660 for(j
=0; j
<program
->nb_stream_indexes
; j
++)
2661 if(program
->stream_index
[j
] == idx
)
2664 tmp
= av_realloc(program
->stream_index
, sizeof(unsigned int)*(program
->nb_stream_indexes
+1));
2667 program
->stream_index
= tmp
;
2668 program
->stream_index
[program
->nb_stream_indexes
++] = idx
;
2673 /* "user interface" functions */
2674 static void dump_stream_format(AVFormatContext
*ic
, int i
, int index
, int is_output
)
2677 int flags
= (is_output
? ic
->oformat
->flags
: ic
->iformat
->flags
);
2678 AVStream
*st
= ic
->streams
[i
];
2679 int g
= ff_gcd(st
->time_base
.num
, st
->time_base
.den
);
2680 avcodec_string(buf
, sizeof(buf
), st
->codec
, is_output
);
2681 av_log(NULL
, AV_LOG_INFO
, " Stream #%d.%d", index
, i
);
2682 /* the pid is an important information, so we display it */
2683 /* XXX: add a generic system */
2684 if (flags
& AVFMT_SHOW_IDS
)
2685 av_log(NULL
, AV_LOG_INFO
, "[0x%x]", st
->id
);
2686 if (strlen(st
->language
) > 0)
2687 av_log(NULL
, AV_LOG_INFO
, "(%s)", st
->language
);
2688 av_log(NULL
, AV_LOG_DEBUG
, ", %d/%d", st
->time_base
.num
/g
, st
->time_base
.den
/g
);
2689 av_log(NULL
, AV_LOG_INFO
, ": %s", buf
);
2690 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
){
2691 if(st
->r_frame_rate
.den
&& st
->r_frame_rate
.num
)
2692 av_log(NULL
, AV_LOG_INFO
, ", %5.2f tb(r)", av_q2d(st
->r_frame_rate
));
2693 /* else if(st->time_base.den && st->time_base.num)
2694 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(m)", 1/av_q2d(st->time_base));*/
2696 av_log(NULL
, AV_LOG_INFO
, ", %5.2f tb(c)", 1/av_q2d(st
->codec
->time_base
));
2698 av_log(NULL
, AV_LOG_INFO
, "\n");
2701 void dump_format(AVFormatContext
*ic
,
2708 av_log(NULL
, AV_LOG_INFO
, "%s #%d, %s, %s '%s':\n",
2709 is_output
? "Output" : "Input",
2711 is_output
? ic
->oformat
->name
: ic
->iformat
->name
,
2712 is_output
? "to" : "from", url
);
2714 av_log(NULL
, AV_LOG_INFO
, " Duration: ");
2715 if (ic
->duration
!= AV_NOPTS_VALUE
) {
2716 int hours
, mins
, secs
, us
;
2717 secs
= ic
->duration
/ AV_TIME_BASE
;
2718 us
= ic
->duration
% AV_TIME_BASE
;
2723 av_log(NULL
, AV_LOG_INFO
, "%02d:%02d:%02d.%02d", hours
, mins
, secs
,
2724 (100 * us
) / AV_TIME_BASE
);
2726 av_log(NULL
, AV_LOG_INFO
, "N/A");
2728 if (ic
->start_time
!= AV_NOPTS_VALUE
) {
2730 av_log(NULL
, AV_LOG_INFO
, ", start: ");
2731 secs
= ic
->start_time
/ AV_TIME_BASE
;
2732 us
= ic
->start_time
% AV_TIME_BASE
;
2733 av_log(NULL
, AV_LOG_INFO
, "%d.%06d",
2734 secs
, (int)av_rescale(us
, 1000000, AV_TIME_BASE
));
2736 av_log(NULL
, AV_LOG_INFO
, ", bitrate: ");
2738 av_log(NULL
, AV_LOG_INFO
,"%d kb/s", ic
->bit_rate
/ 1000);
2740 av_log(NULL
, AV_LOG_INFO
, "N/A");
2742 av_log(NULL
, AV_LOG_INFO
, "\n");
2744 if(ic
->nb_programs
) {
2746 for(j
=0; j
<ic
->nb_programs
; j
++) {
2747 av_log(NULL
, AV_LOG_INFO
, " Program %d %s\n", ic
->programs
[j
]->id
,
2748 ic
->programs
[j
]->name
? ic
->programs
[j
]->name
: "");
2749 for(k
=0; k
<ic
->programs
[j
]->nb_stream_indexes
; k
++)
2750 dump_stream_format(ic
, ic
->programs
[j
]->stream_index
[k
], index
, is_output
);
2753 for(i
=0;i
<ic
->nb_streams
;i
++)
2754 dump_stream_format(ic
, i
, index
, is_output
);
2757 int parse_image_size(int *width_ptr
, int *height_ptr
, const char *str
)
2759 return av_parse_video_frame_size(width_ptr
, height_ptr
, str
);
2762 int parse_frame_rate(int *frame_rate_num
, int *frame_rate_den
, const char *arg
)
2764 AVRational frame_rate
;
2765 int ret
= av_parse_video_frame_rate(&frame_rate
, arg
);
2766 *frame_rate_num
= frame_rate
.num
;
2767 *frame_rate_den
= frame_rate
.den
;
2772 * Gets the current time in microseconds.
2774 int64_t av_gettime(void)
2777 gettimeofday(&tv
,NULL
);
2778 return (int64_t)tv
.tv_sec
* 1000000 + tv
.tv_usec
;
2781 int64_t parse_date(const char *datestr
, int duration
)
2787 static const char *date_fmt
[] = {
2791 static const char *time_fmt
[] = {
2801 time_t now
= time(0);
2803 len
= strlen(datestr
);
2805 lastch
= datestr
[len
- 1];
2808 is_utc
= (lastch
== 'z' || lastch
== 'Z');
2810 memset(&dt
, 0, sizeof(dt
));
2815 /* parse the year-month-day part */
2816 for (i
= 0; i
< sizeof(date_fmt
) / sizeof(date_fmt
[0]); i
++) {
2817 q
= small_strptime(p
, date_fmt
[i
], &dt
);
2823 /* if the year-month-day part is missing, then take the
2824 * current year-month-day time */
2829 dt
= *localtime(&now
);
2831 dt
.tm_hour
= dt
.tm_min
= dt
.tm_sec
= 0;
2836 if (*p
== 'T' || *p
== 't' || *p
== ' ')
2839 /* parse the hour-minute-second part */
2840 for (i
= 0; i
< sizeof(time_fmt
) / sizeof(time_fmt
[0]); i
++) {
2841 q
= small_strptime(p
, time_fmt
[i
], &dt
);
2847 /* parse datestr as a duration */
2852 /* parse datestr as HH:MM:SS */
2853 q
= small_strptime(p
, time_fmt
[0], &dt
);
2855 /* parse datestr as S+ */
2856 dt
.tm_sec
= strtol(p
, (char **)&q
, 10);
2858 /* the parsing didn't succeed */
2865 /* Now we have all the fields that we can get */
2871 t
= dt
.tm_hour
* 3600 + dt
.tm_min
* 60 + dt
.tm_sec
;
2873 dt
.tm_isdst
= -1; /* unknown */
2883 /* parse the .m... part */
2887 for (val
= 0, n
= 100000; n
>= 1; n
/= 10, q
++) {
2890 val
+= n
* (*q
- '0');
2894 return negative
? -t
: t
;
2897 int find_info_tag(char *arg
, int arg_size
, const char *tag1
, const char *info
)
2907 while (*p
!= '\0' && *p
!= '=' && *p
!= '&') {
2908 if ((q
- tag
) < sizeof(tag
) - 1)
2916 while (*p
!= '&' && *p
!= '\0') {
2917 if ((q
- arg
) < arg_size
- 1) {
2927 if (!strcmp(tag
, tag1
))
2936 int av_get_frame_filename(char *buf
, int buf_size
,
2937 const char *path
, int number
)
2940 char *q
, buf1
[20], c
;
2941 int nd
, len
, percentd_found
;
2953 while (isdigit(*p
)) {
2954 nd
= nd
* 10 + *p
++ - '0';
2957 } while (isdigit(c
));
2966 snprintf(buf1
, sizeof(buf1
), "%0*d", nd
, number
);
2968 if ((q
- buf
+ len
) > buf_size
- 1)
2970 memcpy(q
, buf1
, len
);
2978 if ((q
- buf
) < buf_size
- 1)
2982 if (!percentd_found
)
2991 static void hex_dump_internal(void *avcl
, FILE *f
, int level
, uint8_t *buf
, int size
)
2994 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
2996 for(i
=0;i
<size
;i
+=16) {
3003 PRINT(" %02x", buf
[i
+j
]);
3008 for(j
=0;j
<len
;j
++) {
3010 if (c
< ' ' || c
> '~')
3019 void av_hex_dump(FILE *f
, uint8_t *buf
, int size
)
3021 hex_dump_internal(NULL
, f
, 0, buf
, size
);
3024 void av_hex_dump_log(void *avcl
, int level
, uint8_t *buf
, int size
)
3026 hex_dump_internal(avcl
, NULL
, level
, buf
, size
);
3029 //FIXME needs to know the time_base
3030 static void pkt_dump_internal(void *avcl
, FILE *f
, int level
, AVPacket
*pkt
, int dump_payload
)
3032 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3033 PRINT("stream #%d:\n", pkt
->stream_index
);
3034 PRINT(" keyframe=%d\n", ((pkt
->flags
& PKT_FLAG_KEY
) != 0));
3035 PRINT(" duration=%0.3f\n", (double)pkt
->duration
/ AV_TIME_BASE
);
3036 /* DTS is _always_ valid after av_read_frame() */
3038 if (pkt
->dts
== AV_NOPTS_VALUE
)
3041 PRINT("%0.3f", (double)pkt
->dts
/ AV_TIME_BASE
);
3042 /* PTS may not be known if B-frames are present. */
3044 if (pkt
->pts
== AV_NOPTS_VALUE
)
3047 PRINT("%0.3f", (double)pkt
->pts
/ AV_TIME_BASE
);
3049 PRINT(" size=%d\n", pkt
->size
);
3052 av_hex_dump(f
, pkt
->data
, pkt
->size
);
3055 void av_pkt_dump(FILE *f
, AVPacket
*pkt
, int dump_payload
)
3057 pkt_dump_internal(NULL
, f
, 0, pkt
, dump_payload
);
3060 void av_pkt_dump_log(void *avcl
, int level
, AVPacket
*pkt
, int dump_payload
)
3062 pkt_dump_internal(avcl
, NULL
, level
, pkt
, dump_payload
);
3065 void url_split(char *proto
, int proto_size
,
3066 char *authorization
, int authorization_size
,
3067 char *hostname
, int hostname_size
,
3069 char *path
, int path_size
,
3072 const char *p
, *ls
, *at
, *col
, *brk
;
3074 if (port_ptr
) *port_ptr
= -1;
3075 if (proto_size
> 0) proto
[0] = 0;
3076 if (authorization_size
> 0) authorization
[0] = 0;
3077 if (hostname_size
> 0) hostname
[0] = 0;
3078 if (path_size
> 0) path
[0] = 0;
3080 /* parse protocol */
3081 if ((p
= strchr(url
, ':'))) {
3082 av_strlcpy(proto
, url
, FFMIN(proto_size
, p
+ 1 - url
));
3087 /* no protocol means plain filename */
3088 av_strlcpy(path
, url
, path_size
);
3092 /* separate path from hostname */
3093 ls
= strchr(p
, '/');
3095 ls
= strchr(p
, '?');
3097 av_strlcpy(path
, ls
, path_size
);
3099 ls
= &p
[strlen(p
)]; // XXX
3101 /* the rest is hostname, use that to parse auth/port */
3103 /* authorization (user[:pass]@hostname) */
3104 if ((at
= strchr(p
, '@')) && at
< ls
) {
3105 av_strlcpy(authorization
, p
,
3106 FFMIN(authorization_size
, at
+ 1 - p
));
3107 p
= at
+ 1; /* skip '@' */
3110 if (*p
== '[' && (brk
= strchr(p
, ']')) && brk
< ls
) {
3112 av_strlcpy(hostname
, p
+ 1,
3113 FFMIN(hostname_size
, brk
- p
));
3114 if (brk
[1] == ':' && port_ptr
)
3115 *port_ptr
= atoi(brk
+ 2);
3116 } else if ((col
= strchr(p
, ':')) && col
< ls
) {
3117 av_strlcpy(hostname
, p
,
3118 FFMIN(col
+ 1 - p
, hostname_size
));
3119 if (port_ptr
) *port_ptr
= atoi(col
+ 1);
3121 av_strlcpy(hostname
, p
,
3122 FFMIN(ls
+ 1 - p
, hostname_size
));
3126 void av_set_pts_info(AVStream
*s
, int pts_wrap_bits
,
3127 int pts_num
, int pts_den
)
3129 s
->pts_wrap_bits
= pts_wrap_bits
;
3130 s
->time_base
.num
= pts_num
;
3131 s
->time_base
.den
= pts_den
;
3134 /* fraction handling */
3137 * f = val + (num / den) + 0.5.
3139 * 'num' is normalized so that it is such as 0 <= num < den.
3141 * @param f fractional number
3142 * @param val integer value
3143 * @param num must be >= 0
3144 * @param den must be >= 1
3146 static void av_frac_init(AVFrac
*f
, int64_t val
, int64_t num
, int64_t den
)
3159 * Fractional addition to f: f = f + (incr / f->den).
3161 * @param f fractional number
3162 * @param incr increment, can be positive or negative
3164 static void av_frac_add(AVFrac
*f
, int64_t incr
)
3168 num
= f
->num
+ incr
;
3171 f
->val
+= num
/ den
;
3177 } else if (num
>= den
) {
3178 f
->val
+= num
/ den
;