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
27 #include "libavutil/avassert.h"
28 #include "libavutil/avstring.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/internal.h"
31 #include "libavutil/mathematics.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/parseutils.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/time.h"
36 #include "libavutil/time_internal.h"
37 #include "libavutil/timestamp.h"
39 #include "libavcodec/bytestream.h"
40 #include "libavcodec/internal.h"
41 #include "libavcodec/raw.h"
43 #include "audiointerleave.h"
45 #include "avio_internal.h"
55 #include "libavutil/ffversion.h"
56 const char av_format_ffversion
[] = "FFmpeg version " FFMPEG_VERSION
;
60 * various utility functions for use within FFmpeg
63 unsigned avformat_version(void)
65 av_assert0(LIBAVFORMAT_VERSION_MICRO
>= 100);
66 return LIBAVFORMAT_VERSION_INT
;
69 const char *avformat_configuration(void)
71 return FFMPEG_CONFIGURATION
;
74 const char *avformat_license(void)
76 #define LICENSE_PREFIX "libavformat license: "
77 return LICENSE_PREFIX FFMPEG_LICENSE
+ sizeof(LICENSE_PREFIX
) - 1;
80 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
82 static int is_relative(int64_t ts
) {
83 return ts
> (RELATIVE_TS_BASE
- (1LL<<48));
87 * Wrap a given time stamp, if there is an indication for an overflow
90 * @param timestamp the time stamp to wrap
91 * @return resulting time stamp
93 static int64_t wrap_timestamp(const AVStream
*st
, int64_t timestamp
)
95 if (st
->pts_wrap_behavior
!= AV_PTS_WRAP_IGNORE
&&
96 st
->pts_wrap_reference
!= AV_NOPTS_VALUE
&& timestamp
!= AV_NOPTS_VALUE
) {
97 if (st
->pts_wrap_behavior
== AV_PTS_WRAP_ADD_OFFSET
&&
98 timestamp
< st
->pts_wrap_reference
)
99 return timestamp
+ (1ULL << st
->pts_wrap_bits
);
100 else if (st
->pts_wrap_behavior
== AV_PTS_WRAP_SUB_OFFSET
&&
101 timestamp
>= st
->pts_wrap_reference
)
102 return timestamp
- (1ULL << st
->pts_wrap_bits
);
107 MAKE_ACCESSORS(AVStream
, stream
, AVRational
, r_frame_rate
)
108 MAKE_ACCESSORS(AVStream
, stream
, char *, recommended_encoder_configuration
)
109 MAKE_ACCESSORS(AVFormatContext
, format
, AVCodec
*, video_codec
)
110 MAKE_ACCESSORS(AVFormatContext
, format
, AVCodec
*, audio_codec
)
111 MAKE_ACCESSORS(AVFormatContext
, format
, AVCodec
*, subtitle_codec
)
112 MAKE_ACCESSORS(AVFormatContext
, format
, AVCodec
*, data_codec
)
113 MAKE_ACCESSORS(AVFormatContext
, format
, int, metadata_header_padding
)
114 MAKE_ACCESSORS(AVFormatContext
, format
, void *, opaque
)
115 MAKE_ACCESSORS(AVFormatContext
, format
, av_format_control_message
, control_message_cb
)
116 #if FF_API_OLD_OPEN_CALLBACKS
117 FF_DISABLE_DEPRECATION_WARNINGS
118 MAKE_ACCESSORS(AVFormatContext
, format
, AVOpenCallback
, open_cb
)
119 FF_ENABLE_DEPRECATION_WARNINGS
122 int64_t av_stream_get_end_pts(const AVStream
*st
)
125 return st
->priv_pts
->val
;
127 return AV_NOPTS_VALUE
;
130 struct AVCodecParserContext
*av_stream_get_parser(const AVStream
*st
)
135 void av_format_inject_global_side_data(AVFormatContext
*s
)
138 s
->internal
->inject_global_side_data
= 1;
139 for (i
= 0; i
< s
->nb_streams
; i
++) {
140 AVStream
*st
= s
->streams
[i
];
141 st
->inject_global_side_data
= 1;
145 int ff_copy_whiteblacklists(AVFormatContext
*dst
, const AVFormatContext
*src
)
147 av_assert0(!dst
->codec_whitelist
&&
148 !dst
->format_whitelist
&&
149 !dst
->protocol_whitelist
&&
150 !dst
->protocol_blacklist
);
151 dst
-> codec_whitelist
= av_strdup(src
->codec_whitelist
);
152 dst
->format_whitelist
= av_strdup(src
->format_whitelist
);
153 dst
->protocol_whitelist
= av_strdup(src
->protocol_whitelist
);
154 dst
->protocol_blacklist
= av_strdup(src
->protocol_blacklist
);
155 if ( (src
-> codec_whitelist
&& !dst
-> codec_whitelist
)
156 || (src
-> format_whitelist
&& !dst
-> format_whitelist
)
157 || (src
->protocol_whitelist
&& !dst
->protocol_whitelist
)
158 || (src
->protocol_blacklist
&& !dst
->protocol_blacklist
)) {
159 av_log(dst
, AV_LOG_ERROR
, "Failed to duplicate black/whitelist\n");
160 return AVERROR(ENOMEM
);
165 static const AVCodec
*find_decoder(AVFormatContext
*s
, const AVStream
*st
, enum AVCodecID codec_id
)
167 #if FF_API_LAVF_AVCTX
168 FF_DISABLE_DEPRECATION_WARNINGS
169 if (st
->codec
->codec
)
170 return st
->codec
->codec
;
171 FF_ENABLE_DEPRECATION_WARNINGS
174 switch (st
->codecpar
->codec_type
) {
175 case AVMEDIA_TYPE_VIDEO
:
176 if (s
->video_codec
) return s
->video_codec
;
178 case AVMEDIA_TYPE_AUDIO
:
179 if (s
->audio_codec
) return s
->audio_codec
;
181 case AVMEDIA_TYPE_SUBTITLE
:
182 if (s
->subtitle_codec
) return s
->subtitle_codec
;
186 return avcodec_find_decoder(codec_id
);
189 static const AVCodec
*find_probe_decoder(AVFormatContext
*s
, const AVStream
*st
, enum AVCodecID codec_id
)
191 const AVCodec
*codec
;
193 #if CONFIG_H264_DECODER
194 /* Other parts of the code assume this decoder to be used for h264,
195 * so force it if possible. */
196 if (codec_id
== AV_CODEC_ID_H264
)
197 return avcodec_find_decoder_by_name("h264");
200 codec
= find_decoder(s
, st
, codec_id
);
204 if (codec
->capabilities
& AV_CODEC_CAP_AVOID_PROBING
) {
205 const AVCodec
*probe_codec
= NULL
;
206 while (probe_codec
= av_codec_next(probe_codec
)) {
207 if (probe_codec
->id
== codec_id
&&
208 av_codec_is_decoder(probe_codec
) &&
209 !(probe_codec
->capabilities
& (AV_CODEC_CAP_AVOID_PROBING
| AV_CODEC_CAP_EXPERIMENTAL
))) {
218 int av_format_get_probe_score(const AVFormatContext
*s
)
220 return s
->probe_score
;
223 /* an arbitrarily chosen "sane" max packet size -- 50M */
224 #define SANE_CHUNK_SIZE (50000000)
226 int ffio_limit(AVIOContext
*s
, int size
)
228 if (s
->maxsize
>= 0) {
229 int64_t pos
= avio_tell(s
);
230 int64_t remaining
= s
->maxsize
- pos
;
231 if (remaining
< size
) {
232 int64_t newsize
= avio_size(s
);
233 if (!s
->maxsize
|| s
->maxsize
<newsize
)
234 s
->maxsize
= newsize
- !newsize
;
235 if (pos
> s
->maxsize
&& s
->maxsize
>= 0)
236 s
->maxsize
= AVERROR(EIO
);
238 remaining
= s
->maxsize
- pos
;
241 if (s
->maxsize
>= 0 && remaining
+1 < size
) {
242 av_log(NULL
, remaining
? AV_LOG_ERROR
: AV_LOG_DEBUG
, "Truncating packet of size %d to %"PRId64
"\n", size
, remaining
+1);
249 /* Read the data in sane-sized chunks and append to pkt.
250 * Return the number of bytes read or an error. */
251 static int append_packet_chunked(AVIOContext
*s
, AVPacket
*pkt
, int size
)
253 int64_t orig_pos
= pkt
->pos
; // av_grow_packet might reset pos
254 int orig_size
= pkt
->size
;
258 int prev_size
= pkt
->size
;
261 /* When the caller requests a lot of data, limit it to the amount
262 * left in file or SANE_CHUNK_SIZE when it is not known. */
264 if (read_size
> SANE_CHUNK_SIZE
/10) {
265 read_size
= ffio_limit(s
, read_size
);
266 // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
268 read_size
= FFMIN(read_size
, SANE_CHUNK_SIZE
);
271 ret
= av_grow_packet(pkt
, read_size
);
275 ret
= avio_read(s
, pkt
->data
+ prev_size
, read_size
);
276 if (ret
!= read_size
) {
277 av_shrink_packet(pkt
, prev_size
+ FFMAX(ret
, 0));
284 pkt
->flags
|= AV_PKT_FLAG_CORRUPT
;
288 av_packet_unref(pkt
);
289 return pkt
->size
> orig_size
? pkt
->size
- orig_size
: ret
;
292 int av_get_packet(AVIOContext
*s
, AVPacket
*pkt
, int size
)
297 pkt
->pos
= avio_tell(s
);
299 return append_packet_chunked(s
, pkt
, size
);
302 int av_append_packet(AVIOContext
*s
, AVPacket
*pkt
, int size
)
305 return av_get_packet(s
, pkt
, size
);
306 return append_packet_chunked(s
, pkt
, size
);
309 int av_filename_number_test(const char *filename
)
313 (av_get_frame_filename(buf
, sizeof(buf
), filename
, 1) >= 0);
316 static int set_codec_from_probe_data(AVFormatContext
*s
, AVStream
*st
,
319 static const struct {
322 enum AVMediaType type
;
324 { "aac", AV_CODEC_ID_AAC
, AVMEDIA_TYPE_AUDIO
},
325 { "ac3", AV_CODEC_ID_AC3
, AVMEDIA_TYPE_AUDIO
},
326 { "dts", AV_CODEC_ID_DTS
, AVMEDIA_TYPE_AUDIO
},
327 { "dvbsub", AV_CODEC_ID_DVB_SUBTITLE
,AVMEDIA_TYPE_SUBTITLE
},
328 { "dvbtxt", AV_CODEC_ID_DVB_TELETEXT
,AVMEDIA_TYPE_SUBTITLE
},
329 { "eac3", AV_CODEC_ID_EAC3
, AVMEDIA_TYPE_AUDIO
},
330 { "h264", AV_CODEC_ID_H264
, AVMEDIA_TYPE_VIDEO
},
331 { "hevc", AV_CODEC_ID_HEVC
, AVMEDIA_TYPE_VIDEO
},
332 { "loas", AV_CODEC_ID_AAC_LATM
, AVMEDIA_TYPE_AUDIO
},
333 { "m4v", AV_CODEC_ID_MPEG4
, AVMEDIA_TYPE_VIDEO
},
334 { "mp3", AV_CODEC_ID_MP3
, AVMEDIA_TYPE_AUDIO
},
335 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO
, AVMEDIA_TYPE_VIDEO
},
336 { "truehd", AV_CODEC_ID_TRUEHD
, AVMEDIA_TYPE_AUDIO
},
340 AVInputFormat
*fmt
= av_probe_input_format3(pd
, 1, &score
);
344 av_log(s
, AV_LOG_DEBUG
,
345 "Probe with size=%d, packets=%d detected %s with score=%d\n",
346 pd
->buf_size
, MAX_PROBE_PACKETS
- st
->probe_packets
,
348 for (i
= 0; fmt_id_type
[i
].name
; i
++) {
349 if (!strcmp(fmt
->name
, fmt_id_type
[i
].name
)) {
350 if (fmt_id_type
[i
].type
!= AVMEDIA_TYPE_AUDIO
&&
351 st
->codecpar
->sample_rate
)
353 if (st
->request_probe
> score
&&
354 st
->codecpar
->codec_id
!= fmt_id_type
[i
].id
)
356 st
->codecpar
->codec_id
= fmt_id_type
[i
].id
;
357 st
->codecpar
->codec_type
= fmt_id_type
[i
].type
;
358 st
->internal
->need_context_update
= 1;
359 #if FF_API_LAVF_AVCTX
360 FF_DISABLE_DEPRECATION_WARNINGS
361 st
->codec
->codec_type
= st
->codecpar
->codec_type
;
362 st
->codec
->codec_id
= st
->codecpar
->codec_id
;
363 FF_ENABLE_DEPRECATION_WARNINGS
372 /************************************************************/
373 /* input media file */
375 int av_demuxer_open(AVFormatContext
*ic
) {
378 if (ic
->format_whitelist
&& av_match_list(ic
->iformat
->name
, ic
->format_whitelist
, ',') <= 0) {
379 av_log(ic
, AV_LOG_ERROR
, "Format not on whitelist \'%s\'\n", ic
->format_whitelist
);
380 return AVERROR(EINVAL
);
383 if (ic
->iformat
->read_header
) {
384 err
= ic
->iformat
->read_header(ic
);
389 if (ic
->pb
&& !ic
->internal
->data_offset
)
390 ic
->internal
->data_offset
= avio_tell(ic
->pb
);
395 /* Open input file and probe the format if necessary. */
396 static int init_input(AVFormatContext
*s
, const char *filename
,
397 AVDictionary
**options
)
400 AVProbeData pd
= { filename
, NULL
, 0 };
401 int score
= AVPROBE_SCORE_RETRY
;
404 s
->flags
|= AVFMT_FLAG_CUSTOM_IO
;
406 return av_probe_input_buffer2(s
->pb
, &s
->iformat
, filename
,
407 s
, 0, s
->format_probesize
);
408 else if (s
->iformat
->flags
& AVFMT_NOFILE
)
409 av_log(s
, AV_LOG_WARNING
, "Custom AVIOContext makes no sense and "
410 "will be ignored with AVFMT_NOFILE format.\n");
414 if ((s
->iformat
&& s
->iformat
->flags
& AVFMT_NOFILE
) ||
415 (!s
->iformat
&& (s
->iformat
= av_probe_input_format2(&pd
, 0, &score
))))
418 if ((ret
= s
->io_open(s
, &s
->pb
, filename
, AVIO_FLAG_READ
| s
->avio_flags
, options
)) < 0)
423 return av_probe_input_buffer2(s
->pb
, &s
->iformat
, filename
,
424 s
, 0, s
->format_probesize
);
427 static int add_to_pktbuf(AVPacketList
**packet_buffer
, AVPacket
*pkt
,
428 AVPacketList
**plast_pktl
, int ref
)
430 AVPacketList
*pktl
= av_mallocz(sizeof(AVPacketList
));
434 return AVERROR(ENOMEM
);
437 if ((ret
= av_packet_ref(&pktl
->pkt
, pkt
)) < 0) {
446 (*plast_pktl
)->next
= pktl
;
448 *packet_buffer
= pktl
;
450 /* Add the packet in the buffered packet list. */
455 int avformat_queue_attached_pictures(AVFormatContext
*s
)
458 for (i
= 0; i
< s
->nb_streams
; i
++)
459 if (s
->streams
[i
]->disposition
& AV_DISPOSITION_ATTACHED_PIC
&&
460 s
->streams
[i
]->discard
< AVDISCARD_ALL
) {
461 if (s
->streams
[i
]->attached_pic
.size
<= 0) {
462 av_log(s
, AV_LOG_WARNING
,
463 "Attached picture on stream %d has invalid size, "
468 ret
= add_to_pktbuf(&s
->internal
->raw_packet_buffer
,
469 &s
->streams
[i
]->attached_pic
,
470 &s
->internal
->raw_packet_buffer_end
, 1);
477 static int update_stream_avctx(AVFormatContext
*s
)
480 for (i
= 0; i
< s
->nb_streams
; i
++) {
481 AVStream
*st
= s
->streams
[i
];
483 if (!st
->internal
->need_context_update
)
486 /* close parser, because it depends on the codec */
487 if (st
->parser
&& st
->internal
->avctx
->codec_id
!= st
->codecpar
->codec_id
) {
488 av_parser_close(st
->parser
);
492 /* update internal codec context, for the parser */
493 ret
= avcodec_parameters_to_context(st
->internal
->avctx
, st
->codecpar
);
497 #if FF_API_LAVF_AVCTX
498 FF_DISABLE_DEPRECATION_WARNINGS
499 /* update deprecated public codec context */
500 ret
= avcodec_parameters_to_context(st
->codec
, st
->codecpar
);
503 FF_ENABLE_DEPRECATION_WARNINGS
506 st
->internal
->need_context_update
= 0;
512 int avformat_open_input(AVFormatContext
**ps
, const char *filename
,
513 AVInputFormat
*fmt
, AVDictionary
**options
)
515 AVFormatContext
*s
= *ps
;
517 AVDictionary
*tmp
= NULL
;
518 ID3v2ExtraMeta
*id3v2_extra_meta
= NULL
;
520 if (!s
&& !(s
= avformat_alloc_context()))
521 return AVERROR(ENOMEM
);
523 av_log(NULL
, AV_LOG_ERROR
, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
524 return AVERROR(EINVAL
);
530 av_dict_copy(&tmp
, *options
, 0);
532 if (s
->pb
) // must be before any goto fail
533 s
->flags
|= AVFMT_FLAG_CUSTOM_IO
;
535 if ((ret
= av_opt_set_dict(s
, &tmp
)) < 0)
538 av_strlcpy(s
->filename
, filename
? filename
: "", sizeof(s
->filename
));
539 if ((ret
= init_input(s
, filename
, &tmp
)) < 0)
541 s
->probe_score
= ret
;
543 if (!s
->protocol_whitelist
&& s
->pb
&& s
->pb
->protocol_whitelist
) {
544 s
->protocol_whitelist
= av_strdup(s
->pb
->protocol_whitelist
);
545 if (!s
->protocol_whitelist
) {
546 ret
= AVERROR(ENOMEM
);
551 if (!s
->protocol_blacklist
&& s
->pb
&& s
->pb
->protocol_blacklist
) {
552 s
->protocol_blacklist
= av_strdup(s
->pb
->protocol_blacklist
);
553 if (!s
->protocol_blacklist
) {
554 ret
= AVERROR(ENOMEM
);
559 if (s
->format_whitelist
&& av_match_list(s
->iformat
->name
, s
->format_whitelist
, ',') <= 0) {
560 av_log(s
, AV_LOG_ERROR
, "Format not on whitelist \'%s\'\n", s
->format_whitelist
);
561 ret
= AVERROR(EINVAL
);
565 avio_skip(s
->pb
, s
->skip_initial_bytes
);
567 /* Check filename in case an image number is expected. */
568 if (s
->iformat
->flags
& AVFMT_NEEDNUMBER
) {
569 if (!av_filename_number_test(filename
)) {
570 ret
= AVERROR(EINVAL
);
575 s
->duration
= s
->start_time
= AV_NOPTS_VALUE
;
577 /* Allocate private data. */
578 if (s
->iformat
->priv_data_size
> 0) {
579 if (!(s
->priv_data
= av_mallocz(s
->iformat
->priv_data_size
))) {
580 ret
= AVERROR(ENOMEM
);
583 if (s
->iformat
->priv_class
) {
584 *(const AVClass
**) s
->priv_data
= s
->iformat
->priv_class
;
585 av_opt_set_defaults(s
->priv_data
);
586 if ((ret
= av_opt_set_dict(s
->priv_data
, &tmp
)) < 0)
591 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
593 ff_id3v2_read(s
, ID3v2_DEFAULT_MAGIC
, &id3v2_extra_meta
, 0);
595 if (!(s
->flags
&AVFMT_FLAG_PRIV_OPT
) && s
->iformat
->read_header
)
596 if ((ret
= s
->iformat
->read_header(s
)) < 0)
599 if (id3v2_extra_meta
) {
600 if (!strcmp(s
->iformat
->name
, "mp3") || !strcmp(s
->iformat
->name
, "aac") ||
601 !strcmp(s
->iformat
->name
, "tta")) {
602 if ((ret
= ff_id3v2_parse_apic(s
, &id3v2_extra_meta
)) < 0)
605 av_log(s
, AV_LOG_DEBUG
, "demuxer does not support additional id3 data, skipping\n");
607 ff_id3v2_free_extra_meta(&id3v2_extra_meta
);
609 if ((ret
= avformat_queue_attached_pictures(s
)) < 0)
612 if (!(s
->flags
&AVFMT_FLAG_PRIV_OPT
) && s
->pb
&& !s
->internal
->data_offset
)
613 s
->internal
->data_offset
= avio_tell(s
->pb
);
615 s
->internal
->raw_packet_buffer_remaining_size
= RAW_PACKET_BUFFER_SIZE
;
617 update_stream_avctx(s
);
619 for (i
= 0; i
< s
->nb_streams
; i
++)
620 s
->streams
[i
]->internal
->orig_codec_id
= s
->streams
[i
]->codecpar
->codec_id
;
623 av_dict_free(options
);
630 if (s
->iformat
->read_close
)
631 s
->iformat
->read_close(s
);
633 ff_id3v2_free_extra_meta(&id3v2_extra_meta
);
635 if (s
->pb
&& !(s
->flags
& AVFMT_FLAG_CUSTOM_IO
))
637 avformat_free_context(s
);
642 /*******************************************************/
644 static void force_codec_ids(AVFormatContext
*s
, AVStream
*st
)
646 switch (st
->codecpar
->codec_type
) {
647 case AVMEDIA_TYPE_VIDEO
:
648 if (s
->video_codec_id
)
649 st
->codecpar
->codec_id
= s
->video_codec_id
;
651 case AVMEDIA_TYPE_AUDIO
:
652 if (s
->audio_codec_id
)
653 st
->codecpar
->codec_id
= s
->audio_codec_id
;
655 case AVMEDIA_TYPE_SUBTITLE
:
656 if (s
->subtitle_codec_id
)
657 st
->codecpar
->codec_id
= s
->subtitle_codec_id
;
659 case AVMEDIA_TYPE_DATA
:
660 if (s
->data_codec_id
)
661 st
->codecpar
->codec_id
= s
->data_codec_id
;
666 static int probe_codec(AVFormatContext
*s
, AVStream
*st
, const AVPacket
*pkt
)
668 if (st
->request_probe
>0) {
669 AVProbeData
*pd
= &st
->probe_data
;
671 av_log(s
, AV_LOG_DEBUG
, "probing stream %d pp:%d\n", st
->index
, st
->probe_packets
);
675 uint8_t *new_buf
= av_realloc(pd
->buf
, pd
->buf_size
+pkt
->size
+AVPROBE_PADDING_SIZE
);
677 av_log(s
, AV_LOG_WARNING
,
678 "Failed to reallocate probe buffer for stream %d\n",
683 memcpy(pd
->buf
+ pd
->buf_size
, pkt
->data
, pkt
->size
);
684 pd
->buf_size
+= pkt
->size
;
685 memset(pd
->buf
+ pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
688 st
->probe_packets
= 0;
690 av_log(s
, AV_LOG_WARNING
,
691 "nothing to probe for stream %d\n", st
->index
);
695 end
= s
->internal
->raw_packet_buffer_remaining_size
<= 0
696 || st
->probe_packets
<= 0;
698 if (end
|| av_log2(pd
->buf_size
) != av_log2(pd
->buf_size
- pkt
->size
)) {
699 int score
= set_codec_from_probe_data(s
, st
, pd
);
700 if ( (st
->codecpar
->codec_id
!= AV_CODEC_ID_NONE
&& score
> AVPROBE_SCORE_STREAM_RETRY
)
704 st
->request_probe
= -1;
705 if (st
->codecpar
->codec_id
!= AV_CODEC_ID_NONE
) {
706 av_log(s
, AV_LOG_DEBUG
, "probed stream %d\n", st
->index
);
708 av_log(s
, AV_LOG_WARNING
, "probed stream %d failed\n", st
->index
);
710 force_codec_ids(s
, st
);
716 static int update_wrap_reference(AVFormatContext
*s
, AVStream
*st
, int stream_index
, AVPacket
*pkt
)
718 int64_t ref
= pkt
->dts
;
719 int i
, pts_wrap_behavior
;
720 int64_t pts_wrap_reference
;
721 AVProgram
*first_program
;
723 if (ref
== AV_NOPTS_VALUE
)
725 if (st
->pts_wrap_reference
!= AV_NOPTS_VALUE
|| st
->pts_wrap_bits
>= 63 || ref
== AV_NOPTS_VALUE
|| !s
->correct_ts_overflow
)
727 ref
&= (1LL << st
->pts_wrap_bits
)-1;
729 // reference time stamp should be 60 s before first time stamp
730 pts_wrap_reference
= ref
- av_rescale(60, st
->time_base
.den
, st
->time_base
.num
);
731 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
732 pts_wrap_behavior
= (ref
< (1LL << st
->pts_wrap_bits
) - (1LL << st
->pts_wrap_bits
-3)) ||
733 (ref
< (1LL << st
->pts_wrap_bits
) - av_rescale(60, st
->time_base
.den
, st
->time_base
.num
)) ?
734 AV_PTS_WRAP_ADD_OFFSET
: AV_PTS_WRAP_SUB_OFFSET
;
736 first_program
= av_find_program_from_stream(s
, NULL
, stream_index
);
738 if (!first_program
) {
739 int default_stream_index
= av_find_default_stream_index(s
);
740 if (s
->streams
[default_stream_index
]->pts_wrap_reference
== AV_NOPTS_VALUE
) {
741 for (i
= 0; i
< s
->nb_streams
; i
++) {
742 if (av_find_program_from_stream(s
, NULL
, i
))
744 s
->streams
[i
]->pts_wrap_reference
= pts_wrap_reference
;
745 s
->streams
[i
]->pts_wrap_behavior
= pts_wrap_behavior
;
749 st
->pts_wrap_reference
= s
->streams
[default_stream_index
]->pts_wrap_reference
;
750 st
->pts_wrap_behavior
= s
->streams
[default_stream_index
]->pts_wrap_behavior
;
754 AVProgram
*program
= first_program
;
756 if (program
->pts_wrap_reference
!= AV_NOPTS_VALUE
) {
757 pts_wrap_reference
= program
->pts_wrap_reference
;
758 pts_wrap_behavior
= program
->pts_wrap_behavior
;
761 program
= av_find_program_from_stream(s
, program
, stream_index
);
764 // update every program with differing pts_wrap_reference
765 program
= first_program
;
767 if (program
->pts_wrap_reference
!= pts_wrap_reference
) {
768 for (i
= 0; i
<program
->nb_stream_indexes
; i
++) {
769 s
->streams
[program
->stream_index
[i
]]->pts_wrap_reference
= pts_wrap_reference
;
770 s
->streams
[program
->stream_index
[i
]]->pts_wrap_behavior
= pts_wrap_behavior
;
773 program
->pts_wrap_reference
= pts_wrap_reference
;
774 program
->pts_wrap_behavior
= pts_wrap_behavior
;
776 program
= av_find_program_from_stream(s
, program
, stream_index
);
782 int ff_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
788 AVPacketList
*pktl
= s
->internal
->raw_packet_buffer
;
792 st
= s
->streams
[pkt
->stream_index
];
793 if (s
->internal
->raw_packet_buffer_remaining_size
<= 0)
794 if ((err
= probe_codec(s
, st
, NULL
)) < 0)
796 if (st
->request_probe
<= 0) {
797 s
->internal
->raw_packet_buffer
= pktl
->next
;
798 s
->internal
->raw_packet_buffer_remaining_size
+= pkt
->size
;
807 ret
= s
->iformat
->read_packet(s
, pkt
);
809 /* Some demuxers return FFERROR_REDO when they consume
810 data and discard it (ignored streams, junk, extradata).
811 We must re-call the demuxer to get the real packet. */
812 if (ret
== FFERROR_REDO
)
814 if (!pktl
|| ret
== AVERROR(EAGAIN
))
816 for (i
= 0; i
< s
->nb_streams
; i
++) {
818 if (st
->probe_packets
|| st
->request_probe
> 0)
819 if ((err
= probe_codec(s
, st
, NULL
)) < 0)
821 av_assert0(st
->request_probe
<= 0);
827 AVPacket tmp
= { 0 };
828 ret
= av_packet_ref(&tmp
, pkt
);
834 if ((s
->flags
& AVFMT_FLAG_DISCARD_CORRUPT
) &&
835 (pkt
->flags
& AV_PKT_FLAG_CORRUPT
)) {
836 av_log(s
, AV_LOG_WARNING
,
837 "Dropped corrupted packet (stream = %d)\n",
839 av_packet_unref(pkt
);
843 if (pkt
->stream_index
>= (unsigned)s
->nb_streams
) {
844 av_log(s
, AV_LOG_ERROR
, "Invalid stream index %d\n", pkt
->stream_index
);
848 st
= s
->streams
[pkt
->stream_index
];
850 if (update_wrap_reference(s
, st
, pkt
->stream_index
, pkt
) && st
->pts_wrap_behavior
== AV_PTS_WRAP_SUB_OFFSET
) {
851 // correct first time stamps to negative values
852 if (!is_relative(st
->first_dts
))
853 st
->first_dts
= wrap_timestamp(st
, st
->first_dts
);
854 if (!is_relative(st
->start_time
))
855 st
->start_time
= wrap_timestamp(st
, st
->start_time
);
856 if (!is_relative(st
->cur_dts
))
857 st
->cur_dts
= wrap_timestamp(st
, st
->cur_dts
);
860 pkt
->dts
= wrap_timestamp(st
, pkt
->dts
);
861 pkt
->pts
= wrap_timestamp(st
, pkt
->pts
);
863 force_codec_ids(s
, st
);
865 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
866 if (s
->use_wallclock_as_timestamps
)
867 pkt
->dts
= pkt
->pts
= av_rescale_q(av_gettime(), AV_TIME_BASE_Q
, st
->time_base
);
869 if (!pktl
&& st
->request_probe
<= 0)
872 err
= add_to_pktbuf(&s
->internal
->raw_packet_buffer
, pkt
,
873 &s
->internal
->raw_packet_buffer_end
, 0);
876 s
->internal
->raw_packet_buffer_remaining_size
-= pkt
->size
;
878 if ((err
= probe_codec(s
, st
, pkt
)) < 0)
884 /**********************************************************/
886 static int determinable_frame_size(AVCodecContext
*avctx
)
888 if (/*avctx->codec_id == AV_CODEC_ID_AAC ||*/
889 avctx
->codec_id
== AV_CODEC_ID_MP1
||
890 avctx
->codec_id
== AV_CODEC_ID_MP2
||
891 avctx
->codec_id
== AV_CODEC_ID_MP3
/* ||
892 avctx->codec_id == AV_CODEC_ID_CELT*/)
898 * Return the frame duration in seconds. Return 0 if not available.
900 void ff_compute_frame_duration(AVFormatContext
*s
, int *pnum
, int *pden
, AVStream
*st
,
901 AVCodecParserContext
*pc
, AVPacket
*pkt
)
903 AVRational codec_framerate
= s
->iformat
? st
->internal
->avctx
->framerate
:
904 av_mul_q(av_inv_q(st
->internal
->avctx
->time_base
), (AVRational
){1, st
->internal
->avctx
->ticks_per_frame
});
905 int frame_size
, sample_rate
;
907 #if FF_API_LAVF_AVCTX
908 FF_DISABLE_DEPRECATION_WARNINGS
909 if ((!codec_framerate
.den
|| !codec_framerate
.num
) && st
->codec
->time_base
.den
&& st
->codec
->time_base
.num
)
910 codec_framerate
= av_mul_q(av_inv_q(st
->codec
->time_base
), (AVRational
){1, st
->codec
->ticks_per_frame
});
911 FF_ENABLE_DEPRECATION_WARNINGS
916 switch (st
->codecpar
->codec_type
) {
917 case AVMEDIA_TYPE_VIDEO
:
918 if (st
->r_frame_rate
.num
&& !pc
&& s
->iformat
) {
919 *pnum
= st
->r_frame_rate
.den
;
920 *pden
= st
->r_frame_rate
.num
;
921 } else if (st
->time_base
.num
* 1000LL > st
->time_base
.den
) {
922 *pnum
= st
->time_base
.num
;
923 *pden
= st
->time_base
.den
;
924 } else if (codec_framerate
.den
* 1000LL > codec_framerate
.num
) {
925 av_assert0(st
->internal
->avctx
->ticks_per_frame
);
926 av_reduce(pnum
, pden
,
928 codec_framerate
.num
* (int64_t)st
->internal
->avctx
->ticks_per_frame
,
931 if (pc
&& pc
->repeat_pict
) {
932 av_assert0(s
->iformat
); // this may be wrong for interlaced encoding but its not used for that case
933 av_reduce(pnum
, pden
,
934 (*pnum
) * (1LL + pc
->repeat_pict
),
938 /* If this codec can be interlaced or progressive then we need
939 * a parser to compute duration of a packet. Thus if we have
940 * no parser in such case leave duration undefined. */
941 if (st
->internal
->avctx
->ticks_per_frame
> 1 && !pc
)
945 case AVMEDIA_TYPE_AUDIO
:
946 if (st
->internal
->avctx_inited
) {
947 frame_size
= av_get_audio_frame_duration(st
->internal
->avctx
, pkt
->size
);
948 sample_rate
= st
->internal
->avctx
->sample_rate
;
950 frame_size
= av_get_audio_frame_duration2(st
->codecpar
, pkt
->size
);
951 sample_rate
= st
->codecpar
->sample_rate
;
953 if (frame_size
<= 0 || sample_rate
<= 0)
963 static int is_intra_only(enum AVCodecID id
)
965 const AVCodecDescriptor
*d
= avcodec_descriptor_get(id
);
968 if (d
->type
== AVMEDIA_TYPE_VIDEO
&& !(d
->props
& AV_CODEC_PROP_INTRA_ONLY
))
973 static int has_decode_delay_been_guessed(AVStream
*st
)
975 if (st
->codecpar
->codec_id
!= AV_CODEC_ID_H264
) return 1;
976 if (!st
->info
) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
978 #if CONFIG_H264_DECODER
979 if (st
->internal
->avctx
->has_b_frames
&&
980 avpriv_h264_has_num_reorder_frames(st
->internal
->avctx
) == st
->internal
->avctx
->has_b_frames
)
983 if (st
->internal
->avctx
->has_b_frames
<3)
984 return st
->nb_decoded_frames
>= 7;
985 else if (st
->internal
->avctx
->has_b_frames
<4)
986 return st
->nb_decoded_frames
>= 18;
988 return st
->nb_decoded_frames
>= 20;
991 static AVPacketList
*get_next_pkt(AVFormatContext
*s
, AVStream
*st
, AVPacketList
*pktl
)
995 if (pktl
== s
->internal
->packet_buffer_end
)
996 return s
->internal
->parse_queue
;
1000 static int64_t select_from_pts_buffer(AVStream
*st
, int64_t *pts_buffer
, int64_t dts
) {
1001 int onein_oneout
= st
->codecpar
->codec_id
!= AV_CODEC_ID_H264
&&
1002 st
->codecpar
->codec_id
!= AV_CODEC_ID_HEVC
;
1005 int delay
= st
->internal
->avctx
->has_b_frames
;
1008 if (dts
== AV_NOPTS_VALUE
) {
1009 int64_t best_score
= INT64_MAX
;
1010 for (i
= 0; i
<delay
; i
++) {
1011 if (st
->pts_reorder_error_count
[i
]) {
1012 int64_t score
= st
->pts_reorder_error
[i
] / st
->pts_reorder_error_count
[i
];
1013 if (score
< best_score
) {
1015 dts
= pts_buffer
[i
];
1020 for (i
= 0; i
<delay
; i
++) {
1021 if (pts_buffer
[i
] != AV_NOPTS_VALUE
) {
1022 int64_t diff
= FFABS(pts_buffer
[i
] - dts
)
1023 + (uint64_t)st
->pts_reorder_error
[i
];
1024 diff
= FFMAX(diff
, st
->pts_reorder_error
[i
]);
1025 st
->pts_reorder_error
[i
] = diff
;
1026 st
->pts_reorder_error_count
[i
]++;
1027 if (st
->pts_reorder_error_count
[i
] > 250) {
1028 st
->pts_reorder_error
[i
] >>= 1;
1029 st
->pts_reorder_error_count
[i
] >>= 1;
1036 if (dts
== AV_NOPTS_VALUE
)
1037 dts
= pts_buffer
[0];
1043 * Updates the dts of packets of a stream in pkt_buffer, by re-ordering the pts
1044 * of the packets in a window.
1046 static void update_dts_from_pts(AVFormatContext
*s
, int stream_index
,
1047 AVPacketList
*pkt_buffer
)
1049 AVStream
*st
= s
->streams
[stream_index
];
1050 int delay
= st
->internal
->avctx
->has_b_frames
;
1053 int64_t pts_buffer
[MAX_REORDER_DELAY
+1];
1055 for (i
= 0; i
<MAX_REORDER_DELAY
+1; i
++)
1056 pts_buffer
[i
] = AV_NOPTS_VALUE
;
1058 for (; pkt_buffer
; pkt_buffer
= get_next_pkt(s
, st
, pkt_buffer
)) {
1059 if (pkt_buffer
->pkt
.stream_index
!= stream_index
)
1062 if (pkt_buffer
->pkt
.pts
!= AV_NOPTS_VALUE
&& delay
<= MAX_REORDER_DELAY
) {
1063 pts_buffer
[0] = pkt_buffer
->pkt
.pts
;
1064 for (i
= 0; i
<delay
&& pts_buffer
[i
] > pts_buffer
[i
+ 1]; i
++)
1065 FFSWAP(int64_t, pts_buffer
[i
], pts_buffer
[i
+ 1]);
1067 pkt_buffer
->pkt
.dts
= select_from_pts_buffer(st
, pts_buffer
, pkt_buffer
->pkt
.dts
);
1072 static void update_initial_timestamps(AVFormatContext
*s
, int stream_index
,
1073 int64_t dts
, int64_t pts
, AVPacket
*pkt
)
1075 AVStream
*st
= s
->streams
[stream_index
];
1076 AVPacketList
*pktl
= s
->internal
->packet_buffer
? s
->internal
->packet_buffer
: s
->internal
->parse_queue
;
1077 AVPacketList
*pktl_it
;
1081 if (st
->first_dts
!= AV_NOPTS_VALUE
||
1082 dts
== AV_NOPTS_VALUE
||
1083 st
->cur_dts
== AV_NOPTS_VALUE
||
1084 st
->cur_dts
< INT_MIN
+ RELATIVE_TS_BASE
||
1085 dts
< INT_MIN
+ (st
->cur_dts
- RELATIVE_TS_BASE
) ||
1089 st
->first_dts
= dts
- (st
->cur_dts
- RELATIVE_TS_BASE
);
1091 shift
= (uint64_t)st
->first_dts
- RELATIVE_TS_BASE
;
1093 if (is_relative(pts
))
1096 for (pktl_it
= pktl
; pktl_it
; pktl_it
= get_next_pkt(s
, st
, pktl_it
)) {
1097 if (pktl_it
->pkt
.stream_index
!= stream_index
)
1099 if (is_relative(pktl_it
->pkt
.pts
))
1100 pktl_it
->pkt
.pts
+= shift
;
1102 if (is_relative(pktl_it
->pkt
.dts
))
1103 pktl_it
->pkt
.dts
+= shift
;
1105 if (st
->start_time
== AV_NOPTS_VALUE
&& pktl_it
->pkt
.pts
!= AV_NOPTS_VALUE
) {
1106 st
->start_time
= pktl_it
->pkt
.pts
;
1107 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_AUDIO
&& st
->codecpar
->sample_rate
)
1108 st
->start_time
+= av_rescale_q(st
->skip_samples
, (AVRational
){1, st
->codecpar
->sample_rate
}, st
->time_base
);
1112 if (has_decode_delay_been_guessed(st
)) {
1113 update_dts_from_pts(s
, stream_index
, pktl
);
1116 if (st
->start_time
== AV_NOPTS_VALUE
) {
1117 st
->start_time
= pts
;
1118 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_AUDIO
&& st
->codecpar
->sample_rate
)
1119 st
->start_time
+= av_rescale_q(st
->skip_samples
, (AVRational
){1, st
->codecpar
->sample_rate
}, st
->time_base
);
1123 static void update_initial_durations(AVFormatContext
*s
, AVStream
*st
,
1124 int stream_index
, int duration
)
1126 AVPacketList
*pktl
= s
->internal
->packet_buffer
? s
->internal
->packet_buffer
: s
->internal
->parse_queue
;
1127 int64_t cur_dts
= RELATIVE_TS_BASE
;
1129 if (st
->first_dts
!= AV_NOPTS_VALUE
) {
1130 if (st
->update_initial_durations_done
)
1132 st
->update_initial_durations_done
= 1;
1133 cur_dts
= st
->first_dts
;
1134 for (; pktl
; pktl
= get_next_pkt(s
, st
, pktl
)) {
1135 if (pktl
->pkt
.stream_index
== stream_index
) {
1136 if (pktl
->pkt
.pts
!= pktl
->pkt
.dts
||
1137 pktl
->pkt
.dts
!= AV_NOPTS_VALUE
||
1140 cur_dts
-= duration
;
1143 if (pktl
&& pktl
->pkt
.dts
!= st
->first_dts
) {
1144 av_log(s
, AV_LOG_DEBUG
, "first_dts %s not matching first dts %s (pts %s, duration %"PRId64
") in the queue\n",
1145 av_ts2str(st
->first_dts
), av_ts2str(pktl
->pkt
.dts
), av_ts2str(pktl
->pkt
.pts
), pktl
->pkt
.duration
);
1149 av_log(s
, AV_LOG_DEBUG
, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st
->first_dts
));
1152 pktl
= s
->internal
->packet_buffer
? s
->internal
->packet_buffer
: s
->internal
->parse_queue
;
1153 st
->first_dts
= cur_dts
;
1154 } else if (st
->cur_dts
!= RELATIVE_TS_BASE
)
1157 for (; pktl
; pktl
= get_next_pkt(s
, st
, pktl
)) {
1158 if (pktl
->pkt
.stream_index
!= stream_index
)
1160 if (pktl
->pkt
.pts
== pktl
->pkt
.dts
&&
1161 (pktl
->pkt
.dts
== AV_NOPTS_VALUE
|| pktl
->pkt
.dts
== st
->first_dts
) &&
1162 !pktl
->pkt
.duration
) {
1163 pktl
->pkt
.dts
= cur_dts
;
1164 if (!st
->internal
->avctx
->has_b_frames
)
1165 pktl
->pkt
.pts
= cur_dts
;
1166 // if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
1167 pktl
->pkt
.duration
= duration
;
1170 cur_dts
= pktl
->pkt
.dts
+ pktl
->pkt
.duration
;
1173 st
->cur_dts
= cur_dts
;
1176 static void compute_pkt_fields(AVFormatContext
*s
, AVStream
*st
,
1177 AVCodecParserContext
*pc
, AVPacket
*pkt
,
1178 int64_t next_dts
, int64_t next_pts
)
1180 int num
, den
, presentation_delayed
, delay
, i
;
1182 AVRational duration
;
1183 int onein_oneout
= st
->codecpar
->codec_id
!= AV_CODEC_ID_H264
&&
1184 st
->codecpar
->codec_id
!= AV_CODEC_ID_HEVC
;
1186 if (s
->flags
& AVFMT_FLAG_NOFILLIN
)
1189 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
&& pkt
->dts
!= AV_NOPTS_VALUE
) {
1190 if (pkt
->dts
== pkt
->pts
&& st
->last_dts_for_order_check
!= AV_NOPTS_VALUE
) {
1191 if (st
->last_dts_for_order_check
<= pkt
->dts
) {
1194 av_log(s
, st
->dts_misordered
? AV_LOG_DEBUG
: AV_LOG_WARNING
,
1195 "DTS %"PRIi64
" < %"PRIi64
" out of order\n",
1197 st
->last_dts_for_order_check
);
1198 st
->dts_misordered
++;
1200 if (st
->dts_ordered
+ st
->dts_misordered
> 250) {
1201 st
->dts_ordered
>>= 1;
1202 st
->dts_misordered
>>= 1;
1206 st
->last_dts_for_order_check
= pkt
->dts
;
1207 if (st
->dts_ordered
< 8*st
->dts_misordered
&& pkt
->dts
== pkt
->pts
)
1208 pkt
->dts
= AV_NOPTS_VALUE
;
1211 if ((s
->flags
& AVFMT_FLAG_IGNDTS
) && pkt
->pts
!= AV_NOPTS_VALUE
)
1212 pkt
->dts
= AV_NOPTS_VALUE
;
1214 if (pc
&& pc
->pict_type
== AV_PICTURE_TYPE_B
1215 && !st
->internal
->avctx
->has_b_frames
)
1216 //FIXME Set low_delay = 0 when has_b_frames = 1
1217 st
->internal
->avctx
->has_b_frames
= 1;
1219 /* do we have a video B-frame ? */
1220 delay
= st
->internal
->avctx
->has_b_frames
;
1221 presentation_delayed
= 0;
1223 /* XXX: need has_b_frame, but cannot get it if the codec is
1224 * not initialized */
1226 pc
&& pc
->pict_type
!= AV_PICTURE_TYPE_B
)
1227 presentation_delayed
= 1;
1229 if (pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
!= AV_NOPTS_VALUE
&&
1230 st
->pts_wrap_bits
< 63 && pkt
->dts
> INT64_MIN
+ (1LL << st
->pts_wrap_bits
) &&
1231 pkt
->dts
- (1LL << (st
->pts_wrap_bits
- 1)) > pkt
->pts
) {
1232 if (is_relative(st
->cur_dts
) || pkt
->dts
- (1LL<<(st
->pts_wrap_bits
- 1)) > st
->cur_dts
) {
1233 pkt
->dts
-= 1LL << st
->pts_wrap_bits
;
1235 pkt
->pts
+= 1LL << st
->pts_wrap_bits
;
1238 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1239 * We take the conservative approach and discard both.
1240 * Note: If this is misbehaving for an H.264 file, then possibly
1241 * presentation_delayed is not set correctly. */
1242 if (delay
== 1 && pkt
->dts
== pkt
->pts
&&
1243 pkt
->dts
!= AV_NOPTS_VALUE
&& presentation_delayed
) {
1244 av_log(s
, AV_LOG_DEBUG
, "invalid dts/pts combination %"PRIi64
"\n", pkt
->dts
);
1245 if ( strcmp(s
->iformat
->name
, "mov,mp4,m4a,3gp,3g2,mj2")
1246 && strcmp(s
->iformat
->name
, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1247 pkt
->dts
= AV_NOPTS_VALUE
;
1250 duration
= av_mul_q((AVRational
) {pkt
->duration
, 1}, st
->time_base
);
1251 if (pkt
->duration
== 0) {
1252 ff_compute_frame_duration(s
, &num
, &den
, st
, pc
, pkt
);
1254 duration
= (AVRational
) {num
, den
};
1255 pkt
->duration
= av_rescale_rnd(1,
1256 num
* (int64_t) st
->time_base
.den
,
1257 den
* (int64_t) st
->time_base
.num
,
1262 if (pkt
->duration
!= 0 && (s
->internal
->packet_buffer
|| s
->internal
->parse_queue
))
1263 update_initial_durations(s
, st
, pkt
->stream_index
, pkt
->duration
);
1265 /* Correct timestamps with byte offset if demuxers only have timestamps
1266 * on packet boundaries */
1267 if (pc
&& st
->need_parsing
== AVSTREAM_PARSE_TIMESTAMPS
&& pkt
->size
) {
1268 /* this will estimate bitrate based on this frame's duration and size */
1269 offset
= av_rescale(pc
->offset
, pkt
->duration
, pkt
->size
);
1270 if (pkt
->pts
!= AV_NOPTS_VALUE
)
1272 if (pkt
->dts
!= AV_NOPTS_VALUE
)
1276 /* This may be redundant, but it should not hurt. */
1277 if (pkt
->dts
!= AV_NOPTS_VALUE
&&
1278 pkt
->pts
!= AV_NOPTS_VALUE
&&
1279 pkt
->pts
> pkt
->dts
)
1280 presentation_delayed
= 1;
1282 if (s
->debug
& FF_FDEBUG_TS
)
1283 av_log(s
, AV_LOG_TRACE
,
1284 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%"PRId64
" delay:%d onein_oneout:%d\n",
1285 presentation_delayed
, av_ts2str(pkt
->pts
), av_ts2str(pkt
->dts
), av_ts2str(st
->cur_dts
),
1286 pkt
->stream_index
, pc
, pkt
->duration
, delay
, onein_oneout
);
1288 /* Interpolate PTS and DTS if they are not present. We skip H264
1289 * currently because delay and has_b_frames are not reliably set. */
1290 if ((delay
== 0 || (delay
== 1 && pc
)) &&
1292 if (presentation_delayed
) {
1293 /* DTS = decompression timestamp */
1294 /* PTS = presentation timestamp */
1295 if (pkt
->dts
== AV_NOPTS_VALUE
)
1296 pkt
->dts
= st
->last_IP_pts
;
1297 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
, pkt
);
1298 if (pkt
->dts
== AV_NOPTS_VALUE
)
1299 pkt
->dts
= st
->cur_dts
;
1301 /* This is tricky: the dts must be incremented by the duration
1302 * of the frame we are displaying, i.e. the last I- or P-frame. */
1303 if (st
->last_IP_duration
== 0 && (uint64_t)pkt
->duration
<= INT32_MAX
)
1304 st
->last_IP_duration
= pkt
->duration
;
1305 if (pkt
->dts
!= AV_NOPTS_VALUE
)
1306 st
->cur_dts
= pkt
->dts
+ st
->last_IP_duration
;
1307 if (pkt
->dts
!= AV_NOPTS_VALUE
&&
1308 pkt
->pts
== AV_NOPTS_VALUE
&&
1309 st
->last_IP_duration
> 0 &&
1310 ((uint64_t)st
->cur_dts
- (uint64_t)next_dts
+ 1) <= 2 &&
1311 next_dts
!= next_pts
&&
1312 next_pts
!= AV_NOPTS_VALUE
)
1313 pkt
->pts
= next_dts
;
1315 if ((uint64_t)pkt
->duration
<= INT32_MAX
)
1316 st
->last_IP_duration
= pkt
->duration
;
1317 st
->last_IP_pts
= pkt
->pts
;
1318 /* Cannot compute PTS if not present (we can compute it only
1319 * by knowing the future. */
1320 } else if (pkt
->pts
!= AV_NOPTS_VALUE
||
1321 pkt
->dts
!= AV_NOPTS_VALUE
||
1324 /* presentation is not delayed : PTS and DTS are the same */
1325 if (pkt
->pts
== AV_NOPTS_VALUE
)
1326 pkt
->pts
= pkt
->dts
;
1327 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->pts
,
1329 if (pkt
->pts
== AV_NOPTS_VALUE
)
1330 pkt
->pts
= st
->cur_dts
;
1331 pkt
->dts
= pkt
->pts
;
1332 if (pkt
->pts
!= AV_NOPTS_VALUE
)
1333 st
->cur_dts
= av_add_stable(st
->time_base
, pkt
->pts
, duration
, 1);
1337 if (pkt
->pts
!= AV_NOPTS_VALUE
&& delay
<= MAX_REORDER_DELAY
) {
1338 st
->pts_buffer
[0] = pkt
->pts
;
1339 for (i
= 0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+ 1]; i
++)
1340 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+ 1]);
1342 if(has_decode_delay_been_guessed(st
))
1343 pkt
->dts
= select_from_pts_buffer(st
, st
->pts_buffer
, pkt
->dts
);
1345 // We skipped it above so we try here.
1347 // This should happen on the first packet
1348 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
, pkt
);
1349 if (pkt
->dts
> st
->cur_dts
)
1350 st
->cur_dts
= pkt
->dts
;
1352 if (s
->debug
& FF_FDEBUG_TS
)
1353 av_log(s
, AV_LOG_TRACE
, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1354 presentation_delayed
, delay
, av_ts2str(pkt
->pts
), av_ts2str(pkt
->dts
), av_ts2str(st
->cur_dts
));
1357 if (is_intra_only(st
->codecpar
->codec_id
))
1358 pkt
->flags
|= AV_PKT_FLAG_KEY
;
1359 #if FF_API_CONVERGENCE_DURATION
1360 FF_DISABLE_DEPRECATION_WARNINGS
1362 pkt
->convergence_duration
= pc
->convergence_duration
;
1363 FF_ENABLE_DEPRECATION_WARNINGS
1367 static void free_packet_buffer(AVPacketList
**pkt_buf
, AVPacketList
**pkt_buf_end
)
1370 AVPacketList
*pktl
= *pkt_buf
;
1371 *pkt_buf
= pktl
->next
;
1372 av_packet_unref(&pktl
->pkt
);
1375 *pkt_buf_end
= NULL
;
1379 * Parse a packet, add all split parts to parse_queue.
1381 * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
1383 static int parse_packet(AVFormatContext
*s
, AVPacket
*pkt
, int stream_index
)
1385 AVPacket out_pkt
= { 0 }, flush_pkt
= { 0 };
1386 AVStream
*st
= s
->streams
[stream_index
];
1387 uint8_t *data
= pkt
? pkt
->data
: NULL
;
1388 int size
= pkt
? pkt
->size
: 0;
1389 int ret
= 0, got_output
= 0;
1392 av_init_packet(&flush_pkt
);
1395 } else if (!size
&& st
->parser
->flags
& PARSER_FLAG_COMPLETE_FRAMES
) {
1396 // preserve 0-size sync packets
1397 compute_pkt_fields(s
, st
, st
->parser
, pkt
, AV_NOPTS_VALUE
, AV_NOPTS_VALUE
);
1400 while (size
> 0 || (pkt
== &flush_pkt
&& got_output
)) {
1402 int64_t next_pts
= pkt
->pts
;
1403 int64_t next_dts
= pkt
->dts
;
1405 av_init_packet(&out_pkt
);
1406 len
= av_parser_parse2(st
->parser
, st
->internal
->avctx
,
1407 &out_pkt
.data
, &out_pkt
.size
, data
, size
,
1408 pkt
->pts
, pkt
->dts
, pkt
->pos
);
1410 pkt
->pts
= pkt
->dts
= AV_NOPTS_VALUE
;
1412 /* increment read pointer */
1416 got_output
= !!out_pkt
.size
;
1421 if (pkt
->side_data
) {
1422 out_pkt
.side_data
= pkt
->side_data
;
1423 out_pkt
.side_data_elems
= pkt
->side_data_elems
;
1424 pkt
->side_data
= NULL
;
1425 pkt
->side_data_elems
= 0;
1428 /* set the duration */
1429 out_pkt
.duration
= (st
->parser
->flags
& PARSER_FLAG_COMPLETE_FRAMES
) ? pkt
->duration
: 0;
1430 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_AUDIO
) {
1431 if (st
->internal
->avctx
->sample_rate
> 0) {
1433 av_rescale_q_rnd(st
->parser
->duration
,
1434 (AVRational
) { 1, st
->internal
->avctx
->sample_rate
},
1440 out_pkt
.stream_index
= st
->index
;
1441 out_pkt
.pts
= st
->parser
->pts
;
1442 out_pkt
.dts
= st
->parser
->dts
;
1443 out_pkt
.pos
= st
->parser
->pos
;
1445 if (st
->need_parsing
== AVSTREAM_PARSE_FULL_RAW
)
1446 out_pkt
.pos
= st
->parser
->frame_offset
;
1448 if (st
->parser
->key_frame
== 1 ||
1449 (st
->parser
->key_frame
== -1 &&
1450 st
->parser
->pict_type
== AV_PICTURE_TYPE_I
))
1451 out_pkt
.flags
|= AV_PKT_FLAG_KEY
;
1453 if (st
->parser
->key_frame
== -1 && st
->parser
->pict_type
==AV_PICTURE_TYPE_NONE
&& (pkt
->flags
&AV_PKT_FLAG_KEY
))
1454 out_pkt
.flags
|= AV_PKT_FLAG_KEY
;
1456 compute_pkt_fields(s
, st
, st
->parser
, &out_pkt
, next_dts
, next_pts
);
1458 ret
= add_to_pktbuf(&s
->internal
->parse_queue
, &out_pkt
,
1459 &s
->internal
->parse_queue_end
, 1);
1460 av_packet_unref(&out_pkt
);
1465 /* end of the stream => close and free the parser */
1466 if (pkt
== &flush_pkt
) {
1467 av_parser_close(st
->parser
);
1472 av_packet_unref(pkt
);
1476 static int read_from_packet_buffer(AVPacketList
**pkt_buffer
,
1477 AVPacketList
**pkt_buffer_end
,
1481 av_assert0(*pkt_buffer
);
1484 *pkt_buffer
= pktl
->next
;
1486 *pkt_buffer_end
= NULL
;
1491 static int64_t ts_to_samples(AVStream
*st
, int64_t ts
)
1493 return av_rescale(ts
, st
->time_base
.num
* st
->codecpar
->sample_rate
, st
->time_base
.den
);
1496 static int read_frame_internal(AVFormatContext
*s
, AVPacket
*pkt
)
1498 int ret
= 0, i
, got_packet
= 0;
1499 AVDictionary
*metadata
= NULL
;
1501 av_init_packet(pkt
);
1503 while (!got_packet
&& !s
->internal
->parse_queue
) {
1507 /* read next packet */
1508 ret
= ff_read_packet(s
, &cur_pkt
);
1510 if (ret
== AVERROR(EAGAIN
))
1512 /* flush the parsers */
1513 for (i
= 0; i
< s
->nb_streams
; i
++) {
1515 if (st
->parser
&& st
->need_parsing
)
1516 parse_packet(s
, NULL
, st
->index
);
1518 /* all remaining packets are now in parse_queue =>
1519 * really terminate parsing */
1523 st
= s
->streams
[cur_pkt
.stream_index
];
1525 /* update context if required */
1526 if (st
->internal
->need_context_update
) {
1527 if (avcodec_is_open(st
->internal
->avctx
)) {
1528 av_log(s
, AV_LOG_DEBUG
, "Demuxer context update while decoder is open, closing and trying to re-open\n");
1529 avcodec_close(st
->internal
->avctx
);
1530 st
->info
->found_decoder
= 0;
1533 /* close parser, because it depends on the codec */
1534 if (st
->parser
&& st
->internal
->avctx
->codec_id
!= st
->codecpar
->codec_id
) {
1535 av_parser_close(st
->parser
);
1539 ret
= avcodec_parameters_to_context(st
->internal
->avctx
, st
->codecpar
);
1543 #if FF_API_LAVF_AVCTX
1544 FF_DISABLE_DEPRECATION_WARNINGS
1545 /* update deprecated public codec context */
1546 ret
= avcodec_parameters_to_context(st
->codec
, st
->codecpar
);
1549 FF_ENABLE_DEPRECATION_WARNINGS
1552 st
->internal
->need_context_update
= 0;
1555 if (cur_pkt
.pts
!= AV_NOPTS_VALUE
&&
1556 cur_pkt
.dts
!= AV_NOPTS_VALUE
&&
1557 cur_pkt
.pts
< cur_pkt
.dts
) {
1558 av_log(s
, AV_LOG_WARNING
,
1559 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1560 cur_pkt
.stream_index
,
1561 av_ts2str(cur_pkt
.pts
),
1562 av_ts2str(cur_pkt
.dts
),
1565 if (s
->debug
& FF_FDEBUG_TS
)
1566 av_log(s
, AV_LOG_DEBUG
,
1567 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"PRId64
", flags=%d\n",
1568 cur_pkt
.stream_index
,
1569 av_ts2str(cur_pkt
.pts
),
1570 av_ts2str(cur_pkt
.dts
),
1571 cur_pkt
.size
, cur_pkt
.duration
, cur_pkt
.flags
);
1573 if (st
->need_parsing
&& !st
->parser
&& !(s
->flags
& AVFMT_FLAG_NOPARSE
)) {
1574 st
->parser
= av_parser_init(st
->codecpar
->codec_id
);
1576 av_log(s
, AV_LOG_VERBOSE
, "parser not found for codec "
1577 "%s, packets or times may be invalid.\n",
1578 avcodec_get_name(st
->codecpar
->codec_id
));
1579 /* no parser available: just output the raw packets */
1580 st
->need_parsing
= AVSTREAM_PARSE_NONE
;
1581 } else if (st
->need_parsing
== AVSTREAM_PARSE_HEADERS
)
1582 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
1583 else if (st
->need_parsing
== AVSTREAM_PARSE_FULL_ONCE
)
1584 st
->parser
->flags
|= PARSER_FLAG_ONCE
;
1585 else if (st
->need_parsing
== AVSTREAM_PARSE_FULL_RAW
)
1586 st
->parser
->flags
|= PARSER_FLAG_USE_CODEC_TS
;
1589 if (!st
->need_parsing
|| !st
->parser
) {
1590 /* no parsing needed: we just output the packet as is */
1592 compute_pkt_fields(s
, st
, NULL
, pkt
, AV_NOPTS_VALUE
, AV_NOPTS_VALUE
);
1593 if ((s
->iformat
->flags
& AVFMT_GENERIC_INDEX
) &&
1594 (pkt
->flags
& AV_PKT_FLAG_KEY
) && pkt
->dts
!= AV_NOPTS_VALUE
) {
1595 ff_reduce_index(s
, st
->index
);
1596 av_add_index_entry(st
, pkt
->pos
, pkt
->dts
,
1597 0, 0, AVINDEX_KEYFRAME
);
1600 } else if (st
->discard
< AVDISCARD_ALL
) {
1601 if ((ret
= parse_packet(s
, &cur_pkt
, cur_pkt
.stream_index
)) < 0)
1603 st
->codecpar
->sample_rate
= st
->internal
->avctx
->sample_rate
;
1604 st
->codecpar
->bit_rate
= st
->internal
->avctx
->bit_rate
;
1605 st
->codecpar
->channels
= st
->internal
->avctx
->channels
;
1606 st
->codecpar
->channel_layout
= st
->internal
->avctx
->channel_layout
;
1607 st
->codecpar
->codec_id
= st
->internal
->avctx
->codec_id
;
1610 av_packet_unref(&cur_pkt
);
1612 if (pkt
->flags
& AV_PKT_FLAG_KEY
)
1613 st
->skip_to_keyframe
= 0;
1614 if (st
->skip_to_keyframe
) {
1615 av_packet_unref(&cur_pkt
);
1623 if (!got_packet
&& s
->internal
->parse_queue
)
1624 ret
= read_from_packet_buffer(&s
->internal
->parse_queue
, &s
->internal
->parse_queue_end
, pkt
);
1627 AVStream
*st
= s
->streams
[pkt
->stream_index
];
1628 int discard_padding
= 0;
1629 if (st
->first_discard_sample
&& pkt
->pts
!= AV_NOPTS_VALUE
) {
1630 int64_t pts
= pkt
->pts
- (is_relative(pkt
->pts
) ? RELATIVE_TS_BASE
: 0);
1631 int64_t sample
= ts_to_samples(st
, pts
);
1632 int duration
= ts_to_samples(st
, pkt
->duration
);
1633 int64_t end_sample
= sample
+ duration
;
1634 if (duration
> 0 && end_sample
>= st
->first_discard_sample
&&
1635 sample
< st
->last_discard_sample
)
1636 discard_padding
= FFMIN(end_sample
- st
->first_discard_sample
, duration
);
1638 if (st
->start_skip_samples
&& (pkt
->pts
== 0 || pkt
->pts
== RELATIVE_TS_BASE
))
1639 st
->skip_samples
= st
->start_skip_samples
;
1640 if (st
->skip_samples
|| discard_padding
) {
1641 uint8_t *p
= av_packet_new_side_data(pkt
, AV_PKT_DATA_SKIP_SAMPLES
, 10);
1643 AV_WL32(p
, st
->skip_samples
);
1644 AV_WL32(p
+ 4, discard_padding
);
1645 av_log(s
, AV_LOG_DEBUG
, "demuxer injecting skip %d / discard %d\n", st
->skip_samples
, discard_padding
);
1647 st
->skip_samples
= 0;
1650 if (st
->inject_global_side_data
) {
1651 for (i
= 0; i
< st
->nb_side_data
; i
++) {
1652 AVPacketSideData
*src_sd
= &st
->side_data
[i
];
1655 if (av_packet_get_side_data(pkt
, src_sd
->type
, NULL
))
1658 dst_data
= av_packet_new_side_data(pkt
, src_sd
->type
, src_sd
->size
);
1660 av_log(s
, AV_LOG_WARNING
, "Could not inject global side data\n");
1664 memcpy(dst_data
, src_sd
->data
, src_sd
->size
);
1666 st
->inject_global_side_data
= 0;
1669 if (!(s
->flags
& AVFMT_FLAG_KEEP_SIDE_DATA
))
1670 av_packet_merge_side_data(pkt
);
1673 av_opt_get_dict_val(s
, "metadata", AV_OPT_SEARCH_CHILDREN
, &metadata
);
1675 s
->event_flags
|= AVFMT_EVENT_FLAG_METADATA_UPDATED
;
1676 av_dict_copy(&s
->metadata
, metadata
, 0);
1677 av_dict_free(&metadata
);
1678 av_opt_set_dict_val(s
, "metadata", NULL
, AV_OPT_SEARCH_CHILDREN
);
1681 #if FF_API_LAVF_AVCTX
1682 update_stream_avctx(s
);
1685 if (s
->debug
& FF_FDEBUG_TS
)
1686 av_log(s
, AV_LOG_DEBUG
,
1687 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1688 "size=%d, duration=%"PRId64
", flags=%d\n",
1690 av_ts2str(pkt
->pts
),
1691 av_ts2str(pkt
->dts
),
1692 pkt
->size
, pkt
->duration
, pkt
->flags
);
1697 int av_read_frame(AVFormatContext
*s
, AVPacket
*pkt
)
1699 const int genpts
= s
->flags
& AVFMT_FLAG_GENPTS
;
1705 ret
= s
->internal
->packet_buffer
1706 ? read_from_packet_buffer(&s
->internal
->packet_buffer
,
1707 &s
->internal
->packet_buffer_end
, pkt
)
1708 : read_frame_internal(s
, pkt
);
1715 AVPacketList
*pktl
= s
->internal
->packet_buffer
;
1718 AVPacket
*next_pkt
= &pktl
->pkt
;
1720 if (next_pkt
->dts
!= AV_NOPTS_VALUE
) {
1721 int wrap_bits
= s
->streams
[next_pkt
->stream_index
]->pts_wrap_bits
;
1722 // last dts seen for this stream. if any of packets following
1723 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1724 int64_t last_dts
= next_pkt
->dts
;
1725 av_assert2(wrap_bits
<= 64);
1726 while (pktl
&& next_pkt
->pts
== AV_NOPTS_VALUE
) {
1727 if (pktl
->pkt
.stream_index
== next_pkt
->stream_index
&&
1728 av_compare_mod(next_pkt
->dts
, pktl
->pkt
.dts
, 2ULL << (wrap_bits
- 1)) < 0) {
1729 if (av_compare_mod(pktl
->pkt
.pts
, pktl
->pkt
.dts
, 2ULL << (wrap_bits
- 1))) {
1731 next_pkt
->pts
= pktl
->pkt
.dts
;
1733 if (last_dts
!= AV_NOPTS_VALUE
) {
1734 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1735 last_dts
= pktl
->pkt
.dts
;
1740 if (eof
&& next_pkt
->pts
== AV_NOPTS_VALUE
&& last_dts
!= AV_NOPTS_VALUE
) {
1741 // Fixing the last reference frame had none pts issue (For MXF etc).
1742 // We only do this when
1744 // 2. we are not able to resolve a pts value for current packet.
1745 // 3. the packets for this stream at the end of the files had valid dts.
1746 next_pkt
->pts
= last_dts
+ next_pkt
->duration
;
1748 pktl
= s
->internal
->packet_buffer
;
1751 /* read packet from packet buffer, if there is data */
1752 st
= s
->streams
[next_pkt
->stream_index
];
1753 if (!(next_pkt
->pts
== AV_NOPTS_VALUE
&& st
->discard
< AVDISCARD_ALL
&&
1754 next_pkt
->dts
!= AV_NOPTS_VALUE
&& !eof
)) {
1755 ret
= read_from_packet_buffer(&s
->internal
->packet_buffer
,
1756 &s
->internal
->packet_buffer_end
, pkt
);
1761 ret
= read_frame_internal(s
, pkt
);
1763 if (pktl
&& ret
!= AVERROR(EAGAIN
)) {
1770 ret
= add_to_pktbuf(&s
->internal
->packet_buffer
, pkt
,
1771 &s
->internal
->packet_buffer_end
, 1);
1772 av_packet_unref(pkt
);
1779 st
= s
->streams
[pkt
->stream_index
];
1780 if ((s
->iformat
->flags
& AVFMT_GENERIC_INDEX
) && pkt
->flags
& AV_PKT_FLAG_KEY
) {
1781 ff_reduce_index(s
, st
->index
);
1782 av_add_index_entry(st
, pkt
->pos
, pkt
->dts
, 0, 0, AVINDEX_KEYFRAME
);
1785 if (is_relative(pkt
->dts
))
1786 pkt
->dts
-= RELATIVE_TS_BASE
;
1787 if (is_relative(pkt
->pts
))
1788 pkt
->pts
-= RELATIVE_TS_BASE
;
1793 /* XXX: suppress the packet queue */
1794 static void flush_packet_queue(AVFormatContext
*s
)
1798 free_packet_buffer(&s
->internal
->parse_queue
, &s
->internal
->parse_queue_end
);
1799 free_packet_buffer(&s
->internal
->packet_buffer
, &s
->internal
->packet_buffer_end
);
1800 free_packet_buffer(&s
->internal
->raw_packet_buffer
, &s
->internal
->raw_packet_buffer_end
);
1802 s
->internal
->raw_packet_buffer_remaining_size
= RAW_PACKET_BUFFER_SIZE
;
1805 /*******************************************************/
1808 int av_find_default_stream_index(AVFormatContext
*s
)
1812 int best_stream
= 0;
1813 int best_score
= INT_MIN
;
1815 if (s
->nb_streams
<= 0)
1817 for (i
= 0; i
< s
->nb_streams
; i
++) {
1820 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
) {
1821 if (st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
)
1823 if (st
->codecpar
->width
&& st
->codecpar
->height
)
1827 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_AUDIO
) {
1828 if (st
->codecpar
->sample_rate
)
1831 if (st
->codec_info_nb_frames
)
1834 if (st
->discard
!= AVDISCARD_ALL
)
1837 if (score
> best_score
) {
1845 /** Flush the frame reader. */
1846 void ff_read_frame_flush(AVFormatContext
*s
)
1851 flush_packet_queue(s
);
1853 /* Reset read state for each stream. */
1854 for (i
= 0; i
< s
->nb_streams
; i
++) {
1858 av_parser_close(st
->parser
);
1861 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1862 st
->last_dts_for_order_check
= AV_NOPTS_VALUE
;
1863 if (st
->first_dts
== AV_NOPTS_VALUE
)
1864 st
->cur_dts
= RELATIVE_TS_BASE
;
1866 /* We set the current DTS to an unspecified origin. */
1867 st
->cur_dts
= AV_NOPTS_VALUE
;
1869 st
->probe_packets
= MAX_PROBE_PACKETS
;
1871 for (j
= 0; j
< MAX_REORDER_DELAY
+ 1; j
++)
1872 st
->pts_buffer
[j
] = AV_NOPTS_VALUE
;
1874 if (s
->internal
->inject_global_side_data
)
1875 st
->inject_global_side_data
= 1;
1877 st
->skip_samples
= 0;
1881 void ff_update_cur_dts(AVFormatContext
*s
, AVStream
*ref_st
, int64_t timestamp
)
1885 for (i
= 0; i
< s
->nb_streams
; i
++) {
1886 AVStream
*st
= s
->streams
[i
];
1889 av_rescale(timestamp
,
1890 st
->time_base
.den
* (int64_t) ref_st
->time_base
.num
,
1891 st
->time_base
.num
* (int64_t) ref_st
->time_base
.den
);
1895 void ff_reduce_index(AVFormatContext
*s
, int stream_index
)
1897 AVStream
*st
= s
->streams
[stream_index
];
1898 unsigned int max_entries
= s
->max_index_size
/ sizeof(AVIndexEntry
);
1900 if ((unsigned) st
->nb_index_entries
>= max_entries
) {
1902 for (i
= 0; 2 * i
< st
->nb_index_entries
; i
++)
1903 st
->index_entries
[i
] = st
->index_entries
[2 * i
];
1904 st
->nb_index_entries
= i
;
1908 int ff_add_index_entry(AVIndexEntry
**index_entries
,
1909 int *nb_index_entries
,
1910 unsigned int *index_entries_allocated_size
,
1911 int64_t pos
, int64_t timestamp
,
1912 int size
, int distance
, int flags
)
1914 AVIndexEntry
*entries
, *ie
;
1917 if ((unsigned) *nb_index_entries
+ 1 >= UINT_MAX
/ sizeof(AVIndexEntry
))
1920 if (timestamp
== AV_NOPTS_VALUE
)
1921 return AVERROR(EINVAL
);
1923 if (size
< 0 || size
> 0x3FFFFFFF)
1924 return AVERROR(EINVAL
);
1926 if (is_relative(timestamp
)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1927 timestamp
-= RELATIVE_TS_BASE
;
1929 entries
= av_fast_realloc(*index_entries
,
1930 index_entries_allocated_size
,
1931 (*nb_index_entries
+ 1) *
1932 sizeof(AVIndexEntry
));
1936 *index_entries
= entries
;
1938 index
= ff_index_search_timestamp(*index_entries
, *nb_index_entries
,
1939 timestamp
, AVSEEK_FLAG_ANY
);
1942 index
= (*nb_index_entries
)++;
1943 ie
= &entries
[index
];
1944 av_assert0(index
== 0 || ie
[-1].timestamp
< timestamp
);
1946 ie
= &entries
[index
];
1947 if (ie
->timestamp
!= timestamp
) {
1948 if (ie
->timestamp
<= timestamp
)
1950 memmove(entries
+ index
+ 1, entries
+ index
,
1951 sizeof(AVIndexEntry
) * (*nb_index_entries
- index
));
1952 (*nb_index_entries
)++;
1953 } else if (ie
->pos
== pos
&& distance
< ie
->min_distance
)
1954 // do not reduce the distance
1955 distance
= ie
->min_distance
;
1959 ie
->timestamp
= timestamp
;
1960 ie
->min_distance
= distance
;
1967 int av_add_index_entry(AVStream
*st
, int64_t pos
, int64_t timestamp
,
1968 int size
, int distance
, int flags
)
1970 timestamp
= wrap_timestamp(st
, timestamp
);
1971 return ff_add_index_entry(&st
->index_entries
, &st
->nb_index_entries
,
1972 &st
->index_entries_allocated_size
, pos
,
1973 timestamp
, size
, distance
, flags
);
1976 int ff_index_search_timestamp(const AVIndexEntry
*entries
, int nb_entries
,
1977 int64_t wanted_timestamp
, int flags
)
1985 // Optimize appending index entries at the end.
1986 if (b
&& entries
[b
- 1].timestamp
< wanted_timestamp
)
1992 // Search for the next non-discarded packet.
1993 while ((entries
[m
].flags
& AVINDEX_DISCARD_FRAME
) && m
< b
&& m
< nb_entries
- 1) {
1995 if (m
== b
&& entries
[m
].timestamp
>= wanted_timestamp
) {
2001 timestamp
= entries
[m
].timestamp
;
2002 if (timestamp
>= wanted_timestamp
)
2004 if (timestamp
<= wanted_timestamp
)
2007 m
= (flags
& AVSEEK_FLAG_BACKWARD
) ? a
: b
;
2009 if (!(flags
& AVSEEK_FLAG_ANY
))
2010 while (m
>= 0 && m
< nb_entries
&&
2011 !(entries
[m
].flags
& AVINDEX_KEYFRAME
))
2012 m
+= (flags
& AVSEEK_FLAG_BACKWARD
) ? -1 : 1;
2014 if (m
== nb_entries
)
2019 void ff_configure_buffers_for_index(AVFormatContext
*s
, int64_t time_tolerance
)
2022 int64_t pos_delta
= 0;
2024 //We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
2025 const char *proto
= avio_find_protocol_name(s
->filename
);
2027 av_assert0(time_tolerance
>= 0);
2030 av_log(s
, AV_LOG_INFO
,
2031 "Protocol name not provided, cannot determine if input is local or "
2032 "a network protocol, buffers and access patterns cannot be configured "
2033 "optimally without knowing the protocol\n");
2036 if (proto
&& !(strcmp(proto
, "file") && strcmp(proto
, "pipe") && strcmp(proto
, "cache")))
2039 for (ist1
= 0; ist1
< s
->nb_streams
; ist1
++) {
2040 AVStream
*st1
= s
->streams
[ist1
];
2041 for (ist2
= 0; ist2
< s
->nb_streams
; ist2
++) {
2042 AVStream
*st2
= s
->streams
[ist2
];
2048 for (i1
= i2
= 0; i1
< st1
->nb_index_entries
; i1
++) {
2049 AVIndexEntry
*e1
= &st1
->index_entries
[i1
];
2050 int64_t e1_pts
= av_rescale_q(e1
->timestamp
, st1
->time_base
, AV_TIME_BASE_Q
);
2052 skip
= FFMAX(skip
, e1
->size
);
2053 for (; i2
< st2
->nb_index_entries
; i2
++) {
2054 AVIndexEntry
*e2
= &st2
->index_entries
[i2
];
2055 int64_t e2_pts
= av_rescale_q(e2
->timestamp
, st2
->time_base
, AV_TIME_BASE_Q
);
2056 if (e2_pts
< e1_pts
|| e2_pts
- (uint64_t)e1_pts
< time_tolerance
)
2058 pos_delta
= FFMAX(pos_delta
, e1
->pos
- e2
->pos
);
2066 /* XXX This could be adjusted depending on protocol*/
2067 if (s
->pb
->buffer_size
< pos_delta
&& pos_delta
< (1<<24)) {
2068 av_log(s
, AV_LOG_VERBOSE
, "Reconfiguring buffers to size %"PRId64
"\n", pos_delta
);
2069 ffio_set_buf_size(s
->pb
, pos_delta
);
2070 s
->pb
->short_seek_threshold
= FFMAX(s
->pb
->short_seek_threshold
, pos_delta
/2);
2073 if (skip
< (1<<23)) {
2074 s
->pb
->short_seek_threshold
= FFMAX(s
->pb
->short_seek_threshold
, skip
);
2078 int av_index_search_timestamp(AVStream
*st
, int64_t wanted_timestamp
, int flags
)
2080 return ff_index_search_timestamp(st
->index_entries
, st
->nb_index_entries
,
2081 wanted_timestamp
, flags
);
2084 static int64_t ff_read_timestamp(AVFormatContext
*s
, int stream_index
, int64_t *ppos
, int64_t pos_limit
,
2085 int64_t (*read_timestamp
)(struct AVFormatContext
*, int , int64_t *, int64_t ))
2087 int64_t ts
= read_timestamp(s
, stream_index
, ppos
, pos_limit
);
2088 if (stream_index
>= 0)
2089 ts
= wrap_timestamp(s
->streams
[stream_index
], ts
);
2093 int ff_seek_frame_binary(AVFormatContext
*s
, int stream_index
,
2094 int64_t target_ts
, int flags
)
2096 AVInputFormat
*avif
= s
->iformat
;
2097 int64_t av_uninit(pos_min
), av_uninit(pos_max
), pos
, pos_limit
;
2098 int64_t ts_min
, ts_max
, ts
;
2103 if (stream_index
< 0)
2106 av_log(s
, AV_LOG_TRACE
, "read_seek: %d %s\n", stream_index
, av_ts2str(target_ts
));
2109 ts_min
= AV_NOPTS_VALUE
;
2110 pos_limit
= -1; // GCC falsely says it may be uninitialized.
2112 st
= s
->streams
[stream_index
];
2113 if (st
->index_entries
) {
2116 /* FIXME: Whole function must be checked for non-keyframe entries in
2117 * index case, especially read_timestamp(). */
2118 index
= av_index_search_timestamp(st
, target_ts
,
2119 flags
| AVSEEK_FLAG_BACKWARD
);
2120 index
= FFMAX(index
, 0);
2121 e
= &st
->index_entries
[index
];
2123 if (e
->timestamp
<= target_ts
|| e
->pos
== e
->min_distance
) {
2125 ts_min
= e
->timestamp
;
2126 av_log(s
, AV_LOG_TRACE
, "using cached pos_min=0x%"PRIx64
" dts_min=%s\n",
2127 pos_min
, av_ts2str(ts_min
));
2129 av_assert1(index
== 0);
2132 index
= av_index_search_timestamp(st
, target_ts
,
2133 flags
& ~AVSEEK_FLAG_BACKWARD
);
2134 av_assert0(index
< st
->nb_index_entries
);
2136 e
= &st
->index_entries
[index
];
2137 av_assert1(e
->timestamp
>= target_ts
);
2139 ts_max
= e
->timestamp
;
2140 pos_limit
= pos_max
- e
->min_distance
;
2141 av_log(s
, AV_LOG_TRACE
, "using cached pos_max=0x%"PRIx64
" pos_limit=0x%"PRIx64
2142 " dts_max=%s\n", pos_max
, pos_limit
, av_ts2str(ts_max
));
2146 pos
= ff_gen_search(s
, stream_index
, target_ts
, pos_min
, pos_max
, pos_limit
,
2147 ts_min
, ts_max
, flags
, &ts
, avif
->read_timestamp
);
2152 if ((ret
= avio_seek(s
->pb
, pos
, SEEK_SET
)) < 0)
2155 ff_read_frame_flush(s
);
2156 ff_update_cur_dts(s
, st
, ts
);
2161 int ff_find_last_ts(AVFormatContext
*s
, int stream_index
, int64_t *ts
, int64_t *pos
,
2162 int64_t (*read_timestamp
)(struct AVFormatContext
*, int , int64_t *, int64_t ))
2164 int64_t step
= 1024;
2165 int64_t limit
, ts_max
;
2166 int64_t filesize
= avio_size(s
->pb
);
2167 int64_t pos_max
= filesize
- 1;
2170 pos_max
= FFMAX(0, (pos_max
) - step
);
2171 ts_max
= ff_read_timestamp(s
, stream_index
,
2172 &pos_max
, limit
, read_timestamp
);
2174 } while (ts_max
== AV_NOPTS_VALUE
&& 2*limit
> step
);
2175 if (ts_max
== AV_NOPTS_VALUE
)
2179 int64_t tmp_pos
= pos_max
+ 1;
2180 int64_t tmp_ts
= ff_read_timestamp(s
, stream_index
,
2181 &tmp_pos
, INT64_MAX
, read_timestamp
);
2182 if (tmp_ts
== AV_NOPTS_VALUE
)
2184 av_assert0(tmp_pos
> pos_max
);
2187 if (tmp_pos
>= filesize
)
2199 int64_t ff_gen_search(AVFormatContext
*s
, int stream_index
, int64_t target_ts
,
2200 int64_t pos_min
, int64_t pos_max
, int64_t pos_limit
,
2201 int64_t ts_min
, int64_t ts_max
,
2202 int flags
, int64_t *ts_ret
,
2203 int64_t (*read_timestamp
)(struct AVFormatContext
*, int,
2204 int64_t *, int64_t))
2211 av_log(s
, AV_LOG_TRACE
, "gen_seek: %d %s\n", stream_index
, av_ts2str(target_ts
));
2213 if (ts_min
== AV_NOPTS_VALUE
) {
2214 pos_min
= s
->internal
->data_offset
;
2215 ts_min
= ff_read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
, read_timestamp
);
2216 if (ts_min
== AV_NOPTS_VALUE
)
2220 if (ts_min
>= target_ts
) {
2225 if (ts_max
== AV_NOPTS_VALUE
) {
2226 if ((ret
= ff_find_last_ts(s
, stream_index
, &ts_max
, &pos_max
, read_timestamp
)) < 0)
2228 pos_limit
= pos_max
;
2231 if (ts_max
<= target_ts
) {
2236 av_assert0(ts_min
< ts_max
);
2239 while (pos_min
< pos_limit
) {
2240 av_log(s
, AV_LOG_TRACE
,
2241 "pos_min=0x%"PRIx64
" pos_max=0x%"PRIx64
" dts_min=%s dts_max=%s\n",
2242 pos_min
, pos_max
, av_ts2str(ts_min
), av_ts2str(ts_max
));
2243 av_assert0(pos_limit
<= pos_max
);
2245 if (no_change
== 0) {
2246 int64_t approximate_keyframe_distance
= pos_max
- pos_limit
;
2247 // interpolate position (better than dichotomy)
2248 pos
= av_rescale(target_ts
- ts_min
, pos_max
- pos_min
,
2250 pos_min
- approximate_keyframe_distance
;
2251 } else if (no_change
== 1) {
2252 // bisection if interpolation did not change min / max pos last time
2253 pos
= (pos_min
+ pos_limit
) >> 1;
2255 /* linear search if bisection failed, can only happen if there
2256 * are very few or no keyframes between min/max */
2261 else if (pos
> pos_limit
)
2265 // May pass pos_limit instead of -1.
2266 ts
= ff_read_timestamp(s
, stream_index
, &pos
, INT64_MAX
, read_timestamp
);
2271 av_log(s
, AV_LOG_TRACE
, "%"PRId64
" %"PRId64
" %"PRId64
" / %s %s %s"
2272 " target:%s limit:%"PRId64
" start:%"PRId64
" noc:%d\n",
2273 pos_min
, pos
, pos_max
,
2274 av_ts2str(ts_min
), av_ts2str(ts
), av_ts2str(ts_max
), av_ts2str(target_ts
),
2275 pos_limit
, start_pos
, no_change
);
2276 if (ts
== AV_NOPTS_VALUE
) {
2277 av_log(s
, AV_LOG_ERROR
, "read_timestamp() failed in the middle\n");
2280 if (target_ts
<= ts
) {
2281 pos_limit
= start_pos
- 1;
2285 if (target_ts
>= ts
) {
2291 pos
= (flags
& AVSEEK_FLAG_BACKWARD
) ? pos_min
: pos_max
;
2292 ts
= (flags
& AVSEEK_FLAG_BACKWARD
) ? ts_min
: ts_max
;
2295 ts_min
= ff_read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
, read_timestamp
);
2297 ts_max
= ff_read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
, read_timestamp
);
2298 av_log(s
, AV_LOG_TRACE
, "pos=0x%"PRIx64
" %s<=%s<=%s\n",
2299 pos
, av_ts2str(ts_min
), av_ts2str(target_ts
), av_ts2str(ts_max
));
2305 static int seek_frame_byte(AVFormatContext
*s
, int stream_index
,
2306 int64_t pos
, int flags
)
2308 int64_t pos_min
, pos_max
;
2310 pos_min
= s
->internal
->data_offset
;
2311 pos_max
= avio_size(s
->pb
) - 1;
2315 else if (pos
> pos_max
)
2318 avio_seek(s
->pb
, pos
, SEEK_SET
);
2320 s
->io_repositioned
= 1;
2325 static int seek_frame_generic(AVFormatContext
*s
, int stream_index
,
2326 int64_t timestamp
, int flags
)
2333 st
= s
->streams
[stream_index
];
2335 index
= av_index_search_timestamp(st
, timestamp
, flags
);
2337 if (index
< 0 && st
->nb_index_entries
&&
2338 timestamp
< st
->index_entries
[0].timestamp
)
2341 if (index
< 0 || index
== st
->nb_index_entries
- 1) {
2345 if (st
->nb_index_entries
) {
2346 av_assert0(st
->index_entries
);
2347 ie
= &st
->index_entries
[st
->nb_index_entries
- 1];
2348 if ((ret
= avio_seek(s
->pb
, ie
->pos
, SEEK_SET
)) < 0)
2350 ff_update_cur_dts(s
, st
, ie
->timestamp
);
2352 if ((ret
= avio_seek(s
->pb
, s
->internal
->data_offset
, SEEK_SET
)) < 0)
2358 read_status
= av_read_frame(s
, &pkt
);
2359 } while (read_status
== AVERROR(EAGAIN
));
2360 if (read_status
< 0)
2362 if (stream_index
== pkt
.stream_index
&& pkt
.dts
> timestamp
) {
2363 if (pkt
.flags
& AV_PKT_FLAG_KEY
) {
2364 av_packet_unref(&pkt
);
2367 if (nonkey
++ > 1000 && st
->codecpar
->codec_id
!= AV_CODEC_ID_CDGRAPHICS
) {
2368 av_log(s
, AV_LOG_ERROR
,"seek_frame_generic failed as this stream seems to contain no keyframes after the target timestamp, %d non keyframes found\n", nonkey
);
2369 av_packet_unref(&pkt
);
2373 av_packet_unref(&pkt
);
2375 index
= av_index_search_timestamp(st
, timestamp
, flags
);
2380 ff_read_frame_flush(s
);
2381 if (s
->iformat
->read_seek
)
2382 if (s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
) >= 0)
2384 ie
= &st
->index_entries
[index
];
2385 if ((ret
= avio_seek(s
->pb
, ie
->pos
, SEEK_SET
)) < 0)
2387 ff_update_cur_dts(s
, st
, ie
->timestamp
);
2392 static int seek_frame_internal(AVFormatContext
*s
, int stream_index
,
2393 int64_t timestamp
, int flags
)
2398 if (flags
& AVSEEK_FLAG_BYTE
) {
2399 if (s
->iformat
->flags
& AVFMT_NO_BYTE_SEEK
)
2401 ff_read_frame_flush(s
);
2402 return seek_frame_byte(s
, stream_index
, timestamp
, flags
);
2405 if (stream_index
< 0) {
2406 stream_index
= av_find_default_stream_index(s
);
2407 if (stream_index
< 0)
2410 st
= s
->streams
[stream_index
];
2411 /* timestamp for default must be expressed in AV_TIME_BASE units */
2412 timestamp
= av_rescale(timestamp
, st
->time_base
.den
,
2413 AV_TIME_BASE
* (int64_t) st
->time_base
.num
);
2416 /* first, we try the format specific seek */
2417 if (s
->iformat
->read_seek
) {
2418 ff_read_frame_flush(s
);
2419 ret
= s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
);
2425 if (s
->iformat
->read_timestamp
&&
2426 !(s
->iformat
->flags
& AVFMT_NOBINSEARCH
)) {
2427 ff_read_frame_flush(s
);
2428 return ff_seek_frame_binary(s
, stream_index
, timestamp
, flags
);
2429 } else if (!(s
->iformat
->flags
& AVFMT_NOGENSEARCH
)) {
2430 ff_read_frame_flush(s
);
2431 return seek_frame_generic(s
, stream_index
, timestamp
, flags
);
2436 int av_seek_frame(AVFormatContext
*s
, int stream_index
,
2437 int64_t timestamp
, int flags
)
2441 if (s
->iformat
->read_seek2
&& !s
->iformat
->read_seek
) {
2442 int64_t min_ts
= INT64_MIN
, max_ts
= INT64_MAX
;
2443 if ((flags
& AVSEEK_FLAG_BACKWARD
))
2447 return avformat_seek_file(s
, stream_index
, min_ts
, timestamp
, max_ts
,
2448 flags
& ~AVSEEK_FLAG_BACKWARD
);
2451 ret
= seek_frame_internal(s
, stream_index
, timestamp
, flags
);
2454 ret
= avformat_queue_attached_pictures(s
);
2459 int avformat_seek_file(AVFormatContext
*s
, int stream_index
, int64_t min_ts
,
2460 int64_t ts
, int64_t max_ts
, int flags
)
2462 if (min_ts
> ts
|| max_ts
< ts
)
2464 if (stream_index
< -1 || stream_index
>= (int)s
->nb_streams
)
2465 return AVERROR(EINVAL
);
2468 flags
|= AVSEEK_FLAG_ANY
;
2469 flags
&= ~AVSEEK_FLAG_BACKWARD
;
2471 if (s
->iformat
->read_seek2
) {
2473 ff_read_frame_flush(s
);
2475 if (stream_index
== -1 && s
->nb_streams
== 1) {
2476 AVRational time_base
= s
->streams
[0]->time_base
;
2477 ts
= av_rescale_q(ts
, AV_TIME_BASE_Q
, time_base
);
2478 min_ts
= av_rescale_rnd(min_ts
, time_base
.den
,
2479 time_base
.num
* (int64_t)AV_TIME_BASE
,
2480 AV_ROUND_UP
| AV_ROUND_PASS_MINMAX
);
2481 max_ts
= av_rescale_rnd(max_ts
, time_base
.den
,
2482 time_base
.num
* (int64_t)AV_TIME_BASE
,
2483 AV_ROUND_DOWN
| AV_ROUND_PASS_MINMAX
);
2487 ret
= s
->iformat
->read_seek2(s
, stream_index
, min_ts
,
2491 ret
= avformat_queue_attached_pictures(s
);
2495 if (s
->iformat
->read_timestamp
) {
2496 // try to seek via read_timestamp()
2499 // Fall back on old API if new is not implemented but old is.
2500 // Note the old API has somewhat different semantics.
2501 if (s
->iformat
->read_seek
|| 1) {
2502 int dir
= (ts
- (uint64_t)min_ts
> (uint64_t)max_ts
- ts
? AVSEEK_FLAG_BACKWARD
: 0);
2503 int ret
= av_seek_frame(s
, stream_index
, ts
, flags
| dir
);
2504 if (ret
<0 && ts
!= min_ts
&& max_ts
!= ts
) {
2505 ret
= av_seek_frame(s
, stream_index
, dir
? max_ts
: min_ts
, flags
| dir
);
2507 ret
= av_seek_frame(s
, stream_index
, ts
, flags
| (dir
^AVSEEK_FLAG_BACKWARD
));
2512 // try some generic seek like seek_frame_generic() but with new ts semantics
2513 return -1; //unreachable
2516 int avformat_flush(AVFormatContext
*s
)
2518 ff_read_frame_flush(s
);
2522 /*******************************************************/
2525 * Return TRUE if the stream has accurate duration in any stream.
2527 * @return TRUE if the stream has accurate duration for at least one component.
2529 static int has_duration(AVFormatContext
*ic
)
2534 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2535 st
= ic
->streams
[i
];
2536 if (st
->duration
!= AV_NOPTS_VALUE
)
2539 if (ic
->duration
!= AV_NOPTS_VALUE
)
2545 * Estimate the stream timings from the one of each components.
2547 * Also computes the global bitrate if possible.
2549 static void update_stream_timings(AVFormatContext
*ic
)
2551 int64_t start_time
, start_time1
, start_time_text
, end_time
, end_time1
, end_time_text
;
2552 int64_t duration
, duration1
, filesize
;
2557 start_time
= INT64_MAX
;
2558 start_time_text
= INT64_MAX
;
2559 end_time
= INT64_MIN
;
2560 end_time_text
= INT64_MIN
;
2561 duration
= INT64_MIN
;
2562 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2563 st
= ic
->streams
[i
];
2564 if (st
->start_time
!= AV_NOPTS_VALUE
&& st
->time_base
.den
) {
2565 start_time1
= av_rescale_q(st
->start_time
, st
->time_base
,
2567 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_SUBTITLE
|| st
->codecpar
->codec_type
== AVMEDIA_TYPE_DATA
) {
2568 if (start_time1
< start_time_text
)
2569 start_time_text
= start_time1
;
2571 start_time
= FFMIN(start_time
, start_time1
);
2572 end_time1
= av_rescale_q_rnd(st
->duration
, st
->time_base
,
2574 AV_ROUND_NEAR_INF
|AV_ROUND_PASS_MINMAX
);
2575 if (end_time1
!= AV_NOPTS_VALUE
&& (end_time1
> 0 ? start_time1
<= INT64_MAX
- end_time1
: start_time1
>= INT64_MIN
- end_time1
)) {
2576 end_time1
+= start_time1
;
2577 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_SUBTITLE
|| st
->codecpar
->codec_type
== AVMEDIA_TYPE_DATA
)
2578 end_time_text
= FFMAX(end_time_text
, end_time1
);
2580 end_time
= FFMAX(end_time
, end_time1
);
2582 for (p
= NULL
; (p
= av_find_program_from_stream(ic
, p
, i
)); ) {
2583 if (p
->start_time
== AV_NOPTS_VALUE
|| p
->start_time
> start_time1
)
2584 p
->start_time
= start_time1
;
2585 if (p
->end_time
< end_time1
)
2586 p
->end_time
= end_time1
;
2589 if (st
->duration
!= AV_NOPTS_VALUE
) {
2590 duration1
= av_rescale_q(st
->duration
, st
->time_base
,
2592 duration
= FFMAX(duration
, duration1
);
2595 if (start_time
== INT64_MAX
|| (start_time
> start_time_text
&& start_time
- start_time_text
< AV_TIME_BASE
))
2596 start_time
= start_time_text
;
2597 else if (start_time
> start_time_text
)
2598 av_log(ic
, AV_LOG_VERBOSE
, "Ignoring outlier non primary stream starttime %f\n", start_time_text
/ (float)AV_TIME_BASE
);
2600 if (end_time
== INT64_MIN
|| (end_time
< end_time_text
&& end_time_text
- (uint64_t)end_time
< AV_TIME_BASE
)) {
2601 end_time
= end_time_text
;
2602 } else if (end_time
< end_time_text
) {
2603 av_log(ic
, AV_LOG_VERBOSE
, "Ignoring outlier non primary stream endtime %f\n", end_time_text
/ (float)AV_TIME_BASE
);
2606 if (start_time
!= INT64_MAX
) {
2607 ic
->start_time
= start_time
;
2608 if (end_time
!= INT64_MIN
) {
2609 if (ic
->nb_programs
> 1) {
2610 for (i
= 0; i
< ic
->nb_programs
; i
++) {
2611 p
= ic
->programs
[i
];
2612 if (p
->start_time
!= AV_NOPTS_VALUE
&&
2613 p
->end_time
> p
->start_time
&&
2614 p
->end_time
- (uint64_t)p
->start_time
<= INT64_MAX
)
2615 duration
= FFMAX(duration
, p
->end_time
- p
->start_time
);
2617 } else if (end_time
>= start_time
&& end_time
- (uint64_t)start_time
<= INT64_MAX
) {
2618 duration
= FFMAX(duration
, end_time
- start_time
);
2622 if (duration
!= INT64_MIN
&& duration
> 0 && ic
->duration
== AV_NOPTS_VALUE
) {
2623 ic
->duration
= duration
;
2625 if (ic
->pb
&& (filesize
= avio_size(ic
->pb
)) > 0 && ic
->duration
> 0) {
2626 /* compute the bitrate */
2627 double bitrate
= (double) filesize
* 8.0 * AV_TIME_BASE
/
2628 (double) ic
->duration
;
2629 if (bitrate
>= 0 && bitrate
<= INT64_MAX
)
2630 ic
->bit_rate
= bitrate
;
2634 static void fill_all_stream_timings(AVFormatContext
*ic
)
2639 update_stream_timings(ic
);
2640 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2641 st
= ic
->streams
[i
];
2642 if (st
->start_time
== AV_NOPTS_VALUE
) {
2643 if (ic
->start_time
!= AV_NOPTS_VALUE
)
2644 st
->start_time
= av_rescale_q(ic
->start_time
, AV_TIME_BASE_Q
,
2646 if (ic
->duration
!= AV_NOPTS_VALUE
)
2647 st
->duration
= av_rescale_q(ic
->duration
, AV_TIME_BASE_Q
,
2653 static void estimate_timings_from_bit_rate(AVFormatContext
*ic
)
2655 int64_t filesize
, duration
;
2656 int i
, show_warning
= 0;
2659 /* if bit_rate is already set, we believe it */
2660 if (ic
->bit_rate
<= 0) {
2661 int64_t bit_rate
= 0;
2662 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2663 st
= ic
->streams
[i
];
2664 if (st
->codecpar
->bit_rate
<= 0 && st
->internal
->avctx
->bit_rate
> 0)
2665 st
->codecpar
->bit_rate
= st
->internal
->avctx
->bit_rate
;
2666 if (st
->codecpar
->bit_rate
> 0) {
2667 if (INT64_MAX
- st
->codecpar
->bit_rate
< bit_rate
) {
2671 bit_rate
+= st
->codecpar
->bit_rate
;
2672 } else if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
&& st
->codec_info_nb_frames
> 1) {
2673 // If we have a videostream with packets but without a bitrate
2674 // then consider the sum not known
2679 ic
->bit_rate
= bit_rate
;
2682 /* if duration is already set, we believe it */
2683 if (ic
->duration
== AV_NOPTS_VALUE
&&
2684 ic
->bit_rate
!= 0) {
2685 filesize
= ic
->pb
? avio_size(ic
->pb
) : 0;
2686 if (filesize
> ic
->internal
->data_offset
) {
2687 filesize
-= ic
->internal
->data_offset
;
2688 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2689 st
= ic
->streams
[i
];
2690 if ( st
->time_base
.num
<= INT64_MAX
/ ic
->bit_rate
2691 && st
->duration
== AV_NOPTS_VALUE
) {
2692 duration
= av_rescale(filesize
, 8LL * st
->time_base
.den
,
2694 (int64_t) st
->time_base
.num
);
2695 st
->duration
= duration
;
2702 av_log(ic
, AV_LOG_WARNING
,
2703 "Estimating duration from bitrate, this may be inaccurate\n");
2706 #define DURATION_MAX_READ_SIZE 250000LL
2707 #define DURATION_MAX_RETRY 6
2709 /* only usable for MPEG-PS streams */
2710 static void estimate_timings_from_pts(AVFormatContext
*ic
, int64_t old_offset
)
2712 AVPacket pkt1
, *pkt
= &pkt1
;
2714 int num
, den
, read_size
, i
, ret
;
2715 int found_duration
= 0;
2717 int64_t filesize
, offset
, duration
;
2720 /* flush packet queue */
2721 flush_packet_queue(ic
);
2723 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2724 st
= ic
->streams
[i
];
2725 if (st
->start_time
== AV_NOPTS_VALUE
&&
2726 st
->first_dts
== AV_NOPTS_VALUE
&&
2727 st
->codecpar
->codec_type
!= AVMEDIA_TYPE_UNKNOWN
)
2728 av_log(ic
, AV_LOG_WARNING
,
2729 "start time for stream %d is not set in estimate_timings_from_pts\n", i
);
2732 av_parser_close(st
->parser
);
2737 av_opt_set(ic
, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN
);
2738 /* estimate the end time (duration) */
2739 /* XXX: may need to support wrapping */
2740 filesize
= ic
->pb
? avio_size(ic
->pb
) : 0;
2742 is_end
= found_duration
;
2743 offset
= filesize
- (DURATION_MAX_READ_SIZE
<< retry
);
2747 avio_seek(ic
->pb
, offset
, SEEK_SET
);
2750 if (read_size
>= DURATION_MAX_READ_SIZE
<< (FFMAX(retry
- 1, 0)))
2754 ret
= ff_read_packet(ic
, pkt
);
2755 } while (ret
== AVERROR(EAGAIN
));
2758 read_size
+= pkt
->size
;
2759 st
= ic
->streams
[pkt
->stream_index
];
2760 if (pkt
->pts
!= AV_NOPTS_VALUE
&&
2761 (st
->start_time
!= AV_NOPTS_VALUE
||
2762 st
->first_dts
!= AV_NOPTS_VALUE
)) {
2763 if (pkt
->duration
== 0) {
2764 ff_compute_frame_duration(ic
, &num
, &den
, st
, st
->parser
, pkt
);
2766 pkt
->duration
= av_rescale_rnd(1,
2767 num
* (int64_t) st
->time_base
.den
,
2768 den
* (int64_t) st
->time_base
.num
,
2772 duration
= pkt
->pts
+ pkt
->duration
;
2774 if (st
->start_time
!= AV_NOPTS_VALUE
)
2775 duration
-= st
->start_time
;
2777 duration
-= st
->first_dts
;
2779 if (st
->duration
== AV_NOPTS_VALUE
|| st
->info
->last_duration
<= 0 ||
2780 (st
->duration
< duration
&& FFABS(duration
- st
->info
->last_duration
) < 60LL*st
->time_base
.den
/ st
->time_base
.num
))
2781 st
->duration
= duration
;
2782 st
->info
->last_duration
= duration
;
2785 av_packet_unref(pkt
);
2788 /* check if all audio/video streams have valid duration */
2791 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2792 st
= ic
->streams
[i
];
2793 switch (st
->codecpar
->codec_type
) {
2794 case AVMEDIA_TYPE_VIDEO
:
2795 case AVMEDIA_TYPE_AUDIO
:
2796 if (st
->duration
== AV_NOPTS_VALUE
)
2803 ++retry
<= DURATION_MAX_RETRY
);
2805 av_opt_set(ic
, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN
);
2807 /* warn about audio/video streams which duration could not be estimated */
2808 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2809 st
= ic
->streams
[i
];
2810 if (st
->duration
== AV_NOPTS_VALUE
) {
2811 switch (st
->codecpar
->codec_type
) {
2812 case AVMEDIA_TYPE_VIDEO
:
2813 case AVMEDIA_TYPE_AUDIO
:
2814 if (st
->start_time
!= AV_NOPTS_VALUE
|| st
->first_dts
!= AV_NOPTS_VALUE
) {
2815 av_log(ic
, AV_LOG_DEBUG
, "stream %d : no PTS found at end of file, duration not set\n", i
);
2817 av_log(ic
, AV_LOG_DEBUG
, "stream %d : no TS found at start of file, duration not set\n", i
);
2821 fill_all_stream_timings(ic
);
2823 avio_seek(ic
->pb
, old_offset
, SEEK_SET
);
2824 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2827 st
= ic
->streams
[i
];
2828 st
->cur_dts
= st
->first_dts
;
2829 st
->last_IP_pts
= AV_NOPTS_VALUE
;
2830 st
->last_dts_for_order_check
= AV_NOPTS_VALUE
;
2831 for (j
= 0; j
< MAX_REORDER_DELAY
+ 1; j
++)
2832 st
->pts_buffer
[j
] = AV_NOPTS_VALUE
;
2836 static void estimate_timings(AVFormatContext
*ic
, int64_t old_offset
)
2840 /* get the file size, if possible */
2841 if (ic
->iformat
->flags
& AVFMT_NOFILE
) {
2844 file_size
= avio_size(ic
->pb
);
2845 file_size
= FFMAX(0, file_size
);
2848 if ((!strcmp(ic
->iformat
->name
, "mpeg") ||
2849 !strcmp(ic
->iformat
->name
, "mpegts")) &&
2850 file_size
&& ic
->pb
->seekable
) {
2851 /* get accurate estimate from the PTSes */
2852 estimate_timings_from_pts(ic
, old_offset
);
2853 ic
->duration_estimation_method
= AVFMT_DURATION_FROM_PTS
;
2854 } else if (has_duration(ic
)) {
2855 /* at least one component has timings - we use them for all
2857 fill_all_stream_timings(ic
);
2858 ic
->duration_estimation_method
= AVFMT_DURATION_FROM_STREAM
;
2860 /* less precise: use bitrate info */
2861 estimate_timings_from_bit_rate(ic
);
2862 ic
->duration_estimation_method
= AVFMT_DURATION_FROM_BITRATE
;
2864 update_stream_timings(ic
);
2868 AVStream av_unused
*st
;
2869 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2870 st
= ic
->streams
[i
];
2871 if (st
->time_base
.den
)
2872 av_log(ic
, AV_LOG_TRACE
, "stream %d: start_time: %0.3f duration: %0.3f\n", i
,
2873 (double) st
->start_time
* av_q2d(st
->time_base
),
2874 (double) st
->duration
* av_q2d(st
->time_base
));
2876 av_log(ic
, AV_LOG_TRACE
,
2877 "format: start_time: %0.3f duration: %0.3f bitrate=%"PRId64
" kb/s\n",
2878 (double) ic
->start_time
/ AV_TIME_BASE
,
2879 (double) ic
->duration
/ AV_TIME_BASE
,
2880 (int64_t)ic
->bit_rate
/ 1000);
2884 static int has_codec_parameters(AVStream
*st
, const char **errmsg_ptr
)
2886 AVCodecContext
*avctx
= st
->internal
->avctx
;
2888 #define FAIL(errmsg) do { \
2890 *errmsg_ptr = errmsg; \
2894 if ( avctx
->codec_id
== AV_CODEC_ID_NONE
2895 && avctx
->codec_type
!= AVMEDIA_TYPE_DATA
)
2896 FAIL("unknown codec");
2897 switch (avctx
->codec_type
) {
2898 case AVMEDIA_TYPE_AUDIO
:
2899 if (!avctx
->frame_size
&& determinable_frame_size(avctx
))
2900 FAIL("unspecified frame size");
2901 if (st
->info
->found_decoder
>= 0 &&
2902 avctx
->sample_fmt
== AV_SAMPLE_FMT_NONE
)
2903 FAIL("unspecified sample format");
2904 if (!avctx
->sample_rate
)
2905 FAIL("unspecified sample rate");
2906 if (!avctx
->channels
)
2907 FAIL("unspecified number of channels");
2908 if (st
->info
->found_decoder
>= 0 && !st
->nb_decoded_frames
&& avctx
->codec_id
== AV_CODEC_ID_DTS
)
2909 FAIL("no decodable DTS frames");
2911 case AVMEDIA_TYPE_VIDEO
:
2913 FAIL("unspecified size");
2914 if (st
->info
->found_decoder
>= 0 && avctx
->pix_fmt
== AV_PIX_FMT_NONE
)
2915 FAIL("unspecified pixel format");
2916 if (st
->codecpar
->codec_id
== AV_CODEC_ID_RV30
|| st
->codecpar
->codec_id
== AV_CODEC_ID_RV40
)
2917 if (!st
->sample_aspect_ratio
.num
&& !st
->codecpar
->sample_aspect_ratio
.num
&& !st
->codec_info_nb_frames
)
2918 FAIL("no frame in rv30/40 and no sar");
2920 case AVMEDIA_TYPE_SUBTITLE
:
2921 if (avctx
->codec_id
== AV_CODEC_ID_HDMV_PGS_SUBTITLE
&& !avctx
->width
)
2922 FAIL("unspecified size");
2924 case AVMEDIA_TYPE_DATA
:
2925 if (avctx
->codec_id
== AV_CODEC_ID_NONE
) return 1;
2931 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2932 static int try_decode_frame(AVFormatContext
*s
, AVStream
*st
, AVPacket
*avpkt
,
2933 AVDictionary
**options
)
2935 AVCodecContext
*avctx
= st
->internal
->avctx
;
2936 const AVCodec
*codec
;
2937 int got_picture
= 1, ret
= 0;
2938 AVFrame
*frame
= av_frame_alloc();
2939 AVSubtitle subtitle
;
2940 AVPacket pkt
= *avpkt
;
2941 int do_skip_frame
= 0;
2942 enum AVDiscard skip_frame
;
2945 return AVERROR(ENOMEM
);
2947 if (!avcodec_is_open(avctx
) &&
2948 st
->info
->found_decoder
<= 0 &&
2949 (st
->codecpar
->codec_id
!= -st
->info
->found_decoder
|| !st
->codecpar
->codec_id
)) {
2950 AVDictionary
*thread_opt
= NULL
;
2952 codec
= find_probe_decoder(s
, st
, st
->codecpar
->codec_id
);
2955 st
->info
->found_decoder
= -st
->codecpar
->codec_id
;
2960 /* Force thread count to 1 since the H.264 decoder will not extract
2961 * SPS and PPS to extradata during multi-threaded decoding. */
2962 av_dict_set(options
? options
: &thread_opt
, "threads", "1", 0);
2963 if (s
->codec_whitelist
)
2964 av_dict_set(options
? options
: &thread_opt
, "codec_whitelist", s
->codec_whitelist
, 0);
2965 ret
= avcodec_open2(avctx
, codec
, options
? options
: &thread_opt
);
2967 av_dict_free(&thread_opt
);
2969 st
->info
->found_decoder
= -avctx
->codec_id
;
2972 st
->info
->found_decoder
= 1;
2973 } else if (!st
->info
->found_decoder
)
2974 st
->info
->found_decoder
= 1;
2976 if (st
->info
->found_decoder
< 0) {
2981 if (avpriv_codec_get_cap_skip_frame_fill_param(avctx
->codec
)) {
2983 skip_frame
= avctx
->skip_frame
;
2984 avctx
->skip_frame
= AVDISCARD_ALL
;
2987 while ((pkt
.size
> 0 || (!pkt
.data
&& got_picture
)) &&
2989 (!has_codec_parameters(st
, NULL
) || !has_decode_delay_been_guessed(st
) ||
2990 (!st
->codec_info_nb_frames
&&
2991 (avctx
->codec
->capabilities
& AV_CODEC_CAP_CHANNEL_CONF
)))) {
2993 if (avctx
->codec_type
== AVMEDIA_TYPE_VIDEO
||
2994 avctx
->codec_type
== AVMEDIA_TYPE_AUDIO
) {
2995 ret
= avcodec_send_packet(avctx
, &pkt
);
2996 if (ret
< 0 && ret
!= AVERROR(EAGAIN
) && ret
!= AVERROR_EOF
)
3000 ret
= avcodec_receive_frame(avctx
, frame
);
3003 if (ret
== AVERROR(EAGAIN
) || ret
== AVERROR_EOF
)
3005 } else if (avctx
->codec_type
== AVMEDIA_TYPE_SUBTITLE
) {
3006 ret
= avcodec_decode_subtitle2(avctx
, &subtitle
,
3007 &got_picture
, &pkt
);
3013 st
->nb_decoded_frames
++;
3018 if (!pkt
.data
&& !got_picture
)
3022 if (do_skip_frame
) {
3023 avctx
->skip_frame
= skip_frame
;
3026 av_frame_free(&frame
);
3030 unsigned int ff_codec_get_tag(const AVCodecTag
*tags
, enum AVCodecID id
)
3032 while (tags
->id
!= AV_CODEC_ID_NONE
) {
3040 enum AVCodecID
ff_codec_get_id(const AVCodecTag
*tags
, unsigned int tag
)
3043 for (i
= 0; tags
[i
].id
!= AV_CODEC_ID_NONE
; i
++)
3044 if (tag
== tags
[i
].tag
)
3046 for (i
= 0; tags
[i
].id
!= AV_CODEC_ID_NONE
; i
++)
3047 if (avpriv_toupper4(tag
) == avpriv_toupper4(tags
[i
].tag
))
3049 return AV_CODEC_ID_NONE
;
3052 enum AVCodecID
ff_get_pcm_codec_id(int bps
, int flt
, int be
, int sflags
)
3054 if (bps
<= 0 || bps
> 64)
3055 return AV_CODEC_ID_NONE
;
3060 return be
? AV_CODEC_ID_PCM_F32BE
: AV_CODEC_ID_PCM_F32LE
;
3062 return be
? AV_CODEC_ID_PCM_F64BE
: AV_CODEC_ID_PCM_F64LE
;
3064 return AV_CODEC_ID_NONE
;
3069 if (sflags
& (1 << (bps
- 1))) {
3072 return AV_CODEC_ID_PCM_S8
;
3074 return be
? AV_CODEC_ID_PCM_S16BE
: AV_CODEC_ID_PCM_S16LE
;
3076 return be
? AV_CODEC_ID_PCM_S24BE
: AV_CODEC_ID_PCM_S24LE
;
3078 return be
? AV_CODEC_ID_PCM_S32BE
: AV_CODEC_ID_PCM_S32LE
;
3080 return be
? AV_CODEC_ID_PCM_S64BE
: AV_CODEC_ID_PCM_S64LE
;
3082 return AV_CODEC_ID_NONE
;
3087 return AV_CODEC_ID_PCM_U8
;
3089 return be
? AV_CODEC_ID_PCM_U16BE
: AV_CODEC_ID_PCM_U16LE
;
3091 return be
? AV_CODEC_ID_PCM_U24BE
: AV_CODEC_ID_PCM_U24LE
;
3093 return be
? AV_CODEC_ID_PCM_U32BE
: AV_CODEC_ID_PCM_U32LE
;
3095 return AV_CODEC_ID_NONE
;
3101 unsigned int av_codec_get_tag(const AVCodecTag
*const *tags
, enum AVCodecID id
)
3104 if (!av_codec_get_tag2(tags
, id
, &tag
))
3109 int av_codec_get_tag2(const AVCodecTag
* const *tags
, enum AVCodecID id
,
3113 for (i
= 0; tags
&& tags
[i
]; i
++) {
3114 const AVCodecTag
*codec_tags
= tags
[i
];
3115 while (codec_tags
->id
!= AV_CODEC_ID_NONE
) {
3116 if (codec_tags
->id
== id
) {
3117 *tag
= codec_tags
->tag
;
3126 enum AVCodecID
av_codec_get_id(const AVCodecTag
*const *tags
, unsigned int tag
)
3129 for (i
= 0; tags
&& tags
[i
]; i
++) {
3130 enum AVCodecID id
= ff_codec_get_id(tags
[i
], tag
);
3131 if (id
!= AV_CODEC_ID_NONE
)
3134 return AV_CODEC_ID_NONE
;
3137 static void compute_chapters_end(AVFormatContext
*s
)
3140 int64_t max_time
= 0;
3142 if (s
->duration
> 0 && s
->start_time
< INT64_MAX
- s
->duration
)
3143 max_time
= s
->duration
+
3144 ((s
->start_time
== AV_NOPTS_VALUE
) ? 0 : s
->start_time
);
3146 for (i
= 0; i
< s
->nb_chapters
; i
++)
3147 if (s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
3148 AVChapter
*ch
= s
->chapters
[i
];
3149 int64_t end
= max_time
? av_rescale_q(max_time
, AV_TIME_BASE_Q
,
3153 for (j
= 0; j
< s
->nb_chapters
; j
++) {
3154 AVChapter
*ch1
= s
->chapters
[j
];
3155 int64_t next_start
= av_rescale_q(ch1
->start
, ch1
->time_base
,
3157 if (j
!= i
&& next_start
> ch
->start
&& next_start
< end
)
3160 ch
->end
= (end
== INT64_MAX
) ? ch
->start
: end
;
3164 static int get_std_framerate(int i
)
3167 return (i
+ 1) * 1001;
3171 return (i
+ 31) * 1001 * 12;
3175 return ((const int[]) { 80, 120, 240})[i
] * 1001 * 12;
3179 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i
] * 1000 * 12;
3182 /* Is the time base unreliable?
3183 * This is a heuristic to balance between quick acceptance of the values in
3184 * the headers vs. some extra checks.
3185 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
3186 * MPEG-2 commonly misuses field repeat flags to store different framerates.
3187 * And there are "variable" fps files this needs to detect as well. */
3188 static int tb_unreliable(AVCodecContext
*c
)
3190 if (c
->time_base
.den
>= 101LL * c
->time_base
.num
||
3191 c
->time_base
.den
< 5LL * c
->time_base
.num
||
3192 // c->codec_tag == AV_RL32("DIVX") ||
3193 // c->codec_tag == AV_RL32("XVID") ||
3194 c
->codec_tag
== AV_RL32("mp4v") ||
3195 c
->codec_id
== AV_CODEC_ID_MPEG2VIDEO
||
3196 c
->codec_id
== AV_CODEC_ID_GIF
||
3197 c
->codec_id
== AV_CODEC_ID_HEVC
||
3198 c
->codec_id
== AV_CODEC_ID_H264
)
3203 int ff_alloc_extradata(AVCodecParameters
*par
, int size
)
3207 if (size
< 0 || size
>= INT32_MAX
- AV_INPUT_BUFFER_PADDING_SIZE
) {
3208 par
->extradata
= NULL
;
3209 par
->extradata_size
= 0;
3210 return AVERROR(EINVAL
);
3212 par
->extradata
= av_malloc(size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
3213 if (par
->extradata
) {
3214 memset(par
->extradata
+ size
, 0, AV_INPUT_BUFFER_PADDING_SIZE
);
3215 par
->extradata_size
= size
;
3218 par
->extradata_size
= 0;
3219 ret
= AVERROR(ENOMEM
);
3224 int ff_get_extradata(AVFormatContext
*s
, AVCodecParameters
*par
, AVIOContext
*pb
, int size
)
3226 int ret
= ff_alloc_extradata(par
, size
);
3229 ret
= avio_read(pb
, par
->extradata
, size
);
3231 av_freep(&par
->extradata
);
3232 par
->extradata_size
= 0;
3233 av_log(s
, AV_LOG_ERROR
, "Failed to read extradata of size %d\n", size
);
3234 return ret
< 0 ? ret
: AVERROR_INVALIDDATA
;
3240 int ff_rfps_add_frame(AVFormatContext
*ic
, AVStream
*st
, int64_t ts
)
3243 int64_t last
= st
->info
->last_dts
;
3245 if ( ts
!= AV_NOPTS_VALUE
&& last
!= AV_NOPTS_VALUE
&& ts
> last
3246 && ts
- (uint64_t)last
< INT64_MAX
) {
3247 double dts
= (is_relative(ts
) ? ts
- RELATIVE_TS_BASE
: ts
) * av_q2d(st
->time_base
);
3248 int64_t duration
= ts
- last
;
3250 if (!st
->info
->duration_error
)
3251 st
->info
->duration_error
= av_mallocz(sizeof(st
->info
->duration_error
[0])*2);
3252 if (!st
->info
->duration_error
)
3253 return AVERROR(ENOMEM
);
3255 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3256 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
3257 for (i
= 0; i
<MAX_STD_TIMEBASES
; i
++) {
3258 if (st
->info
->duration_error
[0][1][i
] < 1e10
) {
3259 int framerate
= get_std_framerate(i
);
3260 double sdts
= dts
*framerate
/(1001*12);
3261 for (j
= 0; j
<2; j
++) {
3262 int64_t ticks
= llrint(sdts
+j
*0.5);
3263 double error
= sdts
- ticks
+ j
*0.5;
3264 st
->info
->duration_error
[j
][0][i
] += error
;
3265 st
->info
->duration_error
[j
][1][i
] += error
*error
;
3269 if (st
->info
->rfps_duration_sum
<= INT64_MAX
- duration
) {
3270 st
->info
->duration_count
++;
3271 st
->info
->rfps_duration_sum
+= duration
;
3274 if (st
->info
->duration_count
% 10 == 0) {
3275 int n
= st
->info
->duration_count
;
3276 for (i
= 0; i
<MAX_STD_TIMEBASES
; i
++) {
3277 if (st
->info
->duration_error
[0][1][i
] < 1e10
) {
3278 double a0
= st
->info
->duration_error
[0][0][i
] / n
;
3279 double error0
= st
->info
->duration_error
[0][1][i
] / n
- a0
*a0
;
3280 double a1
= st
->info
->duration_error
[1][0][i
] / n
;
3281 double error1
= st
->info
->duration_error
[1][1][i
] / n
- a1
*a1
;
3282 if (error0
> 0.04 && error1
> 0.04) {
3283 st
->info
->duration_error
[0][1][i
] = 2e10
;
3284 st
->info
->duration_error
[1][1][i
] = 2e10
;
3290 // ignore the first 4 values, they might have some random jitter
3291 if (st
->info
->duration_count
> 3 && is_relative(ts
) == is_relative(last
))
3292 st
->info
->duration_gcd
= av_gcd(st
->info
->duration_gcd
, duration
);
3294 if (ts
!= AV_NOPTS_VALUE
)
3295 st
->info
->last_dts
= ts
;
3300 void ff_rfps_calculate(AVFormatContext
*ic
)
3304 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3305 AVStream
*st
= ic
->streams
[i
];
3307 if (st
->codecpar
->codec_type
!= AVMEDIA_TYPE_VIDEO
)
3309 // the check for tb_unreliable() is not completely correct, since this is not about handling
3310 // an unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3311 // ipmovie.c produces.
3312 if (tb_unreliable(st
->internal
->avctx
) && st
->info
->duration_count
> 15 && st
->info
->duration_gcd
> FFMAX(1, st
->time_base
.den
/(500LL*st
->time_base
.num
)) && !st
->r_frame_rate
.num
)
3313 av_reduce(&st
->r_frame_rate
.num
, &st
->r_frame_rate
.den
, st
->time_base
.den
, st
->time_base
.num
* st
->info
->duration_gcd
, INT_MAX
);
3314 if (st
->info
->duration_count
>1 && !st
->r_frame_rate
.num
3315 && tb_unreliable(st
->internal
->avctx
)) {
3317 double best_error
= 0.01;
3318 AVRational ref_rate
= st
->r_frame_rate
.num
? st
->r_frame_rate
: av_inv_q(st
->time_base
);
3320 for (j
= 0; j
<MAX_STD_TIMEBASES
; j
++) {
3323 if (st
->info
->codec_info_duration
&&
3324 st
->info
->codec_info_duration
*av_q2d(st
->time_base
) < (1001*11.5)/get_std_framerate(j
))
3326 if (!st
->info
->codec_info_duration
&& get_std_framerate(j
) < 1001*12)
3329 if (av_q2d(st
->time_base
) * st
->info
->rfps_duration_sum
/ st
->info
->duration_count
< (1001*12.0 * 0.8)/get_std_framerate(j
))
3332 for (k
= 0; k
<2; k
++) {
3333 int n
= st
->info
->duration_count
;
3334 double a
= st
->info
->duration_error
[k
][0][j
] / n
;
3335 double error
= st
->info
->duration_error
[k
][1][j
]/n
- a
*a
;
3337 if (error
< best_error
&& best_error
> 0.000000001) {
3339 num
= get_std_framerate(j
);
3342 av_log(ic
, AV_LOG_DEBUG
, "rfps: %f %f\n", get_std_framerate(j
) / 12.0/1001, error
);
3345 // do not increase frame rate by more than 1 % in order to match a standard rate.
3346 if (num
&& (!ref_rate
.num
|| (double)num
/(12*1001) < 1.01 * av_q2d(ref_rate
)))
3347 av_reduce(&st
->r_frame_rate
.num
, &st
->r_frame_rate
.den
, num
, 12*1001, INT_MAX
);
3349 if ( !st
->avg_frame_rate
.num
3350 && st
->r_frame_rate
.num
&& st
->info
->rfps_duration_sum
3351 && st
->info
->codec_info_duration
<= 0
3352 && st
->info
->duration_count
> 2
3353 && fabs(1.0 / (av_q2d(st
->r_frame_rate
) * av_q2d(st
->time_base
)) - st
->info
->rfps_duration_sum
/ (double)st
->info
->duration_count
) <= 1.0
3355 av_log(ic
, AV_LOG_DEBUG
, "Setting avg frame rate based on r frame rate\n");
3356 st
->avg_frame_rate
= st
->r_frame_rate
;
3359 av_freep(&st
->info
->duration_error
);
3360 st
->info
->last_dts
= AV_NOPTS_VALUE
;
3361 st
->info
->duration_count
= 0;
3362 st
->info
->rfps_duration_sum
= 0;
3366 int avformat_find_stream_info(AVFormatContext
*ic
, AVDictionary
**options
)
3368 int i
, count
= 0, ret
= 0, j
;
3371 AVCodecContext
*avctx
;
3372 AVPacket pkt1
, *pkt
;
3373 int64_t old_offset
= avio_tell(ic
->pb
);
3374 // new streams might appear, no options for those
3375 int orig_nb_streams
= ic
->nb_streams
;
3377 int64_t max_analyze_duration
= ic
->max_analyze_duration
;
3378 int64_t max_stream_analyze_duration
;
3379 int64_t max_subtitle_analyze_duration
;
3380 int64_t probesize
= ic
->probesize
;
3381 int eof_reached
= 0;
3382 int *missing_streams
= av_opt_ptr(ic
->iformat
->priv_class
, ic
->priv_data
, "missing_streams");
3384 flush_codecs
= probesize
> 0;
3386 av_opt_set(ic
, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN
);
3388 max_stream_analyze_duration
= max_analyze_duration
;
3389 max_subtitle_analyze_duration
= max_analyze_duration
;
3390 if (!max_analyze_duration
) {
3391 max_stream_analyze_duration
=
3392 max_analyze_duration
= 5*AV_TIME_BASE
;
3393 max_subtitle_analyze_duration
= 30*AV_TIME_BASE
;
3394 if (!strcmp(ic
->iformat
->name
, "flv"))
3395 max_stream_analyze_duration
= 90*AV_TIME_BASE
;
3396 if (!strcmp(ic
->iformat
->name
, "mpeg") || !strcmp(ic
->iformat
->name
, "mpegts"))
3397 max_stream_analyze_duration
= 7*AV_TIME_BASE
;
3401 av_log(ic
, AV_LOG_DEBUG
, "Before avformat_find_stream_info() pos: %"PRId64
" bytes read:%"PRId64
" seeks:%d nb_streams:%d\n",
3402 avio_tell(ic
->pb
), ic
->pb
->bytes_read
, ic
->pb
->seek_count
, ic
->nb_streams
);
3404 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3405 const AVCodec
*codec
;
3406 AVDictionary
*thread_opt
= NULL
;
3407 st
= ic
->streams
[i
];
3408 avctx
= st
->internal
->avctx
;
3410 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
||
3411 st
->codecpar
->codec_type
== AVMEDIA_TYPE_SUBTITLE
) {
3412 /* if (!st->time_base.num)
3414 if (!avctx
->time_base
.num
)
3415 avctx
->time_base
= st
->time_base
;
3418 /* check if the caller has overridden the codec id */
3419 #if FF_API_LAVF_AVCTX
3420 FF_DISABLE_DEPRECATION_WARNINGS
3421 if (st
->codec
->codec_id
!= st
->internal
->orig_codec_id
) {
3422 st
->codecpar
->codec_id
= st
->codec
->codec_id
;
3423 st
->codecpar
->codec_type
= st
->codec
->codec_type
;
3424 st
->internal
->orig_codec_id
= st
->codec
->codec_id
;
3426 FF_ENABLE_DEPRECATION_WARNINGS
3428 // only for the split stuff
3429 if (!st
->parser
&& !(ic
->flags
& AVFMT_FLAG_NOPARSE
) && st
->request_probe
<= 0) {
3430 st
->parser
= av_parser_init(st
->codecpar
->codec_id
);
3432 if (st
->need_parsing
== AVSTREAM_PARSE_HEADERS
) {
3433 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
3434 } else if (st
->need_parsing
== AVSTREAM_PARSE_FULL_RAW
) {
3435 st
->parser
->flags
|= PARSER_FLAG_USE_CODEC_TS
;
3437 } else if (st
->need_parsing
) {
3438 av_log(ic
, AV_LOG_VERBOSE
, "parser not found for codec "
3439 "%s, packets or times may be invalid.\n",
3440 avcodec_get_name(st
->codecpar
->codec_id
));
3444 if (st
->codecpar
->codec_id
!= st
->internal
->orig_codec_id
)
3445 st
->internal
->orig_codec_id
= st
->codecpar
->codec_id
;
3447 ret
= avcodec_parameters_to_context(avctx
, st
->codecpar
);
3449 goto find_stream_info_err
;
3450 if (st
->request_probe
<= 0)
3451 st
->internal
->avctx_inited
= 1;
3453 codec
= find_probe_decoder(ic
, st
, st
->codecpar
->codec_id
);
3455 /* Force thread count to 1 since the H.264 decoder will not extract
3456 * SPS and PPS to extradata during multi-threaded decoding. */
3457 av_dict_set(options
? &options
[i
] : &thread_opt
, "threads", "1", 0);
3459 if (ic
->codec_whitelist
)
3460 av_dict_set(options
? &options
[i
] : &thread_opt
, "codec_whitelist", ic
->codec_whitelist
, 0);
3462 /* Ensure that subtitle_header is properly set. */
3463 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_SUBTITLE
3464 && codec
&& !avctx
->codec
) {
3465 if (avcodec_open2(avctx
, codec
, options
? &options
[i
] : &thread_opt
) < 0)
3466 av_log(ic
, AV_LOG_WARNING
,
3467 "Failed to open codec in av_find_stream_info\n");
3470 // Try to just open decoders, in case this is enough to get parameters.
3471 if (!has_codec_parameters(st
, NULL
) && st
->request_probe
<= 0) {
3472 if (codec
&& !avctx
->codec
)
3473 if (avcodec_open2(avctx
, codec
, options
? &options
[i
] : &thread_opt
) < 0)
3474 av_log(ic
, AV_LOG_WARNING
,
3475 "Failed to open codec in av_find_stream_info\n");
3478 av_dict_free(&thread_opt
);
3481 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3482 #if FF_API_R_FRAME_RATE
3483 ic
->streams
[i
]->info
->last_dts
= AV_NOPTS_VALUE
;
3485 ic
->streams
[i
]->info
->fps_first_dts
= AV_NOPTS_VALUE
;
3486 ic
->streams
[i
]->info
->fps_last_dts
= AV_NOPTS_VALUE
;
3491 int analyzed_all_streams
;
3492 if (ff_check_interrupt(&ic
->interrupt_callback
)) {
3494 av_log(ic
, AV_LOG_DEBUG
, "interrupted\n");
3498 /* check if one codec still needs to be handled */
3499 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3500 int fps_analyze_framecount
= 20;
3502 st
= ic
->streams
[i
];
3503 if (!has_codec_parameters(st
, NULL
))
3505 /* If the timebase is coarse (like the usual millisecond precision
3506 * of mkv), we need to analyze more frames to reliably arrive at
3507 * the correct fps. */
3508 if (av_q2d(st
->time_base
) > 0.0005)
3509 fps_analyze_framecount
*= 2;
3510 if (!tb_unreliable(st
->internal
->avctx
))
3511 fps_analyze_framecount
= 0;
3512 if (ic
->fps_probe_size
>= 0)
3513 fps_analyze_framecount
= ic
->fps_probe_size
;
3514 if (st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
)
3515 fps_analyze_framecount
= 0;
3516 /* variable fps and no guess at the real fps */
3517 if (!(st
->r_frame_rate
.num
&& st
->avg_frame_rate
.num
) &&
3518 st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
) {
3519 int count
= (ic
->iformat
->flags
& AVFMT_NOTIMESTAMPS
) ?
3520 st
->info
->codec_info_duration_fields
/2 :
3521 st
->info
->duration_count
;
3522 if (count
< fps_analyze_framecount
)
3525 if (st
->parser
&& st
->parser
->parser
->split
&&
3526 !st
->internal
->avctx
->extradata
)
3528 if (st
->first_dts
== AV_NOPTS_VALUE
&&
3529 !(ic
->iformat
->flags
& AVFMT_NOTIMESTAMPS
) &&
3530 st
->codec_info_nb_frames
< ((st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
) ? 1 : ic
->max_ts_probe
) &&
3531 (st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
||
3532 st
->codecpar
->codec_type
== AVMEDIA_TYPE_AUDIO
))
3535 analyzed_all_streams
= 0;
3536 if (!missing_streams
|| !*missing_streams
)
3537 if (i
== ic
->nb_streams
) {
3538 analyzed_all_streams
= 1;
3539 /* NOTE: If the format has no header, then we need to read some
3540 * packets to get most of the streams, so we cannot stop here. */
3541 if (!(ic
->ctx_flags
& AVFMTCTX_NOHEADER
)) {
3542 /* If we found the info for all the codecs, we can stop. */
3544 av_log(ic
, AV_LOG_DEBUG
, "All info found\n");
3549 /* We did not get all the codec info, but we read too much data. */
3550 if (read_size
>= probesize
) {
3552 av_log(ic
, AV_LOG_DEBUG
,
3553 "Probe buffer size limit of %"PRId64
" bytes reached\n", probesize
);
3554 for (i
= 0; i
< ic
->nb_streams
; i
++)
3555 if (!ic
->streams
[i
]->r_frame_rate
.num
&&
3556 ic
->streams
[i
]->info
->duration_count
<= 1 &&
3557 ic
->streams
[i
]->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
&&
3558 strcmp(ic
->iformat
->name
, "image2"))
3559 av_log(ic
, AV_LOG_WARNING
,
3560 "Stream #%d: not enough frames to estimate rate; "
3561 "consider increasing probesize\n", i
);
3565 /* NOTE: A new stream can be added there if no header in file
3566 * (AVFMTCTX_NOHEADER). */
3567 ret
= read_frame_internal(ic
, &pkt1
);
3568 if (ret
== AVERROR(EAGAIN
))
3579 if (!(ic
->flags
& AVFMT_FLAG_NOBUFFER
)) {
3580 ret
= add_to_pktbuf(&ic
->internal
->packet_buffer
, pkt
,
3581 &ic
->internal
->packet_buffer_end
, 0);
3583 goto find_stream_info_err
;
3586 st
= ic
->streams
[pkt
->stream_index
];
3587 if (!(st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
))
3588 read_size
+= pkt
->size
;
3590 avctx
= st
->internal
->avctx
;
3591 if (!st
->internal
->avctx_inited
) {
3592 ret
= avcodec_parameters_to_context(avctx
, st
->codecpar
);
3594 goto find_stream_info_err
;
3595 st
->internal
->avctx_inited
= 1;
3598 if (pkt
->dts
!= AV_NOPTS_VALUE
&& st
->codec_info_nb_frames
> 1) {
3599 /* check for non-increasing dts */
3600 if (st
->info
->fps_last_dts
!= AV_NOPTS_VALUE
&&
3601 st
->info
->fps_last_dts
>= pkt
->dts
) {
3602 av_log(ic
, AV_LOG_DEBUG
,
3603 "Non-increasing DTS in stream %d: packet %d with DTS "
3604 "%"PRId64
", packet %d with DTS %"PRId64
"\n",
3605 st
->index
, st
->info
->fps_last_dts_idx
,
3606 st
->info
->fps_last_dts
, st
->codec_info_nb_frames
,
3608 st
->info
->fps_first_dts
=
3609 st
->info
->fps_last_dts
= AV_NOPTS_VALUE
;
3611 /* Check for a discontinuity in dts. If the difference in dts
3612 * is more than 1000 times the average packet duration in the
3613 * sequence, we treat it as a discontinuity. */
3614 if (st
->info
->fps_last_dts
!= AV_NOPTS_VALUE
&&
3615 st
->info
->fps_last_dts_idx
> st
->info
->fps_first_dts_idx
&&
3616 (pkt
->dts
- (uint64_t)st
->info
->fps_last_dts
) / 1000 >
3617 (st
->info
->fps_last_dts
- (uint64_t)st
->info
->fps_first_dts
) /
3618 (st
->info
->fps_last_dts_idx
- st
->info
->fps_first_dts_idx
)) {
3619 av_log(ic
, AV_LOG_WARNING
,
3620 "DTS discontinuity in stream %d: packet %d with DTS "
3621 "%"PRId64
", packet %d with DTS %"PRId64
"\n",
3622 st
->index
, st
->info
->fps_last_dts_idx
,
3623 st
->info
->fps_last_dts
, st
->codec_info_nb_frames
,
3625 st
->info
->fps_first_dts
=
3626 st
->info
->fps_last_dts
= AV_NOPTS_VALUE
;
3629 /* update stored dts values */
3630 if (st
->info
->fps_first_dts
== AV_NOPTS_VALUE
) {
3631 st
->info
->fps_first_dts
= pkt
->dts
;
3632 st
->info
->fps_first_dts_idx
= st
->codec_info_nb_frames
;
3634 st
->info
->fps_last_dts
= pkt
->dts
;
3635 st
->info
->fps_last_dts_idx
= st
->codec_info_nb_frames
;
3637 if (st
->codec_info_nb_frames
>1) {
3641 if (st
->time_base
.den
> 0)
3642 t
= av_rescale_q(st
->info
->codec_info_duration
, st
->time_base
, AV_TIME_BASE_Q
);
3643 if (st
->avg_frame_rate
.num
> 0)
3644 t
= FFMAX(t
, av_rescale_q(st
->codec_info_nb_frames
, av_inv_q(st
->avg_frame_rate
), AV_TIME_BASE_Q
));
3647 && st
->codec_info_nb_frames
>30
3648 && st
->info
->fps_first_dts
!= AV_NOPTS_VALUE
3649 && st
->info
->fps_last_dts
!= AV_NOPTS_VALUE
)
3650 t
= FFMAX(t
, av_rescale_q(st
->info
->fps_last_dts
- st
->info
->fps_first_dts
, st
->time_base
, AV_TIME_BASE_Q
));
3652 if (analyzed_all_streams
) limit
= max_analyze_duration
;
3653 else if (avctx
->codec_type
== AVMEDIA_TYPE_SUBTITLE
) limit
= max_subtitle_analyze_duration
;
3654 else limit
= max_stream_analyze_duration
;
3657 av_log(ic
, AV_LOG_VERBOSE
, "max_analyze_duration %"PRId64
" reached at %"PRId64
" microseconds st:%d\n",
3659 t
, pkt
->stream_index
);
3660 if (ic
->flags
& AVFMT_FLAG_NOBUFFER
)
3661 av_packet_unref(pkt
);
3664 if (pkt
->duration
) {
3665 if (avctx
->codec_type
== AVMEDIA_TYPE_SUBTITLE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->pts
>= st
->start_time
) {
3666 st
->info
->codec_info_duration
= FFMIN(pkt
->pts
- st
->start_time
, st
->info
->codec_info_duration
+ pkt
->duration
);
3668 st
->info
->codec_info_duration
+= pkt
->duration
;
3669 st
->info
->codec_info_duration_fields
+= st
->parser
&& st
->need_parsing
&& avctx
->ticks_per_frame
==2 ? st
->parser
->repeat_pict
+ 1 : 2;
3672 #if FF_API_R_FRAME_RATE
3673 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
)
3674 ff_rfps_add_frame(ic
, st
, pkt
->dts
);
3676 if (st
->parser
&& st
->parser
->parser
->split
&& !avctx
->extradata
) {
3677 int i
= st
->parser
->parser
->split(avctx
, pkt
->data
, pkt
->size
);
3678 if (i
> 0 && i
< FF_MAX_EXTRADATA_SIZE
) {
3679 avctx
->extradata_size
= i
;
3680 avctx
->extradata
= av_mallocz(avctx
->extradata_size
+
3681 AV_INPUT_BUFFER_PADDING_SIZE
);
3682 if (!avctx
->extradata
)
3683 return AVERROR(ENOMEM
);
3684 memcpy(avctx
->extradata
, pkt
->data
,
3685 avctx
->extradata_size
);
3689 /* If still no information, we try to open the codec and to
3690 * decompress the frame. We try to avoid that in most cases as
3691 * it takes longer and uses more memory. For MPEG-4, we need to
3692 * decompress for QuickTime.
3694 * If AV_CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3695 * least one frame of codec data, this makes sure the codec initializes
3696 * the channel configuration and does not only trust the values from
3698 try_decode_frame(ic
, st
, pkt
,
3699 (options
&& i
< orig_nb_streams
) ? &options
[i
] : NULL
);
3701 if (ic
->flags
& AVFMT_FLAG_NOBUFFER
)
3702 av_packet_unref(pkt
);
3704 st
->codec_info_nb_frames
++;
3710 for (stream_index
= 0; stream_index
< ic
->nb_streams
; stream_index
++) {
3711 st
= ic
->streams
[stream_index
];
3712 avctx
= st
->internal
->avctx
;
3713 if (!has_codec_parameters(st
, NULL
)) {
3714 const AVCodec
*codec
= find_probe_decoder(ic
, st
, st
->codecpar
->codec_id
);
3715 if (codec
&& !avctx
->codec
) {
3716 if (avcodec_open2(avctx
, codec
, (options
&& stream_index
< orig_nb_streams
) ? &options
[stream_index
] : NULL
) < 0)
3717 av_log(ic
, AV_LOG_WARNING
,
3718 "Failed to open codec in av_find_stream_info\n");
3722 // EOF already reached while reading the stream above.
3723 // So continue with reoordering DTS with whatever delay we have.
3724 if (ic
->internal
->packet_buffer
&& !has_decode_delay_been_guessed(st
)) {
3725 update_dts_from_pts(ic
, stream_index
, ic
->internal
->packet_buffer
);
3731 AVPacket empty_pkt
= { 0 };
3733 av_init_packet(&empty_pkt
);
3735 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3737 st
= ic
->streams
[i
];
3739 /* flush the decoders */
3740 if (st
->info
->found_decoder
== 1) {
3742 err
= try_decode_frame(ic
, st
, &empty_pkt
,
3743 (options
&& i
< orig_nb_streams
)
3744 ? &options
[i
] : NULL
);
3745 } while (err
> 0 && !has_codec_parameters(st
, NULL
));
3748 av_log(ic
, AV_LOG_INFO
,
3749 "decoding for stream %d failed\n", st
->index
);
3755 ff_rfps_calculate(ic
);
3757 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3758 st
= ic
->streams
[i
];
3759 avctx
= st
->internal
->avctx
;
3760 if (avctx
->codec_type
== AVMEDIA_TYPE_VIDEO
) {
3761 if (avctx
->codec_id
== AV_CODEC_ID_RAWVIDEO
&& !avctx
->codec_tag
&& !avctx
->bits_per_coded_sample
) {
3762 uint32_t tag
= avcodec_pix_fmt_to_codec_tag(avctx
->pix_fmt
);
3763 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag
) == avctx
->pix_fmt
)
3764 avctx
->codec_tag
= tag
;
3767 /* estimate average framerate if not set by demuxer */
3768 if (st
->info
->codec_info_duration_fields
&&
3769 !st
->avg_frame_rate
.num
&&
3770 st
->info
->codec_info_duration
) {
3772 double best_error
= 0.01;
3774 if (st
->info
->codec_info_duration
>= INT64_MAX
/ st
->time_base
.num
/ 2||
3775 st
->info
->codec_info_duration_fields
>= INT64_MAX
/ st
->time_base
.den
||
3776 st
->info
->codec_info_duration
< 0)
3778 av_reduce(&st
->avg_frame_rate
.num
, &st
->avg_frame_rate
.den
,
3779 st
->info
->codec_info_duration_fields
* (int64_t) st
->time_base
.den
,
3780 st
->info
->codec_info_duration
* 2 * (int64_t) st
->time_base
.num
, 60000);
3782 /* Round guessed framerate to a "standard" framerate if it's
3783 * within 1% of the original estimate. */
3784 for (j
= 0; j
< MAX_STD_TIMEBASES
; j
++) {
3785 AVRational std_fps
= { get_std_framerate(j
), 12 * 1001 };
3786 double error
= fabs(av_q2d(st
->avg_frame_rate
) /
3787 av_q2d(std_fps
) - 1);
3789 if (error
< best_error
) {
3791 best_fps
= std_fps
.num
;
3795 av_reduce(&st
->avg_frame_rate
.num
, &st
->avg_frame_rate
.den
,
3796 best_fps
, 12 * 1001, INT_MAX
);
3799 if (!st
->r_frame_rate
.num
) {
3800 if ( avctx
->time_base
.den
* (int64_t) st
->time_base
.num
3801 <= avctx
->time_base
.num
* avctx
->ticks_per_frame
* (int64_t) st
->time_base
.den
) {
3802 st
->r_frame_rate
.num
= avctx
->time_base
.den
;
3803 st
->r_frame_rate
.den
= avctx
->time_base
.num
* avctx
->ticks_per_frame
;
3805 st
->r_frame_rate
.num
= st
->time_base
.den
;
3806 st
->r_frame_rate
.den
= st
->time_base
.num
;
3809 if (st
->display_aspect_ratio
.num
&& st
->display_aspect_ratio
.den
) {
3810 AVRational hw_ratio
= { avctx
->height
, avctx
->width
};
3811 st
->sample_aspect_ratio
= av_mul_q(st
->display_aspect_ratio
,
3814 } else if (avctx
->codec_type
== AVMEDIA_TYPE_AUDIO
) {
3815 if (!avctx
->bits_per_coded_sample
)
3816 avctx
->bits_per_coded_sample
=
3817 av_get_bits_per_sample(avctx
->codec_id
);
3818 // set stream disposition based on audio service type
3819 switch (avctx
->audio_service_type
) {
3820 case AV_AUDIO_SERVICE_TYPE_EFFECTS
:
3821 st
->disposition
= AV_DISPOSITION_CLEAN_EFFECTS
;
3823 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED
:
3824 st
->disposition
= AV_DISPOSITION_VISUAL_IMPAIRED
;
3826 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED
:
3827 st
->disposition
= AV_DISPOSITION_HEARING_IMPAIRED
;
3829 case AV_AUDIO_SERVICE_TYPE_COMMENTARY
:
3830 st
->disposition
= AV_DISPOSITION_COMMENT
;
3832 case AV_AUDIO_SERVICE_TYPE_KARAOKE
:
3833 st
->disposition
= AV_DISPOSITION_KARAOKE
;
3840 estimate_timings(ic
, old_offset
);
3842 av_opt_set(ic
, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN
);
3844 if (ret
>= 0 && ic
->nb_streams
)
3845 /* We could not have all the codec parameters before EOF. */
3847 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3849 st
= ic
->streams
[i
];
3851 /* if no packet was ever seen, update context now for has_codec_parameters */
3852 if (!st
->internal
->avctx_inited
) {
3853 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_AUDIO
&&
3854 st
->codecpar
->format
== AV_SAMPLE_FMT_NONE
)
3855 st
->codecpar
->format
= st
->internal
->avctx
->sample_fmt
;
3856 ret
= avcodec_parameters_to_context(st
->internal
->avctx
, st
->codecpar
);
3858 goto find_stream_info_err
;
3860 if (!has_codec_parameters(st
, &errmsg
)) {
3862 avcodec_string(buf
, sizeof(buf
), st
->internal
->avctx
, 0);
3863 av_log(ic
, AV_LOG_WARNING
,
3864 "Could not find codec parameters for stream %d (%s): %s\n"
3865 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
3872 compute_chapters_end(ic
);
3874 /* update the stream parameters from the internal codec contexts */
3875 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3876 st
= ic
->streams
[i
];
3878 if (st
->internal
->avctx_inited
) {
3879 int orig_w
= st
->codecpar
->width
;
3880 int orig_h
= st
->codecpar
->height
;
3881 ret
= avcodec_parameters_from_context(st
->codecpar
, st
->internal
->avctx
);
3883 goto find_stream_info_err
;
3884 // The decoder might reduce the video size by the lowres factor.
3885 if (av_codec_get_lowres(st
->internal
->avctx
) && orig_w
) {
3886 st
->codecpar
->width
= orig_w
;
3887 st
->codecpar
->height
= orig_h
;
3891 #if FF_API_LAVF_AVCTX
3892 FF_DISABLE_DEPRECATION_WARNINGS
3893 ret
= avcodec_parameters_to_context(st
->codec
, st
->codecpar
);
3895 goto find_stream_info_err
;
3897 // The old API (AVStream.codec) "requires" the resolution to be adjusted
3898 // by the lowres factor.
3899 if (av_codec_get_lowres(st
->internal
->avctx
) && st
->internal
->avctx
->width
) {
3900 av_codec_set_lowres(st
->codec
, av_codec_get_lowres(st
->internal
->avctx
));
3901 st
->codec
->width
= st
->internal
->avctx
->width
;
3902 st
->codec
->height
= st
->internal
->avctx
->height
;
3905 if (st
->codec
->codec_tag
!= MKTAG('t','m','c','d')) {
3906 st
->codec
->time_base
= st
->internal
->avctx
->time_base
;
3907 st
->codec
->ticks_per_frame
= st
->internal
->avctx
->ticks_per_frame
;
3909 st
->codec
->framerate
= st
->avg_frame_rate
;
3911 if (st
->internal
->avctx
->subtitle_header
) {
3912 st
->codec
->subtitle_header
= av_malloc(st
->internal
->avctx
->subtitle_header_size
);
3913 if (!st
->codec
->subtitle_header
)
3914 goto find_stream_info_err
;
3915 st
->codec
->subtitle_header_size
= st
->internal
->avctx
->subtitle_header_size
;
3916 memcpy(st
->codec
->subtitle_header
, st
->internal
->avctx
->subtitle_header
,
3917 st
->codec
->subtitle_header_size
);
3920 // Fields unavailable in AVCodecParameters
3921 st
->codec
->coded_width
= st
->internal
->avctx
->coded_width
;
3922 st
->codec
->coded_height
= st
->internal
->avctx
->coded_height
;
3923 st
->codec
->properties
= st
->internal
->avctx
->properties
;
3924 FF_ENABLE_DEPRECATION_WARNINGS
3927 st
->internal
->avctx_inited
= 0;
3930 find_stream_info_err
:
3931 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3932 st
= ic
->streams
[i
];
3934 av_freep(&st
->info
->duration_error
);
3935 avcodec_close(ic
->streams
[i
]->internal
->avctx
);
3936 av_freep(&ic
->streams
[i
]->info
);
3939 av_log(ic
, AV_LOG_DEBUG
, "After avformat_find_stream_info() pos: %"PRId64
" bytes read:%"PRId64
" seeks:%d frames:%d\n",
3940 avio_tell(ic
->pb
), ic
->pb
->bytes_read
, ic
->pb
->seek_count
, count
);
3944 AVProgram
*av_find_program_from_stream(AVFormatContext
*ic
, AVProgram
*last
, int s
)
3948 for (i
= 0; i
< ic
->nb_programs
; i
++) {
3949 if (ic
->programs
[i
] == last
) {
3953 for (j
= 0; j
< ic
->programs
[i
]->nb_stream_indexes
; j
++)
3954 if (ic
->programs
[i
]->stream_index
[j
] == s
)
3955 return ic
->programs
[i
];
3961 int av_find_best_stream(AVFormatContext
*ic
, enum AVMediaType type
,
3962 int wanted_stream_nb
, int related_stream
,
3963 AVCodec
**decoder_ret
, int flags
)
3965 int i
, nb_streams
= ic
->nb_streams
;
3966 int ret
= AVERROR_STREAM_NOT_FOUND
, best_count
= -1, best_bitrate
= -1, best_multiframe
= -1, count
, bitrate
, multiframe
;
3967 unsigned *program
= NULL
;
3968 const AVCodec
*decoder
= NULL
, *best_decoder
= NULL
;
3970 if (related_stream
>= 0 && wanted_stream_nb
< 0) {
3971 AVProgram
*p
= av_find_program_from_stream(ic
, NULL
, related_stream
);
3973 program
= p
->stream_index
;
3974 nb_streams
= p
->nb_stream_indexes
;
3977 for (i
= 0; i
< nb_streams
; i
++) {
3978 int real_stream_index
= program
? program
[i
] : i
;
3979 AVStream
*st
= ic
->streams
[real_stream_index
];
3980 AVCodecParameters
*par
= st
->codecpar
;
3981 if (par
->codec_type
!= type
)
3983 if (wanted_stream_nb
>= 0 && real_stream_index
!= wanted_stream_nb
)
3985 if (wanted_stream_nb
!= real_stream_index
&&
3986 st
->disposition
& (AV_DISPOSITION_HEARING_IMPAIRED
|
3987 AV_DISPOSITION_VISUAL_IMPAIRED
))
3989 if (type
== AVMEDIA_TYPE_AUDIO
&& !(par
->channels
&& par
->sample_rate
))
3992 decoder
= find_decoder(ic
, st
, par
->codec_id
);
3995 ret
= AVERROR_DECODER_NOT_FOUND
;
3999 count
= st
->codec_info_nb_frames
;
4000 bitrate
= par
->bit_rate
;
4001 multiframe
= FFMIN(5, count
);
4002 if ((best_multiframe
> multiframe
) ||
4003 (best_multiframe
== multiframe
&& best_bitrate
> bitrate
) ||
4004 (best_multiframe
== multiframe
&& best_bitrate
== bitrate
&& best_count
>= count
))
4007 best_bitrate
= bitrate
;
4008 best_multiframe
= multiframe
;
4009 ret
= real_stream_index
;
4010 best_decoder
= decoder
;
4011 if (program
&& i
== nb_streams
- 1 && ret
< 0) {
4013 nb_streams
= ic
->nb_streams
;
4014 /* no related stream found, try again with everything */
4019 *decoder_ret
= (AVCodec
*)best_decoder
;
4023 /*******************************************************/
4025 int av_read_play(AVFormatContext
*s
)
4027 if (s
->iformat
->read_play
)
4028 return s
->iformat
->read_play(s
);
4030 return avio_pause(s
->pb
, 0);
4031 return AVERROR(ENOSYS
);
4034 int av_read_pause(AVFormatContext
*s
)
4036 if (s
->iformat
->read_pause
)
4037 return s
->iformat
->read_pause(s
);
4039 return avio_pause(s
->pb
, 1);
4040 return AVERROR(ENOSYS
);
4043 int ff_stream_encode_params_copy(AVStream
*dst
, const AVStream
*src
)
4048 dst
->time_base
= src
->time_base
;
4049 dst
->nb_frames
= src
->nb_frames
;
4050 dst
->disposition
= src
->disposition
;
4051 dst
->sample_aspect_ratio
= src
->sample_aspect_ratio
;
4052 dst
->avg_frame_rate
= src
->avg_frame_rate
;
4053 dst
->r_frame_rate
= src
->r_frame_rate
;
4055 av_dict_free(&dst
->metadata
);
4056 ret
= av_dict_copy(&dst
->metadata
, src
->metadata
, 0);
4060 ret
= avcodec_parameters_copy(dst
->codecpar
, src
->codecpar
);
4064 /* Free existing side data*/
4065 for (i
= 0; i
< dst
->nb_side_data
; i
++)
4066 av_free(dst
->side_data
[i
].data
);
4067 av_freep(&dst
->side_data
);
4068 dst
->nb_side_data
= 0;
4070 /* Copy side data if present */
4071 if (src
->nb_side_data
) {
4072 dst
->side_data
= av_mallocz_array(src
->nb_side_data
,
4073 sizeof(AVPacketSideData
));
4074 if (!dst
->side_data
)
4075 return AVERROR(ENOMEM
);
4076 dst
->nb_side_data
= src
->nb_side_data
;
4078 for (i
= 0; i
< src
->nb_side_data
; i
++) {
4079 uint8_t *data
= av_memdup(src
->side_data
[i
].data
,
4080 src
->side_data
[i
].size
);
4082 return AVERROR(ENOMEM
);
4083 dst
->side_data
[i
].type
= src
->side_data
[i
].type
;
4084 dst
->side_data
[i
].size
= src
->side_data
[i
].size
;
4085 dst
->side_data
[i
].data
= data
;
4089 av_freep(&dst
->recommended_encoder_configuration
);
4090 if (src
->recommended_encoder_configuration
) {
4091 const char *conf_str
= src
->recommended_encoder_configuration
;
4092 dst
->recommended_encoder_configuration
= av_strdup(conf_str
);
4093 if (!dst
->recommended_encoder_configuration
)
4094 return AVERROR(ENOMEM
);
4100 static void free_stream(AVStream
**pst
)
4102 AVStream
*st
= *pst
;
4108 for (i
= 0; i
< st
->nb_side_data
; i
++)
4109 av_freep(&st
->side_data
[i
].data
);
4110 av_freep(&st
->side_data
);
4113 av_parser_close(st
->parser
);
4115 if (st
->attached_pic
.data
)
4116 av_packet_unref(&st
->attached_pic
);
4119 avcodec_free_context(&st
->internal
->avctx
);
4120 for (i
= 0; i
< st
->internal
->nb_bsfcs
; i
++) {
4121 av_bsf_free(&st
->internal
->bsfcs
[i
]);
4122 av_freep(&st
->internal
->bsfcs
);
4125 av_freep(&st
->internal
);
4127 av_dict_free(&st
->metadata
);
4128 avcodec_parameters_free(&st
->codecpar
);
4129 av_freep(&st
->probe_data
.buf
);
4130 av_freep(&st
->index_entries
);
4131 #if FF_API_LAVF_AVCTX
4132 FF_DISABLE_DEPRECATION_WARNINGS
4133 avcodec_free_context(&st
->codec
);
4134 FF_ENABLE_DEPRECATION_WARNINGS
4136 av_freep(&st
->priv_data
);
4138 av_freep(&st
->info
->duration_error
);
4139 av_freep(&st
->info
);
4140 av_freep(&st
->recommended_encoder_configuration
);
4141 av_freep(&st
->priv_pts
);
4146 void ff_free_stream(AVFormatContext
*s
, AVStream
*st
)
4148 av_assert0(s
->nb_streams
>0);
4149 av_assert0(s
->streams
[ s
->nb_streams
- 1 ] == st
);
4151 free_stream(&s
->streams
[ --s
->nb_streams
]);
4154 void avformat_free_context(AVFormatContext
*s
)
4162 if (s
->iformat
&& s
->iformat
->priv_class
&& s
->priv_data
)
4163 av_opt_free(s
->priv_data
);
4164 if (s
->oformat
&& s
->oformat
->priv_class
&& s
->priv_data
)
4165 av_opt_free(s
->priv_data
);
4167 for (i
= s
->nb_streams
- 1; i
>= 0; i
--)
4168 ff_free_stream(s
, s
->streams
[i
]);
4171 for (i
= s
->nb_programs
- 1; i
>= 0; i
--) {
4172 av_dict_free(&s
->programs
[i
]->metadata
);
4173 av_freep(&s
->programs
[i
]->stream_index
);
4174 av_freep(&s
->programs
[i
]);
4176 av_freep(&s
->programs
);
4177 av_freep(&s
->priv_data
);
4178 while (s
->nb_chapters
--) {
4179 av_dict_free(&s
->chapters
[s
->nb_chapters
]->metadata
);
4180 av_freep(&s
->chapters
[s
->nb_chapters
]);
4182 av_freep(&s
->chapters
);
4183 av_dict_free(&s
->metadata
);
4184 av_freep(&s
->streams
);
4185 flush_packet_queue(s
);
4186 av_freep(&s
->internal
);
4190 void avformat_close_input(AVFormatContext
**ps
)
4201 if ((s
->iformat
&& strcmp(s
->iformat
->name
, "image2") && s
->iformat
->flags
& AVFMT_NOFILE
) ||
4202 (s
->flags
& AVFMT_FLAG_CUSTOM_IO
))
4205 flush_packet_queue(s
);
4208 if (s
->iformat
->read_close
)
4209 s
->iformat
->read_close(s
);
4211 avformat_free_context(s
);
4218 AVStream
*avformat_new_stream(AVFormatContext
*s
, const AVCodec
*c
)
4224 if (s
->nb_streams
>= FFMIN(s
->max_streams
, INT_MAX
/sizeof(*streams
))) {
4225 if (s
->max_streams
< INT_MAX
/sizeof(*streams
))
4226 av_log(s
, AV_LOG_ERROR
, "Number of streams exceeds max_streams parameter (%d), see the documentation if you wish to increase it\n", s
->max_streams
);
4229 streams
= av_realloc_array(s
->streams
, s
->nb_streams
+ 1, sizeof(*streams
));
4232 s
->streams
= streams
;
4234 st
= av_mallocz(sizeof(AVStream
));
4237 if (!(st
->info
= av_mallocz(sizeof(*st
->info
)))) {
4241 st
->info
->last_dts
= AV_NOPTS_VALUE
;
4243 #if FF_API_LAVF_AVCTX
4244 FF_DISABLE_DEPRECATION_WARNINGS
4245 st
->codec
= avcodec_alloc_context3(c
);
4251 FF_ENABLE_DEPRECATION_WARNINGS
4254 st
->internal
= av_mallocz(sizeof(*st
->internal
));
4258 st
->codecpar
= avcodec_parameters_alloc();
4262 st
->internal
->avctx
= avcodec_alloc_context3(NULL
);
4263 if (!st
->internal
->avctx
)
4267 #if FF_API_LAVF_AVCTX
4268 FF_DISABLE_DEPRECATION_WARNINGS
4269 /* no default bitrate if decoding */
4270 st
->codec
->bit_rate
= 0;
4271 FF_ENABLE_DEPRECATION_WARNINGS
4274 /* default pts setting is MPEG-like */
4275 avpriv_set_pts_info(st
, 33, 1, 90000);
4276 /* we set the current DTS to 0 so that formats without any timestamps
4277 * but durations get some timestamps, formats with some unknown
4278 * timestamps have their first few packets buffered and the
4279 * timestamps corrected before they are returned to the user */
4280 st
->cur_dts
= RELATIVE_TS_BASE
;
4282 st
->cur_dts
= AV_NOPTS_VALUE
;
4285 st
->index
= s
->nb_streams
;
4286 st
->start_time
= AV_NOPTS_VALUE
;
4287 st
->duration
= AV_NOPTS_VALUE
;
4288 st
->first_dts
= AV_NOPTS_VALUE
;
4289 st
->probe_packets
= MAX_PROBE_PACKETS
;
4290 st
->pts_wrap_reference
= AV_NOPTS_VALUE
;
4291 st
->pts_wrap_behavior
= AV_PTS_WRAP_IGNORE
;
4293 st
->last_IP_pts
= AV_NOPTS_VALUE
;
4294 st
->last_dts_for_order_check
= AV_NOPTS_VALUE
;
4295 for (i
= 0; i
< MAX_REORDER_DELAY
+ 1; i
++)
4296 st
->pts_buffer
[i
] = AV_NOPTS_VALUE
;
4298 st
->sample_aspect_ratio
= (AVRational
) { 0, 1 };
4300 #if FF_API_R_FRAME_RATE
4301 st
->info
->last_dts
= AV_NOPTS_VALUE
;
4303 st
->info
->fps_first_dts
= AV_NOPTS_VALUE
;
4304 st
->info
->fps_last_dts
= AV_NOPTS_VALUE
;
4306 st
->inject_global_side_data
= s
->internal
->inject_global_side_data
;
4308 st
->internal
->need_context_update
= 1;
4310 s
->streams
[s
->nb_streams
++] = st
;
4317 AVProgram
*av_new_program(AVFormatContext
*ac
, int id
)
4319 AVProgram
*program
= NULL
;
4322 av_log(ac
, AV_LOG_TRACE
, "new_program: id=0x%04x\n", id
);
4324 for (i
= 0; i
< ac
->nb_programs
; i
++)
4325 if (ac
->programs
[i
]->id
== id
)
4326 program
= ac
->programs
[i
];
4329 program
= av_mallocz(sizeof(AVProgram
));
4332 dynarray_add(&ac
->programs
, &ac
->nb_programs
, program
);
4333 program
->discard
= AVDISCARD_NONE
;
4336 program
->pts_wrap_reference
= AV_NOPTS_VALUE
;
4337 program
->pts_wrap_behavior
= AV_PTS_WRAP_IGNORE
;
4339 program
->start_time
=
4340 program
->end_time
= AV_NOPTS_VALUE
;
4345 AVChapter
*avpriv_new_chapter(AVFormatContext
*s
, int id
, AVRational time_base
,
4346 int64_t start
, int64_t end
, const char *title
)
4348 AVChapter
*chapter
= NULL
;
4351 if (end
!= AV_NOPTS_VALUE
&& start
> end
) {
4352 av_log(s
, AV_LOG_ERROR
, "Chapter end time %"PRId64
" before start %"PRId64
"\n", end
, start
);
4356 for (i
= 0; i
< s
->nb_chapters
; i
++)
4357 if (s
->chapters
[i
]->id
== id
)
4358 chapter
= s
->chapters
[i
];
4361 chapter
= av_mallocz(sizeof(AVChapter
));
4364 dynarray_add(&s
->chapters
, &s
->nb_chapters
, chapter
);
4366 av_dict_set(&chapter
->metadata
, "title", title
, 0);
4368 chapter
->time_base
= time_base
;
4369 chapter
->start
= start
;
4375 void av_program_add_stream_index(AVFormatContext
*ac
, int progid
, unsigned idx
)
4378 AVProgram
*program
= NULL
;
4381 if (idx
>= ac
->nb_streams
) {
4382 av_log(ac
, AV_LOG_ERROR
, "stream index %d is not valid\n", idx
);
4386 for (i
= 0; i
< ac
->nb_programs
; i
++) {
4387 if (ac
->programs
[i
]->id
!= progid
)
4389 program
= ac
->programs
[i
];
4390 for (j
= 0; j
< program
->nb_stream_indexes
; j
++)
4391 if (program
->stream_index
[j
] == idx
)
4394 tmp
= av_realloc_array(program
->stream_index
, program
->nb_stream_indexes
+1, sizeof(unsigned int));
4397 program
->stream_index
= tmp
;
4398 program
->stream_index
[program
->nb_stream_indexes
++] = idx
;
4403 uint64_t ff_ntp_time(void)
4405 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US
;
4408 int av_get_frame_filename2(char *buf
, int buf_size
, const char *path
, int number
, int flags
)
4411 char *q
, buf1
[20], c
;
4412 int nd
, len
, percentd_found
;
4424 while (av_isdigit(*p
)) {
4425 if (nd
>= INT_MAX
/ 10 - 255)
4427 nd
= nd
* 10 + *p
++ - '0';
4430 } while (av_isdigit(c
));
4436 if (!(flags
& AV_FRAME_FILENAME_FLAGS_MULTIPLE
) && percentd_found
)
4441 snprintf(buf1
, sizeof(buf1
), "%0*d", nd
, number
);
4443 if ((q
- buf
+ len
) > buf_size
- 1)
4445 memcpy(q
, buf1
, len
);
4453 if ((q
- buf
) < buf_size
- 1)
4457 if (!percentd_found
)
4466 int av_get_frame_filename(char *buf
, int buf_size
, const char *path
, int number
)
4468 return av_get_frame_filename2(buf
, buf_size
, path
, number
, 0);
4471 void av_url_split(char *proto
, int proto_size
,
4472 char *authorization
, int authorization_size
,
4473 char *hostname
, int hostname_size
,
4474 int *port_ptr
, char *path
, int path_size
, const char *url
)
4476 const char *p
, *ls
, *ls2
, *at
, *at2
, *col
, *brk
;
4482 if (authorization_size
> 0)
4483 authorization
[0] = 0;
4484 if (hostname_size
> 0)
4489 /* parse protocol */
4490 if ((p
= strchr(url
, ':'))) {
4491 av_strlcpy(proto
, url
, FFMIN(proto_size
, p
+ 1 - url
));
4498 /* no protocol means plain filename */
4499 av_strlcpy(path
, url
, path_size
);
4503 /* separate path from hostname */
4504 ls
= strchr(p
, '/');
4505 ls2
= strchr(p
, '?');
4509 ls
= FFMIN(ls
, ls2
);
4511 av_strlcpy(path
, ls
, path_size
);
4513 ls
= &p
[strlen(p
)]; // XXX
4515 /* the rest is hostname, use that to parse auth/port */
4517 /* authorization (user[:pass]@hostname) */
4519 while ((at
= strchr(p
, '@')) && at
< ls
) {
4520 av_strlcpy(authorization
, at2
,
4521 FFMIN(authorization_size
, at
+ 1 - at2
));
4522 p
= at
+ 1; /* skip '@' */
4525 if (*p
== '[' && (brk
= strchr(p
, ']')) && brk
< ls
) {
4527 av_strlcpy(hostname
, p
+ 1,
4528 FFMIN(hostname_size
, brk
- p
));
4529 if (brk
[1] == ':' && port_ptr
)
4530 *port_ptr
= atoi(brk
+ 2);
4531 } else if ((col
= strchr(p
, ':')) && col
< ls
) {
4532 av_strlcpy(hostname
, p
,
4533 FFMIN(col
+ 1 - p
, hostname_size
));
4535 *port_ptr
= atoi(col
+ 1);
4537 av_strlcpy(hostname
, p
,
4538 FFMIN(ls
+ 1 - p
, hostname_size
));
4542 char *ff_data_to_hex(char *buff
, const uint8_t *src
, int s
, int lowercase
)
4545 static const char hex_table_uc
[16] = { '0', '1', '2', '3',
4548 'C', 'D', 'E', 'F' };
4549 static const char hex_table_lc
[16] = { '0', '1', '2', '3',
4552 'c', 'd', 'e', 'f' };
4553 const char *hex_table
= lowercase
? hex_table_lc
: hex_table_uc
;
4555 for (i
= 0; i
< s
; i
++) {
4556 buff
[i
* 2] = hex_table
[src
[i
] >> 4];
4557 buff
[i
* 2 + 1] = hex_table
[src
[i
] & 0xF];
4563 int ff_hex_to_data(uint8_t *data
, const char *p
)
4570 p
+= strspn(p
, SPACE_CHARS
);
4573 c
= av_toupper((unsigned char) *p
++);
4574 if (c
>= '0' && c
<= '9')
4576 else if (c
>= 'A' && c
<= 'F')
4591 void avpriv_set_pts_info(AVStream
*s
, int pts_wrap_bits
,
4592 unsigned int pts_num
, unsigned int pts_den
)
4595 if (av_reduce(&new_tb
.num
, &new_tb
.den
, pts_num
, pts_den
, INT_MAX
)) {
4596 if (new_tb
.num
!= pts_num
)
4597 av_log(NULL
, AV_LOG_DEBUG
,
4598 "st:%d removing common factor %d from timebase\n",
4599 s
->index
, pts_num
/ new_tb
.num
);
4601 av_log(NULL
, AV_LOG_WARNING
,
4602 "st:%d has too large timebase, reducing\n", s
->index
);
4604 if (new_tb
.num
<= 0 || new_tb
.den
<= 0) {
4605 av_log(NULL
, AV_LOG_ERROR
,
4606 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4607 new_tb
.num
, new_tb
.den
,
4611 s
->time_base
= new_tb
;
4612 #if FF_API_LAVF_AVCTX
4613 FF_DISABLE_DEPRECATION_WARNINGS
4614 av_codec_set_pkt_timebase(s
->codec
, new_tb
);
4615 FF_ENABLE_DEPRECATION_WARNINGS
4617 av_codec_set_pkt_timebase(s
->internal
->avctx
, new_tb
);
4618 s
->pts_wrap_bits
= pts_wrap_bits
;
4621 void ff_parse_key_value(const char *str
, ff_parse_key_val_cb callback_get_buf
,
4624 const char *ptr
= str
;
4626 /* Parse key=value pairs. */
4629 char *dest
= NULL
, *dest_end
;
4630 int key_len
, dest_len
= 0;
4632 /* Skip whitespace and potential commas. */
4633 while (*ptr
&& (av_isspace(*ptr
) || *ptr
== ','))
4640 if (!(ptr
= strchr(key
, '=')))
4643 key_len
= ptr
- key
;
4645 callback_get_buf(context
, key
, key_len
, &dest
, &dest_len
);
4646 dest_end
= dest
? dest
+ dest_len
- 1 : NULL
;
4650 while (*ptr
&& *ptr
!= '\"') {
4654 if (dest
&& dest
< dest_end
)
4658 if (dest
&& dest
< dest_end
)
4666 for (; *ptr
&& !(av_isspace(*ptr
) || *ptr
== ','); ptr
++)
4667 if (dest
&& dest
< dest_end
)
4675 int ff_find_stream_index(AVFormatContext
*s
, int id
)
4678 for (i
= 0; i
< s
->nb_streams
; i
++)
4679 if (s
->streams
[i
]->id
== id
)
4684 int avformat_query_codec(const AVOutputFormat
*ofmt
, enum AVCodecID codec_id
,
4688 unsigned int codec_tag
;
4689 if (ofmt
->query_codec
)
4690 return ofmt
->query_codec(codec_id
, std_compliance
);
4691 else if (ofmt
->codec_tag
)
4692 return !!av_codec_get_tag2(ofmt
->codec_tag
, codec_id
, &codec_tag
);
4693 else if (codec_id
== ofmt
->video_codec
||
4694 codec_id
== ofmt
->audio_codec
||
4695 codec_id
== ofmt
->subtitle_codec
||
4696 codec_id
== ofmt
->data_codec
)
4699 return AVERROR_PATCHWELCOME
;
4702 int avformat_network_init(void)
4706 ff_network_inited_globally
= 1;
4707 if ((ret
= ff_network_init()) < 0)
4709 if ((ret
= ff_tls_init()) < 0)
4715 int avformat_network_deinit(void)
4720 ff_network_inited_globally
= 0;
4725 int ff_add_param_change(AVPacket
*pkt
, int32_t channels
,
4726 uint64_t channel_layout
, int32_t sample_rate
,
4727 int32_t width
, int32_t height
)
4733 return AVERROR(EINVAL
);
4736 flags
|= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT
;
4738 if (channel_layout
) {
4740 flags
|= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT
;
4744 flags
|= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE
;
4746 if (width
|| height
) {
4748 flags
|= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS
;
4750 data
= av_packet_new_side_data(pkt
, AV_PKT_DATA_PARAM_CHANGE
, size
);
4752 return AVERROR(ENOMEM
);
4753 bytestream_put_le32(&data
, flags
);
4755 bytestream_put_le32(&data
, channels
);
4757 bytestream_put_le64(&data
, channel_layout
);
4759 bytestream_put_le32(&data
, sample_rate
);
4760 if (width
|| height
) {
4761 bytestream_put_le32(&data
, width
);
4762 bytestream_put_le32(&data
, height
);
4767 AVRational
av_guess_sample_aspect_ratio(AVFormatContext
*format
, AVStream
*stream
, AVFrame
*frame
)
4769 AVRational undef
= {0, 1};
4770 AVRational stream_sample_aspect_ratio
= stream
? stream
->sample_aspect_ratio
: undef
;
4771 AVRational codec_sample_aspect_ratio
= stream
&& stream
->codecpar
? stream
->codecpar
->sample_aspect_ratio
: undef
;
4772 AVRational frame_sample_aspect_ratio
= frame
? frame
->sample_aspect_ratio
: codec_sample_aspect_ratio
;
4774 av_reduce(&stream_sample_aspect_ratio
.num
, &stream_sample_aspect_ratio
.den
,
4775 stream_sample_aspect_ratio
.num
, stream_sample_aspect_ratio
.den
, INT_MAX
);
4776 if (stream_sample_aspect_ratio
.num
<= 0 || stream_sample_aspect_ratio
.den
<= 0)
4777 stream_sample_aspect_ratio
= undef
;
4779 av_reduce(&frame_sample_aspect_ratio
.num
, &frame_sample_aspect_ratio
.den
,
4780 frame_sample_aspect_ratio
.num
, frame_sample_aspect_ratio
.den
, INT_MAX
);
4781 if (frame_sample_aspect_ratio
.num
<= 0 || frame_sample_aspect_ratio
.den
<= 0)
4782 frame_sample_aspect_ratio
= undef
;
4784 if (stream_sample_aspect_ratio
.num
)
4785 return stream_sample_aspect_ratio
;
4787 return frame_sample_aspect_ratio
;
4790 AVRational
av_guess_frame_rate(AVFormatContext
*format
, AVStream
*st
, AVFrame
*frame
)
4792 AVRational fr
= st
->r_frame_rate
;
4793 AVRational codec_fr
= st
->internal
->avctx
->framerate
;
4794 AVRational avg_fr
= st
->avg_frame_rate
;
4796 if (avg_fr
.num
> 0 && avg_fr
.den
> 0 && fr
.num
> 0 && fr
.den
> 0 &&
4797 av_q2d(avg_fr
) < 70 && av_q2d(fr
) > 210) {
4802 if (st
->internal
->avctx
->ticks_per_frame
> 1) {
4803 if ( codec_fr
.num
> 0 && codec_fr
.den
> 0 &&
4804 (fr
.num
== 0 || av_q2d(codec_fr
) < av_q2d(fr
)*0.7 && fabs(1.0 - av_q2d(av_div_q(avg_fr
, fr
))) > 0.1))
4811 int avformat_match_stream_specifier(AVFormatContext
*s
, AVStream
*st
,
4814 if (*spec
<= '9' && *spec
>= '0') /* opt:index */
4815 return strtol(spec
, NULL
, 0) == st
->index
;
4816 else if (*spec
== 'v' || *spec
== 'a' || *spec
== 's' || *spec
== 'd' ||
4817 *spec
== 't' || *spec
== 'V') { /* opt:[vasdtV] */
4818 enum AVMediaType type
;
4822 case 'v': type
= AVMEDIA_TYPE_VIDEO
; break;
4823 case 'a': type
= AVMEDIA_TYPE_AUDIO
; break;
4824 case 's': type
= AVMEDIA_TYPE_SUBTITLE
; break;
4825 case 'd': type
= AVMEDIA_TYPE_DATA
; break;
4826 case 't': type
= AVMEDIA_TYPE_ATTACHMENT
; break;
4827 case 'V': type
= AVMEDIA_TYPE_VIDEO
; nopic
= 1; break;
4828 default: av_assert0(0);
4830 #if FF_API_LAVF_AVCTX
4831 FF_DISABLE_DEPRECATION_WARNINGS
4832 if (type
!= st
->codecpar
->codec_type
4833 && (st
->codecpar
->codec_type
!= AVMEDIA_TYPE_UNKNOWN
|| st
->codec
->codec_type
!= type
))
4835 FF_ENABLE_DEPRECATION_WARNINGS
4837 if (type
!= st
->codecpar
->codec_type
)
4840 if (nopic
&& (st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
))
4842 if (*spec
++ == ':') { /* possibly followed by :index */
4843 int i
, index
= strtol(spec
, NULL
, 0);
4844 for (i
= 0; i
< s
->nb_streams
; i
++) {
4845 #if FF_API_LAVF_AVCTX
4846 FF_DISABLE_DEPRECATION_WARNINGS
4847 if ((s
->streams
[i
]->codecpar
->codec_type
== type
4848 || s
->streams
[i
]->codec
->codec_type
== type
4850 !(nopic
&& (st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
)) &&
4852 return i
== st
->index
;
4853 FF_ENABLE_DEPRECATION_WARNINGS
4855 if ((s
->streams
[i
]->codecpar
->codec_type
== type
) &&
4856 !(nopic
&& (st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
)) &&
4858 return i
== st
->index
;
4864 } else if (*spec
== 'p' && *(spec
+ 1) == ':') {
4868 prog_id
= strtol(spec
, &endptr
, 0);
4869 for (i
= 0; i
< s
->nb_programs
; i
++) {
4870 if (s
->programs
[i
]->id
!= prog_id
)
4873 if (*endptr
++ == ':') {
4874 int stream_idx
= strtol(endptr
, NULL
, 0);
4875 return stream_idx
>= 0 &&
4876 stream_idx
< s
->programs
[i
]->nb_stream_indexes
&&
4877 st
->index
== s
->programs
[i
]->stream_index
[stream_idx
];
4880 for (j
= 0; j
< s
->programs
[i
]->nb_stream_indexes
; j
++)
4881 if (st
->index
== s
->programs
[i
]->stream_index
[j
])
4885 } else if (*spec
== '#' ||
4886 (*spec
== 'i' && *(spec
+ 1) == ':')) {
4889 spec
+= 1 + (*spec
== 'i');
4890 stream_id
= strtol(spec
, &endptr
, 0);
4892 return stream_id
== st
->id
;
4893 } else if (*spec
== 'm' && *(spec
+ 1) == ':') {
4894 AVDictionaryEntry
*tag
;
4899 val
= strchr(spec
, ':');
4901 key
= val
? av_strndup(spec
, val
- spec
) : av_strdup(spec
);
4903 return AVERROR(ENOMEM
);
4905 tag
= av_dict_get(st
->metadata
, key
, NULL
, 0);
4907 if (!val
|| !strcmp(tag
->value
, val
+ 1))
4916 } else if (*spec
== 'u') {
4917 AVCodecParameters
*par
= st
->codecpar
;
4918 #if FF_API_LAVF_AVCTX
4919 FF_DISABLE_DEPRECATION_WARNINGS
4920 AVCodecContext
*codec
= st
->codec
;
4921 FF_ENABLE_DEPRECATION_WARNINGS
4924 switch (par
->codec_type
) {
4925 case AVMEDIA_TYPE_AUDIO
:
4926 val
= par
->sample_rate
&& par
->channels
;
4927 #if FF_API_LAVF_AVCTX
4928 val
= val
|| (codec
->sample_rate
&& codec
->channels
);
4930 if (par
->format
== AV_SAMPLE_FMT_NONE
4931 #if FF_API_LAVF_AVCTX
4932 && codec
->sample_fmt
== AV_SAMPLE_FMT_NONE
4937 case AVMEDIA_TYPE_VIDEO
:
4938 val
= par
->width
&& par
->height
;
4939 #if FF_API_LAVF_AVCTX
4940 val
= val
|| (codec
->width
&& codec
->height
);
4942 if (par
->format
== AV_PIX_FMT_NONE
4943 #if FF_API_LAVF_AVCTX
4944 && codec
->pix_fmt
== AV_PIX_FMT_NONE
4949 case AVMEDIA_TYPE_UNKNOWN
:
4956 #if FF_API_LAVF_AVCTX
4957 return (par
->codec_id
!= AV_CODEC_ID_NONE
|| codec
->codec_id
!= AV_CODEC_ID_NONE
) && val
!= 0;
4959 return par
->codec_id
!= AV_CODEC_ID_NONE
&& val
!= 0;
4961 } else if (!*spec
) /* empty specifier, matches everything */
4964 av_log(s
, AV_LOG_ERROR
, "Invalid stream specifier: %s.\n", spec
);
4965 return AVERROR(EINVAL
);
4968 int ff_generate_avci_extradata(AVStream
*st
)
4970 static const uint8_t avci100_1080p_extradata
[] = {
4972 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4973 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4974 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4975 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
4976 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
4977 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
4978 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
4979 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
4980 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4982 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
4985 static const uint8_t avci100_1080i_extradata
[] = {
4987 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
4988 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
4989 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
4990 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
4991 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
4992 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
4993 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
4994 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
4995 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
4996 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
4997 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
4999 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5002 static const uint8_t avci50_1080p_extradata
[] = {
5004 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5005 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5006 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5007 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5008 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5009 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
5010 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
5011 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
5012 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
5014 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5017 static const uint8_t avci50_1080i_extradata
[] = {
5019 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5020 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5021 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5022 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
5023 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
5024 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
5025 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
5026 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
5027 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
5028 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
5029 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
5031 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5034 static const uint8_t avci100_720p_extradata
[] = {
5036 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5037 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
5038 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
5039 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
5040 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
5041 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
5042 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
5043 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
5044 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
5045 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
5047 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
5050 static const uint8_t avci50_720p_extradata
[] = {
5052 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
5053 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5054 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5055 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5056 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5057 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
5058 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
5059 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
5060 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
5062 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5066 const uint8_t *data
= NULL
;
5069 if (st
->codecpar
->width
== 1920) {
5070 if (st
->codecpar
->field_order
== AV_FIELD_PROGRESSIVE
) {
5071 data
= avci100_1080p_extradata
;
5072 size
= sizeof(avci100_1080p_extradata
);
5074 data
= avci100_1080i_extradata
;
5075 size
= sizeof(avci100_1080i_extradata
);
5077 } else if (st
->codecpar
->width
== 1440) {
5078 if (st
->codecpar
->field_order
== AV_FIELD_PROGRESSIVE
) {
5079 data
= avci50_1080p_extradata
;
5080 size
= sizeof(avci50_1080p_extradata
);
5082 data
= avci50_1080i_extradata
;
5083 size
= sizeof(avci50_1080i_extradata
);
5085 } else if (st
->codecpar
->width
== 1280) {
5086 data
= avci100_720p_extradata
;
5087 size
= sizeof(avci100_720p_extradata
);
5088 } else if (st
->codecpar
->width
== 960) {
5089 data
= avci50_720p_extradata
;
5090 size
= sizeof(avci50_720p_extradata
);
5096 av_freep(&st
->codecpar
->extradata
);
5097 if (ff_alloc_extradata(st
->codecpar
, size
))
5098 return AVERROR(ENOMEM
);
5099 memcpy(st
->codecpar
->extradata
, data
, size
);
5104 #if FF_API_NOCONST_GET_SIDE_DATA
5105 uint8_t *av_stream_get_side_data(AVStream
*st
,
5106 enum AVPacketSideDataType type
, int *size
)
5108 uint8_t *av_stream_get_side_data(const AVStream
*st
,
5109 enum AVPacketSideDataType type
, int *size
)
5114 for (i
= 0; i
< st
->nb_side_data
; i
++) {
5115 if (st
->side_data
[i
].type
== type
) {
5117 *size
= st
->side_data
[i
].size
;
5118 return st
->side_data
[i
].data
;
5124 uint8_t *av_stream_new_side_data(AVStream
*st
, enum AVPacketSideDataType type
,
5127 AVPacketSideData
*sd
, *tmp
;
5129 uint8_t *data
= av_malloc(size
);
5134 for (i
= 0; i
< st
->nb_side_data
; i
++) {
5135 sd
= &st
->side_data
[i
];
5137 if (sd
->type
== type
) {
5138 av_freep(&sd
->data
);
5145 tmp
= av_realloc_array(st
->side_data
, st
->nb_side_data
+ 1, sizeof(*tmp
));
5151 st
->side_data
= tmp
;
5154 sd
= &st
->side_data
[st
->nb_side_data
- 1];
5161 int ff_stream_add_bitstream_filter(AVStream
*st
, const char *name
, const char *args
)
5164 const AVBitStreamFilter
*bsf
;
5166 AVCodecParameters
*in_par
;
5168 if (!(bsf
= av_bsf_get_by_name(name
))) {
5169 av_log(NULL
, AV_LOG_ERROR
, "Unknown bitstream filter '%s'\n", name
);
5170 return AVERROR_BSF_NOT_FOUND
;
5173 if ((ret
= av_bsf_alloc(bsf
, &bsfc
)) < 0)
5176 if (st
->internal
->nb_bsfcs
) {
5177 in_par
= st
->internal
->bsfcs
[st
->internal
->nb_bsfcs
- 1]->par_out
;
5178 bsfc
->time_base_in
= st
->internal
->bsfcs
[st
->internal
->nb_bsfcs
- 1]->time_base_out
;
5180 in_par
= st
->codecpar
;
5181 bsfc
->time_base_in
= st
->time_base
;
5184 if ((ret
= avcodec_parameters_copy(bsfc
->par_in
, in_par
)) < 0) {
5189 if (args
&& bsfc
->filter
->priv_class
) {
5190 const AVOption
*opt
= av_opt_next(bsfc
->priv_data
, NULL
);
5191 const char * shorthand
[2] = {NULL
};
5194 shorthand
[0] = opt
->name
;
5196 if ((ret
= av_opt_set_from_string(bsfc
->priv_data
, args
, shorthand
, "=", ":")) < 0) {
5202 if ((ret
= av_bsf_init(bsfc
)) < 0) {
5207 if ((ret
= av_dynarray_add_nofree(&st
->internal
->bsfcs
, &st
->internal
->nb_bsfcs
, bsfc
))) {
5212 av_log(NULL
, AV_LOG_VERBOSE
,
5213 "Automatically inserted bitstream filter '%s'; args='%s'\n",
5214 name
, args
? args
: "");
5219 FF_DISABLE_DEPRECATION_WARNINGS
5220 int av_apply_bitstream_filters(AVCodecContext
*codec
, AVPacket
*pkt
,
5221 AVBitStreamFilterContext
*bsfc
)
5225 AVPacket new_pkt
= *pkt
;
5226 int a
= av_bitstream_filter_filter(bsfc
, codec
, NULL
,
5227 &new_pkt
.data
, &new_pkt
.size
,
5228 pkt
->data
, pkt
->size
,
5229 pkt
->flags
& AV_PKT_FLAG_KEY
);
5230 if (a
== 0 && new_pkt
.size
== 0 && new_pkt
.side_data_elems
== 0) {
5231 av_packet_unref(pkt
);
5232 memset(pkt
, 0, sizeof(*pkt
));
5235 if(a
== 0 && new_pkt
.data
!= pkt
->data
) {
5236 uint8_t *t
= av_malloc(new_pkt
.size
+ AV_INPUT_BUFFER_PADDING_SIZE
); //the new should be a subset of the old so cannot overflow
5238 memcpy(t
, new_pkt
.data
, new_pkt
.size
);
5239 memset(t
+ new_pkt
.size
, 0, AV_INPUT_BUFFER_PADDING_SIZE
);
5244 a
= AVERROR(ENOMEM
);
5248 new_pkt
.buf
= av_buffer_create(new_pkt
.data
, new_pkt
.size
,
5249 av_buffer_default_free
, NULL
, 0);
5251 pkt
->side_data
= NULL
;
5252 pkt
->side_data_elems
= 0;
5253 av_packet_unref(pkt
);
5255 av_freep(&new_pkt
.data
);
5256 a
= AVERROR(ENOMEM
);
5260 av_log(codec
, AV_LOG_ERROR
,
5261 "Failed to open bitstream filter %s for stream %d with codec %s",
5262 bsfc
->filter
->name
, pkt
->stream_index
,
5263 codec
->codec
? codec
->codec
->name
: "copy");
5273 FF_ENABLE_DEPRECATION_WARNINGS
5276 int ff_format_output_open(AVFormatContext
*s
, const char *url
, AVDictionary
**options
)
5279 return AVERROR(EINVAL
);
5281 if (!(s
->oformat
->flags
& AVFMT_NOFILE
))
5282 return s
->io_open(s
, &s
->pb
, url
, AVIO_FLAG_WRITE
, options
);
5286 void ff_format_io_close(AVFormatContext
*s
, AVIOContext
**pb
)
5289 s
->io_close(s
, *pb
);
5293 int ff_parse_creation_time_metadata(AVFormatContext
*s
, int64_t *timestamp
, int return_seconds
)
5295 AVDictionaryEntry
*entry
;
5296 int64_t parsed_timestamp
;
5298 if ((entry
= av_dict_get(s
->metadata
, "creation_time", NULL
, 0))) {
5299 if ((ret
= av_parse_time(&parsed_timestamp
, entry
->value
, 0)) >= 0) {
5300 *timestamp
= return_seconds
? parsed_timestamp
/ 1000000 : parsed_timestamp
;
5303 av_log(s
, AV_LOG_WARNING
, "Failed to parse creation_time %s\n", entry
->value
);
5310 int ff_standardize_creation_time(AVFormatContext
*s
)
5313 int ret
= ff_parse_creation_time_metadata(s
, ×tamp
, 0);
5315 return avpriv_dict_set_timestamp(&s
->metadata
, "creation_time", timestamp
);
5319 int ff_get_packet_palette(AVFormatContext
*s
, AVPacket
*pkt
, int ret
, uint32_t *palette
)
5324 side_data
= av_packet_get_side_data(pkt
, AV_PKT_DATA_PALETTE
, &size
);
5326 if (size
!= AVPALETTE_SIZE
) {
5327 av_log(s
, AV_LOG_ERROR
, "Invalid palette side data\n");
5328 return AVERROR_INVALIDDATA
;
5330 memcpy(palette
, side_data
, AVPALETTE_SIZE
);
5334 if (ret
== CONTAINS_PAL
) {
5336 for (i
= 0; i
< AVPALETTE_COUNT
; i
++)
5337 palette
[i
] = AV_RL32(pkt
->data
+ pkt
->size
- AVPALETTE_SIZE
+ i
*4);
5344 int ff_bprint_to_codecpar_extradata(AVCodecParameters
*par
, struct AVBPrint
*buf
)
5349 ret
= av_bprint_finalize(buf
, &str
);
5352 if (!av_bprint_is_complete(buf
)) {
5354 return AVERROR(ENOMEM
);
5357 par
->extradata
= str
;
5358 /* Note: the string is NUL terminated (so extradata can be read as a
5359 * string), but the ending character is not accounted in the size (in
5360 * binary formats you are likely not supposed to mux that character). When
5361 * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE
5363 par
->extradata_size
= buf
->len
;
5367 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat
*ofmt
,
5368 AVStream
*ost
, const AVStream
*ist
,
5369 enum AVTimebaseSource copy_tb
)
5371 //TODO: use [io]st->internal->avctx
5372 const AVCodecContext
*dec_ctx
= ist
->codec
;
5373 AVCodecContext
*enc_ctx
= ost
->codec
;
5375 enc_ctx
->time_base
= ist
->time_base
;
5377 * Avi is a special case here because it supports variable fps but
5378 * having the fps and timebase differe significantly adds quite some
5381 if (!strcmp(ofmt
->name
, "avi")) {
5382 #if FF_API_R_FRAME_RATE
5383 if (copy_tb
== AVFMT_TBCF_AUTO
&& ist
->r_frame_rate
.num
5384 && av_q2d(ist
->r_frame_rate
) >= av_q2d(ist
->avg_frame_rate
)
5385 && 0.5/av_q2d(ist
->r_frame_rate
) > av_q2d(ist
->time_base
)
5386 && 0.5/av_q2d(ist
->r_frame_rate
) > av_q2d(dec_ctx
->time_base
)
5387 && av_q2d(ist
->time_base
) < 1.0/500 && av_q2d(dec_ctx
->time_base
) < 1.0/500
5388 || copy_tb
== AVFMT_TBCF_R_FRAMERATE
) {
5389 enc_ctx
->time_base
.num
= ist
->r_frame_rate
.den
;
5390 enc_ctx
->time_base
.den
= 2*ist
->r_frame_rate
.num
;
5391 enc_ctx
->ticks_per_frame
= 2;
5394 if (copy_tb
== AVFMT_TBCF_AUTO
&& av_q2d(dec_ctx
->time_base
)*dec_ctx
->ticks_per_frame
> 2*av_q2d(ist
->time_base
)
5395 && av_q2d(ist
->time_base
) < 1.0/500
5396 || copy_tb
== AVFMT_TBCF_DECODER
) {
5397 enc_ctx
->time_base
= dec_ctx
->time_base
;
5398 enc_ctx
->time_base
.num
*= dec_ctx
->ticks_per_frame
;
5399 enc_ctx
->time_base
.den
*= 2;
5400 enc_ctx
->ticks_per_frame
= 2;
5402 } else if (!(ofmt
->flags
& AVFMT_VARIABLE_FPS
)
5403 && !av_match_name(ofmt
->name
, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
5404 if (copy_tb
== AVFMT_TBCF_AUTO
&& dec_ctx
->time_base
.den
5405 && av_q2d(dec_ctx
->time_base
)*dec_ctx
->ticks_per_frame
> av_q2d(ist
->time_base
)
5406 && av_q2d(ist
->time_base
) < 1.0/500
5407 || copy_tb
== AVFMT_TBCF_DECODER
) {
5408 enc_ctx
->time_base
= dec_ctx
->time_base
;
5409 enc_ctx
->time_base
.num
*= dec_ctx
->ticks_per_frame
;
5413 if ((enc_ctx
->codec_tag
== AV_RL32("tmcd") || ost
->codecpar
->codec_tag
== AV_RL32("tmcd"))
5414 && dec_ctx
->time_base
.num
< dec_ctx
->time_base
.den
5415 && dec_ctx
->time_base
.num
> 0
5416 && 121LL*dec_ctx
->time_base
.num
> dec_ctx
->time_base
.den
) {
5417 enc_ctx
->time_base
= dec_ctx
->time_base
;
5420 if (ost
->avg_frame_rate
.num
)
5421 enc_ctx
->time_base
= av_inv_q(ost
->avg_frame_rate
);
5423 av_reduce(&enc_ctx
->time_base
.num
, &enc_ctx
->time_base
.den
,
5424 enc_ctx
->time_base
.num
, enc_ctx
->time_base
.den
, INT_MAX
);
5429 AVRational
av_stream_get_codec_timebase(const AVStream
*st
)
5431 // See avformat_transfer_internal_stream_timing_info() TODO.
5432 #if FF_API_LAVF_AVCTX
5433 FF_DISABLE_DEPRECATION_WARNINGS
5434 return st
->codec
->time_base
;
5435 FF_ENABLE_DEPRECATION_WARNINGS
5437 return st
->internal
->avctx
->time_base
;