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 static int set_codec_from_probe_data(AVStream
*st
, AVProbeData
*pd
, int score
)
299 fmt
= av_probe_input_format2(pd
, 1, &score
);
302 if (!strcmp(fmt
->name
, "mp3"))
303 st
->codec
->codec_id
= CODEC_ID_MP3
;
304 else if (!strcmp(fmt
->name
, "ac3"))
305 st
->codec
->codec_id
= CODEC_ID_AC3
;
306 else if (!strcmp(fmt
->name
, "mpegvideo"))
307 st
->codec
->codec_id
= CODEC_ID_MPEG2VIDEO
;
308 else if (!strcmp(fmt
->name
, "h264"))
309 st
->codec
->codec_id
= CODEC_ID_H264
;
314 /************************************************************/
315 /* input media file */
318 * Open a media file from an IO stream. 'fmt' must be specified.
320 static const char* format_to_name(void* ptr
)
322 AVFormatContext
* fc
= (AVFormatContext
*) ptr
;
323 if(fc
->iformat
) return fc
->iformat
->name
;
324 else if(fc
->oformat
) return fc
->oformat
->name
;
328 #define OFFSET(x) offsetof(AVFormatContext,x)
329 #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
330 //these names are too long to be readable
331 #define E AV_OPT_FLAG_ENCODING_PARAM
332 #define D AV_OPT_FLAG_DECODING_PARAM
334 static const AVOption options
[]={
335 {"probesize", NULL
, OFFSET(probesize
), FF_OPT_TYPE_INT
, 32000, 32, INT_MAX
, D
}, /* 32000 from mpegts.c: 1.0 second at 24Mbit/s */
336 {"muxrate", "set mux rate", OFFSET(mux_rate
), FF_OPT_TYPE_INT
, DEFAULT
, 0, INT_MAX
, E
},
337 {"packetsize", "set packet size", OFFSET(packet_size
), FF_OPT_TYPE_INT
, DEFAULT
, 0, INT_MAX
, E
},
338 {"fflags", NULL
, OFFSET(flags
), FF_OPT_TYPE_FLAGS
, DEFAULT
, INT_MIN
, INT_MAX
, D
|E
, "fflags"},
339 {"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST
, AVFMT_FLAG_IGNIDX
, INT_MIN
, INT_MAX
, D
, "fflags"},
340 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST
, AVFMT_FLAG_GENPTS
, INT_MIN
, INT_MAX
, D
, "fflags"},
341 {"track", " set the track number", OFFSET(track
), FF_OPT_TYPE_INT
, DEFAULT
, 0, INT_MAX
, E
},
342 {"year", "set the year", OFFSET(year
), FF_OPT_TYPE_INT
, DEFAULT
, INT_MIN
, INT_MAX
, E
},
343 {"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
},
344 {"cryptokey", "decryption key", OFFSET(key
), FF_OPT_TYPE_BINARY
, 0, 0, 0, D
},
345 {"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size
), FF_OPT_TYPE_INT
, 1<<20, 0, INT_MAX
, D
},
346 {"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 */
347 {"fdebug", "print specific debug info", OFFSET(debug
), FF_OPT_TYPE_FLAGS
, DEFAULT
, 0, INT_MAX
, E
|D
, "fdebug"},
348 {"ts", NULL
, 0, FF_OPT_TYPE_CONST
, FF_FDEBUG_TS
, INT_MIN
, INT_MAX
, E
|D
, "fdebug"},
356 static const AVClass av_format_context_class
= { "AVFormatContext", format_to_name
, options
};
358 static void avformat_get_context_defaults(AVFormatContext
*s
)
360 memset(s
, 0, sizeof(AVFormatContext
));
362 s
->av_class
= &av_format_context_class
;
364 av_opt_set_defaults(s
);
367 AVFormatContext
*av_alloc_format_context(void)
370 ic
= av_malloc(sizeof(AVFormatContext
));
372 avformat_get_context_defaults(ic
);
373 ic
->av_class
= &av_format_context_class
;
377 int av_open_input_stream(AVFormatContext
**ic_ptr
,
378 ByteIOContext
*pb
, const char *filename
,
379 AVInputFormat
*fmt
, AVFormatParameters
*ap
)
383 AVFormatParameters default_ap
;
387 memset(ap
, 0, sizeof(default_ap
));
390 if(!ap
->prealloced_context
)
391 ic
= av_alloc_format_context();
395 err
= AVERROR(ENOMEM
);
400 ic
->duration
= AV_NOPTS_VALUE
;
401 ic
->start_time
= AV_NOPTS_VALUE
;
402 av_strlcpy(ic
->filename
, filename
, sizeof(ic
->filename
));
404 /* allocate private data */
405 if (fmt
->priv_data_size
> 0) {
406 ic
->priv_data
= av_mallocz(fmt
->priv_data_size
);
407 if (!ic
->priv_data
) {
408 err
= AVERROR(ENOMEM
);
412 ic
->priv_data
= NULL
;
415 if (ic
->iformat
->read_header
) {
416 err
= ic
->iformat
->read_header(ic
, ap
);
421 if (pb
&& !ic
->data_offset
)
422 ic
->data_offset
= url_ftell(ic
->pb
);
429 av_freep(&ic
->priv_data
);
430 for(i
=0;i
<ic
->nb_streams
;i
++) {
431 AVStream
*st
= ic
->streams
[i
];
433 av_free(st
->priv_data
);
434 av_free(st
->codec
->extradata
);
444 /** size of probe buffer, for guessing file type from file contents */
445 #define PROBE_BUF_MIN 2048
446 #define PROBE_BUF_MAX (1<<20)
448 int av_open_input_file(AVFormatContext
**ic_ptr
, const char *filename
,
451 AVFormatParameters
*ap
)
454 AVProbeData probe_data
, *pd
= &probe_data
;
455 ByteIOContext
*pb
= NULL
;
459 pd
->filename
= filename
;
464 /* guess format if no file can be opened */
465 fmt
= av_probe_input_format(pd
, 0);
468 /* Do not open file if the format does not need it. XXX: specific
469 hack needed to handle RTSP/TCP */
470 if (!fmt
|| !(fmt
->flags
& AVFMT_NOFILE
)) {
471 /* if no file needed do not try to open one */
472 if ((err
=url_fopen(&pb
, filename
, URL_RDONLY
)) < 0) {
476 url_setbufsize(pb
, buf_size
);
479 for(probe_size
= PROBE_BUF_MIN
; probe_size
<=PROBE_BUF_MAX
&& !fmt
; probe_size
<<=1){
480 int score
= probe_size
< PROBE_BUF_MAX
? AVPROBE_SCORE_MAX
/4 : 0;
481 /* read probe data */
482 pd
->buf
= av_realloc(pd
->buf
, probe_size
+ AVPROBE_PADDING_SIZE
);
483 pd
->buf_size
= get_buffer(pb
, pd
->buf
, probe_size
);
484 memset(pd
->buf
+pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
485 if (url_fseek(pb
, 0, SEEK_SET
) < 0) {
487 if (url_fopen(&pb
, filename
, URL_RDONLY
) < 0) {
493 /* guess file format */
494 fmt
= av_probe_input_format2(pd
, 1, &score
);
499 /* if still no format found, error */
505 /* check filename in case an image number is expected */
506 if (fmt
->flags
& AVFMT_NEEDNUMBER
) {
507 if (!av_filename_number_test(filename
)) {
508 err
= AVERROR_NUMEXPECTED
;
512 err
= av_open_input_stream(ic_ptr
, pb
, filename
, fmt
, ap
);
525 /*******************************************************/
527 static AVPacket
*add_to_pktbuf(AVPacketList
**packet_buffer
, AVPacket
*pkt
){
529 AVPacketList
**plast_pktl
= packet_buffer
;
531 while(*plast_pktl
) plast_pktl
= &(*plast_pktl
)->next
; //FIXME maybe maintain pointer to the last?
533 pktl
= av_mallocz(sizeof(AVPacketList
));
537 /* add the packet in the buffered packet list */
543 int av_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
549 AVPacketList
*pktl
= s
->raw_packet_buffer
;
553 if(s
->streams
[pkt
->stream_index
]->codec
->codec_id
!= CODEC_ID_PROBE
){
554 s
->raw_packet_buffer
= pktl
->next
;
561 ret
= s
->iformat
->read_packet(s
, pkt
);
564 st
= s
->streams
[pkt
->stream_index
];
566 switch(st
->codec
->codec_type
){
567 case CODEC_TYPE_VIDEO
:
568 if(s
->video_codec_id
) st
->codec
->codec_id
= s
->video_codec_id
;
570 case CODEC_TYPE_AUDIO
:
571 if(s
->audio_codec_id
) st
->codec
->codec_id
= s
->audio_codec_id
;
573 case CODEC_TYPE_SUBTITLE
:
574 if(s
->subtitle_codec_id
)st
->codec
->codec_id
= s
->subtitle_codec_id
;
578 if(!pktl
&& st
->codec
->codec_id
!=CODEC_ID_PROBE
)
581 add_to_pktbuf(&s
->raw_packet_buffer
, pkt
);
583 if(st
->codec
->codec_id
== CODEC_ID_PROBE
){
584 AVProbeData
*pd
= &st
->probe_data
;
586 pd
->buf
= av_realloc(pd
->buf
, pd
->buf_size
+pkt
->size
+AVPROBE_PADDING_SIZE
);
587 memcpy(pd
->buf
+pd
->buf_size
, pkt
->data
, pkt
->size
);
588 pd
->buf_size
+= pkt
->size
;
589 memset(pd
->buf
+pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
591 if(av_log2(pd
->buf_size
) != av_log2(pd
->buf_size
- pkt
->size
)){
592 set_codec_from_probe_data(st
, pd
, 1);
593 if(st
->codec
->codec_id
!= CODEC_ID_PROBE
){
602 /**********************************************************/
605 * Get the number of samples of an audio frame. Return -1 on error.
607 static int get_audio_frame_size(AVCodecContext
*enc
, int size
)
611 if(enc
->codec_id
== CODEC_ID_VORBIS
)
614 if (enc
->frame_size
<= 1) {
615 int bits_per_sample
= av_get_bits_per_sample(enc
->codec_id
);
617 if (bits_per_sample
) {
618 if (enc
->channels
== 0)
620 frame_size
= (size
<< 3) / (bits_per_sample
* enc
->channels
);
622 /* used for example by ADPCM codecs */
623 if (enc
->bit_rate
== 0)
625 frame_size
= (size
* 8 * enc
->sample_rate
) / enc
->bit_rate
;
628 frame_size
= enc
->frame_size
;
635 * Return the frame duration in seconds. Return 0 if not available.
637 static void compute_frame_duration(int *pnum
, int *pden
, AVStream
*st
,
638 AVCodecParserContext
*pc
, AVPacket
*pkt
)
644 switch(st
->codec
->codec_type
) {
645 case CODEC_TYPE_VIDEO
:
646 if(st
->time_base
.num
*1000LL > st
->time_base
.den
){
647 *pnum
= st
->time_base
.num
;
648 *pden
= st
->time_base
.den
;
649 }else if(st
->codec
->time_base
.num
*1000LL > st
->codec
->time_base
.den
){
650 *pnum
= st
->codec
->time_base
.num
;
651 *pden
= st
->codec
->time_base
.den
;
652 if (pc
&& pc
->repeat_pict
) {
654 *pnum
= (*pnum
) * (2 + pc
->repeat_pict
);
658 case CODEC_TYPE_AUDIO
:
659 frame_size
= get_audio_frame_size(st
->codec
, pkt
->size
);
663 *pden
= st
->codec
->sample_rate
;
670 static int is_intra_only(AVCodecContext
*enc
){
671 if(enc
->codec_type
== CODEC_TYPE_AUDIO
){
673 }else if(enc
->codec_type
== CODEC_TYPE_VIDEO
){
674 switch(enc
->codec_id
){
676 case CODEC_ID_MJPEGB
:
678 case CODEC_ID_RAWVIDEO
:
679 case CODEC_ID_DVVIDEO
:
680 case CODEC_ID_HUFFYUV
:
681 case CODEC_ID_FFVHUFF
:
692 static void update_initial_timestamps(AVFormatContext
*s
, int stream_index
,
693 int64_t dts
, int64_t pts
)
695 AVStream
*st
= s
->streams
[stream_index
];
696 AVPacketList
*pktl
= s
->packet_buffer
;
698 if(st
->first_dts
!= AV_NOPTS_VALUE
|| dts
== AV_NOPTS_VALUE
|| st
->cur_dts
== AV_NOPTS_VALUE
)
701 st
->first_dts
= dts
- st
->cur_dts
;
704 for(; pktl
; pktl
= pktl
->next
){
705 if(pktl
->pkt
.stream_index
!= stream_index
)
707 //FIXME think more about this check
708 if(pktl
->pkt
.pts
!= AV_NOPTS_VALUE
&& pktl
->pkt
.pts
== pktl
->pkt
.dts
)
709 pktl
->pkt
.pts
+= st
->first_dts
;
711 if(pktl
->pkt
.dts
!= AV_NOPTS_VALUE
)
712 pktl
->pkt
.dts
+= st
->first_dts
;
714 if(st
->start_time
== AV_NOPTS_VALUE
&& pktl
->pkt
.pts
!= AV_NOPTS_VALUE
)
715 st
->start_time
= pktl
->pkt
.pts
;
717 if (st
->start_time
== AV_NOPTS_VALUE
)
718 st
->start_time
= pts
;
721 static void update_initial_durations(AVFormatContext
*s
, AVStream
*st
, AVPacket
*pkt
)
723 AVPacketList
*pktl
= s
->packet_buffer
;
726 if(st
->first_dts
!= AV_NOPTS_VALUE
){
727 cur_dts
= st
->first_dts
;
728 for(; pktl
; pktl
= pktl
->next
){
729 if(pktl
->pkt
.stream_index
== pkt
->stream_index
){
730 if(pktl
->pkt
.pts
!= pktl
->pkt
.dts
|| pktl
->pkt
.dts
!= AV_NOPTS_VALUE
|| pktl
->pkt
.duration
)
732 cur_dts
-= pkt
->duration
;
735 pktl
= s
->packet_buffer
;
736 st
->first_dts
= cur_dts
;
737 }else if(st
->cur_dts
)
740 for(; pktl
; pktl
= pktl
->next
){
741 if(pktl
->pkt
.stream_index
!= pkt
->stream_index
)
743 if(pktl
->pkt
.pts
== pktl
->pkt
.dts
&& pktl
->pkt
.dts
== AV_NOPTS_VALUE
744 && !pktl
->pkt
.duration
){
745 pktl
->pkt
.dts
= cur_dts
;
746 if(!st
->codec
->has_b_frames
)
747 pktl
->pkt
.pts
= cur_dts
;
748 cur_dts
+= pkt
->duration
;
749 pktl
->pkt
.duration
= pkt
->duration
;
753 if(st
->first_dts
== AV_NOPTS_VALUE
)
754 st
->cur_dts
= cur_dts
;
757 static void compute_pkt_fields(AVFormatContext
*s
, AVStream
*st
,
758 AVCodecParserContext
*pc
, AVPacket
*pkt
)
760 int num
, den
, presentation_delayed
, delay
, i
;
763 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->dts
> pkt
->pts
&& st
->pts_wrap_bits
<63
764 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
765 pkt
->dts
-= 1LL<<st
->pts_wrap_bits
;
768 if (pkt
->duration
== 0) {
769 compute_frame_duration(&num
, &den
, st
, pc
, pkt
);
771 pkt
->duration
= av_rescale(1, num
* (int64_t)st
->time_base
.den
, den
* (int64_t)st
->time_base
.num
);
773 if(pkt
->duration
!= 0 && s
->packet_buffer
)
774 update_initial_durations(s
, st
, pkt
);
778 /* correct timestamps with byte offset if demuxers only have timestamps
779 on packet boundaries */
780 if(pc
&& st
->need_parsing
== AVSTREAM_PARSE_TIMESTAMPS
&& pkt
->size
){
781 /* this will estimate bitrate based on this frame's duration and size */
782 offset
= av_rescale(pc
->offset
, pkt
->duration
, pkt
->size
);
783 if(pkt
->pts
!= AV_NOPTS_VALUE
)
785 if(pkt
->dts
!= AV_NOPTS_VALUE
)
789 /* do we have a video B-frame ? */
790 delay
= st
->codec
->has_b_frames
;
791 presentation_delayed
= 0;
792 /* XXX: need has_b_frame, but cannot get it if the codec is
795 pc
&& pc
->pict_type
!= FF_B_TYPE
)
796 presentation_delayed
= 1;
797 /* This may be redundant, but it should not hurt. */
798 if(pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->pts
> pkt
->dts
)
799 presentation_delayed
= 1;
801 // 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);
802 /* interpolate PTS and DTS if they are not present */
803 if(delay
==0 || (delay
==1 && pc
)){
804 if (presentation_delayed
) {
805 /* DTS = decompression timestamp */
806 /* PTS = presentation timestamp */
807 if (pkt
->dts
== AV_NOPTS_VALUE
)
808 pkt
->dts
= st
->last_IP_pts
;
809 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
);
810 if (pkt
->dts
== AV_NOPTS_VALUE
)
811 pkt
->dts
= st
->cur_dts
;
813 /* this is tricky: the dts must be incremented by the duration
814 of the frame we are displaying, i.e. the last I- or P-frame */
815 if (st
->last_IP_duration
== 0)
816 st
->last_IP_duration
= pkt
->duration
;
817 if(pkt
->dts
!= AV_NOPTS_VALUE
)
818 st
->cur_dts
= pkt
->dts
+ st
->last_IP_duration
;
819 st
->last_IP_duration
= pkt
->duration
;
820 st
->last_IP_pts
= pkt
->pts
;
821 /* cannot compute PTS if not present (we can compute it only
822 by knowing the future */
823 } else if(pkt
->pts
!= AV_NOPTS_VALUE
|| pkt
->dts
!= AV_NOPTS_VALUE
|| pkt
->duration
){
824 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->duration
){
825 int64_t old_diff
= FFABS(st
->cur_dts
- pkt
->duration
- pkt
->pts
);
826 int64_t new_diff
= FFABS(st
->cur_dts
- pkt
->pts
);
827 if(old_diff
< new_diff
&& old_diff
< (pkt
->duration
>>3)){
828 pkt
->pts
+= pkt
->duration
;
829 // 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);
833 /* presentation is not delayed : PTS and DTS are the same */
834 if(pkt
->pts
== AV_NOPTS_VALUE
)
836 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->pts
, pkt
->pts
);
837 if(pkt
->pts
== AV_NOPTS_VALUE
)
838 pkt
->pts
= st
->cur_dts
;
840 if(pkt
->pts
!= AV_NOPTS_VALUE
)
841 st
->cur_dts
= pkt
->pts
+ pkt
->duration
;
845 if(pkt
->pts
!= AV_NOPTS_VALUE
){
846 st
->pts_buffer
[0]= pkt
->pts
;
847 for(i
=1; i
<delay
+1 && st
->pts_buffer
[i
] == AV_NOPTS_VALUE
; i
++)
848 st
->pts_buffer
[i
]= (i
-delay
-1) * pkt
->duration
;
849 for(i
=0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+1]; i
++)
850 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+1]);
851 if(pkt
->dts
== AV_NOPTS_VALUE
)
852 pkt
->dts
= st
->pts_buffer
[0];
854 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
); // this should happen on the first packet
856 if(pkt
->dts
> st
->cur_dts
)
857 st
->cur_dts
= pkt
->dts
;
860 // 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);
863 if(is_intra_only(st
->codec
))
864 pkt
->flags
|= PKT_FLAG_KEY
;
867 /* keyframe computation */
868 if (pc
->pict_type
== FF_I_TYPE
)
869 pkt
->flags
|= PKT_FLAG_KEY
;
873 void av_destruct_packet_nofree(AVPacket
*pkt
)
875 pkt
->data
= NULL
; pkt
->size
= 0;
878 static int av_read_frame_internal(AVFormatContext
*s
, AVPacket
*pkt
)
886 /* select current input stream component */
889 if (!st
->need_parsing
|| !st
->parser
) {
890 /* no parsing needed: we just output the packet as is */
891 /* raw data support */
893 compute_pkt_fields(s
, st
, NULL
, pkt
);
896 } else if (s
->cur_len
> 0 && st
->discard
< AVDISCARD_ALL
) {
897 len
= av_parser_parse(st
->parser
, st
->codec
, &pkt
->data
, &pkt
->size
,
898 s
->cur_ptr
, s
->cur_len
,
899 s
->cur_pkt
.pts
, s
->cur_pkt
.dts
);
900 s
->cur_pkt
.pts
= AV_NOPTS_VALUE
;
901 s
->cur_pkt
.dts
= AV_NOPTS_VALUE
;
902 /* increment read pointer */
906 /* return packet if any */
909 pkt
->pos
= s
->cur_pkt
.pos
; // Isn't quite accurate but close.
911 pkt
->stream_index
= st
->index
;
912 pkt
->pts
= st
->parser
->pts
;
913 pkt
->dts
= st
->parser
->dts
;
914 pkt
->destruct
= av_destruct_packet_nofree
;
915 compute_pkt_fields(s
, st
, st
->parser
, pkt
);
917 if((s
->iformat
->flags
& AVFMT_GENERIC_INDEX
) && pkt
->flags
& PKT_FLAG_KEY
){
918 ff_reduce_index(s
, st
->index
);
919 av_add_index_entry(st
, st
->parser
->frame_offset
, pkt
->dts
,
920 0, 0, AVINDEX_KEYFRAME
);
927 av_free_packet(&s
->cur_pkt
);
931 /* read next packet */
932 ret
= av_read_packet(s
, &s
->cur_pkt
);
934 if (ret
== AVERROR(EAGAIN
))
936 /* return the last frames, if any */
937 for(i
= 0; i
< s
->nb_streams
; i
++) {
939 if (st
->parser
&& st
->need_parsing
) {
940 av_parser_parse(st
->parser
, st
->codec
,
941 &pkt
->data
, &pkt
->size
,
943 AV_NOPTS_VALUE
, AV_NOPTS_VALUE
);
948 /* no more packets: really terminate parsing */
952 if(s
->cur_pkt
.pts
!= AV_NOPTS_VALUE
&&
953 s
->cur_pkt
.dts
!= AV_NOPTS_VALUE
&&
954 s
->cur_pkt
.pts
< s
->cur_pkt
.dts
){
955 av_log(s
, AV_LOG_WARNING
, "Invalid timestamps stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d\n",
956 s
->cur_pkt
.stream_index
,
960 // av_free_packet(&s->cur_pkt);
964 st
= s
->streams
[s
->cur_pkt
.stream_index
];
965 if(s
->debug
& FF_FDEBUG_TS
)
966 av_log(s
, AV_LOG_DEBUG
, "av_read_packet stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d, flags=%d\n",
967 s
->cur_pkt
.stream_index
,
974 s
->cur_ptr
= s
->cur_pkt
.data
;
975 s
->cur_len
= s
->cur_pkt
.size
;
976 if (st
->need_parsing
&& !st
->parser
) {
977 st
->parser
= av_parser_init(st
->codec
->codec_id
);
979 /* no parser available: just output the raw packets */
980 st
->need_parsing
= AVSTREAM_PARSE_NONE
;
981 }else if(st
->need_parsing
== AVSTREAM_PARSE_HEADERS
){
982 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
984 if(st
->parser
&& (s
->iformat
->flags
& AVFMT_GENERIC_INDEX
)){
985 st
->parser
->next_frame_offset
=
986 st
->parser
->cur_offset
= s
->cur_pkt
.pos
;
991 if(s
->debug
& FF_FDEBUG_TS
)
992 av_log(s
, AV_LOG_DEBUG
, "av_read_frame_internal stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d, flags=%d\n",
1002 int av_read_frame(AVFormatContext
*s
, AVPacket
*pkt
)
1006 const int genpts
= s
->flags
& AVFMT_FLAG_GENPTS
;
1009 pktl
= s
->packet_buffer
;
1011 AVPacket
*next_pkt
= &pktl
->pkt
;
1013 if(genpts
&& next_pkt
->dts
!= AV_NOPTS_VALUE
){
1014 while(pktl
&& next_pkt
->pts
== AV_NOPTS_VALUE
){
1015 if( pktl
->pkt
.stream_index
== next_pkt
->stream_index
1016 && next_pkt
->dts
< pktl
->pkt
.dts
1017 && pktl
->pkt
.pts
!= pktl
->pkt
.dts
//not b frame
1018 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1019 next_pkt
->pts
= pktl
->pkt
.dts
;
1023 pktl
= s
->packet_buffer
;
1026 if( next_pkt
->pts
!= AV_NOPTS_VALUE
1027 || next_pkt
->dts
== AV_NOPTS_VALUE
1029 /* read packet from packet buffer, if there is data */
1031 s
->packet_buffer
= pktl
->next
;
1037 int ret
= av_read_frame_internal(s
, pkt
);
1039 if(pktl
&& ret
!= AVERROR(EAGAIN
)){
1046 if(av_dup_packet(add_to_pktbuf(&s
->packet_buffer
, pkt
)) < 0)
1047 return AVERROR(ENOMEM
);
1049 assert(!s
->packet_buffer
);
1050 return av_read_frame_internal(s
, pkt
);
1055 /* XXX: suppress the packet queue */
1056 static void flush_packet_queue(AVFormatContext
*s
)
1061 pktl
= s
->packet_buffer
;
1064 s
->packet_buffer
= pktl
->next
;
1065 av_free_packet(&pktl
->pkt
);
1070 /*******************************************************/
1073 int av_find_default_stream_index(AVFormatContext
*s
)
1075 int first_audio_index
= -1;
1079 if (s
->nb_streams
<= 0)
1081 for(i
= 0; i
< s
->nb_streams
; i
++) {
1083 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
1086 if (first_audio_index
< 0 && st
->codec
->codec_type
== CODEC_TYPE_AUDIO
)
1087 first_audio_index
= i
;
1089 return first_audio_index
>= 0 ? first_audio_index
: 0;
1093 * Flush the frame reader.
1095 static void av_read_frame_flush(AVFormatContext
*s
)
1100 flush_packet_queue(s
);
1102 /* free previous packet */
1104 if (s
->cur_st
->parser
)
1105 av_free_packet(&s
->cur_pkt
);
1112 /* for each stream, reset read state */
1113 for(i
= 0; i
< s
->nb_streams
; i
++) {
1117 av_parser_close(st
->parser
);
1120 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1121 st
->cur_dts
= AV_NOPTS_VALUE
; /* we set the current DTS to an unspecified origin */
1125 void av_update_cur_dts(AVFormatContext
*s
, AVStream
*ref_st
, int64_t timestamp
){
1128 for(i
= 0; i
< s
->nb_streams
; i
++) {
1129 AVStream
*st
= s
->streams
[i
];
1131 st
->cur_dts
= av_rescale(timestamp
,
1132 st
->time_base
.den
* (int64_t)ref_st
->time_base
.num
,
1133 st
->time_base
.num
* (int64_t)ref_st
->time_base
.den
);
1137 void ff_reduce_index(AVFormatContext
*s
, int stream_index
)
1139 AVStream
*st
= s
->streams
[stream_index
];
1140 unsigned int max_entries
= s
->max_index_size
/ sizeof(AVIndexEntry
);
1142 if((unsigned)st
->nb_index_entries
>= max_entries
){
1144 for(i
=0; 2*i
<st
->nb_index_entries
; i
++)
1145 st
->index_entries
[i
]= st
->index_entries
[2*i
];
1146 st
->nb_index_entries
= i
;
1150 int av_add_index_entry(AVStream
*st
,
1151 int64_t pos
, int64_t timestamp
, int size
, int distance
, int flags
)
1153 AVIndexEntry
*entries
, *ie
;
1156 if((unsigned)st
->nb_index_entries
+ 1 >= UINT_MAX
/ sizeof(AVIndexEntry
))
1159 entries
= av_fast_realloc(st
->index_entries
,
1160 &st
->index_entries_allocated_size
,
1161 (st
->nb_index_entries
+ 1) *
1162 sizeof(AVIndexEntry
));
1166 st
->index_entries
= entries
;
1168 index
= av_index_search_timestamp(st
, timestamp
, AVSEEK_FLAG_ANY
);
1171 index
= st
->nb_index_entries
++;
1172 ie
= &entries
[index
];
1173 assert(index
==0 || ie
[-1].timestamp
< timestamp
);
1175 ie
= &entries
[index
];
1176 if(ie
->timestamp
!= timestamp
){
1177 if(ie
->timestamp
<= timestamp
)
1179 memmove(entries
+ index
+ 1, entries
+ index
, sizeof(AVIndexEntry
)*(st
->nb_index_entries
- index
));
1180 st
->nb_index_entries
++;
1181 }else if(ie
->pos
== pos
&& distance
< ie
->min_distance
) //do not reduce the distance
1182 distance
= ie
->min_distance
;
1186 ie
->timestamp
= timestamp
;
1187 ie
->min_distance
= distance
;
1194 int av_index_search_timestamp(AVStream
*st
, int64_t wanted_timestamp
,
1197 AVIndexEntry
*entries
= st
->index_entries
;
1198 int nb_entries
= st
->nb_index_entries
;
1207 timestamp
= entries
[m
].timestamp
;
1208 if(timestamp
>= wanted_timestamp
)
1210 if(timestamp
<= wanted_timestamp
)
1213 m
= (flags
& AVSEEK_FLAG_BACKWARD
) ? a
: b
;
1215 if(!(flags
& AVSEEK_FLAG_ANY
)){
1216 while(m
>=0 && m
<nb_entries
&& !(entries
[m
].flags
& AVINDEX_KEYFRAME
)){
1217 m
+= (flags
& AVSEEK_FLAG_BACKWARD
) ? -1 : 1;
1228 int av_seek_frame_binary(AVFormatContext
*s
, int stream_index
, int64_t target_ts
, int flags
){
1229 AVInputFormat
*avif
= s
->iformat
;
1230 int64_t pos_min
, pos_max
, pos
, pos_limit
;
1231 int64_t ts_min
, ts_max
, ts
;
1235 if (stream_index
< 0)
1239 av_log(s
, AV_LOG_DEBUG
, "read_seek: %d %"PRId64
"\n", stream_index
, target_ts
);
1243 ts_min
= AV_NOPTS_VALUE
;
1244 pos_limit
= -1; //gcc falsely says it may be uninitialized
1246 st
= s
->streams
[stream_index
];
1247 if(st
->index_entries
){
1250 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()
1251 index
= FFMAX(index
, 0);
1252 e
= &st
->index_entries
[index
];
1254 if(e
->timestamp
<= target_ts
|| e
->pos
== e
->min_distance
){
1256 ts_min
= e
->timestamp
;
1258 av_log(s
, AV_LOG_DEBUG
, "using cached pos_min=0x%"PRIx64
" dts_min=%"PRId64
"\n",
1265 index
= av_index_search_timestamp(st
, target_ts
, flags
& ~AVSEEK_FLAG_BACKWARD
);
1266 assert(index
< st
->nb_index_entries
);
1268 e
= &st
->index_entries
[index
];
1269 assert(e
->timestamp
>= target_ts
);
1271 ts_max
= e
->timestamp
;
1272 pos_limit
= pos_max
- e
->min_distance
;
1274 av_log(s
, AV_LOG_DEBUG
, "using cached pos_max=0x%"PRIx64
" pos_limit=0x%"PRIx64
" dts_max=%"PRId64
"\n",
1275 pos_max
,pos_limit
, ts_max
);
1280 pos
= av_gen_search(s
, stream_index
, target_ts
, pos_min
, pos_max
, pos_limit
, ts_min
, ts_max
, flags
, &ts
, avif
->read_timestamp
);
1285 url_fseek(s
->pb
, pos
, SEEK_SET
);
1287 av_update_cur_dts(s
, st
, ts
);
1292 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 )){
1294 int64_t start_pos
, filesize
;
1298 av_log(s
, AV_LOG_DEBUG
, "gen_seek: %d %"PRId64
"\n", stream_index
, target_ts
);
1301 if(ts_min
== AV_NOPTS_VALUE
){
1302 pos_min
= s
->data_offset
;
1303 ts_min
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1304 if (ts_min
== AV_NOPTS_VALUE
)
1308 if(ts_max
== AV_NOPTS_VALUE
){
1310 filesize
= url_fsize(s
->pb
);
1311 pos_max
= filesize
- 1;
1314 ts_max
= read_timestamp(s
, stream_index
, &pos_max
, pos_max
+ step
);
1316 }while(ts_max
== AV_NOPTS_VALUE
&& pos_max
>= step
);
1317 if (ts_max
== AV_NOPTS_VALUE
)
1321 int64_t tmp_pos
= pos_max
+ 1;
1322 int64_t tmp_ts
= read_timestamp(s
, stream_index
, &tmp_pos
, INT64_MAX
);
1323 if(tmp_ts
== AV_NOPTS_VALUE
)
1327 if(tmp_pos
>= filesize
)
1333 if(ts_min
> ts_max
){
1335 }else if(ts_min
== ts_max
){
1340 while (pos_min
< pos_limit
) {
1342 av_log(s
, AV_LOG_DEBUG
, "pos_min=0x%"PRIx64
" pos_max=0x%"PRIx64
" dts_min=%"PRId64
" dts_max=%"PRId64
"\n",
1346 assert(pos_limit
<= pos_max
);
1349 int64_t approximate_keyframe_distance
= pos_max
- pos_limit
;
1350 // interpolate position (better than dichotomy)
1351 pos
= av_rescale(target_ts
- ts_min
, pos_max
- pos_min
, ts_max
- ts_min
)
1352 + pos_min
- approximate_keyframe_distance
;
1353 }else if(no_change
==1){
1354 // bisection, if interpolation failed to change min or max pos last time
1355 pos
= (pos_min
+ pos_limit
)>>1;
1357 /* linear search if bisection failed, can only happen if there
1358 are very few or no keyframes between min/max */
1363 else if(pos
> pos_limit
)
1367 ts
= read_timestamp(s
, stream_index
, &pos
, INT64_MAX
); //may pass pos_limit instead of -1
1373 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
);
1375 if(ts
== AV_NOPTS_VALUE
){
1376 av_log(s
, AV_LOG_ERROR
, "read_timestamp() failed in the middle\n");
1379 assert(ts
!= AV_NOPTS_VALUE
);
1380 if (target_ts
<= ts
) {
1381 pos_limit
= start_pos
- 1;
1385 if (target_ts
>= ts
) {
1391 pos
= (flags
& AVSEEK_FLAG_BACKWARD
) ? pos_min
: pos_max
;
1392 ts
= (flags
& AVSEEK_FLAG_BACKWARD
) ? ts_min
: ts_max
;
1395 ts_min
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1397 ts_max
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1398 av_log(s
, AV_LOG_DEBUG
, "pos=0x%"PRIx64
" %"PRId64
"<=%"PRId64
"<=%"PRId64
"\n",
1399 pos
, ts_min
, target_ts
, ts_max
);
1405 static int av_seek_frame_byte(AVFormatContext
*s
, int stream_index
, int64_t pos
, int flags
){
1406 int64_t pos_min
, pos_max
;
1410 if (stream_index
< 0)
1413 st
= s
->streams
[stream_index
];
1416 pos_min
= s
->data_offset
;
1417 pos_max
= url_fsize(s
->pb
) - 1;
1419 if (pos
< pos_min
) pos
= pos_min
;
1420 else if(pos
> pos_max
) pos
= pos_max
;
1422 url_fseek(s
->pb
, pos
, SEEK_SET
);
1425 av_update_cur_dts(s
, st
, ts
);
1430 static int av_seek_frame_generic(AVFormatContext
*s
,
1431 int stream_index
, int64_t timestamp
, int flags
)
1437 st
= s
->streams
[stream_index
];
1439 index
= av_index_search_timestamp(st
, timestamp
, flags
);
1441 if(index
< 0 || index
==st
->nb_index_entries
-1){
1445 if(st
->nb_index_entries
){
1446 assert(st
->index_entries
);
1447 ie
= &st
->index_entries
[st
->nb_index_entries
-1];
1448 url_fseek(s
->pb
, ie
->pos
, SEEK_SET
);
1449 av_update_cur_dts(s
, st
, ie
->timestamp
);
1451 url_fseek(s
->pb
, 0, SEEK_SET
);
1454 int ret
= av_read_frame(s
, &pkt
);
1457 av_free_packet(&pkt
);
1458 if(stream_index
== pkt
.stream_index
){
1459 if((pkt
.flags
& PKT_FLAG_KEY
) && pkt
.dts
> timestamp
)
1463 index
= av_index_search_timestamp(st
, timestamp
, flags
);
1468 av_read_frame_flush(s
);
1469 if (s
->iformat
->read_seek
){
1470 if(s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
) >= 0)
1473 ie
= &st
->index_entries
[index
];
1474 url_fseek(s
->pb
, ie
->pos
, SEEK_SET
);
1476 av_update_cur_dts(s
, st
, ie
->timestamp
);
1481 int av_seek_frame(AVFormatContext
*s
, int stream_index
, int64_t timestamp
, int flags
)
1486 av_read_frame_flush(s
);
1488 if(flags
& AVSEEK_FLAG_BYTE
)
1489 return av_seek_frame_byte(s
, stream_index
, timestamp
, flags
);
1491 if(stream_index
< 0){
1492 stream_index
= av_find_default_stream_index(s
);
1493 if(stream_index
< 0)
1496 st
= s
->streams
[stream_index
];
1497 /* timestamp for default must be expressed in AV_TIME_BASE units */
1498 timestamp
= av_rescale(timestamp
, st
->time_base
.den
, AV_TIME_BASE
* (int64_t)st
->time_base
.num
);
1500 st
= s
->streams
[stream_index
];
1502 /* first, we try the format specific seek */
1503 if (s
->iformat
->read_seek
)
1504 ret
= s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
);
1511 if(s
->iformat
->read_timestamp
)
1512 return av_seek_frame_binary(s
, stream_index
, timestamp
, flags
);
1514 return av_seek_frame_generic(s
, stream_index
, timestamp
, flags
);
1517 /*******************************************************/
1520 * Returns TRUE if the stream has accurate duration in any stream.
1522 * @return TRUE if the stream has accurate duration for at least one component.
1524 static int av_has_duration(AVFormatContext
*ic
)
1529 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1530 st
= ic
->streams
[i
];
1531 if (st
->duration
!= AV_NOPTS_VALUE
)
1538 * Estimate the stream timings from the one of each components.
1540 * Also computes the global bitrate if possible.
1542 static void av_update_stream_timings(AVFormatContext
*ic
)
1544 int64_t start_time
, start_time1
, end_time
, end_time1
;
1545 int64_t duration
, duration1
;
1549 start_time
= INT64_MAX
;
1550 end_time
= INT64_MIN
;
1551 duration
= INT64_MIN
;
1552 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1553 st
= ic
->streams
[i
];
1554 if (st
->start_time
!= AV_NOPTS_VALUE
&& st
->time_base
.den
) {
1555 start_time1
= av_rescale_q(st
->start_time
, st
->time_base
, AV_TIME_BASE_Q
);
1556 if (start_time1
< start_time
)
1557 start_time
= start_time1
;
1558 if (st
->duration
!= AV_NOPTS_VALUE
) {
1559 end_time1
= start_time1
1560 + av_rescale_q(st
->duration
, st
->time_base
, AV_TIME_BASE_Q
);
1561 if (end_time1
> end_time
)
1562 end_time
= end_time1
;
1565 if (st
->duration
!= AV_NOPTS_VALUE
) {
1566 duration1
= av_rescale_q(st
->duration
, st
->time_base
, AV_TIME_BASE_Q
);
1567 if (duration1
> duration
)
1568 duration
= duration1
;
1571 if (start_time
!= INT64_MAX
) {
1572 ic
->start_time
= start_time
;
1573 if (end_time
!= INT64_MIN
) {
1574 if (end_time
- start_time
> duration
)
1575 duration
= end_time
- start_time
;
1578 if (duration
!= INT64_MIN
) {
1579 ic
->duration
= duration
;
1580 if (ic
->file_size
> 0) {
1581 /* compute the bitrate */
1582 ic
->bit_rate
= (double)ic
->file_size
* 8.0 * AV_TIME_BASE
/
1583 (double)ic
->duration
;
1588 static void fill_all_stream_timings(AVFormatContext
*ic
)
1593 av_update_stream_timings(ic
);
1594 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1595 st
= ic
->streams
[i
];
1596 if (st
->start_time
== AV_NOPTS_VALUE
) {
1597 if(ic
->start_time
!= AV_NOPTS_VALUE
)
1598 st
->start_time
= av_rescale_q(ic
->start_time
, AV_TIME_BASE_Q
, st
->time_base
);
1599 if(ic
->duration
!= AV_NOPTS_VALUE
)
1600 st
->duration
= av_rescale_q(ic
->duration
, AV_TIME_BASE_Q
, st
->time_base
);
1605 static void av_estimate_timings_from_bit_rate(AVFormatContext
*ic
)
1607 int64_t filesize
, duration
;
1611 /* if bit_rate is already set, we believe it */
1612 if (ic
->bit_rate
== 0) {
1614 for(i
=0;i
<ic
->nb_streams
;i
++) {
1615 st
= ic
->streams
[i
];
1616 bit_rate
+= st
->codec
->bit_rate
;
1618 ic
->bit_rate
= bit_rate
;
1621 /* if duration is already set, we believe it */
1622 if (ic
->duration
== AV_NOPTS_VALUE
&&
1623 ic
->bit_rate
!= 0 &&
1624 ic
->file_size
!= 0) {
1625 filesize
= ic
->file_size
;
1627 for(i
= 0; i
< ic
->nb_streams
; i
++) {
1628 st
= ic
->streams
[i
];
1629 duration
= av_rescale(8*filesize
, st
->time_base
.den
, ic
->bit_rate
*(int64_t)st
->time_base
.num
);
1630 if (st
->duration
== AV_NOPTS_VALUE
)
1631 st
->duration
= duration
;
1637 #define DURATION_MAX_READ_SIZE 250000
1639 /* only usable for MPEG-PS streams */
1640 static void av_estimate_timings_from_pts(AVFormatContext
*ic
, offset_t old_offset
)
1642 AVPacket pkt1
, *pkt
= &pkt1
;
1644 int read_size
, i
, ret
;
1646 int64_t filesize
, offset
, duration
;
1648 /* free previous packet */
1649 if (ic
->cur_st
&& ic
->cur_st
->parser
)
1650 av_free_packet(&ic
->cur_pkt
);
1653 /* flush packet queue */
1654 flush_packet_queue(ic
);
1656 for(i
=0;i
<ic
->nb_streams
;i
++) {
1657 st
= ic
->streams
[i
];
1659 av_parser_close(st
->parser
);
1664 /* we read the first packets to get the first PTS (not fully
1665 accurate, but it is enough now) */
1666 url_fseek(ic
->pb
, 0, SEEK_SET
);
1669 if (read_size
>= DURATION_MAX_READ_SIZE
)
1671 /* if all info is available, we can stop */
1672 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1673 st
= ic
->streams
[i
];
1674 if (st
->start_time
== AV_NOPTS_VALUE
)
1677 if (i
== ic
->nb_streams
)
1680 ret
= av_read_packet(ic
, pkt
);
1683 read_size
+= pkt
->size
;
1684 st
= ic
->streams
[pkt
->stream_index
];
1685 if (pkt
->pts
!= AV_NOPTS_VALUE
) {
1686 if (st
->start_time
== AV_NOPTS_VALUE
)
1687 st
->start_time
= pkt
->pts
;
1689 av_free_packet(pkt
);
1692 /* estimate the end time (duration) */
1693 /* XXX: may need to support wrapping */
1694 filesize
= ic
->file_size
;
1695 offset
= filesize
- DURATION_MAX_READ_SIZE
;
1699 url_fseek(ic
->pb
, offset
, SEEK_SET
);
1702 if (read_size
>= DURATION_MAX_READ_SIZE
)
1705 ret
= av_read_packet(ic
, pkt
);
1708 read_size
+= pkt
->size
;
1709 st
= ic
->streams
[pkt
->stream_index
];
1710 if (pkt
->pts
!= AV_NOPTS_VALUE
&&
1711 st
->start_time
!= AV_NOPTS_VALUE
) {
1712 end_time
= pkt
->pts
;
1713 duration
= end_time
- st
->start_time
;
1715 if (st
->duration
== AV_NOPTS_VALUE
||
1716 st
->duration
< duration
)
1717 st
->duration
= duration
;
1720 av_free_packet(pkt
);
1723 fill_all_stream_timings(ic
);
1725 url_fseek(ic
->pb
, old_offset
, SEEK_SET
);
1726 for(i
=0; i
<ic
->nb_streams
; i
++){
1728 st
->cur_dts
= st
->first_dts
;
1729 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1733 static void av_estimate_timings(AVFormatContext
*ic
, offset_t old_offset
)
1737 /* get the file size, if possible */
1738 if (ic
->iformat
->flags
& AVFMT_NOFILE
) {
1741 file_size
= url_fsize(ic
->pb
);
1745 ic
->file_size
= file_size
;
1747 if ((!strcmp(ic
->iformat
->name
, "mpeg") ||
1748 !strcmp(ic
->iformat
->name
, "mpegts")) &&
1749 file_size
&& !url_is_streamed(ic
->pb
)) {
1750 /* get accurate estimate from the PTSes */
1751 av_estimate_timings_from_pts(ic
, old_offset
);
1752 } else if (av_has_duration(ic
)) {
1753 /* at least one component has timings - we use them for all
1755 fill_all_stream_timings(ic
);
1757 /* less precise: use bitrate info */
1758 av_estimate_timings_from_bit_rate(ic
);
1760 av_update_stream_timings(ic
);
1766 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1767 st
= ic
->streams
[i
];
1768 printf("%d: start_time: %0.3f duration: %0.3f\n",
1769 i
, (double)st
->start_time
/ AV_TIME_BASE
,
1770 (double)st
->duration
/ AV_TIME_BASE
);
1772 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1773 (double)ic
->start_time
/ AV_TIME_BASE
,
1774 (double)ic
->duration
/ AV_TIME_BASE
,
1775 ic
->bit_rate
/ 1000);
1780 static int has_codec_parameters(AVCodecContext
*enc
)
1783 switch(enc
->codec_type
) {
1784 case CODEC_TYPE_AUDIO
:
1785 val
= enc
->sample_rate
&& enc
->channels
;
1786 if(!enc
->frame_size
&&
1787 (enc
->codec_id
== CODEC_ID_VORBIS
||
1788 enc
->codec_id
== CODEC_ID_AAC
))
1791 case CODEC_TYPE_VIDEO
:
1792 val
= enc
->width
&& enc
->pix_fmt
!= PIX_FMT_NONE
;
1798 return enc
->codec_id
!= CODEC_ID_NONE
&& val
!= 0;
1801 static int try_decode_frame(AVStream
*st
, const uint8_t *data
, int size
)
1805 int got_picture
, data_size
, ret
=0;
1808 if(!st
->codec
->codec
){
1809 codec
= avcodec_find_decoder(st
->codec
->codec_id
);
1812 ret
= avcodec_open(st
->codec
, codec
);
1817 if(!has_codec_parameters(st
->codec
)){
1818 switch(st
->codec
->codec_type
) {
1819 case CODEC_TYPE_VIDEO
:
1820 ret
= avcodec_decode_video(st
->codec
, &picture
,
1821 &got_picture
, data
, size
);
1823 case CODEC_TYPE_AUDIO
:
1824 data_size
= FFMAX(size
, AVCODEC_MAX_AUDIO_FRAME_SIZE
);
1825 samples
= av_malloc(data_size
);
1828 ret
= avcodec_decode_audio2(st
->codec
, samples
,
1829 &data_size
, data
, size
);
1840 unsigned int codec_get_tag(const AVCodecTag
*tags
, int id
)
1842 while (tags
->id
!= CODEC_ID_NONE
) {
1850 enum CodecID
codec_get_id(const AVCodecTag
*tags
, unsigned int tag
)
1853 for(i
=0; tags
[i
].id
!= CODEC_ID_NONE
;i
++) {
1854 if(tag
== tags
[i
].tag
)
1857 for(i
=0; tags
[i
].id
!= CODEC_ID_NONE
; i
++) {
1858 if( toupper((tag
>> 0)&0xFF) == toupper((tags
[i
].tag
>> 0)&0xFF)
1859 && toupper((tag
>> 8)&0xFF) == toupper((tags
[i
].tag
>> 8)&0xFF)
1860 && toupper((tag
>>16)&0xFF) == toupper((tags
[i
].tag
>>16)&0xFF)
1861 && toupper((tag
>>24)&0xFF) == toupper((tags
[i
].tag
>>24)&0xFF))
1864 return CODEC_ID_NONE
;
1867 unsigned int av_codec_get_tag(const AVCodecTag
*tags
[4], enum CodecID id
)
1870 for(i
=0; tags
&& tags
[i
]; i
++){
1871 int tag
= codec_get_tag(tags
[i
], id
);
1877 enum CodecID
av_codec_get_id(const AVCodecTag
*tags
[4], unsigned int tag
)
1880 for(i
=0; tags
&& tags
[i
]; i
++){
1881 enum CodecID id
= codec_get_id(tags
[i
], tag
);
1882 if(id
!=CODEC_ID_NONE
) return id
;
1884 return CODEC_ID_NONE
;
1887 static void compute_chapters_end(AVFormatContext
*s
)
1891 for (i
=0; i
+1<s
->nb_chapters
; i
++)
1892 if (s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
1893 assert(s
->chapters
[i
]->start
<= s
->chapters
[i
+1]->start
);
1894 assert(!av_cmp_q(s
->chapters
[i
]->time_base
, s
->chapters
[i
+1]->time_base
));
1895 s
->chapters
[i
]->end
= s
->chapters
[i
+1]->start
;
1898 if (s
->nb_chapters
&& s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
1899 assert(s
->start_time
!= AV_NOPTS_VALUE
);
1900 assert(s
->duration
> 0);
1901 s
->chapters
[i
]->end
= av_rescale_q(s
->start_time
+ s
->duration
,
1903 s
->chapters
[i
]->time_base
);
1907 /* absolute maximum size we read until we abort */
1908 #define MAX_READ_SIZE 5000000
1910 #define MAX_STD_TIMEBASES (60*12+5)
1911 static int get_std_framerate(int i
){
1912 if(i
<60*12) return i
*1001;
1913 else return ((int[]){24,30,60,12,15})[i
-60*12]*1000*12;
1917 * Is the time base unreliable.
1918 * This is a heuristic to balance between quick acceptance of the values in
1919 * the headers vs. some extra checks.
1920 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
1921 * MPEG-2 commonly misuses field repeat flags to store different framerates.
1922 * And there are "variable" fps files this needs to detect as well.
1924 static int tb_unreliable(AVCodecContext
*c
){
1925 if( c
->time_base
.den
>= 101L*c
->time_base
.num
1926 || c
->time_base
.den
< 5L*c
->time_base
.num
1927 /* || c->codec_tag == ff_get_fourcc("DIVX")
1928 || c->codec_tag == ff_get_fourcc("XVID")*/
1929 || c
->codec_id
== CODEC_ID_MPEG2VIDEO
)
1934 int av_find_stream_info(AVFormatContext
*ic
)
1936 int i
, count
, ret
, read_size
, j
;
1938 AVPacket pkt1
, *pkt
;
1939 int64_t last_dts
[MAX_STREAMS
];
1940 int duration_count
[MAX_STREAMS
]={0};
1941 double (*duration_error
)[MAX_STD_TIMEBASES
];
1942 offset_t old_offset
= url_ftell(ic
->pb
);
1943 int64_t codec_info_duration
[MAX_STREAMS
]={0};
1944 int codec_info_nb_frames
[MAX_STREAMS
]={0};
1946 duration_error
= av_mallocz(MAX_STREAMS
* sizeof(*duration_error
));
1947 if (!duration_error
) return AVERROR(ENOMEM
);
1949 for(i
=0;i
<ic
->nb_streams
;i
++) {
1950 st
= ic
->streams
[i
];
1951 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
){
1952 /* if(!st->time_base.num)
1954 if(!st
->codec
->time_base
.num
)
1955 st
->codec
->time_base
= st
->time_base
;
1957 //only for the split stuff
1959 st
->parser
= av_parser_init(st
->codec
->codec_id
);
1960 if(st
->need_parsing
== AVSTREAM_PARSE_HEADERS
&& st
->parser
){
1961 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
1966 for(i
=0;i
<MAX_STREAMS
;i
++){
1967 last_dts
[i
]= AV_NOPTS_VALUE
;
1973 /* check if one codec still needs to be handled */
1974 for(i
=0;i
<ic
->nb_streams
;i
++) {
1975 st
= ic
->streams
[i
];
1976 if (!has_codec_parameters(st
->codec
))
1978 /* variable fps and no guess at the real fps */
1979 if( tb_unreliable(st
->codec
)
1980 && duration_count
[i
]<20 && st
->codec
->codec_type
== CODEC_TYPE_VIDEO
)
1982 if(st
->parser
&& st
->parser
->parser
->split
&& !st
->codec
->extradata
)
1984 if(st
->first_dts
== AV_NOPTS_VALUE
)
1987 if (i
== ic
->nb_streams
) {
1988 /* NOTE: if the format has no header, then we need to read
1989 some packets to get most of the streams, so we cannot
1991 if (!(ic
->ctx_flags
& AVFMTCTX_NOHEADER
)) {
1992 /* if we found the info for all the codecs, we can stop */
1997 /* we did not get all the codec info, but we read too much data */
1998 if (read_size
>= MAX_READ_SIZE
) {
2003 /* NOTE: a new stream can be added there if no header in file
2004 (AVFMTCTX_NOHEADER) */
2005 ret
= av_read_frame_internal(ic
, &pkt1
);
2008 ret
= -1; /* we could not have all the codec parameters before EOF */
2009 for(i
=0;i
<ic
->nb_streams
;i
++) {
2010 st
= ic
->streams
[i
];
2011 if (!has_codec_parameters(st
->codec
)){
2013 avcodec_string(buf
, sizeof(buf
), st
->codec
, 0);
2014 av_log(ic
, AV_LOG_INFO
, "Could not find codec parameters (%s)\n", buf
);
2022 pkt
= add_to_pktbuf(&ic
->packet_buffer
, &pkt1
);
2023 if(av_dup_packet(pkt
) < 0) {
2024 av_free(duration_error
);
2025 return AVERROR(ENOMEM
);
2028 read_size
+= pkt
->size
;
2030 st
= ic
->streams
[pkt
->stream_index
];
2031 if(codec_info_nb_frames
[st
->index
]>1)
2032 codec_info_duration
[st
->index
] += pkt
->duration
;
2033 if (pkt
->duration
!= 0)
2034 codec_info_nb_frames
[st
->index
]++;
2037 int index
= pkt
->stream_index
;
2038 int64_t last
= last_dts
[index
];
2039 int64_t duration
= pkt
->dts
- last
;
2041 if(pkt
->dts
!= AV_NOPTS_VALUE
&& last
!= AV_NOPTS_VALUE
&& duration
>0){
2042 double dur
= duration
* av_q2d(st
->time_base
);
2044 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2045 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2046 if(duration_count
[index
] < 2)
2047 memset(duration_error
[index
], 0, sizeof(*duration_error
));
2048 for(i
=1; i
<MAX_STD_TIMEBASES
; i
++){
2049 int framerate
= get_std_framerate(i
);
2050 int ticks
= lrintf(dur
*framerate
/(1001*12));
2051 double error
= dur
- ticks
*1001*12/(double)framerate
;
2052 duration_error
[index
][i
] += error
*error
;
2054 duration_count
[index
]++;
2056 if(last
== AV_NOPTS_VALUE
|| duration_count
[index
]<=1)
2057 last_dts
[pkt
->stream_index
]= pkt
->dts
;
2059 if(st
->parser
&& st
->parser
->parser
->split
&& !st
->codec
->extradata
){
2060 int i
= st
->parser
->parser
->split(st
->codec
, pkt
->data
, pkt
->size
);
2062 st
->codec
->extradata_size
= i
;
2063 st
->codec
->extradata
= av_malloc(st
->codec
->extradata_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
2064 memcpy(st
->codec
->extradata
, pkt
->data
, st
->codec
->extradata_size
);
2065 memset(st
->codec
->extradata
+ i
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
2069 /* if still no information, we try to open the codec and to
2070 decompress the frame. We try to avoid that in most cases as
2071 it takes longer and uses more memory. For MPEG-4, we need to
2072 decompress for QuickTime. */
2073 if (!has_codec_parameters(st
->codec
) /*&&
2074 (st->codec->codec_id == CODEC_ID_FLV1 ||
2075 st->codec->codec_id == CODEC_ID_H264 ||
2076 st->codec->codec_id == CODEC_ID_H263 ||
2077 st->codec->codec_id == CODEC_ID_H261 ||
2078 st->codec->codec_id == CODEC_ID_VORBIS ||
2079 st->codec->codec_id == CODEC_ID_MJPEG ||
2080 st->codec->codec_id == CODEC_ID_PNG ||
2081 st->codec->codec_id == CODEC_ID_PAM ||
2082 st->codec->codec_id == CODEC_ID_PGM ||
2083 st->codec->codec_id == CODEC_ID_PGMYUV ||
2084 st->codec->codec_id == CODEC_ID_PBM ||
2085 st->codec->codec_id == CODEC_ID_PPM ||
2086 st->codec->codec_id == CODEC_ID_SHORTEN ||
2087 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2088 try_decode_frame(st
, pkt
->data
, pkt
->size
);
2090 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
) {
2096 // close codecs which were opened in try_decode_frame()
2097 for(i
=0;i
<ic
->nb_streams
;i
++) {
2098 st
= ic
->streams
[i
];
2099 if(st
->codec
->codec
)
2100 avcodec_close(st
->codec
);
2102 for(i
=0;i
<ic
->nb_streams
;i
++) {
2103 st
= ic
->streams
[i
];
2104 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
2105 if(st
->codec
->codec_id
== CODEC_ID_RAWVIDEO
&& !st
->codec
->codec_tag
&& !st
->codec
->bits_per_sample
)
2106 st
->codec
->codec_tag
= avcodec_pix_fmt_to_codec_tag(st
->codec
->pix_fmt
);
2108 if(duration_count
[i
]
2109 && tb_unreliable(st
->codec
) /*&&
2110 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2111 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2112 double best_error
= 2*av_q2d(st
->time_base
);
2113 best_error
= best_error
*best_error
*duration_count
[i
]*1000*12*30;
2115 for(j
=1; j
<MAX_STD_TIMEBASES
; j
++){
2116 double error
= duration_error
[i
][j
] * get_std_framerate(j
);
2117 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2118 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2119 if(error
< best_error
){
2121 av_reduce(&st
->r_frame_rate
.num
, &st
->r_frame_rate
.den
, get_std_framerate(j
), 12*1001, INT_MAX
);
2126 if (!st
->r_frame_rate
.num
){
2127 if( st
->codec
->time_base
.den
* (int64_t)st
->time_base
.num
2128 <= st
->codec
->time_base
.num
* (int64_t)st
->time_base
.den
){
2129 st
->r_frame_rate
.num
= st
->codec
->time_base
.den
;
2130 st
->r_frame_rate
.den
= st
->codec
->time_base
.num
;
2132 st
->r_frame_rate
.num
= st
->time_base
.den
;
2133 st
->r_frame_rate
.den
= st
->time_base
.num
;
2136 }else if(st
->codec
->codec_type
== CODEC_TYPE_AUDIO
) {
2137 if(!st
->codec
->bits_per_sample
)
2138 st
->codec
->bits_per_sample
= av_get_bits_per_sample(st
->codec
->codec_id
);
2142 av_estimate_timings(ic
, old_offset
);
2144 compute_chapters_end(ic
);
2147 /* correct DTS for B-frame streams with no timestamps */
2148 for(i
=0;i
<ic
->nb_streams
;i
++) {
2149 st
= ic
->streams
[i
];
2150 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
2152 ppktl
= &ic
->packet_buffer
;
2154 if(ppkt1
->stream_index
!= i
)
2156 if(ppkt1
->pkt
->dts
< 0)
2158 if(ppkt1
->pkt
->pts
!= AV_NOPTS_VALUE
)
2160 ppkt1
->pkt
->dts
-= delta
;
2165 st
->cur_dts
-= delta
;
2171 av_free(duration_error
);
2176 /*******************************************************/
2178 int av_read_play(AVFormatContext
*s
)
2180 if (s
->iformat
->read_play
)
2181 return s
->iformat
->read_play(s
);
2183 return av_url_read_fpause(s
->pb
, 0);
2184 return AVERROR(ENOSYS
);
2187 int av_read_pause(AVFormatContext
*s
)
2189 if (s
->iformat
->read_pause
)
2190 return s
->iformat
->read_pause(s
);
2192 return av_url_read_fpause(s
->pb
, 1);
2193 return AVERROR(ENOSYS
);
2196 void av_close_input_stream(AVFormatContext
*s
)
2201 /* free previous packet */
2202 if (s
->cur_st
&& s
->cur_st
->parser
)
2203 av_free_packet(&s
->cur_pkt
);
2205 if (s
->iformat
->read_close
)
2206 s
->iformat
->read_close(s
);
2207 for(i
=0;i
<s
->nb_streams
;i
++) {
2208 /* free all data in a stream component */
2211 av_parser_close(st
->parser
);
2213 av_free(st
->index_entries
);
2214 av_free(st
->codec
->extradata
);
2216 av_free(st
->filename
);
2217 av_free(st
->priv_data
);
2220 for(i
=s
->nb_programs
-1; i
>=0; i
--) {
2221 av_freep(&s
->programs
[i
]->provider_name
);
2222 av_freep(&s
->programs
[i
]->name
);
2223 av_freep(&s
->programs
[i
]->stream_index
);
2224 av_freep(&s
->programs
[i
]);
2226 av_freep(&s
->programs
);
2227 flush_packet_queue(s
);
2228 av_freep(&s
->priv_data
);
2229 while(s
->nb_chapters
--) {
2230 av_free(s
->chapters
[s
->nb_chapters
]->title
);
2231 av_free(s
->chapters
[s
->nb_chapters
]);
2233 av_freep(&s
->chapters
);
2237 void av_close_input_file(AVFormatContext
*s
)
2239 ByteIOContext
*pb
= s
->iformat
->flags
& AVFMT_NOFILE
? NULL
: s
->pb
;
2240 av_close_input_stream(s
);
2245 AVStream
*av_new_stream(AVFormatContext
*s
, int id
)
2250 if (s
->nb_streams
>= MAX_STREAMS
)
2253 st
= av_mallocz(sizeof(AVStream
));
2257 st
->codec
= avcodec_alloc_context();
2259 /* no default bitrate if decoding */
2260 st
->codec
->bit_rate
= 0;
2262 st
->index
= s
->nb_streams
;
2264 st
->start_time
= AV_NOPTS_VALUE
;
2265 st
->duration
= AV_NOPTS_VALUE
;
2266 /* we set the current DTS to 0 so that formats without any timestamps
2267 but durations get some timestamps, formats with some unknown
2268 timestamps have their first few packets buffered and the
2269 timestamps corrected before they are returned to the user */
2271 st
->first_dts
= AV_NOPTS_VALUE
;
2273 /* default pts setting is MPEG-like */
2274 av_set_pts_info(st
, 33, 1, 90000);
2275 st
->last_IP_pts
= AV_NOPTS_VALUE
;
2276 for(i
=0; i
<MAX_REORDER_DELAY
+1; i
++)
2277 st
->pts_buffer
[i
]= AV_NOPTS_VALUE
;
2279 s
->streams
[s
->nb_streams
++] = st
;
2283 AVProgram
*av_new_program(AVFormatContext
*ac
, int id
)
2285 AVProgram
*program
=NULL
;
2289 av_log(ac
, AV_LOG_DEBUG
, "new_program: id=0x%04x\n", id
);
2292 for(i
=0; i
<ac
->nb_programs
; i
++)
2293 if(ac
->programs
[i
]->id
== id
)
2294 program
= ac
->programs
[i
];
2297 program
= av_mallocz(sizeof(AVProgram
));
2300 dynarray_add(&ac
->programs
, &ac
->nb_programs
, program
);
2301 program
->discard
= AVDISCARD_NONE
;
2308 void av_set_program_name(AVProgram
*program
, char *provider_name
, char *name
)
2310 assert(!provider_name
== !name
);
2312 av_free(program
->provider_name
);
2313 av_free(program
-> name
);
2314 program
->provider_name
= av_strdup(provider_name
);
2315 program
-> name
= av_strdup( name
);
2319 AVChapter
*ff_new_chapter(AVFormatContext
*s
, int id
, AVRational time_base
, int64_t start
, int64_t end
, const char *title
)
2321 AVChapter
*chapter
= NULL
;
2324 for(i
=0; i
<s
->nb_chapters
; i
++)
2325 if(s
->chapters
[i
]->id
== id
)
2326 chapter
= s
->chapters
[i
];
2329 chapter
= av_mallocz(sizeof(AVChapter
));
2332 dynarray_add(&s
->chapters
, &s
->nb_chapters
, chapter
);
2334 av_free(chapter
->title
);
2335 chapter
->title
= av_strdup(title
);
2337 chapter
->time_base
= time_base
;
2338 chapter
->start
= start
;
2344 /************************************************************/
2345 /* output media file */
2347 int av_set_parameters(AVFormatContext
*s
, AVFormatParameters
*ap
)
2351 if (s
->oformat
->priv_data_size
> 0) {
2352 s
->priv_data
= av_mallocz(s
->oformat
->priv_data_size
);
2354 return AVERROR(ENOMEM
);
2356 s
->priv_data
= NULL
;
2358 if (s
->oformat
->set_parameters
) {
2359 ret
= s
->oformat
->set_parameters(s
, ap
);
2366 int av_write_header(AVFormatContext
*s
)
2371 // some sanity checks
2372 for(i
=0;i
<s
->nb_streams
;i
++) {
2375 switch (st
->codec
->codec_type
) {
2376 case CODEC_TYPE_AUDIO
:
2377 if(st
->codec
->sample_rate
<=0){
2378 av_log(s
, AV_LOG_ERROR
, "sample rate not set\n");
2382 case CODEC_TYPE_VIDEO
:
2383 if(st
->codec
->time_base
.num
<=0 || st
->codec
->time_base
.den
<=0){ //FIXME audio too?
2384 av_log(s
, AV_LOG_ERROR
, "time base not set\n");
2387 if(st
->codec
->width
<=0 || st
->codec
->height
<=0){
2388 av_log(s
, AV_LOG_ERROR
, "dimensions not set\n");
2394 if(s
->oformat
->codec_tag
){
2395 if(st
->codec
->codec_tag
){
2397 //check that tag + id is in the table
2398 //if neither is in the table -> OK
2399 //if tag is in the table with another id -> FAIL
2400 //if id is in the table with another tag -> FAIL unless strict < ?
2402 st
->codec
->codec_tag
= av_codec_get_tag(s
->oformat
->codec_tag
, st
->codec
->codec_id
);
2406 if (!s
->priv_data
&& s
->oformat
->priv_data_size
> 0) {
2407 s
->priv_data
= av_mallocz(s
->oformat
->priv_data_size
);
2409 return AVERROR(ENOMEM
);
2412 if(s
->oformat
->write_header
){
2413 ret
= s
->oformat
->write_header(s
);
2418 /* init PTS generation */
2419 for(i
=0;i
<s
->nb_streams
;i
++) {
2420 int64_t den
= AV_NOPTS_VALUE
;
2423 switch (st
->codec
->codec_type
) {
2424 case CODEC_TYPE_AUDIO
:
2425 den
= (int64_t)st
->time_base
.num
* st
->codec
->sample_rate
;
2427 case CODEC_TYPE_VIDEO
:
2428 den
= (int64_t)st
->time_base
.num
* st
->codec
->time_base
.den
;
2433 if (den
!= AV_NOPTS_VALUE
) {
2435 return AVERROR_INVALIDDATA
;
2436 av_frac_init(&st
->pts
, 0, 0, den
);
2442 //FIXME merge with compute_pkt_fields
2443 static int compute_pkt_fields2(AVStream
*st
, AVPacket
*pkt
){
2444 int delay
= FFMAX(st
->codec
->has_b_frames
, !!st
->codec
->max_b_frames
);
2445 int num
, den
, frame_size
, i
;
2447 // 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);
2449 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2452 /* duration field */
2453 if (pkt
->duration
== 0) {
2454 compute_frame_duration(&num
, &den
, st
, NULL
, pkt
);
2456 pkt
->duration
= av_rescale(1, num
* (int64_t)st
->time_base
.den
, den
* (int64_t)st
->time_base
.num
);
2460 if(pkt
->pts
== AV_NOPTS_VALUE
&& pkt
->dts
!= AV_NOPTS_VALUE
&& delay
==0)
2463 //XXX/FIXME this is a temporary hack until all encoders output pts
2464 if((pkt
->pts
== 0 || pkt
->pts
== AV_NOPTS_VALUE
) && pkt
->dts
== AV_NOPTS_VALUE
&& !delay
){
2466 // pkt->pts= st->cur_dts;
2467 pkt
->pts
= st
->pts
.val
;
2470 //calculate dts from pts
2471 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
== AV_NOPTS_VALUE
){
2472 st
->pts_buffer
[0]= pkt
->pts
;
2473 for(i
=1; i
<delay
+1 && st
->pts_buffer
[i
] == AV_NOPTS_VALUE
; i
++)
2474 st
->pts_buffer
[i
]= (i
-delay
-1) * pkt
->duration
;
2475 for(i
=0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+1]; i
++)
2476 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+1]);
2478 pkt
->dts
= st
->pts_buffer
[0];
2481 if(st
->cur_dts
&& st
->cur_dts
!= AV_NOPTS_VALUE
&& st
->cur_dts
>= pkt
->dts
){
2482 av_log(st
->codec
, AV_LOG_ERROR
, "error, non monotone timestamps %"PRId64
" >= %"PRId64
"\n", st
->cur_dts
, pkt
->dts
);
2485 if(pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->pts
< pkt
->dts
){
2486 av_log(st
->codec
, AV_LOG_ERROR
, "error, pts < dts\n");
2490 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2491 st
->cur_dts
= pkt
->dts
;
2492 st
->pts
.val
= pkt
->dts
;
2495 switch (st
->codec
->codec_type
) {
2496 case CODEC_TYPE_AUDIO
:
2497 frame_size
= get_audio_frame_size(st
->codec
, pkt
->size
);
2499 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2500 likely equal to the encoder delay, but it would be better if we
2501 had the real timestamps from the encoder */
2502 if (frame_size
>= 0 && (pkt
->size
|| st
->pts
.num
!=st
->pts
.den
>>1 || st
->pts
.val
)) {
2503 av_frac_add(&st
->pts
, (int64_t)st
->time_base
.den
* frame_size
);
2506 case CODEC_TYPE_VIDEO
:
2507 av_frac_add(&st
->pts
, (int64_t)st
->time_base
.den
* st
->codec
->time_base
.num
);
2515 static void truncate_ts(AVStream
*st
, AVPacket
*pkt
){
2516 int64_t pts_mask
= (2LL << (st
->pts_wrap_bits
-1)) - 1;
2519 // pkt->dts= 0; //this happens for low_delay=0 and B-frames, FIXME, needs further investigation about what we should do here
2521 if (pkt
->pts
!= AV_NOPTS_VALUE
)
2522 pkt
->pts
&= pts_mask
;
2523 if (pkt
->dts
!= AV_NOPTS_VALUE
)
2524 pkt
->dts
&= pts_mask
;
2527 int av_write_frame(AVFormatContext
*s
, AVPacket
*pkt
)
2529 int ret
= compute_pkt_fields2(s
->streams
[pkt
->stream_index
], pkt
);
2531 if(ret
<0 && !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2534 truncate_ts(s
->streams
[pkt
->stream_index
], pkt
);
2536 ret
= s
->oformat
->write_packet(s
, pkt
);
2538 ret
= url_ferror(s
->pb
);
2542 int av_interleave_packet_per_dts(AVFormatContext
*s
, AVPacket
*out
, AVPacket
*pkt
, int flush
){
2543 AVPacketList
*pktl
, **next_point
, *this_pktl
;
2545 int streams
[MAX_STREAMS
];
2548 AVStream
*st
= s
->streams
[ pkt
->stream_index
];
2550 // assert(pkt->destruct != av_destruct_packet); //FIXME
2552 this_pktl
= av_mallocz(sizeof(AVPacketList
));
2553 this_pktl
->pkt
= *pkt
;
2554 if(pkt
->destruct
== av_destruct_packet
)
2555 pkt
->destruct
= NULL
; // not shared -> must keep original from being freed
2557 av_dup_packet(&this_pktl
->pkt
); //shared -> must dup
2559 next_point
= &s
->packet_buffer
;
2561 AVStream
*st2
= s
->streams
[ (*next_point
)->pkt
.stream_index
];
2562 int64_t left
= st2
->time_base
.num
* (int64_t)st
->time_base
.den
;
2563 int64_t right
= st
->time_base
.num
* (int64_t)st2
->time_base
.den
;
2564 if((*next_point
)->pkt
.dts
* left
> pkt
->dts
* right
) //FIXME this can overflow
2566 next_point
= &(*next_point
)->next
;
2568 this_pktl
->next
= *next_point
;
2569 *next_point
= this_pktl
;
2572 memset(streams
, 0, sizeof(streams
));
2573 pktl
= s
->packet_buffer
;
2575 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2576 if(streams
[ pktl
->pkt
.stream_index
] == 0)
2578 streams
[ pktl
->pkt
.stream_index
]++;
2582 if(stream_count
&& (s
->nb_streams
== stream_count
|| flush
)){
2583 pktl
= s
->packet_buffer
;
2586 s
->packet_buffer
= pktl
->next
;
2590 av_init_packet(out
);
2596 * Interleaves an AVPacket correctly so it can be muxed.
2597 * @param out the interleaved packet will be output here
2598 * @param in the input packet
2599 * @param flush 1 if no further packets are available as input and all
2600 * remaining packets should be output
2601 * @return 1 if a packet was output, 0 if no packet could be output,
2602 * < 0 if an error occurred
2604 static int av_interleave_packet(AVFormatContext
*s
, AVPacket
*out
, AVPacket
*in
, int flush
){
2605 if(s
->oformat
->interleave_packet
)
2606 return s
->oformat
->interleave_packet(s
, out
, in
, flush
);
2608 return av_interleave_packet_per_dts(s
, out
, in
, flush
);
2611 int av_interleaved_write_frame(AVFormatContext
*s
, AVPacket
*pkt
){
2612 AVStream
*st
= s
->streams
[ pkt
->stream_index
];
2614 //FIXME/XXX/HACK drop zero sized packets
2615 if(st
->codec
->codec_type
== CODEC_TYPE_AUDIO
&& pkt
->size
==0)
2618 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2619 if(compute_pkt_fields2(st
, pkt
) < 0 && !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2622 if(pkt
->dts
== AV_NOPTS_VALUE
)
2627 int ret
= av_interleave_packet(s
, &opkt
, pkt
, 0);
2628 if(ret
<=0) //FIXME cleanup needed for ret<0 ?
2631 truncate_ts(s
->streams
[opkt
.stream_index
], &opkt
);
2632 ret
= s
->oformat
->write_packet(s
, &opkt
);
2634 av_free_packet(&opkt
);
2639 if(url_ferror(s
->pb
))
2640 return url_ferror(s
->pb
);
2644 int av_write_trailer(AVFormatContext
*s
)
2650 ret
= av_interleave_packet(s
, &pkt
, NULL
, 1);
2651 if(ret
<0) //FIXME cleanup needed for ret<0 ?
2656 truncate_ts(s
->streams
[pkt
.stream_index
], &pkt
);
2657 ret
= s
->oformat
->write_packet(s
, &pkt
);
2659 av_free_packet(&pkt
);
2663 if(url_ferror(s
->pb
))
2667 if(s
->oformat
->write_trailer
)
2668 ret
= s
->oformat
->write_trailer(s
);
2671 ret
=url_ferror(s
->pb
);
2672 for(i
=0;i
<s
->nb_streams
;i
++)
2673 av_freep(&s
->streams
[i
]->priv_data
);
2674 av_freep(&s
->priv_data
);
2678 void av_program_add_stream_index(AVFormatContext
*ac
, int progid
, unsigned int idx
)
2681 AVProgram
*program
=NULL
;
2684 for(i
=0; i
<ac
->nb_programs
; i
++){
2685 if(ac
->programs
[i
]->id
!= progid
)
2687 program
= ac
->programs
[i
];
2688 for(j
=0; j
<program
->nb_stream_indexes
; j
++)
2689 if(program
->stream_index
[j
] == idx
)
2692 tmp
= av_realloc(program
->stream_index
, sizeof(unsigned int)*(program
->nb_stream_indexes
+1));
2695 program
->stream_index
= tmp
;
2696 program
->stream_index
[program
->nb_stream_indexes
++] = idx
;
2701 /* "user interface" functions */
2702 static void dump_stream_format(AVFormatContext
*ic
, int i
, int index
, int is_output
)
2705 int flags
= (is_output
? ic
->oformat
->flags
: ic
->iformat
->flags
);
2706 AVStream
*st
= ic
->streams
[i
];
2707 int g
= ff_gcd(st
->time_base
.num
, st
->time_base
.den
);
2708 avcodec_string(buf
, sizeof(buf
), st
->codec
, is_output
);
2709 av_log(NULL
, AV_LOG_INFO
, " Stream #%d.%d", index
, i
);
2710 /* the pid is an important information, so we display it */
2711 /* XXX: add a generic system */
2712 if (flags
& AVFMT_SHOW_IDS
)
2713 av_log(NULL
, AV_LOG_INFO
, "[0x%x]", st
->id
);
2714 if (strlen(st
->language
) > 0)
2715 av_log(NULL
, AV_LOG_INFO
, "(%s)", st
->language
);
2716 av_log(NULL
, AV_LOG_DEBUG
, ", %d/%d", st
->time_base
.num
/g
, st
->time_base
.den
/g
);
2717 av_log(NULL
, AV_LOG_INFO
, ": %s", buf
);
2718 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
){
2719 if(st
->r_frame_rate
.den
&& st
->r_frame_rate
.num
)
2720 av_log(NULL
, AV_LOG_INFO
, ", %5.2f tb(r)", av_q2d(st
->r_frame_rate
));
2721 /* else if(st->time_base.den && st->time_base.num)
2722 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(m)", 1/av_q2d(st->time_base));*/
2724 av_log(NULL
, AV_LOG_INFO
, ", %5.2f tb(c)", 1/av_q2d(st
->codec
->time_base
));
2726 av_log(NULL
, AV_LOG_INFO
, "\n");
2729 void dump_format(AVFormatContext
*ic
,
2736 av_log(NULL
, AV_LOG_INFO
, "%s #%d, %s, %s '%s':\n",
2737 is_output
? "Output" : "Input",
2739 is_output
? ic
->oformat
->name
: ic
->iformat
->name
,
2740 is_output
? "to" : "from", url
);
2742 av_log(NULL
, AV_LOG_INFO
, " Duration: ");
2743 if (ic
->duration
!= AV_NOPTS_VALUE
) {
2744 int hours
, mins
, secs
, us
;
2745 secs
= ic
->duration
/ AV_TIME_BASE
;
2746 us
= ic
->duration
% AV_TIME_BASE
;
2751 av_log(NULL
, AV_LOG_INFO
, "%02d:%02d:%02d.%02d", hours
, mins
, secs
,
2752 (100 * us
) / AV_TIME_BASE
);
2754 av_log(NULL
, AV_LOG_INFO
, "N/A");
2756 if (ic
->start_time
!= AV_NOPTS_VALUE
) {
2758 av_log(NULL
, AV_LOG_INFO
, ", start: ");
2759 secs
= ic
->start_time
/ AV_TIME_BASE
;
2760 us
= ic
->start_time
% AV_TIME_BASE
;
2761 av_log(NULL
, AV_LOG_INFO
, "%d.%06d",
2762 secs
, (int)av_rescale(us
, 1000000, AV_TIME_BASE
));
2764 av_log(NULL
, AV_LOG_INFO
, ", bitrate: ");
2766 av_log(NULL
, AV_LOG_INFO
,"%d kb/s", ic
->bit_rate
/ 1000);
2768 av_log(NULL
, AV_LOG_INFO
, "N/A");
2770 av_log(NULL
, AV_LOG_INFO
, "\n");
2772 if(ic
->nb_programs
) {
2774 for(j
=0; j
<ic
->nb_programs
; j
++) {
2775 av_log(NULL
, AV_LOG_INFO
, " Program %d %s\n", ic
->programs
[j
]->id
,
2776 ic
->programs
[j
]->name
? ic
->programs
[j
]->name
: "");
2777 for(k
=0; k
<ic
->programs
[j
]->nb_stream_indexes
; k
++)
2778 dump_stream_format(ic
, ic
->programs
[j
]->stream_index
[k
], index
, is_output
);
2781 for(i
=0;i
<ic
->nb_streams
;i
++)
2782 dump_stream_format(ic
, i
, index
, is_output
);
2785 int parse_image_size(int *width_ptr
, int *height_ptr
, const char *str
)
2787 return av_parse_video_frame_size(width_ptr
, height_ptr
, str
);
2790 int parse_frame_rate(int *frame_rate_num
, int *frame_rate_den
, const char *arg
)
2792 AVRational frame_rate
;
2793 int ret
= av_parse_video_frame_rate(&frame_rate
, arg
);
2794 *frame_rate_num
= frame_rate
.num
;
2795 *frame_rate_den
= frame_rate
.den
;
2800 * Gets the current time in microseconds.
2802 int64_t av_gettime(void)
2805 gettimeofday(&tv
,NULL
);
2806 return (int64_t)tv
.tv_sec
* 1000000 + tv
.tv_usec
;
2809 int64_t parse_date(const char *datestr
, int duration
)
2815 static const char *date_fmt
[] = {
2819 static const char *time_fmt
[] = {
2829 time_t now
= time(0);
2831 len
= strlen(datestr
);
2833 lastch
= datestr
[len
- 1];
2836 is_utc
= (lastch
== 'z' || lastch
== 'Z');
2838 memset(&dt
, 0, sizeof(dt
));
2843 /* parse the year-month-day part */
2844 for (i
= 0; i
< sizeof(date_fmt
) / sizeof(date_fmt
[0]); i
++) {
2845 q
= small_strptime(p
, date_fmt
[i
], &dt
);
2851 /* if the year-month-day part is missing, then take the
2852 * current year-month-day time */
2857 dt
= *localtime(&now
);
2859 dt
.tm_hour
= dt
.tm_min
= dt
.tm_sec
= 0;
2864 if (*p
== 'T' || *p
== 't' || *p
== ' ')
2867 /* parse the hour-minute-second part */
2868 for (i
= 0; i
< sizeof(time_fmt
) / sizeof(time_fmt
[0]); i
++) {
2869 q
= small_strptime(p
, time_fmt
[i
], &dt
);
2875 /* parse datestr as a duration */
2880 /* parse datestr as HH:MM:SS */
2881 q
= small_strptime(p
, time_fmt
[0], &dt
);
2883 /* parse datestr as S+ */
2884 dt
.tm_sec
= strtol(p
, (char **)&q
, 10);
2886 /* the parsing didn't succeed */
2893 /* Now we have all the fields that we can get */
2899 t
= dt
.tm_hour
* 3600 + dt
.tm_min
* 60 + dt
.tm_sec
;
2901 dt
.tm_isdst
= -1; /* unknown */
2911 /* parse the .m... part */
2915 for (val
= 0, n
= 100000; n
>= 1; n
/= 10, q
++) {
2918 val
+= n
* (*q
- '0');
2922 return negative
? -t
: t
;
2925 int find_info_tag(char *arg
, int arg_size
, const char *tag1
, const char *info
)
2935 while (*p
!= '\0' && *p
!= '=' && *p
!= '&') {
2936 if ((q
- tag
) < sizeof(tag
) - 1)
2944 while (*p
!= '&' && *p
!= '\0') {
2945 if ((q
- arg
) < arg_size
- 1) {
2955 if (!strcmp(tag
, tag1
))
2964 int av_get_frame_filename(char *buf
, int buf_size
,
2965 const char *path
, int number
)
2968 char *q
, buf1
[20], c
;
2969 int nd
, len
, percentd_found
;
2981 while (isdigit(*p
)) {
2982 nd
= nd
* 10 + *p
++ - '0';
2985 } while (isdigit(c
));
2994 snprintf(buf1
, sizeof(buf1
), "%0*d", nd
, number
);
2996 if ((q
- buf
+ len
) > buf_size
- 1)
2998 memcpy(q
, buf1
, len
);
3006 if ((q
- buf
) < buf_size
- 1)
3010 if (!percentd_found
)
3019 static void hex_dump_internal(void *avcl
, FILE *f
, int level
, uint8_t *buf
, int size
)
3022 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3024 for(i
=0;i
<size
;i
+=16) {
3031 PRINT(" %02x", buf
[i
+j
]);
3036 for(j
=0;j
<len
;j
++) {
3038 if (c
< ' ' || c
> '~')
3047 void av_hex_dump(FILE *f
, uint8_t *buf
, int size
)
3049 hex_dump_internal(NULL
, f
, 0, buf
, size
);
3052 void av_hex_dump_log(void *avcl
, int level
, uint8_t *buf
, int size
)
3054 hex_dump_internal(avcl
, NULL
, level
, buf
, size
);
3057 //FIXME needs to know the time_base
3058 static void pkt_dump_internal(void *avcl
, FILE *f
, int level
, AVPacket
*pkt
, int dump_payload
)
3060 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3061 PRINT("stream #%d:\n", pkt
->stream_index
);
3062 PRINT(" keyframe=%d\n", ((pkt
->flags
& PKT_FLAG_KEY
) != 0));
3063 PRINT(" duration=%0.3f\n", (double)pkt
->duration
/ AV_TIME_BASE
);
3064 /* DTS is _always_ valid after av_read_frame() */
3066 if (pkt
->dts
== AV_NOPTS_VALUE
)
3069 PRINT("%0.3f", (double)pkt
->dts
/ AV_TIME_BASE
);
3070 /* PTS may not be known if B-frames are present. */
3072 if (pkt
->pts
== AV_NOPTS_VALUE
)
3075 PRINT("%0.3f", (double)pkt
->pts
/ AV_TIME_BASE
);
3077 PRINT(" size=%d\n", pkt
->size
);
3080 av_hex_dump(f
, pkt
->data
, pkt
->size
);
3083 void av_pkt_dump(FILE *f
, AVPacket
*pkt
, int dump_payload
)
3085 pkt_dump_internal(NULL
, f
, 0, pkt
, dump_payload
);
3088 void av_pkt_dump_log(void *avcl
, int level
, AVPacket
*pkt
, int dump_payload
)
3090 pkt_dump_internal(avcl
, NULL
, level
, pkt
, dump_payload
);
3093 void url_split(char *proto
, int proto_size
,
3094 char *authorization
, int authorization_size
,
3095 char *hostname
, int hostname_size
,
3097 char *path
, int path_size
,
3100 const char *p
, *ls
, *at
, *col
, *brk
;
3102 if (port_ptr
) *port_ptr
= -1;
3103 if (proto_size
> 0) proto
[0] = 0;
3104 if (authorization_size
> 0) authorization
[0] = 0;
3105 if (hostname_size
> 0) hostname
[0] = 0;
3106 if (path_size
> 0) path
[0] = 0;
3108 /* parse protocol */
3109 if ((p
= strchr(url
, ':'))) {
3110 av_strlcpy(proto
, url
, FFMIN(proto_size
, p
+ 1 - url
));
3115 /* no protocol means plain filename */
3116 av_strlcpy(path
, url
, path_size
);
3120 /* separate path from hostname */
3121 ls
= strchr(p
, '/');
3123 ls
= strchr(p
, '?');
3125 av_strlcpy(path
, ls
, path_size
);
3127 ls
= &p
[strlen(p
)]; // XXX
3129 /* the rest is hostname, use that to parse auth/port */
3131 /* authorization (user[:pass]@hostname) */
3132 if ((at
= strchr(p
, '@')) && at
< ls
) {
3133 av_strlcpy(authorization
, p
,
3134 FFMIN(authorization_size
, at
+ 1 - p
));
3135 p
= at
+ 1; /* skip '@' */
3138 if (*p
== '[' && (brk
= strchr(p
, ']')) && brk
< ls
) {
3140 av_strlcpy(hostname
, p
+ 1,
3141 FFMIN(hostname_size
, brk
- p
));
3142 if (brk
[1] == ':' && port_ptr
)
3143 *port_ptr
= atoi(brk
+ 2);
3144 } else if ((col
= strchr(p
, ':')) && col
< ls
) {
3145 av_strlcpy(hostname
, p
,
3146 FFMIN(col
+ 1 - p
, hostname_size
));
3147 if (port_ptr
) *port_ptr
= atoi(col
+ 1);
3149 av_strlcpy(hostname
, p
,
3150 FFMIN(ls
+ 1 - p
, hostname_size
));
3154 void av_set_pts_info(AVStream
*s
, int pts_wrap_bits
,
3155 int pts_num
, int pts_den
)
3157 unsigned int gcd
= ff_gcd(pts_num
, pts_den
);
3158 s
->pts_wrap_bits
= pts_wrap_bits
;
3159 s
->time_base
.num
= pts_num
/gcd
;
3160 s
->time_base
.den
= pts_den
/gcd
;
3163 av_log(NULL
, AV_LOG_DEBUG
, "st:%d removing common factor %d from timebase\n", s
->index
, gcd
);
3166 /* fraction handling */
3169 * f = val + (num / den) + 0.5.
3171 * 'num' is normalized so that it is such as 0 <= num < den.
3173 * @param f fractional number
3174 * @param val integer value
3175 * @param num must be >= 0
3176 * @param den must be >= 1
3178 static void av_frac_init(AVFrac
*f
, int64_t val
, int64_t num
, int64_t den
)
3191 * Fractional addition to f: f = f + (incr / f->den).
3193 * @param f fractional number
3194 * @param incr increment, can be positive or negative
3196 static void av_frac_add(AVFrac
*f
, int64_t incr
)
3200 num
= f
->num
+ incr
;
3203 f
->val
+= num
/ den
;
3209 } else if (num
>= den
) {
3210 f
->val
+= num
/ den
;