2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "libavcodec/opt.h"
25 #include "libavutil/avstring.h"
35 * @file libavformat/utils.c
36 * various utility functions for use within FFmpeg
39 unsigned avformat_version(void)
41 return LIBAVFORMAT_VERSION_INT
;
44 /* fraction handling */
47 * f = val + (num / den) + 0.5.
49 * 'num' is normalized so that it is such as 0 <= num < den.
51 * @param f fractional number
52 * @param val integer value
53 * @param num must be >= 0
54 * @param den must be >= 1
56 static void av_frac_init(AVFrac
*f
, int64_t val
, int64_t num
, int64_t den
)
69 * Fractional addition to f: f = f + (incr / f->den).
71 * @param f fractional number
72 * @param incr increment, can be positive or negative
74 static void av_frac_add(AVFrac
*f
, int64_t incr
)
87 } else if (num
>= den
) {
94 /** head of registered input format linked list */
95 AVInputFormat
*first_iformat
= NULL
;
96 /** head of registered output format linked list */
97 AVOutputFormat
*first_oformat
= NULL
;
99 AVInputFormat
*av_iformat_next(AVInputFormat
*f
)
101 if(f
) return f
->next
;
102 else return first_iformat
;
105 AVOutputFormat
*av_oformat_next(AVOutputFormat
*f
)
107 if(f
) return f
->next
;
108 else return first_oformat
;
111 void av_register_input_format(AVInputFormat
*format
)
115 while (*p
!= NULL
) p
= &(*p
)->next
;
120 void av_register_output_format(AVOutputFormat
*format
)
124 while (*p
!= NULL
) p
= &(*p
)->next
;
129 int match_ext(const char *filename
, const char *extensions
)
137 ext
= strrchr(filename
, '.');
143 while (*p
!= '\0' && *p
!= ',' && q
-ext1
<sizeof(ext1
)-1)
146 if (!strcasecmp(ext1
, ext
))
156 static int match_format(const char *name
, const char *names
)
164 namelen
= strlen(name
);
165 while ((p
= strchr(names
, ','))) {
166 len
= FFMAX(p
- names
, namelen
);
167 if (!strncasecmp(name
, names
, len
))
171 return !strcasecmp(name
, names
);
174 AVOutputFormat
*guess_format(const char *short_name
, const char *filename
,
175 const char *mime_type
)
177 AVOutputFormat
*fmt
, *fmt_found
;
178 int score_max
, score
;
180 /* specific test for image sequences */
181 #if CONFIG_IMAGE2_MUXER
182 if (!short_name
&& filename
&&
183 av_filename_number_test(filename
) &&
184 av_guess_image2_codec(filename
) != CODEC_ID_NONE
) {
185 return guess_format("image2", NULL
, NULL
);
188 /* Find the proper file type. */
192 while (fmt
!= NULL
) {
194 if (fmt
->name
&& short_name
&& !strcmp(fmt
->name
, short_name
))
196 if (fmt
->mime_type
&& mime_type
&& !strcmp(fmt
->mime_type
, mime_type
))
198 if (filename
&& fmt
->extensions
&&
199 match_ext(filename
, fmt
->extensions
)) {
202 if (score
> score_max
) {
211 AVOutputFormat
*guess_stream_format(const char *short_name
, const char *filename
,
212 const char *mime_type
)
214 AVOutputFormat
*fmt
= guess_format(short_name
, filename
, mime_type
);
217 AVOutputFormat
*stream_fmt
;
218 char stream_format_name
[64];
220 snprintf(stream_format_name
, sizeof(stream_format_name
), "%s_stream", fmt
->name
);
221 stream_fmt
= guess_format(stream_format_name
, NULL
, NULL
);
230 enum CodecID
av_guess_codec(AVOutputFormat
*fmt
, const char *short_name
,
231 const char *filename
, const char *mime_type
, enum CodecType type
){
232 if(type
== CODEC_TYPE_VIDEO
){
233 enum CodecID codec_id
= CODEC_ID_NONE
;
235 #if CONFIG_IMAGE2_MUXER
236 if(!strcmp(fmt
->name
, "image2") || !strcmp(fmt
->name
, "image2pipe")){
237 codec_id
= av_guess_image2_codec(filename
);
240 if(codec_id
== CODEC_ID_NONE
)
241 codec_id
= fmt
->video_codec
;
243 }else if(type
== CODEC_TYPE_AUDIO
)
244 return fmt
->audio_codec
;
246 return CODEC_ID_NONE
;
249 AVInputFormat
*av_find_input_format(const char *short_name
)
252 for(fmt
= first_iformat
; fmt
!= NULL
; fmt
= fmt
->next
) {
253 if (match_format(short_name
, fmt
->name
))
259 /* memory handling */
261 void av_destruct_packet(AVPacket
*pkt
)
264 pkt
->data
= NULL
; pkt
->size
= 0;
267 void av_init_packet(AVPacket
*pkt
)
269 pkt
->pts
= AV_NOPTS_VALUE
;
270 pkt
->dts
= AV_NOPTS_VALUE
;
273 pkt
->convergence_duration
= 0;
275 pkt
->stream_index
= 0;
276 pkt
->destruct
= av_destruct_packet_nofree
;
279 int av_new_packet(AVPacket
*pkt
, int size
)
282 if((unsigned)size
> (unsigned)size
+ FF_INPUT_BUFFER_PADDING_SIZE
)
283 return AVERROR(ENOMEM
);
284 data
= av_malloc(size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
286 return AVERROR(ENOMEM
);
287 memset(data
+ size
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
292 pkt
->destruct
= av_destruct_packet
;
296 int av_get_packet(ByteIOContext
*s
, AVPacket
*pkt
, int size
)
298 int ret
= av_new_packet(pkt
, size
);
303 pkt
->pos
= url_ftell(s
);
305 ret
= get_buffer(s
, pkt
->data
, size
);
314 int av_dup_packet(AVPacket
*pkt
)
316 if (((pkt
->destruct
== av_destruct_packet_nofree
) || (pkt
->destruct
== NULL
)) && pkt
->data
) {
318 /* We duplicate the packet and don't forget to add the padding again. */
319 if((unsigned)pkt
->size
> (unsigned)pkt
->size
+ FF_INPUT_BUFFER_PADDING_SIZE
)
320 return AVERROR(ENOMEM
);
321 data
= av_malloc(pkt
->size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
323 return AVERROR(ENOMEM
);
325 memcpy(data
, pkt
->data
, pkt
->size
);
326 memset(data
+ pkt
->size
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
328 pkt
->destruct
= av_destruct_packet
;
333 int av_filename_number_test(const char *filename
)
336 return filename
&& (av_get_frame_filename(buf
, sizeof(buf
), filename
, 1)>=0);
339 static AVInputFormat
*av_probe_input_format2(AVProbeData
*pd
, int is_opened
, int *score_max
)
341 AVInputFormat
*fmt1
, *fmt
;
345 for(fmt1
= first_iformat
; fmt1
!= NULL
; fmt1
= fmt1
->next
) {
346 if (!is_opened
== !(fmt1
->flags
& AVFMT_NOFILE
))
349 if (fmt1
->read_probe
) {
350 score
= fmt1
->read_probe(pd
);
351 } else if (fmt1
->extensions
) {
352 if (match_ext(pd
->filename
, fmt1
->extensions
)) {
356 if (score
> *score_max
) {
359 }else if (score
== *score_max
)
365 AVInputFormat
*av_probe_input_format(AVProbeData
*pd
, int is_opened
){
367 return av_probe_input_format2(pd
, is_opened
, &score
);
370 static int set_codec_from_probe_data(AVStream
*st
, AVProbeData
*pd
, int score
)
373 fmt
= av_probe_input_format2(pd
, 1, &score
);
376 if (!strcmp(fmt
->name
, "mp3")) {
377 st
->codec
->codec_id
= CODEC_ID_MP3
;
378 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
379 } else if (!strcmp(fmt
->name
, "ac3")) {
380 st
->codec
->codec_id
= CODEC_ID_AC3
;
381 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
382 } else if (!strcmp(fmt
->name
, "mpegvideo")) {
383 st
->codec
->codec_id
= CODEC_ID_MPEG2VIDEO
;
384 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
385 } else if (!strcmp(fmt
->name
, "m4v")) {
386 st
->codec
->codec_id
= CODEC_ID_MPEG4
;
387 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
388 } else if (!strcmp(fmt
->name
, "h264")) {
389 st
->codec
->codec_id
= CODEC_ID_H264
;
390 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
396 /************************************************************/
397 /* input media file */
400 * Open a media file from an IO stream. 'fmt' must be specified.
402 int av_open_input_stream(AVFormatContext
**ic_ptr
,
403 ByteIOContext
*pb
, const char *filename
,
404 AVInputFormat
*fmt
, AVFormatParameters
*ap
)
408 AVFormatParameters default_ap
;
412 memset(ap
, 0, sizeof(default_ap
));
415 if(!ap
->prealloced_context
)
416 ic
= avformat_alloc_context();
420 err
= AVERROR(ENOMEM
);
425 ic
->duration
= AV_NOPTS_VALUE
;
426 ic
->start_time
= AV_NOPTS_VALUE
;
427 av_strlcpy(ic
->filename
, filename
, sizeof(ic
->filename
));
429 /* allocate private data */
430 if (fmt
->priv_data_size
> 0) {
431 ic
->priv_data
= av_mallocz(fmt
->priv_data_size
);
432 if (!ic
->priv_data
) {
433 err
= AVERROR(ENOMEM
);
437 ic
->priv_data
= NULL
;
440 if (ic
->iformat
->read_header
) {
441 err
= ic
->iformat
->read_header(ic
, ap
);
446 if (pb
&& !ic
->data_offset
)
447 ic
->data_offset
= url_ftell(ic
->pb
);
449 #if LIBAVFORMAT_VERSION_MAJOR < 53
450 ff_metadata_demux_compat(ic
);
458 av_freep(&ic
->priv_data
);
459 for(i
=0;i
<ic
->nb_streams
;i
++) {
460 AVStream
*st
= ic
->streams
[i
];
462 av_free(st
->priv_data
);
463 av_free(st
->codec
->extradata
);
473 /** size of probe buffer, for guessing file type from file contents */
474 #define PROBE_BUF_MIN 2048
475 #define PROBE_BUF_MAX (1<<20)
477 int av_open_input_file(AVFormatContext
**ic_ptr
, const char *filename
,
480 AVFormatParameters
*ap
)
483 AVProbeData probe_data
, *pd
= &probe_data
;
484 ByteIOContext
*pb
= NULL
;
488 pd
->filename
= filename
;
493 /* guess format if no file can be opened */
494 fmt
= av_probe_input_format(pd
, 0);
497 /* Do not open file if the format does not need it. XXX: specific
498 hack needed to handle RTSP/TCP */
499 if (!fmt
|| !(fmt
->flags
& AVFMT_NOFILE
)) {
500 /* if no file needed do not try to open one */
501 if ((err
=url_fopen(&pb
, filename
, URL_RDONLY
)) < 0) {
505 url_setbufsize(pb
, buf_size
);
508 for(probe_size
= PROBE_BUF_MIN
; probe_size
<=PROBE_BUF_MAX
&& !fmt
; probe_size
<<=1){
509 int score
= probe_size
< PROBE_BUF_MAX ? AVPROBE_SCORE_MAX
/4 : 0;
510 /* read probe data */
511 pd
->buf
= av_realloc(pd
->buf
, probe_size
+ AVPROBE_PADDING_SIZE
);
512 pd
->buf_size
= get_buffer(pb
, pd
->buf
, probe_size
);
513 memset(pd
->buf
+pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
514 if (url_fseek(pb
, 0, SEEK_SET
) < 0) {
516 if (url_fopen(&pb
, filename
, URL_RDONLY
) < 0) {
522 /* guess file format */
523 fmt
= av_probe_input_format2(pd
, 1, &score
);
528 /* if still no format found, error */
534 /* check filename in case an image number is expected */
535 if (fmt
->flags
& AVFMT_NEEDNUMBER
) {
536 if (!av_filename_number_test(filename
)) {
537 err
= AVERROR_NUMEXPECTED
;
541 err
= av_open_input_stream(ic_ptr
, pb
, filename
, fmt
, ap
);
554 /*******************************************************/
556 static AVPacket
*add_to_pktbuf(AVPacketList
**packet_buffer
, AVPacket
*pkt
,
557 AVPacketList
**plast_pktl
){
558 AVPacketList
*pktl
= av_mallocz(sizeof(AVPacketList
));
563 (*plast_pktl
)->next
= pktl
;
565 *packet_buffer
= pktl
;
567 /* add the packet in the buffered packet list */
573 int av_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
579 AVPacketList
*pktl
= s
->raw_packet_buffer
;
583 if(s
->streams
[pkt
->stream_index
]->codec
->codec_id
!= CODEC_ID_PROBE
){
584 s
->raw_packet_buffer
= pktl
->next
;
591 ret
= s
->iformat
->read_packet(s
, pkt
);
594 st
= s
->streams
[pkt
->stream_index
];
596 switch(st
->codec
->codec_type
){
597 case CODEC_TYPE_VIDEO
:
598 if(s
->video_codec_id
) st
->codec
->codec_id
= s
->video_codec_id
;
600 case CODEC_TYPE_AUDIO
:
601 if(s
->audio_codec_id
) st
->codec
->codec_id
= s
->audio_codec_id
;
603 case CODEC_TYPE_SUBTITLE
:
604 if(s
->subtitle_codec_id
)st
->codec
->codec_id
= s
->subtitle_codec_id
;
608 if(!pktl
&& st
->codec
->codec_id
!=CODEC_ID_PROBE
)
611 add_to_pktbuf(&s
->raw_packet_buffer
, pkt
, &s
->raw_packet_buffer_end
);
613 if(st
->codec
->codec_id
== CODEC_ID_PROBE
){
614 AVProbeData
*pd
= &st
->probe_data
;
616 pd
->buf
= av_realloc(pd
->buf
, pd
->buf_size
+pkt
->size
+AVPROBE_PADDING_SIZE
);
617 memcpy(pd
->buf
+pd
->buf_size
, pkt
->data
, pkt
->size
);
618 pd
->buf_size
+= pkt
->size
;
619 memset(pd
->buf
+pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
621 if(av_log2(pd
->buf_size
) != av_log2(pd
->buf_size
- pkt
->size
)){
622 set_codec_from_probe_data(st
, pd
, 1);
623 if(st
->codec
->codec_id
!= CODEC_ID_PROBE
){
632 /**********************************************************/
635 * Get the number of samples of an audio frame. Return -1 on error.
637 static int get_audio_frame_size(AVCodecContext
*enc
, int size
)
641 if(enc
->codec_id
== CODEC_ID_VORBIS
)
644 if (enc
->frame_size
<= 1) {
645 int bits_per_sample
= av_get_bits_per_sample(enc
->codec_id
);
647 if (bits_per_sample
) {
648 if (enc
->channels
== 0)
650 frame_size
= (size
<< 3) / (bits_per_sample
* enc
->channels
);
652 /* used for example by ADPCM codecs */
653 if (enc
->bit_rate
== 0)
655 frame_size
= (size
* 8 * enc
->sample_rate
) / enc
->bit_rate
;
658 frame_size
= enc
->frame_size
;
665 * Return the frame duration in seconds. Return 0 if not available.
667 static void compute_frame_duration(int *pnum
, int *pden
, AVStream
*st
,
668 AVCodecParserContext
*pc
, AVPacket
*pkt
)
674 switch(st
->codec
->codec_type
) {
675 case CODEC_TYPE_VIDEO
:
676 if(st
->time_base
.num
*1000LL > st
->time_base
.den
){
677 *pnum
= st
->time_base
.num
;
678 *pden
= st
->time_base
.den
;
679 }else if(st
->codec
->time_base
.num
*1000LL > st
->codec
->time_base
.den
){
680 *pnum
= st
->codec
->time_base
.num
;
681 *pden
= st
->codec
->time_base
.den
;
682 if (pc
&& pc
->repeat_pict
) {
683 *pnum
= (*pnum
) * (1 + pc
->repeat_pict
);
687 case CODEC_TYPE_AUDIO
:
688 frame_size
= get_audio_frame_size(st
->codec
, pkt
->size
);
692 *pden
= st
->codec
->sample_rate
;
699 static int is_intra_only(AVCodecContext
*enc
){
700 if(enc
->codec_type
== CODEC_TYPE_AUDIO
){
702 }else if(enc
->codec_type
== CODEC_TYPE_VIDEO
){
703 switch(enc
->codec_id
){
705 case CODEC_ID_MJPEGB
:
707 case CODEC_ID_RAWVIDEO
:
708 case CODEC_ID_DVVIDEO
:
709 case CODEC_ID_HUFFYUV
:
710 case CODEC_ID_FFVHUFF
:
715 case CODEC_ID_JPEG2000
:
723 static void update_initial_timestamps(AVFormatContext
*s
, int stream_index
,
724 int64_t dts
, int64_t pts
)
726 AVStream
*st
= s
->streams
[stream_index
];
727 AVPacketList
*pktl
= s
->packet_buffer
;
729 if(st
->first_dts
!= AV_NOPTS_VALUE
|| dts
== AV_NOPTS_VALUE
|| st
->cur_dts
== AV_NOPTS_VALUE
)
732 st
->first_dts
= dts
- st
->cur_dts
;
735 for(; pktl
; pktl
= pktl
->next
){
736 if(pktl
->pkt
.stream_index
!= stream_index
)
738 //FIXME think more about this check
739 if(pktl
->pkt
.pts
!= AV_NOPTS_VALUE
&& pktl
->pkt
.pts
== pktl
->pkt
.dts
)
740 pktl
->pkt
.pts
+= st
->first_dts
;
742 if(pktl
->pkt
.dts
!= AV_NOPTS_VALUE
)
743 pktl
->pkt
.dts
+= st
->first_dts
;
745 if(st
->start_time
== AV_NOPTS_VALUE
&& pktl
->pkt
.pts
!= AV_NOPTS_VALUE
)
746 st
->start_time
= pktl
->pkt
.pts
;
748 if (st
->start_time
== AV_NOPTS_VALUE
)
749 st
->start_time
= pts
;
752 static void update_initial_durations(AVFormatContext
*s
, AVStream
*st
, AVPacket
*pkt
)
754 AVPacketList
*pktl
= s
->packet_buffer
;
757 if(st
->first_dts
!= AV_NOPTS_VALUE
){
758 cur_dts
= st
->first_dts
;
759 for(; pktl
; pktl
= pktl
->next
){
760 if(pktl
->pkt
.stream_index
== pkt
->stream_index
){
761 if(pktl
->pkt
.pts
!= pktl
->pkt
.dts
|| pktl
->pkt
.dts
!= AV_NOPTS_VALUE
|| pktl
->pkt
.duration
)
763 cur_dts
-= pkt
->duration
;
766 pktl
= s
->packet_buffer
;
767 st
->first_dts
= cur_dts
;
768 }else if(st
->cur_dts
)
771 for(; pktl
; pktl
= pktl
->next
){
772 if(pktl
->pkt
.stream_index
!= pkt
->stream_index
)
774 if(pktl
->pkt
.pts
== pktl
->pkt
.dts
&& pktl
->pkt
.dts
== AV_NOPTS_VALUE
775 && !pktl
->pkt
.duration
){
776 pktl
->pkt
.dts
= cur_dts
;
777 if(!st
->codec
->has_b_frames
)
778 pktl
->pkt
.pts
= cur_dts
;
779 cur_dts
+= pkt
->duration
;
780 pktl
->pkt
.duration
= pkt
->duration
;
784 if(st
->first_dts
== AV_NOPTS_VALUE
)
785 st
->cur_dts
= cur_dts
;
788 static void compute_pkt_fields(AVFormatContext
*s
, AVStream
*st
,
789 AVCodecParserContext
*pc
, AVPacket
*pkt
)
791 int num
, den
, presentation_delayed
, delay
, i
;
794 /* do we have a video B-frame ? */
795 delay
= st
->codec
->has_b_frames
;
796 presentation_delayed
= 0;
797 /* XXX: need has_b_frame, but cannot get it if the codec is
800 pc
&& pc
->pict_type
!= FF_B_TYPE
)
801 presentation_delayed
= 1;
803 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->dts
> pkt
->pts
&& st
->pts_wrap_bits
<63
804 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
805 pkt
->dts
-= 1LL<<st
->pts_wrap_bits
;
808 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
809 // we take the conservative approach and discard both
810 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
811 if(delay
==1 && pkt
->dts
== pkt
->pts
&& pkt
->dts
!= AV_NOPTS_VALUE
&& presentation_delayed
){
812 av_log(s
, AV_LOG_WARNING
, "invalid dts/pts combination\n");
813 pkt
->dts
= pkt
->pts
= AV_NOPTS_VALUE
;
816 if (pkt
->duration
== 0) {
817 compute_frame_duration(&num
, &den
, st
, pc
, pkt
);
819 pkt
->duration
= av_rescale(1, num
* (int64_t)st
->time_base
.den
, den
* (int64_t)st
->time_base
.num
);
821 if(pkt
->duration
!= 0 && s
->packet_buffer
)
822 update_initial_durations(s
, st
, pkt
);
826 /* correct timestamps with byte offset if demuxers only have timestamps
827 on packet boundaries */
828 if(pc
&& st
->need_parsing
== AVSTREAM_PARSE_TIMESTAMPS
&& pkt
->size
){
829 /* this will estimate bitrate based on this frame's duration and size */
830 offset
= av_rescale(pc
->offset
, pkt
->duration
, pkt
->size
);
831 if(pkt
->pts
!= AV_NOPTS_VALUE
)
833 if(pkt
->dts
!= AV_NOPTS_VALUE
)
837 if (pc
&& pc
->dts_sync_point
>= 0) {
838 // we have synchronization info from the parser
839 int64_t den
= st
->codec
->time_base
.den
* (int64_t) st
->time_base
.num
;
841 int64_t num
= st
->codec
->time_base
.num
* (int64_t) st
->time_base
.den
;
842 if (pkt
->dts
!= AV_NOPTS_VALUE
) {
843 // got DTS from the stream, update reference timestamp
844 st
->reference_dts
= pkt
->dts
- pc
->dts_ref_dts_delta
* num
/ den
;
845 pkt
->pts
= pkt
->dts
+ pc
->pts_dts_delta
* num
/ den
;
846 } else if (st
->reference_dts
!= AV_NOPTS_VALUE
) {
847 // compute DTS based on reference timestamp
848 pkt
->dts
= st
->reference_dts
+ pc
->dts_ref_dts_delta
* num
/ den
;
849 pkt
->pts
= pkt
->dts
+ pc
->pts_dts_delta
* num
/ den
;
851 if (pc
->dts_sync_point
> 0)
852 st
->reference_dts
= pkt
->dts
; // new reference
856 /* This may be redundant, but it should not hurt. */
857 if(pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->pts
> pkt
->dts
)
858 presentation_delayed
= 1;
860 // 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);
861 /* interpolate PTS and DTS if they are not present */
862 if(delay
==0 || (delay
==1 && pc
)){
863 if (presentation_delayed
) {
864 /* DTS = decompression timestamp */
865 /* PTS = presentation timestamp */
866 if (pkt
->dts
== AV_NOPTS_VALUE
)
867 pkt
->dts
= st
->last_IP_pts
;
868 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
);
869 if (pkt
->dts
== AV_NOPTS_VALUE
)
870 pkt
->dts
= st
->cur_dts
;
872 /* this is tricky: the dts must be incremented by the duration
873 of the frame we are displaying, i.e. the last I- or P-frame */
874 if (st
->last_IP_duration
== 0)
875 st
->last_IP_duration
= pkt
->duration
;
876 if(pkt
->dts
!= AV_NOPTS_VALUE
)
877 st
->cur_dts
= pkt
->dts
+ st
->last_IP_duration
;
878 st
->last_IP_duration
= pkt
->duration
;
879 st
->last_IP_pts
= pkt
->pts
;
880 /* cannot compute PTS if not present (we can compute it only
881 by knowing the future */
882 } else if(pkt
->pts
!= AV_NOPTS_VALUE
|| pkt
->dts
!= AV_NOPTS_VALUE
|| pkt
->duration
){
883 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->duration
){
884 int64_t old_diff
= FFABS(st
->cur_dts
- pkt
->duration
- pkt
->pts
);
885 int64_t new_diff
= FFABS(st
->cur_dts
- pkt
->pts
);
886 if(old_diff
< new_diff
&& old_diff
< (pkt
->duration
>>3)){
887 pkt
->pts
+= pkt
->duration
;
888 // 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);
892 /* presentation is not delayed : PTS and DTS are the same */
893 if(pkt
->pts
== AV_NOPTS_VALUE
)
895 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->pts
, pkt
->pts
);
896 if(pkt
->pts
== AV_NOPTS_VALUE
)
897 pkt
->pts
= st
->cur_dts
;
899 if(pkt
->pts
!= AV_NOPTS_VALUE
)
900 st
->cur_dts
= pkt
->pts
+ pkt
->duration
;
904 if(pkt
->pts
!= AV_NOPTS_VALUE
&& delay
<= MAX_REORDER_DELAY
){
905 st
->pts_buffer
[0]= pkt
->pts
;
906 for(i
=0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+1]; i
++)
907 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+1]);
908 if(pkt
->dts
== AV_NOPTS_VALUE
)
909 pkt
->dts
= st
->pts_buffer
[0];
911 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
); // this should happen on the first packet
913 if(pkt
->dts
> st
->cur_dts
)
914 st
->cur_dts
= pkt
->dts
;
917 // 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);
920 if(is_intra_only(st
->codec
))
921 pkt
->flags
|= PKT_FLAG_KEY
;
924 /* keyframe computation */
925 if (pc
->key_frame
== 1)
926 pkt
->flags
|= PKT_FLAG_KEY
;
927 else if (pc
->key_frame
== -1 && pc
->pict_type
== FF_I_TYPE
)
928 pkt
->flags
|= PKT_FLAG_KEY
;
931 pkt
->convergence_duration
= pc
->convergence_duration
;
934 void av_destruct_packet_nofree(AVPacket
*pkt
)
936 pkt
->data
= NULL
; pkt
->size
= 0;
939 static int av_read_frame_internal(AVFormatContext
*s
, AVPacket
*pkt
)
947 /* select current input stream component */
950 if (!st
->need_parsing
|| !st
->parser
) {
951 /* no parsing needed: we just output the packet as is */
952 /* raw data support */
953 *pkt
= st
->cur_pkt
; st
->cur_pkt
.data
= NULL
;
954 compute_pkt_fields(s
, st
, NULL
, pkt
);
957 } else if (st
->cur_len
> 0 && st
->discard
< AVDISCARD_ALL
) {
958 len
= av_parser_parse(st
->parser
, st
->codec
, &pkt
->data
, &pkt
->size
,
959 st
->cur_ptr
, st
->cur_len
,
960 st
->cur_pkt
.pts
, st
->cur_pkt
.dts
);
961 st
->cur_pkt
.pts
= AV_NOPTS_VALUE
;
962 st
->cur_pkt
.dts
= AV_NOPTS_VALUE
;
963 /* increment read pointer */
967 /* return packet if any */
969 pkt
->pos
= st
->cur_pkt
.pos
; // Isn't quite accurate but close.
972 pkt
->stream_index
= st
->index
;
973 pkt
->pts
= st
->parser
->pts
;
974 pkt
->dts
= st
->parser
->dts
;
975 pkt
->destruct
= av_destruct_packet_nofree
;
976 compute_pkt_fields(s
, st
, st
->parser
, pkt
);
978 if((s
->iformat
->flags
& AVFMT_GENERIC_INDEX
) && pkt
->flags
& PKT_FLAG_KEY
){
979 ff_reduce_index(s
, st
->index
);
980 av_add_index_entry(st
, st
->parser
->frame_offset
, pkt
->dts
,
981 0, 0, AVINDEX_KEYFRAME
);
988 av_free_packet(&st
->cur_pkt
);
993 /* read next packet */
994 ret
= av_read_packet(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 */
1013 st
= s
->streams
[cur_pkt
.stream_index
];
1014 st
->cur_pkt
= cur_pkt
;
1016 if(st
->cur_pkt
.pts
!= AV_NOPTS_VALUE
&&
1017 st
->cur_pkt
.dts
!= AV_NOPTS_VALUE
&&
1018 st
->cur_pkt
.pts
< st
->cur_pkt
.dts
){
1019 av_log(s
, AV_LOG_WARNING
, "Invalid timestamps stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d\n",
1020 st
->cur_pkt
.stream_index
,
1024 // av_free_packet(&st->cur_pkt);
1028 if(s
->debug
& FF_FDEBUG_TS
)
1029 av_log(s
, AV_LOG_DEBUG
, "av_read_packet stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d, flags=%d\n",
1030 st
->cur_pkt
.stream_index
,
1037 st
->cur_ptr
= st
->cur_pkt
.data
;
1038 st
->cur_len
= st
->cur_pkt
.size
;
1039 if (st
->need_parsing
&& !st
->parser
) {
1040 st
->parser
= av_parser_init(st
->codec
->codec_id
);
1042 /* no parser available: just output the raw packets */
1043 st
->need_parsing
= AVSTREAM_PARSE_NONE
;
1044 }else if(st
->need_parsing
== AVSTREAM_PARSE_HEADERS
){
1045 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
1047 if(st
->parser
&& (s
->iformat
->flags
& AVFMT_GENERIC_INDEX
)){
1048 st
->parser
->next_frame_offset
=
1049 st
->parser
->cur_offset
= st
->cur_pkt
.pos
;
1054 if(s
->debug
& FF_FDEBUG_TS
)
1055 av_log(s
, AV_LOG_DEBUG
, "av_read_frame_internal stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d, flags=%d\n",
1065 int av_read_frame(AVFormatContext
*s
, AVPacket
*pkt
)
1069 const int genpts
= s
->flags
& AVFMT_FLAG_GENPTS
;
1072 pktl
= s
->packet_buffer
;
1074 AVPacket
*next_pkt
= &pktl
->pkt
;
1076 if(genpts
&& next_pkt
->dts
!= AV_NOPTS_VALUE
){
1077 while(pktl
&& next_pkt
->pts
== AV_NOPTS_VALUE
){
1078 if( pktl
->pkt
.stream_index
== next_pkt
->stream_index
1079 && next_pkt
->dts
< pktl
->pkt
.dts
1080 && pktl
->pkt
.pts
!= pktl
->pkt
.dts
//not b frame
1081 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1082 next_pkt
->pts
= pktl
->pkt
.dts
;
1086 pktl
= s
->packet_buffer
;
1089 if( next_pkt
->pts
!= AV_NOPTS_VALUE
1090 || next_pkt
->dts
== AV_NOPTS_VALUE
1092 /* read packet from packet buffer, if there is data */
1094 s
->packet_buffer
= pktl
->next
;
1100 int ret
= av_read_frame_internal(s
, pkt
);
1102 if(pktl
&& ret
!= AVERROR(EAGAIN
)){
1109 if(av_dup_packet(add_to_pktbuf(&s
->packet_buffer
, pkt
,
1110 &s
->packet_buffer_end
)) < 0)
1111 return AVERROR(ENOMEM
);
1113 assert(!s
->packet_buffer
);
1114 return av_read_frame_internal(s
, pkt
);
1119 /* XXX: suppress the packet queue */
1120 static void flush_packet_queue(AVFormatContext
*s
)
1125 pktl
= s
->packet_buffer
;
1128 s
->packet_buffer
= pktl
->next
;
1129 av_free_packet(&pktl
->pkt
);
1134 /*******************************************************/
1137 int av_find_default_stream_index(AVFormatContext
*s
)
1139 int first_audio_index
= -1;
1143 if (s
->nb_streams
<= 0)
1145 for(i
= 0; i
< s
->nb_streams
; i
++) {
1147 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
1150 if (first_audio_index
< 0 && st
->codec
->codec_type
== CODEC_TYPE_AUDIO
)
1151 first_audio_index
= i
;
1153 return first_audio_index
>= 0 ? first_audio_index
: 0;
1157 * Flush the frame reader.
1159 static void av_read_frame_flush(AVFormatContext
*s
)
1164 flush_packet_queue(s
);
1168 /* for each stream, reset read state */
1169 for(i
= 0; i
< s
->nb_streams
; i
++) {
1173 av_parser_close(st
->parser
);
1175 av_free_packet(&st
->cur_pkt
);
1177 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1178 st
->cur_dts
= AV_NOPTS_VALUE
; /* we set the current DTS to an unspecified origin */
1179 st
->reference_dts
= AV_NOPTS_VALUE
;
1186 void av_update_cur_dts(AVFormatContext
*s
, AVStream
*ref_st
, int64_t timestamp
){
1189 for(i
= 0; i
< s
->nb_streams
; i
++) {
1190 AVStream
*st
= s
->streams
[i
];
1192 st
->cur_dts
= av_rescale(timestamp
,
1193 st
->time_base
.den
* (int64_t)ref_st
->time_base
.num
,
1194 st
->time_base
.num
* (int64_t)ref_st
->time_base
.den
);
1198 void ff_reduce_index(AVFormatContext
*s
, int stream_index
)
1200 AVStream
*st
= s
->streams
[stream_index
];
1201 unsigned int max_entries
= s
->max_index_size
/ sizeof(AVIndexEntry
);
1203 if((unsigned)st
->nb_index_entries
>= max_entries
){
1205 for(i
=0; 2*i
<st
->nb_index_entries
; i
++)
1206 st
->index_entries
[i
]= st
->index_entries
[2*i
];
1207 st
->nb_index_entries
= i
;
1211 int av_add_index_entry(AVStream
*st
,
1212 int64_t pos
, int64_t timestamp
, int size
, int distance
, int flags
)
1214 AVIndexEntry
*entries
, *ie
;
1217 if((unsigned)st
->nb_index_entries
+ 1 >= UINT_MAX
/ sizeof(AVIndexEntry
))
1220 entries
= av_fast_realloc(st
->index_entries
,
1221 &st
->index_entries_allocated_size
,
1222 (st
->nb_index_entries
+ 1) *
1223 sizeof(AVIndexEntry
));
1227 st
->index_entries
= entries
;
1229 index
= av_index_search_timestamp(st
, timestamp
, AVSEEK_FLAG_ANY
);
1232 index
= st
->nb_index_entries
++;
1233 ie
= &entries
[index
];
1234 assert(index
==0 || ie
[-1].timestamp
< timestamp
);
1236 ie
= &entries
[index
];
1237 if(ie
->timestamp
!= timestamp
){
1238 if(ie
->timestamp
<= timestamp
)
1240 memmove(entries
+ index
+ 1, entries
+ index
, sizeof(AVIndexEntry
)*(st
->nb_index_entries
- index
));
1241 st
->nb_index_entries
++;
1242 }else if(ie
->pos
== pos
&& distance
< ie
->min_distance
) //do not reduce the distance
1243 distance
= ie
->min_distance
;
1247 ie
->timestamp
= timestamp
;
1248 ie
->min_distance
= distance
;
1255 int av_index_search_timestamp(AVStream
*st
, int64_t wanted_timestamp
,
1258 AVIndexEntry
*entries
= st
->index_entries
;
1259 int nb_entries
= st
->nb_index_entries
;
1268 timestamp
= entries
[m
].timestamp
;
1269 if(timestamp
>= wanted_timestamp
)
1271 if(timestamp
<= wanted_timestamp
)
1274 m
= (flags
& AVSEEK_FLAG_BACKWARD
) ? a
: b
;
1276 if(!(flags
& AVSEEK_FLAG_ANY
)){
1277 while(m
>=0 && m
<nb_entries
&& !(entries
[m
].flags
& AVINDEX_KEYFRAME
)){
1278 m
+= (flags
& AVSEEK_FLAG_BACKWARD
) ?
-1 : 1;
1289 int av_seek_frame_binary(AVFormatContext
*s
, int stream_index
, int64_t target_ts
, int flags
){
1290 AVInputFormat
*avif
= s
->iformat
;
1291 int64_t pos_min
, pos_max
, pos
, pos_limit
;
1292 int64_t ts_min
, ts_max
, ts
;
1296 if (stream_index
< 0)
1300 av_log(s
, AV_LOG_DEBUG
, "read_seek: %d %"PRId64
"\n", stream_index
, target_ts
);
1304 ts_min
= AV_NOPTS_VALUE
;
1305 pos_limit
= -1; //gcc falsely says it may be uninitialized
1307 st
= s
->streams
[stream_index
];
1308 if(st
->index_entries
){
1311 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()
1312 index
= FFMAX(index
, 0);
1313 e
= &st
->index_entries
[index
];
1315 if(e
->timestamp
<= target_ts
|| e
->pos
== e
->min_distance
){
1317 ts_min
= e
->timestamp
;
1319 av_log(s
, AV_LOG_DEBUG
, "using cached pos_min=0x%"PRIx64
" dts_min=%"PRId64
"\n",
1326 index
= av_index_search_timestamp(st
, target_ts
, flags
& ~AVSEEK_FLAG_BACKWARD
);
1327 assert(index
< st
->nb_index_entries
);
1329 e
= &st
->index_entries
[index
];
1330 assert(e
->timestamp
>= target_ts
);
1332 ts_max
= e
->timestamp
;
1333 pos_limit
= pos_max
- e
->min_distance
;
1335 av_log(s
, AV_LOG_DEBUG
, "using cached pos_max=0x%"PRIx64
" pos_limit=0x%"PRIx64
" dts_max=%"PRId64
"\n",
1336 pos_max
,pos_limit
, ts_max
);
1341 pos
= av_gen_search(s
, stream_index
, target_ts
, pos_min
, pos_max
, pos_limit
, ts_min
, ts_max
, flags
, &ts
, avif
->read_timestamp
);
1346 url_fseek(s
->pb
, pos
, SEEK_SET
);
1348 av_update_cur_dts(s
, st
, ts
);
1353 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 )){
1355 int64_t start_pos
, filesize
;
1359 av_log(s
, AV_LOG_DEBUG
, "gen_seek: %d %"PRId64
"\n", stream_index
, target_ts
);
1362 if(ts_min
== AV_NOPTS_VALUE
){
1363 pos_min
= s
->data_offset
;
1364 ts_min
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1365 if (ts_min
== AV_NOPTS_VALUE
)
1369 if(ts_max
== AV_NOPTS_VALUE
){
1371 filesize
= url_fsize(s
->pb
);
1372 pos_max
= filesize
- 1;
1375 ts_max
= read_timestamp(s
, stream_index
, &pos_max
, pos_max
+ step
);
1377 }while(ts_max
== AV_NOPTS_VALUE
&& pos_max
>= step
);
1378 if (ts_max
== AV_NOPTS_VALUE
)
1382 int64_t tmp_pos
= pos_max
+ 1;
1383 int64_t tmp_ts
= read_timestamp(s
, stream_index
, &tmp_pos
, INT64_MAX
);
1384 if(tmp_ts
== AV_NOPTS_VALUE
)
1388 if(tmp_pos
>= filesize
)
1394 if(ts_min
> ts_max
){
1396 }else if(ts_min
== ts_max
){
1401 while (pos_min
< pos_limit
) {
1403 av_log(s
, AV_LOG_DEBUG
, "pos_min=0x%"PRIx64
" pos_max=0x%"PRIx64
" dts_min=%"PRId64
" dts_max=%"PRId64
"\n",
1407 assert(pos_limit
<= pos_max
);
1410 int64_t approximate_keyframe_distance
= pos_max
- pos_limit
;
1411 // interpolate position (better than dichotomy)
1412 pos
= av_rescale(target_ts
- ts_min
, pos_max
- pos_min
, ts_max
- ts_min
)
1413 + pos_min
- approximate_keyframe_distance
;
1414 }else if(no_change
==1){
1415 // bisection, if interpolation failed to change min or max pos last time
1416 pos
= (pos_min
+ pos_limit
)>>1;
1418 /* linear search if bisection failed, can only happen if there
1419 are very few or no keyframes between min/max */
1424 else if(pos
> pos_limit
)
1428 ts
= read_timestamp(s
, stream_index
, &pos
, INT64_MAX
); //may pass pos_limit instead of -1
1434 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
);
1436 if(ts
== AV_NOPTS_VALUE
){
1437 av_log(s
, AV_LOG_ERROR
, "read_timestamp() failed in the middle\n");
1440 assert(ts
!= AV_NOPTS_VALUE
);
1441 if (target_ts
<= ts
) {
1442 pos_limit
= start_pos
- 1;
1446 if (target_ts
>= ts
) {
1452 pos
= (flags
& AVSEEK_FLAG_BACKWARD
) ? pos_min
: pos_max
;
1453 ts
= (flags
& AVSEEK_FLAG_BACKWARD
) ? ts_min
: ts_max
;
1456 ts_min
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1458 ts_max
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1459 av_log(s
, AV_LOG_DEBUG
, "pos=0x%"PRIx64
" %"PRId64
"<=%"PRId64
"<=%"PRId64
"\n",
1460 pos
, ts_min
, target_ts
, ts_max
);
1466 static int av_seek_frame_byte(AVFormatContext
*s
, int stream_index
, int64_t pos
, int flags
){
1467 int64_t pos_min
, pos_max
;
1471 if (stream_index
< 0)
1474 st
= s
->streams
[stream_index
];
1477 pos_min
= s
->data_offset
;
1478 pos_max
= url_fsize(s
->pb
) - 1;
1480 if (pos
< pos_min
) pos
= pos_min
;
1481 else if(pos
> pos_max
) pos
= pos_max
;
1483 url_fseek(s
->pb
, pos
, SEEK_SET
);
1486 av_update_cur_dts(s
, st
, ts
);
1491 static int av_seek_frame_generic(AVFormatContext
*s
,
1492 int stream_index
, int64_t timestamp
, int flags
)
1498 st
= s
->streams
[stream_index
];
1500 index
= av_index_search_timestamp(st
, timestamp
, flags
);
1502 if(index
< 0 || index
==st
->nb_index_entries
-1){
1506 if(st
->nb_index_entries
){
1507 assert(st
->index_entries
);
1508 ie
= &st
->index_entries
[st
->nb_index_entries
-1];
1509 if ((ret
= url_fseek(s
->pb
, ie
->pos
, SEEK_SET
)) < 0)
1511 av_update_cur_dts(s
, st
, ie
->timestamp
);
1513 if ((ret
= url_fseek(s
->pb
, 0, SEEK_SET
)) < 0)
1519 ret
= av_read_frame(s
, &pkt
);
1520 }while(ret
== AVERROR(EAGAIN
));
1523 av_free_packet(&pkt
);
1524 if(stream_index
== pkt
.stream_index
){
1525 if((pkt
.flags
& PKT_FLAG_KEY
) && pkt
.dts
> timestamp
)
1529 index
= av_index_search_timestamp(st
, timestamp
, flags
);
1534 av_read_frame_flush(s
);
1535 if (s
->iformat
->read_seek
){
1536 if(s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
) >= 0)
1539 ie
= &st
->index_entries
[index
];
1540 if ((ret
= url_fseek(s
->pb
, ie
->pos
, SEEK_SET
)) < 0)
1542 av_update_cur_dts(s
, st
, ie
->timestamp
);
1547 int av_seek_frame(AVFormatContext
*s
, int stream_index
, int64_t timestamp
, int flags
)
1552 av_read_frame_flush(s
);
1554 if(flags
& AVSEEK_FLAG_BYTE
)
1555 return av_seek_frame_byte(s
, stream_index
, timestamp
, flags
);
1557 if(stream_index
< 0){
1558 stream_index
= av_find_default_stream_index(s
);
1559 if(stream_index
< 0)
1562 st
= s
->streams
[stream_index
];
1563 /* timestamp for default must be expressed in AV_TIME_BASE units */
1564 timestamp
= av_rescale(timestamp
, st
->time_base
.den
, AV_TIME_BASE
* (int64_t)st
->time_base
.num
);
1567 /* first, we try the format specific seek */
1568 if (s
->iformat
->read_seek
)
1569 ret
= s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
);
1576 if(s
->iformat
->read_timestamp
)
1577 return av_seek_frame_binary(s
, stream_index
, timestamp
, flags
);
1579 return av_seek_frame_generic(s
, stream_index
, timestamp
, flags
);
1582 /*******************************************************/
1585 * Returns TRUE if the stream has accurate duration in any stream.
1587 * @return TRUE if the stream has accurate duration for at least one component.
1589 static int av_has_duration(AVFormatContext
*ic
)
1594 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1595 st
= ic
->streams
[i
];
1596 if (st
->duration
!= AV_NOPTS_VALUE
)
1603 * Estimate the stream timings from the one of each components.
1605 * Also computes the global bitrate if possible.
1607 static void av_update_stream_timings(AVFormatContext
*ic
)
1609 int64_t start_time
, start_time1
, end_time
, end_time1
;
1610 int64_t duration
, duration1
;
1614 start_time
= INT64_MAX
;
1615 end_time
= INT64_MIN
;
1616 duration
= INT64_MIN
;
1617 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1618 st
= ic
->streams
[i
];
1619 if (st
->start_time
!= AV_NOPTS_VALUE
&& st
->time_base
.den
) {
1620 start_time1
= av_rescale_q(st
->start_time
, st
->time_base
, AV_TIME_BASE_Q
);
1621 if (start_time1
< start_time
)
1622 start_time
= start_time1
;
1623 if (st
->duration
!= AV_NOPTS_VALUE
) {
1624 end_time1
= start_time1
1625 + av_rescale_q(st
->duration
, st
->time_base
, AV_TIME_BASE_Q
);
1626 if (end_time1
> end_time
)
1627 end_time
= end_time1
;
1630 if (st
->duration
!= AV_NOPTS_VALUE
) {
1631 duration1
= av_rescale_q(st
->duration
, st
->time_base
, AV_TIME_BASE_Q
);
1632 if (duration1
> duration
)
1633 duration
= duration1
;
1636 if (start_time
!= INT64_MAX
) {
1637 ic
->start_time
= start_time
;
1638 if (end_time
!= INT64_MIN
) {
1639 if (end_time
- start_time
> duration
)
1640 duration
= end_time
- start_time
;
1643 if (duration
!= INT64_MIN
) {
1644 ic
->duration
= duration
;
1645 if (ic
->file_size
> 0) {
1646 /* compute the bitrate */
1647 ic
->bit_rate
= (double)ic
->file_size
* 8.0 * AV_TIME_BASE
/
1648 (double)ic
->duration
;
1653 static void fill_all_stream_timings(AVFormatContext
*ic
)
1658 av_update_stream_timings(ic
);
1659 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1660 st
= ic
->streams
[i
];
1661 if (st
->start_time
== AV_NOPTS_VALUE
) {
1662 if(ic
->start_time
!= AV_NOPTS_VALUE
)
1663 st
->start_time
= av_rescale_q(ic
->start_time
, AV_TIME_BASE_Q
, st
->time_base
);
1664 if(ic
->duration
!= AV_NOPTS_VALUE
)
1665 st
->duration
= av_rescale_q(ic
->duration
, AV_TIME_BASE_Q
, st
->time_base
);
1670 static void av_estimate_timings_from_bit_rate(AVFormatContext
*ic
)
1672 int64_t filesize
, duration
;
1676 /* if bit_rate is already set, we believe it */
1677 if (ic
->bit_rate
== 0) {
1679 for(i
=0;i
<ic
->nb_streams
;i
++) {
1680 st
= ic
->streams
[i
];
1681 bit_rate
+= st
->codec
->bit_rate
;
1683 ic
->bit_rate
= bit_rate
;
1686 /* if duration is already set, we believe it */
1687 if (ic
->duration
== AV_NOPTS_VALUE
&&
1688 ic
->bit_rate
!= 0 &&
1689 ic
->file_size
!= 0) {
1690 filesize
= ic
->file_size
;
1692 for(i
= 0; i
< ic
->nb_streams
; i
++) {
1693 st
= ic
->streams
[i
];
1694 duration
= av_rescale(8*filesize
, st
->time_base
.den
, ic
->bit_rate
*(int64_t)st
->time_base
.num
);
1695 if (st
->duration
== AV_NOPTS_VALUE
)
1696 st
->duration
= duration
;
1702 #define DURATION_MAX_READ_SIZE 250000
1704 /* only usable for MPEG-PS streams */
1705 static void av_estimate_timings_from_pts(AVFormatContext
*ic
, int64_t old_offset
)
1707 AVPacket pkt1
, *pkt
= &pkt1
;
1709 int read_size
, i
, ret
;
1711 int64_t filesize
, offset
, duration
;
1715 /* flush packet queue */
1716 flush_packet_queue(ic
);
1718 for(i
=0;i
<ic
->nb_streams
;i
++) {
1719 st
= ic
->streams
[i
];
1721 av_parser_close(st
->parser
);
1723 av_free_packet(&st
->cur_pkt
);
1727 /* we read the first packets to get the first PTS (not fully
1728 accurate, but it is enough now) */
1729 url_fseek(ic
->pb
, 0, SEEK_SET
);
1732 if (read_size
>= DURATION_MAX_READ_SIZE
)
1734 /* if all info is available, we can stop */
1735 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1736 st
= ic
->streams
[i
];
1737 if (st
->start_time
== AV_NOPTS_VALUE
)
1740 if (i
== ic
->nb_streams
)
1744 ret
= av_read_packet(ic
, pkt
);
1745 }while(ret
== AVERROR(EAGAIN
));
1748 read_size
+= pkt
->size
;
1749 st
= ic
->streams
[pkt
->stream_index
];
1750 if (pkt
->pts
!= AV_NOPTS_VALUE
) {
1751 if (st
->start_time
== AV_NOPTS_VALUE
)
1752 st
->start_time
= pkt
->pts
;
1754 av_free_packet(pkt
);
1757 /* estimate the end time (duration) */
1758 /* XXX: may need to support wrapping */
1759 filesize
= ic
->file_size
;
1760 offset
= filesize
- DURATION_MAX_READ_SIZE
;
1764 url_fseek(ic
->pb
, offset
, SEEK_SET
);
1767 if (read_size
>= DURATION_MAX_READ_SIZE
)
1771 ret
= av_read_packet(ic
, pkt
);
1772 }while(ret
== AVERROR(EAGAIN
));
1775 read_size
+= pkt
->size
;
1776 st
= ic
->streams
[pkt
->stream_index
];
1777 if (pkt
->pts
!= AV_NOPTS_VALUE
&&
1778 st
->start_time
!= AV_NOPTS_VALUE
) {
1779 end_time
= pkt
->pts
;
1780 duration
= end_time
- st
->start_time
;
1782 if (st
->duration
== AV_NOPTS_VALUE
||
1783 st
->duration
< duration
)
1784 st
->duration
= duration
;
1787 av_free_packet(pkt
);
1790 fill_all_stream_timings(ic
);
1792 url_fseek(ic
->pb
, old_offset
, SEEK_SET
);
1793 for(i
=0; i
<ic
->nb_streams
; i
++){
1795 st
->cur_dts
= st
->first_dts
;
1796 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1800 static void av_estimate_timings(AVFormatContext
*ic
, int64_t old_offset
)
1804 /* get the file size, if possible */
1805 if (ic
->iformat
->flags
& AVFMT_NOFILE
) {
1808 file_size
= url_fsize(ic
->pb
);
1812 ic
->file_size
= file_size
;
1814 if ((!strcmp(ic
->iformat
->name
, "mpeg") ||
1815 !strcmp(ic
->iformat
->name
, "mpegts")) &&
1816 file_size
&& !url_is_streamed(ic
->pb
)) {
1817 /* get accurate estimate from the PTSes */
1818 av_estimate_timings_from_pts(ic
, old_offset
);
1819 } else if (av_has_duration(ic
)) {
1820 /* at least one component has timings - we use them for all
1822 fill_all_stream_timings(ic
);
1824 /* less precise: use bitrate info */
1825 av_estimate_timings_from_bit_rate(ic
);
1827 av_update_stream_timings(ic
);
1833 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1834 st
= ic
->streams
[i
];
1835 printf("%d: start_time: %0.3f duration: %0.3f\n",
1836 i
, (double)st
->start_time
/ AV_TIME_BASE
,
1837 (double)st
->duration
/ AV_TIME_BASE
);
1839 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1840 (double)ic
->start_time
/ AV_TIME_BASE
,
1841 (double)ic
->duration
/ AV_TIME_BASE
,
1842 ic
->bit_rate
/ 1000);
1847 static int has_codec_parameters(AVCodecContext
*enc
)
1850 switch(enc
->codec_type
) {
1851 case CODEC_TYPE_AUDIO
:
1852 val
= enc
->sample_rate
&& enc
->channels
&& enc
->sample_fmt
!= SAMPLE_FMT_NONE
;
1853 if(!enc
->frame_size
&&
1854 (enc
->codec_id
== CODEC_ID_VORBIS
||
1855 enc
->codec_id
== CODEC_ID_AAC
))
1858 case CODEC_TYPE_VIDEO
:
1859 val
= enc
->width
&& enc
->pix_fmt
!= PIX_FMT_NONE
;
1865 return enc
->codec_id
!= CODEC_ID_NONE
&& val
!= 0;
1868 static int try_decode_frame(AVStream
*st
, const uint8_t *data
, int size
)
1872 int got_picture
, data_size
, ret
=0;
1875 if(!st
->codec
->codec
){
1876 codec
= avcodec_find_decoder(st
->codec
->codec_id
);
1879 ret
= avcodec_open(st
->codec
, codec
);
1884 if(!has_codec_parameters(st
->codec
)){
1885 switch(st
->codec
->codec_type
) {
1886 case CODEC_TYPE_VIDEO
:
1887 ret
= avcodec_decode_video(st
->codec
, &picture
,
1888 &got_picture
, data
, size
);
1890 case CODEC_TYPE_AUDIO
:
1891 data_size
= FFMAX(size
, AVCODEC_MAX_AUDIO_FRAME_SIZE
);
1892 samples
= av_malloc(data_size
);
1895 ret
= avcodec_decode_audio2(st
->codec
, samples
,
1896 &data_size
, data
, size
);
1907 unsigned int codec_get_tag(const AVCodecTag
*tags
, int id
)
1909 while (tags
->id
!= CODEC_ID_NONE
) {
1917 enum CodecID
codec_get_id(const AVCodecTag
*tags
, unsigned int tag
)
1920 for(i
=0; tags
[i
].id
!= CODEC_ID_NONE
;i
++) {
1921 if(tag
== tags
[i
].tag
)
1924 for(i
=0; tags
[i
].id
!= CODEC_ID_NONE
; i
++) {
1925 if( toupper((tag
>> 0)&0xFF) == toupper((tags
[i
].tag
>> 0)&0xFF)
1926 && toupper((tag
>> 8)&0xFF) == toupper((tags
[i
].tag
>> 8)&0xFF)
1927 && toupper((tag
>>16)&0xFF) == toupper((tags
[i
].tag
>>16)&0xFF)
1928 && toupper((tag
>>24)&0xFF) == toupper((tags
[i
].tag
>>24)&0xFF))
1931 return CODEC_ID_NONE
;
1934 unsigned int av_codec_get_tag(const AVCodecTag
* const *tags
, enum CodecID id
)
1937 for(i
=0; tags
&& tags
[i
]; i
++){
1938 int tag
= codec_get_tag(tags
[i
], id
);
1944 enum CodecID
av_codec_get_id(const AVCodecTag
* const *tags
, unsigned int tag
)
1947 for(i
=0; tags
&& tags
[i
]; i
++){
1948 enum CodecID id
= codec_get_id(tags
[i
], tag
);
1949 if(id
!=CODEC_ID_NONE
) return id
;
1951 return CODEC_ID_NONE
;
1954 static void compute_chapters_end(AVFormatContext
*s
)
1958 for (i
=0; i
+1<s
->nb_chapters
; i
++)
1959 if (s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
1960 assert(s
->chapters
[i
]->start
<= s
->chapters
[i
+1]->start
);
1961 assert(!av_cmp_q(s
->chapters
[i
]->time_base
, s
->chapters
[i
+1]->time_base
));
1962 s
->chapters
[i
]->end
= s
->chapters
[i
+1]->start
;
1965 if (s
->nb_chapters
&& s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
1966 assert(s
->start_time
!= AV_NOPTS_VALUE
);
1967 assert(s
->duration
> 0);
1968 s
->chapters
[i
]->end
= av_rescale_q(s
->start_time
+ s
->duration
,
1970 s
->chapters
[i
]->time_base
);
1974 /* absolute maximum size we read until we abort */
1975 #define MAX_READ_SIZE 5000000
1977 #define MAX_STD_TIMEBASES (60*12+5)
1978 static int get_std_framerate(int i
){
1979 if(i
<60*12) return i
*1001;
1980 else return ((const int[]){24,30,60,12,15})[i
-60*12]*1000*12;
1984 * Is the time base unreliable.
1985 * This is a heuristic to balance between quick acceptance of the values in
1986 * the headers vs. some extra checks.
1987 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
1988 * MPEG-2 commonly misuses field repeat flags to store different framerates.
1989 * And there are "variable" fps files this needs to detect as well.
1991 static int tb_unreliable(AVCodecContext
*c
){
1992 if( c
->time_base
.den
>= 101L*c
->time_base
.num
1993 || c
->time_base
.den
< 5L*c
->time_base
.num
1994 /* || c->codec_tag == AV_RL32("DIVX")
1995 || c->codec_tag == AV_RL32("XVID")*/
1996 || c
->codec_id
== CODEC_ID_MPEG2VIDEO
1997 || c
->codec_id
== CODEC_ID_H264
2003 int av_find_stream_info(AVFormatContext
*ic
)
2005 int i
, count
, ret
, read_size
, j
;
2007 AVPacket pkt1
, *pkt
;
2008 int64_t last_dts
[MAX_STREAMS
];
2009 int64_t duration_gcd
[MAX_STREAMS
]={0};
2010 int duration_count
[MAX_STREAMS
]={0};
2011 double (*duration_error
)[MAX_STD_TIMEBASES
];
2012 int64_t old_offset
= url_ftell(ic
->pb
);
2013 int64_t codec_info_duration
[MAX_STREAMS
]={0};
2014 int codec_info_nb_frames
[MAX_STREAMS
]={0};
2016 duration_error
= av_mallocz(MAX_STREAMS
* sizeof(*duration_error
));
2017 if (!duration_error
) return AVERROR(ENOMEM
);
2019 for(i
=0;i
<ic
->nb_streams
;i
++) {
2020 st
= ic
->streams
[i
];
2021 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
){
2022 /* if(!st->time_base.num)
2024 if(!st
->codec
->time_base
.num
)
2025 st
->codec
->time_base
= st
->time_base
;
2027 //only for the split stuff
2029 st
->parser
= av_parser_init(st
->codec
->codec_id
);
2030 if(st
->need_parsing
== AVSTREAM_PARSE_HEADERS
&& st
->parser
){
2031 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
2036 for(i
=0;i
<MAX_STREAMS
;i
++){
2037 last_dts
[i
]= AV_NOPTS_VALUE
;
2043 if(url_interrupt_cb()){
2044 ret
= AVERROR(EINTR
);
2048 /* check if one codec still needs to be handled */
2049 for(i
=0;i
<ic
->nb_streams
;i
++) {
2050 st
= ic
->streams
[i
];
2051 if (!has_codec_parameters(st
->codec
))
2053 /* variable fps and no guess at the real fps */
2054 if( tb_unreliable(st
->codec
)
2055 && duration_count
[i
]<20 && st
->codec
->codec_type
== CODEC_TYPE_VIDEO
)
2057 if(st
->parser
&& st
->parser
->parser
->split
&& !st
->codec
->extradata
)
2059 if(st
->first_dts
== AV_NOPTS_VALUE
)
2062 if (i
== ic
->nb_streams
) {
2063 /* NOTE: if the format has no header, then we need to read
2064 some packets to get most of the streams, so we cannot
2066 if (!(ic
->ctx_flags
& AVFMTCTX_NOHEADER
)) {
2067 /* if we found the info for all the codecs, we can stop */
2072 /* we did not get all the codec info, but we read too much data */
2073 if (read_size
>= MAX_READ_SIZE
) {
2078 /* NOTE: a new stream can be added there if no header in file
2079 (AVFMTCTX_NOHEADER) */
2080 ret
= av_read_frame_internal(ic
, &pkt1
);
2081 if(ret
== AVERROR(EAGAIN
))
2085 ret
= -1; /* we could not have all the codec parameters before EOF */
2086 for(i
=0;i
<ic
->nb_streams
;i
++) {
2087 st
= ic
->streams
[i
];
2088 if (!has_codec_parameters(st
->codec
)){
2090 avcodec_string(buf
, sizeof(buf
), st
->codec
, 0);
2091 av_log(ic
, AV_LOG_INFO
, "Could not find codec parameters (%s)\n", buf
);
2099 pkt
= add_to_pktbuf(&ic
->packet_buffer
, &pkt1
, &ic
->packet_buffer_end
);
2100 if(av_dup_packet(pkt
) < 0) {
2101 av_free(duration_error
);
2102 return AVERROR(ENOMEM
);
2105 read_size
+= pkt
->size
;
2107 st
= ic
->streams
[pkt
->stream_index
];
2108 if(codec_info_nb_frames
[st
->index
]>1)
2109 codec_info_duration
[st
->index
] += pkt
->duration
;
2110 if (pkt
->duration
!= 0)
2111 codec_info_nb_frames
[st
->index
]++;
2114 int index
= pkt
->stream_index
;
2115 int64_t last
= last_dts
[index
];
2116 int64_t duration
= pkt
->dts
- last
;
2118 if(pkt
->dts
!= AV_NOPTS_VALUE
&& last
!= AV_NOPTS_VALUE
&& duration
>0){
2119 double dur
= duration
* av_q2d(st
->time_base
);
2121 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2122 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2123 if(duration_count
[index
] < 2)
2124 memset(duration_error
[index
], 0, sizeof(*duration_error
));
2125 for(i
=1; i
<MAX_STD_TIMEBASES
; i
++){
2126 int framerate
= get_std_framerate(i
);
2127 int ticks
= lrintf(dur
*framerate
/(1001*12));
2128 double error
= dur
- ticks
*1001*12/(double)framerate
;
2129 duration_error
[index
][i
] += error
*error
;
2131 duration_count
[index
]++;
2132 // ignore the first 4 values, they might have some random jitter
2133 if (duration_count
[index
] > 3)
2134 duration_gcd
[index
] = av_gcd(duration_gcd
[index
], duration
);
2136 if(last
== AV_NOPTS_VALUE
|| duration_count
[index
]<=1)
2137 last_dts
[pkt
->stream_index
]= pkt
->dts
;
2139 if(st
->parser
&& st
->parser
->parser
->split
&& !st
->codec
->extradata
){
2140 int i
= st
->parser
->parser
->split(st
->codec
, pkt
->data
, pkt
->size
);
2142 st
->codec
->extradata_size
= i
;
2143 st
->codec
->extradata
= av_malloc(st
->codec
->extradata_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
2144 memcpy(st
->codec
->extradata
, pkt
->data
, st
->codec
->extradata_size
);
2145 memset(st
->codec
->extradata
+ i
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
2149 /* if still no information, we try to open the codec and to
2150 decompress the frame. We try to avoid that in most cases as
2151 it takes longer and uses more memory. For MPEG-4, we need to
2152 decompress for QuickTime. */
2153 if (!has_codec_parameters(st
->codec
) /*&&
2154 (st->codec->codec_id == CODEC_ID_FLV1 ||
2155 st->codec->codec_id == CODEC_ID_H264 ||
2156 st->codec->codec_id == CODEC_ID_H263 ||
2157 st->codec->codec_id == CODEC_ID_H261 ||
2158 st->codec->codec_id == CODEC_ID_VORBIS ||
2159 st->codec->codec_id == CODEC_ID_MJPEG ||
2160 st->codec->codec_id == CODEC_ID_PNG ||
2161 st->codec->codec_id == CODEC_ID_PAM ||
2162 st->codec->codec_id == CODEC_ID_PGM ||
2163 st->codec->codec_id == CODEC_ID_PGMYUV ||
2164 st->codec->codec_id == CODEC_ID_PBM ||
2165 st->codec->codec_id == CODEC_ID_PPM ||
2166 st->codec->codec_id == CODEC_ID_SHORTEN ||
2167 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2168 try_decode_frame(st
, pkt
->data
, pkt
->size
);
2170 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
) {
2176 // close codecs which were opened in try_decode_frame()
2177 for(i
=0;i
<ic
->nb_streams
;i
++) {
2178 st
= ic
->streams
[i
];
2179 if(st
->codec
->codec
)
2180 avcodec_close(st
->codec
);
2182 for(i
=0;i
<ic
->nb_streams
;i
++) {
2183 st
= ic
->streams
[i
];
2184 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
2185 if(st
->codec
->codec_id
== CODEC_ID_RAWVIDEO
&& !st
->codec
->codec_tag
&& !st
->codec
->bits_per_coded_sample
)
2186 st
->codec
->codec_tag
= avcodec_pix_fmt_to_codec_tag(st
->codec
->pix_fmt
);
2188 // the check for tb_unreliable() is not completely correct, since this is not about handling
2189 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2190 // ipmovie.c produces.
2191 if (tb_unreliable(st
->codec
) && duration_count
[i
] > 15 && duration_gcd
[i
] > 1)
2192 av_reduce(&st
->r_frame_rate
.num
, &st
->r_frame_rate
.den
, st
->time_base
.den
, st
->time_base
.num
* duration_gcd
[i
], INT_MAX
);
2193 if(duration_count
[i
]
2194 && tb_unreliable(st
->codec
) /*&&
2195 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2196 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2197 double best_error
= 2*av_q2d(st
->time_base
);
2198 best_error
= best_error
*best_error
*duration_count
[i
]*1000*12*30;
2200 for(j
=1; j
<MAX_STD_TIMEBASES
; j
++){
2201 double error
= duration_error
[i
][j
] * get_std_framerate(j
);
2202 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2203 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2204 if(error
< best_error
){
2206 av_reduce(&st
->r_frame_rate
.num
, &st
->r_frame_rate
.den
, get_std_framerate(j
), 12*1001, INT_MAX
);
2211 if (!st
->r_frame_rate
.num
){
2212 if( st
->codec
->time_base
.den
* (int64_t)st
->time_base
.num
2213 <= st
->codec
->time_base
.num
* st
->codec
->ticks_per_frame
* (int64_t)st
->time_base
.den
){
2214 st
->r_frame_rate
.num
= st
->codec
->time_base
.den
;
2215 st
->r_frame_rate
.den
= st
->codec
->time_base
.num
* st
->codec
->ticks_per_frame
;
2217 st
->r_frame_rate
.num
= st
->time_base
.den
;
2218 st
->r_frame_rate
.den
= st
->time_base
.num
;
2221 }else if(st
->codec
->codec_type
== CODEC_TYPE_AUDIO
) {
2222 if(!st
->codec
->bits_per_coded_sample
)
2223 st
->codec
->bits_per_coded_sample
= av_get_bits_per_sample(st
->codec
->codec_id
);
2227 av_estimate_timings(ic
, old_offset
);
2229 compute_chapters_end(ic
);
2232 /* correct DTS for B-frame streams with no timestamps */
2233 for(i
=0;i
<ic
->nb_streams
;i
++) {
2234 st
= ic
->streams
[i
];
2235 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
2237 ppktl
= &ic
->packet_buffer
;
2239 if(ppkt1
->stream_index
!= i
)
2241 if(ppkt1
->pkt
->dts
< 0)
2243 if(ppkt1
->pkt
->pts
!= AV_NOPTS_VALUE
)
2245 ppkt1
->pkt
->dts
-= delta
;
2250 st
->cur_dts
-= delta
;
2256 av_free(duration_error
);
2261 /*******************************************************/
2263 int av_read_play(AVFormatContext
*s
)
2265 if (s
->iformat
->read_play
)
2266 return s
->iformat
->read_play(s
);
2268 return av_url_read_fpause(s
->pb
, 0);
2269 return AVERROR(ENOSYS
);
2272 int av_read_pause(AVFormatContext
*s
)
2274 if (s
->iformat
->read_pause
)
2275 return s
->iformat
->read_pause(s
);
2277 return av_url_read_fpause(s
->pb
, 1);
2278 return AVERROR(ENOSYS
);
2281 void av_close_input_stream(AVFormatContext
*s
)
2286 if (s
->iformat
->read_close
)
2287 s
->iformat
->read_close(s
);
2288 for(i
=0;i
<s
->nb_streams
;i
++) {
2289 /* free all data in a stream component */
2292 av_parser_close(st
->parser
);
2293 av_free_packet(&st
->cur_pkt
);
2295 av_metadata_free(&st
->metadata
);
2296 av_free(st
->index_entries
);
2297 av_free(st
->codec
->extradata
);
2299 av_free(st
->filename
);
2300 av_free(st
->priv_data
);
2303 for(i
=s
->nb_programs
-1; i
>=0; i
--) {
2304 av_freep(&s
->programs
[i
]->provider_name
);
2305 av_freep(&s
->programs
[i
]->name
);
2306 av_metadata_free(&s
->programs
[i
]->metadata
);
2307 av_freep(&s
->programs
[i
]->stream_index
);
2308 av_freep(&s
->programs
[i
]);
2310 av_freep(&s
->programs
);
2311 flush_packet_queue(s
);
2312 av_freep(&s
->priv_data
);
2313 while(s
->nb_chapters
--) {
2314 av_free(s
->chapters
[s
->nb_chapters
]->title
);
2315 av_metadata_free(&s
->chapters
[s
->nb_chapters
]->metadata
);
2316 av_free(s
->chapters
[s
->nb_chapters
]);
2318 av_freep(&s
->chapters
);
2319 av_metadata_free(&s
->metadata
);
2323 void av_close_input_file(AVFormatContext
*s
)
2325 ByteIOContext
*pb
= s
->iformat
->flags
& AVFMT_NOFILE ? NULL
: s
->pb
;
2326 av_close_input_stream(s
);
2331 AVStream
*av_new_stream(AVFormatContext
*s
, int id
)
2336 if (s
->nb_streams
>= MAX_STREAMS
)
2339 st
= av_mallocz(sizeof(AVStream
));
2343 st
->codec
= avcodec_alloc_context();
2345 /* no default bitrate if decoding */
2346 st
->codec
->bit_rate
= 0;
2348 st
->index
= s
->nb_streams
;
2350 st
->start_time
= AV_NOPTS_VALUE
;
2351 st
->duration
= AV_NOPTS_VALUE
;
2352 /* we set the current DTS to 0 so that formats without any timestamps
2353 but durations get some timestamps, formats with some unknown
2354 timestamps have their first few packets buffered and the
2355 timestamps corrected before they are returned to the user */
2357 st
->first_dts
= AV_NOPTS_VALUE
;
2359 /* default pts setting is MPEG-like */
2360 av_set_pts_info(st
, 33, 1, 90000);
2361 st
->last_IP_pts
= AV_NOPTS_VALUE
;
2362 for(i
=0; i
<MAX_REORDER_DELAY
+1; i
++)
2363 st
->pts_buffer
[i
]= AV_NOPTS_VALUE
;
2364 st
->reference_dts
= AV_NOPTS_VALUE
;
2366 st
->sample_aspect_ratio
= (AVRational
){0,1};
2368 s
->streams
[s
->nb_streams
++] = st
;
2372 AVProgram
*av_new_program(AVFormatContext
*ac
, int id
)
2374 AVProgram
*program
=NULL
;
2378 av_log(ac
, AV_LOG_DEBUG
, "new_program: id=0x%04x\n", id
);
2381 for(i
=0; i
<ac
->nb_programs
; i
++)
2382 if(ac
->programs
[i
]->id
== id
)
2383 program
= ac
->programs
[i
];
2386 program
= av_mallocz(sizeof(AVProgram
));
2389 dynarray_add(&ac
->programs
, &ac
->nb_programs
, program
);
2390 program
->discard
= AVDISCARD_NONE
;
2397 AVChapter
*ff_new_chapter(AVFormatContext
*s
, int id
, AVRational time_base
, int64_t start
, int64_t end
, const char *title
)
2399 AVChapter
*chapter
= NULL
;
2402 for(i
=0; i
<s
->nb_chapters
; i
++)
2403 if(s
->chapters
[i
]->id
== id
)
2404 chapter
= s
->chapters
[i
];
2407 chapter
= av_mallocz(sizeof(AVChapter
));
2410 dynarray_add(&s
->chapters
, &s
->nb_chapters
, chapter
);
2412 av_free(chapter
->title
);
2413 chapter
->title
= av_strdup(title
);
2415 chapter
->time_base
= time_base
;
2416 chapter
->start
= start
;
2422 /************************************************************/
2423 /* output media file */
2425 int av_set_parameters(AVFormatContext
*s
, AVFormatParameters
*ap
)
2429 if (s
->oformat
->priv_data_size
> 0) {
2430 s
->priv_data
= av_mallocz(s
->oformat
->priv_data_size
);
2432 return AVERROR(ENOMEM
);
2434 s
->priv_data
= NULL
;
2436 if (s
->oformat
->set_parameters
) {
2437 ret
= s
->oformat
->set_parameters(s
, ap
);
2444 int av_write_header(AVFormatContext
*s
)
2449 // some sanity checks
2450 for(i
=0;i
<s
->nb_streams
;i
++) {
2453 switch (st
->codec
->codec_type
) {
2454 case CODEC_TYPE_AUDIO
:
2455 if(st
->codec
->sample_rate
<=0){
2456 av_log(s
, AV_LOG_ERROR
, "sample rate not set\n");
2459 if(!st
->codec
->block_align
)
2460 st
->codec
->block_align
= st
->codec
->channels
*
2461 av_get_bits_per_sample(st
->codec
->codec_id
) >> 3;
2463 case CODEC_TYPE_VIDEO
:
2464 if(st
->codec
->time_base
.num
<=0 || st
->codec
->time_base
.den
<=0){ //FIXME audio too?
2465 av_log(s
, AV_LOG_ERROR
, "time base not set\n");
2468 if(st
->codec
->width
<=0 || st
->codec
->height
<=0){
2469 av_log(s
, AV_LOG_ERROR
, "dimensions not set\n");
2472 if(av_cmp_q(st
->sample_aspect_ratio
, st
->codec
->sample_aspect_ratio
)){
2473 av_log(s
, AV_LOG_ERROR
, "Aspect ratio mismatch between encoder and muxer layer\n");
2479 if(s
->oformat
->codec_tag
){
2480 if(st
->codec
->codec_tag
){
2482 //check that tag + id is in the table
2483 //if neither is in the table -> OK
2484 //if tag is in the table with another id -> FAIL
2485 //if id is in the table with another tag -> FAIL unless strict < ?
2487 st
->codec
->codec_tag
= av_codec_get_tag(s
->oformat
->codec_tag
, st
->codec
->codec_id
);
2490 if(s
->oformat
->flags
& AVFMT_GLOBALHEADER
&&
2491 !(st
->codec
->flags
& CODEC_FLAG_GLOBAL_HEADER
))
2492 av_log(s
, AV_LOG_WARNING
, "Codec for stream %d does not use global headers but container format requires global headers\n", i
);
2495 if (!s
->priv_data
&& s
->oformat
->priv_data_size
> 0) {
2496 s
->priv_data
= av_mallocz(s
->oformat
->priv_data_size
);
2498 return AVERROR(ENOMEM
);
2501 #if LIBAVFORMAT_VERSION_MAJOR < 53
2502 ff_metadata_mux_compat(s
);
2505 if(s
->oformat
->write_header
){
2506 ret
= s
->oformat
->write_header(s
);
2511 /* init PTS generation */
2512 for(i
=0;i
<s
->nb_streams
;i
++) {
2513 int64_t den
= AV_NOPTS_VALUE
;
2516 switch (st
->codec
->codec_type
) {
2517 case CODEC_TYPE_AUDIO
:
2518 den
= (int64_t)st
->time_base
.num
* st
->codec
->sample_rate
;
2520 case CODEC_TYPE_VIDEO
:
2521 den
= (int64_t)st
->time_base
.num
* st
->codec
->time_base
.den
;
2526 if (den
!= AV_NOPTS_VALUE
) {
2528 return AVERROR_INVALIDDATA
;
2529 av_frac_init(&st
->pts
, 0, 0, den
);
2535 //FIXME merge with compute_pkt_fields
2536 static int compute_pkt_fields2(AVStream
*st
, AVPacket
*pkt
){
2537 int delay
= FFMAX(st
->codec
->has_b_frames
, !!st
->codec
->max_b_frames
);
2538 int num
, den
, frame_size
, i
;
2540 // 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);
2542 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2545 /* duration field */
2546 if (pkt
->duration
== 0) {
2547 compute_frame_duration(&num
, &den
, st
, NULL
, pkt
);
2549 pkt
->duration
= av_rescale(1, num
* (int64_t)st
->time_base
.den
* st
->codec
->ticks_per_frame
, den
* (int64_t)st
->time_base
.num
);
2553 if(pkt
->pts
== AV_NOPTS_VALUE
&& pkt
->dts
!= AV_NOPTS_VALUE
&& delay
==0)
2556 //XXX/FIXME this is a temporary hack until all encoders output pts
2557 if((pkt
->pts
== 0 || pkt
->pts
== AV_NOPTS_VALUE
) && pkt
->dts
== AV_NOPTS_VALUE
&& !delay
){
2559 // pkt->pts= st->cur_dts;
2560 pkt
->pts
= st
->pts
.val
;
2563 //calculate dts from pts
2564 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
== AV_NOPTS_VALUE
&& delay
<= MAX_REORDER_DELAY
){
2565 st
->pts_buffer
[0]= pkt
->pts
;
2566 for(i
=1; i
<delay
+1 && st
->pts_buffer
[i
] == AV_NOPTS_VALUE
; i
++)
2567 st
->pts_buffer
[i
]= (i
-delay
-1) * pkt
->duration
;
2568 for(i
=0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+1]; i
++)
2569 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+1]);
2571 pkt
->dts
= st
->pts_buffer
[0];
2574 if(st
->cur_dts
&& st
->cur_dts
!= AV_NOPTS_VALUE
&& st
->cur_dts
>= pkt
->dts
){
2575 av_log(st
->codec
, AV_LOG_ERROR
, "error, non monotone timestamps %"PRId64
" >= %"PRId64
"\n", st
->cur_dts
, pkt
->dts
);
2578 if(pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->pts
< pkt
->dts
){
2579 av_log(st
->codec
, AV_LOG_ERROR
, "error, pts < dts\n");
2583 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2584 st
->cur_dts
= pkt
->dts
;
2585 st
->pts
.val
= pkt
->dts
;
2588 switch (st
->codec
->codec_type
) {
2589 case CODEC_TYPE_AUDIO
:
2590 frame_size
= get_audio_frame_size(st
->codec
, pkt
->size
);
2592 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2593 likely equal to the encoder delay, but it would be better if we
2594 had the real timestamps from the encoder */
2595 if (frame_size
>= 0 && (pkt
->size
|| st
->pts
.num
!=st
->pts
.den
>>1 || st
->pts
.val
)) {
2596 av_frac_add(&st
->pts
, (int64_t)st
->time_base
.den
* frame_size
);
2599 case CODEC_TYPE_VIDEO
:
2600 av_frac_add(&st
->pts
, (int64_t)st
->time_base
.den
* st
->codec
->time_base
.num
);
2608 int av_write_frame(AVFormatContext
*s
, AVPacket
*pkt
)
2610 int ret
= compute_pkt_fields2(s
->streams
[pkt
->stream_index
], pkt
);
2612 if(ret
<0 && !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2615 ret
= s
->oformat
->write_packet(s
, pkt
);
2617 ret
= url_ferror(s
->pb
);
2621 void ff_interleave_add_packet(AVFormatContext
*s
, AVPacket
*pkt
,
2622 int (*compare
)(AVFormatContext
*, AVPacket
*, AVPacket
*))
2624 AVPacketList
**next_point
, *this_pktl
;
2626 this_pktl
= av_mallocz(sizeof(AVPacketList
));
2627 this_pktl
->pkt
= *pkt
;
2628 if(pkt
->destruct
== av_destruct_packet
)
2629 pkt
->destruct
= NULL
; // not shared -> must keep original from being freed
2631 av_dup_packet(&this_pktl
->pkt
); //shared -> must dup
2633 next_point
= &s
->packet_buffer
;
2635 if(compare(s
, &(*next_point
)->pkt
, pkt
))
2637 next_point
= &(*next_point
)->next
;
2639 this_pktl
->next
= *next_point
;
2640 *next_point
= this_pktl
;
2643 int ff_interleave_compare_dts(AVFormatContext
*s
, AVPacket
*next
, AVPacket
*pkt
)
2645 AVStream
*st
= s
->streams
[ pkt
->stream_index
];
2646 AVStream
*st2
= s
->streams
[ next
->stream_index
];
2647 int64_t left
= st2
->time_base
.num
* (int64_t)st
->time_base
.den
;
2648 int64_t right
= st
->time_base
.num
* (int64_t)st2
->time_base
.den
;
2650 if (pkt
->dts
== AV_NOPTS_VALUE
)
2653 return next
->dts
* left
> pkt
->dts
* right
; //FIXME this can overflow
2656 int av_interleave_packet_per_dts(AVFormatContext
*s
, AVPacket
*out
, AVPacket
*pkt
, int flush
){
2659 int streams
[MAX_STREAMS
];
2662 ff_interleave_add_packet(s
, pkt
, ff_interleave_compare_dts
);
2665 memset(streams
, 0, sizeof(streams
));
2666 pktl
= s
->packet_buffer
;
2668 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2669 if(streams
[ pktl
->pkt
.stream_index
] == 0)
2671 streams
[ pktl
->pkt
.stream_index
]++;
2675 if(stream_count
&& (s
->nb_streams
== stream_count
|| flush
)){
2676 pktl
= s
->packet_buffer
;
2679 s
->packet_buffer
= pktl
->next
;
2683 av_init_packet(out
);
2689 * Interleaves an AVPacket correctly so it can be muxed.
2690 * @param out the interleaved packet will be output here
2691 * @param in the input packet
2692 * @param flush 1 if no further packets are available as input and all
2693 * remaining packets should be output
2694 * @return 1 if a packet was output, 0 if no packet could be output,
2695 * < 0 if an error occurred
2697 static int av_interleave_packet(AVFormatContext
*s
, AVPacket
*out
, AVPacket
*in
, int flush
){
2698 if(s
->oformat
->interleave_packet
)
2699 return s
->oformat
->interleave_packet(s
, out
, in
, flush
);
2701 return av_interleave_packet_per_dts(s
, out
, in
, flush
);
2704 int av_interleaved_write_frame(AVFormatContext
*s
, AVPacket
*pkt
){
2705 AVStream
*st
= s
->streams
[ pkt
->stream_index
];
2707 //FIXME/XXX/HACK drop zero sized packets
2708 if(st
->codec
->codec_type
== CODEC_TYPE_AUDIO
&& pkt
->size
==0)
2711 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2712 if(compute_pkt_fields2(st
, pkt
) < 0 && !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2715 if(pkt
->dts
== AV_NOPTS_VALUE
&& !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2720 int ret
= av_interleave_packet(s
, &opkt
, pkt
, 0);
2721 if(ret
<=0) //FIXME cleanup needed for ret<0 ?
2724 ret
= s
->oformat
->write_packet(s
, &opkt
);
2726 av_free_packet(&opkt
);
2731 if(url_ferror(s
->pb
))
2732 return url_ferror(s
->pb
);
2736 int av_write_trailer(AVFormatContext
*s
)
2742 ret
= av_interleave_packet(s
, &pkt
, NULL
, 1);
2743 if(ret
<0) //FIXME cleanup needed for ret<0 ?
2748 ret
= s
->oformat
->write_packet(s
, &pkt
);
2750 av_free_packet(&pkt
);
2754 if(url_ferror(s
->pb
))
2758 if(s
->oformat
->write_trailer
)
2759 ret
= s
->oformat
->write_trailer(s
);
2762 ret
=url_ferror(s
->pb
);
2763 for(i
=0;i
<s
->nb_streams
;i
++)
2764 av_freep(&s
->streams
[i
]->priv_data
);
2765 av_freep(&s
->priv_data
);
2769 void av_program_add_stream_index(AVFormatContext
*ac
, int progid
, unsigned int idx
)
2772 AVProgram
*program
=NULL
;
2775 for(i
=0; i
<ac
->nb_programs
; i
++){
2776 if(ac
->programs
[i
]->id
!= progid
)
2778 program
= ac
->programs
[i
];
2779 for(j
=0; j
<program
->nb_stream_indexes
; j
++)
2780 if(program
->stream_index
[j
] == idx
)
2783 tmp
= av_realloc(program
->stream_index
, sizeof(unsigned int)*(program
->nb_stream_indexes
+1));
2786 program
->stream_index
= tmp
;
2787 program
->stream_index
[program
->nb_stream_indexes
++] = idx
;
2792 static void print_fps(double d
, const char *postfix
){
2793 uint64_t v
= lrintf(d
*100);
2794 if (v
% 100 ) av_log(NULL
, AV_LOG_INFO
, ", %3.2f %s", d
, postfix
);
2795 else if(v
%(100*1000)) av_log(NULL
, AV_LOG_INFO
, ", %1.0f %s", d
, postfix
);
2796 else av_log(NULL
, AV_LOG_INFO
, ", %1.0fk %s", d
/1000, postfix
);
2799 /* "user interface" functions */
2800 static void dump_stream_format(AVFormatContext
*ic
, int i
, int index
, int is_output
)
2803 int flags
= (is_output ? ic
->oformat
->flags
: ic
->iformat
->flags
);
2804 AVStream
*st
= ic
->streams
[i
];
2805 int g
= av_gcd(st
->time_base
.num
, st
->time_base
.den
);
2806 avcodec_string(buf
, sizeof(buf
), st
->codec
, is_output
);
2807 av_log(NULL
, AV_LOG_INFO
, " Stream #%d.%d", index
, i
);
2808 /* the pid is an important information, so we display it */
2809 /* XXX: add a generic system */
2810 if (flags
& AVFMT_SHOW_IDS
)
2811 av_log(NULL
, AV_LOG_INFO
, "[0x%x]", st
->id
);
2812 if (strlen(st
->language
) > 0)
2813 av_log(NULL
, AV_LOG_INFO
, "(%s)", st
->language
);
2814 av_log(NULL
, AV_LOG_DEBUG
, ", %d/%d", st
->time_base
.num
/g
, st
->time_base
.den
/g
);
2815 av_log(NULL
, AV_LOG_INFO
, ": %s", buf
);
2816 if (st
->sample_aspect_ratio
.num
&& // default
2817 av_cmp_q(st
->sample_aspect_ratio
, st
->codec
->sample_aspect_ratio
)) {
2818 AVRational display_aspect_ratio
;
2819 av_reduce(&display_aspect_ratio
.num
, &display_aspect_ratio
.den
,
2820 st
->codec
->width
*st
->sample_aspect_ratio
.num
,
2821 st
->codec
->height
*st
->sample_aspect_ratio
.den
,
2823 av_log(NULL
, AV_LOG_INFO
, ", PAR %d:%d DAR %d:%d",
2824 st
->sample_aspect_ratio
.num
, st
->sample_aspect_ratio
.den
,
2825 display_aspect_ratio
.num
, display_aspect_ratio
.den
);
2827 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
){
2828 if(st
->r_frame_rate
.den
&& st
->r_frame_rate
.num
)
2829 print_fps(av_q2d(st
->r_frame_rate
), "tbr");
2830 if(st
->time_base
.den
&& st
->time_base
.num
)
2831 print_fps(1/av_q2d(st
->time_base
), "tbn");
2832 if(st
->codec
->time_base
.den
&& st
->codec
->time_base
.num
)
2833 print_fps(1/av_q2d(st
->codec
->time_base
), "tbc");
2835 av_log(NULL
, AV_LOG_INFO
, "\n");
2838 void dump_format(AVFormatContext
*ic
,
2845 av_log(NULL
, AV_LOG_INFO
, "%s #%d, %s, %s '%s':\n",
2846 is_output ?
"Output" : "Input",
2848 is_output ? ic
->oformat
->name
: ic
->iformat
->name
,
2849 is_output ?
"to" : "from", url
);
2851 av_log(NULL
, AV_LOG_INFO
, " Duration: ");
2852 if (ic
->duration
!= AV_NOPTS_VALUE
) {
2853 int hours
, mins
, secs
, us
;
2854 secs
= ic
->duration
/ AV_TIME_BASE
;
2855 us
= ic
->duration
% AV_TIME_BASE
;
2860 av_log(NULL
, AV_LOG_INFO
, "%02d:%02d:%02d.%02d", hours
, mins
, secs
,
2861 (100 * us
) / AV_TIME_BASE
);
2863 av_log(NULL
, AV_LOG_INFO
, "N/A");
2865 if (ic
->start_time
!= AV_NOPTS_VALUE
) {
2867 av_log(NULL
, AV_LOG_INFO
, ", start: ");
2868 secs
= ic
->start_time
/ AV_TIME_BASE
;
2869 us
= ic
->start_time
% AV_TIME_BASE
;
2870 av_log(NULL
, AV_LOG_INFO
, "%d.%06d",
2871 secs
, (int)av_rescale(us
, 1000000, AV_TIME_BASE
));
2873 av_log(NULL
, AV_LOG_INFO
, ", bitrate: ");
2875 av_log(NULL
, AV_LOG_INFO
,"%d kb/s", ic
->bit_rate
/ 1000);
2877 av_log(NULL
, AV_LOG_INFO
, "N/A");
2879 av_log(NULL
, AV_LOG_INFO
, "\n");
2881 if(ic
->nb_programs
) {
2883 for(j
=0; j
<ic
->nb_programs
; j
++) {
2884 av_log(NULL
, AV_LOG_INFO
, " Program %d %s\n", ic
->programs
[j
]->id
,
2885 ic
->programs
[j
]->name ? ic
->programs
[j
]->name
: "");
2886 for(k
=0; k
<ic
->programs
[j
]->nb_stream_indexes
; k
++)
2887 dump_stream_format(ic
, ic
->programs
[j
]->stream_index
[k
], index
, is_output
);
2890 for(i
=0;i
<ic
->nb_streams
;i
++)
2891 dump_stream_format(ic
, i
, index
, is_output
);
2894 #if LIBAVFORMAT_VERSION_MAJOR < 53
2895 int parse_image_size(int *width_ptr
, int *height_ptr
, const char *str
)
2897 return av_parse_video_frame_size(width_ptr
, height_ptr
, str
);
2900 int parse_frame_rate(int *frame_rate_num
, int *frame_rate_den
, const char *arg
)
2902 AVRational frame_rate
;
2903 int ret
= av_parse_video_frame_rate(&frame_rate
, arg
);
2904 *frame_rate_num
= frame_rate
.num
;
2905 *frame_rate_den
= frame_rate
.den
;
2910 int64_t av_gettime(void)
2913 gettimeofday(&tv
,NULL
);
2914 return (int64_t)tv
.tv_sec
* 1000000 + tv
.tv_usec
;
2917 int64_t parse_date(const char *datestr
, int duration
)
2923 static const char * const date_fmt
[] = {
2927 static const char * const time_fmt
[] = {
2937 time_t now
= time(0);
2939 len
= strlen(datestr
);
2941 lastch
= datestr
[len
- 1];
2944 is_utc
= (lastch
== 'z' || lastch
== 'Z');
2946 memset(&dt
, 0, sizeof(dt
));
2951 if (!strncasecmp(datestr
, "now", len
))
2952 return (int64_t) now
* 1000000;
2954 /* parse the year-month-day part */
2955 for (i
= 0; i
< FF_ARRAY_ELEMS(date_fmt
); i
++) {
2956 q
= small_strptime(p
, date_fmt
[i
], &dt
);
2962 /* if the year-month-day part is missing, then take the
2963 * current year-month-day time */
2968 dt
= *localtime(&now
);
2970 dt
.tm_hour
= dt
.tm_min
= dt
.tm_sec
= 0;
2975 if (*p
== 'T' || *p
== 't' || *p
== ' ')
2978 /* parse the hour-minute-second part */
2979 for (i
= 0; i
< FF_ARRAY_ELEMS(time_fmt
); i
++) {
2980 q
= small_strptime(p
, time_fmt
[i
], &dt
);
2986 /* parse datestr as a duration */
2991 /* parse datestr as HH:MM:SS */
2992 q
= small_strptime(p
, time_fmt
[0], &dt
);
2994 /* parse datestr as S+ */
2995 dt
.tm_sec
= strtol(p
, (char **)&q
, 10);
2997 /* the parsing didn't succeed */
3004 /* Now we have all the fields that we can get */
3010 t
= dt
.tm_hour
* 3600 + dt
.tm_min
* 60 + dt
.tm_sec
;
3012 dt
.tm_isdst
= -1; /* unknown */
3022 /* parse the .m... part */
3026 for (val
= 0, n
= 100000; n
>= 1; n
/= 10, q
++) {
3029 val
+= n
* (*q
- '0');
3033 return negative ?
-t
: t
;
3036 int find_info_tag(char *arg
, int arg_size
, const char *tag1
, const char *info
)
3046 while (*p
!= '\0' && *p
!= '=' && *p
!= '&') {
3047 if ((q
- tag
) < sizeof(tag
) - 1)
3055 while (*p
!= '&' && *p
!= '\0') {
3056 if ((q
- arg
) < arg_size
- 1) {
3066 if (!strcmp(tag
, tag1
))
3075 int av_get_frame_filename(char *buf
, int buf_size
,
3076 const char *path
, int number
)
3079 char *q
, buf1
[20], c
;
3080 int nd
, len
, percentd_found
;
3092 while (isdigit(*p
)) {
3093 nd
= nd
* 10 + *p
++ - '0';
3096 } while (isdigit(c
));
3105 snprintf(buf1
, sizeof(buf1
), "%0*d", nd
, number
);
3107 if ((q
- buf
+ len
) > buf_size
- 1)
3109 memcpy(q
, buf1
, len
);
3117 if ((q
- buf
) < buf_size
- 1)
3121 if (!percentd_found
)
3130 static void hex_dump_internal(void *avcl
, FILE *f
, int level
, uint8_t *buf
, int size
)
3133 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3135 for(i
=0;i
<size
;i
+=16) {
3142 PRINT(" %02x", buf
[i
+j
]);