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"
27 #include "audiointerleave.h"
40 * @file libavformat/utils.c
41 * various utility functions for use within FFmpeg
44 unsigned avformat_version(void)
46 return LIBAVFORMAT_VERSION_INT
;
49 const char *avformat_configuration(void)
51 return FFMPEG_CONFIGURATION
;
54 const char *avformat_license(void)
56 #define LICENSE_PREFIX "libavformat license: "
57 return LICENSE_PREFIX FFMPEG_LICENSE
+ sizeof(LICENSE_PREFIX
) - 1;
60 /* fraction handling */
63 * f = val + (num / den) + 0.5.
65 * 'num' is normalized so that it is such as 0 <= num < den.
67 * @param f fractional number
68 * @param val integer value
69 * @param num must be >= 0
70 * @param den must be >= 1
72 static void av_frac_init(AVFrac
*f
, int64_t val
, int64_t num
, int64_t den
)
85 * Fractional addition to f: f = f + (incr / f->den).
87 * @param f fractional number
88 * @param incr increment, can be positive or negative
90 static void av_frac_add(AVFrac
*f
, int64_t incr
)
103 } else if (num
>= den
) {
110 /** head of registered input format linked list */
111 AVInputFormat
*first_iformat
= NULL
;
112 /** head of registered output format linked list */
113 AVOutputFormat
*first_oformat
= NULL
;
115 AVInputFormat
*av_iformat_next(AVInputFormat
*f
)
117 if(f
) return f
->next
;
118 else return first_iformat
;
121 AVOutputFormat
*av_oformat_next(AVOutputFormat
*f
)
123 if(f
) return f
->next
;
124 else return first_oformat
;
127 void av_register_input_format(AVInputFormat
*format
)
131 while (*p
!= NULL
) p
= &(*p
)->next
;
136 void av_register_output_format(AVOutputFormat
*format
)
140 while (*p
!= NULL
) p
= &(*p
)->next
;
145 #if LIBAVFORMAT_VERSION_MAJOR < 53
146 int match_ext(const char *filename
, const char *extensions
)
148 return av_match_ext(filename
, extensions
);
152 int av_match_ext(const char *filename
, const char *extensions
)
160 ext
= strrchr(filename
, '.');
166 while (*p
!= '\0' && *p
!= ',' && q
-ext1
<sizeof(ext1
)-1)
169 if (!strcasecmp(ext1
, ext
))
179 static int match_format(const char *name
, const char *names
)
187 namelen
= strlen(name
);
188 while ((p
= strchr(names
, ','))) {
189 len
= FFMAX(p
- names
, namelen
);
190 if (!strncasecmp(name
, names
, len
))
194 return !strcasecmp(name
, names
);
197 #if LIBAVFORMAT_VERSION_MAJOR < 53
198 AVOutputFormat
*guess_format(const char *short_name
, const char *filename
,
199 const char *mime_type
)
201 return av_guess_format(short_name
, filename
, mime_type
);
205 AVOutputFormat
*av_guess_format(const char *short_name
, const char *filename
,
206 const char *mime_type
)
208 AVOutputFormat
*fmt
, *fmt_found
;
209 int score_max
, score
;
211 /* specific test for image sequences */
212 #if CONFIG_IMAGE2_MUXER
213 if (!short_name
&& filename
&&
214 av_filename_number_test(filename
) &&
215 av_guess_image2_codec(filename
) != CODEC_ID_NONE
) {
216 return av_guess_format("image2", NULL
, NULL
);
219 /* Find the proper file type. */
223 while (fmt
!= NULL
) {
225 if (fmt
->name
&& short_name
&& !strcmp(fmt
->name
, short_name
))
227 if (fmt
->mime_type
&& mime_type
&& !strcmp(fmt
->mime_type
, mime_type
))
229 if (filename
&& fmt
->extensions
&&
230 av_match_ext(filename
, fmt
->extensions
)) {
233 if (score
> score_max
) {
242 #if LIBAVFORMAT_VERSION_MAJOR < 53
243 AVOutputFormat
*guess_stream_format(const char *short_name
, const char *filename
,
244 const char *mime_type
)
246 AVOutputFormat
*fmt
= av_guess_format(short_name
, filename
, mime_type
);
249 AVOutputFormat
*stream_fmt
;
250 char stream_format_name
[64];
252 snprintf(stream_format_name
, sizeof(stream_format_name
), "%s_stream", fmt
->name
);
253 stream_fmt
= av_guess_format(stream_format_name
, NULL
, NULL
);
263 enum CodecID
av_guess_codec(AVOutputFormat
*fmt
, const char *short_name
,
264 const char *filename
, const char *mime_type
, enum CodecType type
){
265 if(type
== CODEC_TYPE_VIDEO
){
266 enum CodecID codec_id
= CODEC_ID_NONE
;
268 #if CONFIG_IMAGE2_MUXER
269 if(!strcmp(fmt
->name
, "image2") || !strcmp(fmt
->name
, "image2pipe")){
270 codec_id
= av_guess_image2_codec(filename
);
273 if(codec_id
== CODEC_ID_NONE
)
274 codec_id
= fmt
->video_codec
;
276 }else if(type
== CODEC_TYPE_AUDIO
)
277 return fmt
->audio_codec
;
279 return CODEC_ID_NONE
;
282 AVInputFormat
*av_find_input_format(const char *short_name
)
285 for(fmt
= first_iformat
; fmt
!= NULL
; fmt
= fmt
->next
) {
286 if (match_format(short_name
, fmt
->name
))
292 /* memory handling */
295 int av_get_packet(ByteIOContext
*s
, AVPacket
*pkt
, int size
)
297 int ret
= av_new_packet(pkt
, size
);
302 pkt
->pos
= url_ftell(s
);
304 ret
= get_buffer(s
, pkt
->data
, size
);
308 av_shrink_packet(pkt
, ret
);
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 (av_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(AVFormatContext
*s
, AVStream
*st
, AVProbeData
*pd
, int score
)
354 fmt
= av_probe_input_format2(pd
, 1, &score
);
357 av_log(s
, AV_LOG_DEBUG
, "Probe with size=%d, packets=%d detected %s with score=%d\n",
358 pd
->buf_size
, MAX_PROBE_PACKETS
- st
->probe_packets
, fmt
->name
, score
);
359 if (!strcmp(fmt
->name
, "mp3")) {
360 st
->codec
->codec_id
= CODEC_ID_MP3
;
361 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
362 } else if (!strcmp(fmt
->name
, "ac3")) {
363 st
->codec
->codec_id
= CODEC_ID_AC3
;
364 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
365 } else if (!strcmp(fmt
->name
, "eac3")) {
366 st
->codec
->codec_id
= CODEC_ID_EAC3
;
367 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
368 } else if (!strcmp(fmt
->name
, "mpegvideo")) {
369 st
->codec
->codec_id
= CODEC_ID_MPEG2VIDEO
;
370 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
371 } else if (!strcmp(fmt
->name
, "m4v")) {
372 st
->codec
->codec_id
= CODEC_ID_MPEG4
;
373 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
374 } else if (!strcmp(fmt
->name
, "h264")) {
375 st
->codec
->codec_id
= CODEC_ID_H264
;
376 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
377 } else if (!strcmp(fmt
->name
, "dts")) {
378 st
->codec
->codec_id
= CODEC_ID_DTS
;
379 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
385 /************************************************************/
386 /* input media file */
389 * Open a media file from an IO stream. 'fmt' must be specified.
391 int av_open_input_stream(AVFormatContext
**ic_ptr
,
392 ByteIOContext
*pb
, const char *filename
,
393 AVInputFormat
*fmt
, AVFormatParameters
*ap
)
397 AVFormatParameters default_ap
;
401 memset(ap
, 0, sizeof(default_ap
));
404 if(!ap
->prealloced_context
)
405 ic
= avformat_alloc_context();
409 err
= AVERROR(ENOMEM
);
414 ic
->duration
= AV_NOPTS_VALUE
;
415 ic
->start_time
= AV_NOPTS_VALUE
;
416 av_strlcpy(ic
->filename
, filename
, sizeof(ic
->filename
));
418 /* allocate private data */
419 if (fmt
->priv_data_size
> 0) {
420 ic
->priv_data
= av_mallocz(fmt
->priv_data_size
);
421 if (!ic
->priv_data
) {
422 err
= AVERROR(ENOMEM
);
426 ic
->priv_data
= NULL
;
429 if (ic
->iformat
->read_header
) {
430 err
= ic
->iformat
->read_header(ic
, ap
);
435 if (pb
&& !ic
->data_offset
)
436 ic
->data_offset
= url_ftell(ic
->pb
);
438 #if LIBAVFORMAT_VERSION_MAJOR < 53
439 ff_metadata_demux_compat(ic
);
442 ic
->raw_packet_buffer_remaining_size
= RAW_PACKET_BUFFER_SIZE
;
449 av_freep(&ic
->priv_data
);
450 for(i
=0;i
<ic
->nb_streams
;i
++) {
451 AVStream
*st
= ic
->streams
[i
];
453 av_free(st
->priv_data
);
454 av_free(st
->codec
->extradata
);
464 /** size of probe buffer, for guessing file type from file contents */
465 #define PROBE_BUF_MIN 2048
466 #define PROBE_BUF_MAX (1<<20)
468 int av_open_input_file(AVFormatContext
**ic_ptr
, const char *filename
,
471 AVFormatParameters
*ap
)
474 AVProbeData probe_data
, *pd
= &probe_data
;
475 ByteIOContext
*pb
= NULL
;
476 void *logctx
= ap
&& ap
->prealloced_context ?
*ic_ptr
: NULL
;
480 pd
->filename
= filename
;
485 /* guess format if no file can be opened */
486 fmt
= av_probe_input_format(pd
, 0);
489 /* Do not open file if the format does not need it. XXX: specific
490 hack needed to handle RTSP/TCP */
491 if (!fmt
|| !(fmt
->flags
& AVFMT_NOFILE
)) {
492 /* if no file needed do not try to open one */
493 if ((err
=url_fopen(&pb
, filename
, URL_RDONLY
)) < 0) {
497 url_setbufsize(pb
, buf_size
);
500 for(probe_size
= PROBE_BUF_MIN
; probe_size
<=PROBE_BUF_MAX
&& !fmt
; probe_size
<<=1){
501 int score
= probe_size
< PROBE_BUF_MAX ? AVPROBE_SCORE_MAX
/4 : 0;
502 /* read probe data */
503 pd
->buf
= av_realloc(pd
->buf
, probe_size
+ AVPROBE_PADDING_SIZE
);
504 pd
->buf_size
= get_buffer(pb
, pd
->buf
, probe_size
);
506 if ((int)pd
->buf_size
< 0) {
511 memset(pd
->buf
+pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
512 if (url_fseek(pb
, 0, SEEK_SET
) < 0) {
514 if (url_fopen(&pb
, filename
, URL_RDONLY
) < 0) {
520 /* guess file format */
521 fmt
= av_probe_input_format2(pd
, 1, &score
);
523 if(score
<= AVPROBE_SCORE_MAX
/4){ //this can only be true in the last iteration
524 av_log(logctx
, AV_LOG_WARNING
, "Format detected only with low score of %d, misdetection possible!\n", score
);
526 av_log(logctx
, AV_LOG_DEBUG
, "Probed with size=%d and score=%d\n", probe_size
, score
);
532 /* if still no format found, error */
538 /* check filename in case an image number is expected */
539 if (fmt
->flags
& AVFMT_NEEDNUMBER
) {
540 if (!av_filename_number_test(filename
)) {
541 err
= AVERROR_NUMEXPECTED
;
545 err
= av_open_input_stream(ic_ptr
, pb
, filename
, fmt
, ap
);
553 if (ap
&& ap
->prealloced_context
)
560 /*******************************************************/
562 static AVPacket
*add_to_pktbuf(AVPacketList
**packet_buffer
, AVPacket
*pkt
,
563 AVPacketList
**plast_pktl
){
564 AVPacketList
*pktl
= av_mallocz(sizeof(AVPacketList
));
569 (*plast_pktl
)->next
= pktl
;
571 *packet_buffer
= pktl
;
573 /* add the packet in the buffered packet list */
579 int av_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
585 AVPacketList
*pktl
= s
->raw_packet_buffer
;
589 if(s
->streams
[pkt
->stream_index
]->codec
->codec_id
!= CODEC_ID_PROBE
||
590 !s
->streams
[pkt
->stream_index
]->probe_packets
||
591 s
->raw_packet_buffer_remaining_size
< pkt
->size
){
592 AVProbeData
*pd
= &s
->streams
[pkt
->stream_index
]->probe_data
;
595 s
->raw_packet_buffer
= pktl
->next
;
596 s
->raw_packet_buffer_remaining_size
+= pkt
->size
;
603 ret
= s
->iformat
->read_packet(s
, pkt
);
605 if (!pktl
|| ret
== AVERROR(EAGAIN
))
607 for (i
= 0; i
< s
->nb_streams
; i
++)
608 s
->streams
[i
]->probe_packets
= 0;
611 st
= s
->streams
[pkt
->stream_index
];
613 switch(st
->codec
->codec_type
){
614 case CODEC_TYPE_VIDEO
:
615 if(s
->video_codec_id
) st
->codec
->codec_id
= s
->video_codec_id
;
617 case CODEC_TYPE_AUDIO
:
618 if(s
->audio_codec_id
) st
->codec
->codec_id
= s
->audio_codec_id
;
620 case CODEC_TYPE_SUBTITLE
:
621 if(s
->subtitle_codec_id
)st
->codec
->codec_id
= s
->subtitle_codec_id
;
625 if(!pktl
&& (st
->codec
->codec_id
!= CODEC_ID_PROBE
||
629 add_to_pktbuf(&s
->raw_packet_buffer
, pkt
, &s
->raw_packet_buffer_end
);
630 s
->raw_packet_buffer_remaining_size
-= pkt
->size
;
632 if(st
->codec
->codec_id
== CODEC_ID_PROBE
){
633 AVProbeData
*pd
= &st
->probe_data
;
634 av_log(s
, AV_LOG_DEBUG
, "probing stream %d\n", st
->index
);
637 pd
->buf
= av_realloc(pd
->buf
, pd
->buf_size
+pkt
->size
+AVPROBE_PADDING_SIZE
);
638 memcpy(pd
->buf
+pd
->buf_size
, pkt
->data
, pkt
->size
);
639 pd
->buf_size
+= pkt
->size
;
640 memset(pd
->buf
+pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
642 if(av_log2(pd
->buf_size
) != av_log2(pd
->buf_size
- pkt
->size
)){
643 set_codec_from_probe_data(s
, st
, pd
, 1);
644 if(st
->codec
->codec_id
!= CODEC_ID_PROBE
){
647 av_log(s
, AV_LOG_DEBUG
, "probed stream %d\n", st
->index
);
654 /**********************************************************/
657 * Get the number of samples of an audio frame. Return -1 on error.
659 static int get_audio_frame_size(AVCodecContext
*enc
, int size
)
663 if(enc
->codec_id
== CODEC_ID_VORBIS
)
666 if (enc
->frame_size
<= 1) {
667 int bits_per_sample
= av_get_bits_per_sample(enc
->codec_id
);
669 if (bits_per_sample
) {
670 if (enc
->channels
== 0)
672 frame_size
= (size
<< 3) / (bits_per_sample
* enc
->channels
);
674 /* used for example by ADPCM codecs */
675 if (enc
->bit_rate
== 0)
677 frame_size
= ((int64_t)size
* 8 * enc
->sample_rate
) / enc
->bit_rate
;
680 frame_size
= enc
->frame_size
;
687 * Return the frame duration in seconds. Return 0 if not available.
689 static void compute_frame_duration(int *pnum
, int *pden
, AVStream
*st
,
690 AVCodecParserContext
*pc
, AVPacket
*pkt
)
696 switch(st
->codec
->codec_type
) {
697 case CODEC_TYPE_VIDEO
:
698 if(st
->time_base
.num
*1000LL > st
->time_base
.den
){
699 *pnum
= st
->time_base
.num
;
700 *pden
= st
->time_base
.den
;
701 }else if(st
->codec
->time_base
.num
*1000LL > st
->codec
->time_base
.den
){
702 *pnum
= st
->codec
->time_base
.num
;
703 *pden
= st
->codec
->time_base
.den
;
704 if (pc
&& pc
->repeat_pict
) {
705 *pnum
= (*pnum
) * (1 + pc
->repeat_pict
);
709 case CODEC_TYPE_AUDIO
:
710 frame_size
= get_audio_frame_size(st
->codec
, pkt
->size
);
714 *pden
= st
->codec
->sample_rate
;
721 static int is_intra_only(AVCodecContext
*enc
){
722 if(enc
->codec_type
== CODEC_TYPE_AUDIO
){
724 }else if(enc
->codec_type
== CODEC_TYPE_VIDEO
){
725 switch(enc
->codec_id
){
727 case CODEC_ID_MJPEGB
:
729 case CODEC_ID_RAWVIDEO
:
730 case CODEC_ID_DVVIDEO
:
731 case CODEC_ID_HUFFYUV
:
732 case CODEC_ID_FFVHUFF
:
737 case CODEC_ID_JPEG2000
:
745 static void update_initial_timestamps(AVFormatContext
*s
, int stream_index
,
746 int64_t dts
, int64_t pts
)
748 AVStream
*st
= s
->streams
[stream_index
];
749 AVPacketList
*pktl
= s
->packet_buffer
;
751 if(st
->first_dts
!= AV_NOPTS_VALUE
|| dts
== AV_NOPTS_VALUE
|| st
->cur_dts
== AV_NOPTS_VALUE
)
754 st
->first_dts
= dts
- st
->cur_dts
;
757 for(; pktl
; pktl
= pktl
->next
){
758 if(pktl
->pkt
.stream_index
!= stream_index
)
760 //FIXME think more about this check
761 if(pktl
->pkt
.pts
!= AV_NOPTS_VALUE
&& pktl
->pkt
.pts
== pktl
->pkt
.dts
)
762 pktl
->pkt
.pts
+= st
->first_dts
;
764 if(pktl
->pkt
.dts
!= AV_NOPTS_VALUE
)
765 pktl
->pkt
.dts
+= st
->first_dts
;
767 if(st
->start_time
== AV_NOPTS_VALUE
&& pktl
->pkt
.pts
!= AV_NOPTS_VALUE
)
768 st
->start_time
= pktl
->pkt
.pts
;
770 if (st
->start_time
== AV_NOPTS_VALUE
)
771 st
->start_time
= pts
;
774 static void update_initial_durations(AVFormatContext
*s
, AVStream
*st
, AVPacket
*pkt
)
776 AVPacketList
*pktl
= s
->packet_buffer
;
779 if(st
->first_dts
!= AV_NOPTS_VALUE
){
780 cur_dts
= st
->first_dts
;
781 for(; pktl
; pktl
= pktl
->next
){
782 if(pktl
->pkt
.stream_index
== pkt
->stream_index
){
783 if(pktl
->pkt
.pts
!= pktl
->pkt
.dts
|| pktl
->pkt
.dts
!= AV_NOPTS_VALUE
|| pktl
->pkt
.duration
)
785 cur_dts
-= pkt
->duration
;
788 pktl
= s
->packet_buffer
;
789 st
->first_dts
= cur_dts
;
790 }else if(st
->cur_dts
)
793 for(; pktl
; pktl
= pktl
->next
){
794 if(pktl
->pkt
.stream_index
!= pkt
->stream_index
)
796 if(pktl
->pkt
.pts
== pktl
->pkt
.dts
&& pktl
->pkt
.dts
== AV_NOPTS_VALUE
797 && !pktl
->pkt
.duration
){
798 pktl
->pkt
.dts
= cur_dts
;
799 if(!st
->codec
->has_b_frames
)
800 pktl
->pkt
.pts
= cur_dts
;
801 cur_dts
+= pkt
->duration
;
802 pktl
->pkt
.duration
= pkt
->duration
;
806 if(st
->first_dts
== AV_NOPTS_VALUE
)
807 st
->cur_dts
= cur_dts
;
810 static void compute_pkt_fields(AVFormatContext
*s
, AVStream
*st
,
811 AVCodecParserContext
*pc
, AVPacket
*pkt
)
813 int num
, den
, presentation_delayed
, delay
, i
;
816 if((s
->flags
& AVFMT_FLAG_IGNDTS
) && pkt
->pts
!= AV_NOPTS_VALUE
)
817 pkt
->dts
= AV_NOPTS_VALUE
;
819 if (st
->codec
->codec_id
!= CODEC_ID_H264
&& pc
&& pc
->pict_type
== FF_B_TYPE
)
820 //FIXME Set low_delay = 0 when has_b_frames = 1
821 st
->codec
->has_b_frames
= 1;
823 /* do we have a video B-frame ? */
824 delay
= st
->codec
->has_b_frames
;
825 presentation_delayed
= 0;
826 /* XXX: need has_b_frame, but cannot get it if the codec is
829 pc
&& pc
->pict_type
!= FF_B_TYPE
)
830 presentation_delayed
= 1;
832 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->dts
> pkt
->pts
&& st
->pts_wrap_bits
<63
833 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
834 pkt
->dts
-= 1LL<<st
->pts_wrap_bits
;
837 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
838 // we take the conservative approach and discard both
839 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
840 if(delay
==1 && pkt
->dts
== pkt
->pts
&& pkt
->dts
!= AV_NOPTS_VALUE
&& presentation_delayed
){
841 av_log(s
, AV_LOG_WARNING
, "invalid dts/pts combination\n");
842 pkt
->dts
= pkt
->pts
= AV_NOPTS_VALUE
;
845 if (pkt
->duration
== 0) {
846 compute_frame_duration(&num
, &den
, st
, pc
, pkt
);
848 pkt
->duration
= av_rescale(1, num
* (int64_t)st
->time_base
.den
, den
* (int64_t)st
->time_base
.num
);
850 if(pkt
->duration
!= 0 && s
->packet_buffer
)
851 update_initial_durations(s
, st
, pkt
);
855 /* correct timestamps with byte offset if demuxers only have timestamps
856 on packet boundaries */
857 if(pc
&& st
->need_parsing
== AVSTREAM_PARSE_TIMESTAMPS
&& pkt
->size
){
858 /* this will estimate bitrate based on this frame's duration and size */
859 offset
= av_rescale(pc
->offset
, pkt
->duration
, pkt
->size
);
860 if(pkt
->pts
!= AV_NOPTS_VALUE
)
862 if(pkt
->dts
!= AV_NOPTS_VALUE
)
866 if (pc
&& pc
->dts_sync_point
>= 0) {
867 // we have synchronization info from the parser
868 int64_t den
= st
->codec
->time_base
.den
* (int64_t) st
->time_base
.num
;
870 int64_t num
= st
->codec
->time_base
.num
* (int64_t) st
->time_base
.den
;
871 if (pkt
->dts
!= AV_NOPTS_VALUE
) {
872 // got DTS from the stream, update reference timestamp
873 st
->reference_dts
= pkt
->dts
- pc
->dts_ref_dts_delta
* num
/ den
;
874 pkt
->pts
= pkt
->dts
+ pc
->pts_dts_delta
* num
/ den
;
875 } else if (st
->reference_dts
!= AV_NOPTS_VALUE
) {
876 // compute DTS based on reference timestamp
877 pkt
->dts
= st
->reference_dts
+ pc
->dts_ref_dts_delta
* num
/ den
;
878 pkt
->pts
= pkt
->dts
+ pc
->pts_dts_delta
* num
/ den
;
880 if (pc
->dts_sync_point
> 0)
881 st
->reference_dts
= pkt
->dts
; // new reference
885 /* This may be redundant, but it should not hurt. */
886 if(pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->pts
> pkt
->dts
)
887 presentation_delayed
= 1;
889 // 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);
890 /* interpolate PTS and DTS if they are not present */
891 //We skip H264 currently because delay and has_b_frames are not reliably set
892 if((delay
==0 || (delay
==1 && pc
)) && st
->codec
->codec_id
!= CODEC_ID_H264
){
893 if (presentation_delayed
) {
894 /* DTS = decompression timestamp */
895 /* PTS = presentation timestamp */
896 if (pkt
->dts
== AV_NOPTS_VALUE
)
897 pkt
->dts
= st
->last_IP_pts
;
898 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
);
899 if (pkt
->dts
== AV_NOPTS_VALUE
)
900 pkt
->dts
= st
->cur_dts
;
902 /* this is tricky: the dts must be incremented by the duration
903 of the frame we are displaying, i.e. the last I- or P-frame */
904 if (st
->last_IP_duration
== 0)
905 st
->last_IP_duration
= pkt
->duration
;
906 if(pkt
->dts
!= AV_NOPTS_VALUE
)
907 st
->cur_dts
= pkt
->dts
+ st
->last_IP_duration
;
908 st
->last_IP_duration
= pkt
->duration
;
909 st
->last_IP_pts
= pkt
->pts
;
910 /* cannot compute PTS if not present (we can compute it only
911 by knowing the future */
912 } else if(pkt
->pts
!= AV_NOPTS_VALUE
|| pkt
->dts
!= AV_NOPTS_VALUE
|| pkt
->duration
){
913 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->duration
){
914 int64_t old_diff
= FFABS(st
->cur_dts
- pkt
->duration
- pkt
->pts
);
915 int64_t new_diff
= FFABS(st
->cur_dts
- pkt
->pts
);
916 if(old_diff
< new_diff
&& old_diff
< (pkt
->duration
>>3)){
917 pkt
->pts
+= pkt
->duration
;
918 // 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);
922 /* presentation is not delayed : PTS and DTS are the same */
923 if(pkt
->pts
== AV_NOPTS_VALUE
)
925 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->pts
, pkt
->pts
);
926 if(pkt
->pts
== AV_NOPTS_VALUE
)
927 pkt
->pts
= st
->cur_dts
;
929 if(pkt
->pts
!= AV_NOPTS_VALUE
)
930 st
->cur_dts
= pkt
->pts
+ pkt
->duration
;
934 if(pkt
->pts
!= AV_NOPTS_VALUE
&& delay
<= MAX_REORDER_DELAY
){
935 st
->pts_buffer
[0]= pkt
->pts
;
936 for(i
=0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+1]; i
++)
937 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+1]);
938 if(pkt
->dts
== AV_NOPTS_VALUE
)
939 pkt
->dts
= st
->pts_buffer
[0];
940 if(st
->codec
->codec_id
== CODEC_ID_H264
){ //we skiped it above so we try here
941 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
); // this should happen on the first packet
943 if(pkt
->dts
> st
->cur_dts
)
944 st
->cur_dts
= pkt
->dts
;
947 // 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);
950 if(is_intra_only(st
->codec
))
951 pkt
->flags
|= PKT_FLAG_KEY
;
954 /* keyframe computation */
955 if (pc
->key_frame
== 1)
956 pkt
->flags
|= PKT_FLAG_KEY
;
957 else if (pc
->key_frame
== -1 && pc
->pict_type
== FF_I_TYPE
)
958 pkt
->flags
|= PKT_FLAG_KEY
;
961 pkt
->convergence_duration
= pc
->convergence_duration
;
965 static int av_read_frame_internal(AVFormatContext
*s
, AVPacket
*pkt
)
973 /* select current input stream component */
976 if (!st
->need_parsing
|| !st
->parser
) {
977 /* no parsing needed: we just output the packet as is */
978 /* raw data support */
979 *pkt
= st
->cur_pkt
; st
->cur_pkt
.data
= NULL
;
980 compute_pkt_fields(s
, st
, NULL
, pkt
);
982 if ((s
->iformat
->flags
& AVFMT_GENERIC_INDEX
) &&
983 (pkt
->flags
& PKT_FLAG_KEY
) && pkt
->dts
!= AV_NOPTS_VALUE
) {
984 ff_reduce_index(s
, st
->index
);
985 av_add_index_entry(st
, pkt
->pos
, pkt
->dts
, 0, 0, AVINDEX_KEYFRAME
);
988 } else if (st
->cur_len
> 0 && st
->discard
< AVDISCARD_ALL
) {
989 len
= av_parser_parse2(st
->parser
, st
->codec
, &pkt
->data
, &pkt
->size
,
990 st
->cur_ptr
, st
->cur_len
,
991 st
->cur_pkt
.pts
, st
->cur_pkt
.dts
,
993 st
->cur_pkt
.pts
= AV_NOPTS_VALUE
;
994 st
->cur_pkt
.dts
= AV_NOPTS_VALUE
;
995 /* increment read pointer */
999 /* return packet if any */
1003 pkt
->stream_index
= st
->index
;
1004 pkt
->pts
= st
->parser
->pts
;
1005 pkt
->dts
= st
->parser
->dts
;
1006 pkt
->pos
= st
->parser
->pos
;
1007 pkt
->destruct
= NULL
;
1008 compute_pkt_fields(s
, st
, st
->parser
, pkt
);
1010 if((s
->iformat
->flags
& AVFMT_GENERIC_INDEX
) && pkt
->flags
& PKT_FLAG_KEY
){
1011 ff_reduce_index(s
, st
->index
);
1012 av_add_index_entry(st
, st
->parser
->frame_offset
, pkt
->dts
,
1013 0, 0, AVINDEX_KEYFRAME
);
1020 av_free_packet(&st
->cur_pkt
);
1025 /* read next packet */
1026 ret
= av_read_packet(s
, &cur_pkt
);
1028 if (ret
== AVERROR(EAGAIN
))
1030 /* return the last frames, if any */
1031 for(i
= 0; i
< s
->nb_streams
; i
++) {
1033 if (st
->parser
&& st
->need_parsing
) {
1034 av_parser_parse2(st
->parser
, st
->codec
,
1035 &pkt
->data
, &pkt
->size
,
1037 AV_NOPTS_VALUE
, AV_NOPTS_VALUE
,
1043 /* no more packets: really terminate parsing */
1046 st
= s
->streams
[cur_pkt
.stream_index
];
1047 st
->cur_pkt
= cur_pkt
;
1049 if(st
->cur_pkt
.pts
!= AV_NOPTS_VALUE
&&
1050 st
->cur_pkt
.dts
!= AV_NOPTS_VALUE
&&
1051 st
->cur_pkt
.pts
< st
->cur_pkt
.dts
){
1052 av_log(s
, AV_LOG_WARNING
, "Invalid timestamps stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d\n",
1053 st
->cur_pkt
.stream_index
,
1057 // av_free_packet(&st->cur_pkt);
1061 if(s
->debug
& FF_FDEBUG_TS
)
1062 av_log(s
, AV_LOG_DEBUG
, "av_read_packet stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d, duration=%d, flags=%d\n",
1063 st
->cur_pkt
.stream_index
,
1067 st
->cur_pkt
.duration
,
1071 st
->cur_ptr
= st
->cur_pkt
.data
;
1072 st
->cur_len
= st
->cur_pkt
.size
;
1073 if (st
->need_parsing
&& !st
->parser
) {
1074 st
->parser
= av_parser_init(st
->codec
->codec_id
);
1076 /* no parser available: just output the raw packets */
1077 st
->need_parsing
= AVSTREAM_PARSE_NONE
;
1078 }else if(st
->need_parsing
== AVSTREAM_PARSE_HEADERS
){
1079 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
1081 if(st
->parser
&& (s
->iformat
->flags
& AVFMT_GENERIC_INDEX
)){
1082 st
->parser
->next_frame_offset
=
1083 st
->parser
->cur_offset
= st
->cur_pkt
.pos
;
1088 if(s
->debug
& FF_FDEBUG_TS
)
1089 av_log(s
, AV_LOG_DEBUG
, "av_read_frame_internal stream=%d, pts=%"PRId64
", dts=%"PRId64
", size=%d, duration=%d, flags=%d\n",
1100 int av_read_frame(AVFormatContext
*s
, AVPacket
*pkt
)
1104 const int genpts
= s
->flags
& AVFMT_FLAG_GENPTS
;
1107 pktl
= s
->packet_buffer
;
1109 AVPacket
*next_pkt
= &pktl
->pkt
;
1111 if(genpts
&& next_pkt
->dts
!= AV_NOPTS_VALUE
){
1112 while(pktl
&& next_pkt
->pts
== AV_NOPTS_VALUE
){
1113 if( pktl
->pkt
.stream_index
== next_pkt
->stream_index
1114 && next_pkt
->dts
< pktl
->pkt
.dts
1115 && pktl
->pkt
.pts
!= pktl
->pkt
.dts
//not b frame
1116 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1117 next_pkt
->pts
= pktl
->pkt
.dts
;
1121 pktl
= s
->packet_buffer
;
1124 if( next_pkt
->pts
!= AV_NOPTS_VALUE
1125 || next_pkt
->dts
== AV_NOPTS_VALUE
1127 /* read packet from packet buffer, if there is data */
1129 s
->packet_buffer
= pktl
->next
;
1135 int ret
= av_read_frame_internal(s
, pkt
);
1137 if(pktl
&& ret
!= AVERROR(EAGAIN
)){
1144 if(av_dup_packet(add_to_pktbuf(&s
->packet_buffer
, pkt
,
1145 &s
->packet_buffer_end
)) < 0)
1146 return AVERROR(ENOMEM
);
1148 assert(!s
->packet_buffer
);
1149 return av_read_frame_internal(s
, pkt
);
1154 /* XXX: suppress the packet queue */
1155 static void flush_packet_queue(AVFormatContext
*s
)
1160 pktl
= s
->packet_buffer
;
1163 s
->packet_buffer
= pktl
->next
;
1164 av_free_packet(&pktl
->pkt
);
1167 while(s
->raw_packet_buffer
){
1168 pktl
= s
->raw_packet_buffer
;
1169 s
->raw_packet_buffer
= pktl
->next
;
1170 av_free_packet(&pktl
->pkt
);
1173 s
->packet_buffer_end
=
1174 s
->raw_packet_buffer_end
= NULL
;
1175 s
->raw_packet_buffer_remaining_size
= RAW_PACKET_BUFFER_SIZE
;
1178 /*******************************************************/
1181 int av_find_default_stream_index(AVFormatContext
*s
)
1183 int first_audio_index
= -1;
1187 if (s
->nb_streams
<= 0)
1189 for(i
= 0; i
< s
->nb_streams
; i
++) {
1191 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
1194 if (first_audio_index
< 0 && st
->codec
->codec_type
== CODEC_TYPE_AUDIO
)
1195 first_audio_index
= i
;
1197 return first_audio_index
>= 0 ? first_audio_index
: 0;
1201 * Flush the frame reader.
1203 void av_read_frame_flush(AVFormatContext
*s
)
1208 flush_packet_queue(s
);
1212 /* for each stream, reset read state */
1213 for(i
= 0; i
< s
->nb_streams
; i
++) {
1217 av_parser_close(st
->parser
);
1219 av_free_packet(&st
->cur_pkt
);
1221 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1222 st
->cur_dts
= AV_NOPTS_VALUE
; /* we set the current DTS to an unspecified origin */
1223 st
->reference_dts
= AV_NOPTS_VALUE
;
1228 st
->probe_packets
= MAX_PROBE_PACKETS
;
1230 for(j
=0; j
<MAX_REORDER_DELAY
+1; j
++)
1231 st
->pts_buffer
[j
]= AV_NOPTS_VALUE
;
1235 void av_update_cur_dts(AVFormatContext
*s
, AVStream
*ref_st
, int64_t timestamp
){
1238 for(i
= 0; i
< s
->nb_streams
; i
++) {
1239 AVStream
*st
= s
->streams
[i
];
1241 st
->cur_dts
= av_rescale(timestamp
,
1242 st
->time_base
.den
* (int64_t)ref_st
->time_base
.num
,
1243 st
->time_base
.num
* (int64_t)ref_st
->time_base
.den
);
1247 void ff_reduce_index(AVFormatContext
*s
, int stream_index
)
1249 AVStream
*st
= s
->streams
[stream_index
];
1250 unsigned int max_entries
= s
->max_index_size
/ sizeof(AVIndexEntry
);
1252 if((unsigned)st
->nb_index_entries
>= max_entries
){
1254 for(i
=0; 2*i
<st
->nb_index_entries
; i
++)
1255 st
->index_entries
[i
]= st
->index_entries
[2*i
];
1256 st
->nb_index_entries
= i
;
1260 int av_add_index_entry(AVStream
*st
,
1261 int64_t pos
, int64_t timestamp
, int size
, int distance
, int flags
)
1263 AVIndexEntry
*entries
, *ie
;
1266 if((unsigned)st
->nb_index_entries
+ 1 >= UINT_MAX
/ sizeof(AVIndexEntry
))
1269 entries
= av_fast_realloc(st
->index_entries
,
1270 &st
->index_entries_allocated_size
,
1271 (st
->nb_index_entries
+ 1) *
1272 sizeof(AVIndexEntry
));
1276 st
->index_entries
= entries
;
1278 index
= av_index_search_timestamp(st
, timestamp
, AVSEEK_FLAG_ANY
);
1281 index
= st
->nb_index_entries
++;
1282 ie
= &entries
[index
];
1283 assert(index
==0 || ie
[-1].timestamp
< timestamp
);
1285 ie
= &entries
[index
];
1286 if(ie
->timestamp
!= timestamp
){
1287 if(ie
->timestamp
<= timestamp
)
1289 memmove(entries
+ index
+ 1, entries
+ index
, sizeof(AVIndexEntry
)*(st
->nb_index_entries
- index
));
1290 st
->nb_index_entries
++;
1291 }else if(ie
->pos
== pos
&& distance
< ie
->min_distance
) //do not reduce the distance
1292 distance
= ie
->min_distance
;
1296 ie
->timestamp
= timestamp
;
1297 ie
->min_distance
= distance
;
1304 int av_index_search_timestamp(AVStream
*st
, int64_t wanted_timestamp
,
1307 AVIndexEntry
*entries
= st
->index_entries
;
1308 int nb_entries
= st
->nb_index_entries
;
1317 timestamp
= entries
[m
].timestamp
;
1318 if(timestamp
>= wanted_timestamp
)
1320 if(timestamp
<= wanted_timestamp
)
1323 m
= (flags
& AVSEEK_FLAG_BACKWARD
) ? a
: b
;
1325 if(!(flags
& AVSEEK_FLAG_ANY
)){
1326 while(m
>=0 && m
<nb_entries
&& !(entries
[m
].flags
& AVINDEX_KEYFRAME
)){
1327 m
+= (flags
& AVSEEK_FLAG_BACKWARD
) ?
-1 : 1;
1338 int av_seek_frame_binary(AVFormatContext
*s
, int stream_index
, int64_t target_ts
, int flags
){
1339 AVInputFormat
*avif
= s
->iformat
;
1340 int64_t av_uninit(pos_min
), av_uninit(pos_max
), pos
, pos_limit
;
1341 int64_t ts_min
, ts_max
, ts
;
1346 if (stream_index
< 0)
1350 av_log(s
, AV_LOG_DEBUG
, "read_seek: %d %"PRId64
"\n", stream_index
, target_ts
);
1354 ts_min
= AV_NOPTS_VALUE
;
1355 pos_limit
= -1; //gcc falsely says it may be uninitialized
1357 st
= s
->streams
[stream_index
];
1358 if(st
->index_entries
){
1361 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()
1362 index
= FFMAX(index
, 0);
1363 e
= &st
->index_entries
[index
];
1365 if(e
->timestamp
<= target_ts
|| e
->pos
== e
->min_distance
){
1367 ts_min
= e
->timestamp
;
1369 av_log(s
, AV_LOG_DEBUG
, "using cached pos_min=0x%"PRIx64
" dts_min=%"PRId64
"\n",
1376 index
= av_index_search_timestamp(st
, target_ts
, flags
& ~AVSEEK_FLAG_BACKWARD
);
1377 assert(index
< st
->nb_index_entries
);
1379 e
= &st
->index_entries
[index
];
1380 assert(e
->timestamp
>= target_ts
);
1382 ts_max
= e
->timestamp
;
1383 pos_limit
= pos_max
- e
->min_distance
;
1385 av_log(s
, AV_LOG_DEBUG
, "using cached pos_max=0x%"PRIx64
" pos_limit=0x%"PRIx64
" dts_max=%"PRId64
"\n",
1386 pos_max
,pos_limit
, ts_max
);
1391 pos
= av_gen_search(s
, stream_index
, target_ts
, pos_min
, pos_max
, pos_limit
, ts_min
, ts_max
, flags
, &ts
, avif
->read_timestamp
);
1396 if ((ret
= url_fseek(s
->pb
, pos
, SEEK_SET
)) < 0)
1399 av_update_cur_dts(s
, st
, ts
);
1404 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 )){
1406 int64_t start_pos
, filesize
;
1410 av_log(s
, AV_LOG_DEBUG
, "gen_seek: %d %"PRId64
"\n", stream_index
, target_ts
);
1413 if(ts_min
== AV_NOPTS_VALUE
){
1414 pos_min
= s
->data_offset
;
1415 ts_min
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1416 if (ts_min
== AV_NOPTS_VALUE
)
1420 if(ts_max
== AV_NOPTS_VALUE
){
1422 filesize
= url_fsize(s
->pb
);
1423 pos_max
= filesize
- 1;
1426 ts_max
= read_timestamp(s
, stream_index
, &pos_max
, pos_max
+ step
);
1428 }while(ts_max
== AV_NOPTS_VALUE
&& pos_max
>= step
);
1429 if (ts_max
== AV_NOPTS_VALUE
)
1433 int64_t tmp_pos
= pos_max
+ 1;
1434 int64_t tmp_ts
= read_timestamp(s
, stream_index
, &tmp_pos
, INT64_MAX
);
1435 if(tmp_ts
== AV_NOPTS_VALUE
)
1439 if(tmp_pos
>= filesize
)
1445 if(ts_min
> ts_max
){
1447 }else if(ts_min
== ts_max
){
1452 while (pos_min
< pos_limit
) {
1454 av_log(s
, AV_LOG_DEBUG
, "pos_min=0x%"PRIx64
" pos_max=0x%"PRIx64
" dts_min=%"PRId64
" dts_max=%"PRId64
"\n",
1458 assert(pos_limit
<= pos_max
);
1461 int64_t approximate_keyframe_distance
= pos_max
- pos_limit
;
1462 // interpolate position (better than dichotomy)
1463 pos
= av_rescale(target_ts
- ts_min
, pos_max
- pos_min
, ts_max
- ts_min
)
1464 + pos_min
- approximate_keyframe_distance
;
1465 }else if(no_change
==1){
1466 // bisection, if interpolation failed to change min or max pos last time
1467 pos
= (pos_min
+ pos_limit
)>>1;
1469 /* linear search if bisection failed, can only happen if there
1470 are very few or no keyframes between min/max */
1475 else if(pos
> pos_limit
)
1479 ts
= read_timestamp(s
, stream_index
, &pos
, INT64_MAX
); //may pass pos_limit instead of -1
1485 av_log(s
, AV_LOG_DEBUG
, "%"PRId64
" %"PRId64
" %"PRId64
" / %"PRId64
" %"PRId64
" %"PRId64
" target:%"PRId64
" limit:%"PRId64
" start:%"PRId64
" noc:%d\n",
1486 pos_min
, pos
, pos_max
, ts_min
, ts
, ts_max
, target_ts
, pos_limit
,
1487 start_pos
, no_change
);
1489 if(ts
== AV_NOPTS_VALUE
){
1490 av_log(s
, AV_LOG_ERROR
, "read_timestamp() failed in the middle\n");
1493 assert(ts
!= AV_NOPTS_VALUE
);
1494 if (target_ts
<= ts
) {
1495 pos_limit
= start_pos
- 1;
1499 if (target_ts
>= ts
) {
1505 pos
= (flags
& AVSEEK_FLAG_BACKWARD
) ? pos_min
: pos_max
;
1506 ts
= (flags
& AVSEEK_FLAG_BACKWARD
) ? ts_min
: ts_max
;
1509 ts_min
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1511 ts_max
= read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
);
1512 av_log(s
, AV_LOG_DEBUG
, "pos=0x%"PRIx64
" %"PRId64
"<=%"PRId64
"<=%"PRId64
"\n",
1513 pos
, ts_min
, target_ts
, ts_max
);
1519 static int av_seek_frame_byte(AVFormatContext
*s
, int stream_index
, int64_t pos
, int flags
){
1520 int64_t pos_min
, pos_max
;
1524 if (stream_index
< 0)
1527 st
= s
->streams
[stream_index
];
1530 pos_min
= s
->data_offset
;
1531 pos_max
= url_fsize(s
->pb
) - 1;
1533 if (pos
< pos_min
) pos
= pos_min
;
1534 else if(pos
> pos_max
) pos
= pos_max
;
1536 url_fseek(s
->pb
, pos
, SEEK_SET
);
1539 av_update_cur_dts(s
, st
, ts
);
1544 static int av_seek_frame_generic(AVFormatContext
*s
,
1545 int stream_index
, int64_t timestamp
, int flags
)
1552 st
= s
->streams
[stream_index
];
1554 index
= av_index_search_timestamp(st
, timestamp
, flags
);
1556 if(index
< 0 && st
->nb_index_entries
&& timestamp
< st
->index_entries
[0].timestamp
)
1559 if(index
< 0 || index
==st
->nb_index_entries
-1){
1563 if(st
->nb_index_entries
){
1564 assert(st
->index_entries
);
1565 ie
= &st
->index_entries
[st
->nb_index_entries
-1];
1566 if ((ret
= url_fseek(s
->pb
, ie
->pos
, SEEK_SET
)) < 0)
1568 av_update_cur_dts(s
, st
, ie
->timestamp
);
1570 if ((ret
= url_fseek(s
->pb
, s
->data_offset
, SEEK_SET
)) < 0)
1576 ret
= av_read_frame(s
, &pkt
);
1577 }while(ret
== AVERROR(EAGAIN
));
1580 av_free_packet(&pkt
);
1581 if(stream_index
== pkt
.stream_index
){
1582 if((pkt
.flags
& PKT_FLAG_KEY
) && pkt
.dts
> timestamp
)
1586 index
= av_index_search_timestamp(st
, timestamp
, flags
);
1591 av_read_frame_flush(s
);
1592 if (s
->iformat
->read_seek
){
1593 if(s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
) >= 0)
1596 ie
= &st
->index_entries
[index
];
1597 if ((ret
= url_fseek(s
->pb
, ie
->pos
, SEEK_SET
)) < 0)
1599 av_update_cur_dts(s
, st
, ie
->timestamp
);
1604 int av_seek_frame(AVFormatContext
*s
, int stream_index
, int64_t timestamp
, int flags
)
1609 av_read_frame_flush(s
);
1611 if(flags
& AVSEEK_FLAG_BYTE
)
1612 return av_seek_frame_byte(s
, stream_index
, timestamp
, flags
);
1614 if(stream_index
< 0){
1615 stream_index
= av_find_default_stream_index(s
);
1616 if(stream_index
< 0)
1619 st
= s
->streams
[stream_index
];
1620 /* timestamp for default must be expressed in AV_TIME_BASE units */
1621 timestamp
= av_rescale(timestamp
, st
->time_base
.den
, AV_TIME_BASE
* (int64_t)st
->time_base
.num
);
1624 /* first, we try the format specific seek */
1625 if (s
->iformat
->read_seek
)
1626 ret
= s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
);
1633 if(s
->iformat
->read_timestamp
)
1634 return av_seek_frame_binary(s
, stream_index
, timestamp
, flags
);
1636 return av_seek_frame_generic(s
, stream_index
, timestamp
, flags
);
1639 int avformat_seek_file(AVFormatContext
*s
, int stream_index
, int64_t min_ts
, int64_t ts
, int64_t max_ts
, int flags
)
1641 if(min_ts
> ts
|| max_ts
< ts
)
1644 av_read_frame_flush(s
);
1646 if (s
->iformat
->read_seek2
)
1647 return s
->iformat
->read_seek2(s
, stream_index
, min_ts
, ts
, max_ts
, flags
);
1649 if(s
->iformat
->read_timestamp
){
1650 //try to seek via read_timestamp()
1653 //Fallback to old API if new is not implemented but old is
1654 //Note the old has somewat different sematics
1655 if(s
->iformat
->read_seek
|| 1)
1656 return av_seek_frame(s
, stream_index
, ts
, flags
| (ts
- min_ts
> (uint64_t)(max_ts
- ts
) ? AVSEEK_FLAG_BACKWARD
: 0));
1658 // try some generic seek like av_seek_frame_generic() but with new ts semantics
1661 /*******************************************************/
1664 * Returns TRUE if the stream has accurate duration in any stream.
1666 * @return TRUE if the stream has accurate duration for at least one component.
1668 static int av_has_duration(AVFormatContext
*ic
)
1673 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1674 st
= ic
->streams
[i
];
1675 if (st
->duration
!= AV_NOPTS_VALUE
)
1682 * Estimate the stream timings from the one of each components.
1684 * Also computes the global bitrate if possible.
1686 static void av_update_stream_timings(AVFormatContext
*ic
)
1688 int64_t start_time
, start_time1
, end_time
, end_time1
;
1689 int64_t duration
, duration1
;
1693 start_time
= INT64_MAX
;
1694 end_time
= INT64_MIN
;
1695 duration
= INT64_MIN
;
1696 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1697 st
= ic
->streams
[i
];
1698 if (st
->start_time
!= AV_NOPTS_VALUE
&& st
->time_base
.den
) {
1699 start_time1
= av_rescale_q(st
->start_time
, st
->time_base
, AV_TIME_BASE_Q
);
1700 if (start_time1
< start_time
)
1701 start_time
= start_time1
;
1702 if (st
->duration
!= AV_NOPTS_VALUE
) {
1703 end_time1
= start_time1
1704 + av_rescale_q(st
->duration
, st
->time_base
, AV_TIME_BASE_Q
);
1705 if (end_time1
> end_time
)
1706 end_time
= end_time1
;
1709 if (st
->duration
!= AV_NOPTS_VALUE
) {
1710 duration1
= av_rescale_q(st
->duration
, st
->time_base
, AV_TIME_BASE_Q
);
1711 if (duration1
> duration
)
1712 duration
= duration1
;
1715 if (start_time
!= INT64_MAX
) {
1716 ic
->start_time
= start_time
;
1717 if (end_time
!= INT64_MIN
) {
1718 if (end_time
- start_time
> duration
)
1719 duration
= end_time
- start_time
;
1722 if (duration
!= INT64_MIN
) {
1723 ic
->duration
= duration
;
1724 if (ic
->file_size
> 0) {
1725 /* compute the bitrate */
1726 ic
->bit_rate
= (double)ic
->file_size
* 8.0 * AV_TIME_BASE
/
1727 (double)ic
->duration
;
1732 static void fill_all_stream_timings(AVFormatContext
*ic
)
1737 av_update_stream_timings(ic
);
1738 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1739 st
= ic
->streams
[i
];
1740 if (st
->start_time
== AV_NOPTS_VALUE
) {
1741 if(ic
->start_time
!= AV_NOPTS_VALUE
)
1742 st
->start_time
= av_rescale_q(ic
->start_time
, AV_TIME_BASE_Q
, st
->time_base
);
1743 if(ic
->duration
!= AV_NOPTS_VALUE
)
1744 st
->duration
= av_rescale_q(ic
->duration
, AV_TIME_BASE_Q
, st
->time_base
);
1749 static void av_estimate_timings_from_bit_rate(AVFormatContext
*ic
)
1751 int64_t filesize
, duration
;
1755 /* if bit_rate is already set, we believe it */
1756 if (ic
->bit_rate
== 0) {
1758 for(i
=0;i
<ic
->nb_streams
;i
++) {
1759 st
= ic
->streams
[i
];
1760 bit_rate
+= st
->codec
->bit_rate
;
1762 ic
->bit_rate
= bit_rate
;
1765 /* if duration is already set, we believe it */
1766 if (ic
->duration
== AV_NOPTS_VALUE
&&
1767 ic
->bit_rate
!= 0 &&
1768 ic
->file_size
!= 0) {
1769 filesize
= ic
->file_size
;
1771 for(i
= 0; i
< ic
->nb_streams
; i
++) {
1772 st
= ic
->streams
[i
];
1773 duration
= av_rescale(8*filesize
, st
->time_base
.den
, ic
->bit_rate
*(int64_t)st
->time_base
.num
);
1774 if (st
->duration
== AV_NOPTS_VALUE
)
1775 st
->duration
= duration
;
1781 #define DURATION_MAX_READ_SIZE 250000
1782 #define DURATION_MAX_RETRY 3
1784 /* only usable for MPEG-PS streams */
1785 static void av_estimate_timings_from_pts(AVFormatContext
*ic
, int64_t old_offset
)
1787 AVPacket pkt1
, *pkt
= &pkt1
;
1789 int read_size
, i
, ret
;
1790 int64_t end_time
, start_time
[MAX_STREAMS
];
1791 int64_t filesize
, offset
, duration
;
1796 /* flush packet queue */
1797 flush_packet_queue(ic
);
1799 for(i
=0;i
<ic
->nb_streams
;i
++) {
1800 st
= ic
->streams
[i
];
1801 if(st
->start_time
!= AV_NOPTS_VALUE
){
1802 start_time
[i
]= st
->start_time
;
1803 }else if(st
->first_dts
!= AV_NOPTS_VALUE
){
1804 start_time
[i
]= st
->first_dts
;
1806 av_log(st
->codec
, AV_LOG_WARNING
, "start time is not set in av_estimate_timings_from_pts\n");
1809 av_parser_close(st
->parser
);
1811 av_free_packet(&st
->cur_pkt
);
1815 /* estimate the end time (duration) */
1816 /* XXX: may need to support wrapping */
1817 filesize
= ic
->file_size
;
1818 end_time
= AV_NOPTS_VALUE
;
1820 offset
= filesize
- (DURATION_MAX_READ_SIZE
<<retry
);
1824 url_fseek(ic
->pb
, offset
, SEEK_SET
);
1827 if (read_size
>= DURATION_MAX_READ_SIZE
<<(FFMAX(retry
-1,0)))
1831 ret
= av_read_packet(ic
, pkt
);
1832 }while(ret
== AVERROR(EAGAIN
));
1835 read_size
+= pkt
->size
;
1836 st
= ic
->streams
[pkt
->stream_index
];
1837 if (pkt
->pts
!= AV_NOPTS_VALUE
&&
1838 start_time
[pkt
->stream_index
] != AV_NOPTS_VALUE
) {
1839 end_time
= pkt
->pts
;
1840 duration
= end_time
- start_time
[pkt
->stream_index
];
1842 duration
+= 1LL<<st
->pts_wrap_bits
;
1844 if (st
->duration
== AV_NOPTS_VALUE
||
1845 st
->duration
< duration
)
1846 st
->duration
= duration
;
1849 av_free_packet(pkt
);
1851 }while( end_time
==AV_NOPTS_VALUE
1852 && filesize
> (DURATION_MAX_READ_SIZE
<<retry
)
1853 && ++retry
<= DURATION_MAX_RETRY
);
1855 fill_all_stream_timings(ic
);
1857 url_fseek(ic
->pb
, old_offset
, SEEK_SET
);
1858 for(i
=0; i
<ic
->nb_streams
; i
++){
1860 st
->cur_dts
= st
->first_dts
;
1861 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1865 static void av_estimate_timings(AVFormatContext
*ic
, int64_t old_offset
)
1869 /* get the file size, if possible */
1870 if (ic
->iformat
->flags
& AVFMT_NOFILE
) {
1873 file_size
= url_fsize(ic
->pb
);
1877 ic
->file_size
= file_size
;
1879 if ((!strcmp(ic
->iformat
->name
, "mpeg") ||
1880 !strcmp(ic
->iformat
->name
, "mpegts")) &&
1881 file_size
&& !url_is_streamed(ic
->pb
)) {
1882 /* get accurate estimate from the PTSes */
1883 av_estimate_timings_from_pts(ic
, old_offset
);
1884 } else if (av_has_duration(ic
)) {
1885 /* at least one component has timings - we use them for all
1887 fill_all_stream_timings(ic
);
1889 av_log(ic
, AV_LOG_WARNING
, "Estimating duration from bitrate, this may be inaccurate\n");
1890 /* less precise: use bitrate info */
1891 av_estimate_timings_from_bit_rate(ic
);
1893 av_update_stream_timings(ic
);
1899 for(i
= 0;i
< ic
->nb_streams
; i
++) {
1900 st
= ic
->streams
[i
];
1901 printf("%d: start_time: %0.3f duration: %0.3f\n",
1902 i
, (double)st
->start_time
/ AV_TIME_BASE
,
1903 (double)st
->duration
/ AV_TIME_BASE
);
1905 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1906 (double)ic
->start_time
/ AV_TIME_BASE
,
1907 (double)ic
->duration
/ AV_TIME_BASE
,
1908 ic
->bit_rate
/ 1000);
1913 static int has_codec_parameters(AVCodecContext
*enc
)
1916 switch(enc
->codec_type
) {
1917 case CODEC_TYPE_AUDIO
:
1918 val
= enc
->sample_rate
&& enc
->channels
&& enc
->sample_fmt
!= SAMPLE_FMT_NONE
;
1919 if(!enc
->frame_size
&&
1920 (enc
->codec_id
== CODEC_ID_VORBIS
||
1921 enc
->codec_id
== CODEC_ID_AAC
||
1922 enc
->codec_id
== CODEC_ID_MP1
||
1923 enc
->codec_id
== CODEC_ID_MP2
||
1924 enc
->codec_id
== CODEC_ID_MP3
||
1925 enc
->codec_id
== CODEC_ID_SPEEX
))
1928 case CODEC_TYPE_VIDEO
:
1929 val
= enc
->width
&& enc
->pix_fmt
!= PIX_FMT_NONE
;
1935 return enc
->codec_id
!= CODEC_ID_NONE
&& val
!= 0;
1938 static int try_decode_frame(AVStream
*st
, AVPacket
*avpkt
)
1942 int got_picture
, data_size
, ret
=0;
1945 if(!st
->codec
->codec
){
1946 codec
= avcodec_find_decoder(st
->codec
->codec_id
);
1949 ret
= avcodec_open(st
->codec
, codec
);
1954 if(!has_codec_parameters(st
->codec
)){
1955 switch(st
->codec
->codec_type
) {
1956 case CODEC_TYPE_VIDEO
:
1957 avcodec_get_frame_defaults(&picture
);
1958 ret
= avcodec_decode_video2(st
->codec
, &picture
,
1959 &got_picture
, avpkt
);
1961 case CODEC_TYPE_AUDIO
:
1962 data_size
= FFMAX(avpkt
->size
, AVCODEC_MAX_AUDIO_FRAME_SIZE
);
1963 samples
= av_malloc(data_size
);
1966 ret
= avcodec_decode_audio3(st
->codec
, samples
,
1978 unsigned int ff_codec_get_tag(const AVCodecTag
*tags
, int id
)
1980 while (tags
->id
!= CODEC_ID_NONE
) {
1988 enum CodecID
ff_codec_get_id(const AVCodecTag
*tags
, unsigned int tag
)
1991 for(i
=0; tags
[i
].id
!= CODEC_ID_NONE
;i
++) {
1992 if(tag
== tags
[i
].tag
)
1995 for(i
=0; tags
[i
].id
!= CODEC_ID_NONE
; i
++) {
1996 if( toupper((tag
>> 0)&0xFF) == toupper((tags
[i
].tag
>> 0)&0xFF)
1997 && toupper((tag
>> 8)&0xFF) == toupper((tags
[i
].tag
>> 8)&0xFF)
1998 && toupper((tag
>>16)&0xFF) == toupper((tags
[i
].tag
>>16)&0xFF)
1999 && toupper((tag
>>24)&0xFF) == toupper((tags
[i
].tag
>>24)&0xFF))
2002 return CODEC_ID_NONE
;
2005 unsigned int av_codec_get_tag(const AVCodecTag
* const *tags
, enum CodecID id
)
2008 for(i
=0; tags
&& tags
[i
]; i
++){
2009 int tag
= ff_codec_get_tag(tags
[i
], id
);
2015 enum CodecID
av_codec_get_id(const AVCodecTag
* const *tags
, unsigned int tag
)
2018 for(i
=0; tags
&& tags
[i
]; i
++){
2019 enum CodecID id
= ff_codec_get_id(tags
[i
], tag
);
2020 if(id
!=CODEC_ID_NONE
) return id
;
2022 return CODEC_ID_NONE
;
2025 static void compute_chapters_end(AVFormatContext
*s
)
2029 for (i
=0; i
+1<s
->nb_chapters
; i
++)
2030 if (s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
2031 assert(s
->chapters
[i
]->start
<= s
->chapters
[i
+1]->start
);
2032 assert(!av_cmp_q(s
->chapters
[i
]->time_base
, s
->chapters
[i
+1]->time_base
));
2033 s
->chapters
[i
]->end
= s
->chapters
[i
+1]->start
;
2036 if (s
->nb_chapters
&& s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
2037 assert(s
->start_time
!= AV_NOPTS_VALUE
);
2038 assert(s
->duration
> 0);
2039 s
->chapters
[i
]->end
= av_rescale_q(s
->start_time
+ s
->duration
,
2041 s
->chapters
[i
]->time_base
);
2045 #define MAX_STD_TIMEBASES (60*12+5)
2046 static int get_std_framerate(int i
){
2047 if(i
<60*12) return i
*1001;
2048 else return ((const int[]){24,30,60,12,15})[i
-60*12]*1000*12;
2052 * Is the time base unreliable.
2053 * This is a heuristic to balance between quick acceptance of the values in
2054 * the headers vs. some extra checks.
2055 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2056 * MPEG-2 commonly misuses field repeat flags to store different framerates.
2057 * And there are "variable" fps files this needs to detect as well.
2059 static int tb_unreliable(AVCodecContext
*c
){
2060 if( c
->time_base
.den
>= 101L*c
->time_base
.num
2061 || c
->time_base
.den
< 5L*c
->time_base
.num
2062 /* || c->codec_tag == AV_RL32("DIVX")
2063 || c->codec_tag == AV_RL32("XVID")*/
2064 || c
->codec_id
== CODEC_ID_MPEG2VIDEO
2065 || c
->codec_id
== CODEC_ID_H264
2071 int av_find_stream_info(AVFormatContext
*ic
)
2073 int i
, count
, ret
, read_size
, j
;
2075 AVPacket pkt1
, *pkt
;
2076 int64_t last_dts
[MAX_STREAMS
];
2077 int64_t duration_gcd
[MAX_STREAMS
]={0};
2078 int duration_count
[MAX_STREAMS
]={0};
2079 double (*duration_error
)[MAX_STD_TIMEBASES
];
2080 int64_t old_offset
= url_ftell(ic
->pb
);
2081 int64_t codec_info_duration
[MAX_STREAMS
]={0};
2083 duration_error
= av_mallocz(MAX_STREAMS
* sizeof(*duration_error
));
2084 if (!duration_error
) return AVERROR(ENOMEM
);
2086 for(i
=0;i
<ic
->nb_streams
;i
++) {
2087 st
= ic
->streams
[i
];
2088 if (st
->codec
->codec_id
== CODEC_ID_AAC
) {
2089 st
->codec
->sample_rate
= 0;
2090 st
->codec
->frame_size
= 0;
2091 st
->codec
->channels
= 0;
2093 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
){
2094 /* if(!st->time_base.num)
2096 if(!st
->codec
->time_base
.num
)
2097 st
->codec
->time_base
= st
->time_base
;
2099 //only for the split stuff
2101 st
->parser
= av_parser_init(st
->codec
->codec_id
);
2102 if(st
->need_parsing
== AVSTREAM_PARSE_HEADERS
&& st
->parser
){
2103 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
2106 assert(!st
->codec
->codec
);
2107 //try to just open decoders, in case this is enough to get parameters
2108 if(!has_codec_parameters(st
->codec
)){
2109 AVCodec
*codec
= avcodec_find_decoder(st
->codec
->codec_id
);
2111 avcodec_open(st
->codec
, codec
);
2115 for(i
=0;i
<MAX_STREAMS
;i
++){
2116 last_dts
[i
]= AV_NOPTS_VALUE
;
2122 if(url_interrupt_cb()){
2123 ret
= AVERROR(EINTR
);
2124 av_log(ic
, AV_LOG_DEBUG
, "interrupted\n");
2128 /* check if one codec still needs to be handled */
2129 for(i
=0;i
<ic
->nb_streams
;i
++) {
2130 st
= ic
->streams
[i
];
2131 if (!has_codec_parameters(st
->codec
))
2133 /* variable fps and no guess at the real fps */
2134 if( tb_unreliable(st
->codec
) && !(st
->r_frame_rate
.num
&& st
->avg_frame_rate
.num
)
2135 && duration_count
[i
]<20 && st
->codec
->codec_type
== CODEC_TYPE_VIDEO
)
2137 if(st
->parser
&& st
->parser
->parser
->split
&& !st
->codec
->extradata
)
2139 if(st
->first_dts
== AV_NOPTS_VALUE
)
2142 if (i
== ic
->nb_streams
) {
2143 /* NOTE: if the format has no header, then we need to read
2144 some packets to get most of the streams, so we cannot
2146 if (!(ic
->ctx_flags
& AVFMTCTX_NOHEADER
)) {
2147 /* if we found the info for all the codecs, we can stop */
2149 av_log(ic
, AV_LOG_DEBUG
, "All info found\n");
2153 /* we did not get all the codec info, but we read too much data */
2154 if (read_size
>= ic
->probesize
) {
2156 av_log(ic
, AV_LOG_WARNING
, "MAX_READ_SIZE:%d reached\n", ic
->probesize
);
2160 /* NOTE: a new stream can be added there if no header in file
2161 (AVFMTCTX_NOHEADER) */
2162 ret
= av_read_frame_internal(ic
, &pkt1
);
2163 if(ret
== AVERROR(EAGAIN
))
2167 ret
= -1; /* we could not have all the codec parameters before EOF */
2168 for(i
=0;i
<ic
->nb_streams
;i
++) {
2169 st
= ic
->streams
[i
];
2170 if (!has_codec_parameters(st
->codec
)){
2172 avcodec_string(buf
, sizeof(buf
), st
->codec
, 0);
2173 av_log(ic
, AV_LOG_WARNING
, "Could not find codec parameters (%s)\n", buf
);
2181 pkt
= add_to_pktbuf(&ic
->packet_buffer
, &pkt1
, &ic
->packet_buffer_end
);
2182 if(av_dup_packet(pkt
) < 0) {
2183 av_free(duration_error
);
2184 return AVERROR(ENOMEM
);
2187 read_size
+= pkt
->size
;
2189 st
= ic
->streams
[pkt
->stream_index
];
2190 if(st
->codec_info_nb_frames
>1) {
2191 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
){
2192 av_log(ic
, AV_LOG_WARNING
, "max_analyze_duration reached\n");
2195 codec_info_duration
[st
->index
] += pkt
->duration
;
2197 st
->codec_info_nb_frames
++;
2200 int index
= pkt
->stream_index
;
2201 int64_t last
= last_dts
[index
];
2202 int64_t duration
= pkt
->dts
- last
;
2204 if(pkt
->dts
!= AV_NOPTS_VALUE
&& last
!= AV_NOPTS_VALUE
&& duration
>0){
2205 double dur
= duration
* av_q2d(st
->time_base
);
2207 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2208 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2209 if(duration_count
[index
] < 2)
2210 memset(duration_error
[index
], 0, sizeof(*duration_error
));
2211 for(i
=1; i
<MAX_STD_TIMEBASES
; i
++){
2212 int framerate
= get_std_framerate(i
);
2213 int ticks
= lrintf(dur
*framerate
/(1001*12));
2214 double error
= dur
- ticks
*1001*12/(double)framerate
;
2215 duration_error
[index
][i
] += error
*error
;
2217 duration_count
[index
]++;
2218 // ignore the first 4 values, they might have some random jitter
2219 if (duration_count
[index
] > 3)
2220 duration_gcd
[index
] = av_gcd(duration_gcd
[index
], duration
);
2222 if(last
== AV_NOPTS_VALUE
|| duration_count
[index
]<=1)
2223 last_dts
[pkt
->stream_index
]= pkt
->dts
;
2225 if(st
->parser
&& st
->parser
->parser
->split
&& !st
->codec
->extradata
){
2226 int i
= st
->parser
->parser
->split(st
->codec
, pkt
->data
, pkt
->size
);
2228 st
->codec
->extradata_size
= i
;
2229 st
->codec
->extradata
= av_malloc(st
->codec
->extradata_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
2230 memcpy(st
->codec
->extradata
, pkt
->data
, st
->codec
->extradata_size
);
2231 memset(st
->codec
->extradata
+ i
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
2235 /* if still no information, we try to open the codec and to
2236 decompress the frame. We try to avoid that in most cases as
2237 it takes longer and uses more memory. For MPEG-4, we need to
2238 decompress for QuickTime. */
2239 if (!has_codec_parameters(st
->codec
))
2240 try_decode_frame(st
, pkt
);
2245 // close codecs which were opened in try_decode_frame()
2246 for(i
=0;i
<ic
->nb_streams
;i
++) {
2247 st
= ic
->streams
[i
];
2248 if(st
->codec
->codec
)
2249 avcodec_close(st
->codec
);
2251 for(i
=0;i
<ic
->nb_streams
;i
++) {
2252 st
= ic
->streams
[i
];
2253 if(st
->codec_info_nb_frames
>2 && !st
->avg_frame_rate
.num
&& codec_info_duration
[i
])
2254 av_reduce(&st
->avg_frame_rate
.num
, &st
->avg_frame_rate
.den
,
2255 (st
->codec_info_nb_frames
-2)*(int64_t)st
->time_base
.den
,
2256 codec_info_duration
[i
] *(int64_t)st
->time_base
.num
, 60000);
2257 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
2258 if(st
->codec
->codec_id
== CODEC_ID_RAWVIDEO
&& !st
->codec
->codec_tag
&& !st
->codec
->bits_per_coded_sample
)
2259 st
->codec
->codec_tag
= avcodec_pix_fmt_to_codec_tag(st
->codec
->pix_fmt
);
2261 // the check for tb_unreliable() is not completely correct, since this is not about handling
2262 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2263 // ipmovie.c produces.
2264 if (tb_unreliable(st
->codec
) && duration_count
[i
] > 15 && duration_gcd
[i
] > 1 && !st
->r_frame_rate
.num
)
2265 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
);
2266 if(duration_count
[i
] && !st
->r_frame_rate
.num
2267 && tb_unreliable(st
->codec
) /*&&
2268 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2269 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2271 double best_error
= 2*av_q2d(st
->time_base
);
2272 best_error
= best_error
*best_error
*duration_count
[i
]*1000*12*30;
2274 for(j
=1; j
<MAX_STD_TIMEBASES
; j
++){
2275 double error
= duration_error
[i
][j
] * get_std_framerate(j
);
2276 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2277 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2278 if(error
< best_error
){
2280 num
= get_std_framerate(j
);
2283 // do not increase frame rate by more than 1 % in order to match a standard rate.
2284 if (num
&& (!st
->r_frame_rate
.num
|| (double)num
/(12*1001) < 1.01 * av_q2d(st
->r_frame_rate
)))
2285 av_reduce(&st
->r_frame_rate
.num
, &st
->r_frame_rate
.den
, num
, 12*1001, INT_MAX
);
2288 if (!st
->r_frame_rate
.num
){
2289 if( st
->codec
->time_base
.den
* (int64_t)st
->time_base
.num
2290 <= st
->codec
->time_base
.num
* st
->codec
->ticks_per_frame
* (int64_t)st
->time_base
.den
){
2291 st
->r_frame_rate
.num
= st
->codec
->time_base
.den
;
2292 st
->r_frame_rate
.den
= st
->codec
->time_base
.num
* st
->codec
->ticks_per_frame
;
2294 st
->r_frame_rate
.num
= st
->time_base
.den
;
2295 st
->r_frame_rate
.den
= st
->time_base
.num
;
2298 }else if(st
->codec
->codec_type
== CODEC_TYPE_AUDIO
) {
2299 if(!st
->codec
->bits_per_coded_sample
)
2300 st
->codec
->bits_per_coded_sample
= av_get_bits_per_sample(st
->codec
->codec_id
);
2304 av_estimate_timings(ic
, old_offset
);
2306 compute_chapters_end(ic
);
2309 /* correct DTS for B-frame streams with no timestamps */
2310 for(i
=0;i
<ic
->nb_streams
;i
++) {
2311 st
= ic
->streams
[i
];
2312 if (st
->codec
->codec_type
== CODEC_TYPE_VIDEO
) {
2314 ppktl
= &ic
->packet_buffer
;
2316 if(ppkt1
->stream_index
!= i
)
2318 if(ppkt1
->pkt
->dts
< 0)
2320 if(ppkt1
->pkt
->pts
!= AV_NOPTS_VALUE
)
2322 ppkt1
->pkt
->dts
-= delta
;
2327 st
->cur_dts
-= delta
;
2333 av_free(duration_error
);
2338 /*******************************************************/
2340 int av_read_play(AVFormatContext
*s
)
2342 if (s
->iformat
->read_play
)
2343 return s
->iformat
->read_play(s
);
2345 return av_url_read_fpause(s
->pb
, 0);
2346 return AVERROR(ENOSYS
);
2349 int av_read_pause(AVFormatContext
*s
)
2351 if (s
->iformat
->read_pause
)
2352 return s
->iformat
->read_pause(s
);
2354 return av_url_read_fpause(s
->pb
, 1);
2355 return AVERROR(ENOSYS
);
2358 void av_close_input_stream(AVFormatContext
*s
)
2363 if (s
->iformat
->read_close
)
2364 s
->iformat
->read_close(s
);
2365 for(i
=0;i
<s
->nb_streams
;i
++) {
2366 /* free all data in a stream component */
2369 av_parser_close(st
->parser
);
2370 av_free_packet(&st
->cur_pkt
);
2372 av_metadata_free(&st
->metadata
);
2373 av_free(st
->index_entries
);
2374 av_free(st
->codec
->extradata
);
2376 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2377 av_free(st
->filename
);
2379 av_free(st
->priv_data
);
2382 for(i
=s
->nb_programs
-1; i
>=0; i
--) {
2383 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2384 av_freep(&s
->programs
[i
]->provider_name
);
2385 av_freep(&s
->programs
[i
]->name
);
2387 av_metadata_free(&s
->programs
[i
]->metadata
);
2388 av_freep(&s
->programs
[i
]->stream_index
);
2389 av_freep(&s
->programs
[i
]);
2391 av_freep(&s
->programs
);
2392 flush_packet_queue(s
);
2393 av_freep(&s
->priv_data
);
2394 while(s
->nb_chapters
--) {
2395 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2396 av_free(s
->chapters
[s
->nb_chapters
]->title
);
2398 av_metadata_free(&s
->chapters
[s
->nb_chapters
]->metadata
);
2399 av_free(s
->chapters
[s
->nb_chapters
]);
2401 av_freep(&s
->chapters
);
2402 av_metadata_free(&s
->metadata
);
2406 void av_close_input_file(AVFormatContext
*s
)
2408 ByteIOContext
*pb
= s
->iformat
->flags
& AVFMT_NOFILE ? NULL
: s
->pb
;
2409 av_close_input_stream(s
);
2414 AVStream
*av_new_stream(AVFormatContext
*s
, int id
)
2419 if (s
->nb_streams
>= MAX_STREAMS
)
2422 st
= av_mallocz(sizeof(AVStream
));
2426 st
->codec
= avcodec_alloc_context();
2428 /* no default bitrate if decoding */
2429 st
->codec
->bit_rate
= 0;
2431 st
->index
= s
->nb_streams
;
2433 st
->start_time
= AV_NOPTS_VALUE
;
2434 st
->duration
= AV_NOPTS_VALUE
;
2435 /* we set the current DTS to 0 so that formats without any timestamps
2436 but durations get some timestamps, formats with some unknown
2437 timestamps have their first few packets buffered and the
2438 timestamps corrected before they are returned to the user */
2440 st
->first_dts
= AV_NOPTS_VALUE
;
2441 st
->probe_packets
= MAX_PROBE_PACKETS
;
2443 /* default pts setting is MPEG-like */
2444 av_set_pts_info(st
, 33, 1, 90000);
2445 st
->last_IP_pts
= AV_NOPTS_VALUE
;
2446 for(i
=0; i
<MAX_REORDER_DELAY
+1; i
++)
2447 st
->pts_buffer
[i
]= AV_NOPTS_VALUE
;
2448 st
->reference_dts
= AV_NOPTS_VALUE
;
2450 st
->sample_aspect_ratio
= (AVRational
){0,1};
2452 s
->streams
[s
->nb_streams
++] = st
;
2456 AVProgram
*av_new_program(AVFormatContext
*ac
, int id
)
2458 AVProgram
*program
=NULL
;
2462 av_log(ac
, AV_LOG_DEBUG
, "new_program: id=0x%04x\n", id
);
2465 for(i
=0; i
<ac
->nb_programs
; i
++)
2466 if(ac
->programs
[i
]->id
== id
)
2467 program
= ac
->programs
[i
];
2470 program
= av_mallocz(sizeof(AVProgram
));
2473 dynarray_add(&ac
->programs
, &ac
->nb_programs
, program
);
2474 program
->discard
= AVDISCARD_NONE
;
2481 AVChapter
*ff_new_chapter(AVFormatContext
*s
, int id
, AVRational time_base
, int64_t start
, int64_t end
, const char *title
)
2483 AVChapter
*chapter
= NULL
;
2486 for(i
=0; i
<s
->nb_chapters
; i
++)
2487 if(s
->chapters
[i
]->id
== id
)
2488 chapter
= s
->chapters
[i
];
2491 chapter
= av_mallocz(sizeof(AVChapter
));
2494 dynarray_add(&s
->chapters
, &s
->nb_chapters
, chapter
);
2496 #if LIBAVFORMAT_VERSION_INT < (53<<16)
2497 av_free(chapter
->title
);
2499 av_metadata_set(&chapter
->metadata
, "title", title
);
2501 chapter
->time_base
= time_base
;
2502 chapter
->start
= start
;
2508 /************************************************************/
2509 /* output media file */
2511 int av_set_parameters(AVFormatContext
*s
, AVFormatParameters
*ap
)
2515 if (s
->oformat
->priv_data_size
> 0) {
2516 s
->priv_data
= av_mallocz(s
->oformat
->priv_data_size
);
2518 return AVERROR(ENOMEM
);
2520 s
->priv_data
= NULL
;
2522 if (s
->oformat
->set_parameters
) {
2523 ret
= s
->oformat
->set_parameters(s
, ap
);
2530 int av_write_header(AVFormatContext
*s
)
2535 // some sanity checks
2536 if (s
->nb_streams
== 0) {
2537 av_log(s
, AV_LOG_ERROR
, "no streams\n");
2541 for(i
=0;i
<s
->nb_streams
;i
++) {
2544 switch (st
->codec
->codec_type
) {
2545 case CODEC_TYPE_AUDIO
:
2546 if(st
->codec
->sample_rate
<=0){
2547 av_log(s
, AV_LOG_ERROR
, "sample rate not set\n");
2550 if(!st
->codec
->block_align
)
2551 st
->codec
->block_align
= st
->codec
->channels
*
2552 av_get_bits_per_sample(st
->codec
->codec_id
) >> 3;
2554 case CODEC_TYPE_VIDEO
:
2555 if(st
->codec
->time_base
.num
<=0 || st
->codec
->time_base
.den
<=0){ //FIXME audio too?
2556 av_log(s
, AV_LOG_ERROR
, "time base not set\n");
2559 if((st
->codec
->width
<=0 || st
->codec
->height
<=0) && !(s
->oformat
->flags
& AVFMT_NODIMENSIONS
)){
2560 av_log(s
, AV_LOG_ERROR
, "dimensions not set\n");
2563 if(av_cmp_q(st
->sample_aspect_ratio
, st
->codec
->sample_aspect_ratio
)){
2564 av_log(s
, AV_LOG_ERROR
, "Aspect ratio mismatch between encoder and muxer layer\n");
2570 if(s
->oformat
->codec_tag
){
2571 if(st
->codec
->codec_tag
){
2573 //check that tag + id is in the table
2574 //if neither is in the table -> OK
2575 //if tag is in the table with another id -> FAIL
2576 //if id is in the table with another tag -> FAIL unless strict < ?
2578 st
->codec
->codec_tag
= av_codec_get_tag(s
->oformat
->codec_tag
, st
->codec
->codec_id
);
2581 if(s
->oformat
->flags
& AVFMT_GLOBALHEADER
&&
2582 !(st
->codec
->flags
& CODEC_FLAG_GLOBAL_HEADER
))
2583 av_log(s
, AV_LOG_WARNING
, "Codec for stream %d does not use global headers but container format requires global headers\n", i
);
2586 if (!s
->priv_data
&& s
->oformat
->priv_data_size
> 0) {
2587 s
->priv_data
= av_mallocz(s
->oformat
->priv_data_size
);
2589 return AVERROR(ENOMEM
);
2592 #if LIBAVFORMAT_VERSION_MAJOR < 53
2593 ff_metadata_mux_compat(s
);
2596 /* set muxer identification string */
2597 if (!(s
->streams
[0]->codec
->flags
& CODEC_FLAG_BITEXACT
)) {
2601 if (!(m
= av_mallocz(sizeof(AVMetadata
))))
2602 return AVERROR(ENOMEM
);
2603 av_metadata_set2(&m
, "encoder", LIBAVFORMAT_IDENT
, 0);
2604 metadata_conv(&m
, s
->oformat
->metadata_conv
, NULL
);
2605 if ((t
= av_metadata_get(m
, "", NULL
, AV_METADATA_IGNORE_SUFFIX
)))
2606 av_metadata_set2(&s
->metadata
, t
->key
, t
->value
, 0);
2607 av_metadata_free(&m
);
2610 if(s
->oformat
->write_header
){
2611 ret
= s
->oformat
->write_header(s
);
2616 /* init PTS generation */
2617 for(i
=0;i
<s
->nb_streams
;i
++) {
2618 int64_t den
= AV_NOPTS_VALUE
;
2621 switch (st
->codec
->codec_type
) {
2622 case CODEC_TYPE_AUDIO
:
2623 den
= (int64_t)st
->time_base
.num
* st
->codec
->sample_rate
;
2625 case CODEC_TYPE_VIDEO
:
2626 den
= (int64_t)st
->time_base
.num
* st
->codec
->time_base
.den
;
2631 if (den
!= AV_NOPTS_VALUE
) {
2633 return AVERROR_INVALIDDATA
;
2634 av_frac_init(&st
->pts
, 0, 0, den
);
2640 //FIXME merge with compute_pkt_fields
2641 static int compute_pkt_fields2(AVFormatContext
*s
, AVStream
*st
, AVPacket
*pkt
){
2642 int delay
= FFMAX(st
->codec
->has_b_frames
, !!st
->codec
->max_b_frames
);
2643 int num
, den
, frame_size
, i
;
2645 // av_log(s, 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);
2647 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2650 /* duration field */
2651 if (pkt
->duration
== 0) {
2652 compute_frame_duration(&num
, &den
, st
, NULL
, pkt
);
2654 pkt
->duration
= av_rescale(1, num
* (int64_t)st
->time_base
.den
* st
->codec
->ticks_per_frame
, den
* (int64_t)st
->time_base
.num
);
2658 if(pkt
->pts
== AV_NOPTS_VALUE
&& pkt
->dts
!= AV_NOPTS_VALUE
&& delay
==0)
2661 //XXX/FIXME this is a temporary hack until all encoders output pts
2662 if((pkt
->pts
== 0 || pkt
->pts
== AV_NOPTS_VALUE
) && pkt
->dts
== AV_NOPTS_VALUE
&& !delay
){
2664 // pkt->pts= st->cur_dts;
2665 pkt
->pts
= st
->pts
.val
;
2668 //calculate dts from pts
2669 if(pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
== AV_NOPTS_VALUE
&& delay
<= MAX_REORDER_DELAY
){
2670 st
->pts_buffer
[0]= pkt
->pts
;
2671 for(i
=1; i
<delay
+1 && st
->pts_buffer
[i
] == AV_NOPTS_VALUE
; i
++)
2672 st
->pts_buffer
[i
]= pkt
->pts
+ (i
-delay
-1) * pkt
->duration
;
2673 for(i
=0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+1]; i
++)
2674 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+1]);
2676 pkt
->dts
= st
->pts_buffer
[0];
2679 if(st
->cur_dts
&& st
->cur_dts
!= AV_NOPTS_VALUE
&& st
->cur_dts
>= pkt
->dts
){
2680 av_log(s
, AV_LOG_ERROR
,
2681 "st:%d error, non monotone timestamps %"PRId64
" >= %"PRId64
"\n",
2682 st
->index
, st
->cur_dts
, pkt
->dts
);
2685 if(pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->pts
< pkt
->dts
){
2686 av_log(s
, AV_LOG_ERROR
, "st:%d error, pts < dts\n", st
->index
);
2690 // av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2691 st
->cur_dts
= pkt
->dts
;
2692 st
->pts
.val
= pkt
->dts
;
2695 switch (st
->codec
->codec_type
) {
2696 case CODEC_TYPE_AUDIO
:
2697 frame_size
= get_audio_frame_size(st
->codec
, pkt
->size
);
2699 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2700 likely equal to the encoder delay, but it would be better if we
2701 had the real timestamps from the encoder */
2702 if (frame_size
>= 0 && (pkt
->size
|| st
->pts
.num
!=st
->pts
.den
>>1 || st
->pts
.val
)) {
2703 av_frac_add(&st
->pts
, (int64_t)st
->time_base
.den
* frame_size
);
2706 case CODEC_TYPE_VIDEO
:
2707 av_frac_add(&st
->pts
, (int64_t)st
->time_base
.den
* st
->codec
->time_base
.num
);
2715 int av_write_frame(AVFormatContext
*s
, AVPacket
*pkt
)
2717 int ret
= compute_pkt_fields2(s
, s
->streams
[pkt
->stream_index
], pkt
);
2719 if(ret
<0 && !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2722 ret
= s
->oformat
->write_packet(s
, pkt
);
2724 ret
= url_ferror(s
->pb
);
2728 void ff_interleave_add_packet(AVFormatContext
*s
, AVPacket
*pkt
,
2729 int (*compare
)(AVFormatContext
*, AVPacket
*, AVPacket
*))
2731 AVPacketList
**next_point
, *this_pktl
;
2733 this_pktl
= av_mallocz(sizeof(AVPacketList
));
2734 this_pktl
->pkt
= *pkt
;
2735 pkt
->destruct
= NULL
; // do not free original but only the copy
2736 av_dup_packet(&this_pktl
->pkt
); // duplicate the packet if it uses non-alloced memory
2738 if(s
->streams
[pkt
->stream_index
]->last_in_packet_buffer
){
2739 next_point
= &(s
->streams
[pkt
->stream_index
]->last_in_packet_buffer
->next
);
2741 next_point
= &s
->packet_buffer
;
2744 if(compare(s
, &s
->packet_buffer_end
->pkt
, pkt
)){
2745 while(!compare(s
, &(*next_point
)->pkt
, pkt
)){
2746 next_point
= &(*next_point
)->next
;
2750 next_point
= &(s
->packet_buffer_end
->next
);
2753 assert(!*next_point
);
2755 s
->packet_buffer_end
= this_pktl
;
2758 this_pktl
->next
= *next_point
;
2760 s
->streams
[pkt
->stream_index
]->last_in_packet_buffer
=
2761 *next_point
= this_pktl
;
2764 int ff_interleave_compare_dts(AVFormatContext
*s
, AVPacket
*next
, AVPacket
*pkt
)
2766 AVStream
*st
= s
->streams
[ pkt
->stream_index
];
2767 AVStream
*st2
= s
->streams
[ next
->stream_index
];
2768 int64_t a
= st2
->time_base
.num
* (int64_t)st
->time_base
.den
;
2769 int64_t b
= st
->time_base
.num
* (int64_t)st2
->time_base
.den
;
2770 return av_rescale_rnd(pkt
->dts
, b
, a
, AV_ROUND_DOWN
) < next
->dts
;
2773 int av_interleave_packet_per_dts(AVFormatContext
*s
, AVPacket
*out
, AVPacket
*pkt
, int flush
){
2779 ff_interleave_add_packet(s
, pkt
, ff_interleave_compare_dts
);
2782 for(i
=0; i
< s
->nb_streams
; i
++)
2783 stream_count
+= !!s
->streams
[i
]->last_in_packet_buffer
;
2785 if(stream_count
&& (s
->nb_streams
== stream_count
|| flush
)){
2786 pktl
= s
->packet_buffer
;
2789 s
->packet_buffer
= pktl
->next
;
2790 if(!s
->packet_buffer
)
2791 s
->packet_buffer_end
= NULL
;
2793 if(s
->streams
[out
->stream_index
]->last_in_packet_buffer
== pktl
)
2794 s
->streams
[out
->stream_index
]->last_in_packet_buffer
= NULL
;
2798 av_init_packet(out
);
2804 * Interleaves an AVPacket correctly so it can be muxed.
2805 * @param out the interleaved packet will be output here
2806 * @param in the input packet
2807 * @param flush 1 if no further packets are available as input and all
2808 * remaining packets should be output
2809 * @return 1 if a packet was output, 0 if no packet could be output,
2810 * < 0 if an error occurred
2812 static int av_interleave_packet(AVFormatContext
*s
, AVPacket
*out
, AVPacket
*in
, int flush
){
2813 if(s
->oformat
->interleave_packet
)
2814 return s
->oformat
->interleave_packet(s
, out
, in
, flush
);
2816 return av_interleave_packet_per_dts(s
, out
, in
, flush
);
2819 int av_interleaved_write_frame(AVFormatContext
*s
, AVPacket
*pkt
){
2820 AVStream
*st
= s
->streams
[ pkt
->stream_index
];
2822 //FIXME/XXX/HACK drop zero sized packets
2823 if(st
->codec
->codec_type
== CODEC_TYPE_AUDIO
&& pkt
->size
==0)
2826 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2827 if(compute_pkt_fields2(s
, st
, pkt
) < 0 && !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2830 if(pkt
->dts
== AV_NOPTS_VALUE
&& !(s
->oformat
->flags
& AVFMT_NOTIMESTAMPS
))
2835 int ret
= av_interleave_packet(s
, &opkt
, pkt
, 0);
2836 if(ret
<=0) //FIXME cleanup needed for ret<0 ?
2839 ret
= s
->oformat
->write_packet(s
, &opkt
);
2841 av_free_packet(&opkt
);
2846 if(url_ferror(s
->pb
))
2847 return url_ferror(s
->pb
);
2851 int av_write_trailer(AVFormatContext
*s
)
2857 ret
= av_interleave_packet(s
, &pkt
, NULL
, 1);
2858 if(ret
<0) //FIXME cleanup needed for ret<0 ?
2863 ret
= s
->oformat
->write_packet(s
, &pkt
);
2865 av_free_packet(&pkt
);
2869 if(url_ferror(s
->pb
))
2873 if(s
->oformat
->write_trailer
)
2874 ret
= s
->oformat
->write_trailer(s
);
2877 ret
=url_ferror(s
->pb
);
2878 for(i
=0;i
<s
->nb_streams
;i
++) {
2879 av_freep(&s
->streams
[i
]->priv_data
);
2880 av_freep(&s
->streams
[i
]->index_entries
);
2882 av_freep(&s
->priv_data
);
2886 void av_program_add_stream_index(AVFormatContext
*ac
, int progid
, unsigned int idx
)
2889 AVProgram
*program
=NULL
;
2892 if (idx
>= ac
->nb_streams
) {
2893 av_log(ac
, AV_LOG_ERROR
, "stream index %d is not valid\n", idx
);
2897 for(i
=0; i
<ac
->nb_programs
; i
++){
2898 if(ac
->programs
[i
]->id
!= progid
)
2900 program
= ac
->programs
[i
];
2901 for(j
=0; j
<program
->nb_stream_indexes
; j
++)
2902 if(program
->stream_index
[j
] == idx
)
2905 tmp
= av_realloc(program
->stream_index
, sizeof(unsigned int)*(program
->nb_stream_indexes
+1));
2908 program
->stream_index
= tmp
;
2909 program
->stream_index
[program
->nb_stream_indexes
++] = idx
;
2914 static void print_fps(double d
, const char *postfix
){
2915 uint64_t v
= lrintf(d
*100);
2916 if (v
% 100 ) av_log(NULL
, AV_LOG_INFO
, ", %3.2f %s", d
, postfix
);
2917 else if(v
%(100*1000)) av_log(NULL
, AV_LOG_INFO
, ", %1.0f %s", d
, postfix
);
2918 else av_log(NULL
, AV_LOG_INFO
, ", %1.0fk %s", d
/1000, postfix
);
2921 static void dump_metadata(void *ctx
, AVMetadata
*m
, const char *indent
)
2923 if(m
&& !(m
->count
== 1 && av_metadata_get(m
, "language", NULL
, 0))){
2924 AVMetadataTag
*tag
=NULL
;
2926 av_log(ctx
, AV_LOG_INFO
, "%sMetadata:\n", indent
);
2927 while((tag
=av_metadata_get(m
, "", tag
, AV_METADATA_IGNORE_SUFFIX
))) {
2928 if(strcmp("language", tag
->key
))
2929 av_log(ctx
, AV_LOG_INFO
, "%s %-16s: %s\n", indent
, tag
->key
, tag
->value
);
2934 /* "user interface" functions */
2935 static void dump_stream_format(AVFormatContext
*ic
, int i
, int index
, int is_output
)
2938 int flags
= (is_output ? ic
->oformat
->flags
: ic
->iformat
->flags
);
2939 AVStream
*st
= ic
->streams
[i
];
2940 int g
= av_gcd(st
->time_base
.num
, st
->time_base
.den
);
2941 AVMetadataTag
*lang
= av_metadata_get(st
->metadata
, "language", NULL
, 0);
2942 avcodec_string(buf
, sizeof(buf
), st
->codec
, is_output
);
2943 av_log(NULL
, AV_LOG_INFO
, " Stream #%d.%d", index
, i
);
2944 /* the pid is an important information, so we display it */
2945 /* XXX: add a generic system */
2946 if (flags
& AVFMT_SHOW_IDS
)
2947 av_log(NULL
, AV_LOG_INFO
, "[0x%x]", st
->id
);
2949 av_log(NULL
, AV_LOG_INFO
, "(%s)", lang
->value
);
2950 av_log(NULL
, AV_LOG_DEBUG
, ", %d, %d/%d", st
->codec_info_nb_frames
, st
->time_base
.num
/g
, st
->time_base
.den
/g
);
2951 av_log(NULL
, AV_LOG_INFO
, ": %s", buf
);
2952 if (st
->sample_aspect_ratio
.num
&& // default
2953 av_cmp_q(st
->sample_aspect_ratio
, st
->codec
->sample_aspect_ratio
)) {
2954 AVRational display_aspect_ratio
;
2955 av_reduce(&display_aspect_ratio
.num
, &display_aspect_ratio
.den
,
2956 st
->codec
->width
*st
->sample_aspect_ratio
.num
,
2957 st
->codec
->height
*st
->sample_aspect_ratio
.den
,
2959 av_log(NULL
, AV_LOG_INFO
, ", PAR %d:%d DAR %d:%d",
2960 st
->sample_aspect_ratio
.num
, st
->sample_aspect_ratio
.den
,
2961 display_aspect_ratio
.num
, display_aspect_ratio
.den
);
2963 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
){
2964 if(st
->avg_frame_rate
.den
&& st
->avg_frame_rate
.num
)
2965 print_fps(av_q2d(st
->avg_frame_rate
), "fps");
2966 if(st
->r_frame_rate
.den
&& st
->r_frame_rate
.num
)
2967 print_fps(av_q2d(st
->r_frame_rate
), "tbr");
2968 if(st
->time_base
.den
&& st
->time_base
.num
)
2969 print_fps(1/av_q2d(st
->time_base
), "tbn");
2970 if(st
->codec
->time_base
.den
&& st
->codec
->time_base
.num
)
2971 print_fps(1/av_q2d(st
->codec
->time_base
), "tbc");
2973 av_log(NULL
, AV_LOG_INFO
, "\n");
2974 dump_metadata(NULL
, st
->metadata
, " ");
2977 void dump_format(AVFormatContext
*ic
,
2983 uint8_t *printed
= av_mallocz(ic
->nb_streams
);
2984 if (ic
->nb_streams
&& !printed
)
2987 av_log(NULL
, AV_LOG_INFO
, "%s #%d, %s, %s '%s':\n",
2988 is_output ?
"Output" : "Input",
2990 is_output ? ic
->oformat
->name
: ic
->iformat
->name
,
2991 is_output ?
"to" : "from", url
);
2992 dump_metadata(NULL
, ic
->metadata
, " ");
2994 av_log(NULL
, AV_LOG_INFO
, " Duration: ");
2995 if (ic
->duration
!= AV_NOPTS_VALUE
) {
2996 int hours
, mins
, secs
, us
;
2997 secs
= ic
->duration
/ AV_TIME_BASE
;
2998 us
= ic
->duration
% AV_TIME_BASE
;
3003 av_log(NULL
, AV_LOG_INFO
, "%02d:%02d:%02d.%02d", hours
, mins
, secs
,
3004 (100 * us
) / AV_TIME_BASE
);
3006 av_log(NULL
, AV_LOG_INFO
, "N/A");
3008 if (ic
->start_time
!= AV_NOPTS_VALUE
) {
3010 av_log(NULL
, AV_LOG_INFO
, ", start: ");
3011 secs
= ic
->start_time
/ AV_TIME_BASE
;
3012 us
= ic
->start_time
% AV_TIME_BASE
;
3013 av_log(NULL
, AV_LOG_INFO
, "%d.%06d",
3014 secs
, (int)av_rescale(us
, 1000000, AV_TIME_BASE
));
3016 av_log(NULL
, AV_LOG_INFO
, ", bitrate: ");
3018 av_log(NULL
, AV_LOG_INFO
,"%d kb/s", ic
->bit_rate
/ 1000);
3020 av_log(NULL
, AV_LOG_INFO
, "N/A");
3022 av_log(NULL
, AV_LOG_INFO
, "\n");
3024 for (i
= 0; i
< ic
->nb_chapters
; i
++) {
3025 AVChapter
*ch
= ic
->chapters
[i
];
3026 av_log(NULL
, AV_LOG_INFO
, " Chapter #%d.%d: ", index
, i
);
3027 av_log(NULL
, AV_LOG_INFO
, "start %f, ", ch
->start
* av_q2d(ch
->time_base
));
3028 av_log(NULL
, AV_LOG_INFO
, "end %f\n", ch
->end
* av_q2d(ch
->time_base
));
3030 dump_metadata(NULL
, ch
->metadata
, " ");
3032 if(ic
->nb_programs
) {
3033 int j
, k
, total
= 0;
3034 for(j
=0; j
<ic
->nb_programs
; j
++) {
3035 AVMetadataTag
*name
= av_metadata_get(ic
->programs
[j
]->metadata
,
3037 av_log(NULL
, AV_LOG_INFO
, " Program %d %s\n", ic
->programs
[j
]->id
,
3038 name ? name
->value
: "");
3039 dump_metadata(NULL
, ic
->programs
[j
]->metadata
, " ");
3040 for(k
=0; k
<ic
->programs
[j
]->nb_stream_indexes
; k
++) {
3041 dump_stream_format(ic
, ic
->programs
[j
]->stream_index
[k
], index
, is_output
);
3042 printed
[ic
->programs
[j
]->stream_index
[k
]] = 1;
3044 total
+= ic
->programs
[j
]->nb_stream_indexes
;
3046 if (total
< ic
->nb_streams
)
3047 av_log(NULL
, AV_LOG_INFO
, " No Program\n");
3049 for(i
=0;i
<ic
->nb_streams
;i
++)
3051 dump_stream_format(ic
, i
, index
, is_output
);
3056 #if LIBAVFORMAT_VERSION_MAJOR < 53
3057 int parse_image_size(int *width_ptr
, int *height_ptr
, const char *str
)
3059 return av_parse_video_frame_size(width_ptr
, height_ptr
, str
);
3062 int parse_frame_rate(int *frame_rate_num
, int *frame_rate_den
, const char *arg
)
3064 AVRational frame_rate
;
3065 int ret
= av_parse_video_frame_rate(&frame_rate
, arg
);
3066 *frame_rate_num
= frame_rate
.num
;
3067 *frame_rate_den
= frame_rate
.den
;
3072 int64_t av_gettime(void)
3075 gettimeofday(&tv
,NULL
);
3076 return (int64_t)tv
.tv_sec
* 1000000 + tv
.tv_usec
;
3079 int64_t parse_date(const char *datestr
, int duration
)
3085 static const char * const date_fmt
[] = {
3089 static const char * const time_fmt
[] = {
3099 time_t now
= time(0);
3101 len
= strlen(datestr
);