2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "libavcodec/opt.h"
24 #include "libavutil/avstring.h"
34 * @file libavformat/utils.c
35 * various utility functions for use within FFmpeg
38 unsigned avformat_version(void)
40 return LIBAVFORMAT_VERSION_INT
;
43 /* fraction handling */
46 * f = val + (num / den) + 0.5.
48 * 'num' is normalized so that it is such as 0 <= num < den.
50 * @param f fractional number
51 * @param val integer value
52 * @param num must be >= 0
53 * @param den must be >= 1
55 static void av_frac_init(AVFrac
*f
, int64_t val
, int64_t num
, int64_t den
)
68 * Fractional addition to f: f = f + (incr / f->den).
70 * @param f fractional number
71 * @param incr increment, can be positive or negative
73 static void av_frac_add(AVFrac
*f
, int64_t incr
)
86 } else if (num
>= den
) {
93 /** head of registered input format linked list */
94 AVInputFormat
*first_iformat
= NULL
;
95 /** head of registered output format linked list */
96 AVOutputFormat
*first_oformat
= NULL
;
98 AVInputFormat
*av_iformat_next(AVInputFormat
*f
)
100 if(f
) return f
->next
;
101 else return first_iformat
;
104 AVOutputFormat
*av_oformat_next(AVOutputFormat
*f
)
106 if(f
) return f
->next
;
107 else return first_oformat
;
110 void av_register_input_format(AVInputFormat
*format
)
114 while (*p
!= NULL
) p
= &(*p
)->next
;
119 void av_register_output_format(AVOutputFormat
*format
)
123 while (*p
!= NULL
) p
= &(*p
)->next
;
128 int match_ext(const char *filename
, const char *extensions
)
136 ext
= strrchr(filename
, '.');
142 while (*p
!= '\0' && *p
!= ',' && q
-ext1
<sizeof(ext1
)-1)
145 if (!strcasecmp(ext1
, ext
))
155 AVOutputFormat
*guess_format(const char *short_name
, const char *filename
,
156 const char *mime_type
)
158 AVOutputFormat
*fmt
, *fmt_found
;
159 int score_max
, score
;
161 /* specific test for image sequences */
162 #ifdef CONFIG_IMAGE2_MUXER
163 if (!short_name
&& filename
&&
164 av_filename_number_test(filename
) &&
165 av_guess_image2_codec(filename
) != CODEC_ID_NONE
) {
166 return guess_format("image2", NULL
, NULL
);
169 /* Find the proper file type. */
173 while (fmt
!= NULL
) {
175 if (fmt
->name
&& short_name
&& !strcmp(fmt
->name
, short_name
))
177 if (fmt
->mime_type
&& mime_type
&& !strcmp(fmt
->mime_type
, mime_type
))
179 if (filename
&& fmt
->extensions
&&
180 match_ext(filename
, fmt
->extensions
)) {
183 if (score
> score_max
) {
192 AVOutputFormat
*guess_stream_format(const char *short_name
, const char *filename
,
193 const char *mime_type
)
195 AVOutputFormat
*fmt
= guess_format(short_name
, filename
, mime_type
);
198 AVOutputFormat
*stream_fmt
;
199 char stream_format_name
[64];
201 snprintf(stream_format_name
, sizeof(stream_format_name
), "%s_stream", fmt
->name
);
202 stream_fmt
= guess_format(stream_format_name
, NULL
, NULL
);
211 enum CodecID
av_guess_codec(AVOutputFormat
*fmt
, const char *short_name
,
212 const char *filename
, const char *mime_type
, enum CodecType type
){
213 if(type
== CODEC_TYPE_VIDEO
){
214 enum CodecID codec_id
= CODEC_ID_NONE
;
216 #ifdef CONFIG_IMAGE2_MUXER
217 if(!strcmp(fmt
->name
, "image2") || !strcmp(fmt
->name
, "image2pipe")){
218 codec_id
= av_guess_image2_codec(filename
);
221 if(codec_id
== CODEC_ID_NONE
)
222 codec_id
= fmt
->video_codec
;
224 }else if(type
== CODEC_TYPE_AUDIO
)
225 return fmt
->audio_codec
;
227 return CODEC_ID_NONE
;
230 AVInputFormat
*av_find_input_format(const char *short_name
)
233 for(fmt
= first_iformat
; fmt
!= NULL
; fmt
= fmt
->next
) {
234 if (!strcmp(fmt
->name
, short_name
))
240 /* memory handling */
242 void av_destruct_packet(AVPacket
*pkt
)
245 pkt
->data
= NULL
; pkt
->size
= 0;
248 void av_init_packet(AVPacket
*pkt
)
250 pkt
->pts
= AV_NOPTS_VALUE
;
251 pkt
->dts
= AV_NOPTS_VALUE
;
254 pkt
->convergence_duration
= 0;
256 pkt
->stream_index
= 0;
257 pkt
->destruct
= av_destruct_packet_nofree
;
260 int av_new_packet(AVPacket
*pkt
, int size
)
263 if((unsigned)size
> (unsigned)size
+ FF_INPUT_BUFFER_PADDING_SIZE
)
264 return AVERROR(ENOMEM
);
265 data
= av_malloc(size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
267 return AVERROR(ENOMEM
);
268 memset(data
+ size
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
273 pkt
->destruct
= av_destruct_packet
;
277 int av_get_packet(ByteIOContext
*s
, AVPacket
*pkt
, int size
)
279 int ret
= av_new_packet(pkt
, size
);
284 pkt
->pos
= url_ftell(s
);
286 ret
= get_buffer(s
, pkt
->data
, size
);
295 int av_dup_packet(AVPacket
*pkt
)
297 if (pkt
->destruct
!= av_destruct_packet
) {
299 /* We duplicate the packet and don't forget to add the padding again. */
300 if((unsigned)pkt
->size
> (unsigned)pkt
->size
+ FF_INPUT_BUFFER_PADDING_SIZE
)
301 return AVERROR(ENOMEM
);
302 data
= av_malloc(pkt
->size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
304 return AVERROR(ENOMEM
);
306 memcpy(data
, pkt
->data
, pkt
->size
);
307 memset(data
+ pkt
->size
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
309 pkt
->destruct
= av_destruct_packet
;
314 int av_filename_number_test(const char *filename
)
317 return filename
&& (av_get_frame_filename(buf
, sizeof(buf
), filename
, 1)>=0);
320 static AVInputFormat
*av_probe_input_format2(AVProbeData
*pd
, int is_opened
, int *score_max
)
322 AVInputFormat
*fmt1
, *fmt
;
326 for(fmt1
= first_iformat
; fmt1
!= NULL
; fmt1
= fmt1
->next
) {
327 if (!is_opened
== !(fmt1
->flags
& AVFMT_NOFILE
))
330 if (fmt1
->read_probe
) {
331 score
= fmt1
->read_probe(pd
);
332 } else if (fmt1
->extensions
) {
333 if (match_ext(pd
->filename
, fmt1
->extensions
)) {
337 if (score
> *score_max
) {
340 }else if (score
== *score_max
)
346 AVInputFormat
*av_probe_input_format(AVProbeData
*pd
, int is_opened
){
348 return av_probe_input_format2(pd
, is_opened
, &score
);
351 static int set_codec_from_probe_data(AVStream
*st
, AVProbeData
*pd
, int score
)
354 fmt
= av_probe_input_format2(pd
, 1, &score
);
357 if (!strcmp(fmt
->name
, "mp3")) {
358 st
->codec
->codec_id
= CODEC_ID_MP3
;
359 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
360 } else if (!strcmp(fmt
->name
, "ac3")) {
361 st
->codec
->codec_id
= CODEC_ID_AC3
;
362 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
363 } else if (!strcmp(fmt
->name
, "mpegvideo")) {
364 st
->codec
->codec_id
= CODEC_ID_MPEG2VIDEO
;
365 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
366 } else if (!strcmp(fmt
->name
, "m4v")) {
367 st
->codec
->codec_id
= CODEC_ID_MPEG4
;
368 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
369 } else if (!strcmp(fmt
->name
, "h264")) {
370 st
->codec
->codec_id
= CODEC_ID_H264
;
371 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
377 /************************************************************/
378 /* input media file */
381 * Open a media file from an IO stream. 'fmt' must be specified.
383 static const char* format_to_name(void* ptr
)
385 AVFormatContext
* fc
= (AVFormatContext
*) ptr
;
386 if(fc
->iformat
) return fc
->iformat
->name
;
387 else if(fc
->oformat
) return fc
->oformat
->name
;
391 #define OFFSET(x) offsetof(AVFormatContext,x)
392 #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
393 //these names are too long to be readable
394 #define E AV_OPT_FLAG_ENCODING_PARAM
395 #define D AV_OPT_FLAG_DECODING_PARAM
397 static const AVOption options
[]={
398 {"probesize", NULL
, OFFSET(probesize
), FF_OPT_TYPE_INT
, 32000, 32, INT_MAX
, D
}, /* 32000 from mpegts.c: 1.0 second at 24Mbit/s */
399 {"muxrate", "set mux rate", OFFSET(mux_rate
), FF_OPT_TYPE_INT
, DEFAULT
, 0, INT_MAX
, E
},
400 {"packetsize", "set packet size", OFFSET(packet_size
), FF_OPT_TYPE_INT
, DEFAULT
, 0, INT_MAX
, E
},
401 {"fflags", NULL
, OFFSET(flags
), FF_OPT_TYPE_FLAGS
, DEFAULT
, INT_MIN
, INT_MAX
, D
|E
, "fflags"},
402 {"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST
, AVFMT_FLAG_IGNIDX
, INT_MIN
, INT_MAX
, D
, "fflags"},
403 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST
, AVFMT_FLAG_GENPTS
, INT_MIN
, INT_MAX
, D
, "fflags"},
404 {"track", " set the track number", OFFSET(track
), FF_OPT_TYPE_INT
, DEFAULT
, 0, INT_MAX
, E
},
405 {"year", "set the year", OFFSET(year
), FF_OPT_TYPE_INT
, DEFAULT
, INT_MIN
, INT_MAX
, E
},
406 {"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
},
407 {"cryptokey", "decryption key", OFFSET(key
), FF_OPT_TYPE_BINARY
, 0, 0, 0, D
},
408 {"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size
), FF_OPT_TYPE_INT
, 1<<20, 0, INT_MAX
, D
},
409 {"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 */
410 {"fdebug", "print specific debug info", OFFSET(debug
), FF_OPT_TYPE_FLAGS
, DEFAULT
, 0, INT_MAX
, E
|D
, "fdebug"},
411 {"ts", NULL
, 0, FF_OPT_TYPE_CONST
, FF_FDEBUG_TS
, INT_MIN
, INT_MAX
, E
|D
, "fdebug"},
419 static const AVClass av_format_context_class
= { "AVFormatContext", format_to_name
, options
};
421 static void avformat_get_context_defaults(AVFormatContext
*s
)
423 memset(s
, 0, sizeof(AVFormatContext
));
425 s
->av_class
= &av_format_context_class
;
427 av_opt_set_defaults(s
);
430 AVFormatContext
*av_alloc_format_context(void)
433 ic
= av_malloc(sizeof(AVFormatContext
));
435 avformat_get_context_defaults(ic
);
436 ic
->av_class
= &av_format_context_class
;
440 int av_open_input_stream(AVFormatContext
**ic_ptr
,
441 ByteIOContext
*pb
, const char *filename
,
442 AVInputFormat
*fmt
, AVFormatParameters
*ap
)
446 AVFormatParameters default_ap
;
450 memset(ap
, 0, sizeof(default_ap
));
453 if(!ap
->prealloced_context
)
454 ic
= av_alloc_format_context();
458 err
= AVERROR(ENOMEM
);
463 ic
->duration
= AV_NOPTS_VALUE
;
464 ic
->start_time
= AV_NOPTS_VALUE
;
465 av_strlcpy(ic
->filename
, filename
, sizeof(ic
->filename
));
467 /* allocate private data */
468 if (fmt
->priv_data_size
> 0) {
469 ic
->priv_data
= av_mallocz(fmt
->priv_data_size
);
470 if (!ic
->priv_data
) {
471 err
= AVERROR(ENOMEM
);
475 ic
->priv_data
= NULL
;
478 if (ic
->iformat
->read_header
) {
479 err
= ic
->iformat
->read_header(ic
, ap
);
484 if (pb
&& !ic
->data_offset
)
485 ic
->data_offset
= url_ftell(ic
->pb
);
492 av_freep(&ic
->priv_data
);
493 for(i
=0;i
<ic
->nb_streams
;i
++) {
494 AVStream
*st
= ic
->streams
[i
];
496 av_free(st
->priv_data
);
497 av_free(st
->codec
->extradata
);
507 /** size of probe buffer, for guessing file type from file contents */
508 #define PROBE_BUF_MIN 2048
509 #define PROBE_BUF_MAX (1<<20)
511 int av_open_input_file(AVFormatContext
**ic_ptr
, const char *filename
,
514 AVFormatParameters
*ap
)
517 AVProbeData probe_data
, *pd
= &probe_data
;
518 ByteIOContext
*pb
= NULL
;
522 pd
->filename
= filename
;
527 /* guess format if no file can be opened */
528 fmt
= av_probe_input_format(pd
, 0);
531 /* Do not open file if the format does not need it. XXX: specific
532 hack needed to handle RTSP/TCP */
533 if (!fmt
|| !(fmt
->flags
& AVFMT_NOFILE
)) {
534 /* if no file needed do not try to open one */
535 if ((err
=url_fopen(&pb
, filename
, URL_RDONLY
)) < 0) {
539 url_setbufsize(pb
, buf_size
);
542 for(probe_size
= PROBE_BUF_MIN
; probe_size
<=PROBE_BUF_MAX
&& !fmt
; probe_size
<<=1){
543 int score
= probe_size
< PROBE_BUF_MAX
? AVPROBE_SCORE_MAX
/4 : 0;
544 /* read probe data */
545 pd
->buf
= av_realloc(pd
->buf
, probe_size
+ AVPROBE_PADDING_SIZE
);
546 pd
->buf_size
= get_buffer(pb
, pd
->buf
, probe_size
);
547 memset(pd
->buf
+pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
548 if (url_fseek(pb
, 0, SEEK_SET
) < 0) {
550 if (url_fopen(&pb
, filename
, URL_RDONLY
) < 0) {
556 /* guess file format */
557 fmt
= av_probe_input_format2(pd
, 1, &score
);
562 /* if still no format found, error */
568 /* check filename in case an image number is expected */
569 if (fmt
->flags
& AVFMT_NEEDNUMBER
) {
570 if (!av_filename_number_test(filename
)) {
571 err
= AVERROR_NUMEXPECTED
;
575 err
= av_open_input_stream(ic_ptr
, pb
, filename
, fmt
, ap
);
588 /*******************************************************/
590 static AVPacket
*add_to_pktbuf(AVPacketList
**packet_buffer
, AVPacket
*pkt
,
591 AVPacketList
**plast_pktl
){
592 AVPacketList
*pktl
= av_mallocz(sizeof(AVPacketList
));
597 (*plast_pktl
)->next
= pktl
;
599 *packet_buffer
= pktl
;
601 /* add the packet in the buffered packet list */
607 int av_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
613 AVPacketList
*pktl
= s
->raw_packet_buffer
;
617 if(s
->streams
[pkt
->stream_index
]->codec
->codec_id
!= CODEC_ID_PROBE
){
618 s
->raw_packet_buffer
= pktl
->next
;
625 ret
= s
->iformat
->read_packet(s
, pkt
);
628 st
= s
->streams
[pkt
->stream_index
];
630 switch(st
->codec
->codec_type
){
631 case CODEC_TYPE_VIDEO
:
632 if(s
->video_codec_id
) st
->codec
->codec_id
= s
->video_codec_id
;
634 case CODEC_TYPE_AUDIO
:
635 if(s
->audio_codec_id
) st
->codec
->codec_id
= s
->audio_codec_id
;
637 case CODEC_TYPE_SUBTITLE
:
638 if(s
->subtitle_codec_id
)st
->codec
->codec_id
= s
->subtitle_codec_id
;
642 if(!pktl
&& st
->codec
->codec_id
!=CODEC_ID_PROBE
)
645 add_to_pktbuf(&s
->raw_packet_buffer
, pkt
, &s
->raw_packet_buffer_end
);
647 if(st
->codec
->codec_id
== CODEC_ID_PROBE
){
648 AVProbeData
*pd
= &st
->probe_data
;
650 pd
->buf
= av_realloc(pd
->buf
, pd
->buf_size
+pkt
->size
+AVPROBE_PADDING_SIZE
);
651 memcpy(pd
->buf
+pd
->buf_size
, pkt
->data
, pkt
->size
);
652 pd
->buf_size
+= pkt
->size
;
653 memset(pd
->buf
+pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
655 if(av_log2(pd
->buf_size
) != av_log2(pd
->buf_size
- pkt
->size
)){
656 set_codec_from_probe_data(st
, pd
, 1);
657 if(st
->codec
->codec_id
!= CODEC_ID_PROBE
){
666 /**********************************************************/
669 * Get the number of samples of an audio frame. Return -1 on error.
671 static int get_audio_frame_size(AVCodecContext
*enc
, int size
)
675 if(enc
->codec_id
== CODEC_ID_VORBIS
)
678 if (enc
->frame_size
<= 1) {
679 int bits_per_sample
= av_get_bits_per_sample(enc
->codec_id
);
681 if (bits_per_sample
) {
682 if (enc
->channels
== 0)
684 frame_size
= (size
<< 3) / (bits_per_sample
* enc
->channels
);
686 /* used for example by ADPCM codecs */
687 if (enc
->bit_rate
== 0)
689 frame_size
= (size
* 8 * enc
->sample_rate
) / enc
->bit_rate
;
692 frame_size
= enc
->frame_size
;
699 * Return the frame duration in seconds. Return 0 if not available.
701 static void compute_frame_duration(int *pnum
, int *pden
, AVStream
*st
,
702 AVCodecParserContext
*pc
, AVPacket
*pkt
)
708 switch(st
->codec
->codec_type
) {
709 case CODEC_TYPE_VIDEO
:
710 if(st
->time_base
.num
*1000LL > st
->time_base
.den
){
711 *pnum
= st
->time_base
.num
;
712 *pden
= st
->time_base
.den
;
713 }else if(st
->codec
->time_base
.num
*1000LL > st
->codec
->time_base
.den
){
714 *pnum
= st
->codec
->time_base
.num
;
715 *pden
= st
->codec
->time_base
.den
;
716 if (pc
&& pc
->repeat_pict
) {
718 *pnum
= (*pnum
) * (2 + pc
->repeat_pict
);
722 case CODEC_TYPE_AUDIO
:
723 frame_size
= get_audio_frame_size(st
->codec
, pkt
->size
);
727 *pden
= st
->codec
->sample_rate
;
734 static int is_intra_only(AVCodecContext
*enc
){
735 if(enc
->codec_type
== CODEC_TYPE_AUDIO
){
737 }else if(enc
->codec_type
== CODEC_TYPE_VIDEO
){
738 switch(enc
->codec_id
){
740 case CODEC_ID_MJPEGB
:
742 case CODEC_ID_RAWVIDEO
:
743 case CODEC_ID_DVVIDEO
:
744 case CODEC_ID_HUFFYUV
:
745 case CODEC_ID_FFVHUFF
:
756 static void update_initial_timestamps(AVFormatContext
*s
, int stream_index
,
757 int64_t dts
, int64_t pts
)
759 AVStream
*st
= s
->streams
[stream_index
];
760 AVPacketList
*pktl
= s
->packet_buffer
;
762 if(st
->first_dts
!= AV_NOPTS_VALUE
|| dts
== AV_NOPTS_VALUE
|| st
->cur_dts
== AV_NOPTS_VALUE
)
765 st
->first_dts
= dts
- st
->cur_dts
;
768 for(; pktl
; pktl
= pktl
->next
){
769 if(pktl
->pkt
.stream_index
!= stream_index
)
771 //FIXME think more about this check
772 if(pktl
->pkt
.pts
!= AV_NOPTS_VALUE
&& pktl
->pkt
.pts
== pktl
->pkt
.dts
)
773 pktl
->pkt
.pts
+= st
->first_dts
;
775 if(pktl
->pkt
.dts
!= AV_NOPTS_VALUE
)
776 pktl
->pkt
.dts
+= st
->first_dts
;
778 if(st
->start_time
== AV_NOPTS_VALUE
&& pktl
->pkt
.pts
!= AV_NOPTS_VALUE
)
779 st
->start_time
= pktl
->pkt
.pts
;
781 if (st
->start_time
== AV_NOPTS_VALUE
)
782 st
->start_time
= pts
;
785 static void update_initial_durations(AVFormatContext
*s
, AVStream
*st
, AVPacket
*pkt
)
787 AVPacketList
*pktl
= s
->packet_buffer
;
790 if(st
->first_dts
!= AV_NOPTS_VALUE
){
791 cur_dts
= st
->first_dts
;
792 for(; pktl
; pktl
= pktl
->next
){
793 if(pktl
->pkt
.stream_index
== pkt
->stream_index
){
794 if(pktl
->pkt
.pts
!= pktl
->pkt
.dts
|| pktl
->pkt
.dts
!= AV_NOPTS_VALUE
|| pktl
->pkt
.duration
)
796 cur_dts
-= pkt
->duration
;
799 pktl
= s
->packet_buffer
;
800 st
->first_dts
= cur_dts
;
801 }else if(st
->cur_dts
)
804 for(; pktl
; pktl
= pktl
->next
){
805 if(pktl
->pkt
.stream_index
!= pkt
->stream_index
)
807 if(pktl
->pkt
.pts
== pktl
->pkt
.dts
&& pktl
->pkt
.dts
== AV_NOPTS_VALUE
808 && !pktl
->pkt
.duration
){
809 pktl
->pkt
.dts
= cur_dts
;
810 if(!st
->codec
->has_b_frames
)
811 pktl
->pkt
.pts
= cur_dts
;
812 cur_dts
+= pkt
->duration
;
813 pktl
->pkt
.duration
= pkt
->duration
;
817 if(st
->first_dts
== AV_NOPTS_VALUE
)
818 st
->cur_dts
= cur_dts
;
821 static void compute_pkt_fields(AVFormatContext
*s
, AVStream
*st
,
822 AVCodecParserContext
*pc
, AVPacket
*pkt
)
824 int num
, den
, presentation_delayed
, delay
, i
;
827 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->dts
> pkt
->pts
&& st
->pts_wrap_bits
<63
828 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
829 pkt
->dts
-= 1LL<<st
->pts_wrap_bits
;
832 if (pkt
->duration
== 0) {
833 compute_frame_duration(&num
, &den
, st
, pc
, pkt
);
835 pkt
->duration
= av_rescale(1, num
* (int64_t)st
->time_base
.den
, den
* (int64_t)st
->time_base
.num
);
837 if(pkt
->duration
!= 0 && s
->packet_buffer
)
838 update_initial_durations(s
, st
, pkt
);
842 /* correct timestamps with byte offset if demuxers only have timestamps
843 on packet boundaries */
844 if(pc
&& st
->need_parsing
== AVSTREAM_PARSE_TIMESTAMPS
&& pkt
->size
){
845 /* this will estimate bitrate based on this frame's duration and size */
846 offset
= av_rescale(pc
->offset
, pkt
->duration
, pkt
->size
);
847 if(pkt
->pts
!= AV_NOPTS_VALUE
)
849 if(pkt
->dts
!= AV_NOPTS_VALUE
)
853 /* do we have a video B-frame ? */
854 delay
= st
->codec
->has_b_frames
;
855 presentation_delayed
= 0;
856 /* XXX: need has_b_frame, but cannot get it if the codec is
859 pc
&& pc
->pict_type
!= FF_B_TYPE
)
860 presentation_delayed
= 1;
861 /* This may be redundant, but it should not hurt. */
862 if(pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->pts
> pkt
->dts
)
863 presentation_delayed
= 1;
865 // 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);
866 /* interpolate PTS and DTS if they are not present */
867 if(delay
==0 || (delay
==1 && pc
)){
868 if (presentation_delayed
) {
869 /* DTS = decompression timestamp */
870 /* PTS = presentation timestamp */
871 if (pkt
->dts
== AV_NOPTS_VALUE
)
872 pkt
->dts
= st
->last_IP_pts
;
873 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
);
874 if (pkt
->dts
== AV_NOPTS_VALUE
)
875 pkt
->dts
= st
->cur_dts
;
877 /* this is tricky: the dts must be incremented by the duration
878 of the frame we are displaying, i.e. the last I- or P-frame */
879 if (st
->last_IP_duration
== 0)
880 st
->last_IP_duration
= pkt
->duration
;
881 if(pkt
->dts
!= AV_NOPTS_VALUE
)
882 st
->cur_dts
= pkt
->dts
+ st
->last_IP_duration
;
883 st
->last_IP_duration
= pkt
->duration
;
884 st
->last_IP_pts
= pkt
->pts
;
885 /* cannot compute PTS if not present (we can compute it only
886 by knowing the future */
887 } else if(pkt
->pts
!= AV_NOPTS_VALUE
|| pkt
->dts
!= AV_NOPTS_VALUE
|| pkt
->duration
){
888 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->duration
){
889 int64_t old_diff
= FFABS(st
->cur_dts
- pkt
->duration
- pkt
->pts
);
890 int64_t new_diff
= FFABS(st
->cur_dts
- pkt
->pts
);
891 if(old_diff
< new_diff
&& old_diff
< (pkt
->duration
>>3)){
892 pkt
->pts
+= pkt
->duration
;
893 // 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);
897 /* presentation is not delayed : PTS and DTS are the same */
898 if(pkt
->pts
== AV_NOPTS_VALUE
)
900 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->pts
, pkt
->pts
);
901 if(pkt
->pts
== AV_NOPTS_VALUE
)
902 pkt
->pts
= st
->cur_dts
;
904 if(pkt
->pts
!= AV_NOPTS_VALUE
)
905 st
->cur_dts
= pkt
->pts
+ pkt
->duration
;
909 if(pkt
->pts
!= AV_NOPTS_VALUE
&& delay
<= MAX_REORDER_DELAY
){
910 st
->pts_buffer
[0]= pkt
->pts
;
911 for(i
=0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+1]; i
++)
912 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+1]);
913 if(pkt
->dts
== AV_NOPTS_VALUE
)
914 pkt
->dts
= st
->pts_buffer
[0];
916 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
); // this should happen on the first packet
918 if(pkt
->dts
> st
->cur_dts
)
919 st
->cur_dts
= pkt
->dts
;
922 // 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);
925 if(is_intra_only(st
->codec
))
926 pkt
->flags
|= PKT_FLAG_KEY
;
929 /* keyframe computation */
930 if (pc
->pict_type
== FF_I_TYPE
)
931 pkt
->flags
|= PKT_FLAG_KEY
;
935 void av_destruct_packet_nofree(AVPacket
*pkt
)
937 pkt
->data
= NULL
; pkt
->size
= 0;
940 static int av_read_frame_internal(AVFormatContext
*s
, AVPacket
*pkt
)
948 /* select current input stream component */
951 if (!st
->need_parsing
|| !st
->parser
) {
952 /* no parsing needed: we just output the packet as is */
953 /* raw data support */
955 compute_pkt_fields(s
, st
, NULL
, pkt
);
958 } else if (s
->cur_len
> 0 && st
->discard
< AVDISCARD_ALL
) {
959 len
= av_parser_parse(st
->parser
, st
->codec
, &pkt
->data
, &pkt
->size
,
960 s
->cur_ptr
, s
->cur_len
,
961 s
->cur_pkt
.pts
, s
->cur_pkt
.dts
);
962 s
->cur_pkt
.pts
= AV_NOPTS_VALUE
;
963 s
->cur_pkt
.dts
= AV_NOPTS_VALUE
;
964 /* increment read pointer */
968 /* return packet if any */
971 pkt
->pos
= s
->cur_pkt
.pos
; // Isn't quite accurate but close.
973 pkt
->stream_index
= st
->index
;
974 pkt
->pts
= st
->parser
->pts
;
975 pkt
->dts
= st
->parser
->dts
;
976 pkt
->destruct
= av_destruct_packet_nofree
;
977 compute_pkt_fields(s
, st
, st
->parser
, pkt
);
979 if((s
->iformat
->flags
& AVFMT_GENERIC_INDEX
) && pkt
->flags
& PKT_FLAG_KEY
){
980 ff_reduce_index(s
, st
->index
);
981 av_add_index_entry(st
, st
->parser
->frame_offset
, pkt
->dts
,
982 0, 0, AVINDEX_KEYFRAME
);
989 av_free_packet(&s
->cur_pkt
);
993 /* read next packet */
994 ret
= av_read_packet(s
, &s
->cur_pkt
);
996 if (ret
== AVERROR(EAGAIN
))
998 /* return the last frames, if any */
999 for(i
= 0; i
< s
->nb_streams
; i
++) {
1001 if (st
->parser
&& st
->need_parsing
) {
1002 av_parser_parse(st
->parser
, st
->codec
,
1003 &pkt
->data
, &pkt
->size
,
1005 AV_NOPTS_VALUE
, AV_NOPTS_VALUE
);
1010 /* no more packets: really terminate parsing */
1014 if(s
->cur_pkt
.pts
!= AV_NOPTS_VALUE
&&
1015 s
->cur_pkt
.dts
!= AV_NOPTS_VALUE
&&
1016 s
->cur_pkt
.pts
< s
->cur_pkt
.dts
){
1017 av_log(s
, AV_LOG_WARNING
, "Invalid timestamps stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d\n",
1018 s
->cur_pkt
.stream_index
,
1022 // av_free_packet(&s->cur_pkt);
1026 st
= s
->streams
[s
->cur_pkt
.stream_index
];
1027 if(s
->debug
& FF_FDEBUG_TS
)
1028 av_log(s
, AV_LOG_DEBUG
, "av_read_packet stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d, flags=%d\n",
1029 s
->cur_pkt
.stream_index
,
1036 s
->cur_ptr
= s
->cur_pkt
.data
;
1037 s
->cur_len
= s
->cur_pkt
.size
;
1038 if (st
->need_parsing
&& !st
->parser
) {
1039 st
->parser
= av_parser_init(st
->codec
->codec_id
);
1041 /* no parser available: just output the raw packets */
1042 st
->need_parsing
= AVSTREAM_PARSE_NONE
;
1043 }else if(st
->need_parsing
== AVSTREAM_PARSE_HEADERS
){
1044 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
1046 if(st
->parser
&& (s
->iformat
->flags
& AVFMT_GENERIC_INDEX
)){
1047 st
->parser
->next_frame_offset
=
1048 st
->parser
->cur_offset
= s
->cur_pkt
.pos
;
1053 if(s
->debug
& FF_FDEBUG_TS
)
1054 av_log(s
, AV_LOG_DEBUG
, "av_read_frame_internal stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d, flags=%d\n",
1064 int av_read_frame(AVFormatContext
*s
, AVPacket
*pkt
)
1068 const int genpts
= s
->flags
& AVFMT_FLAG_GENPTS
;
1071 pktl
= s
->packet_buffer
;
1073 AVPacket
*next_pkt
= &pktl
->pkt
;
1075 if(genpts
&& next_pkt
->dts
!= AV_NOPTS_VALUE
){
1076 while(pktl
&& next_pkt
->pts
== AV_NOPTS_VALUE
){
1077 if( pktl
->pkt
.stream_index
== next_pkt
->stream_index
1078 && next_pkt
->dts
< pktl
->pkt
.dts
1079 && pktl
->pkt
.pts
!= pktl
->pkt
.dts
//not b frame
1080 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1081 next_pkt
->pts
= pktl
->pkt
.dts
;
1085 pktl
= s
->packet_buffer
;
1088 if( next_pkt
->pts
!= AV_NOPTS_VALUE
1089 || next_pkt
->dts
== AV_NOPTS_VALUE
1091 /* read packet from packet buffer, if there is data */
1093 s
->packet_buffer
= pktl
->next
;
1099 int ret
= av_read_frame_internal(s
, pkt
);
1101 if(pktl
&& ret
!= AVERROR(EAGAIN
)){
1108 if(av_dup_packet(add_to_pktbuf(&s
->packet_buffer
, pkt
,
1109 &s
->packet_buffer_end
)) < 0)
1110 return AVERROR(ENOMEM
);
1112 assert(!s
->packet_buffer
);
1113 return av_read_frame_internal(s
, pkt
);
1118 /* XXX: suppress the packet queue */
1119 static void flush_packet_queue(AVFormatContext
*s
)
1124 pktl
= s
->packet_buffer
;
1127 s
->packet_buffer
= pktl
->next
;
1128 av_free_packet(&pktl
->pkt
);
1133 /*******************************************************/
1136 int av_find_default_stream_index(AVFormatContext
*s
)
1138 int first_audio_index
= -1;
1142 if (s
->nb_streams
<= 0)
1144 for(i
= 0; i
< s
->nb_streams
; i
++) {
1146 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
1149 if (first_audio_index
< 0 && st
->codec
->codec_type
== CODEC_TYPE_AUDIO
)
1150 first_audio_index
= i
;
1152 return first_audio_index
>= 0 ? first_audio_index
: 0;
1156 * Flush the frame reader.
1158 static void av_read_frame_flush(AVFormatContext
*s
)
1163 flush_packet_queue(s
);
1165 /* free previous packet */
1167 if (s
->cur_st
->parser
)
1168 av_free_packet(&s
->cur_pkt
);
1175 /* for each stream, reset read state */
1176 for(i
= 0; i
< s
->nb_streams
; i
++) {
1180 av_parser_close(st
->parser
);
1183 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1184 st
->cur_dts
= AV_NOPTS_VALUE
; /* we set the current DTS to an unspecified origin */
1188 void av_update_cur_dts(AVFormatContext
*s
, AVStream
*ref_st
, int64_t timestamp
){
1191 for(i
= 0; i
< s
->nb_streams
; i
++) {
1192 AVStream
*st
= s
->streams
[i
];
1194 st
->cur_dts
= av_rescale(timestamp
,
1195 st
->time_base
.den
* (int64_t)ref_st
->time_base
.num
,
1196 st
->time_base
.num
* (int64_t)ref_st
->time_base
.den
);
1200 void ff_reduce_index(AVFormatContext
*s
, int stream_index
)
1202 AVStream
*st
= s
->streams
[stream_index
];
1203 unsigned int max_entries
= s
->max_index_size
/ sizeof(AVIndexEntry
);
1205 if((unsigned)st
->nb_index_entries
>= max_entries
){
1207 for(i
=0; 2*i
<st
->nb_index_entries
; i
++)
1208 st
->index_entries
[i
]= st
->index_entries
[2*i
];
1209 st
->nb_index_entries
= i
;
1213 int av_add_index_entry(AVStream
*st
,
1214 int64_t pos
, int64_t timestamp
, int size
, int distance
, int flags
)
1216 AVIndexEntry
*entries
, *ie
;
1219 if((unsigned)st
->nb_index_entries
+ 1 >= UINT_MAX
/ sizeof(AVIndexEntry
))
1222 entries
= av_fast_realloc(st
->index_entries
,
1223 &st
->index_entries_allocated_size
,
1224 (st
->nb_index_entries
+ 1) *
1225 sizeof(AVIndexEntry
));
1229 st
->index_entries
= entries
;
1231 index
= av_index_search_timestamp(st
, timestamp
, AVSEEK_FLAG_ANY
);
1234 index
= st
->nb_index_entries
++;
1235 ie
= &entries
[index
];
1236 assert(index
==0 || ie
[-1].timestamp
< timestamp
);
1238 ie
= &entries
[index
];
1239 if(ie
->timestamp
!= timestamp
){
1240 if(ie
->timestamp
<= timestamp
)
1242 memmove(entries
+ index
+ 1, entries
+ index
, sizeof(AVIndexEntry
)*(st
->nb_index_entries
- index
));
1243 st
->nb_index_entries
++;
1244 }else if(ie
->pos
== pos
&& distance
< ie
->min_distance
) //do not reduce the distance
1245 distance
= ie
->min_distance
;
1249 ie
->timestamp
= timestamp
;
1250 ie
->min_distance
= distance
;
1257 int av_index_search_timestamp(AVStream
*st
, int64_t wanted_timestamp
,
1260 AVIndexEntry
*entries
= st
->index_entries
;
1261 int nb_entries
= st
->nb_index_entries
;
1270 timestamp
= entries
[m
].timestamp
;
1271 if(timestamp
>= wanted_timestamp
)
1273 if(timestamp
<= wanted_timestamp
)
1276 m
= (flags
& AVSEEK_FLAG_BACKWARD
) ? a
: b
;
1278 if(!(flags
& AVSEEK_FLAG_ANY
)){
1279 while(m
>=0 && m
<nb_entries
&& !(entries
[m
].flags
& AVINDEX_KEYFRAME
)){
1280 m
+= (flags
& AVSEEK_FLAG_BACKWARD
) ? -1 : 1;
1291 int av_seek_frame_binary(AVFormatContext
*s
, int stream_index
, int64_t target_ts
, int flags
){
1292 AVInputFormat
*avif
= s
->iformat
;
1293 int64_t pos_min
, pos_max
, pos
, pos_limit
;
1294 int64_t ts_min
, ts_max
, ts
;
1298 if (stream_index
< 0)
1302 av_log(s
, AV_LOG_DEBUG
, "read_seek: %d %"PRId64
"\n", stream_index
, target_ts
);
1306 ts_min
= AV_NOPTS_VALUE
;
1307 pos_limit
= -1; //gcc falsely says it may be uninitialized
1309 st
= s
->streams
[stream_index
];
1310 if(st
->index_entries
){
1313 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()
1314 index
= FFMAX(index
, 0);
1315 e
= &st
->index_entries
[index
];
1317 if(e
->timestamp
<= target_ts
|| e
->pos
== e
->min_distance
){
1319 ts_min
= e
->timestamp
;
1321 av_log(s
, AV_LOG_DEBUG
, "using cached pos_min=0x%"PRIx64
" dts_min=%"PRId64
"\n",
1328 index
= av_index_search_timestamp(st
, target_ts
, flags
& ~AVSEEK_FLAG_BACKWARD
);
1329 assert(index
< st
->nb_index_entries
);
1331 e
= &st
->index_entries
[index
];
1332 assert(e
->timestamp
>= target_ts
);
1334 ts_max
= e
->timestamp
;
1335 pos_limit
= pos_max
- e
->min_distance
;
1337 av_log(s
, AV_LOG_DEBUG
, "using cached pos_max=0x%"PRIx64
" pos_limit=0x%"PRIx64
" dts_max=%"PRId64
"\n",
1338 pos_max
,pos_limit
, ts_max
);
1343 pos
= av_gen_search(s
, stream_index
, target_ts
, pos_min
, pos_max
, pos_limit
, ts_min
, ts_max
, flags
, &ts
, avif
->read_timestamp
);
1348 url_fseek(s
->pb
, pos
, SEEK_SET
);
1350 av_update_cur_dts(s
, st
, ts
);
1355 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 )){
1357 int64_t start_pos
, filesize
;
1361 av_log(s
, AV_LOG_DEBUG
, "gen_seek: %d %"PRId64
"\n", stream_index
, target_ts
);
1364 if(ts_min
== AV_NOPTS_VALUE
){
1365 pos_min
= s
->data_offset
;
1366 ts_min
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1367 if (ts_min
== AV_NOPTS_VALUE
)
1371 if(ts_max
== AV_NOPTS_VALUE
){
1373 filesize
= url_fsize(s
->pb
);
1374 pos_max
= filesize
- 1;
1377 ts_max
= read_timestamp(s
, stream_index
, &pos_max
, pos_max
+ step
);
1379 }while(ts_max
== AV_NOPTS_VALUE
&& pos_max
>= step
);
1380 if (ts_max
== AV_NOPTS_VALUE
)
1384 int64_t tmp_pos
= pos_max
+ 1;
1385 int64_t tmp_ts
= read_timestamp(s
, stream_index
, &tmp_pos
, INT64_MAX
);
1386 if(tmp_ts
== AV_NOPTS_VALUE
)
1390 if(tmp_pos
>= filesize
)
1396 if(ts_min
> ts_max
){
1398 }else if(ts_min
== ts_max
){
1403 while (pos_min
< pos_limit
) {
1405 av_log(s
, AV_LOG_DEBUG
, "pos_min=0x%"PRIx64
" pos_max=0x%"PRIx64
" dts_min=%"PRId64
" dts_max=%"PRId64
"\n",
1409 assert(pos_limit
<= pos_max
);
1412 int64_t approximate_keyframe_distance
= pos_max
- pos_limit
;
1413 // interpolate position (better than dichotomy)
1414 pos
= av_rescale(target_ts
- ts_min
, pos_max
- pos_min
, ts_max
- ts_min
)
1415 + pos_min
- approximate_keyframe_distance
;
1416 }else if(no_change
==1){
1417 // bisection, if interpolation failed to change min or max pos last time
1418 pos
= (pos_min
+ pos_limit
)>>1;
1420 /* linear search if bisection failed, can only happen if there
1421 are very few or no keyframes between min/max */
1426 else if(pos
> pos_limit
)
1430 ts
= read_timestamp(s
, stream_index
, &pos
, INT64_MAX
); //may pass pos_limit instead of -1
1436 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
);
1438 if(ts
== AV_NOPTS_VALUE
){
1439 av_log(s
, AV_LOG_ERROR
, "read_timestamp() failed in the middle\n");
1442 assert(ts
!= AV_NOPTS_VALUE
);
1443 if (target_ts
<= ts
) {
1444 pos_limit
= start_pos
- 1;
1448 if (target_ts
>= ts
) {
1454 pos
= (flags
& AVSEEK_FLAG_BACKWARD
) ? pos_min
: pos_max
;
1455 ts
= (flags
& AVSEEK_FLAG_BACKWARD
) ? ts_min
: ts_max
;
1458 ts_min
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1460 ts_max
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1461 av_log(s
, AV_LOG_DEBUG
, "pos=0x%"PRIx64
" %"PRId64
"<=%"PRId64
"<=%"PRId64
"\n",
1462 pos
, ts_min
, target_ts
, ts_max
);
1468 static int av_seek_frame_byte(AVFormatContext
*s
, int stream_index
, int64_t pos
, int flags
){
1469 int64_t pos_min
, pos_max
;
1473 if (stream_index
< 0)
1476 st
= s
->streams
[stream_index
];
1479 pos_min
= s
->data_offset
;
1480 pos_max
= url_fsize(s
->pb
) - 1;
1482 if (pos
< pos_min
) pos
= pos_min
;
1483 else if(pos
> pos_max
) pos
= pos_max
;
1485 url_fseek(s
->pb
, pos
, SEEK_SET
);
1488 av_update_cur_dts(s
, st
, ts
);
1493 static int av_seek_frame_generic(AVFormatContext
*s
,
1494 int stream_index
, int64_t timestamp
, int flags
)
1500 st
= s
->streams
[stream_index
];
1502 index
= av_index_search_timestamp(st
, timestamp
, flags
);
1504 if(index
< 0 || index
==st
->nb_index_entries
-1){
1508 if(st
->nb_index_entries
){
1509 assert(st
->index_entries
);
1510 ie
= &st
->index_entries
[st
->nb_index_entries
-1];
1511 if ((ret
= url_fseek(s
->pb
, ie
->pos
, SEEK_SET
)) < 0)
1513 av_update_cur_dts(s
, st
, ie
->timestamp
);
1515 if ((ret
= url_fseek(s
->pb
, 0, SEEK_SET
)) < 0)
1519 int ret
= av_read_frame(s
, &pkt
);
1522 av_free_packet(&pkt
);
1523 if(stream_index
== pkt
.stream_index
){
1524 if((pkt
.flags
& PKT_FLAG_KEY
) && pkt
.dts
> timestamp
)
1528 index
= av_index_search_timestamp(st
, timestamp
, flags
);
1533 av_read_frame_flush(s
);
1534 if (s
->iformat
->read_seek
){
1535 if(s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
) >= 0)
1538 ie
= &st
->index_entries
[index
];
1539 if ((ret
= url_fseek(s
->pb
, ie
->pos
, SEEK_SET
)) < 0)
1541 av_update_cur_dts(s
, st
, ie
->timestamp
);
1546 int av_seek_frame(AVFormatContext
*s
, int stream_index
, int64_t timestamp
, int flags
)
1551 av_read_frame_flush(s
);
1553 if(flags
& AVSEEK_FLAG_BYTE
)
1554 return av_seek_frame_byte(s
, stream_index
, timestamp
, flags
);
1556 if(stream_index
< 0){
1557 stream_index
= av_find_default_stream_index(s
);
1558 if(stream_index
< 0)
1561 st
= s
->streams
[stream_index
];
1562 /* timestamp for default must be expressed in AV_TIME_BASE units */
1563 timestamp
= av_rescale(timestamp
, st
->time_base
.den
, AV_TIME_BASE
* (int64_t)st
->time_base
.num
);
1566 /* first, we try the format specific seek */
1567 if (s
->iformat
->read_seek
)
1568 ret
= s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
);
1575 if(s
->iformat
->read_timestamp
)
1576 return av_seek_frame_binary(s
, stream_index
, timestamp
, flags
);
1578 return av_seek_frame_generic(s
, stream_index
, timestamp
, flags
);
1581 /*******************************************************/
1584 * Returns TRUE if the stream has accurate duration in any stream.
1586 * @return TRUE if the stream has accurate duration for at least one component.
1588 static int av_has_duration(AVFormatContext
*ic
)
1593 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1594 st
= ic
->streams
[i
];
1595 if (st
->duration
!= AV_NOPTS_VALUE
)
1602 * Estimate the stream timings from the one of each components.
1604 * Also computes the global bitrate if possible.
1606 static void av_update_stream_timings(AVFormatContext
*ic
)
1608 int64_t start_time
, start_time1
, end_time
, end_time1
;
1609 int64_t duration
, duration1
;
1613 start_time
= INT64_MAX
;
1614 end_time
= INT64_MIN
;
1615 duration
= INT64_MIN
;
1616 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1617 st
= ic
->streams
[i
];
1618 if (st
->start_time
!= AV_NOPTS_VALUE
&& st
->time_base
.den
) {
1619 start_time1
= av_rescale_q(st
->start_time
, st
->time_base
, AV_TIME_BASE_Q
);
1620 if (start_time1
< start_time
)
1621 start_time
= start_time1
;
1622 if (st
->duration
!= AV_NOPTS_VALUE
) {
1623 end_time1
= start_time1
1624 + av_rescale_q(st
->duration
, st
->time_base
, AV_TIME_BASE_Q
);
1625 if (end_time1
> end_time
)
1626 end_time
= end_time1
;
1629 if (st
->duration
!= AV_NOPTS_VALUE
) {
1630 duration1
= av_rescale_q(st
->duration
, st
->time_base
, AV_TIME_BASE_Q
);
1631 if (duration1
> duration
)
1632 duration
= duration1
;
1635 if (start_time
!= INT64_MAX
) {
1636 ic
->start_time
= start_time
;
1637 if (end_time
!= INT64_MIN
) {
1638 if (end_time
- start_time
> duration
)
1639 duration
= end_time
- start_time
;
1642 if (duration
!= INT64_MIN
) {
1643 ic
->duration
= duration
;
1644 if (ic
->file_size
> 0) {
1645 /* compute the bitrate */
1646 ic
->bit_rate
= (double)ic
->file_size
* 8.0 * AV_TIME_BASE
/
1647 (double)ic
->duration
;
1652 static void fill_all_stream_timings(AVFormatContext
*ic
)
1657 av_update_stream_timings(ic
);
1658 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1659 st
= ic
->streams
[i
];
1660 if (st
->start_time
== AV_NOPTS_VALUE
) {
1661 if(ic
->start_time
!= AV_NOPTS_VALUE
)
1662 st
->start_time
= av_rescale_q(ic
->start_time
, AV_TIME_BASE_Q
, st
->time_base
);
1663 if(ic
->duration
!= AV_NOPTS_VALUE
)
1664 st
->duration
= av_rescale_q(ic
->duration
, AV_TIME_BASE_Q
, st
->time_base
);
1669 static void av_estimate_timings_from_bit_rate(AVFormatContext
*ic
)
1671 int64_t filesize
, duration
;
1675 /* if bit_rate is already set, we believe it */
1676 if (ic
->bit_rate
== 0) {
1678 for(i
=0;i
<ic
->nb_streams
;i
++) {
1679 st
= ic
->streams
[i
];
1680 bit_rate
+= st
->codec
->bit_rate
;
1682 ic
->bit_rate
= bit_rate
;
1685 /* if duration is already set, we believe it */
1686 if (ic
->duration
== AV_NOPTS_VALUE
&&
1687 ic
->bit_rate
!= 0 &&
1688 ic
->file_size
!= 0) {
1689 filesize
= ic
->file_size
;
1691 for(i
= 0; i
< ic
->nb_streams
; i
++) {
1692 st
= ic
->streams
[i
];
1693 duration
= av_rescale(8*filesize
, st
->time_base
.den
, ic
->bit_rate
*(int64_t)st
->time_base
.num
);
1694 if (st
->duration
== AV_NOPTS_VALUE
)
1695 st
->duration
= duration
;
1701 #define DURATION_MAX_READ_SIZE 250000
1703 /* only usable for MPEG-PS streams */
1704 static void av_estimate_timings_from_pts(AVFormatContext
*ic
, offset_t old_offset
)
1706 AVPacket pkt1
, *pkt
= &pkt1
;
1708 int read_size
, i
, ret
;
1710 int64_t filesize
, offset
, duration
;
1712 /* free previous packet */
1713 if (ic
->cur_st
&& ic
->cur_st
->parser
)
1714 av_free_packet(&ic
->cur_pkt
);
1717 /* flush packet queue */
1718 flush_packet_queue(ic
);
1720 for(i
=0;i
<ic
->nb_streams
;i
++) {
1721 st
= ic
->streams
[i
];
1723 av_parser_close(st
->parser
);
1728 /* we read the first packets to get the first PTS (not fully
1729 accurate, but it is enough now) */
1730 url_fseek(ic
->pb
, 0, SEEK_SET
);
1733 if (read_size
>= DURATION_MAX_READ_SIZE
)
1735 /* if all info is available, we can stop */
1736 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1737 st
= ic
->streams
[i
];
1738 if (st
->start_time
== AV_NOPTS_VALUE
)
1741 if (i
== ic
->nb_streams
)
1744 ret
= av_read_packet(ic
, pkt
);
1747 read_size
+= pkt
->size
;
1748 st
= ic
->streams
[pkt
->stream_index
];
1749 if (pkt
->pts
!= AV_NOPTS_VALUE
) {
1750 if (st
->start_time
== AV_NOPTS_VALUE
)
1751 st
->start_time
= pkt
->pts
;
1753 av_free_packet(pkt
);
1756 /* estimate the end time (duration) */
1757 /* XXX: may need to support wrapping */
1758 filesize
= ic
->file_size
;
1759 offset
= filesize
- DURATION_MAX_READ_SIZE
;
1763 url_fseek(ic
->pb
, offset
, SEEK_SET
);
1766 if (read_size
>= DURATION_MAX_READ_SIZE
)
1769 ret
= av_read_packet(ic
, pkt
);
1772 read_size
+= pkt
->size
;
1773 st
= ic
->streams
[pkt
->stream_index
];
1774 if (pkt
->pts
!= AV_NOPTS_VALUE
&&
1775 st
->start_time
!= AV_NOPTS_VALUE
) {
1776 end_time
= pkt
->pts
;
1777 duration
= end_time
- st
->start_time
;
1779 if (st
->duration
== AV_NOPTS_VALUE
||
1780 st
->duration
< duration
)
1781 st
->duration
= duration
;
1784 av_free_packet(pkt
);
1787 fill_all_stream_timings(ic
);
1789 url_fseek(ic
->pb
, old_offset
, SEEK_SET
);
1790 for(i
=0; i
<ic
->nb_streams
; i
++){
1792 st
->cur_dts
= st
->first_dts
;
1793 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1797 static void av_estimate_timings(AVFormatContext
*ic
, offset_t old_offset
)
1801 /* get the file size, if possible */
1802 if (ic
->iformat
->flags
& AVFMT_NOFILE
) {
1805 file_size
= url_fsize(ic
->pb
);
1809 ic
->file_size
= file_size
;
1811 if ((!strcmp(ic
->iformat
->name
, "mpeg") ||
1812 !strcmp(ic
->iformat
->name
, "mpegts")) &&
1813 file_size
&& !url_is_streamed(ic
->pb
)) {
1814 /* get accurate estimate from the PTSes */
1815 av_estimate_timings_from_pts(ic
, old_offset
);
1816 } else if (av_has_duration(ic
)) {
1817 /* at least one component has timings - we use them for all
1819 fill_all_stream_timings(ic
);
1821 /* less precise: use bitrate info */
1822 av_estimate_timings_from_bit_rate(ic
);
1824 av_update_stream_timings(ic
);
1830 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1831 st
= ic
->streams
[i
];
1832 printf("%d: start_time: %0.3f duration: %0.3f\n",
1833 i
, (double)st
->start_time
/ AV_TIME_BASE
,
1834 (double)st
->duration
/ AV_TIME_BASE
);
1836 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1837 (double)ic
->start_time
/ AV_TIME_BASE
,
1838 (double)ic
->duration
/ AV_TIME_BASE
,
1839 ic
->bit_rate
/ 1000);
1844 static int has_codec_parameters(AVCodecContext
*enc
)
1847 switch(enc
->codec_type
) {
1848 case CODEC_TYPE_AUDIO
:
1849 val
= enc
->sample_rate
&& enc
->channels
&& enc
->sample_fmt
!= SAMPLE_FMT_NONE
;
1850 if(!enc
->frame_size
&&
1851 (enc
->codec_id
== CODEC_ID_VORBIS
||
1852 enc
->codec_id
== CODEC_ID_AAC
))
1855 case CODEC_TYPE_VIDEO
:
1856 val
= enc
->width
&& enc
->pix_fmt
!= PIX_FMT_NONE
;
1862 return enc
->codec_id
!= CODEC_ID_NONE
&& val
!= 0;
1865 static int try_decode_frame(AVStream
*st
, const uint8_t *data
, int size
)
1869 int got_picture
, data_size
, ret
=0;
1872 if(!st
->codec
->codec
){
1873 codec
= avcodec_find_decoder(st
->codec
->codec_id
);
1876 ret
= avcodec_open(st
->codec
, codec
);
1881 if(!has_codec_parameters(st
->codec
)){
1882 switch(st
->codec
->codec_type
) {
1883 case CODEC_TYPE_VIDEO
:
1884 ret
= avcodec_decode_video(st
->codec
, &picture
,
1885 &got_picture
, data
, size
);
1887 case CODEC_TYPE_AUDIO
:
1888 data_size
= FFMAX(size
, AVCODEC_MAX_AUDIO_FRAME_SIZE
);
1889 samples
= av_malloc(data_size
);
1892 ret
= avcodec_decode_audio2(st
->codec
, samples
,
1893 &data_size
, data
, size
);
1904 unsigned int codec_get_tag(const AVCodecTag
*tags
, int id
)
1906 while (tags
->id
!= CODEC_ID_NONE
) {
1914 enum CodecID
codec_get_id(const AVCodecTag
*tags
, unsigned int tag
)
1917 for(i
=0; tags
[i
].id
!= CODEC_ID_NONE
;i
++) {
1918 if(tag
== tags
[i
].tag
)
1921 for(i
=0; tags
[i
].id
!= CODEC_ID_NONE
; i
++) {
1922 if( toupper((tag
>> 0)&0xFF) == toupper((tags
[i
].tag
>> 0)&0xFF)
1923 && toupper((tag
>> 8)&0xFF) == toupper((tags
[i
].tag
>> 8)&0xFF)
1924 && toupper((tag
>>16)&0xFF) == toupper((tags
[i
].tag
>>16)&0xFF)
1925 && toupper((tag
>>24)&0xFF) == toupper((tags
[i
].tag
>>24)&0xFF))
1928 return CODEC_ID_NONE
;
1931 unsigned int av_codec_get_tag(const AVCodecTag
*tags
[4], enum CodecID id
)
1934 for(i
=0; tags
&& tags
[i
]; i
++){
1935 int tag
= codec_get_tag(tags
[i
], id
);
1941 enum CodecID
av_codec_get_id(const AVCodecTag
*tags
[4], unsigned int tag
)
1944 for(i
=0; tags
&& tags
[i
]; i
++){
1945 enum CodecID id
= codec_get_id(tags
[i
], tag
);
1946 if(id
!=CODEC_ID_NONE
) return id
;
1948 return CODEC_ID_NONE
;
1951 static void compute_chapters_end(AVFormatContext
*s
)
1955 for (i
=0; i
+1<s
->nb_chapters
; i
++)
1956 if (s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
1957 assert(s
->chapters
[i
]->start
<= s
->chapters
[i
+1]->start
);
1958 assert(!av_cmp_q(s
->chapters
[i
]->time_base
, s
->chapters
[i
+1]->time_base
));
1959 s
->chapters
[i
]->end
= s
->chapters
[i
+1]->start
;
1962 if (s
->nb_chapters
&& s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
1963 assert(s
->start_time
!= AV_NOPTS_VALUE
);
1964 assert(s
->duration
> 0);
1965 s
->chapters
[i
]->end
= av_rescale_q(s
->start_time
+ s
->duration
,
1967 s
->chapters
[i
]->time_base
);
1971 /* absolute maximum size we read until we abort */
1972 #define MAX_READ_SIZE 5000000
1974 #define MAX_STD_TIMEBASES (60*12+5)
1975 static int get_std_framerate(int i
){
1976 if(i
<60*12) return i
*1001;
1977 else return ((const int[]){24,30,60,12,15})[i
-60*12]*1000*12;
1981 * Is the time base unreliable.
1982 * This is a heuristic to balance between quick acceptance of the values in
1983 * the headers vs. some extra checks.
1984 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
1985 * MPEG-2 commonly misuses field repeat flags to store different framerates.
1986 * And there are "variable" fps files this needs to detect as well.
1988 static int tb_unreliable(AVCodecContext
*c
){
1989 if( c
->time_base
.den
>= 101L*c
->time_base
.num
1990 || c
->time_base
.den
< 5L*c
->time_base
.num
1991 /* || c->codec_tag == ff_get_fourcc("DIVX")
1992 || c->codec_tag == ff_get_fourcc("XVID")*/
1993 || c
->codec_id
== CODEC_ID_MPEG2VIDEO
)
1998 int av_find_stream_info(AVFormatContext
*ic
)
2000 int i
, count
, ret
, read_size
, j
;
2002 AVPacket pkt1
, *pkt
;
2003 int64_t last_dts
[MAX_STREAMS
];
2004 int duration_count
[MAX_STREAMS
]={0};
2005 double (*duration_error
)[MAX_STD_TIMEBASES
];
2006 offset_t old_offset
= url_ftell(ic
->pb
);
2007 int64_t codec_info_duration
[MAX_STREAMS
]={0};
2008 int codec_info_nb_frames
[MAX_STREAMS
]={0};
2010 duration_error
= av_mallocz(MAX_STREAMS
* sizeof(*duration_error
));
2011 if (!duration_error
) return AVERROR(ENOMEM
);
2013 for(i
=0;i
<ic
->nb_streams
;i
++) {
2014 st
= ic
->streams
[i
];
2015 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
){
2016 /* if(!st->time_base.num)
2018 if(!st
->codec
->time_base
.num
)
2019 st
->codec
->time_base
= st
->time_base
;
2021 //only for the split stuff
2023 st
->parser
= av_parser_init(st
->codec
->codec_id
);
2024 if(st
->need_parsing
== AVSTREAM_PARSE_HEADERS
&& st
->parser
){
2025 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
2030 for(i
=0;i
<MAX_STREAMS
;i
++){
2031 last_dts
[i
]= AV_NOPTS_VALUE
;
2037 /* check if one codec still needs to be handled */
2038 for(i
=0;i
<ic
->nb_streams
;i
++) {
2039 st
= ic
->streams
[i
];
2040 if (!has_codec_parameters(st
->codec
))
2042 /* variable fps and no guess at the real fps */
2043 if( tb_unreliable(st
->codec
)
2044 && duration_count
[i
]<20 && st
->codec
->codec_type
== CODEC_TYPE_VIDEO
)
2046 if(st
->parser
&& st
->parser
->parser
->split
&& !st
->codec
->extradata
)
2048 if(st
->first_dts
== AV_NOPTS_VALUE
)
2051 if (i
== ic
->nb_streams
) {
2052 /* NOTE: if the format has no header, then we need to read
2053 some packets to get most of the streams, so we cannot
2055 if (!(ic
->ctx_flags
& AVFMTCTX_NOHEADER
)) {
2056 /* if we found the info for all the codecs, we can stop */
2061 /* we did not get all the codec info, but we read too much data */
2062 if (read_size
>= MAX_READ_SIZE
) {
2067 /* NOTE: a new stream can be added there if no header in file
2068 (AVFMTCTX_NOHEADER) */
2069 ret
= av_read_frame_internal(ic
, &pkt1
);
2072 ret
= -1; /* we could not have all the codec parameters before EOF */
2073 for(i
=0;i
<ic
->nb_streams
;i
++) {
2074 st
= ic
->streams
[i
];
2075 if (!has_codec_parameters(st
->codec
)){
2077 avcodec_string(buf
, sizeof(buf
), st
->codec
, 0);
2078 av_log(ic
, AV_LOG_INFO
, "Could not find codec parameters (%s)\n", buf
);
2086 pkt
= add_to_pktbuf(&ic
->packet_buffer
, &pkt1
, &ic
->packet_buffer_end
);
2087 if(av_dup_packet(pkt
) < 0) {
2088 av_free(duration_error
);
2089 return AVERROR(ENOMEM
);
2092 read_size
+= pkt
->size
;
2094 st
= ic
->streams
[pkt
->stream_index
];
2095 if(codec_info_nb_frames
[st
->index
]>1)
2096 codec_info_duration
[st
->index
] += pkt
->duration
;
2097 if (pkt
->duration
!= 0)
2098 codec_info_nb_frames
[st
->index
]++;
2101 int index
= pkt
->stream_index
;
2102 int64_t last
= last_dts
[index
];
2103 int64_t duration
= pkt
->dts
- last
;
2105 if(pkt
->dts
!= AV_NOPTS_VALUE
&& last
!= AV_NOPTS_VALUE
&& duration
>0){
2106 double dur
= duration
* av_q2d(st
->time_base
);
2108 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2109 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2110 if(duration_count
[index
] < 2)
2111 memset(duration_error
[index
], 0, sizeof(*duration_error
));
2112 for(i
=1; i
<MAX_STD_TIMEBASES
; i
++){
2113 int framerate
= get_std_framerate(i
);
2114 int ticks
= lrintf(dur
*framerate
/(1001*12));
2115 double error
= dur
- ticks
*1001*12/(double)framerate
;
2116 duration_error
[index
][i
] += error
*error
;
2118 duration_count
[index
]++;
2120 if(last
== AV_NOPTS_VALUE
|| duration_count
[index
]<=1)
2121 last_dts
[pkt
->stream_index
]= pkt
->dts
;
2123 if(st
->parser
&& st
->parser
->parser
->split
&& !st
->codec
->extradata
){
2124 int i
= st
->parser
->parser
->split(st
->codec
, pkt
->data
, pkt
->size
);
2126 st
->codec
->extradata_size
= i
;
2127 st
->codec
->extradata
= av_malloc(st
->codec
->extradata_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
2128 memcpy(st
->codec
->extradata
, pkt
->data
, st
->codec
->extradata_size
);
2129 memset(st
->codec
->extradata
+ i
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
2133 /* if still no information, we try to open the codec and to
2134 decompress the frame. We try to avoid that in most cases as
2135 it takes longer and uses more memory. For MPEG-4, we need to
2136 decompress for QuickTime. */
2137 if (!has_codec_parameters(st
->codec
) /*&&
2138 (st->codec->codec_id == CODEC_ID_FLV1 ||
2139 st->codec->codec_id == CODEC_ID_H264 ||
2140 st->codec->codec_id == CODEC_ID_H263 ||
2141 st->codec->codec_id == CODEC_ID_H261 ||
2142 st->codec->codec_id == CODEC_ID_VORBIS ||
2143 st->codec->codec_id == CODEC_ID_MJPEG ||
2144 st->codec->codec_id == CODEC_ID_PNG ||
2145 st->codec->codec_id == CODEC_ID_PAM ||
2146 st->codec->codec_id == CODEC_ID_PGM ||
2147 st->codec->codec_id == CODEC_ID_PGMYUV ||
2148 st->codec->codec_id == CODEC_ID_PBM ||
2149 st->codec->codec_id == CODEC_ID_PPM ||
2150 st->codec->codec_id == CODEC_ID_SHORTEN ||
2151 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2152 try_decode_frame(st
, pkt
->data
, pkt
->size
);
2154 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
) {
2160 // close codecs which were opened in try_decode_frame()
2161 for(i
=0;i
<ic
->nb_streams
;i
++) {
2162 st
= ic
->streams
[i
];
2163 if(st
->codec
->codec
)
2164 avcodec_close(st
->codec
);
2166 for(i
=0;i
<ic
->nb_streams
;i
++) {
2167 st
= ic
->streams
[i
];
2168 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
2169 if(st
->codec
->codec_id
== CODEC_ID_RAWVIDEO
&& !st
->codec
->codec_tag
&& !st
->codec
->bits_per_sample
)
2170 st
->codec
->codec_tag
= avcodec_pix_fmt_to_codec_tag(st
->codec
->pix_fmt
);
2172 if(duration_count
[i
]
2173 && tb_unreliable(st
->codec
) /*&&
2174 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2175 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2176 double best_error
= 2*av_q2d(st
->time_base
);
2177 best_error
= best_error
*best_error
*duration_count
[i
]*1000*12*30;
2179 for(j
=1; j
<MAX_STD_TIMEBASES
; j
++){
2180 double error
= duration_error
[i
][j
] * get_std_framerate(j
);
2181 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2182 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2183 if(error
< best_error
){
2185 av_reduce(&st
->r_frame_rate
.num
, &st
->r_frame_rate
.den
, get_std_framerate(j
), 12*1001, INT_MAX
);
2190 if (!st
->r_frame_rate
.num
){
2191 if( st
->codec
->time_base
.den
* (int64_t)st
->time_base
.num
2192 <= st
->codec
->time_base
.num
* (int64_t)st
->time_base
.den
){
2193 st
->r_frame_rate
.num
= st
->codec
->time_base
.den
;
2194 st
->r_frame_rate
.den
= st
->codec
->time_base
.num
;
2196 st
->r_frame_rate
.num
= st
->time_base
.den
;
2197 st
->r_frame_rate
.den
= st
->time_base
.num
;
2200 }else if(st
->codec
->codec_type
== CODEC_TYPE_AUDIO
) {
2201 if(!st
->codec
->bits_per_sample
)
2202 st
->codec
->bits_per_sample
= av_get_bits_per_sample(st
->codec
->codec_id
);
2206 av_estimate_timings(ic
, old_offset
);
2208 compute_chapters_end(ic
);
2211 /* correct DTS for B-frame streams with no timestamps */
2212 for(i
=0;i
<ic
->nb_streams
;i
++) {
2213 st
= ic
->streams
[i
];
2214 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
2216 ppktl
= &ic
->packet_buffer
;
2218 if(ppkt1
->stream_index
!= i
)
2220 if(ppkt1
->pkt
->dts
< 0)
2222 if(ppkt1
->pkt
->pts
!= AV_NOPTS_VALUE
)
2224 ppkt1
->pkt
->dts
-= delta
;
2229 st
->cur_dts
-= delta
;
2235 av_free(duration_error
);
2240 /*******************************************************/
2242 int av_read_play(AVFormatContext
*s
)
2244 if (s
->iformat
->read_play
)
2245 return s
->iformat
->read_play(s
);
2247 return av_url_read_fpause(s
->pb
, 0);
2248 return AVERROR(ENOSYS
);
2251 int av_read_pause(AVFormatContext
*s
)
2253 if (s
->iformat
->read_pause
)
2254 return s
->iformat
->read_pause(s
);
2256 return av_url_read_fpause(s
->pb
, 1);
2257 return AVERROR(ENOSYS
);
2260 void av_close_input_stream(AVFormatContext
*s
)
2265 /* free previous packet */
2266 if (s
->cur_st
&& s
->cur_st
->parser
)
2267 av_free_packet(&s
->cur_pkt
);
2269 if (s
->iformat
->read_close
)
2270 s
->iformat
->read_close(s
);
2271 for(i
=0;i
<s
->nb_streams
;i
++) {
2272 /* free all data in a stream component */
2275 av_parser_close(st
->parser
);
2277 av_free(st
->index_entries
);
2278 av_free(st
->codec
->extradata
);
2280 av_free(st
->filename
);
2281 av_free(st
->priv_data
);
2284 for(i
=s
->nb_programs
-1; i
>=0; i
--) {
2285 av_freep(&s
->programs
[i
]->provider_name
);
2286 av_freep(&s
->programs
[i
]->name
);
2287 av_freep(&s
->programs
[i
]->stream_index
);
2288 av_freep(&s
->programs
[i
]);
2290 av_freep(&s
->programs
);
2291 flush_packet_queue(s
);
2292 av_freep(&s
->priv_data
);
2293 while(s
->nb_chapters
--) {
2294 av_free(s
->chapters
[s
->nb_chapters
]->title
);
2295 av_free(s
->chapters
[s
->nb_chapters
]);
2297 av_freep(&s
->chapters
);
2301 void av_close_input_file(AVFormatContext
*s
)
2303 ByteIOContext
*pb
= s
->iformat
->flags
& AVFMT_NOFILE
? NULL
: s
->pb
;
2304 av_close_input_stream(s
);
2309 AVStream
*av_new_stream(AVFormatContext
*s
, int id
)
2314 if (s
->nb_streams
>= MAX_STREAMS
)
2317 st
= av_mallocz(sizeof(AVStream
));
2321 st
->codec
= avcodec_alloc_context();
2323 /* no default bitrate if decoding */
2324 st
->codec
->bit_rate
= 0;
2326 st
->index
= s
->nb_streams
;
2328 st
->start_time
= AV_NOPTS_VALUE
;
2329 st
->duration
= AV_NOPTS_VALUE
;
2330 /* we set the current DTS to 0 so that formats without any timestamps
2331 but durations get some timestamps, formats with some unknown
2332 timestamps have their first few packets buffered and the
2333 timestamps corrected before they are returned to the user */
2335 st
->first_dts
= AV_NOPTS_VALUE
;
2337 /* default pts setting is MPEG-like */
2338 av_set_pts_info(st
, 33, 1, 90000);
2339 st
->last_IP_pts
= AV_NOPTS_VALUE
;
2340 for(i
=0; i
<MAX_REORDER_DELAY
+1; i
++)
2341 st
->pts_buffer
[i
]= AV_NOPTS_VALUE
;
2343 st
->sample_aspect_ratio
= (AVRational
){0,1};
2345 s
->streams
[s
->nb_streams
++] = st
;
2349 AVProgram
*av_new_program(AVFormatContext
*ac
, int id
)
2351 AVProgram
*program
=NULL
;
2355 av_log(ac
, AV_LOG_DEBUG
, "new_program: id=0x%04x\n", id
);
2358 for(i
=0; i
<ac
->nb_programs
; i
++)
2359 if(ac
->programs
[i
]->id
== id
)
2360 program
= ac
->programs
[i
];
2363 program
= av_mallocz(sizeof(AVProgram
));
2366 dynarray_add(&ac
->programs
, &ac
->nb_programs
, program
);
2367 program
->discard
= AVDISCARD_NONE
;
2374 void av_set_program_name(AVProgram
*program
, char *provider_name
, char *name
)
2376 assert(!provider_name
== !name
);
2378 av_free(program
->provider_name
);
2379 av_free(program
-> name
);
2380 program
->provider_name
= av_strdup(provider_name
);
2381 program
-> name
= av_strdup( name
);
2385 AVChapter
*ff_new_chapter(AVFormatContext
*s
, int id
, AVRational time_base
, int64_t start
, int64_t end
, const char *title
)
2387 AVChapter
*chapter
= NULL
;
2390 for(i
=0; i
<s
->nb_chapters
; i
++)
2391 if(s
->chapters
[i
]->id
== id
)
2392 chapter
= s
->chapters
[i
];
2395 chapter
= av_mallocz(sizeof(AVChapter
));
2398 dynarray_add(&s
->chapters
, &s
->nb_chapters
, chapter
);
2400 av_free(chapter
->title
);
2401 chapter
->title
= av_strdup(title
);
2403 chapter
->time_base
= time_base
;
2404 chapter
->start
= start
;
2410 /************************************************************/
2411 /* output media file */
2413 int av_set_parameters(AVFormatContext
*s
, AVFormatParameters
*ap
)
2417 if (s
->oformat
->priv_data_size
> 0) {
2418 s
->priv_data
= av_mallocz(s
->oformat
->priv_data_size
);
2420 return AVERROR(ENOMEM
);
2422 s
->priv_data
= NULL
;
2424 if (s
->oformat
->set_parameters
) {
2425 ret
= s
->oformat
->set_parameters(s
, ap
);
2432 int av_write_header(AVFormatContext
*s
)
2437 // some sanity checks
2438 for(i
=0;i
<s
->nb_streams
;i
++) {
2441 switch (st
->codec
->codec_type
) {
2442 case CODEC_TYPE_AUDIO
:
2443 if(st
->codec
->sample_rate
<=0){
2444 av_log(s
, AV_LOG_ERROR
, "sample rate not set\n");
2448 case CODEC_TYPE_VIDEO
:
2449 if(st
->codec
->time_base
.num
<=0 || st
->codec
->time_base
.den
<=0){ //FIXME audio too?
2450 av_log(s
, AV_LOG_ERROR
, "time base not set\n");
2453 if(st
->codec
->width
<=0 || st
->codec
->height
<=0){
2454 av_log(s
, AV_LOG_ERROR
, "dimensions not set\n");
2460 if(s
->oformat
->codec_tag
){
2461 if(st
->codec
->codec_tag
){
2463 //check that tag + id is in the table
2464 //if neither is in the table -> OK
2465 //if tag is in the table with another id -> FAIL
2466 //if id is in the table with another tag -> FAIL unless strict < ?
2468 st
->codec
->codec_tag
= av_codec_get_tag(s
->oformat
->codec_tag
, st
->codec
->codec_id
);
2472 if (!s
->priv_data
&& s
->oformat
->priv_data_size
> 0) {
2473 s
->priv_data
= av_mallocz(s
->oformat
->priv_data_size
);
2475 return AVERROR(ENOMEM
);
2478 if(s
->oformat
->write_header
){
2479 ret
= s
->oformat
->write_header(s
);
2484 /* init PTS generation */
2485 for(i
=0;i
<s
->nb_streams
;i
++) {
2486 int64_t den
= AV_NOPTS_VALUE
;
2489 switch (st
->codec
->codec_type
) {
2490 case CODEC_TYPE_AUDIO
:
2491 den
= (int64_t)st
->time_base
.num
* st
->codec
->sample_rate
;
2493 case CODEC_TYPE_VIDEO
:
2494 den
= (int64_t)st
->time_base
.num
* st
->codec
->time_base
.den
;
2499 if (den
!= AV_NOPTS_VALUE
) {
2501 return AVERROR_INVALIDDATA
;
2502 av_frac_init(&st
->pts
, 0, 0, den
);
2508 //FIXME merge with compute_pkt_fields
2509 static int compute_pkt_fields2(AVStream
*st
, AVPacket
*pkt
){
2510 int delay
= FFMAX(st
->codec
->has_b_frames
, !!st
->codec
->max_b_frames
);
2511 int num
, den
, frame_size
, i
;
2513 // 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);
2515 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2518 /* duration field */
2519 if (pkt
->duration
== 0) {
2520 compute_frame_duration(&num
, &den
, st
, NULL
, pkt
);
2522 pkt
->duration
= av_rescale(1, num
* (int64_t)st
->time_base
.den
, den
* (int64_t)st
->time_base
.num
);
2526 if(pkt
->pts
== AV_NOPTS_VALUE
&& pkt
->dts
!= AV_NOPTS_VALUE
&& delay
==0)
2529 //XXX/FIXME this is a temporary hack until all encoders output pts
2530 if((pkt
->pts
== 0 || pkt
->pts
== AV_NOPTS_VALUE
) && pkt
->dts
== AV_NOPTS_VALUE
&& !delay
){
2532 // pkt->pts= st->cur_dts;
2533 pkt
->pts
= st
->pts
.val
;
2536 //calculate dts from pts
2537 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
== AV_NOPTS_VALUE
&& delay
<= MAX_REORDER_DELAY
){
2538 st
->pts_buffer
[0]= pkt
->pts
;
2539 for(i
=1; i
<delay
+1 && st
->pts_buffer
[i
] == AV_NOPTS_VALUE
; i
++)
2540 st
->pts_buffer
[i
]= (i
-delay
-1) * pkt
->duration
;
2541 for(i
=0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+1]; i
++)
2542 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+1]);
2544 pkt
->dts
= st
->pts_buffer
[0];
2547 if(st
->cur_dts
&& st
->cur_dts
!= AV_NOPTS_VALUE
&& st
->cur_dts
>= pkt
->dts
){
2548 av_log(st
->codec
, AV_LOG_ERROR
, "error, non monotone timestamps %"PRId64
" >= %"PRId64
"\n", st
->cur_dts
, pkt
->dts
);
2551 if(pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->pts
< pkt
->dts
){
2552 av_log(st
->codec
, AV_LOG_ERROR
, "error, pts < dts\n");
2556 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2557 st
->cur_dts
= pkt
->dts
;
2558 st
->pts
.val
= pkt
->dts
;
2561 switch (st
->codec
->codec_type
) {
2562 case CODEC_TYPE_AUDIO
:
2563 frame_size
= get_audio_frame_size(st
->codec
, pkt
->size
);
2565 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2566 likely equal to the encoder delay, but it would be better if we
2567 had the real timestamps from the encoder */
2568 if (frame_size
>= 0 && (pkt
->size
|| st
->pts
.num
!=st
->pts
.den
>>1 || st
->pts
.val
)) {
2569 av_frac_add(&st
->pts
, (int64_t)st
->time_base
.den
* frame_size
);
2572 case CODEC_TYPE_VIDEO
:
2573 av_frac_add(&st
->pts
, (int64_t)st
->time_base
.den
* st
->codec
->time_base
.num
);
2581 int av_write_frame(AVFormatContext
*s
, AVPacket
*pkt
)
2583 int ret
= compute_pkt_fields2(s
->streams
[pkt
->stream_index
], pkt
);
2585 if(ret
<0 && !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2588 ret
= s
->oformat
->write_packet(s
, pkt
);
2590 ret
= url_ferror(s
->pb
);
2594 int av_interleave_packet_per_dts(AVFormatContext
*s
, AVPacket
*out
, AVPacket
*pkt
, int flush
){
2595 AVPacketList
*pktl
, **next_point
, *this_pktl
;
2597 int streams
[MAX_STREAMS
];
2600 AVStream
*st
= s
->streams
[ pkt
->stream_index
];
2602 // assert(pkt->destruct != av_destruct_packet); //FIXME
2604 this_pktl
= av_mallocz(sizeof(AVPacketList
));
2605 this_pktl
->pkt
= *pkt
;
2606 if(pkt
->destruct
== av_destruct_packet
)
2607 pkt
->destruct
= NULL
; // not shared -> must keep original from being freed
2609 av_dup_packet(&this_pktl
->pkt
); //shared -> must dup
2611 next_point
= &s
->packet_buffer
;
2613 AVStream
*st2
= s
->streams
[ (*next_point
)->pkt
.stream_index
];
2614 int64_t left
= st2
->time_base
.num
* (int64_t)st
->time_base
.den
;
2615 int64_t right
= st
->time_base
.num
* (int64_t)st2
->time_base
.den
;
2616 if((*next_point
)->pkt
.dts
* left
> pkt
->dts
* right
) //FIXME this can overflow
2618 next_point
= &(*next_point
)->next
;
2620 this_pktl
->next
= *next_point
;
2621 *next_point
= this_pktl
;
2624 memset(streams
, 0, sizeof(streams
));
2625 pktl
= s
->packet_buffer
;
2627 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2628 if(streams
[ pktl
->pkt
.stream_index
] == 0)
2630 streams
[ pktl
->pkt
.stream_index
]++;
2634 if(stream_count
&& (s
->nb_streams
== stream_count
|| flush
)){
2635 pktl
= s
->packet_buffer
;
2638 s
->packet_buffer
= pktl
->next
;
2642 av_init_packet(out
);
2648 * Interleaves an AVPacket correctly so it can be muxed.
2649 * @param out the interleaved packet will be output here
2650 * @param in the input packet
2651 * @param flush 1 if no further packets are available as input and all
2652 * remaining packets should be output
2653 * @return 1 if a packet was output, 0 if no packet could be output,
2654 * < 0 if an error occurred
2656 static int av_interleave_packet(AVFormatContext
*s
, AVPacket
*out
, AVPacket
*in
, int flush
){
2657 if(s
->oformat
->interleave_packet
)
2658 return s
->oformat
->interleave_packet(s
, out
, in
, flush
);
2660 return av_interleave_packet_per_dts(s
, out
, in
, flush
);
2663 int av_interleaved_write_frame(AVFormatContext
*s
, AVPacket
*pkt
){
2664 AVStream
*st
= s
->streams
[ pkt
->stream_index
];
2666 //FIXME/XXX/HACK drop zero sized packets
2667 if(st
->codec
->codec_type
== CODEC_TYPE_AUDIO
&& pkt
->size
==0)
2670 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2671 if(compute_pkt_fields2(st
, pkt
) < 0 && !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2674 if(pkt
->dts
== AV_NOPTS_VALUE
)
2679 int ret
= av_interleave_packet(s
, &opkt
, pkt
, 0);
2680 if(ret
<=0) //FIXME cleanup needed for ret<0 ?
2683 ret
= s
->oformat
->write_packet(s
, &opkt
);
2685 av_free_packet(&opkt
);
2690 if(url_ferror(s
->pb
))
2691 return url_ferror(s
->pb
);
2695 int av_write_trailer(AVFormatContext
*s
)
2701 ret
= av_interleave_packet(s
, &pkt
, NULL
, 1);
2702 if(ret
<0) //FIXME cleanup needed for ret<0 ?
2707 ret
= s
->oformat
->write_packet(s
, &pkt
);
2709 av_free_packet(&pkt
);
2713 if(url_ferror(s
->pb
))
2717 if(s
->oformat
->write_trailer
)
2718 ret
= s
->oformat
->write_trailer(s
);
2721 ret
=url_ferror(s
->pb
);
2722 for(i
=0;i
<s
->nb_streams
;i
++)
2723 av_freep(&s
->streams
[i
]->priv_data
);
2724 av_freep(&s
->priv_data
);
2728 void av_program_add_stream_index(AVFormatContext
*ac
, int progid
, unsigned int idx
)
2731 AVProgram
*program
=NULL
;
2734 for(i
=0; i
<ac
->nb_programs
; i
++){
2735 if(ac
->programs
[i
]->id
!= progid
)
2737 program
= ac
->programs
[i
];
2738 for(j
=0; j
<program
->nb_stream_indexes
; j
++)
2739 if(program
->stream_index
[j
] == idx
)
2742 tmp
= av_realloc(program
->stream_index
, sizeof(unsigned int)*(program
->nb_stream_indexes
+1));
2745 program
->stream_index
= tmp
;
2746 program
->stream_index
[program
->nb_stream_indexes
++] = idx
;
2751 /* "user interface" functions */
2752 static void dump_stream_format(AVFormatContext
*ic
, int i
, int index
, int is_output
)
2755 int flags
= (is_output
? ic
->oformat
->flags
: ic
->iformat
->flags
);
2756 AVStream
*st
= ic
->streams
[i
];
2757 int g
= ff_gcd(st
->time_base
.num
, st
->time_base
.den
);
2758 avcodec_string(buf
, sizeof(buf
), st
->codec
, is_output
);
2759 av_log(NULL
, AV_LOG_INFO
, " Stream #%d.%d", index
, i
);
2760 /* the pid is an important information, so we display it */
2761 /* XXX: add a generic system */
2762 if (flags
& AVFMT_SHOW_IDS
)
2763 av_log(NULL
, AV_LOG_INFO
, "[0x%x]", st
->id
);
2764 if (strlen(st
->language
) > 0)
2765 av_log(NULL
, AV_LOG_INFO
, "(%s)", st
->language
);
2766 av_log(NULL
, AV_LOG_DEBUG
, ", %d/%d", st
->time_base
.num
/g
, st
->time_base
.den
/g
);
2767 av_log(NULL
, AV_LOG_INFO
, ": %s", buf
);
2768 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
){
2769 if(st
->r_frame_rate
.den
&& st
->r_frame_rate
.num
)
2770 av_log(NULL
, AV_LOG_INFO
, ", %5.2f tb(r)", av_q2d(st
->r_frame_rate
));
2771 /* else if(st->time_base.den && st->time_base.num)
2772 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(m)", 1/av_q2d(st->time_base));*/
2774 av_log(NULL
, AV_LOG_INFO
, ", %5.2f tb(c)", 1/av_q2d(st
->codec
->time_base
));
2776 av_log(NULL
, AV_LOG_INFO
, "\n");
2779 void dump_format(AVFormatContext
*ic
,
2786 av_log(NULL
, AV_LOG_INFO
, "%s #%d, %s, %s '%s':\n",
2787 is_output
? "Output" : "Input",
2789 is_output
? ic
->oformat
->name
: ic
->iformat
->name
,
2790 is_output
? "to" : "from", url
);
2792 av_log(NULL
, AV_LOG_INFO
, " Duration: ");
2793 if (ic
->duration
!= AV_NOPTS_VALUE
) {
2794 int hours
, mins
, secs
, us
;
2795 secs
= ic
->duration
/ AV_TIME_BASE
;
2796 us
= ic
->duration
% AV_TIME_BASE
;
2801 av_log(NULL
, AV_LOG_INFO
, "%02d:%02d:%02d.%02d", hours
, mins
, secs
,
2802 (100 * us
) / AV_TIME_BASE
);
2804 av_log(NULL
, AV_LOG_INFO
, "N/A");
2806 if (ic
->start_time
!= AV_NOPTS_VALUE
) {
2808 av_log(NULL
, AV_LOG_INFO
, ", start: ");
2809 secs
= ic
->start_time
/ AV_TIME_BASE
;
2810 us
= ic
->start_time
% AV_TIME_BASE
;
2811 av_log(NULL
, AV_LOG_INFO
, "%d.%06d",
2812 secs
, (int)av_rescale(us
, 1000000, AV_TIME_BASE
));
2814 av_log(NULL
, AV_LOG_INFO
, ", bitrate: ");
2816 av_log(NULL
, AV_LOG_INFO
,"%d kb/s", ic
->bit_rate
/ 1000);
2818 av_log(NULL
, AV_LOG_INFO
, "N/A");
2820 av_log(NULL
, AV_LOG_INFO
, "\n");
2822 if(ic
->nb_programs
) {
2824 for(j
=0; j
<ic
->nb_programs
; j
++) {
2825 av_log(NULL
, AV_LOG_INFO
, " Program %d %s\n", ic
->programs
[j
]->id
,
2826 ic
->programs
[j
]->name
? ic
->programs
[j
]->name
: "");
2827 for(k
=0; k
<ic
->programs
[j
]->nb_stream_indexes
; k
++)
2828 dump_stream_format(ic
, ic
->programs
[j
]->stream_index
[k
], index
, is_output
);
2831 for(i
=0;i
<ic
->nb_streams
;i
++)
2832 dump_stream_format(ic
, i
, index
, is_output
);
2835 int parse_image_size(int *width_ptr
, int *height_ptr
, const char *str
)
2837 return av_parse_video_frame_size(width_ptr
, height_ptr
, str
);
2840 int parse_frame_rate(int *frame_rate_num
, int *frame_rate_den
, const char *arg
)
2842 AVRational frame_rate
;
2843 int ret
= av_parse_video_frame_rate(&frame_rate
, arg
);
2844 *frame_rate_num
= frame_rate
.num
;
2845 *frame_rate_den
= frame_rate
.den
;
2850 * Gets the current time in microseconds.
2852 int64_t av_gettime(void)
2855 gettimeofday(&tv
,NULL
);
2856 return (int64_t)tv
.tv_sec
* 1000000 + tv
.tv_usec
;
2859 int64_t parse_date(const char *datestr
, int duration
)
2865 static const char * const date_fmt
[] = {
2869 static const char * const time_fmt
[] = {
2879 time_t now
= time(0);
2881 len
= strlen(datestr
);
2883 lastch
= datestr
[len
- 1];
2886 is_utc
= (lastch
== 'z' || lastch
== 'Z');
2888 memset(&dt
, 0, sizeof(dt
));
2893 /* parse the year-month-day part */
2894 for (i
= 0; i
< sizeof(date_fmt
) / sizeof(date_fmt
[0]); i
++) {
2895 q
= small_strptime(p
, date_fmt
[i
], &dt
);
2901 /* if the year-month-day part is missing, then take the
2902 * current year-month-day time */
2907 dt
= *localtime(&now
);
2909 dt
.tm_hour
= dt
.tm_min
= dt
.tm_sec
= 0;
2914 if (*p
== 'T' || *p
== 't' || *p
== ' ')
2917 /* parse the hour-minute-second part */
2918 for (i
= 0; i
< sizeof(time_fmt
) / sizeof(time_fmt
[0]); i
++) {
2919 q
= small_strptime(p
, time_fmt
[i
], &dt
);
2925 /* parse datestr as a duration */
2930 /* parse datestr as HH:MM:SS */
2931 q
= small_strptime(p
, time_fmt
[0], &dt
);
2933 /* parse datestr as S+ */
2934 dt
.tm_sec
= strtol(p
, (char **)&q
, 10);
2936 /* the parsing didn't succeed */
2943 /* Now we have all the fields that we can get */
2949 t
= dt
.tm_hour
* 3600 + dt
.tm_min
* 60 + dt
.tm_sec
;
2951 dt
.tm_isdst
= -1; /* unknown */
2961 /* parse the .m... part */
2965 for (val
= 0, n
= 100000; n
>= 1; n
/= 10, q
++) {
2968 val
+= n
* (*q
- '0');
2972 return negative
? -t
: t
;
2975 int find_info_tag(char *arg
, int arg_size
, const char *tag1
, const char *info
)
2985 while (*p
!= '\0' && *p
!= '=' && *p
!= '&') {
2986 if ((q
- tag
) < sizeof(tag
) - 1)
2994 while (*p
!= '&' && *p
!= '\0') {
2995 if ((q
- arg
) < arg_size
- 1) {
3005 if (!strcmp(tag
, tag1
))
3014 int av_get_frame_filename(char *buf
, int buf_size
,
3015 const char *path
, int number
)
3018 char *q
, buf1
[20], c
;
3019 int nd
, len
, percentd_found
;
3031 while (isdigit(*p
)) {
3032 nd
= nd
* 10 + *p
++ - '0';
3035 } while (isdigit(c
));
3044 snprintf(buf1
, sizeof(buf1
), "%0*d", nd
, number
);
3046 if ((q
- buf
+ len
) > buf_size
- 1)
3048 memcpy(q
, buf1
, len
);
3056 if ((q
- buf
) < buf_size
- 1)
3060 if (!percentd_found
)
3069 static void hex_dump_internal(void *avcl
, FILE *f
, int level
, uint8_t *buf
, int size
)
3072 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3074 for(i
=0;i
<size
;i
+=16) {
3081 PRINT(" %02x", buf
[i
+j
]);
3086 for(j
=0;j
<len
;j
++) {
3088 if (c
< ' ' || c
> '~')
3097 void av_hex_dump(FILE *f
, uint8_t *buf
, int size
)
3099 hex_dump_internal(NULL
, f
, 0, buf
, size
);
3102 void av_hex_dump_log(void *avcl
, int level
, uint8_t *buf
, int size
)
3104 hex_dump_internal(avcl
, NULL
, level
, buf
, size
);
3107 //FIXME needs to know the time_base
3108 static void pkt_dump_internal(void *avcl
, FILE *f
, int level
, AVPacket
*pkt
, int dump_payload
)
3110 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3111 PRINT("stream #%d:\n", pkt
->stream_index
);
3112 PRINT(" keyframe=%d\n", ((pkt
->flags
& PKT_FLAG_KEY
) != 0));
3113 PRINT(" duration=%0.3f\n", (double)pkt
->duration
/ AV_TIME_BASE
);
3114 /* DTS is _always_ valid after av_read_frame() */
3116 if (pkt
->dts
== AV_NOPTS_VALUE
)
3119 PRINT("%0.3f", (double)pkt
->dts
/ AV_TIME_BASE
);
3120 /* PTS may not be known if B-frames are present. */
3122 if (pkt
->pts
== AV_NOPTS_VALUE
)
3125 PRINT("%0.3f", (double)pkt
->pts
/ AV_TIME_BASE
);
3127 PRINT(" size=%d\n", pkt
->size
);
3130 av_hex_dump(f
, pkt
->data
, pkt
->size
);
3133 void av_pkt_dump(FILE *f
, AVPacket
*pkt
, int dump_payload
)
3135 pkt_dump_internal(NULL
, f
, 0, pkt
, dump_payload
);
3138 void av_pkt_dump_log(void *avcl
, int level
, AVPacket
*pkt
, int dump_payload
)
3140 pkt_dump_internal(avcl
, NULL
, level
, pkt
, dump_payload
);
3143 void url_split(char *proto
, int proto_size
,
3144 char *authorization
, int authorization_size
,
3145 char *hostname
, int hostname_size
,
3147 char *path
, int path_size
,
3150 const char *p
, *ls
, *at
, *col
, *brk
;
3152 if (port_ptr
) *port_ptr
= -1;
3153 if (proto_size
> 0) proto
[0] = 0;
3154 if (authorization_size
> 0) authorization
[0] = 0;
3155 if (hostname_size
> 0) hostname
[0] = 0;
3156 if (path_size
> 0) path
[0] = 0;
3158 /* parse protocol */
3159 if ((p
= strchr(url
, ':'))) {
3160 av_strlcpy(proto
, url
, FFMIN(proto_size
, p
+ 1 - url
));
3165 /* no protocol means plain filename */
3166 av_strlcpy(path
, url
, path_size
);
3170 /* separate path from hostname */
3171 ls
= strchr(p
, '/');
3173 ls
= strchr(p
, '?');
3175 av_strlcpy(path
, ls
, path_size
);
3177 ls
= &p
[strlen(p
)]; // XXX
3179 /* the rest is hostname, use that to parse auth/port */
3181 /* authorization (user[:pass]@hostname) */
3182 if ((at
= strchr(p
, '@')) && at
< ls
) {
3183 av_strlcpy(authorization
, p
,
3184 FFMIN(authorization_size
, at
+ 1 - p
));
3185 p
= at
+ 1; /* skip '@' */
3188 if (*p
== '[' && (brk
= strchr(p
, ']')) && brk
< ls
) {
3190 av_strlcpy(hostname
, p
+ 1,
3191 FFMIN(hostname_size
, brk
- p
));
3192 if (brk
[1] == ':' && port_ptr
)
3193 *port_ptr
= atoi(brk
+ 2);
3194 } else if ((col
= strchr(p
, ':')) && col
< ls
) {
3195 av_strlcpy(hostname
, p
,
3196 FFMIN(col
+ 1 - p
, hostname_size
));
3197 if (port_ptr
) *port_ptr
= atoi(col
+ 1);
3199 av_strlcpy(hostname
, p
,
3200 FFMIN(ls
+ 1 - p
, hostname_size
));
3204 char *ff_data_to_hex(char *buff
, const uint8_t *src
, int s
)
3207 static const char hex_table
[16] = { '0', '1', '2', '3',
3210 'C', 'D', 'E', 'F' };
3212 for(i
= 0; i
< s
; i
++) {
3213 buff
[i
* 2] = hex_table
[src
[i
] >> 4];
3214 buff
[i
* 2 + 1] = hex_table
[src
[i
] & 0xF];
3220 void av_set_pts_info(AVStream
*s
, int pts_wrap_bits
,
3221 int pts_num
, int pts_den
)
3223 unsigned int gcd
= ff_gcd(pts_num
, pts_den
);
3224 s
->pts_wrap_bits
= pts_wrap_bits
;
3225 s
->time_base
.num
= pts_num
/gcd
;
3226 s
->time_base
.den
= pts_den
/gcd
;
3229 av_log(NULL
, AV_LOG_DEBUG
, "st:%d removing common factor %d from timebase\n", s
->index
, gcd
);