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
26 #include "libavutil/avassert.h"
27 #include "libavutil/avstring.h"
28 #include "libavutil/dict.h"
29 #include "libavutil/internal.h"
30 #include "libavutil/mathematics.h"
31 #include "libavutil/opt.h"
32 #include "libavutil/parseutils.h"
33 #include "libavutil/pixfmt.h"
34 #include "libavutil/thread.h"
35 #include "libavutil/time.h"
36 #include "libavutil/timestamp.h"
38 #include "libavcodec/bytestream.h"
39 #include "libavcodec/internal.h"
40 #include "libavcodec/raw.h"
43 #include "avio_internal.h"
51 #include "libavutil/ffversion.h"
52 const char av_format_ffversion
[] = "FFmpeg version " FFMPEG_VERSION
;
54 static AVMutex avformat_mutex
= AV_MUTEX_INITIALIZER
;
58 * various utility functions for use within FFmpeg
61 unsigned avformat_version(void)
63 av_assert0(LIBAVFORMAT_VERSION_MICRO
>= 100);
64 return LIBAVFORMAT_VERSION_INT
;
67 const char *avformat_configuration(void)
69 return FFMPEG_CONFIGURATION
;
72 const char *avformat_license(void)
74 #define LICENSE_PREFIX "libavformat license: "
75 return &LICENSE_PREFIX FFMPEG_LICENSE
[sizeof(LICENSE_PREFIX
) - 1];
78 int ff_lock_avformat(void)
80 return ff_mutex_lock(&avformat_mutex
) ? -1 : 0;
83 int ff_unlock_avformat(void)
85 return ff_mutex_unlock(&avformat_mutex
) ? -1 : 0;
88 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
90 static int is_relative(int64_t ts
) {
91 return ts
> (RELATIVE_TS_BASE
- (1LL<<48));
95 * Wrap a given time stamp, if there is an indication for an overflow
98 * @param timestamp the time stamp to wrap
99 * @return resulting time stamp
101 static int64_t wrap_timestamp(const AVStream
*st
, int64_t timestamp
)
103 if (st
->pts_wrap_behavior
!= AV_PTS_WRAP_IGNORE
&&
104 st
->pts_wrap_reference
!= AV_NOPTS_VALUE
&& timestamp
!= AV_NOPTS_VALUE
) {
105 if (st
->pts_wrap_behavior
== AV_PTS_WRAP_ADD_OFFSET
&&
106 timestamp
< st
->pts_wrap_reference
)
107 return timestamp
+ (1ULL << st
->pts_wrap_bits
);
108 else if (st
->pts_wrap_behavior
== AV_PTS_WRAP_SUB_OFFSET
&&
109 timestamp
>= st
->pts_wrap_reference
)
110 return timestamp
- (1ULL << st
->pts_wrap_bits
);
115 #if FF_API_FORMAT_GET_SET
116 MAKE_ACCESSORS(AVStream
, stream
, AVRational
, r_frame_rate
)
117 #if FF_API_LAVF_FFSERVER
118 FF_DISABLE_DEPRECATION_WARNINGS
119 MAKE_ACCESSORS(AVStream
, stream
, char *, recommended_encoder_configuration
)
120 FF_ENABLE_DEPRECATION_WARNINGS
122 MAKE_ACCESSORS(AVFormatContext
, format
, AVCodec
*, video_codec
)
123 MAKE_ACCESSORS(AVFormatContext
, format
, AVCodec
*, audio_codec
)
124 MAKE_ACCESSORS(AVFormatContext
, format
, AVCodec
*, subtitle_codec
)
125 MAKE_ACCESSORS(AVFormatContext
, format
, AVCodec
*, data_codec
)
126 MAKE_ACCESSORS(AVFormatContext
, format
, int, metadata_header_padding
)
127 MAKE_ACCESSORS(AVFormatContext
, format
, void *, opaque
)
128 MAKE_ACCESSORS(AVFormatContext
, format
, av_format_control_message
, control_message_cb
)
129 #if FF_API_OLD_OPEN_CALLBACKS
130 FF_DISABLE_DEPRECATION_WARNINGS
131 MAKE_ACCESSORS(AVFormatContext
, format
, AVOpenCallback
, open_cb
)
132 FF_ENABLE_DEPRECATION_WARNINGS
136 int64_t av_stream_get_end_pts(const AVStream
*st
)
138 if (st
->internal
->priv_pts
) {
139 return st
->internal
->priv_pts
->val
;
141 return AV_NOPTS_VALUE
;
144 struct AVCodecParserContext
*av_stream_get_parser(const AVStream
*st
)
149 void av_format_inject_global_side_data(AVFormatContext
*s
)
152 s
->internal
->inject_global_side_data
= 1;
153 for (i
= 0; i
< s
->nb_streams
; i
++) {
154 AVStream
*st
= s
->streams
[i
];
155 st
->inject_global_side_data
= 1;
159 int ff_copy_whiteblacklists(AVFormatContext
*dst
, const AVFormatContext
*src
)
161 av_assert0(!dst
->codec_whitelist
&&
162 !dst
->format_whitelist
&&
163 !dst
->protocol_whitelist
&&
164 !dst
->protocol_blacklist
);
165 dst
-> codec_whitelist
= av_strdup(src
->codec_whitelist
);
166 dst
->format_whitelist
= av_strdup(src
->format_whitelist
);
167 dst
->protocol_whitelist
= av_strdup(src
->protocol_whitelist
);
168 dst
->protocol_blacklist
= av_strdup(src
->protocol_blacklist
);
169 if ( (src
-> codec_whitelist
&& !dst
-> codec_whitelist
)
170 || (src
-> format_whitelist
&& !dst
-> format_whitelist
)
171 || (src
->protocol_whitelist
&& !dst
->protocol_whitelist
)
172 || (src
->protocol_blacklist
&& !dst
->protocol_blacklist
)) {
173 av_log(dst
, AV_LOG_ERROR
, "Failed to duplicate black/whitelist\n");
174 return AVERROR(ENOMEM
);
179 static const AVCodec
*find_decoder(AVFormatContext
*s
, const AVStream
*st
, enum AVCodecID codec_id
)
181 #if FF_API_LAVF_AVCTX
182 FF_DISABLE_DEPRECATION_WARNINGS
183 if (st
->codec
->codec
)
184 return st
->codec
->codec
;
185 FF_ENABLE_DEPRECATION_WARNINGS
188 switch (st
->codecpar
->codec_type
) {
189 case AVMEDIA_TYPE_VIDEO
:
190 if (s
->video_codec
) return s
->video_codec
;
192 case AVMEDIA_TYPE_AUDIO
:
193 if (s
->audio_codec
) return s
->audio_codec
;
195 case AVMEDIA_TYPE_SUBTITLE
:
196 if (s
->subtitle_codec
) return s
->subtitle_codec
;
200 return avcodec_find_decoder(codec_id
);
203 static const AVCodec
*find_probe_decoder(AVFormatContext
*s
, const AVStream
*st
, enum AVCodecID codec_id
)
205 const AVCodec
*codec
;
207 #if CONFIG_H264_DECODER
208 /* Other parts of the code assume this decoder to be used for h264,
209 * so force it if possible. */
210 if (codec_id
== AV_CODEC_ID_H264
)
211 return avcodec_find_decoder_by_name("h264");
214 codec
= find_decoder(s
, st
, codec_id
);
218 if (codec
->capabilities
& AV_CODEC_CAP_AVOID_PROBING
) {
219 const AVCodec
*probe_codec
= NULL
;
221 while ((probe_codec
= av_codec_iterate(&iter
))) {
222 if (probe_codec
->id
== codec
->id
&&
223 av_codec_is_decoder(probe_codec
) &&
224 !(probe_codec
->capabilities
& (AV_CODEC_CAP_AVOID_PROBING
| AV_CODEC_CAP_EXPERIMENTAL
))) {
233 #if FF_API_FORMAT_GET_SET
234 int av_format_get_probe_score(const AVFormatContext
*s
)
236 return s
->probe_score
;
240 /* an arbitrarily chosen "sane" max packet size -- 50M */
241 #define SANE_CHUNK_SIZE (50000000)
243 int ffio_limit(AVIOContext
*s
, int size
)
245 if (s
->maxsize
>= 0) {
246 int64_t pos
= avio_tell(s
);
247 int64_t remaining
= s
->maxsize
- pos
;
248 if (remaining
< size
) {
249 int64_t newsize
= avio_size(s
);
250 if (!s
->maxsize
|| s
->maxsize
<newsize
)
251 s
->maxsize
= newsize
- !newsize
;
252 if (pos
> s
->maxsize
&& s
->maxsize
>= 0)
253 s
->maxsize
= AVERROR(EIO
);
255 remaining
= s
->maxsize
- pos
;
258 if (s
->maxsize
>= 0 && remaining
+1 < size
) {
259 av_log(NULL
, remaining
? AV_LOG_ERROR
: AV_LOG_DEBUG
, "Truncating packet of size %d to %"PRId64
"\n", size
, remaining
+1);
266 /* Read the data in sane-sized chunks and append to pkt.
267 * Return the number of bytes read or an error. */
268 static int append_packet_chunked(AVIOContext
*s
, AVPacket
*pkt
, int size
)
270 int orig_size
= pkt
->size
;
274 int prev_size
= pkt
->size
;
277 /* When the caller requests a lot of data, limit it to the amount
278 * left in file or SANE_CHUNK_SIZE when it is not known. */
280 if (read_size
> SANE_CHUNK_SIZE
/10) {
281 read_size
= ffio_limit(s
, read_size
);
282 // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
284 read_size
= FFMIN(read_size
, SANE_CHUNK_SIZE
);
287 ret
= av_grow_packet(pkt
, read_size
);
291 ret
= avio_read(s
, pkt
->data
+ prev_size
, read_size
);
292 if (ret
!= read_size
) {
293 av_shrink_packet(pkt
, prev_size
+ FFMAX(ret
, 0));
300 pkt
->flags
|= AV_PKT_FLAG_CORRUPT
;
303 av_packet_unref(pkt
);
304 return pkt
->size
> orig_size
? pkt
->size
- orig_size
: ret
;
307 int av_get_packet(AVIOContext
*s
, AVPacket
*pkt
, int size
)
312 pkt
->pos
= avio_tell(s
);
314 return append_packet_chunked(s
, pkt
, size
);
317 int av_append_packet(AVIOContext
*s
, AVPacket
*pkt
, int size
)
320 return av_get_packet(s
, pkt
, size
);
321 return append_packet_chunked(s
, pkt
, size
);
324 int av_filename_number_test(const char *filename
)
328 (av_get_frame_filename(buf
, sizeof(buf
), filename
, 1) >= 0);
331 static int set_codec_from_probe_data(AVFormatContext
*s
, AVStream
*st
,
334 static const struct {
337 enum AVMediaType type
;
339 { "aac", AV_CODEC_ID_AAC
, AVMEDIA_TYPE_AUDIO
},
340 { "ac3", AV_CODEC_ID_AC3
, AVMEDIA_TYPE_AUDIO
},
341 { "aptx", AV_CODEC_ID_APTX
, AVMEDIA_TYPE_AUDIO
},
342 { "dts", AV_CODEC_ID_DTS
, AVMEDIA_TYPE_AUDIO
},
343 { "dvbsub", AV_CODEC_ID_DVB_SUBTITLE
,AVMEDIA_TYPE_SUBTITLE
},
344 { "dvbtxt", AV_CODEC_ID_DVB_TELETEXT
,AVMEDIA_TYPE_SUBTITLE
},
345 { "eac3", AV_CODEC_ID_EAC3
, AVMEDIA_TYPE_AUDIO
},
346 { "h264", AV_CODEC_ID_H264
, AVMEDIA_TYPE_VIDEO
},
347 { "hevc", AV_CODEC_ID_HEVC
, AVMEDIA_TYPE_VIDEO
},
348 { "loas", AV_CODEC_ID_AAC_LATM
, AVMEDIA_TYPE_AUDIO
},
349 { "m4v", AV_CODEC_ID_MPEG4
, AVMEDIA_TYPE_VIDEO
},
350 { "mjpeg_2000",AV_CODEC_ID_JPEG2000
, AVMEDIA_TYPE_VIDEO
},
351 { "mp3", AV_CODEC_ID_MP3
, AVMEDIA_TYPE_AUDIO
},
352 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO
, AVMEDIA_TYPE_VIDEO
},
353 { "truehd", AV_CODEC_ID_TRUEHD
, AVMEDIA_TYPE_AUDIO
},
357 const AVInputFormat
*fmt
= av_probe_input_format3(pd
, 1, &score
);
361 av_log(s
, AV_LOG_DEBUG
,
362 "Probe with size=%d, packets=%d detected %s with score=%d\n",
363 pd
->buf_size
, s
->max_probe_packets
- st
->probe_packets
,
365 for (i
= 0; fmt_id_type
[i
].name
; i
++) {
366 if (!strcmp(fmt
->name
, fmt_id_type
[i
].name
)) {
367 if (fmt_id_type
[i
].type
!= AVMEDIA_TYPE_AUDIO
&&
368 st
->codecpar
->sample_rate
)
370 if (st
->request_probe
> score
&&
371 st
->codecpar
->codec_id
!= fmt_id_type
[i
].id
)
373 st
->codecpar
->codec_id
= fmt_id_type
[i
].id
;
374 st
->codecpar
->codec_type
= fmt_id_type
[i
].type
;
375 st
->internal
->need_context_update
= 1;
376 #if FF_API_LAVF_AVCTX
377 FF_DISABLE_DEPRECATION_WARNINGS
378 st
->codec
->codec_type
= st
->codecpar
->codec_type
;
379 st
->codec
->codec_id
= st
->codecpar
->codec_id
;
380 FF_ENABLE_DEPRECATION_WARNINGS
389 /************************************************************/
390 /* input media file */
392 int av_demuxer_open(AVFormatContext
*ic
) {
395 if (ic
->format_whitelist
&& av_match_list(ic
->iformat
->name
, ic
->format_whitelist
, ',') <= 0) {
396 av_log(ic
, AV_LOG_ERROR
, "Format not on whitelist \'%s\'\n", ic
->format_whitelist
);
397 return AVERROR(EINVAL
);
400 if (ic
->iformat
->read_header
) {
401 err
= ic
->iformat
->read_header(ic
);
406 if (ic
->pb
&& !ic
->internal
->data_offset
)
407 ic
->internal
->data_offset
= avio_tell(ic
->pb
);
412 /* Open input file and probe the format if necessary. */
413 static int init_input(AVFormatContext
*s
, const char *filename
,
414 AVDictionary
**options
)
417 AVProbeData pd
= { filename
, NULL
, 0 };
418 int score
= AVPROBE_SCORE_RETRY
;
421 s
->flags
|= AVFMT_FLAG_CUSTOM_IO
;
423 return av_probe_input_buffer2(s
->pb
, &s
->iformat
, filename
,
424 s
, 0, s
->format_probesize
);
425 else if (s
->iformat
->flags
& AVFMT_NOFILE
)
426 av_log(s
, AV_LOG_WARNING
, "Custom AVIOContext makes no sense and "
427 "will be ignored with AVFMT_NOFILE format.\n");
431 if ((s
->iformat
&& s
->iformat
->flags
& AVFMT_NOFILE
) ||
432 (!s
->iformat
&& (s
->iformat
= av_probe_input_format2(&pd
, 0, &score
))))
435 if ((ret
= s
->io_open(s
, &s
->pb
, filename
, AVIO_FLAG_READ
| s
->avio_flags
, options
)) < 0)
440 return av_probe_input_buffer2(s
->pb
, &s
->iformat
, filename
,
441 s
, 0, s
->format_probesize
);
444 int ff_packet_list_put(AVPacketList
**packet_buffer
,
445 AVPacketList
**plast_pktl
,
446 AVPacket
*pkt
, int flags
)
448 AVPacketList
*pktl
= av_mallocz(sizeof(AVPacketList
));
452 return AVERROR(ENOMEM
);
454 if (flags
& FF_PACKETLIST_FLAG_REF_PACKET
) {
455 if ((ret
= av_packet_ref(&pktl
->pkt
, pkt
)) < 0) {
460 ret
= av_packet_make_refcounted(pkt
);
465 av_packet_move_ref(&pktl
->pkt
, pkt
);
469 (*plast_pktl
)->next
= pktl
;
471 *packet_buffer
= pktl
;
473 /* Add the packet in the buffered packet list. */
478 int avformat_queue_attached_pictures(AVFormatContext
*s
)
481 for (i
= 0; i
< s
->nb_streams
; i
++)
482 if (s
->streams
[i
]->disposition
& AV_DISPOSITION_ATTACHED_PIC
&&
483 s
->streams
[i
]->discard
< AVDISCARD_ALL
) {
484 if (s
->streams
[i
]->attached_pic
.size
<= 0) {
485 av_log(s
, AV_LOG_WARNING
,
486 "Attached picture on stream %d has invalid size, "
491 ret
= ff_packet_list_put(&s
->internal
->raw_packet_buffer
,
492 &s
->internal
->raw_packet_buffer_end
,
493 &s
->streams
[i
]->attached_pic
,
494 FF_PACKETLIST_FLAG_REF_PACKET
);
501 static int update_stream_avctx(AVFormatContext
*s
)
504 for (i
= 0; i
< s
->nb_streams
; i
++) {
505 AVStream
*st
= s
->streams
[i
];
507 if (!st
->internal
->need_context_update
)
510 /* close parser, because it depends on the codec */
511 if (st
->parser
&& st
->internal
->avctx
->codec_id
!= st
->codecpar
->codec_id
) {
512 av_parser_close(st
->parser
);
516 /* update internal codec context, for the parser */
517 ret
= avcodec_parameters_to_context(st
->internal
->avctx
, st
->codecpar
);
521 #if FF_API_LAVF_AVCTX
522 FF_DISABLE_DEPRECATION_WARNINGS
523 /* update deprecated public codec context */
524 ret
= avcodec_parameters_to_context(st
->codec
, st
->codecpar
);
527 FF_ENABLE_DEPRECATION_WARNINGS
530 st
->internal
->need_context_update
= 0;
536 int avformat_open_input(AVFormatContext
**ps
, const char *filename
,
537 ff_const59 AVInputFormat
*fmt
, AVDictionary
**options
)
539 AVFormatContext
*s
= *ps
;
541 AVDictionary
*tmp
= NULL
;
542 ID3v2ExtraMeta
*id3v2_extra_meta
= NULL
;
544 if (!s
&& !(s
= avformat_alloc_context()))
545 return AVERROR(ENOMEM
);
547 av_log(NULL
, AV_LOG_ERROR
, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
548 return AVERROR(EINVAL
);
554 av_dict_copy(&tmp
, *options
, 0);
556 if (s
->pb
) // must be before any goto fail
557 s
->flags
|= AVFMT_FLAG_CUSTOM_IO
;
559 if ((ret
= av_opt_set_dict(s
, &tmp
)) < 0)
562 if (!(s
->url
= av_strdup(filename
? filename
: ""))) {
563 ret
= AVERROR(ENOMEM
);
567 #if FF_API_FORMAT_FILENAME
568 FF_DISABLE_DEPRECATION_WARNINGS
569 av_strlcpy(s
->filename
, filename
? filename
: "", sizeof(s
->filename
));
570 FF_ENABLE_DEPRECATION_WARNINGS
572 if ((ret
= init_input(s
, filename
, &tmp
)) < 0)
574 s
->probe_score
= ret
;
576 if (!s
->protocol_whitelist
&& s
->pb
&& s
->pb
->protocol_whitelist
) {
577 s
->protocol_whitelist
= av_strdup(s
->pb
->protocol_whitelist
);
578 if (!s
->protocol_whitelist
) {
579 ret
= AVERROR(ENOMEM
);
584 if (!s
->protocol_blacklist
&& s
->pb
&& s
->pb
->protocol_blacklist
) {
585 s
->protocol_blacklist
= av_strdup(s
->pb
->protocol_blacklist
);
586 if (!s
->protocol_blacklist
) {
587 ret
= AVERROR(ENOMEM
);
592 if (s
->format_whitelist
&& av_match_list(s
->iformat
->name
, s
->format_whitelist
, ',') <= 0) {
593 av_log(s
, AV_LOG_ERROR
, "Format not on whitelist \'%s\'\n", s
->format_whitelist
);
594 ret
= AVERROR(EINVAL
);
598 avio_skip(s
->pb
, s
->skip_initial_bytes
);
600 /* Check filename in case an image number is expected. */
601 if (s
->iformat
->flags
& AVFMT_NEEDNUMBER
) {
602 if (!av_filename_number_test(filename
)) {
603 ret
= AVERROR(EINVAL
);
608 s
->duration
= s
->start_time
= AV_NOPTS_VALUE
;
610 /* Allocate private data. */
611 if (s
->iformat
->priv_data_size
> 0) {
612 if (!(s
->priv_data
= av_mallocz(s
->iformat
->priv_data_size
))) {
613 ret
= AVERROR(ENOMEM
);
616 if (s
->iformat
->priv_class
) {
617 *(const AVClass
**) s
->priv_data
= s
->iformat
->priv_class
;
618 av_opt_set_defaults(s
->priv_data
);
619 if ((ret
= av_opt_set_dict(s
->priv_data
, &tmp
)) < 0)
624 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
626 ff_id3v2_read_dict(s
->pb
, &s
->internal
->id3v2_meta
, ID3v2_DEFAULT_MAGIC
, &id3v2_extra_meta
);
629 if (!(s
->flags
&AVFMT_FLAG_PRIV_OPT
) && s
->iformat
->read_header
)
630 if ((ret
= s
->iformat
->read_header(s
)) < 0)
634 s
->metadata
= s
->internal
->id3v2_meta
;
635 s
->internal
->id3v2_meta
= NULL
;
636 } else if (s
->internal
->id3v2_meta
) {
637 av_log(s
, AV_LOG_WARNING
, "Discarding ID3 tags because more suitable tags were found.\n");
638 av_dict_free(&s
->internal
->id3v2_meta
);
641 if (id3v2_extra_meta
) {
642 if (!strcmp(s
->iformat
->name
, "mp3") || !strcmp(s
->iformat
->name
, "aac") ||
643 !strcmp(s
->iformat
->name
, "tta") || !strcmp(s
->iformat
->name
, "wav")) {
644 if ((ret
= ff_id3v2_parse_apic(s
, id3v2_extra_meta
)) < 0)
646 if ((ret
= ff_id3v2_parse_chapters(s
, id3v2_extra_meta
)) < 0)
648 if ((ret
= ff_id3v2_parse_priv(s
, id3v2_extra_meta
)) < 0)
651 av_log(s
, AV_LOG_DEBUG
, "demuxer does not support additional id3 data, skipping\n");
653 ff_id3v2_free_extra_meta(&id3v2_extra_meta
);
655 if ((ret
= avformat_queue_attached_pictures(s
)) < 0)
658 if (!(s
->flags
&AVFMT_FLAG_PRIV_OPT
) && s
->pb
&& !s
->internal
->data_offset
)
659 s
->internal
->data_offset
= avio_tell(s
->pb
);
661 s
->internal
->raw_packet_buffer_remaining_size
= RAW_PACKET_BUFFER_SIZE
;
663 update_stream_avctx(s
);
665 for (i
= 0; i
< s
->nb_streams
; i
++)
666 s
->streams
[i
]->internal
->orig_codec_id
= s
->streams
[i
]->codecpar
->codec_id
;
669 av_dict_free(options
);
676 if (s
->iformat
->read_close
)
677 s
->iformat
->read_close(s
);
679 ff_id3v2_free_extra_meta(&id3v2_extra_meta
);
681 if (s
->pb
&& !(s
->flags
& AVFMT_FLAG_CUSTOM_IO
))
683 avformat_free_context(s
);
688 /*******************************************************/
690 static void force_codec_ids(AVFormatContext
*s
, AVStream
*st
)
692 switch (st
->codecpar
->codec_type
) {
693 case AVMEDIA_TYPE_VIDEO
:
694 if (s
->video_codec_id
)
695 st
->codecpar
->codec_id
= s
->video_codec_id
;
697 case AVMEDIA_TYPE_AUDIO
:
698 if (s
->audio_codec_id
)
699 st
->codecpar
->codec_id
= s
->audio_codec_id
;
701 case AVMEDIA_TYPE_SUBTITLE
:
702 if (s
->subtitle_codec_id
)
703 st
->codecpar
->codec_id
= s
->subtitle_codec_id
;
705 case AVMEDIA_TYPE_DATA
:
706 if (s
->data_codec_id
)
707 st
->codecpar
->codec_id
= s
->data_codec_id
;
712 static int probe_codec(AVFormatContext
*s
, AVStream
*st
, const AVPacket
*pkt
)
714 if (st
->request_probe
>0) {
715 AVProbeData
*pd
= &st
->probe_data
;
717 av_log(s
, AV_LOG_DEBUG
, "probing stream %d pp:%d\n", st
->index
, st
->probe_packets
);
721 uint8_t *new_buf
= av_realloc(pd
->buf
, pd
->buf_size
+pkt
->size
+AVPROBE_PADDING_SIZE
);
723 av_log(s
, AV_LOG_WARNING
,
724 "Failed to reallocate probe buffer for stream %d\n",
729 memcpy(pd
->buf
+ pd
->buf_size
, pkt
->data
, pkt
->size
);
730 pd
->buf_size
+= pkt
->size
;
731 memset(pd
->buf
+ pd
->buf_size
, 0, AVPROBE_PADDING_SIZE
);
734 st
->probe_packets
= 0;
736 av_log(s
, AV_LOG_WARNING
,
737 "nothing to probe for stream %d\n", st
->index
);
741 end
= s
->internal
->raw_packet_buffer_remaining_size
<= 0
742 || st
->probe_packets
<= 0;
744 if (end
|| av_log2(pd
->buf_size
) != av_log2(pd
->buf_size
- pkt
->size
)) {
745 int score
= set_codec_from_probe_data(s
, st
, pd
);
746 if ( (st
->codecpar
->codec_id
!= AV_CODEC_ID_NONE
&& score
> AVPROBE_SCORE_STREAM_RETRY
)
750 st
->request_probe
= -1;
751 if (st
->codecpar
->codec_id
!= AV_CODEC_ID_NONE
) {
752 av_log(s
, AV_LOG_DEBUG
, "probed stream %d\n", st
->index
);
754 av_log(s
, AV_LOG_WARNING
, "probed stream %d failed\n", st
->index
);
756 force_codec_ids(s
, st
);
762 static int update_wrap_reference(AVFormatContext
*s
, AVStream
*st
, int stream_index
, AVPacket
*pkt
)
764 int64_t ref
= pkt
->dts
;
765 int i
, pts_wrap_behavior
;
766 int64_t pts_wrap_reference
;
767 AVProgram
*first_program
;
769 if (ref
== AV_NOPTS_VALUE
)
771 if (st
->pts_wrap_reference
!= AV_NOPTS_VALUE
|| st
->pts_wrap_bits
>= 63 || ref
== AV_NOPTS_VALUE
|| !s
->correct_ts_overflow
)
773 ref
&= (1LL << st
->pts_wrap_bits
)-1;
775 // reference time stamp should be 60 s before first time stamp
776 pts_wrap_reference
= ref
- av_rescale(60, st
->time_base
.den
, st
->time_base
.num
);
777 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
778 pts_wrap_behavior
= (ref
< (1LL << st
->pts_wrap_bits
) - (1LL << st
->pts_wrap_bits
-3)) ||
779 (ref
< (1LL << st
->pts_wrap_bits
) - av_rescale(60, st
->time_base
.den
, st
->time_base
.num
)) ?
780 AV_PTS_WRAP_ADD_OFFSET
: AV_PTS_WRAP_SUB_OFFSET
;
782 first_program
= av_find_program_from_stream(s
, NULL
, stream_index
);
784 if (!first_program
) {
785 int default_stream_index
= av_find_default_stream_index(s
);
786 if (s
->streams
[default_stream_index
]->pts_wrap_reference
== AV_NOPTS_VALUE
) {
787 for (i
= 0; i
< s
->nb_streams
; i
++) {
788 if (av_find_program_from_stream(s
, NULL
, i
))
790 s
->streams
[i
]->pts_wrap_reference
= pts_wrap_reference
;
791 s
->streams
[i
]->pts_wrap_behavior
= pts_wrap_behavior
;
795 st
->pts_wrap_reference
= s
->streams
[default_stream_index
]->pts_wrap_reference
;
796 st
->pts_wrap_behavior
= s
->streams
[default_stream_index
]->pts_wrap_behavior
;
800 AVProgram
*program
= first_program
;
802 if (program
->pts_wrap_reference
!= AV_NOPTS_VALUE
) {
803 pts_wrap_reference
= program
->pts_wrap_reference
;
804 pts_wrap_behavior
= program
->pts_wrap_behavior
;
807 program
= av_find_program_from_stream(s
, program
, stream_index
);
810 // update every program with differing pts_wrap_reference
811 program
= first_program
;
813 if (program
->pts_wrap_reference
!= pts_wrap_reference
) {
814 for (i
= 0; i
<program
->nb_stream_indexes
; i
++) {
815 s
->streams
[program
->stream_index
[i
]]->pts_wrap_reference
= pts_wrap_reference
;
816 s
->streams
[program
->stream_index
[i
]]->pts_wrap_behavior
= pts_wrap_behavior
;
819 program
->pts_wrap_reference
= pts_wrap_reference
;
820 program
->pts_wrap_behavior
= pts_wrap_behavior
;
822 program
= av_find_program_from_stream(s
, program
, stream_index
);
828 int ff_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
838 AVPacketList
*pktl
= s
->internal
->raw_packet_buffer
;
839 const AVPacket
*pkt1
;
842 st
= s
->streams
[pktl
->pkt
.stream_index
];
843 if (s
->internal
->raw_packet_buffer_remaining_size
<= 0)
844 if ((err
= probe_codec(s
, st
, NULL
)) < 0)
846 if (st
->request_probe
<= 0) {
847 ff_packet_list_get(&s
->internal
->raw_packet_buffer
,
848 &s
->internal
->raw_packet_buffer_end
, pkt
);
849 s
->internal
->raw_packet_buffer_remaining_size
+= pkt
->size
;
854 ret
= s
->iformat
->read_packet(s
, pkt
);
856 av_packet_unref(pkt
);
858 /* Some demuxers return FFERROR_REDO when they consume
859 data and discard it (ignored streams, junk, extradata).
860 We must re-call the demuxer to get the real packet. */
861 if (ret
== FFERROR_REDO
)
863 if (!pktl
|| ret
== AVERROR(EAGAIN
))
865 for (i
= 0; i
< s
->nb_streams
; i
++) {
867 if (st
->probe_packets
|| st
->request_probe
> 0)
868 if ((err
= probe_codec(s
, st
, NULL
)) < 0)
870 av_assert0(st
->request_probe
<= 0);
875 err
= av_packet_make_refcounted(pkt
);
877 av_packet_unref(pkt
);
881 if (pkt
->flags
& AV_PKT_FLAG_CORRUPT
) {
882 av_log(s
, AV_LOG_WARNING
,
883 "Packet corrupt (stream = %d, dts = %s)",
884 pkt
->stream_index
, av_ts2str(pkt
->dts
));
885 if (s
->flags
& AVFMT_FLAG_DISCARD_CORRUPT
) {
886 av_log(s
, AV_LOG_WARNING
, ", dropping it.\n");
887 av_packet_unref(pkt
);
890 av_log(s
, AV_LOG_WARNING
, ".\n");
893 av_assert0(pkt
->stream_index
< (unsigned)s
->nb_streams
&&
894 "Invalid stream index.\n");
896 st
= s
->streams
[pkt
->stream_index
];
898 if (update_wrap_reference(s
, st
, pkt
->stream_index
, pkt
) && st
->pts_wrap_behavior
== AV_PTS_WRAP_SUB_OFFSET
) {
899 // correct first time stamps to negative values
900 if (!is_relative(st
->first_dts
))
901 st
->first_dts
= wrap_timestamp(st
, st
->first_dts
);
902 if (!is_relative(st
->start_time
))
903 st
->start_time
= wrap_timestamp(st
, st
->start_time
);
904 if (!is_relative(st
->cur_dts
))
905 st
->cur_dts
= wrap_timestamp(st
, st
->cur_dts
);
908 pkt
->dts
= wrap_timestamp(st
, pkt
->dts
);
909 pkt
->pts
= wrap_timestamp(st
, pkt
->pts
);
911 force_codec_ids(s
, st
);
913 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
914 if (s
->use_wallclock_as_timestamps
)
915 pkt
->dts
= pkt
->pts
= av_rescale_q(av_gettime(), AV_TIME_BASE_Q
, st
->time_base
);
917 if (!pktl
&& st
->request_probe
<= 0)
920 err
= ff_packet_list_put(&s
->internal
->raw_packet_buffer
,
921 &s
->internal
->raw_packet_buffer_end
,
924 av_packet_unref(pkt
);
927 pkt1
= &s
->internal
->raw_packet_buffer_end
->pkt
;
928 s
->internal
->raw_packet_buffer_remaining_size
-= pkt1
->size
;
930 if ((err
= probe_codec(s
, st
, pkt1
)) < 0)
936 /**********************************************************/
938 static int determinable_frame_size(AVCodecContext
*avctx
)
940 switch(avctx
->codec_id
) {
941 case AV_CODEC_ID_MP1
:
942 case AV_CODEC_ID_MP2
:
943 case AV_CODEC_ID_MP3
:
944 case AV_CODEC_ID_CODEC2
:
952 * Return the frame duration in seconds. Return 0 if not available.
954 void ff_compute_frame_duration(AVFormatContext
*s
, int *pnum
, int *pden
, AVStream
*st
,
955 AVCodecParserContext
*pc
, AVPacket
*pkt
)
957 AVRational codec_framerate
= s
->iformat
? st
->internal
->avctx
->framerate
:
958 av_mul_q(av_inv_q(st
->internal
->avctx
->time_base
), (AVRational
){1, st
->internal
->avctx
->ticks_per_frame
});
959 int frame_size
, sample_rate
;
961 #if FF_API_LAVF_AVCTX
962 FF_DISABLE_DEPRECATION_WARNINGS
963 if ((!codec_framerate
.den
|| !codec_framerate
.num
) && st
->codec
->time_base
.den
&& st
->codec
->time_base
.num
)
964 codec_framerate
= av_mul_q(av_inv_q(st
->codec
->time_base
), (AVRational
){1, st
->codec
->ticks_per_frame
});
965 FF_ENABLE_DEPRECATION_WARNINGS
970 switch (st
->codecpar
->codec_type
) {
971 case AVMEDIA_TYPE_VIDEO
:
972 if (st
->r_frame_rate
.num
&& !pc
&& s
->iformat
) {
973 *pnum
= st
->r_frame_rate
.den
;
974 *pden
= st
->r_frame_rate
.num
;
975 } else if (st
->time_base
.num
* 1000LL > st
->time_base
.den
) {
976 *pnum
= st
->time_base
.num
;
977 *pden
= st
->time_base
.den
;
978 } else if (codec_framerate
.den
* 1000LL > codec_framerate
.num
) {
979 av_assert0(st
->internal
->avctx
->ticks_per_frame
);
980 av_reduce(pnum
, pden
,
982 codec_framerate
.num
* (int64_t)st
->internal
->avctx
->ticks_per_frame
,
985 if (pc
&& pc
->repeat_pict
) {
986 av_assert0(s
->iformat
); // this may be wrong for interlaced encoding but its not used for that case
987 av_reduce(pnum
, pden
,
988 (*pnum
) * (1LL + pc
->repeat_pict
),
992 /* If this codec can be interlaced or progressive then we need
993 * a parser to compute duration of a packet. Thus if we have
994 * no parser in such case leave duration undefined. */
995 if (st
->internal
->avctx
->ticks_per_frame
> 1 && !pc
)
999 case AVMEDIA_TYPE_AUDIO
:
1000 if (st
->internal
->avctx_inited
) {
1001 frame_size
= av_get_audio_frame_duration(st
->internal
->avctx
, pkt
->size
);
1002 sample_rate
= st
->internal
->avctx
->sample_rate
;
1004 frame_size
= av_get_audio_frame_duration2(st
->codecpar
, pkt
->size
);
1005 sample_rate
= st
->codecpar
->sample_rate
;
1007 if (frame_size
<= 0 || sample_rate
<= 0)
1010 *pden
= sample_rate
;
1017 int ff_is_intra_only(enum AVCodecID id
)
1019 const AVCodecDescriptor
*d
= avcodec_descriptor_get(id
);
1022 if ((d
->type
== AVMEDIA_TYPE_VIDEO
|| d
->type
== AVMEDIA_TYPE_AUDIO
) &&
1023 !(d
->props
& AV_CODEC_PROP_INTRA_ONLY
))
1028 static int has_decode_delay_been_guessed(AVStream
*st
)
1030 if (st
->codecpar
->codec_id
!= AV_CODEC_ID_H264
) return 1;
1031 if (!st
->info
) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
1033 #if CONFIG_H264_DECODER
1034 if (st
->internal
->avctx
->has_b_frames
&&
1035 avpriv_h264_has_num_reorder_frames(st
->internal
->avctx
) == st
->internal
->avctx
->has_b_frames
)
1038 if (st
->internal
->avctx
->has_b_frames
<3)
1039 return st
->nb_decoded_frames
>= 7;
1040 else if (st
->internal
->avctx
->has_b_frames
<4)
1041 return st
->nb_decoded_frames
>= 18;
1043 return st
->nb_decoded_frames
>= 20;
1046 static AVPacketList
*get_next_pkt(AVFormatContext
*s
, AVStream
*st
, AVPacketList
*pktl
)
1050 if (pktl
== s
->internal
->packet_buffer_end
)
1051 return s
->internal
->parse_queue
;
1055 static int64_t select_from_pts_buffer(AVStream
*st
, int64_t *pts_buffer
, int64_t dts
) {
1056 int onein_oneout
= st
->codecpar
->codec_id
!= AV_CODEC_ID_H264
&&
1057 st
->codecpar
->codec_id
!= AV_CODEC_ID_HEVC
;
1060 int delay
= st
->internal
->avctx
->has_b_frames
;
1063 if (dts
== AV_NOPTS_VALUE
) {
1064 int64_t best_score
= INT64_MAX
;
1065 for (i
= 0; i
<delay
; i
++) {
1066 if (st
->pts_reorder_error_count
[i
]) {
1067 int64_t score
= st
->pts_reorder_error
[i
] / st
->pts_reorder_error_count
[i
];
1068 if (score
< best_score
) {
1070 dts
= pts_buffer
[i
];
1075 for (i
= 0; i
<delay
; i
++) {
1076 if (pts_buffer
[i
] != AV_NOPTS_VALUE
) {
1077 int64_t diff
= FFABS(pts_buffer
[i
] - dts
)
1078 + (uint64_t)st
->pts_reorder_error
[i
];
1079 diff
= FFMAX(diff
, st
->pts_reorder_error
[i
]);
1080 st
->pts_reorder_error
[i
] = diff
;
1081 st
->pts_reorder_error_count
[i
]++;
1082 if (st
->pts_reorder_error_count
[i
] > 250) {
1083 st
->pts_reorder_error
[i
] >>= 1;
1084 st
->pts_reorder_error_count
[i
] >>= 1;
1091 if (dts
== AV_NOPTS_VALUE
)
1092 dts
= pts_buffer
[0];
1098 * Updates the dts of packets of a stream in pkt_buffer, by re-ordering the pts
1099 * of the packets in a window.
1101 static void update_dts_from_pts(AVFormatContext
*s
, int stream_index
,
1102 AVPacketList
*pkt_buffer
)
1104 AVStream
*st
= s
->streams
[stream_index
];
1105 int delay
= st
->internal
->avctx
->has_b_frames
;
1108 int64_t pts_buffer
[MAX_REORDER_DELAY
+1];
1110 for (i
= 0; i
<MAX_REORDER_DELAY
+1; i
++)
1111 pts_buffer
[i
] = AV_NOPTS_VALUE
;
1113 for (; pkt_buffer
; pkt_buffer
= get_next_pkt(s
, st
, pkt_buffer
)) {
1114 if (pkt_buffer
->pkt
.stream_index
!= stream_index
)
1117 if (pkt_buffer
->pkt
.pts
!= AV_NOPTS_VALUE
&& delay
<= MAX_REORDER_DELAY
) {
1118 pts_buffer
[0] = pkt_buffer
->pkt
.pts
;
1119 for (i
= 0; i
<delay
&& pts_buffer
[i
] > pts_buffer
[i
+ 1]; i
++)
1120 FFSWAP(int64_t, pts_buffer
[i
], pts_buffer
[i
+ 1]);
1122 pkt_buffer
->pkt
.dts
= select_from_pts_buffer(st
, pts_buffer
, pkt_buffer
->pkt
.dts
);
1127 static void update_initial_timestamps(AVFormatContext
*s
, int stream_index
,
1128 int64_t dts
, int64_t pts
, AVPacket
*pkt
)
1130 AVStream
*st
= s
->streams
[stream_index
];
1131 AVPacketList
*pktl
= s
->internal
->packet_buffer
? s
->internal
->packet_buffer
: s
->internal
->parse_queue
;
1132 AVPacketList
*pktl_it
;
1136 if (st
->first_dts
!= AV_NOPTS_VALUE
||
1137 dts
== AV_NOPTS_VALUE
||
1138 st
->cur_dts
== AV_NOPTS_VALUE
||
1139 st
->cur_dts
< INT_MIN
+ RELATIVE_TS_BASE
||
1140 dts
< INT_MIN
+ (st
->cur_dts
- RELATIVE_TS_BASE
) ||
1144 st
->first_dts
= dts
- (st
->cur_dts
- RELATIVE_TS_BASE
);
1146 shift
= (uint64_t)st
->first_dts
- RELATIVE_TS_BASE
;
1148 if (is_relative(pts
))
1151 for (pktl_it
= pktl
; pktl_it
; pktl_it
= get_next_pkt(s
, st
, pktl_it
)) {
1152 if (pktl_it
->pkt
.stream_index
!= stream_index
)
1154 if (is_relative(pktl_it
->pkt
.pts
))
1155 pktl_it
->pkt
.pts
+= shift
;
1157 if (is_relative(pktl_it
->pkt
.dts
))
1158 pktl_it
->pkt
.dts
+= shift
;
1160 if (st
->start_time
== AV_NOPTS_VALUE
&& pktl_it
->pkt
.pts
!= AV_NOPTS_VALUE
) {
1161 st
->start_time
= pktl_it
->pkt
.pts
;
1162 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_AUDIO
&& st
->codecpar
->sample_rate
)
1163 st
->start_time
= av_sat_add64(st
->start_time
, av_rescale_q(st
->skip_samples
, (AVRational
){1, st
->codecpar
->sample_rate
}, st
->time_base
));
1167 if (has_decode_delay_been_guessed(st
)) {
1168 update_dts_from_pts(s
, stream_index
, pktl
);
1171 if (st
->start_time
== AV_NOPTS_VALUE
) {
1172 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_AUDIO
|| !(pkt
->flags
& AV_PKT_FLAG_DISCARD
)) {
1173 st
->start_time
= pts
;
1175 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_AUDIO
&& st
->codecpar
->sample_rate
)
1176 st
->start_time
= av_sat_add64(st
->start_time
, av_rescale_q(st
->skip_samples
, (AVRational
){1, st
->codecpar
->sample_rate
}, st
->time_base
));
1180 static void update_initial_durations(AVFormatContext
*s
, AVStream
*st
,
1181 int stream_index
, int64_t duration
)
1183 AVPacketList
*pktl
= s
->internal
->packet_buffer
? s
->internal
->packet_buffer
: s
->internal
->parse_queue
;
1184 int64_t cur_dts
= RELATIVE_TS_BASE
;
1186 if (st
->first_dts
!= AV_NOPTS_VALUE
) {
1187 if (st
->update_initial_durations_done
)
1189 st
->update_initial_durations_done
= 1;
1190 cur_dts
= st
->first_dts
;
1191 for (; pktl
; pktl
= get_next_pkt(s
, st
, pktl
)) {
1192 if (pktl
->pkt
.stream_index
== stream_index
) {
1193 if (pktl
->pkt
.pts
!= pktl
->pkt
.dts
||
1194 pktl
->pkt
.dts
!= AV_NOPTS_VALUE
||
1197 cur_dts
-= duration
;
1200 if (pktl
&& pktl
->pkt
.dts
!= st
->first_dts
) {
1201 av_log(s
, AV_LOG_DEBUG
, "first_dts %s not matching first dts %s (pts %s, duration %"PRId64
") in the queue\n",
1202 av_ts2str(st
->first_dts
), av_ts2str(pktl
->pkt
.dts
), av_ts2str(pktl
->pkt
.pts
), pktl
->pkt
.duration
);
1206 av_log(s
, AV_LOG_DEBUG
, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st
->first_dts
));
1209 pktl
= s
->internal
->packet_buffer
? s
->internal
->packet_buffer
: s
->internal
->parse_queue
;
1210 st
->first_dts
= cur_dts
;
1211 } else if (st
->cur_dts
!= RELATIVE_TS_BASE
)
1214 for (; pktl
; pktl
= get_next_pkt(s
, st
, pktl
)) {
1215 if (pktl
->pkt
.stream_index
!= stream_index
)
1217 if ((pktl
->pkt
.pts
== pktl
->pkt
.dts
||
1218 pktl
->pkt
.pts
== AV_NOPTS_VALUE
) &&
1219 (pktl
->pkt
.dts
== AV_NOPTS_VALUE
||
1220 pktl
->pkt
.dts
== st
->first_dts
||
1221 pktl
->pkt
.dts
== RELATIVE_TS_BASE
) &&
1222 !pktl
->pkt
.duration
&&
1223 av_sat_add64(cur_dts
, duration
) == cur_dts
+ (uint64_t)duration
1225 pktl
->pkt
.dts
= cur_dts
;
1226 if (!st
->internal
->avctx
->has_b_frames
)
1227 pktl
->pkt
.pts
= cur_dts
;
1228 // if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
1229 pktl
->pkt
.duration
= duration
;
1232 cur_dts
= pktl
->pkt
.dts
+ pktl
->pkt
.duration
;
1235 st
->cur_dts
= cur_dts
;
1238 static void compute_pkt_fields(AVFormatContext
*s
, AVStream
*st
,
1239 AVCodecParserContext
*pc
, AVPacket
*pkt
,
1240 int64_t next_dts
, int64_t next_pts
)
1242 int num
, den
, presentation_delayed
, delay
, i
;
1244 AVRational duration
;
1245 int onein_oneout
= st
->codecpar
->codec_id
!= AV_CODEC_ID_H264
&&
1246 st
->codecpar
->codec_id
!= AV_CODEC_ID_HEVC
;
1248 if (s
->flags
& AVFMT_FLAG_NOFILLIN
)
1251 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
&& pkt
->dts
!= AV_NOPTS_VALUE
) {
1252 if (pkt
->dts
== pkt
->pts
&& st
->last_dts_for_order_check
!= AV_NOPTS_VALUE
) {
1253 if (st
->last_dts_for_order_check
<= pkt
->dts
) {
1256 av_log(s
, st
->dts_misordered
? AV_LOG_DEBUG
: AV_LOG_WARNING
,
1257 "DTS %"PRIi64
" < %"PRIi64
" out of order\n",
1259 st
->last_dts_for_order_check
);
1260 st
->dts_misordered
++;
1262 if (st
->dts_ordered
+ st
->dts_misordered
> 250) {
1263 st
->dts_ordered
>>= 1;
1264 st
->dts_misordered
>>= 1;
1268 st
->last_dts_for_order_check
= pkt
->dts
;
1269 if (st
->dts_ordered
< 8*st
->dts_misordered
&& pkt
->dts
== pkt
->pts
)
1270 pkt
->dts
= AV_NOPTS_VALUE
;
1273 if ((s
->flags
& AVFMT_FLAG_IGNDTS
) && pkt
->pts
!= AV_NOPTS_VALUE
)
1274 pkt
->dts
= AV_NOPTS_VALUE
;
1276 if (pc
&& pc
->pict_type
== AV_PICTURE_TYPE_B
1277 && !st
->internal
->avctx
->has_b_frames
)
1278 //FIXME Set low_delay = 0 when has_b_frames = 1
1279 st
->internal
->avctx
->has_b_frames
= 1;
1281 /* do we have a video B-frame ? */
1282 delay
= st
->internal
->avctx
->has_b_frames
;
1283 presentation_delayed
= 0;
1285 /* XXX: need has_b_frame, but cannot get it if the codec is
1286 * not initialized */
1288 pc
&& pc
->pict_type
!= AV_PICTURE_TYPE_B
)
1289 presentation_delayed
= 1;
1291 if (pkt
->pts
!= AV_NOPTS_VALUE
&& pkt
->dts
!= AV_NOPTS_VALUE
&&
1292 st
->pts_wrap_bits
< 63 && pkt
->dts
> INT64_MIN
+ (1LL << st
->pts_wrap_bits
) &&
1293 pkt
->dts
- (1LL << (st
->pts_wrap_bits
- 1)) > pkt
->pts
) {
1294 if (is_relative(st
->cur_dts
) || pkt
->dts
- (1LL<<(st
->pts_wrap_bits
- 1)) > st
->cur_dts
) {
1295 pkt
->dts
-= 1LL << st
->pts_wrap_bits
;
1297 pkt
->pts
+= 1LL << st
->pts_wrap_bits
;
1300 /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1301 * We take the conservative approach and discard both.
1302 * Note: If this is misbehaving for an H.264 file, then possibly
1303 * presentation_delayed is not set correctly. */
1304 if (delay
== 1 && pkt
->dts
== pkt
->pts
&&
1305 pkt
->dts
!= AV_NOPTS_VALUE
&& presentation_delayed
) {
1306 av_log(s
, AV_LOG_DEBUG
, "invalid dts/pts combination %"PRIi64
"\n", pkt
->dts
);
1307 if ( strcmp(s
->iformat
->name
, "mov,mp4,m4a,3gp,3g2,mj2")
1308 && strcmp(s
->iformat
->name
, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1309 pkt
->dts
= AV_NOPTS_VALUE
;
1312 duration
= av_mul_q((AVRational
) {pkt
->duration
, 1}, st
->time_base
);
1313 if (pkt
->duration
<= 0) {
1314 ff_compute_frame_duration(s
, &num
, &den
, st
, pc
, pkt
);
1316 duration
= (AVRational
) {num
, den
};
1317 pkt
->duration
= av_rescale_rnd(1,
1318 num
* (int64_t) st
->time_base
.den
,
1319 den
* (int64_t) st
->time_base
.num
,
1324 if (pkt
->duration
> 0 && (s
->internal
->packet_buffer
|| s
->internal
->parse_queue
))
1325 update_initial_durations(s
, st
, pkt
->stream_index
, pkt
->duration
);
1327 /* Correct timestamps with byte offset if demuxers only have timestamps
1328 * on packet boundaries */
1329 if (pc
&& st
->need_parsing
== AVSTREAM_PARSE_TIMESTAMPS
&& pkt
->size
) {
1330 /* this will estimate bitrate based on this frame's duration and size */
1331 offset
= av_rescale(pc
->offset
, pkt
->duration
, pkt
->size
);
1332 if (pkt
->pts
!= AV_NOPTS_VALUE
)
1334 if (pkt
->dts
!= AV_NOPTS_VALUE
)
1338 /* This may be redundant, but it should not hurt. */
1339 if (pkt
->dts
!= AV_NOPTS_VALUE
&&
1340 pkt
->pts
!= AV_NOPTS_VALUE
&&
1341 pkt
->pts
> pkt
->dts
)
1342 presentation_delayed
= 1;
1344 if (s
->debug
& FF_FDEBUG_TS
)
1345 av_log(s
, AV_LOG_DEBUG
,
1346 "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%"PRId64
" delay:%d onein_oneout:%d\n",
1347 presentation_delayed
, av_ts2str(pkt
->pts
), av_ts2str(pkt
->dts
), av_ts2str(st
->cur_dts
),
1348 pkt
->stream_index
, pc
, pkt
->duration
, delay
, onein_oneout
);
1350 /* Interpolate PTS and DTS if they are not present. We skip H264
1351 * currently because delay and has_b_frames are not reliably set. */
1352 if ((delay
== 0 || (delay
== 1 && pc
)) &&
1354 if (presentation_delayed
) {
1355 /* DTS = decompression timestamp */
1356 /* PTS = presentation timestamp */
1357 if (pkt
->dts
== AV_NOPTS_VALUE
)
1358 pkt
->dts
= st
->last_IP_pts
;
1359 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
, pkt
);
1360 if (pkt
->dts
== AV_NOPTS_VALUE
)
1361 pkt
->dts
= st
->cur_dts
;
1363 /* This is tricky: the dts must be incremented by the duration
1364 * of the frame we are displaying, i.e. the last I- or P-frame. */
1365 if (st
->last_IP_duration
== 0 && (uint64_t)pkt
->duration
<= INT32_MAX
)
1366 st
->last_IP_duration
= pkt
->duration
;
1367 if (pkt
->dts
!= AV_NOPTS_VALUE
)
1368 st
->cur_dts
= av_sat_add64(pkt
->dts
, st
->last_IP_duration
);
1369 if (pkt
->dts
!= AV_NOPTS_VALUE
&&
1370 pkt
->pts
== AV_NOPTS_VALUE
&&
1371 st
->last_IP_duration
> 0 &&
1372 ((uint64_t)st
->cur_dts
- (uint64_t)next_dts
+ 1) <= 2 &&
1373 next_dts
!= next_pts
&&
1374 next_pts
!= AV_NOPTS_VALUE
)
1375 pkt
->pts
= next_dts
;
1377 if ((uint64_t)pkt
->duration
<= INT32_MAX
)
1378 st
->last_IP_duration
= pkt
->duration
;
1379 st
->last_IP_pts
= pkt
->pts
;
1380 /* Cannot compute PTS if not present (we can compute it only
1381 * by knowing the future. */
1382 } else if (pkt
->pts
!= AV_NOPTS_VALUE
||
1383 pkt
->dts
!= AV_NOPTS_VALUE
||
1384 pkt
->duration
> 0 ) {
1386 /* presentation is not delayed : PTS and DTS are the same */
1387 if (pkt
->pts
== AV_NOPTS_VALUE
)
1388 pkt
->pts
= pkt
->dts
;
1389 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->pts
,
1391 if (pkt
->pts
== AV_NOPTS_VALUE
)
1392 pkt
->pts
= st
->cur_dts
;
1393 pkt
->dts
= pkt
->pts
;
1394 if (pkt
->pts
!= AV_NOPTS_VALUE
&& duration
.num
>= 0)
1395 st
->cur_dts
= av_add_stable(st
->time_base
, pkt
->pts
, duration
, 1);
1399 if (pkt
->pts
!= AV_NOPTS_VALUE
&& delay
<= MAX_REORDER_DELAY
) {
1400 st
->pts_buffer
[0] = pkt
->pts
;
1401 for (i
= 0; i
<delay
&& st
->pts_buffer
[i
] > st
->pts_buffer
[i
+ 1]; i
++)
1402 FFSWAP(int64_t, st
->pts_buffer
[i
], st
->pts_buffer
[i
+ 1]);
1404 if(has_decode_delay_been_guessed(st
))
1405 pkt
->dts
= select_from_pts_buffer(st
, st
->pts_buffer
, pkt
->dts
);
1407 // We skipped it above so we try here.
1409 // This should happen on the first packet
1410 update_initial_timestamps(s
, pkt
->stream_index
, pkt
->dts
, pkt
->pts
, pkt
);
1411 if (pkt
->dts
> st
->cur_dts
)
1412 st
->cur_dts
= pkt
->dts
;
1414 if (s
->debug
& FF_FDEBUG_TS
)
1415 av_log(s
, AV_LOG_DEBUG
, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s st:%d (%d)\n",
1416 presentation_delayed
, delay
, av_ts2str(pkt
->pts
), av_ts2str(pkt
->dts
), av_ts2str(st
->cur_dts
), st
->index
, st
->id
);
1419 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_DATA
|| ff_is_intra_only(st
->codecpar
->codec_id
))
1420 pkt
->flags
|= AV_PKT_FLAG_KEY
;
1421 #if FF_API_CONVERGENCE_DURATION
1422 FF_DISABLE_DEPRECATION_WARNINGS
1424 pkt
->convergence_duration
= pc
->convergence_duration
;
1425 FF_ENABLE_DEPRECATION_WARNINGS
1429 void ff_packet_list_free(AVPacketList
**pkt_buf
, AVPacketList
**pkt_buf_end
)
1431 AVPacketList
*tmp
= *pkt_buf
;
1434 AVPacketList
*pktl
= tmp
;
1436 av_packet_unref(&pktl
->pkt
);
1440 *pkt_buf_end
= NULL
;
1444 * Parse a packet, add all split parts to parse_queue.
1446 * @param pkt Packet to parse; must not be NULL.
1447 * @param flush Indicates whether to flush. If set, pkt must be blank.
1449 static int parse_packet(AVFormatContext
*s
, AVPacket
*pkt
,
1450 int stream_index
, int flush
)
1453 AVStream
*st
= s
->streams
[stream_index
];
1454 uint8_t *data
= pkt
->data
;
1455 int size
= pkt
->size
;
1456 int ret
= 0, got_output
= flush
;
1458 if (size
|| flush
) {
1459 av_init_packet(&out_pkt
);
1460 } else if (st
->parser
->flags
& PARSER_FLAG_COMPLETE_FRAMES
) {
1461 // preserve 0-size sync packets
1462 compute_pkt_fields(s
, st
, st
->parser
, pkt
, AV_NOPTS_VALUE
, AV_NOPTS_VALUE
);
1465 while (size
> 0 || (flush
&& got_output
)) {
1467 int64_t next_pts
= pkt
->pts
;
1468 int64_t next_dts
= pkt
->dts
;
1470 len
= av_parser_parse2(st
->parser
, st
->internal
->avctx
,
1471 &out_pkt
.data
, &out_pkt
.size
, data
, size
,
1472 pkt
->pts
, pkt
->dts
, pkt
->pos
);
1474 pkt
->pts
= pkt
->dts
= AV_NOPTS_VALUE
;
1476 /* increment read pointer */
1477 av_assert1(data
|| !len
);
1478 data
= len
? data
+ len
: data
;
1481 got_output
= !!out_pkt
.size
;
1486 if (pkt
->buf
&& out_pkt
.data
== pkt
->data
) {
1487 /* reference pkt->buf only when out_pkt.data is guaranteed to point
1488 * to data in it and not in the parser's internal buffer. */
1489 /* XXX: Ensure this is the case with all parsers when st->parser->flags
1490 * is PARSER_FLAG_COMPLETE_FRAMES and check for that instead? */
1491 out_pkt
.buf
= av_buffer_ref(pkt
->buf
);
1493 ret
= AVERROR(ENOMEM
);
1497 ret
= av_packet_make_refcounted(&out_pkt
);
1502 if (pkt
->side_data
) {
1503 out_pkt
.side_data
= pkt
->side_data
;
1504 out_pkt
.side_data_elems
= pkt
->side_data_elems
;
1505 pkt
->side_data
= NULL
;
1506 pkt
->side_data_elems
= 0;
1509 /* set the duration */
1510 out_pkt
.duration
= (st
->parser
->flags
& PARSER_FLAG_COMPLETE_FRAMES
) ? pkt
->duration
: 0;
1511 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_AUDIO
) {
1512 if (st
->internal
->avctx
->sample_rate
> 0) {
1514 av_rescale_q_rnd(st
->parser
->duration
,
1515 (AVRational
) { 1, st
->internal
->avctx
->sample_rate
},
1521 out_pkt
.stream_index
= st
->index
;
1522 out_pkt
.pts
= st
->parser
->pts
;
1523 out_pkt
.dts
= st
->parser
->dts
;
1524 out_pkt
.pos
= st
->parser
->pos
;
1525 out_pkt
.flags
|= pkt
->flags
& AV_PKT_FLAG_DISCARD
;
1527 if (st
->need_parsing
== AVSTREAM_PARSE_FULL_RAW
)
1528 out_pkt
.pos
= st
->parser
->frame_offset
;
1530 if (st
->parser
->key_frame
== 1 ||
1531 (st
->parser
->key_frame
== -1 &&
1532 st
->parser
->pict_type
== AV_PICTURE_TYPE_I
))
1533 out_pkt
.flags
|= AV_PKT_FLAG_KEY
;
1535 if (st
->parser
->key_frame
== -1 && st
->parser
->pict_type
==AV_PICTURE_TYPE_NONE
&& (pkt
->flags
&AV_PKT_FLAG_KEY
))
1536 out_pkt
.flags
|= AV_PKT_FLAG_KEY
;
1538 compute_pkt_fields(s
, st
, st
->parser
, &out_pkt
, next_dts
, next_pts
);
1540 ret
= ff_packet_list_put(&s
->internal
->parse_queue
,
1541 &s
->internal
->parse_queue_end
,
1544 av_packet_unref(&out_pkt
);
1549 /* end of the stream => close and free the parser */
1551 av_parser_close(st
->parser
);
1556 av_packet_unref(pkt
);
1560 int ff_packet_list_get(AVPacketList
**pkt_buffer
,
1561 AVPacketList
**pkt_buffer_end
,
1565 av_assert0(*pkt_buffer
);
1568 *pkt_buffer
= pktl
->next
;
1570 *pkt_buffer_end
= NULL
;
1575 static int64_t ts_to_samples(AVStream
*st
, int64_t ts
)
1577 return av_rescale(ts
, st
->time_base
.num
* st
->codecpar
->sample_rate
, st
->time_base
.den
);
1580 static int read_frame_internal(AVFormatContext
*s
, AVPacket
*pkt
)
1582 int ret
, i
, got_packet
= 0;
1583 AVDictionary
*metadata
= NULL
;
1585 while (!got_packet
&& !s
->internal
->parse_queue
) {
1588 /* read next packet */
1589 ret
= ff_read_packet(s
, pkt
);
1591 if (ret
== AVERROR(EAGAIN
))
1593 /* flush the parsers */
1594 for (i
= 0; i
< s
->nb_streams
; i
++) {
1596 if (st
->parser
&& st
->need_parsing
)
1597 parse_packet(s
, pkt
, st
->index
, 1);
1599 /* all remaining packets are now in parse_queue =>
1600 * really terminate parsing */
1604 st
= s
->streams
[pkt
->stream_index
];
1606 /* update context if required */
1607 if (st
->internal
->need_context_update
) {
1608 if (avcodec_is_open(st
->internal
->avctx
)) {
1609 av_log(s
, AV_LOG_DEBUG
, "Demuxer context update while decoder is open, closing and trying to re-open\n");
1610 avcodec_close(st
->internal
->avctx
);
1611 st
->info
->found_decoder
= 0;
1614 /* close parser, because it depends on the codec */
1615 if (st
->parser
&& st
->internal
->avctx
->codec_id
!= st
->codecpar
->codec_id
) {
1616 av_parser_close(st
->parser
);
1620 ret
= avcodec_parameters_to_context(st
->internal
->avctx
, st
->codecpar
);
1622 av_packet_unref(pkt
);
1626 #if FF_API_LAVF_AVCTX
1627 FF_DISABLE_DEPRECATION_WARNINGS
1628 /* update deprecated public codec context */
1629 ret
= avcodec_parameters_to_context(st
->codec
, st
->codecpar
);
1631 av_packet_unref(pkt
);
1634 FF_ENABLE_DEPRECATION_WARNINGS
1637 st
->internal
->need_context_update
= 0;
1640 if (pkt
->pts
!= AV_NOPTS_VALUE
&&
1641 pkt
->dts
!= AV_NOPTS_VALUE
&&
1642 pkt
->pts
< pkt
->dts
) {
1643 av_log(s
, AV_LOG_WARNING
,
1644 "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1646 av_ts2str(pkt
->pts
),
1647 av_ts2str(pkt
->dts
),
1650 if (s
->debug
& FF_FDEBUG_TS
)
1651 av_log(s
, AV_LOG_DEBUG
,
1652 "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"PRId64
", flags=%d\n",
1654 av_ts2str(pkt
->pts
),
1655 av_ts2str(pkt
->dts
),
1656 pkt
->size
, pkt
->duration
, pkt
->flags
);
1658 if (st
->need_parsing
&& !st
->parser
&& !(s
->flags
& AVFMT_FLAG_NOPARSE
)) {
1659 st
->parser
= av_parser_init(st
->codecpar
->codec_id
);
1661 av_log(s
, AV_LOG_VERBOSE
, "parser not found for codec "
1662 "%s, packets or times may be invalid.\n",
1663 avcodec_get_name(st
->codecpar
->codec_id
));
1664 /* no parser available: just output the raw packets */
1665 st
->need_parsing
= AVSTREAM_PARSE_NONE
;
1666 } else if (st
->need_parsing
== AVSTREAM_PARSE_HEADERS
)
1667 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
1668 else if (st
->need_parsing
== AVSTREAM_PARSE_FULL_ONCE
)
1669 st
->parser
->flags
|= PARSER_FLAG_ONCE
;
1670 else if (st
->need_parsing
== AVSTREAM_PARSE_FULL_RAW
)
1671 st
->parser
->flags
|= PARSER_FLAG_USE_CODEC_TS
;
1674 if (!st
->need_parsing
|| !st
->parser
) {
1675 /* no parsing needed: we just output the packet as is */
1676 compute_pkt_fields(s
, st
, NULL
, pkt
, AV_NOPTS_VALUE
, AV_NOPTS_VALUE
);
1677 if ((s
->iformat
->flags
& AVFMT_GENERIC_INDEX
) &&
1678 (pkt
->flags
& AV_PKT_FLAG_KEY
) && pkt
->dts
!= AV_NOPTS_VALUE
) {
1679 ff_reduce_index(s
, st
->index
);
1680 av_add_index_entry(st
, pkt
->pos
, pkt
->dts
,
1681 0, 0, AVINDEX_KEYFRAME
);
1684 } else if (st
->discard
< AVDISCARD_ALL
) {
1685 if ((ret
= parse_packet(s
, pkt
, pkt
->stream_index
, 0)) < 0)
1687 st
->codecpar
->sample_rate
= st
->internal
->avctx
->sample_rate
;
1688 st
->codecpar
->bit_rate
= st
->internal
->avctx
->bit_rate
;
1689 st
->codecpar
->channels
= st
->internal
->avctx
->channels
;
1690 st
->codecpar
->channel_layout
= st
->internal
->avctx
->channel_layout
;
1691 st
->codecpar
->codec_id
= st
->internal
->avctx
->codec_id
;
1694 av_packet_unref(pkt
);
1696 if (pkt
->flags
& AV_PKT_FLAG_KEY
)
1697 st
->skip_to_keyframe
= 0;
1698 if (st
->skip_to_keyframe
) {
1699 av_packet_unref(pkt
);
1704 if (!got_packet
&& s
->internal
->parse_queue
)
1705 ret
= ff_packet_list_get(&s
->internal
->parse_queue
, &s
->internal
->parse_queue_end
, pkt
);
1708 AVStream
*st
= s
->streams
[pkt
->stream_index
];
1709 int discard_padding
= 0;
1710 if (st
->first_discard_sample
&& pkt
->pts
!= AV_NOPTS_VALUE
) {
1711 int64_t pts
= pkt
->pts
- (is_relative(pkt
->pts
) ? RELATIVE_TS_BASE
: 0);
1712 int64_t sample
= ts_to_samples(st
, pts
);
1713 int duration
= ts_to_samples(st
, pkt
->duration
);
1714 int64_t end_sample
= sample
+ duration
;
1715 if (duration
> 0 && end_sample
>= st
->first_discard_sample
&&
1716 sample
< st
->last_discard_sample
)
1717 discard_padding
= FFMIN(end_sample
- st
->first_discard_sample
, duration
);
1719 if (st
->start_skip_samples
&& (pkt
->pts
== 0 || pkt
->pts
== RELATIVE_TS_BASE
))
1720 st
->skip_samples
= st
->start_skip_samples
;
1721 if (st
->skip_samples
|| discard_padding
) {
1722 uint8_t *p
= av_packet_new_side_data(pkt
, AV_PKT_DATA_SKIP_SAMPLES
, 10);
1724 AV_WL32(p
, st
->skip_samples
);
1725 AV_WL32(p
+ 4, discard_padding
);
1726 av_log(s
, AV_LOG_DEBUG
, "demuxer injecting skip %d / discard %d\n", st
->skip_samples
, discard_padding
);
1728 st
->skip_samples
= 0;
1731 if (st
->inject_global_side_data
) {
1732 for (i
= 0; i
< st
->nb_side_data
; i
++) {
1733 AVPacketSideData
*src_sd
= &st
->side_data
[i
];
1736 if (av_packet_get_side_data(pkt
, src_sd
->type
, NULL
))
1739 dst_data
= av_packet_new_side_data(pkt
, src_sd
->type
, src_sd
->size
);
1741 av_log(s
, AV_LOG_WARNING
, "Could not inject global side data\n");
1745 memcpy(dst_data
, src_sd
->data
, src_sd
->size
);
1747 st
->inject_global_side_data
= 0;
1751 av_opt_get_dict_val(s
, "metadata", AV_OPT_SEARCH_CHILDREN
, &metadata
);
1753 s
->event_flags
|= AVFMT_EVENT_FLAG_METADATA_UPDATED
;
1754 av_dict_copy(&s
->metadata
, metadata
, 0);
1755 av_dict_free(&metadata
);
1756 av_opt_set_dict_val(s
, "metadata", NULL
, AV_OPT_SEARCH_CHILDREN
);
1759 #if FF_API_LAVF_AVCTX
1760 update_stream_avctx(s
);
1763 if (s
->debug
& FF_FDEBUG_TS
)
1764 av_log(s
, AV_LOG_DEBUG
,
1765 "read_frame_internal stream=%d, pts=%s, dts=%s, "
1766 "size=%d, duration=%"PRId64
", flags=%d\n",
1768 av_ts2str(pkt
->pts
),
1769 av_ts2str(pkt
->dts
),
1770 pkt
->size
, pkt
->duration
, pkt
->flags
);
1772 /* A demuxer might have returned EOF because of an IO error, let's
1773 * propagate this back to the user. */
1774 if (ret
== AVERROR_EOF
&& s
->pb
&& s
->pb
->error
< 0 && s
->pb
->error
!= AVERROR(EAGAIN
))
1780 int av_read_frame(AVFormatContext
*s
, AVPacket
*pkt
)
1782 const int genpts
= s
->flags
& AVFMT_FLAG_GENPTS
;
1788 ret
= s
->internal
->packet_buffer
1789 ? ff_packet_list_get(&s
->internal
->packet_buffer
,
1790 &s
->internal
->packet_buffer_end
, pkt
)
1791 : read_frame_internal(s
, pkt
);
1798 AVPacketList
*pktl
= s
->internal
->packet_buffer
;
1801 AVPacket
*next_pkt
= &pktl
->pkt
;
1803 if (next_pkt
->dts
!= AV_NOPTS_VALUE
) {
1804 int wrap_bits
= s
->streams
[next_pkt
->stream_index
]->pts_wrap_bits
;
1805 // last dts seen for this stream. if any of packets following
1806 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1807 int64_t last_dts
= next_pkt
->dts
;
1808 av_assert2(wrap_bits
<= 64);
1809 while (pktl
&& next_pkt
->pts
== AV_NOPTS_VALUE
) {
1810 if (pktl
->pkt
.stream_index
== next_pkt
->stream_index
&&
1811 av_compare_mod(next_pkt
->dts
, pktl
->pkt
.dts
, 2ULL << (wrap_bits
- 1)) < 0) {
1812 if (av_compare_mod(pktl
->pkt
.pts
, pktl
->pkt
.dts
, 2ULL << (wrap_bits
- 1))) {
1814 next_pkt
->pts
= pktl
->pkt
.dts
;
1816 if (last_dts
!= AV_NOPTS_VALUE
) {
1817 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1818 last_dts
= pktl
->pkt
.dts
;
1823 if (eof
&& next_pkt
->pts
== AV_NOPTS_VALUE
&& last_dts
!= AV_NOPTS_VALUE
) {
1824 // Fixing the last reference frame had none pts issue (For MXF etc).
1825 // We only do this when
1827 // 2. we are not able to resolve a pts value for current packet.
1828 // 3. the packets for this stream at the end of the files had valid dts.
1829 next_pkt
->pts
= last_dts
+ next_pkt
->duration
;
1831 pktl
= s
->internal
->packet_buffer
;
1834 /* read packet from packet buffer, if there is data */
1835 st
= s
->streams
[next_pkt
->stream_index
];
1836 if (!(next_pkt
->pts
== AV_NOPTS_VALUE
&& st
->discard
< AVDISCARD_ALL
&&
1837 next_pkt
->dts
!= AV_NOPTS_VALUE
&& !eof
)) {
1838 ret
= ff_packet_list_get(&s
->internal
->packet_buffer
,
1839 &s
->internal
->packet_buffer_end
, pkt
);
1844 ret
= read_frame_internal(s
, pkt
);
1846 if (pktl
&& ret
!= AVERROR(EAGAIN
)) {
1853 ret
= ff_packet_list_put(&s
->internal
->packet_buffer
,
1854 &s
->internal
->packet_buffer_end
,
1857 av_packet_unref(pkt
);
1864 st
= s
->streams
[pkt
->stream_index
];
1865 if ((s
->iformat
->flags
& AVFMT_GENERIC_INDEX
) && pkt
->flags
& AV_PKT_FLAG_KEY
) {
1866 ff_reduce_index(s
, st
->index
);
1867 av_add_index_entry(st
, pkt
->pos
, pkt
->dts
, 0, 0, AVINDEX_KEYFRAME
);
1870 if (is_relative(pkt
->dts
))
1871 pkt
->dts
-= RELATIVE_TS_BASE
;
1872 if (is_relative(pkt
->pts
))
1873 pkt
->pts
-= RELATIVE_TS_BASE
;
1878 /* XXX: suppress the packet queue */
1879 static void flush_packet_queue(AVFormatContext
*s
)
1883 ff_packet_list_free(&s
->internal
->parse_queue
, &s
->internal
->parse_queue_end
);
1884 ff_packet_list_free(&s
->internal
->packet_buffer
, &s
->internal
->packet_buffer_end
);
1885 ff_packet_list_free(&s
->internal
->raw_packet_buffer
, &s
->internal
->raw_packet_buffer_end
);
1887 s
->internal
->raw_packet_buffer_remaining_size
= RAW_PACKET_BUFFER_SIZE
;
1890 /*******************************************************/
1893 int av_find_default_stream_index(AVFormatContext
*s
)
1897 int best_stream
= 0;
1898 int best_score
= INT_MIN
;
1900 if (s
->nb_streams
<= 0)
1902 for (i
= 0; i
< s
->nb_streams
; i
++) {
1905 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
) {
1906 if (st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
)
1908 if (st
->codecpar
->width
&& st
->codecpar
->height
)
1912 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_AUDIO
) {
1913 if (st
->codecpar
->sample_rate
)
1916 if (st
->codec_info_nb_frames
)
1919 if (st
->discard
!= AVDISCARD_ALL
)
1922 if (score
> best_score
) {
1930 /** Flush the frame reader. */
1931 void ff_read_frame_flush(AVFormatContext
*s
)
1936 flush_packet_queue(s
);
1938 /* Reset read state for each stream. */
1939 for (i
= 0; i
< s
->nb_streams
; i
++) {
1943 av_parser_close(st
->parser
);
1946 st
->last_IP_pts
= AV_NOPTS_VALUE
;
1947 st
->last_dts_for_order_check
= AV_NOPTS_VALUE
;
1948 if (st
->first_dts
== AV_NOPTS_VALUE
)
1949 st
->cur_dts
= RELATIVE_TS_BASE
;
1951 /* We set the current DTS to an unspecified origin. */
1952 st
->cur_dts
= AV_NOPTS_VALUE
;
1954 st
->probe_packets
= s
->max_probe_packets
;
1956 for (j
= 0; j
< MAX_REORDER_DELAY
+ 1; j
++)
1957 st
->pts_buffer
[j
] = AV_NOPTS_VALUE
;
1959 if (s
->internal
->inject_global_side_data
)
1960 st
->inject_global_side_data
= 1;
1962 st
->skip_samples
= 0;
1966 void ff_update_cur_dts(AVFormatContext
*s
, AVStream
*ref_st
, int64_t timestamp
)
1970 for (i
= 0; i
< s
->nb_streams
; i
++) {
1971 AVStream
*st
= s
->streams
[i
];
1974 av_rescale(timestamp
,
1975 st
->time_base
.den
* (int64_t) ref_st
->time_base
.num
,
1976 st
->time_base
.num
* (int64_t) ref_st
->time_base
.den
);
1980 void ff_reduce_index(AVFormatContext
*s
, int stream_index
)
1982 AVStream
*st
= s
->streams
[stream_index
];
1983 unsigned int max_entries
= s
->max_index_size
/ sizeof(AVIndexEntry
);
1985 if ((unsigned) st
->nb_index_entries
>= max_entries
) {
1987 for (i
= 0; 2 * i
< st
->nb_index_entries
; i
++)
1988 st
->index_entries
[i
] = st
->index_entries
[2 * i
];
1989 st
->nb_index_entries
= i
;
1993 int ff_add_index_entry(AVIndexEntry
**index_entries
,
1994 int *nb_index_entries
,
1995 unsigned int *index_entries_allocated_size
,
1996 int64_t pos
, int64_t timestamp
,
1997 int size
, int distance
, int flags
)
1999 AVIndexEntry
*entries
, *ie
;
2002 if ((unsigned) *nb_index_entries
+ 1 >= UINT_MAX
/ sizeof(AVIndexEntry
))
2005 if (timestamp
== AV_NOPTS_VALUE
)
2006 return AVERROR(EINVAL
);
2008 if (size
< 0 || size
> 0x3FFFFFFF)
2009 return AVERROR(EINVAL
);
2011 if (is_relative(timestamp
)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
2012 timestamp
-= RELATIVE_TS_BASE
;
2014 entries
= av_fast_realloc(*index_entries
,
2015 index_entries_allocated_size
,
2016 (*nb_index_entries
+ 1) *
2017 sizeof(AVIndexEntry
));
2021 *index_entries
= entries
;
2023 index
= ff_index_search_timestamp(*index_entries
, *nb_index_entries
,
2024 timestamp
, AVSEEK_FLAG_ANY
);
2027 index
= (*nb_index_entries
)++;
2028 ie
= &entries
[index
];
2029 av_assert0(index
== 0 || ie
[-1].timestamp
< timestamp
);
2031 ie
= &entries
[index
];
2032 if (ie
->timestamp
!= timestamp
) {
2033 if (ie
->timestamp
<= timestamp
)
2035 memmove(entries
+ index
+ 1, entries
+ index
,
2036 sizeof(AVIndexEntry
) * (*nb_index_entries
- index
));
2037 (*nb_index_entries
)++;
2038 } else if (ie
->pos
== pos
&& distance
< ie
->min_distance
)
2039 // do not reduce the distance
2040 distance
= ie
->min_distance
;
2044 ie
->timestamp
= timestamp
;
2045 ie
->min_distance
= distance
;
2052 int av_add_index_entry(AVStream
*st
, int64_t pos
, int64_t timestamp
,
2053 int size
, int distance
, int flags
)
2055 timestamp
= wrap_timestamp(st
, timestamp
);
2056 return ff_add_index_entry(&st
->index_entries
, &st
->nb_index_entries
,
2057 &st
->index_entries_allocated_size
, pos
,
2058 timestamp
, size
, distance
, flags
);
2061 int ff_index_search_timestamp(const AVIndexEntry
*entries
, int nb_entries
,
2062 int64_t wanted_timestamp
, int flags
)
2070 // Optimize appending index entries at the end.
2071 if (b
&& entries
[b
- 1].timestamp
< wanted_timestamp
)
2077 // Search for the next non-discarded packet.
2078 while ((entries
[m
].flags
& AVINDEX_DISCARD_FRAME
) && m
< b
&& m
< nb_entries
- 1) {
2080 if (m
== b
&& entries
[m
].timestamp
>= wanted_timestamp
) {
2086 timestamp
= entries
[m
].timestamp
;
2087 if (timestamp
>= wanted_timestamp
)
2089 if (timestamp
<= wanted_timestamp
)
2092 m
= (flags
& AVSEEK_FLAG_BACKWARD
) ? a
: b
;
2094 if (!(flags
& AVSEEK_FLAG_ANY
))
2095 while (m
>= 0 && m
< nb_entries
&&
2096 !(entries
[m
].flags
& AVINDEX_KEYFRAME
))
2097 m
+= (flags
& AVSEEK_FLAG_BACKWARD
) ? -1 : 1;
2099 if (m
== nb_entries
)
2104 void ff_configure_buffers_for_index(AVFormatContext
*s
, int64_t time_tolerance
)
2107 int64_t pos_delta
= 0;
2109 //We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
2110 const char *proto
= avio_find_protocol_name(s
->url
);
2112 av_assert0(time_tolerance
>= 0);
2115 av_log(s
, AV_LOG_INFO
,
2116 "Protocol name not provided, cannot determine if input is local or "
2117 "a network protocol, buffers and access patterns cannot be configured "
2118 "optimally without knowing the protocol\n");
2121 if (proto
&& !(strcmp(proto
, "file") && strcmp(proto
, "pipe") && strcmp(proto
, "cache")))
2124 for (ist1
= 0; ist1
< s
->nb_streams
; ist1
++) {
2125 AVStream
*st1
= s
->streams
[ist1
];
2126 for (ist2
= 0; ist2
< s
->nb_streams
; ist2
++) {
2127 AVStream
*st2
= s
->streams
[ist2
];
2133 for (i1
= i2
= 0; i1
< st1
->nb_index_entries
; i1
++) {
2134 AVIndexEntry
*e1
= &st1
->index_entries
[i1
];
2135 int64_t e1_pts
= av_rescale_q(e1
->timestamp
, st1
->time_base
, AV_TIME_BASE_Q
);
2137 skip
= FFMAX(skip
, e1
->size
);
2138 for (; i2
< st2
->nb_index_entries
; i2
++) {
2139 AVIndexEntry
*e2
= &st2
->index_entries
[i2
];
2140 int64_t e2_pts
= av_rescale_q(e2
->timestamp
, st2
->time_base
, AV_TIME_BASE_Q
);
2141 if (e2_pts
< e1_pts
|| e2_pts
- (uint64_t)e1_pts
< time_tolerance
)
2143 pos_delta
= FFMAX(pos_delta
, e1
->pos
- e2
->pos
);
2151 /* XXX This could be adjusted depending on protocol*/
2152 if (s
->pb
->buffer_size
< pos_delta
&& pos_delta
< (1<<24)) {
2153 av_log(s
, AV_LOG_VERBOSE
, "Reconfiguring buffers to size %"PRId64
"\n", pos_delta
);
2155 /* realloc the buffer and the original data will be retained */
2156 if (ffio_realloc_buf(s
->pb
, pos_delta
)) {
2157 av_log(s
, AV_LOG_ERROR
, "Realloc buffer fail.\n");
2161 s
->pb
->short_seek_threshold
= FFMAX(s
->pb
->short_seek_threshold
, pos_delta
/2);
2164 if (skip
< (1<<23)) {
2165 s
->pb
->short_seek_threshold
= FFMAX(s
->pb
->short_seek_threshold
, skip
);
2169 int av_index_search_timestamp(AVStream
*st
, int64_t wanted_timestamp
, int flags
)
2171 return ff_index_search_timestamp(st
->index_entries
, st
->nb_index_entries
,
2172 wanted_timestamp
, flags
);
2175 static int64_t ff_read_timestamp(AVFormatContext
*s
, int stream_index
, int64_t *ppos
, int64_t pos_limit
,
2176 int64_t (*read_timestamp
)(struct AVFormatContext
*, int , int64_t *, int64_t ))
2178 int64_t ts
= read_timestamp(s
, stream_index
, ppos
, pos_limit
);
2179 if (stream_index
>= 0)
2180 ts
= wrap_timestamp(s
->streams
[stream_index
], ts
);
2184 int ff_seek_frame_binary(AVFormatContext
*s
, int stream_index
,
2185 int64_t target_ts
, int flags
)
2187 const AVInputFormat
*avif
= s
->iformat
;
2188 int64_t pos_min
= 0, pos_max
= 0, pos
, pos_limit
;
2189 int64_t ts_min
, ts_max
, ts
;
2194 if (stream_index
< 0)
2197 av_log(s
, AV_LOG_TRACE
, "read_seek: %d %s\n", stream_index
, av_ts2str(target_ts
));
2200 ts_min
= AV_NOPTS_VALUE
;
2201 pos_limit
= -1; // GCC falsely says it may be uninitialized.
2203 st
= s
->streams
[stream_index
];
2204 if (st
->index_entries
) {
2207 /* FIXME: Whole function must be checked for non-keyframe entries in
2208 * index case, especially read_timestamp(). */
2209 index
= av_index_search_timestamp(st
, target_ts
,
2210 flags
| AVSEEK_FLAG_BACKWARD
);
2211 index
= FFMAX(index
, 0);
2212 e
= &st
->index_entries
[index
];
2214 if (e
->timestamp
<= target_ts
|| e
->pos
== e
->min_distance
) {
2216 ts_min
= e
->timestamp
;
2217 av_log(s
, AV_LOG_TRACE
, "using cached pos_min=0x%"PRIx64
" dts_min=%s\n",
2218 pos_min
, av_ts2str(ts_min
));
2220 av_assert1(index
== 0);
2223 index
= av_index_search_timestamp(st
, target_ts
,
2224 flags
& ~AVSEEK_FLAG_BACKWARD
);
2225 av_assert0(index
< st
->nb_index_entries
);
2227 e
= &st
->index_entries
[index
];
2228 av_assert1(e
->timestamp
>= target_ts
);
2230 ts_max
= e
->timestamp
;
2231 pos_limit
= pos_max
- e
->min_distance
;
2232 av_log(s
, AV_LOG_TRACE
, "using cached pos_max=0x%"PRIx64
" pos_limit=0x%"PRIx64
2233 " dts_max=%s\n", pos_max
, pos_limit
, av_ts2str(ts_max
));
2237 pos
= ff_gen_search(s
, stream_index
, target_ts
, pos_min
, pos_max
, pos_limit
,
2238 ts_min
, ts_max
, flags
, &ts
, avif
->read_timestamp
);
2243 if ((ret
= avio_seek(s
->pb
, pos
, SEEK_SET
)) < 0)
2246 ff_read_frame_flush(s
);
2247 ff_update_cur_dts(s
, st
, ts
);
2252 int ff_find_last_ts(AVFormatContext
*s
, int stream_index
, int64_t *ts
, int64_t *pos
,
2253 int64_t (*read_timestamp
)(struct AVFormatContext
*, int , int64_t *, int64_t ))
2255 int64_t step
= 1024;
2256 int64_t limit
, ts_max
;
2257 int64_t filesize
= avio_size(s
->pb
);
2258 int64_t pos_max
= filesize
- 1;
2261 pos_max
= FFMAX(0, (pos_max
) - step
);
2262 ts_max
= ff_read_timestamp(s
, stream_index
,
2263 &pos_max
, limit
, read_timestamp
);
2265 } while (ts_max
== AV_NOPTS_VALUE
&& 2*limit
> step
);
2266 if (ts_max
== AV_NOPTS_VALUE
)
2270 int64_t tmp_pos
= pos_max
+ 1;
2271 int64_t tmp_ts
= ff_read_timestamp(s
, stream_index
,
2272 &tmp_pos
, INT64_MAX
, read_timestamp
);
2273 if (tmp_ts
== AV_NOPTS_VALUE
)
2275 av_assert0(tmp_pos
> pos_max
);
2278 if (tmp_pos
>= filesize
)
2290 int64_t ff_gen_search(AVFormatContext
*s
, int stream_index
, int64_t target_ts
,
2291 int64_t pos_min
, int64_t pos_max
, int64_t pos_limit
,
2292 int64_t ts_min
, int64_t ts_max
,
2293 int flags
, int64_t *ts_ret
,
2294 int64_t (*read_timestamp
)(struct AVFormatContext
*, int,
2295 int64_t *, int64_t))
2302 av_log(s
, AV_LOG_TRACE
, "gen_seek: %d %s\n", stream_index
, av_ts2str(target_ts
));
2304 if (ts_min
== AV_NOPTS_VALUE
) {
2305 pos_min
= s
->internal
->data_offset
;
2306 ts_min
= ff_read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
, read_timestamp
);
2307 if (ts_min
== AV_NOPTS_VALUE
)
2311 if (ts_min
>= target_ts
) {
2316 if (ts_max
== AV_NOPTS_VALUE
) {
2317 if ((ret
= ff_find_last_ts(s
, stream_index
, &ts_max
, &pos_max
, read_timestamp
)) < 0)
2319 pos_limit
= pos_max
;
2322 if (ts_max
<= target_ts
) {
2327 av_assert0(ts_min
< ts_max
);
2330 while (pos_min
< pos_limit
) {
2331 av_log(s
, AV_LOG_TRACE
,
2332 "pos_min=0x%"PRIx64
" pos_max=0x%"PRIx64
" dts_min=%s dts_max=%s\n",
2333 pos_min
, pos_max
, av_ts2str(ts_min
), av_ts2str(ts_max
));
2334 av_assert0(pos_limit
<= pos_max
);
2336 if (no_change
== 0) {
2337 int64_t approximate_keyframe_distance
= pos_max
- pos_limit
;
2338 // interpolate position (better than dichotomy)
2339 pos
= av_rescale(target_ts
- ts_min
, pos_max
- pos_min
,
2341 pos_min
- approximate_keyframe_distance
;
2342 } else if (no_change
== 1) {
2343 // bisection if interpolation did not change min / max pos last time
2344 pos
= (pos_min
+ pos_limit
) >> 1;
2346 /* linear search if bisection failed, can only happen if there
2347 * are very few or no keyframes between min/max */
2352 else if (pos
> pos_limit
)
2356 // May pass pos_limit instead of -1.
2357 ts
= ff_read_timestamp(s
, stream_index
, &pos
, INT64_MAX
, read_timestamp
);
2362 av_log(s
, AV_LOG_TRACE
, "%"PRId64
" %"PRId64
" %"PRId64
" / %s %s %s"
2363 " target:%s limit:%"PRId64
" start:%"PRId64
" noc:%d\n",
2364 pos_min
, pos
, pos_max
,
2365 av_ts2str(ts_min
), av_ts2str(ts
), av_ts2str(ts_max
), av_ts2str(target_ts
),
2366 pos_limit
, start_pos
, no_change
);
2367 if (ts
== AV_NOPTS_VALUE
) {
2368 av_log(s
, AV_LOG_ERROR
, "read_timestamp() failed in the middle\n");
2371 if (target_ts
<= ts
) {
2372 pos_limit
= start_pos
- 1;
2376 if (target_ts
>= ts
) {
2382 pos
= (flags
& AVSEEK_FLAG_BACKWARD
) ? pos_min
: pos_max
;
2383 ts
= (flags
& AVSEEK_FLAG_BACKWARD
) ? ts_min
: ts_max
;
2386 ts_min
= ff_read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
, read_timestamp
);
2388 ts_max
= ff_read_timestamp(s
, stream_index
, &pos_min
, INT64_MAX
, read_timestamp
);
2389 av_log(s
, AV_LOG_TRACE
, "pos=0x%"PRIx64
" %s<=%s<=%s\n",
2390 pos
, av_ts2str(ts_min
), av_ts2str(target_ts
), av_ts2str(ts_max
));
2396 static int seek_frame_byte(AVFormatContext
*s
, int stream_index
,
2397 int64_t pos
, int flags
)
2399 int64_t pos_min
, pos_max
;
2401 pos_min
= s
->internal
->data_offset
;
2402 pos_max
= avio_size(s
->pb
) - 1;
2406 else if (pos
> pos_max
)
2409 avio_seek(s
->pb
, pos
, SEEK_SET
);
2411 s
->io_repositioned
= 1;
2416 static int seek_frame_generic(AVFormatContext
*s
, int stream_index
,
2417 int64_t timestamp
, int flags
)
2424 st
= s
->streams
[stream_index
];
2426 index
= av_index_search_timestamp(st
, timestamp
, flags
);
2428 if (index
< 0 && st
->nb_index_entries
&&
2429 timestamp
< st
->index_entries
[0].timestamp
)
2432 if (index
< 0 || index
== st
->nb_index_entries
- 1) {
2436 if (st
->nb_index_entries
) {
2437 av_assert0(st
->index_entries
);
2438 ie
= &st
->index_entries
[st
->nb_index_entries
- 1];
2439 if ((ret
= avio_seek(s
->pb
, ie
->pos
, SEEK_SET
)) < 0)
2441 ff_update_cur_dts(s
, st
, ie
->timestamp
);
2443 if ((ret
= avio_seek(s
->pb
, s
->internal
->data_offset
, SEEK_SET
)) < 0)
2449 read_status
= av_read_frame(s
, &pkt
);
2450 } while (read_status
== AVERROR(EAGAIN
));
2451 if (read_status
< 0)
2453 if (stream_index
== pkt
.stream_index
&& pkt
.dts
> timestamp
) {
2454 if (pkt
.flags
& AV_PKT_FLAG_KEY
) {
2455 av_packet_unref(&pkt
);
2458 if (nonkey
++ > 1000 && st
->codecpar
->codec_id
!= AV_CODEC_ID_CDGRAPHICS
) {
2459 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
);
2460 av_packet_unref(&pkt
);
2464 av_packet_unref(&pkt
);
2466 index
= av_index_search_timestamp(st
, timestamp
, flags
);
2471 ff_read_frame_flush(s
);
2472 if (s
->iformat
->read_seek
)
2473 if (s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
) >= 0)
2475 ie
= &st
->index_entries
[index
];
2476 if ((ret
= avio_seek(s
->pb
, ie
->pos
, SEEK_SET
)) < 0)
2478 ff_update_cur_dts(s
, st
, ie
->timestamp
);
2483 static int seek_frame_internal(AVFormatContext
*s
, int stream_index
,
2484 int64_t timestamp
, int flags
)
2489 if (flags
& AVSEEK_FLAG_BYTE
) {
2490 if (s
->iformat
->flags
& AVFMT_NO_BYTE_SEEK
)
2492 ff_read_frame_flush(s
);
2493 return seek_frame_byte(s
, stream_index
, timestamp
, flags
);
2496 if (stream_index
< 0) {
2497 stream_index
= av_find_default_stream_index(s
);
2498 if (stream_index
< 0)
2501 st
= s
->streams
[stream_index
];
2502 /* timestamp for default must be expressed in AV_TIME_BASE units */
2503 timestamp
= av_rescale(timestamp
, st
->time_base
.den
,
2504 AV_TIME_BASE
* (int64_t) st
->time_base
.num
);
2507 /* first, we try the format specific seek */
2508 if (s
->iformat
->read_seek
) {
2509 ff_read_frame_flush(s
);
2510 ret
= s
->iformat
->read_seek(s
, stream_index
, timestamp
, flags
);
2516 if (s
->iformat
->read_timestamp
&&
2517 !(s
->iformat
->flags
& AVFMT_NOBINSEARCH
)) {
2518 ff_read_frame_flush(s
);
2519 return ff_seek_frame_binary(s
, stream_index
, timestamp
, flags
);
2520 } else if (!(s
->iformat
->flags
& AVFMT_NOGENSEARCH
)) {
2521 ff_read_frame_flush(s
);
2522 return seek_frame_generic(s
, stream_index
, timestamp
, flags
);
2527 int av_seek_frame(AVFormatContext
*s
, int stream_index
,
2528 int64_t timestamp
, int flags
)
2532 if (s
->iformat
->read_seek2
&& !s
->iformat
->read_seek
) {
2533 int64_t min_ts
= INT64_MIN
, max_ts
= INT64_MAX
;
2534 if ((flags
& AVSEEK_FLAG_BACKWARD
))
2538 return avformat_seek_file(s
, stream_index
, min_ts
, timestamp
, max_ts
,
2539 flags
& ~AVSEEK_FLAG_BACKWARD
);
2542 ret
= seek_frame_internal(s
, stream_index
, timestamp
, flags
);
2545 ret
= avformat_queue_attached_pictures(s
);
2550 int avformat_seek_file(AVFormatContext
*s
, int stream_index
, int64_t min_ts
,
2551 int64_t ts
, int64_t max_ts
, int flags
)
2553 if (min_ts
> ts
|| max_ts
< ts
)
2555 if (stream_index
< -1 || stream_index
>= (int)s
->nb_streams
)
2556 return AVERROR(EINVAL
);
2559 flags
|= AVSEEK_FLAG_ANY
;
2560 flags
&= ~AVSEEK_FLAG_BACKWARD
;
2562 if (s
->iformat
->read_seek2
) {
2564 ff_read_frame_flush(s
);
2566 if (stream_index
== -1 && s
->nb_streams
== 1) {
2567 AVRational time_base
= s
->streams
[0]->time_base
;
2568 ts
= av_rescale_q(ts
, AV_TIME_BASE_Q
, time_base
);
2569 min_ts
= av_rescale_rnd(min_ts
, time_base
.den
,
2570 time_base
.num
* (int64_t)AV_TIME_BASE
,
2571 AV_ROUND_UP
| AV_ROUND_PASS_MINMAX
);
2572 max_ts
= av_rescale_rnd(max_ts
, time_base
.den
,
2573 time_base
.num
* (int64_t)AV_TIME_BASE
,
2574 AV_ROUND_DOWN
| AV_ROUND_PASS_MINMAX
);
2578 ret
= s
->iformat
->read_seek2(s
, stream_index
, min_ts
,
2582 ret
= avformat_queue_attached_pictures(s
);
2586 if (s
->iformat
->read_timestamp
) {
2587 // try to seek via read_timestamp()
2590 // Fall back on old API if new is not implemented but old is.
2591 // Note the old API has somewhat different semantics.
2592 if (s
->iformat
->read_seek
|| 1) {
2593 int dir
= (ts
- (uint64_t)min_ts
> (uint64_t)max_ts
- ts
? AVSEEK_FLAG_BACKWARD
: 0);
2594 int ret
= av_seek_frame(s
, stream_index
, ts
, flags
| dir
);
2595 if (ret
<0 && ts
!= min_ts
&& max_ts
!= ts
) {
2596 ret
= av_seek_frame(s
, stream_index
, dir
? max_ts
: min_ts
, flags
| dir
);
2598 ret
= av_seek_frame(s
, stream_index
, ts
, flags
| (dir
^AVSEEK_FLAG_BACKWARD
));
2603 // try some generic seek like seek_frame_generic() but with new ts semantics
2604 return -1; //unreachable
2607 int avformat_flush(AVFormatContext
*s
)
2609 ff_read_frame_flush(s
);
2613 /*******************************************************/
2616 * Return TRUE if the stream has accurate duration in any stream.
2618 * @return TRUE if the stream has accurate duration for at least one component.
2620 static int has_duration(AVFormatContext
*ic
)
2625 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2626 st
= ic
->streams
[i
];
2627 if (st
->duration
!= AV_NOPTS_VALUE
)
2630 if (ic
->duration
!= AV_NOPTS_VALUE
)
2636 * Estimate the stream timings from the one of each components.
2638 * Also computes the global bitrate if possible.
2640 static void update_stream_timings(AVFormatContext
*ic
)
2642 int64_t start_time
, start_time1
, start_time_text
, end_time
, end_time1
, end_time_text
;
2643 int64_t duration
, duration1
, duration_text
, filesize
;
2647 start_time
= INT64_MAX
;
2648 start_time_text
= INT64_MAX
;
2649 end_time
= INT64_MIN
;
2650 end_time_text
= INT64_MIN
;
2651 duration
= INT64_MIN
;
2652 duration_text
= INT64_MIN
;
2654 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2655 AVStream
*st
= ic
->streams
[i
];
2656 int is_text
= st
->codecpar
->codec_type
== AVMEDIA_TYPE_SUBTITLE
||
2657 st
->codecpar
->codec_type
== AVMEDIA_TYPE_DATA
;
2658 if (st
->start_time
!= AV_NOPTS_VALUE
&& st
->time_base
.den
) {
2659 start_time1
= av_rescale_q(st
->start_time
, st
->time_base
,
2662 start_time_text
= FFMIN(start_time_text
, start_time1
);
2664 start_time
= FFMIN(start_time
, start_time1
);
2665 end_time1
= av_rescale_q_rnd(st
->duration
, st
->time_base
,
2667 AV_ROUND_NEAR_INF
|AV_ROUND_PASS_MINMAX
);
2668 if (end_time1
!= AV_NOPTS_VALUE
&& (end_time1
> 0 ? start_time1
<= INT64_MAX
- end_time1
: start_time1
>= INT64_MIN
- end_time1
)) {
2669 end_time1
+= start_time1
;
2671 end_time_text
= FFMAX(end_time_text
, end_time1
);
2673 end_time
= FFMAX(end_time
, end_time1
);
2675 for (p
= NULL
; (p
= av_find_program_from_stream(ic
, p
, i
)); ) {
2676 if (p
->start_time
== AV_NOPTS_VALUE
|| p
->start_time
> start_time1
)
2677 p
->start_time
= start_time1
;
2678 if (p
->end_time
< end_time1
)
2679 p
->end_time
= end_time1
;
2682 if (st
->duration
!= AV_NOPTS_VALUE
) {
2683 duration1
= av_rescale_q(st
->duration
, st
->time_base
,
2686 duration_text
= FFMAX(duration_text
, duration1
);
2688 duration
= FFMAX(duration
, duration1
);
2691 if (start_time
== INT64_MAX
|| (start_time
> start_time_text
&& start_time
- (uint64_t)start_time_text
< AV_TIME_BASE
))
2692 start_time
= start_time_text
;
2693 else if (start_time
> start_time_text
)
2694 av_log(ic
, AV_LOG_VERBOSE
, "Ignoring outlier non primary stream starttime %f\n", start_time_text
/ (float)AV_TIME_BASE
);
2696 if (end_time
== INT64_MIN
|| (end_time
< end_time_text
&& end_time_text
- (uint64_t)end_time
< AV_TIME_BASE
))
2697 end_time
= end_time_text
;
2698 else if (end_time
< end_time_text
)
2699 av_log(ic
, AV_LOG_VERBOSE
, "Ignoring outlier non primary stream endtime %f\n", end_time_text
/ (float)AV_TIME_BASE
);
2701 if (duration
== INT64_MIN
|| (duration
< duration_text
&& duration_text
- duration
< AV_TIME_BASE
))
2702 duration
= duration_text
;
2703 else if (duration
< duration_text
)
2704 av_log(ic
, AV_LOG_VERBOSE
, "Ignoring outlier non primary stream duration %f\n", duration_text
/ (float)AV_TIME_BASE
);
2706 if (start_time
!= INT64_MAX
) {
2707 ic
->start_time
= start_time
;
2708 if (end_time
!= INT64_MIN
) {
2709 if (ic
->nb_programs
> 1) {
2710 for (i
= 0; i
< ic
->nb_programs
; i
++) {
2711 p
= ic
->programs
[i
];
2712 if (p
->start_time
!= AV_NOPTS_VALUE
&&
2713 p
->end_time
> p
->start_time
&&
2714 p
->end_time
- (uint64_t)p
->start_time
<= INT64_MAX
)
2715 duration
= FFMAX(duration
, p
->end_time
- p
->start_time
);
2717 } else if (end_time
>= start_time
&& end_time
- (uint64_t)start_time
<= INT64_MAX
) {
2718 duration
= FFMAX(duration
, end_time
- start_time
);
2722 if (duration
!= INT64_MIN
&& duration
> 0 && ic
->duration
== AV_NOPTS_VALUE
) {
2723 ic
->duration
= duration
;
2725 if (ic
->pb
&& (filesize
= avio_size(ic
->pb
)) > 0 && ic
->duration
> 0) {
2726 /* compute the bitrate */
2727 double bitrate
= (double) filesize
* 8.0 * AV_TIME_BASE
/
2728 (double) ic
->duration
;
2729 if (bitrate
>= 0 && bitrate
<= INT64_MAX
)
2730 ic
->bit_rate
= bitrate
;
2734 static void fill_all_stream_timings(AVFormatContext
*ic
)
2739 update_stream_timings(ic
);
2740 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2741 st
= ic
->streams
[i
];
2742 if (st
->start_time
== AV_NOPTS_VALUE
) {
2743 if (ic
->start_time
!= AV_NOPTS_VALUE
)
2744 st
->start_time
= av_rescale_q(ic
->start_time
, AV_TIME_BASE_Q
,
2746 if (ic
->duration
!= AV_NOPTS_VALUE
)
2747 st
->duration
= av_rescale_q(ic
->duration
, AV_TIME_BASE_Q
,
2753 static void estimate_timings_from_bit_rate(AVFormatContext
*ic
)
2755 int64_t filesize
, duration
;
2756 int i
, show_warning
= 0;
2759 /* if bit_rate is already set, we believe it */
2760 if (ic
->bit_rate
<= 0) {
2761 int64_t bit_rate
= 0;
2762 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2763 st
= ic
->streams
[i
];
2764 if (st
->codecpar
->bit_rate
<= 0 && st
->internal
->avctx
->bit_rate
> 0)
2765 st
->codecpar
->bit_rate
= st
->internal
->avctx
->bit_rate
;
2766 if (st
->codecpar
->bit_rate
> 0) {
2767 if (INT64_MAX
- st
->codecpar
->bit_rate
< bit_rate
) {
2771 bit_rate
+= st
->codecpar
->bit_rate
;
2772 } else if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
&& st
->codec_info_nb_frames
> 1) {
2773 // If we have a videostream with packets but without a bitrate
2774 // then consider the sum not known
2779 ic
->bit_rate
= bit_rate
;
2782 /* if duration is already set, we believe it */
2783 if (ic
->duration
== AV_NOPTS_VALUE
&&
2784 ic
->bit_rate
!= 0) {
2785 filesize
= ic
->pb
? avio_size(ic
->pb
) : 0;
2786 if (filesize
> ic
->internal
->data_offset
) {
2787 filesize
-= ic
->internal
->data_offset
;
2788 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2789 st
= ic
->streams
[i
];
2790 if ( st
->time_base
.num
<= INT64_MAX
/ ic
->bit_rate
2791 && st
->duration
== AV_NOPTS_VALUE
) {
2792 duration
= av_rescale(filesize
, 8LL * st
->time_base
.den
,
2794 (int64_t) st
->time_base
.num
);
2795 st
->duration
= duration
;
2802 av_log(ic
, AV_LOG_WARNING
,
2803 "Estimating duration from bitrate, this may be inaccurate\n");
2806 #define DURATION_MAX_READ_SIZE 250000LL
2807 #define DURATION_MAX_RETRY 6
2809 /* only usable for MPEG-PS streams */
2810 static void estimate_timings_from_pts(AVFormatContext
*ic
, int64_t old_offset
)
2812 AVPacket pkt1
, *pkt
= &pkt1
;
2814 int num
, den
, read_size
, i
, ret
;
2815 int found_duration
= 0;
2817 int64_t filesize
, offset
, duration
;
2820 /* flush packet queue */
2821 flush_packet_queue(ic
);
2823 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2824 st
= ic
->streams
[i
];
2825 if (st
->start_time
== AV_NOPTS_VALUE
&&
2826 st
->first_dts
== AV_NOPTS_VALUE
&&
2827 st
->codecpar
->codec_type
!= AVMEDIA_TYPE_UNKNOWN
)
2828 av_log(ic
, AV_LOG_WARNING
,
2829 "start time for stream %d is not set in estimate_timings_from_pts\n", i
);
2832 av_parser_close(st
->parser
);
2837 if (ic
->skip_estimate_duration_from_pts
) {
2838 av_log(ic
, AV_LOG_INFO
, "Skipping duration calculation in estimate_timings_from_pts\n");
2839 goto skip_duration_calc
;
2842 av_opt_set(ic
, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN
);
2843 /* estimate the end time (duration) */
2844 /* XXX: may need to support wrapping */
2845 filesize
= ic
->pb
? avio_size(ic
->pb
) : 0;
2847 is_end
= found_duration
;
2848 offset
= filesize
- (DURATION_MAX_READ_SIZE
<< retry
);
2852 avio_seek(ic
->pb
, offset
, SEEK_SET
);
2855 if (read_size
>= DURATION_MAX_READ_SIZE
<< (FFMAX(retry
- 1, 0)))
2859 ret
= ff_read_packet(ic
, pkt
);
2860 } while (ret
== AVERROR(EAGAIN
));
2863 read_size
+= pkt
->size
;
2864 st
= ic
->streams
[pkt
->stream_index
];
2865 if (pkt
->pts
!= AV_NOPTS_VALUE
&&
2866 (st
->start_time
!= AV_NOPTS_VALUE
||
2867 st
->first_dts
!= AV_NOPTS_VALUE
)) {
2868 if (pkt
->duration
== 0) {
2869 ff_compute_frame_duration(ic
, &num
, &den
, st
, st
->parser
, pkt
);
2871 pkt
->duration
= av_rescale_rnd(1,
2872 num
* (int64_t) st
->time_base
.den
,
2873 den
* (int64_t) st
->time_base
.num
,
2877 duration
= pkt
->pts
+ pkt
->duration
;
2879 if (st
->start_time
!= AV_NOPTS_VALUE
)
2880 duration
-= st
->start_time
;
2882 duration
-= st
->first_dts
;
2884 if (st
->duration
== AV_NOPTS_VALUE
|| st
->info
->last_duration
<= 0 ||
2885 (st
->duration
< duration
&& FFABS(duration
- st
->info
->last_duration
) < 60LL*st
->time_base
.den
/ st
->time_base
.num
))
2886 st
->duration
= duration
;
2887 st
->info
->last_duration
= duration
;
2890 av_packet_unref(pkt
);
2893 /* check if all audio/video streams have valid duration */
2896 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2897 st
= ic
->streams
[i
];
2898 switch (st
->codecpar
->codec_type
) {
2899 case AVMEDIA_TYPE_VIDEO
:
2900 case AVMEDIA_TYPE_AUDIO
:
2901 if (st
->duration
== AV_NOPTS_VALUE
)
2908 ++retry
<= DURATION_MAX_RETRY
);
2910 av_opt_set(ic
, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN
);
2912 /* warn about audio/video streams which duration could not be estimated */
2913 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2914 st
= ic
->streams
[i
];
2915 if (st
->duration
== AV_NOPTS_VALUE
) {
2916 switch (st
->codecpar
->codec_type
) {
2917 case AVMEDIA_TYPE_VIDEO
:
2918 case AVMEDIA_TYPE_AUDIO
:
2919 if (st
->start_time
!= AV_NOPTS_VALUE
|| st
->first_dts
!= AV_NOPTS_VALUE
) {
2920 av_log(ic
, AV_LOG_WARNING
, "stream %d : no PTS found at end of file, duration not set\n", i
);
2922 av_log(ic
, AV_LOG_WARNING
, "stream %d : no TS found at start of file, duration not set\n", i
);
2927 fill_all_stream_timings(ic
);
2929 avio_seek(ic
->pb
, old_offset
, SEEK_SET
);
2930 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2933 st
= ic
->streams
[i
];
2934 st
->cur_dts
= st
->first_dts
;
2935 st
->last_IP_pts
= AV_NOPTS_VALUE
;
2936 st
->last_dts_for_order_check
= AV_NOPTS_VALUE
;
2937 for (j
= 0; j
< MAX_REORDER_DELAY
+ 1; j
++)
2938 st
->pts_buffer
[j
] = AV_NOPTS_VALUE
;
2942 /* 1:1 map to AVDurationEstimationMethod */
2943 static const char *duration_name
[] = {
2944 [AVFMT_DURATION_FROM_PTS
] = "pts",
2945 [AVFMT_DURATION_FROM_STREAM
] = "stream",
2946 [AVFMT_DURATION_FROM_BITRATE
] = "bit rate",
2949 static const char *duration_estimate_name(enum AVDurationEstimationMethod method
)
2951 return duration_name
[method
];
2954 static void estimate_timings(AVFormatContext
*ic
, int64_t old_offset
)
2958 /* get the file size, if possible */
2959 if (ic
->iformat
->flags
& AVFMT_NOFILE
) {
2962 file_size
= avio_size(ic
->pb
);
2963 file_size
= FFMAX(0, file_size
);
2966 if ((!strcmp(ic
->iformat
->name
, "mpeg") ||
2967 !strcmp(ic
->iformat
->name
, "mpegts")) &&
2968 file_size
&& (ic
->pb
->seekable
& AVIO_SEEKABLE_NORMAL
)) {
2969 /* get accurate estimate from the PTSes */
2970 estimate_timings_from_pts(ic
, old_offset
);
2971 ic
->duration_estimation_method
= AVFMT_DURATION_FROM_PTS
;
2972 } else if (has_duration(ic
)) {
2973 /* at least one component has timings - we use them for all
2975 fill_all_stream_timings(ic
);
2976 /* nut demuxer estimate the duration from PTS */
2977 if(!strcmp(ic
->iformat
->name
, "nut"))
2978 ic
->duration_estimation_method
= AVFMT_DURATION_FROM_PTS
;
2980 ic
->duration_estimation_method
= AVFMT_DURATION_FROM_STREAM
;
2982 /* less precise: use bitrate info */
2983 estimate_timings_from_bit_rate(ic
);
2984 ic
->duration_estimation_method
= AVFMT_DURATION_FROM_BITRATE
;
2986 update_stream_timings(ic
);
2990 AVStream av_unused
*st
;
2991 for (i
= 0; i
< ic
->nb_streams
; i
++) {
2992 st
= ic
->streams
[i
];
2993 if (st
->time_base
.den
)
2994 av_log(ic
, AV_LOG_TRACE
, "stream %d: start_time: %s duration: %s\n", i
,
2995 av_ts2timestr(st
->start_time
, &st
->time_base
),
2996 av_ts2timestr(st
->duration
, &st
->time_base
));
2998 av_log(ic
, AV_LOG_TRACE
,
2999 "format: start_time: %s duration: %s (estimate from %s) bitrate=%"PRId64
" kb/s\n",
3000 av_ts2timestr(ic
->start_time
, &AV_TIME_BASE_Q
),
3001 av_ts2timestr(ic
->duration
, &AV_TIME_BASE_Q
),
3002 duration_estimate_name(ic
->duration_estimation_method
),
3003 (int64_t)ic
->bit_rate
/ 1000);
3007 static int has_codec_parameters(AVStream
*st
, const char **errmsg_ptr
)
3009 AVCodecContext
*avctx
= st
->internal
->avctx
;
3011 #define FAIL(errmsg) do { \
3013 *errmsg_ptr = errmsg; \
3017 if ( avctx
->codec_id
== AV_CODEC_ID_NONE
3018 && avctx
->codec_type
!= AVMEDIA_TYPE_DATA
)
3019 FAIL("unknown codec");
3020 switch (avctx
->codec_type
) {
3021 case AVMEDIA_TYPE_AUDIO
:
3022 if (!avctx
->frame_size
&& determinable_frame_size(avctx
))
3023 FAIL("unspecified frame size");
3024 if (st
->info
->found_decoder
>= 0 &&
3025 avctx
->sample_fmt
== AV_SAMPLE_FMT_NONE
)
3026 FAIL("unspecified sample format");
3027 if (!avctx
->sample_rate
)
3028 FAIL("unspecified sample rate");
3029 if (!avctx
->channels
)
3030 FAIL("unspecified number of channels");
3031 if (st
->info
->found_decoder
>= 0 && !st
->nb_decoded_frames
&& avctx
->codec_id
== AV_CODEC_ID_DTS
)
3032 FAIL("no decodable DTS frames");
3034 case AVMEDIA_TYPE_VIDEO
:
3036 FAIL("unspecified size");
3037 if (st
->info
->found_decoder
>= 0 && avctx
->pix_fmt
== AV_PIX_FMT_NONE
)
3038 FAIL("unspecified pixel format");
3039 if (st
->codecpar
->codec_id
== AV_CODEC_ID_RV30
|| st
->codecpar
->codec_id
== AV_CODEC_ID_RV40
)
3040 if (!st
->sample_aspect_ratio
.num
&& !st
->codecpar
->sample_aspect_ratio
.num
&& !st
->codec_info_nb_frames
)
3041 FAIL("no frame in rv30/40 and no sar");
3043 case AVMEDIA_TYPE_SUBTITLE
:
3044 if (avctx
->codec_id
== AV_CODEC_ID_HDMV_PGS_SUBTITLE
&& !avctx
->width
)
3045 FAIL("unspecified size");
3047 case AVMEDIA_TYPE_DATA
:
3048 if (avctx
->codec_id
== AV_CODEC_ID_NONE
) return 1;
3054 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
3055 static int try_decode_frame(AVFormatContext
*s
, AVStream
*st
,
3056 const AVPacket
*avpkt
, AVDictionary
**options
)
3058 AVCodecContext
*avctx
= st
->internal
->avctx
;
3059 const AVCodec
*codec
;
3060 int got_picture
= 1, ret
= 0;
3061 AVFrame
*frame
= av_frame_alloc();
3062 AVSubtitle subtitle
;
3063 AVPacket pkt
= *avpkt
;
3064 int do_skip_frame
= 0;
3065 enum AVDiscard skip_frame
;
3068 return AVERROR(ENOMEM
);
3070 if (!avcodec_is_open(avctx
) &&
3071 st
->info
->found_decoder
<= 0 &&
3072 (st
->codecpar
->codec_id
!= -st
->info
->found_decoder
|| !st
->codecpar
->codec_id
)) {
3073 AVDictionary
*thread_opt
= NULL
;
3075 codec
= find_probe_decoder(s
, st
, st
->codecpar
->codec_id
);
3078 st
->info
->found_decoder
= -st
->codecpar
->codec_id
;
3083 /* Force thread count to 1 since the H.264 decoder will not extract
3084 * SPS and PPS to extradata during multi-threaded decoding. */
3085 av_dict_set(options
? options
: &thread_opt
, "threads", "1", 0);
3086 if (s
->codec_whitelist
)
3087 av_dict_set(options
? options
: &thread_opt
, "codec_whitelist", s
->codec_whitelist
, 0);
3088 ret
= avcodec_open2(avctx
, codec
, options
? options
: &thread_opt
);
3090 av_dict_free(&thread_opt
);
3092 st
->info
->found_decoder
= -avctx
->codec_id
;
3095 st
->info
->found_decoder
= 1;
3096 } else if (!st
->info
->found_decoder
)
3097 st
->info
->found_decoder
= 1;
3099 if (st
->info
->found_decoder
< 0) {
3104 if (avpriv_codec_get_cap_skip_frame_fill_param(avctx
->codec
)) {
3106 skip_frame
= avctx
->skip_frame
;
3107 avctx
->skip_frame
= AVDISCARD_ALL
;
3110 while ((pkt
.size
> 0 || (!pkt
.data
&& got_picture
)) &&
3112 (!has_codec_parameters(st
, NULL
) || !has_decode_delay_been_guessed(st
) ||
3113 (!st
->codec_info_nb_frames
&&
3114 (avctx
->codec
->capabilities
& AV_CODEC_CAP_CHANNEL_CONF
)))) {
3116 if (avctx
->codec_type
== AVMEDIA_TYPE_VIDEO
||
3117 avctx
->codec_type
== AVMEDIA_TYPE_AUDIO
) {
3118 ret
= avcodec_send_packet(avctx
, &pkt
);
3119 if (ret
< 0 && ret
!= AVERROR(EAGAIN
) && ret
!= AVERROR_EOF
)
3123 ret
= avcodec_receive_frame(avctx
, frame
);
3126 if (ret
== AVERROR(EAGAIN
) || ret
== AVERROR_EOF
)
3128 } else if (avctx
->codec_type
== AVMEDIA_TYPE_SUBTITLE
) {
3129 ret
= avcodec_decode_subtitle2(avctx
, &subtitle
,
3130 &got_picture
, &pkt
);
3132 avsubtitle_free(&subtitle
);
3138 st
->nb_decoded_frames
++;
3143 if (!pkt
.data
&& !got_picture
)
3147 if (do_skip_frame
) {
3148 avctx
->skip_frame
= skip_frame
;
3151 av_frame_free(&frame
);
3155 unsigned int ff_codec_get_tag(const AVCodecTag
*tags
, enum AVCodecID id
)
3157 while (tags
->id
!= AV_CODEC_ID_NONE
) {
3165 enum AVCodecID
ff_codec_get_id(const AVCodecTag
*tags
, unsigned int tag
)
3168 for (i
= 0; tags
[i
].id
!= AV_CODEC_ID_NONE
; i
++)
3169 if (tag
== tags
[i
].tag
)
3171 for (i
= 0; tags
[i
].id
!= AV_CODEC_ID_NONE
; i
++)
3172 if (avpriv_toupper4(tag
) == avpriv_toupper4(tags
[i
].tag
))
3174 return AV_CODEC_ID_NONE
;
3177 enum AVCodecID
ff_get_pcm_codec_id(int bps
, int flt
, int be
, int sflags
)
3179 if (bps
<= 0 || bps
> 64)
3180 return AV_CODEC_ID_NONE
;
3185 return be
? AV_CODEC_ID_PCM_F32BE
: AV_CODEC_ID_PCM_F32LE
;
3187 return be
? AV_CODEC_ID_PCM_F64BE
: AV_CODEC_ID_PCM_F64LE
;
3189 return AV_CODEC_ID_NONE
;
3194 if (sflags
& (1 << (bps
- 1))) {
3197 return AV_CODEC_ID_PCM_S8
;
3199 return be
? AV_CODEC_ID_PCM_S16BE
: AV_CODEC_ID_PCM_S16LE
;
3201 return be
? AV_CODEC_ID_PCM_S24BE
: AV_CODEC_ID_PCM_S24LE
;
3203 return be
? AV_CODEC_ID_PCM_S32BE
: AV_CODEC_ID_PCM_S32LE
;
3205 return be
? AV_CODEC_ID_PCM_S64BE
: AV_CODEC_ID_PCM_S64LE
;
3207 return AV_CODEC_ID_NONE
;
3212 return AV_CODEC_ID_PCM_U8
;
3214 return be
? AV_CODEC_ID_PCM_U16BE
: AV_CODEC_ID_PCM_U16LE
;
3216 return be
? AV_CODEC_ID_PCM_U24BE
: AV_CODEC_ID_PCM_U24LE
;
3218 return be
? AV_CODEC_ID_PCM_U32BE
: AV_CODEC_ID_PCM_U32LE
;
3220 return AV_CODEC_ID_NONE
;
3226 unsigned int av_codec_get_tag(const AVCodecTag
*const *tags
, enum AVCodecID id
)
3229 if (!av_codec_get_tag2(tags
, id
, &tag
))
3234 int av_codec_get_tag2(const AVCodecTag
* const *tags
, enum AVCodecID id
,
3238 for (i
= 0; tags
&& tags
[i
]; i
++) {
3239 const AVCodecTag
*codec_tags
= tags
[i
];
3240 while (codec_tags
->id
!= AV_CODEC_ID_NONE
) {
3241 if (codec_tags
->id
== id
) {
3242 *tag
= codec_tags
->tag
;
3251 enum AVCodecID
av_codec_get_id(const AVCodecTag
*const *tags
, unsigned int tag
)
3254 for (i
= 0; tags
&& tags
[i
]; i
++) {
3255 enum AVCodecID id
= ff_codec_get_id(tags
[i
], tag
);
3256 if (id
!= AV_CODEC_ID_NONE
)
3259 return AV_CODEC_ID_NONE
;
3262 static void compute_chapters_end(AVFormatContext
*s
)
3265 int64_t max_time
= 0;
3267 if (s
->duration
> 0 && s
->start_time
< INT64_MAX
- s
->duration
)
3268 max_time
= s
->duration
+
3269 ((s
->start_time
== AV_NOPTS_VALUE
) ? 0 : s
->start_time
);
3271 for (i
= 0; i
< s
->nb_chapters
; i
++)
3272 if (s
->chapters
[i
]->end
== AV_NOPTS_VALUE
) {
3273 AVChapter
*ch
= s
->chapters
[i
];
3274 int64_t end
= max_time
? av_rescale_q(max_time
, AV_TIME_BASE_Q
,
3278 for (j
= 0; j
< s
->nb_chapters
; j
++) {
3279 AVChapter
*ch1
= s
->chapters
[j
];
3280 int64_t next_start
= av_rescale_q(ch1
->start
, ch1
->time_base
,
3282 if (j
!= i
&& next_start
> ch
->start
&& next_start
< end
)
3285 ch
->end
= (end
== INT64_MAX
|| end
< ch
->start
) ? ch
->start
: end
;
3289 static int get_std_framerate(int i
)
3292 return (i
+ 1) * 1001;
3296 return (i
+ 31) * 1001 * 12;
3300 return ((const int[]) { 80, 120, 240})[i
] * 1001 * 12;
3304 return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i
] * 1000 * 12;
3307 /* Is the time base unreliable?
3308 * This is a heuristic to balance between quick acceptance of the values in
3309 * the headers vs. some extra checks.
3310 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
3311 * MPEG-2 commonly misuses field repeat flags to store different framerates.
3312 * And there are "variable" fps files this needs to detect as well. */
3313 static int tb_unreliable(AVCodecContext
*c
)
3315 if (c
->time_base
.den
>= 101LL * c
->time_base
.num
||
3316 c
->time_base
.den
< 5LL * c
->time_base
.num
||
3317 // c->codec_tag == AV_RL32("DIVX") ||
3318 // c->codec_tag == AV_RL32("XVID") ||
3319 c
->codec_tag
== AV_RL32("mp4v") ||
3320 c
->codec_id
== AV_CODEC_ID_MPEG2VIDEO
||
3321 c
->codec_id
== AV_CODEC_ID_GIF
||
3322 c
->codec_id
== AV_CODEC_ID_HEVC
||
3323 c
->codec_id
== AV_CODEC_ID_H264
)
3328 int ff_alloc_extradata(AVCodecParameters
*par
, int size
)
3330 av_freep(&par
->extradata
);
3331 par
->extradata_size
= 0;
3333 if (size
< 0 || size
>= INT32_MAX
- AV_INPUT_BUFFER_PADDING_SIZE
)
3334 return AVERROR(EINVAL
);
3336 par
->extradata
= av_malloc(size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
3337 if (!par
->extradata
)
3338 return AVERROR(ENOMEM
);
3340 memset(par
->extradata
+ size
, 0, AV_INPUT_BUFFER_PADDING_SIZE
);
3341 par
->extradata_size
= size
;
3346 int ff_get_extradata(AVFormatContext
*s
, AVCodecParameters
*par
, AVIOContext
*pb
, int size
)
3348 int ret
= ff_alloc_extradata(par
, size
);
3351 ret
= avio_read(pb
, par
->extradata
, size
);
3353 av_freep(&par
->extradata
);
3354 par
->extradata_size
= 0;
3355 av_log(s
, AV_LOG_ERROR
, "Failed to read extradata of size %d\n", size
);
3356 return ret
< 0 ? ret
: AVERROR_INVALIDDATA
;
3362 int ff_rfps_add_frame(AVFormatContext
*ic
, AVStream
*st
, int64_t ts
)
3365 int64_t last
= st
->info
->last_dts
;
3367 if ( ts
!= AV_NOPTS_VALUE
&& last
!= AV_NOPTS_VALUE
&& ts
> last
3368 && ts
- (uint64_t)last
< INT64_MAX
) {
3369 double dts
= (is_relative(ts
) ? ts
- RELATIVE_TS_BASE
: ts
) * av_q2d(st
->time_base
);
3370 int64_t duration
= ts
- last
;
3372 if (!st
->info
->duration_error
)
3373 st
->info
->duration_error
= av_mallocz(sizeof(st
->info
->duration_error
[0])*2);
3374 if (!st
->info
->duration_error
)
3375 return AVERROR(ENOMEM
);
3377 // if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3378 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
3379 for (i
= 0; i
<MAX_STD_TIMEBASES
; i
++) {
3380 if (st
->info
->duration_error
[0][1][i
] < 1e10
) {
3381 int framerate
= get_std_framerate(i
);
3382 double sdts
= dts
*framerate
/(1001*12);
3383 for (j
= 0; j
<2; j
++) {
3384 int64_t ticks
= llrint(sdts
+j
*0.5);
3385 double error
= sdts
- ticks
+ j
*0.5;
3386 st
->info
->duration_error
[j
][0][i
] += error
;
3387 st
->info
->duration_error
[j
][1][i
] += error
*error
;
3391 if (st
->info
->rfps_duration_sum
<= INT64_MAX
- duration
) {
3392 st
->info
->duration_count
++;
3393 st
->info
->rfps_duration_sum
+= duration
;
3396 if (st
->info
->duration_count
% 10 == 0) {
3397 int n
= st
->info
->duration_count
;
3398 for (i
= 0; i
<MAX_STD_TIMEBASES
; i
++) {
3399 if (st
->info
->duration_error
[0][1][i
] < 1e10
) {
3400 double a0
= st
->info
->duration_error
[0][0][i
] / n
;
3401 double error0
= st
->info
->duration_error
[0][1][i
] / n
- a0
*a0
;
3402 double a1
= st
->info
->duration_error
[1][0][i
] / n
;
3403 double error1
= st
->info
->duration_error
[1][1][i
] / n
- a1
*a1
;
3404 if (error0
> 0.04 && error1
> 0.04) {
3405 st
->info
->duration_error
[0][1][i
] = 2e10
;
3406 st
->info
->duration_error
[1][1][i
] = 2e10
;
3412 // ignore the first 4 values, they might have some random jitter
3413 if (st
->info
->duration_count
> 3 && is_relative(ts
) == is_relative(last
))
3414 st
->info
->duration_gcd
= av_gcd(st
->info
->duration_gcd
, duration
);
3416 if (ts
!= AV_NOPTS_VALUE
)
3417 st
->info
->last_dts
= ts
;
3422 void ff_rfps_calculate(AVFormatContext
*ic
)
3426 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3427 AVStream
*st
= ic
->streams
[i
];
3429 if (st
->codecpar
->codec_type
!= AVMEDIA_TYPE_VIDEO
)
3431 // the check for tb_unreliable() is not completely correct, since this is not about handling
3432 // an unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3433 // ipmovie.c produces.
3434 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
)
3435 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
);
3436 if (st
->info
->duration_count
>1 && !st
->r_frame_rate
.num
3437 && tb_unreliable(st
->internal
->avctx
)) {
3439 double best_error
= 0.01;
3440 AVRational ref_rate
= st
->r_frame_rate
.num
? st
->r_frame_rate
: av_inv_q(st
->time_base
);
3442 for (j
= 0; j
<MAX_STD_TIMEBASES
; j
++) {
3445 if (st
->info
->codec_info_duration
&&
3446 st
->info
->codec_info_duration
*av_q2d(st
->time_base
) < (1001*11.5)/get_std_framerate(j
))
3448 if (!st
->info
->codec_info_duration
&& get_std_framerate(j
) < 1001*12)
3451 if (av_q2d(st
->time_base
) * st
->info
->rfps_duration_sum
/ st
->info
->duration_count
< (1001*12.0 * 0.8)/get_std_framerate(j
))
3454 for (k
= 0; k
<2; k
++) {
3455 int n
= st
->info
->duration_count
;
3456 double a
= st
->info
->duration_error
[k
][0][j
] / n
;
3457 double error
= st
->info
->duration_error
[k
][1][j
]/n
- a
*a
;
3459 if (error
< best_error
&& best_error
> 0.000000001) {
3461 num
= get_std_framerate(j
);
3464 av_log(ic
, AV_LOG_DEBUG
, "rfps: %f %f\n", get_std_framerate(j
) / 12.0/1001, error
);
3467 // do not increase frame rate by more than 1 % in order to match a standard rate.
3468 if (num
&& (!ref_rate
.num
|| (double)num
/(12*1001) < 1.01 * av_q2d(ref_rate
)))
3469 av_reduce(&st
->r_frame_rate
.num
, &st
->r_frame_rate
.den
, num
, 12*1001, INT_MAX
);
3471 if ( !st
->avg_frame_rate
.num
3472 && st
->r_frame_rate
.num
&& st
->info
->rfps_duration_sum
3473 && st
->info
->codec_info_duration
<= 0
3474 && st
->info
->duration_count
> 2
3475 && 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
3477 av_log(ic
, AV_LOG_DEBUG
, "Setting avg frame rate based on r frame rate\n");
3478 st
->avg_frame_rate
= st
->r_frame_rate
;
3481 av_freep(&st
->info
->duration_error
);
3482 st
->info
->last_dts
= AV_NOPTS_VALUE
;
3483 st
->info
->duration_count
= 0;
3484 st
->info
->rfps_duration_sum
= 0;
3488 static int extract_extradata_check(AVStream
*st
)
3490 const AVBitStreamFilter
*f
;
3492 f
= av_bsf_get_by_name("extract_extradata");
3497 const enum AVCodecID
*ids
;
3498 for (ids
= f
->codec_ids
; *ids
!= AV_CODEC_ID_NONE
; ids
++)
3499 if (*ids
== st
->codecpar
->codec_id
)
3506 static int extract_extradata_init(AVStream
*st
)
3508 AVStreamInternal
*sti
= st
->internal
;
3509 const AVBitStreamFilter
*f
;
3512 f
= av_bsf_get_by_name("extract_extradata");
3516 /* check that the codec id is supported */
3517 ret
= extract_extradata_check(st
);
3521 sti
->extract_extradata
.pkt
= av_packet_alloc();
3522 if (!sti
->extract_extradata
.pkt
)
3523 return AVERROR(ENOMEM
);
3525 ret
= av_bsf_alloc(f
, &sti
->extract_extradata
.bsf
);
3529 ret
= avcodec_parameters_copy(sti
->extract_extradata
.bsf
->par_in
,
3534 sti
->extract_extradata
.bsf
->time_base_in
= st
->time_base
;
3536 ret
= av_bsf_init(sti
->extract_extradata
.bsf
);
3541 sti
->extract_extradata
.inited
= 1;
3545 av_bsf_free(&sti
->extract_extradata
.bsf
);
3546 av_packet_free(&sti
->extract_extradata
.pkt
);
3550 static int extract_extradata(AVStream
*st
, const AVPacket
*pkt
)
3552 AVStreamInternal
*sti
= st
->internal
;
3556 if (!sti
->extract_extradata
.inited
) {
3557 ret
= extract_extradata_init(st
);
3562 if (sti
->extract_extradata
.inited
&& !sti
->extract_extradata
.bsf
)
3565 pkt_ref
= sti
->extract_extradata
.pkt
;
3566 ret
= av_packet_ref(pkt_ref
, pkt
);
3570 ret
= av_bsf_send_packet(sti
->extract_extradata
.bsf
, pkt_ref
);
3572 av_packet_unref(pkt_ref
);
3576 while (ret
>= 0 && !sti
->avctx
->extradata
) {
3580 ret
= av_bsf_receive_packet(sti
->extract_extradata
.bsf
, pkt_ref
);
3582 if (ret
!= AVERROR(EAGAIN
) && ret
!= AVERROR_EOF
)
3587 extradata
= av_packet_get_side_data(pkt_ref
, AV_PKT_DATA_NEW_EXTRADATA
,
3591 av_assert0(!sti
->avctx
->extradata
);
3592 if ((unsigned)extradata_size
< FF_MAX_EXTRADATA_SIZE
)
3593 sti
->avctx
->extradata
= av_mallocz(extradata_size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
3594 if (!sti
->avctx
->extradata
) {
3595 av_packet_unref(pkt_ref
);
3596 return AVERROR(ENOMEM
);
3598 memcpy(sti
->avctx
->extradata
, extradata
, extradata_size
);
3599 sti
->avctx
->extradata_size
= extradata_size
;
3601 av_packet_unref(pkt_ref
);
3607 static int add_coded_side_data(AVStream
*st
, AVCodecContext
*avctx
)
3611 for (i
= 0; i
< avctx
->nb_coded_side_data
; i
++) {
3612 const AVPacketSideData
*sd_src
= &avctx
->coded_side_data
[i
];
3614 dst_data
= av_stream_new_side_data(st
, sd_src
->type
, sd_src
->size
);
3616 return AVERROR(ENOMEM
);
3617 memcpy(dst_data
, sd_src
->data
, sd_src
->size
);
3622 int avformat_find_stream_info(AVFormatContext
*ic
, AVDictionary
**options
)
3624 int i
, count
= 0, ret
= 0, j
;
3627 AVCodecContext
*avctx
;
3629 int64_t old_offset
= avio_tell(ic
->pb
);
3630 // new streams might appear, no options for those
3631 int orig_nb_streams
= ic
->nb_streams
;
3633 int64_t max_analyze_duration
= ic
->max_analyze_duration
;
3634 int64_t max_stream_analyze_duration
;
3635 int64_t max_subtitle_analyze_duration
;
3636 int64_t probesize
= ic
->probesize
;
3637 int eof_reached
= 0;
3638 int *missing_streams
= av_opt_ptr(ic
->iformat
->priv_class
, ic
->priv_data
, "missing_streams");
3640 flush_codecs
= probesize
> 0;
3642 av_opt_set(ic
, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN
);
3644 max_stream_analyze_duration
= max_analyze_duration
;
3645 max_subtitle_analyze_duration
= max_analyze_duration
;
3646 if (!max_analyze_duration
) {
3647 max_stream_analyze_duration
=
3648 max_analyze_duration
= 5*AV_TIME_BASE
;
3649 max_subtitle_analyze_duration
= 30*AV_TIME_BASE
;
3650 if (!strcmp(ic
->iformat
->name
, "flv"))
3651 max_stream_analyze_duration
= 90*AV_TIME_BASE
;
3652 if (!strcmp(ic
->iformat
->name
, "mpeg") || !strcmp(ic
->iformat
->name
, "mpegts"))
3653 max_stream_analyze_duration
= 7*AV_TIME_BASE
;
3657 av_log(ic
, AV_LOG_DEBUG
, "Before avformat_find_stream_info() pos: %"PRId64
" bytes read:%"PRId64
" seeks:%d nb_streams:%d\n",
3658 avio_tell(ic
->pb
), ic
->pb
->bytes_read
, ic
->pb
->seek_count
, ic
->nb_streams
);
3660 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3661 const AVCodec
*codec
;
3662 AVDictionary
*thread_opt
= NULL
;
3663 st
= ic
->streams
[i
];
3664 avctx
= st
->internal
->avctx
;
3666 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
||
3667 st
->codecpar
->codec_type
== AVMEDIA_TYPE_SUBTITLE
) {
3668 /* if (!st->time_base.num)
3670 if (!avctx
->time_base
.num
)
3671 avctx
->time_base
= st
->time_base
;
3674 /* check if the caller has overridden the codec id */
3675 #if FF_API_LAVF_AVCTX
3676 FF_DISABLE_DEPRECATION_WARNINGS
3677 if (st
->codec
->codec_id
!= st
->internal
->orig_codec_id
) {
3678 st
->codecpar
->codec_id
= st
->codec
->codec_id
;
3679 st
->codecpar
->codec_type
= st
->codec
->codec_type
;
3680 st
->internal
->orig_codec_id
= st
->codec
->codec_id
;
3682 FF_ENABLE_DEPRECATION_WARNINGS
3684 // only for the split stuff
3685 if (!st
->parser
&& !(ic
->flags
& AVFMT_FLAG_NOPARSE
) && st
->request_probe
<= 0) {
3686 st
->parser
= av_parser_init(st
->codecpar
->codec_id
);
3688 if (st
->need_parsing
== AVSTREAM_PARSE_HEADERS
) {
3689 st
->parser
->flags
|= PARSER_FLAG_COMPLETE_FRAMES
;
3690 } else if (st
->need_parsing
== AVSTREAM_PARSE_FULL_RAW
) {
3691 st
->parser
->flags
|= PARSER_FLAG_USE_CODEC_TS
;
3693 } else if (st
->need_parsing
) {
3694 av_log(ic
, AV_LOG_VERBOSE
, "parser not found for codec "
3695 "%s, packets or times may be invalid.\n",
3696 avcodec_get_name(st
->codecpar
->codec_id
));
3700 if (st
->codecpar
->codec_id
!= st
->internal
->orig_codec_id
)
3701 st
->internal
->orig_codec_id
= st
->codecpar
->codec_id
;
3703 ret
= avcodec_parameters_to_context(avctx
, st
->codecpar
);
3705 goto find_stream_info_err
;
3706 if (st
->request_probe
<= 0)
3707 st
->internal
->avctx_inited
= 1;
3709 codec
= find_probe_decoder(ic
, st
, st
->codecpar
->codec_id
);
3711 /* Force thread count to 1 since the H.264 decoder will not extract
3712 * SPS and PPS to extradata during multi-threaded decoding. */
3713 av_dict_set(options
? &options
[i
] : &thread_opt
, "threads", "1", 0);
3715 if (ic
->codec_whitelist
)
3716 av_dict_set(options
? &options
[i
] : &thread_opt
, "codec_whitelist", ic
->codec_whitelist
, 0);
3718 /* Ensure that subtitle_header is properly set. */
3719 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_SUBTITLE
3720 && codec
&& !avctx
->codec
) {
3721 if (avcodec_open2(avctx
, codec
, options
? &options
[i
] : &thread_opt
) < 0)
3722 av_log(ic
, AV_LOG_WARNING
,
3723 "Failed to open codec in %s\n",__FUNCTION__
);
3726 // Try to just open decoders, in case this is enough to get parameters.
3727 if (!has_codec_parameters(st
, NULL
) && st
->request_probe
<= 0) {
3728 if (codec
&& !avctx
->codec
)
3729 if (avcodec_open2(avctx
, codec
, options
? &options
[i
] : &thread_opt
) < 0)
3730 av_log(ic
, AV_LOG_WARNING
,
3731 "Failed to open codec in %s\n",__FUNCTION__
);
3734 av_dict_free(&thread_opt
);
3737 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3738 #if FF_API_R_FRAME_RATE
3739 ic
->streams
[i
]->info
->last_dts
= AV_NOPTS_VALUE
;
3741 ic
->streams
[i
]->info
->fps_first_dts
= AV_NOPTS_VALUE
;
3742 ic
->streams
[i
]->info
->fps_last_dts
= AV_NOPTS_VALUE
;
3747 const AVPacket
*pkt
;
3748 int analyzed_all_streams
;
3749 if (ff_check_interrupt(&ic
->interrupt_callback
)) {
3751 av_log(ic
, AV_LOG_DEBUG
, "interrupted\n");
3755 /* check if one codec still needs to be handled */
3756 for (i
= 0; i
< ic
->nb_streams
; i
++) {
3757 int fps_analyze_framecount
= 20;
3760 st
= ic
->streams
[i
];
3761 if (!has_codec_parameters(st
, NULL
))
3763 /* If the timebase is coarse (like the usual millisecond precision
3764 * of mkv), we need to analyze more frames to reliably arrive at
3765 * the correct fps. */
3766 if (av_q2d(st
->time_base
) > 0.0005)
3767 fps_analyze_framecount
*= 2;
3768 if (!tb_unreliable(st
->internal
->avctx
))
3769 fps_analyze_framecount
= 0;
3770 if (ic
->fps_probe_size
>= 0)
3771 fps_analyze_framecount
= ic
->fps_probe_size
;
3772 if (st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
)
3773 fps_analyze_framecount
= 0;
3774 /* variable fps and no guess at the real fps */
3775 count
= (ic
->iformat
->flags
& AVFMT_NOTIMESTAMPS
) ?
3776 st
->info
->codec_info_duration_fields
/2 :
3777 st
->info
->duration_count
;
3778 if (!(st
->r_frame_rate
.num
&& st
->avg_frame_rate
.num
) &&
3779 st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
) {
3780 if (count
< fps_analyze_framecount
)
3783 // Look at the first 3 frames if there is evidence of frame delay
3784 // but the decoder delay is not set.
3785 if (st
->info
->frame_delay_evidence
&& count
< 2 && st
->internal
->avctx
->has_b_frames
== 0)
3787 if (!st
->internal
->avctx
->extradata
&&
3788 (!st
->internal
->extract_extradata
.inited
||
3789 st
->internal
->extract_extradata
.bsf
) &&
3790 extract_extradata_check(st
))
3792 if (st
->first_dts
== AV_NOPTS_VALUE
&&
3793 !(ic
->iformat
->flags
& AVFMT_NOTIMESTAMPS
) &&
3794 st
->codec_info_nb_frames
< ((st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
) ? 1 : ic
->max_ts_probe
) &&
3795 (st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
||
3796 st
->codecpar
->codec_type
== AVMEDIA_TYPE_AUDIO
))
3799 analyzed_all_streams
= 0;
3800 if (!missing_streams
|| !*missing_streams
)
3801 if (i
== ic
->nb_streams
) {
3802 analyzed_all_streams
= 1;
3803 /* NOTE: If the format has no header, then we need to read some
3804 * packets to get most of the streams, so we cannot stop here. */
3805 if (!(ic
->ctx_flags
& AVFMTCTX_NOHEADER
)) {
3806 /* If we found the info for all the codecs, we can stop. */
3808 av_log(ic
, AV_LOG_DEBUG
, "All info found\n");
3813 /* We did not get all the codec info, but we read too much data. */
3814 if (read_size
>= probesize
) {
3816 av_log(ic
, AV_LOG_DEBUG
,
3817 "Probe buffer size limit of %"PRId64
" bytes reached\n", probesize
);
3818 for (i
= 0; i
< ic
->nb_streams
; i
++)
3819 if (!ic
->streams
[i
]->r_frame_rate
.num
&&
3820 ic
->streams
[i
]->info
->duration_count
<= 1 &&
3821 ic
->streams
[i
]->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
&&
3822 strcmp(ic
->iformat
->name
, "image2"))
3823 av_log(ic
, AV_LOG_WARNING
,
3824 "Stream #%d: not enough frames to estimate rate; "
3825 "consider increasing probesize\n", i
);
3829 /* NOTE: A new stream can be added there if no header in file
3830 * (AVFMTCTX_NOHEADER). */
3831 ret
= read_frame_internal(ic
, &pkt1
);
3832 if (ret
== AVERROR(EAGAIN
))
3841 if (!(ic
->flags
& AVFMT_FLAG_NOBUFFER
)) {
3842 ret
= ff_packet_list_put(&ic
->internal
->packet_buffer
,
3843 &ic
->internal
->packet_buffer_end
,
3846 goto unref_then_goto_end
;
3848 pkt
= &ic
->internal
->packet_buffer_end
->pkt
;
3853 st
= ic
->streams
[pkt
->stream_index
];
3854 if (!(st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
))
3855 read_size
+= pkt
->size
;
3857 avctx
= st
->internal
->avctx
;
3858 if (!st
->internal
->avctx_inited
) {
3859 ret
= avcodec_parameters_to_context(avctx
, st
->codecpar
);
3861 goto unref_then_goto_end
;
3862 st
->internal
->avctx_inited
= 1;
3865 if (pkt
->dts
!= AV_NOPTS_VALUE
&& st
->codec_info_nb_frames
> 1) {
3866 /* check for non-increasing dts */
3867 if (st
->info
->fps_last_dts
!= AV_NOPTS_VALUE
&&
3868 st
->info
->fps_last_dts
>= pkt
->dts
) {
3869 av_log(ic
, AV_LOG_DEBUG
,
3870 "Non-increasing DTS in stream %d: packet %d with DTS "
3871 "%"PRId64
", packet %d with DTS %"PRId64
"\n",
3872 st
->index
, st
->info
->fps_last_dts_idx
,
3873 st
->info
->fps_last_dts
, st
->codec_info_nb_frames
,
3875 st
->info
->fps_first_dts
=
3876 st
->info
->fps_last_dts
= AV_NOPTS_VALUE
;
3878 /* Check for a discontinuity in dts. If the difference in dts
3879 * is more than 1000 times the average packet duration in the
3880 * sequence, we treat it as a discontinuity. */
3881 if (st
->info
->fps_last_dts
!= AV_NOPTS_VALUE
&&
3882 st
->info
->fps_last_dts_idx
> st
->info
->fps_first_dts_idx
&&
3883 (pkt
->dts
- (uint64_t)st
->info
->fps_last_dts
) / 1000 >
3884 (st
->info
->fps_last_dts
- (uint64_t)st
->info
->fps_first_dts
) /
3885 (st
->info
->fps_last_dts_idx
- st
->info
->fps_first_dts_idx
)) {
3886 av_log(ic
, AV_LOG_WARNING
,
3887 "DTS discontinuity in stream %d: packet %d with DTS "
3888 "%"PRId64
", packet %d with DTS %"PRId64
"\n",
3889 st
->index
, st
->info
->fps_last_dts_idx
,
3890 st
->info
->fps_last_dts
, st
->codec_info_nb_frames
,
3892 st
->info
->fps_first_dts
=
3893 st
->info
->fps_last_dts
= AV_NOPTS_VALUE
;
3896 /* update stored dts values */
3897 if (st
->info
->fps_first_dts
== AV_NOPTS_VALUE
) {
3898 st
->info
->fps_first_dts
= pkt
->dts
;
3899 st
->info
->fps_first_dts_idx
= st
->codec_info_nb_frames
;
3901 st
->info
->fps_last_dts
= pkt
->dts
;
3902 st
->info
->fps_last_dts_idx
= st
->codec_info_nb_frames
;
3904 if (st
->codec_info_nb_frames
>1) {
3908 if (st
->time_base
.den
> 0)
3909 t
= av_rescale_q(st
->info
->codec_info_duration
, st
->time_base
, AV_TIME_BASE_Q
);
3910 if (st
->avg_frame_rate
.num
> 0)
3911 t
= FFMAX(t
, av_rescale_q(st
->codec_info_nb_frames
, av_inv_q(st
->avg_frame_rate
), AV_TIME_BASE_Q
));
3914 && st
->codec_info_nb_frames
>30
3915 && st
->info
->fps_first_dts
!= AV_NOPTS_VALUE
3916 && st
->info
->fps_last_dts
!= AV_NOPTS_VALUE
)
3917 t
= FFMAX(t
, av_rescale_q(st
->info
->fps_last_dts
- st
->info
->fps_first_dts
, st
->time_base
, AV_TIME_BASE_Q
));
3919 if (analyzed_all_streams
) limit
= max_analyze_duration
;
3920 else if (avctx
->codec_type
== AVMEDIA_TYPE_SUBTITLE
) limit
= max_subtitle_analyze_duration
;
3921 else limit
= max_stream_analyze_duration
;
3924 av_log(ic
, AV_LOG_VERBOSE
, "max_analyze_duration %"PRId64
" reached at %"PRId64
" microseconds st:%d\n",
3926 t
, pkt
->stream_index
);
3927 if (ic
->flags
& AVFMT_FLAG_NOBUFFER
)
3928 av_packet_unref(&pkt1
);
3931 if (pkt
->duration
) {
3932 if (avctx
->codec_type
== AVMEDIA_TYPE_SUBTITLE
&& pkt
->pts
!= AV_NOPTS_VALUE
&& st
->start_time
!= AV_NOPTS_VALUE
&& pkt
->pts
>= st
->start_time
) {
3933 st
->info
->codec_info_duration
= FFMIN(pkt
->pts
- st
->start_time
, st
->info
->codec_info_duration
+ pkt
->duration
);
3935 st
->info
->codec_info_duration
+= pkt
->duration
;
3936 st
->info
->codec_info_duration_fields
+= st
->parser
&& st
->need_parsing
&& avctx
->ticks_per_frame
==2 ? st
->parser
->repeat_pict
+ 1 : 2;
3939 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_VIDEO
) {
3940 #if FF_API_R_FRAME_RATE
3941 ff_rfps_add_frame(ic
, st
, pkt
->dts
);
3943 if (pkt
->dts
!= pkt
->pts
&& pkt
->dts
!= AV_NOPTS_VALUE
&& pkt
->pts
!= AV_NOPTS_VALUE
)
3944 st
->info
->frame_delay_evidence
= 1;
3946 if (!st
->internal
->avctx
->extradata
) {
3947 ret
= extract_extradata(st
, pkt
);
3949 goto unref_then_goto_end
;
3952 /* If still no information, we try to open the codec and to
3953 * decompress the frame. We try to avoid that in most cases as
3954 * it takes longer and uses more memory. For MPEG-4, we need to
3955 * decompress for QuickTime.
3957 * If AV_CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3958 * least one frame of codec data, this makes sure the codec initializes
3959 * the channel configuration and does not only trust the values from
3961 try_decode_frame(ic
, st
, pkt
,
3962 (options
&& i
< orig_nb_streams
) ? &options
[i
] : NULL
);
3964 if (ic
->flags
& AVFMT_FLAG_NOBUFFER
)
3965 av_packet_unref(&pkt1
);
3967 st
->codec_info_nb_frames
++;
3973 for (stream_index
= 0; stream_index
< ic
->nb_streams
; stream_index
++) {
3974 st
= ic
->streams
[stream_index
];
3975 avctx
= st
->internal
->avctx
;
3976 if (!has_codec_parameters(st
, NULL
)) {
3977 const AVCodec
*codec
= find_probe_decoder(ic
, st
, st
->codecpar
->codec_id
);
3978 if (codec
&& !avctx
->codec
) {
3979 AVDictionary
*opts
= NULL
;
3980 if (ic
->codec_whitelist
)
3981 av_dict_set(&opts
, "codec_whitelist", ic
->codec_whitelist
, 0);
3982 if (avcodec_open2(avctx
, codec
, (options
&& stream_index
< orig_nb_streams
) ? &options
[stream_index
] : &opts
) < 0)
3983 av_log(ic
, AV_LOG_WARNING
,
3984 "Failed to open codec in %s\n",__FUNCTION__
);
3985 av_dict_free(&opts
);
3989 // EOF already reached while reading the stream above.
3990 // So continue with reoordering DTS with whatever delay we have.
3991 if (ic
->internal
->packet_buffer
&& !has_decode_delay_been_guessed(st
)) {
3992 update_dts_from_pts(ic
, stream_index
, ic
->internal
->packet_buffer
);
3998 AVPacket empty_pkt
= { 0 };
4000 av_init_packet(&empty_pkt
);
4002 for (i
= 0; i
< ic
->nb_streams
; i
++) {
4004 st
= ic
->streams
[i
];
4006 /* flush the decoders */
4007 if (st
->info
->found_decoder
== 1) {
4009 err
= try_decode_frame(ic
, st
, &empty_pkt
,
4010 (options
&& i
< orig_nb_streams
)
4011 ? &options
[i
] : NULL
);
4012 } while (err
> 0 && !has_codec_parameters(st
, NULL
));
4015 av_log(ic
, AV_LOG_INFO
,
4016 "decoding for stream %d failed\n", st
->index
);
4022 ff_rfps_calculate(ic
);
4024 for (i
= 0; i
< ic
->nb_streams
; i
++) {
4025 st
= ic
->streams
[i
];
4026 avctx
= st
->internal
->avctx
;
4027 if (avctx
->codec_type
== AVMEDIA_TYPE_VIDEO
) {
4028 if (avctx
->codec_id
== AV_CODEC_ID_RAWVIDEO
&& !avctx
->codec_tag
&& !avctx
->bits_per_coded_sample
) {
4029 uint32_t tag
= avcodec_pix_fmt_to_codec_tag(avctx
->pix_fmt
);
4030 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag
) == avctx
->pix_fmt
)
4031 avctx
->codec_tag
= tag
;
4034 /* estimate average framerate if not set by demuxer */
4035 if (st
->info
->codec_info_duration_fields
&&
4036 !st
->avg_frame_rate
.num
&&
4037 st
->info
->codec_info_duration
) {
4039 double best_error
= 0.01;
4040 AVRational codec_frame_rate
= avctx
->framerate
;
4042 if (st
->info
->codec_info_duration
>= INT64_MAX
/ st
->time_base
.num
/ 2||
4043 st
->info
->codec_info_duration_fields
>= INT64_MAX
/ st
->time_base
.den
||
4044 st
->info
->codec_info_duration
< 0)
4046 av_reduce(&st
->avg_frame_rate
.num
, &st
->avg_frame_rate
.den
,
4047 st
->info
->codec_info_duration_fields
* (int64_t) st
->time_base
.den
,
4048 st
->info
->codec_info_duration
* 2 * (int64_t) st
->time_base
.num
, 60000);
4050 /* Round guessed framerate to a "standard" framerate if it's
4051 * within 1% of the original estimate. */
4052 for (j
= 0; j
< MAX_STD_TIMEBASES
; j
++) {
4053 AVRational std_fps
= { get_std_framerate(j
), 12 * 1001 };
4054 double error
= fabs(av_q2d(st
->avg_frame_rate
) /
4055 av_q2d(std_fps
) - 1);
4057 if (error
< best_error
) {
4059 best_fps
= std_fps
.num
;
4062 if (ic
->internal
->prefer_codec_framerate
&& codec_frame_rate
.num
> 0 && codec_frame_rate
.den
> 0) {
4063 error
= fabs(av_q2d(codec_frame_rate
) /
4064 av_q2d(std_fps
) - 1);
4065 if (error
< best_error
) {
4067 best_fps
= std_fps
.num
;
4072 av_reduce(&st
->avg_frame_rate
.num
, &st
->avg_frame_rate
.den
,
4073 best_fps
, 12 * 1001, INT_MAX
);
4076 if (!st
->r_frame_rate
.num
) {
4077 if ( avctx
->time_base
.den
* (int64_t) st
->time_base
.num
4078 <= avctx
->time_base
.num
* (uint64_t)avctx
->ticks_per_frame
* st
->time_base
.den
) {
4079 av_reduce(&st
->r_frame_rate
.num
, &st
->r_frame_rate
.den
,
4080 avctx
->time_base
.den
, (int64_t)avctx
->time_base
.num
* avctx
->ticks_per_frame
, INT_MAX
);
4082 st
->r_frame_rate
.num
= st
->time_base
.den
;
4083 st
->r_frame_rate
.den
= st
->time_base
.num
;
4086 if (st
->display_aspect_ratio
.num
&& st
->display_aspect_ratio
.den
) {
4087 AVRational hw_ratio
= { avctx
->height
, avctx
->width
};
4088 st
->sample_aspect_ratio
= av_mul_q(st
->display_aspect_ratio
,
4091 } else if (avctx
->codec_type
== AVMEDIA_TYPE_AUDIO
) {
4092 if (!avctx
->bits_per_coded_sample
)
4093 avctx
->bits_per_coded_sample
=
4094 av_get_bits_per_sample(avctx
->codec_id
);
4095 // set stream disposition based on audio service type
4096 switch (avctx
->audio_service_type
) {
4097 case AV_AUDIO_SERVICE_TYPE_EFFECTS
:
4098 st
->disposition
= AV_DISPOSITION_CLEAN_EFFECTS
;
4100 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED
:
4101 st
->disposition
= AV_DISPOSITION_VISUAL_IMPAIRED
;
4103 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED
:
4104 st
->disposition
= AV_DISPOSITION_HEARING_IMPAIRED
;
4106 case AV_AUDIO_SERVICE_TYPE_COMMENTARY
:
4107 st
->disposition
= AV_DISPOSITION_COMMENT
;
4109 case AV_AUDIO_SERVICE_TYPE_KARAOKE
:
4110 st
->disposition
= AV_DISPOSITION_KARAOKE
;
4117 estimate_timings(ic
, old_offset
);
4119 av_opt_set(ic
, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN
);
4121 if (ret
>= 0 && ic
->nb_streams
)
4122 /* We could not have all the codec parameters before EOF. */
4124 for (i
= 0; i
< ic
->nb_streams
; i
++) {
4126 st
= ic
->streams
[i
];
4128 /* if no packet was ever seen, update context now for has_codec_parameters */
4129 if (!st
->internal
->avctx_inited
) {
4130 if (st
->codecpar
->codec_type
== AVMEDIA_TYPE_AUDIO
&&
4131 st
->codecpar
->format
== AV_SAMPLE_FMT_NONE
)
4132 st
->codecpar
->format
= st
->internal
->avctx
->sample_fmt
;
4133 ret
= avcodec_parameters_to_context(st
->internal
->avctx
, st
->codecpar
);
4135 goto find_stream_info_err
;
4137 if (!has_codec_parameters(st
, &errmsg
)) {
4139 avcodec_string(buf
, sizeof(buf
), st
->internal
->avctx
, 0);
4140 av_log(ic
, AV_LOG_WARNING
,
4141 "Could not find codec parameters for stream %d (%s): %s\n"
4142 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
4149 compute_chapters_end(ic
);
4151 /* update the stream parameters from the internal codec contexts */
4152 for (i
= 0; i
< ic
->nb_streams
; i
++) {
4153 st
= ic
->streams
[i
];
4155 if (st
->internal
->avctx_inited
) {
4156 int orig_w
= st
->codecpar
->width
;
4157 int orig_h
= st
->codecpar
->height
;
4158 ret
= avcodec_parameters_from_context(st
->codecpar
, st
->internal
->avctx
);
4160 goto find_stream_info_err
;
4161 ret
= add_coded_side_data(st
, st
->internal
->avctx
);
4163 goto find_stream_info_err
;
4165 // The decoder might reduce the video size by the lowres factor.
4166 if (st
->internal
->avctx
->lowres
&& orig_w
) {
4167 st
->codecpar
->width
= orig_w
;
4168 st
->codecpar
->height
= orig_h
;
4173 #if FF_API_LAVF_AVCTX
4174 FF_DISABLE_DEPRECATION_WARNINGS
4175 ret
= avcodec_parameters_to_context(st
->codec
, st
->codecpar
);
4177 goto find_stream_info_err
;
4180 // The old API (AVStream.codec) "requires" the resolution to be adjusted
4181 // by the lowres factor.
4182 if (st
->internal
->avctx
->lowres
&& st
->internal
->avctx
->width
) {
4183 st
->codec
->lowres
= st
->internal
->avctx
->lowres
;
4184 st
->codec
->width
= st
->internal
->avctx
->width
;
4185 st
->codec
->height
= st
->internal
->avctx
->height
;
4189 if (st
->codec
->codec_tag
!= MKTAG('t','m','c','d')) {
4190 st
->codec
->time_base
= st
->internal
->avctx
->time_base
;
4191 st
->codec
->ticks_per_frame
= st
->internal
->avctx
->ticks_per_frame
;
4193 st
->codec
->framerate
= st
->avg_frame_rate
;
4195 if (st
->internal
->avctx
->subtitle_header
) {
4196 st
->codec
->subtitle_header
= av_malloc(st
->internal
->avctx
->subtitle_header_size
);
4197 if (!st
->codec
->subtitle_header
)
4198 goto find_stream_info_err
;
4199 st
->codec
->subtitle_header_size
= st
->internal
->avctx
->subtitle_header_size
;
4200 memcpy(st
->codec
->subtitle_header
, st
->internal
->avctx
->subtitle_header
,
4201 st
->codec
->subtitle_header_size
);
4204 // Fields unavailable in AVCodecParameters
4205 st
->codec
->coded_width
= st
->internal
->avctx
->coded_width
;
4206 st
->codec
->coded_height
= st
->internal
->avctx
->coded_height
;
4207 st
->codec
->properties
= st
->internal
->avctx
->properties
;
4208 FF_ENABLE_DEPRECATION_WARNINGS
4211 st
->internal
->avctx_inited
= 0;
4214 find_stream_info_err
:
4215 for (i
= 0; i
< ic
->nb_streams
; i
++) {
4216 st
= ic
->streams
[i
];
4218 av_freep(&st
->info
->duration_error
);
4219 avcodec_close(ic
->streams
[i
]->internal
->avctx
);
4220 av_freep(&ic
->streams
[i
]->info
);
4221 av_bsf_free(&ic
->streams
[i
]->internal
->extract_extradata
.bsf
);
4222 av_packet_free(&ic
->streams
[i
]->internal
->extract_extradata
.pkt
);
4225 av_log(ic
, AV_LOG_DEBUG
, "After avformat_find_stream_info() pos: %"PRId64
" bytes read:%"PRId64
" seeks:%d frames:%d\n",
4226 avio_tell(ic
->pb
), ic
->pb
->bytes_read
, ic
->pb
->seek_count
, count
);
4229 unref_then_goto_end
:
4230 av_packet_unref(&pkt1
);
4231 goto find_stream_info_err
;
4234 AVProgram
*av_find_program_from_stream(AVFormatContext
*ic
, AVProgram
*last
, int s
)
4238 for (i
= 0; i
< ic
->nb_programs
; i
++) {
4239 if (ic
->programs
[i
] == last
) {
4243 for (j
= 0; j
< ic
->programs
[i
]->nb_stream_indexes
; j
++)
4244 if (ic
->programs
[i
]->stream_index
[j
] == s
)
4245 return ic
->programs
[i
];
4251 int av_find_best_stream(AVFormatContext
*ic
, enum AVMediaType type
,
4252 int wanted_stream_nb
, int related_stream
,
4253 AVCodec
**decoder_ret
, int flags
)
4255 int i
, nb_streams
= ic
->nb_streams
;
4256 int ret
= AVERROR_STREAM_NOT_FOUND
;
4257 int best_count
= -1, best_multiframe
= -1, best_disposition
= -1;
4258 int count
, multiframe
, disposition
;
4259 int64_t best_bitrate
= -1;
4261 unsigned *program
= NULL
;
4262 const AVCodec
*decoder
= NULL
, *best_decoder
= NULL
;
4264 if (related_stream
>= 0 && wanted_stream_nb
< 0) {
4265 AVProgram
*p
= av_find_program_from_stream(ic
, NULL
, related_stream
);
4267 program
= p
->stream_index
;
4268 nb_streams
= p
->nb_stream_indexes
;
4271 for (i
= 0; i
< nb_streams
; i
++) {
4272 int real_stream_index
= program
? program
[i
] : i
;
4273 AVStream
*st
= ic
->streams
[real_stream_index
];
4274 AVCodecParameters
*par
= st
->codecpar
;
4275 if (par
->codec_type
!= type
)
4277 if (wanted_stream_nb
>= 0 && real_stream_index
!= wanted_stream_nb
)
4279 if (type
== AVMEDIA_TYPE_AUDIO
&& !(par
->channels
&& par
->sample_rate
))
4282 decoder
= find_decoder(ic
, st
, par
->codec_id
);
4285 ret
= AVERROR_DECODER_NOT_FOUND
;
4289 disposition
= !(st
->disposition
& (AV_DISPOSITION_HEARING_IMPAIRED
| AV_DISPOSITION_VISUAL_IMPAIRED
))
4290 + !! (st
->disposition
& AV_DISPOSITION_DEFAULT
);
4291 count
= st
->codec_info_nb_frames
;
4292 bitrate
= par
->bit_rate
;
4293 multiframe
= FFMIN(5, count
);
4294 if ((best_disposition
> disposition
) ||
4295 (best_disposition
== disposition
&& best_multiframe
> multiframe
) ||
4296 (best_disposition
== disposition
&& best_multiframe
== multiframe
&& best_bitrate
> bitrate
) ||
4297 (best_disposition
== disposition
&& best_multiframe
== multiframe
&& best_bitrate
== bitrate
&& best_count
>= count
))
4299 best_disposition
= disposition
;
4301 best_bitrate
= bitrate
;
4302 best_multiframe
= multiframe
;
4303 ret
= real_stream_index
;
4304 best_decoder
= decoder
;
4305 if (program
&& i
== nb_streams
- 1 && ret
< 0) {
4307 nb_streams
= ic
->nb_streams
;
4308 /* no related stream found, try again with everything */
4313 *decoder_ret
= (AVCodec
*)best_decoder
;
4317 /*******************************************************/
4319 int av_read_play(AVFormatContext
*s
)
4321 if (s
->iformat
->read_play
)
4322 return s
->iformat
->read_play(s
);
4324 return avio_pause(s
->pb
, 0);
4325 return AVERROR(ENOSYS
);
4328 int av_read_pause(AVFormatContext
*s
)
4330 if (s
->iformat
->read_pause
)
4331 return s
->iformat
->read_pause(s
);
4333 return avio_pause(s
->pb
, 1);
4334 return AVERROR(ENOSYS
);
4337 int ff_stream_encode_params_copy(AVStream
*dst
, const AVStream
*src
)
4342 dst
->time_base
= src
->time_base
;
4343 dst
->nb_frames
= src
->nb_frames
;
4344 dst
->disposition
= src
->disposition
;
4345 dst
->sample_aspect_ratio
= src
->sample_aspect_ratio
;
4346 dst
->avg_frame_rate
= src
->avg_frame_rate
;
4347 dst
->r_frame_rate
= src
->r_frame_rate
;
4349 av_dict_free(&dst
->metadata
);
4350 ret
= av_dict_copy(&dst
->metadata
, src
->metadata
, 0);
4354 ret
= avcodec_parameters_copy(dst
->codecpar
, src
->codecpar
);
4358 /* Free existing side data*/
4359 for (i
= 0; i
< dst
->nb_side_data
; i
++)
4360 av_free(dst
->side_data
[i
].data
);
4361 av_freep(&dst
->side_data
);
4362 dst
->nb_side_data
= 0;
4364 /* Copy side data if present */
4365 if (src
->nb_side_data
) {
4366 dst
->side_data
= av_mallocz_array(src
->nb_side_data
,
4367 sizeof(AVPacketSideData
));
4368 if (!dst
->side_data
)
4369 return AVERROR(ENOMEM
);
4370 dst
->nb_side_data
= src
->nb_side_data
;
4372 for (i
= 0; i
< src
->nb_side_data
; i
++) {
4373 uint8_t *data
= av_memdup(src
->side_data
[i
].data
,
4374 src
->side_data
[i
].size
);
4376 return AVERROR(ENOMEM
);
4377 dst
->side_data
[i
].type
= src
->side_data
[i
].type
;
4378 dst
->side_data
[i
].size
= src
->side_data
[i
].size
;
4379 dst
->side_data
[i
].data
= data
;
4383 #if FF_API_LAVF_FFSERVER
4384 FF_DISABLE_DEPRECATION_WARNINGS
4385 av_freep(&dst
->recommended_encoder_configuration
);
4386 if (src
->recommended_encoder_configuration
) {
4387 const char *conf_str
= src
->recommended_encoder_configuration
;
4388 dst
->recommended_encoder_configuration
= av_strdup(conf_str
);
4389 if (!dst
->recommended_encoder_configuration
)
4390 return AVERROR(ENOMEM
);
4392 FF_ENABLE_DEPRECATION_WARNINGS
4398 static void free_stream(AVStream
**pst
)
4400 AVStream
*st
= *pst
;
4406 for (i
= 0; i
< st
->nb_side_data
; i
++)
4407 av_freep(&st
->side_data
[i
].data
);
4408 av_freep(&st
->side_data
);
4411 av_parser_close(st
->parser
);
4413 if (st
->attached_pic
.data
)
4414 av_packet_unref(&st
->attached_pic
);
4417 avcodec_free_context(&st
->internal
->avctx
);
4418 av_bsf_free(&st
->internal
->bsfc
);
4419 av_freep(&st
->internal
->priv_pts
);
4420 av_bsf_free(&st
->internal
->extract_extradata
.bsf
);
4421 av_packet_free(&st
->internal
->extract_extradata
.pkt
);
4423 av_freep(&st
->internal
);
4425 av_dict_free(&st
->metadata
);
4426 avcodec_parameters_free(&st
->codecpar
);
4427 av_freep(&st
->probe_data
.buf
);
4428 av_freep(&st
->index_entries
);
4429 #if FF_API_LAVF_AVCTX
4430 FF_DISABLE_DEPRECATION_WARNINGS
4431 avcodec_free_context(&st
->codec
);
4432 FF_ENABLE_DEPRECATION_WARNINGS
4434 av_freep(&st
->priv_data
);
4436 av_freep(&st
->info
->duration_error
);
4437 av_freep(&st
->info
);
4438 #if FF_API_LAVF_FFSERVER
4439 FF_DISABLE_DEPRECATION_WARNINGS
4440 av_freep(&st
->recommended_encoder_configuration
);
4441 FF_ENABLE_DEPRECATION_WARNINGS
4447 void ff_free_stream(AVFormatContext
*s
, AVStream
*st
)
4449 av_assert0(s
->nb_streams
>0);
4450 av_assert0(s
->streams
[ s
->nb_streams
- 1 ] == st
);
4452 free_stream(&s
->streams
[ --s
->nb_streams
]);
4455 void avformat_free_context(AVFormatContext
*s
)
4462 if (s
->oformat
&& s
->oformat
->deinit
&& s
->internal
->initialized
)
4463 s
->oformat
->deinit(s
);
4466 if (s
->iformat
&& s
->iformat
->priv_class
&& s
->priv_data
)
4467 av_opt_free(s
->priv_data
);
4468 if (s
->oformat
&& s
->oformat
->priv_class
&& s
->priv_data
)
4469 av_opt_free(s
->priv_data
);
4471 for (i
= 0; i
< s
->nb_streams
; i
++)
4472 free_stream(&s
->streams
[i
]);
4475 for (i
= 0; i
< s
->nb_programs
; i
++) {
4476 av_dict_free(&s
->programs
[i
]->metadata
);
4477 av_freep(&s
->programs
[i
]->stream_index
);
4478 av_freep(&s
->programs
[i
]);
4482 av_freep(&s
->programs
);
4483 av_freep(&s
->priv_data
);
4484 while (s
->nb_chapters
--) {
4485 av_dict_free(&s
->chapters
[s
->nb_chapters
]->metadata
);
4486 av_freep(&s
->chapters
[s
->nb_chapters
]);
4488 av_freep(&s
->chapters
);
4489 av_dict_free(&s
->metadata
);
4490 av_dict_free(&s
->internal
->id3v2_meta
);
4491 av_freep(&s
->streams
);
4492 flush_packet_queue(s
);
4493 av_freep(&s
->internal
);
4498 void avformat_close_input(AVFormatContext
**ps
)
4509 if ((s
->iformat
&& strcmp(s
->iformat
->name
, "image2") && s
->iformat
->flags
& AVFMT_NOFILE
) ||
4510 (s
->flags
& AVFMT_FLAG_CUSTOM_IO
))
4513 flush_packet_queue(s
);
4516 if (s
->iformat
->read_close
)
4517 s
->iformat
->read_close(s
);
4519 avformat_free_context(s
);
4526 AVStream
*avformat_new_stream(AVFormatContext
*s
, const AVCodec
*c
)
4532 if (s
->nb_streams
>= FFMIN(s
->max_streams
, INT_MAX
/sizeof(*streams
))) {
4533 if (s
->max_streams
< INT_MAX
/sizeof(*streams
))
4534 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
);
4537 streams
= av_realloc_array(s
->streams
, s
->nb_streams
+ 1, sizeof(*streams
));
4540 s
->streams
= streams
;
4542 st
= av_mallocz(sizeof(AVStream
));
4545 if (!(st
->info
= av_mallocz(sizeof(*st
->info
)))) {
4549 st
->info
->last_dts
= AV_NOPTS_VALUE
;
4551 #if FF_API_LAVF_AVCTX
4552 FF_DISABLE_DEPRECATION_WARNINGS
4553 st
->codec
= avcodec_alloc_context3(c
);
4559 FF_ENABLE_DEPRECATION_WARNINGS
4562 st
->internal
= av_mallocz(sizeof(*st
->internal
));
4566 st
->codecpar
= avcodec_parameters_alloc();
4570 st
->internal
->avctx
= avcodec_alloc_context3(NULL
);
4571 if (!st
->internal
->avctx
)
4575 #if FF_API_LAVF_AVCTX
4576 FF_DISABLE_DEPRECATION_WARNINGS
4577 /* no default bitrate if decoding */
4578 st
->codec
->bit_rate
= 0;
4579 FF_ENABLE_DEPRECATION_WARNINGS
4582 /* default pts setting is MPEG-like */
4583 avpriv_set_pts_info(st
, 33, 1, 90000);
4584 /* we set the current DTS to 0 so that formats without any timestamps
4585 * but durations get some timestamps, formats with some unknown
4586 * timestamps have their first few packets buffered and the
4587 * timestamps corrected before they are returned to the user */
4588 st
->cur_dts
= RELATIVE_TS_BASE
;
4590 st
->cur_dts
= AV_NOPTS_VALUE
;
4593 st
->index
= s
->nb_streams
;
4594 st
->start_time
= AV_NOPTS_VALUE
;
4595 st
->duration
= AV_NOPTS_VALUE
;
4596 st
->first_dts
= AV_NOPTS_VALUE
;
4597 st
->probe_packets
= s
->max_probe_packets
;
4598 st
->pts_wrap_reference
= AV_NOPTS_VALUE
;
4599 st
->pts_wrap_behavior
= AV_PTS_WRAP_IGNORE
;
4601 st
->last_IP_pts
= AV_NOPTS_VALUE
;
4602 st
->last_dts_for_order_check
= AV_NOPTS_VALUE
;
4603 for (i
= 0; i
< MAX_REORDER_DELAY
+ 1; i
++)
4604 st
->pts_buffer
[i
] = AV_NOPTS_VALUE
;
4606 st
->sample_aspect_ratio
= (AVRational
) { 0, 1 };
4608 #if FF_API_R_FRAME_RATE
4609 st
->info
->last_dts
= AV_NOPTS_VALUE
;
4611 st
->info
->fps_first_dts
= AV_NOPTS_VALUE
;
4612 st
->info
->fps_last_dts
= AV_NOPTS_VALUE
;
4614 st
->inject_global_side_data
= s
->internal
->inject_global_side_data
;
4616 st
->internal
->need_context_update
= 1;
4618 s
->streams
[s
->nb_streams
++] = st
;
4625 AVProgram
*av_new_program(AVFormatContext
*ac
, int id
)
4627 AVProgram
*program
= NULL
;
4630 av_log(ac
, AV_LOG_TRACE
, "new_program: id=0x%04x\n", id
);
4632 for (i
= 0; i
< ac
->nb_programs
; i
++)
4633 if (ac
->programs
[i
]->id
== id
)
4634 program
= ac
->programs
[i
];
4637 program
= av_mallocz(sizeof(AVProgram
));
4640 dynarray_add(&ac
->programs
, &ac
->nb_programs
, program
);
4641 program
->discard
= AVDISCARD_NONE
;
4642 program
->pmt_version
= -1;
4645 program
->pts_wrap_reference
= AV_NOPTS_VALUE
;
4646 program
->pts_wrap_behavior
= AV_PTS_WRAP_IGNORE
;
4648 program
->start_time
=
4649 program
->end_time
= AV_NOPTS_VALUE
;
4654 AVChapter
*avpriv_new_chapter(AVFormatContext
*s
, int id
, AVRational time_base
,
4655 int64_t start
, int64_t end
, const char *title
)
4657 AVChapter
*chapter
= NULL
;
4660 if (end
!= AV_NOPTS_VALUE
&& start
> end
) {
4661 av_log(s
, AV_LOG_ERROR
, "Chapter end time %"PRId64
" before start %"PRId64
"\n", end
, start
);
4665 for (i
= 0; i
< s
->nb_chapters
; i
++)
4666 if (s
->chapters
[i
]->id
== id
)
4667 chapter
= s
->chapters
[i
];
4670 chapter
= av_mallocz(sizeof(AVChapter
));
4673 dynarray_add(&s
->chapters
, &s
->nb_chapters
, chapter
);
4675 av_dict_set(&chapter
->metadata
, "title", title
, 0);
4677 chapter
->time_base
= time_base
;
4678 chapter
->start
= start
;
4684 void av_program_add_stream_index(AVFormatContext
*ac
, int progid
, unsigned idx
)
4687 AVProgram
*program
= NULL
;
4690 if (idx
>= ac
->nb_streams
) {
4691 av_log(ac
, AV_LOG_ERROR
, "stream index %d is not valid\n", idx
);
4695 for (i
= 0; i
< ac
->nb_programs
; i
++) {
4696 if (ac
->programs
[i
]->id
!= progid
)
4698 program
= ac
->programs
[i
];
4699 for (j
= 0; j
< program
->nb_stream_indexes
; j
++)
4700 if (program
->stream_index
[j
] == idx
)
4703 tmp
= av_realloc_array(program
->stream_index
, program
->nb_stream_indexes
+1, sizeof(unsigned int));
4706 program
->stream_index
= tmp
;
4707 program
->stream_index
[program
->nb_stream_indexes
++] = idx
;
4712 uint64_t ff_ntp_time(void)
4714 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US
;
4717 uint64_t ff_get_formatted_ntp_time(uint64_t ntp_time_us
)
4719 uint64_t ntp_ts
, frac_part
, sec
;
4722 //current ntp time in seconds and micro seconds
4723 sec
= ntp_time_us
/ 1000000;
4724 usec
= ntp_time_us
% 1000000;
4726 //encoding in ntp timestamp format
4727 frac_part
= usec
* 0xFFFFFFFFULL
;
4728 frac_part
/= 1000000;
4730 if (sec
> 0xFFFFFFFFULL
)
4731 av_log(NULL
, AV_LOG_WARNING
, "NTP time format roll over detected\n");
4734 ntp_ts
|= frac_part
;
4739 int av_get_frame_filename2(char *buf
, int buf_size
, const char *path
, int number
, int flags
)
4742 char *q
, buf1
[20], c
;
4743 int nd
, len
, percentd_found
;
4755 while (av_isdigit(*p
)) {
4756 if (nd
>= INT_MAX
/ 10 - 255)
4758 nd
= nd
* 10 + *p
++ - '0';
4761 } while (av_isdigit(c
));
4767 if (!(flags
& AV_FRAME_FILENAME_FLAGS_MULTIPLE
) && percentd_found
)
4772 snprintf(buf1
, sizeof(buf1
), "%0*d", nd
, number
);
4774 if ((q
- buf
+ len
) > buf_size
- 1)
4776 memcpy(q
, buf1
, len
);
4784 if ((q
- buf
) < buf_size
- 1)
4788 if (!percentd_found
)
4797 int av_get_frame_filename(char *buf
, int buf_size
, const char *path
, int number
)
4799 return av_get_frame_filename2(buf
, buf_size
, path
, number
, 0);
4802 void av_url_split(char *proto
, int proto_size
,
4803 char *authorization
, int authorization_size
,
4804 char *hostname
, int hostname_size
,
4805 int *port_ptr
, char *path
, int path_size
, const char *url
)
4807 const char *p
, *ls
, *at
, *at2
, *col
, *brk
;
4813 if (authorization_size
> 0)
4814 authorization
[0] = 0;
4815 if (hostname_size
> 0)
4820 /* parse protocol */
4821 if ((p
= strchr(url
, ':'))) {
4822 av_strlcpy(proto
, url
, FFMIN(proto_size
, p
+ 1 - url
));
4829 /* no protocol means plain filename */
4830 av_strlcpy(path
, url
, path_size
);
4834 /* separate path from hostname */
4835 ls
= p
+ strcspn(p
, "/?#");
4836 av_strlcpy(path
, ls
, path_size
);
4838 /* the rest is hostname, use that to parse auth/port */
4840 /* authorization (user[:pass]@hostname) */
4842 while ((at
= strchr(p
, '@')) && at
< ls
) {
4843 av_strlcpy(authorization
, at2
,
4844 FFMIN(authorization_size
, at
+ 1 - at2
));
4845 p
= at
+ 1; /* skip '@' */
4848 if (*p
== '[' && (brk
= strchr(p
, ']')) && brk
< ls
) {
4850 av_strlcpy(hostname
, p
+ 1,
4851 FFMIN(hostname_size
, brk
- p
));
4852 if (brk
[1] == ':' && port_ptr
)
4853 *port_ptr
= atoi(brk
+ 2);
4854 } else if ((col
= strchr(p
, ':')) && col
< ls
) {
4855 av_strlcpy(hostname
, p
,
4856 FFMIN(col
+ 1 - p
, hostname_size
));
4858 *port_ptr
= atoi(col
+ 1);
4860 av_strlcpy(hostname
, p
,
4861 FFMIN(ls
+ 1 - p
, hostname_size
));
4865 int ff_mkdir_p(const char *path
)
4868 char *temp
= av_strdup(path
);
4872 if (!path
|| !temp
) {
4876 if (!av_strncasecmp(temp
, "/", 1) || !av_strncasecmp(temp
, "\\", 1)) {
4878 } else if (!av_strncasecmp(temp
, "./", 2) || !av_strncasecmp(temp
, ".\\", 2)) {
4882 for ( ; *pos
!= '\0'; ++pos
) {
4883 if (*pos
== '/' || *pos
== '\\') {
4886 ret
= mkdir(temp
, 0755);
4891 if ((*(pos
- 1) != '/') || (*(pos
- 1) != '\\')) {
4892 ret
= mkdir(temp
, 0755);
4899 char *ff_data_to_hex(char *buff
, const uint8_t *src
, int s
, int lowercase
)
4902 static const char hex_table_uc
[16] = { '0', '1', '2', '3',
4905 'C', 'D', 'E', 'F' };
4906 static const char hex_table_lc
[16] = { '0', '1', '2', '3',
4909 'c', 'd', 'e', 'f' };
4910 const char *hex_table
= lowercase
? hex_table_lc
: hex_table_uc
;
4912 for (i
= 0; i
< s
; i
++) {
4913 buff
[i
* 2] = hex_table
[src
[i
] >> 4];
4914 buff
[i
* 2 + 1] = hex_table
[src
[i
] & 0xF];
4920 int ff_hex_to_data(uint8_t *data
, const char *p
)
4927 p
+= strspn(p
, SPACE_CHARS
);
4930 c
= av_toupper((unsigned char) *p
++);
4931 if (c
>= '0' && c
<= '9')
4933 else if (c
>= 'A' && c
<= 'F')
4948 void avpriv_set_pts_info(AVStream
*s
, int pts_wrap_bits
,
4949 unsigned int pts_num
, unsigned int pts_den
)
4952 if (av_reduce(&new_tb
.num
, &new_tb
.den
, pts_num
, pts_den
, INT_MAX
)) {
4953 if (new_tb
.num
!= pts_num
)
4954 av_log(NULL
, AV_LOG_DEBUG
,
4955 "st:%d removing common factor %d from timebase\n",
4956 s
->index
, pts_num
/ new_tb
.num
);
4958 av_log(NULL
, AV_LOG_WARNING
,
4959 "st:%d has too large timebase, reducing\n", s
->index
);
4961 if (new_tb
.num
<= 0 || new_tb
.den
<= 0) {
4962 av_log(NULL
, AV_LOG_ERROR
,
4963 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4964 new_tb
.num
, new_tb
.den
,
4968 s
->time_base
= new_tb
;
4969 #if FF_API_LAVF_AVCTX
4970 FF_DISABLE_DEPRECATION_WARNINGS
4971 s
->codec
->pkt_timebase
= new_tb
;
4972 FF_ENABLE_DEPRECATION_WARNINGS
4974 s
->internal
->avctx
->pkt_timebase
= new_tb
;
4975 s
->pts_wrap_bits
= pts_wrap_bits
;
4978 void ff_parse_key_value(const char *str
, ff_parse_key_val_cb callback_get_buf
,
4981 const char *ptr
= str
;
4983 /* Parse key=value pairs. */
4986 char *dest
= NULL
, *dest_end
;
4987 int key_len
, dest_len
= 0;
4989 /* Skip whitespace and potential commas. */
4990 while (*ptr
&& (av_isspace(*ptr
) || *ptr
== ','))
4997 if (!(ptr
= strchr(key
, '=')))
5000 key_len
= ptr
- key
;
5002 callback_get_buf(context
, key
, key_len
, &dest
, &dest_len
);
5003 dest_end
= dest
? dest
+ dest_len
- 1 : NULL
;
5007 while (*ptr
&& *ptr
!= '\"') {
5011 if (dest
&& dest
< dest_end
)
5015 if (dest
&& dest
< dest_end
)
5023 for (; *ptr
&& !(av_isspace(*ptr
) || *ptr
== ','); ptr
++)
5024 if (dest
&& dest
< dest_end
)
5032 int ff_find_stream_index(AVFormatContext
*s
, int id
)
5035 for (i
= 0; i
< s
->nb_streams
; i
++)
5036 if (s
->streams
[i
]->id
== id
)
5041 int avformat_query_codec(const AVOutputFormat
*ofmt
, enum AVCodecID codec_id
,
5045 unsigned int codec_tag
;
5046 if (ofmt
->query_codec
)
5047 return ofmt
->query_codec(codec_id
, std_compliance
);
5048 else if (ofmt
->codec_tag
)
5049 return !!av_codec_get_tag2(ofmt
->codec_tag
, codec_id
, &codec_tag
);
5050 else if (codec_id
== ofmt
->video_codec
||
5051 codec_id
== ofmt
->audio_codec
||
5052 codec_id
== ofmt
->subtitle_codec
||
5053 codec_id
== ofmt
->data_codec
)
5056 return AVERROR_PATCHWELCOME
;
5059 int avformat_network_init(void)
5063 if ((ret
= ff_network_init()) < 0)
5065 if ((ret
= ff_tls_init()) < 0)
5071 int avformat_network_deinit(void)
5080 int ff_add_param_change(AVPacket
*pkt
, int32_t channels
,
5081 uint64_t channel_layout
, int32_t sample_rate
,
5082 int32_t width
, int32_t height
)
5088 return AVERROR(EINVAL
);
5091 flags
|= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT
;
5093 if (channel_layout
) {
5095 flags
|= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT
;
5099 flags
|= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE
;
5101 if (width
|| height
) {
5103 flags
|= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS
;
5105 data
= av_packet_new_side_data(pkt
, AV_PKT_DATA_PARAM_CHANGE
, size
);
5107 return AVERROR(ENOMEM
);
5108 bytestream_put_le32(&data
, flags
);
5110 bytestream_put_le32(&data
, channels
);
5112 bytestream_put_le64(&data
, channel_layout
);
5114 bytestream_put_le32(&data
, sample_rate
);
5115 if (width
|| height
) {
5116 bytestream_put_le32(&data
, width
);
5117 bytestream_put_le32(&data
, height
);
5122 AVRational
av_guess_sample_aspect_ratio(AVFormatContext
*format
, AVStream
*stream
, AVFrame
*frame
)
5124 AVRational undef
= {0, 1};
5125 AVRational stream_sample_aspect_ratio
= stream
? stream
->sample_aspect_ratio
: undef
;
5126 AVRational codec_sample_aspect_ratio
= stream
&& stream
->codecpar
? stream
->codecpar
->sample_aspect_ratio
: undef
;
5127 AVRational frame_sample_aspect_ratio
= frame
? frame
->sample_aspect_ratio
: codec_sample_aspect_ratio
;
5129 av_reduce(&stream_sample_aspect_ratio
.num
, &stream_sample_aspect_ratio
.den
,
5130 stream_sample_aspect_ratio
.num
, stream_sample_aspect_ratio
.den
, INT_MAX
);
5131 if (stream_sample_aspect_ratio
.num
<= 0 || stream_sample_aspect_ratio
.den
<= 0)
5132 stream_sample_aspect_ratio
= undef
;
5134 av_reduce(&frame_sample_aspect_ratio
.num
, &frame_sample_aspect_ratio
.den
,
5135 frame_sample_aspect_ratio
.num
, frame_sample_aspect_ratio
.den
, INT_MAX
);
5136 if (frame_sample_aspect_ratio
.num
<= 0 || frame_sample_aspect_ratio
.den
<= 0)
5137 frame_sample_aspect_ratio
= undef
;
5139 if (stream_sample_aspect_ratio
.num
)
5140 return stream_sample_aspect_ratio
;
5142 return frame_sample_aspect_ratio
;
5145 AVRational
av_guess_frame_rate(AVFormatContext
*format
, AVStream
*st
, AVFrame
*frame
)
5147 AVRational fr
= st
->r_frame_rate
;
5148 AVRational codec_fr
= st
->internal
->avctx
->framerate
;
5149 AVRational avg_fr
= st
->avg_frame_rate
;
5151 if (avg_fr
.num
> 0 && avg_fr
.den
> 0 && fr
.num
> 0 && fr
.den
> 0 &&
5152 av_q2d(avg_fr
) < 70 && av_q2d(fr
) > 210) {
5157 if (st
->internal
->avctx
->ticks_per_frame
> 1) {
5158 if ( codec_fr
.num
> 0 && codec_fr
.den
> 0 &&
5159 (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))
5167 * Matches a stream specifier (but ignores requested index).
5169 * @param indexptr set to point to the requested stream index if there is one
5171 * @return <0 on error
5172 * 0 if st is NOT a matching stream
5173 * >0 if st is a matching stream
5175 static int match_stream_specifier(AVFormatContext
*s
, AVStream
*st
,
5176 const char *spec
, const char **indexptr
, AVProgram
**p
)
5178 int match
= 1; /* Stores if the specifier matches so far. */
5180 if (*spec
<= '9' && *spec
>= '0') { /* opt:index */
5184 } else if (*spec
== 'v' || *spec
== 'a' || *spec
== 's' || *spec
== 'd' ||
5185 *spec
== 't' || *spec
== 'V') { /* opt:[vasdtV] */
5186 enum AVMediaType type
;
5190 case 'v': type
= AVMEDIA_TYPE_VIDEO
; break;
5191 case 'a': type
= AVMEDIA_TYPE_AUDIO
; break;
5192 case 's': type
= AVMEDIA_TYPE_SUBTITLE
; break;
5193 case 'd': type
= AVMEDIA_TYPE_DATA
; break;
5194 case 't': type
= AVMEDIA_TYPE_ATTACHMENT
; break;
5195 case 'V': type
= AVMEDIA_TYPE_VIDEO
; nopic
= 1; break;
5196 default: av_assert0(0);
5198 if (*spec
&& *spec
++ != ':') /* If we are not at the end, then another specifier must follow. */
5199 return AVERROR(EINVAL
);
5201 #if FF_API_LAVF_AVCTX
5202 FF_DISABLE_DEPRECATION_WARNINGS
5203 if (type
!= st
->codecpar
->codec_type
5204 && (st
->codecpar
->codec_type
!= AVMEDIA_TYPE_UNKNOWN
|| st
->codec
->codec_type
!= type
))
5206 FF_ENABLE_DEPRECATION_WARNINGS
5208 if (type
!= st
->codecpar
->codec_type
)
5211 if (nopic
&& (st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
))
5213 } else if (*spec
== 'p' && *(spec
+ 1) == ':') {
5218 prog_id
= strtol(spec
, &endptr
, 0);
5219 /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
5220 if (spec
== endptr
|| (*endptr
&& *endptr
++ != ':'))
5221 return AVERROR(EINVAL
);
5224 for (i
= 0; i
< s
->nb_programs
; i
++) {
5225 if (s
->programs
[i
]->id
!= prog_id
)
5228 for (j
= 0; j
< s
->programs
[i
]->nb_stream_indexes
; j
++) {
5229 if (st
->index
== s
->programs
[i
]->stream_index
[j
]) {
5232 *p
= s
->programs
[i
];
5241 } else if (*spec
== '#' ||
5242 (*spec
== 'i' && *(spec
+ 1) == ':')) {
5245 spec
+= 1 + (*spec
== 'i');
5246 stream_id
= strtol(spec
, &endptr
, 0);
5247 if (spec
== endptr
|| *endptr
) /* Disallow empty id and make sure we are at the end. */
5248 return AVERROR(EINVAL
);
5249 return match
&& (stream_id
== st
->id
);
5250 } else if (*spec
== 'm' && *(spec
+ 1) == ':') {
5251 AVDictionaryEntry
*tag
;
5257 val
= strchr(spec
, ':');
5259 key
= val
? av_strndup(spec
, val
- spec
) : av_strdup(spec
);
5261 return AVERROR(ENOMEM
);
5263 tag
= av_dict_get(st
->metadata
, key
, NULL
, 0);
5265 if (!val
|| !strcmp(tag
->value
, val
+ 1))
5274 return match
&& ret
;
5275 } else if (*spec
== 'u' && *(spec
+ 1) == '\0') {
5276 AVCodecParameters
*par
= st
->codecpar
;
5277 #if FF_API_LAVF_AVCTX
5278 FF_DISABLE_DEPRECATION_WARNINGS
5279 AVCodecContext
*codec
= st
->codec
;
5280 FF_ENABLE_DEPRECATION_WARNINGS
5283 switch (par
->codec_type
) {
5284 case AVMEDIA_TYPE_AUDIO
:
5285 val
= par
->sample_rate
&& par
->channels
;
5286 #if FF_API_LAVF_AVCTX
5287 val
= val
|| (codec
->sample_rate
&& codec
->channels
);
5289 if (par
->format
== AV_SAMPLE_FMT_NONE
5290 #if FF_API_LAVF_AVCTX
5291 && codec
->sample_fmt
== AV_SAMPLE_FMT_NONE
5296 case AVMEDIA_TYPE_VIDEO
:
5297 val
= par
->width
&& par
->height
;
5298 #if FF_API_LAVF_AVCTX
5299 val
= val
|| (codec
->width
&& codec
->height
);
5301 if (par
->format
== AV_PIX_FMT_NONE
5302 #if FF_API_LAVF_AVCTX
5303 && codec
->pix_fmt
== AV_PIX_FMT_NONE
5308 case AVMEDIA_TYPE_UNKNOWN
:
5315 #if FF_API_LAVF_AVCTX
5316 return match
&& ((par
->codec_id
!= AV_CODEC_ID_NONE
|| codec
->codec_id
!= AV_CODEC_ID_NONE
) && val
!= 0);
5318 return match
&& (par
->codec_id
!= AV_CODEC_ID_NONE
&& val
!= 0);
5321 return AVERROR(EINVAL
);
5329 int avformat_match_stream_specifier(AVFormatContext
*s
, AVStream
*st
,
5334 const char *indexptr
= NULL
;
5335 AVProgram
*p
= NULL
;
5338 ret
= match_stream_specifier(s
, st
, spec
, &indexptr
, &p
);
5345 index
= strtol(indexptr
, &endptr
, 0);
5346 if (*endptr
) { /* We can't have anything after the requested index. */
5347 ret
= AVERROR(EINVAL
);
5351 /* This is not really needed but saves us a loop for simple stream index specifiers. */
5352 if (spec
== indexptr
)
5353 return (index
== st
->index
);
5355 /* If we requested a matching stream index, we have to ensure st is that. */
5356 nb_streams
= p
? p
->nb_stream_indexes
: s
->nb_streams
;
5357 for (int i
= 0; i
< nb_streams
&& index
>= 0; i
++) {
5358 AVStream
*candidate
= p
? s
->streams
[p
->stream_index
[i
]] : s
->streams
[i
];
5359 ret
= match_stream_specifier(s
, candidate
, spec
, NULL
, NULL
);
5362 if (ret
> 0 && index
-- == 0 && st
== candidate
)
5368 if (ret
== AVERROR(EINVAL
))
5369 av_log(s
, AV_LOG_ERROR
, "Invalid stream specifier: %s.\n", spec
);
5373 int ff_generate_avci_extradata(AVStream
*st
)
5375 static const uint8_t avci100_1080p_extradata
[] = {
5377 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5378 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5379 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5380 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
5381 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
5382 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
5383 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
5384 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
5385 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5387 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5390 static const uint8_t avci100_1080i_extradata
[] = {
5392 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5393 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5394 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5395 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
5396 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
5397 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
5398 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
5399 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
5400 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
5401 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
5402 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
5404 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5407 static const uint8_t avci50_1080p_extradata
[] = {
5409 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5410 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5411 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5412 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5413 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5414 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
5415 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
5416 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
5417 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
5419 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5422 static const uint8_t avci50_1080i_extradata
[] = {
5424 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5425 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5426 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5427 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
5428 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
5429 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
5430 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
5431 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
5432 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
5433 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
5434 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
5436 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5439 static const uint8_t avci100_720p_extradata
[] = {
5441 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5442 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
5443 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
5444 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
5445 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
5446 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
5447 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
5448 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
5449 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
5450 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
5452 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
5455 static const uint8_t avci50_720p_extradata
[] = {
5457 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
5458 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5459 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5460 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5461 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5462 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
5463 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
5464 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
5465 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
5467 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5471 const uint8_t *data
= NULL
;
5474 if (st
->codecpar
->width
== 1920) {
5475 if (st
->codecpar
->field_order
== AV_FIELD_PROGRESSIVE
) {
5476 data
= avci100_1080p_extradata
;
5477 size
= sizeof(avci100_1080p_extradata
);
5479 data
= avci100_1080i_extradata
;
5480 size
= sizeof(avci100_1080i_extradata
);
5482 } else if (st
->codecpar
->width
== 1440) {
5483 if (st
->codecpar
->field_order
== AV_FIELD_PROGRESSIVE
) {
5484 data
= avci50_1080p_extradata
;
5485 size
= sizeof(avci50_1080p_extradata
);
5487 data
= avci50_1080i_extradata
;
5488 size
= sizeof(avci50_1080i_extradata
);
5490 } else if (st
->codecpar
->width
== 1280) {
5491 data
= avci100_720p_extradata
;
5492 size
= sizeof(avci100_720p_extradata
);
5493 } else if (st
->codecpar
->width
== 960) {
5494 data
= avci50_720p_extradata
;
5495 size
= sizeof(avci50_720p_extradata
);
5501 if ((ret
= ff_alloc_extradata(st
->codecpar
, size
)) < 0)
5503 memcpy(st
->codecpar
->extradata
, data
, size
);
5508 uint8_t *av_stream_get_side_data(const AVStream
*st
,
5509 enum AVPacketSideDataType type
, int *size
)
5513 for (i
= 0; i
< st
->nb_side_data
; i
++) {
5514 if (st
->side_data
[i
].type
== type
) {
5516 *size
= st
->side_data
[i
].size
;
5517 return st
->side_data
[i
].data
;
5525 int av_stream_add_side_data(AVStream
*st
, enum AVPacketSideDataType type
,
5526 uint8_t *data
, size_t size
)
5528 AVPacketSideData
*sd
, *tmp
;
5531 for (i
= 0; i
< st
->nb_side_data
; i
++) {
5532 sd
= &st
->side_data
[i
];
5534 if (sd
->type
== type
) {
5535 av_freep(&sd
->data
);
5542 if ((unsigned)st
->nb_side_data
+ 1 >= INT_MAX
/ sizeof(*st
->side_data
))
5543 return AVERROR(ERANGE
);
5545 tmp
= av_realloc(st
->side_data
, (st
->nb_side_data
+ 1) * sizeof(*tmp
));
5547 return AVERROR(ENOMEM
);
5550 st
->side_data
= tmp
;
5553 sd
= &st
->side_data
[st
->nb_side_data
- 1];
5561 uint8_t *av_stream_new_side_data(AVStream
*st
, enum AVPacketSideDataType type
,
5565 uint8_t *data
= av_malloc(size
);
5570 ret
= av_stream_add_side_data(st
, type
, data
, size
);
5579 int ff_stream_add_bitstream_filter(AVStream
*st
, const char *name
, const char *args
)
5582 const AVBitStreamFilter
*bsf
;
5585 av_assert0(!st
->internal
->bsfc
);
5587 if (!(bsf
= av_bsf_get_by_name(name
))) {
5588 av_log(NULL
, AV_LOG_ERROR
, "Unknown bitstream filter '%s'\n", name
);
5589 return AVERROR_BSF_NOT_FOUND
;
5592 if ((ret
= av_bsf_alloc(bsf
, &bsfc
)) < 0)
5595 bsfc
->time_base_in
= st
->time_base
;
5596 if ((ret
= avcodec_parameters_copy(bsfc
->par_in
, st
->codecpar
)) < 0) {
5601 if (args
&& bsfc
->filter
->priv_class
) {
5602 const AVOption
*opt
= av_opt_next(bsfc
->priv_data
, NULL
);
5603 const char * shorthand
[2] = {NULL
};
5606 shorthand
[0] = opt
->name
;
5608 if ((ret
= av_opt_set_from_string(bsfc
->priv_data
, args
, shorthand
, "=", ":")) < 0) {
5614 if ((ret
= av_bsf_init(bsfc
)) < 0) {
5619 st
->internal
->bsfc
= bsfc
;
5621 av_log(NULL
, AV_LOG_VERBOSE
,
5622 "Automatically inserted bitstream filter '%s'; args='%s'\n",
5623 name
, args
? args
: "");
5628 FF_DISABLE_DEPRECATION_WARNINGS
5629 int av_apply_bitstream_filters(AVCodecContext
*codec
, AVPacket
*pkt
,
5630 AVBitStreamFilterContext
*bsfc
)
5634 AVPacket new_pkt
= *pkt
;
5635 int a
= av_bitstream_filter_filter(bsfc
, codec
, NULL
,
5636 &new_pkt
.data
, &new_pkt
.size
,
5637 pkt
->data
, pkt
->size
,
5638 pkt
->flags
& AV_PKT_FLAG_KEY
);
5639 if (a
== 0 && new_pkt
.size
== 0 && new_pkt
.side_data_elems
== 0) {
5640 av_packet_unref(pkt
);
5641 memset(pkt
, 0, sizeof(*pkt
));
5644 if(a
== 0 && new_pkt
.data
!= pkt
->data
) {
5645 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
5647 memcpy(t
, new_pkt
.data
, new_pkt
.size
);
5648 memset(t
+ new_pkt
.size
, 0, AV_INPUT_BUFFER_PADDING_SIZE
);
5653 a
= AVERROR(ENOMEM
);
5657 new_pkt
.buf
= av_buffer_create(new_pkt
.data
, new_pkt
.size
,
5658 av_buffer_default_free
, NULL
, 0);
5660 pkt
->side_data
= NULL
;
5661 pkt
->side_data_elems
= 0;
5662 av_packet_unref(pkt
);
5664 av_freep(&new_pkt
.data
);
5665 a
= AVERROR(ENOMEM
);
5669 av_log(codec
, AV_LOG_ERROR
,
5670 "Failed to open bitstream filter %s for stream %d with codec %s",
5671 bsfc
->filter
->name
, pkt
->stream_index
,
5672 codec
->codec
? codec
->codec
->name
: "copy");
5682 FF_ENABLE_DEPRECATION_WARNINGS
5685 int ff_format_output_open(AVFormatContext
*s
, const char *url
, AVDictionary
**options
)
5688 return AVERROR(EINVAL
);
5690 if (!(s
->oformat
->flags
& AVFMT_NOFILE
))
5691 return s
->io_open(s
, &s
->pb
, url
, AVIO_FLAG_WRITE
, options
);
5695 void ff_format_io_close(AVFormatContext
*s
, AVIOContext
**pb
)
5698 s
->io_close(s
, *pb
);
5702 int ff_is_http_proto(char *filename
) {
5703 const char *proto
= avio_find_protocol_name(filename
);
5704 return proto
? (!av_strcasecmp(proto
, "http") || !av_strcasecmp(proto
, "https")) : 0;
5707 int ff_parse_creation_time_metadata(AVFormatContext
*s
, int64_t *timestamp
, int return_seconds
)
5709 AVDictionaryEntry
*entry
;
5710 int64_t parsed_timestamp
;
5712 if ((entry
= av_dict_get(s
->metadata
, "creation_time", NULL
, 0))) {
5713 if ((ret
= av_parse_time(&parsed_timestamp
, entry
->value
, 0)) >= 0) {
5714 *timestamp
= return_seconds
? parsed_timestamp
/ 1000000 : parsed_timestamp
;
5717 av_log(s
, AV_LOG_WARNING
, "Failed to parse creation_time %s\n", entry
->value
);
5724 int ff_standardize_creation_time(AVFormatContext
*s
)
5727 int ret
= ff_parse_creation_time_metadata(s
, ×tamp
, 0);
5729 return avpriv_dict_set_timestamp(&s
->metadata
, "creation_time", timestamp
);
5733 int ff_get_packet_palette(AVFormatContext
*s
, AVPacket
*pkt
, int ret
, uint32_t *palette
)
5738 side_data
= av_packet_get_side_data(pkt
, AV_PKT_DATA_PALETTE
, &size
);
5740 if (size
!= AVPALETTE_SIZE
) {
5741 av_log(s
, AV_LOG_ERROR
, "Invalid palette side data\n");
5742 return AVERROR_INVALIDDATA
;
5744 memcpy(palette
, side_data
, AVPALETTE_SIZE
);
5748 if (ret
== CONTAINS_PAL
) {
5750 for (i
= 0; i
< AVPALETTE_COUNT
; i
++)
5751 palette
[i
] = AV_RL32(pkt
->data
+ pkt
->size
- AVPALETTE_SIZE
+ i
*4);
5758 int ff_bprint_to_codecpar_extradata(AVCodecParameters
*par
, struct AVBPrint
*buf
)
5763 ret
= av_bprint_finalize(buf
, &str
);
5766 if (!av_bprint_is_complete(buf
)) {
5768 return AVERROR(ENOMEM
);
5771 par
->extradata
= str
;
5772 /* Note: the string is NUL terminated (so extradata can be read as a
5773 * string), but the ending character is not accounted in the size (in
5774 * binary formats you are likely not supposed to mux that character). When
5775 * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE
5777 par
->extradata_size
= buf
->len
;
5781 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat
*ofmt
,
5782 AVStream
*ost
, const AVStream
*ist
,
5783 enum AVTimebaseSource copy_tb
)
5785 //TODO: use [io]st->internal->avctx
5786 const AVCodecContext
*dec_ctx
= ist
->codec
;
5787 AVCodecContext
*enc_ctx
= ost
->codec
;
5789 enc_ctx
->time_base
= ist
->time_base
;
5791 * Avi is a special case here because it supports variable fps but
5792 * having the fps and timebase differe significantly adds quite some
5795 if (!strcmp(ofmt
->name
, "avi")) {
5796 #if FF_API_R_FRAME_RATE
5797 if (copy_tb
== AVFMT_TBCF_AUTO
&& ist
->r_frame_rate
.num
5798 && av_q2d(ist
->r_frame_rate
) >= av_q2d(ist
->avg_frame_rate
)
5799 && 0.5/av_q2d(ist
->r_frame_rate
) > av_q2d(ist
->time_base
)
5800 && 0.5/av_q2d(ist
->r_frame_rate
) > av_q2d(dec_ctx
->time_base
)
5801 && av_q2d(ist
->time_base
) < 1.0/500 && av_q2d(dec_ctx
->time_base
) < 1.0/500
5802 || copy_tb
== AVFMT_TBCF_R_FRAMERATE
) {
5803 enc_ctx
->time_base
.num
= ist
->r_frame_rate
.den
;
5804 enc_ctx
->time_base
.den
= 2*ist
->r_frame_rate
.num
;
5805 enc_ctx
->ticks_per_frame
= 2;
5808 if (copy_tb
== AVFMT_TBCF_AUTO
&& av_q2d(dec_ctx
->time_base
)*dec_ctx
->ticks_per_frame
> 2*av_q2d(ist
->time_base
)
5809 && av_q2d(ist
->time_base
) < 1.0/500
5810 || copy_tb
== AVFMT_TBCF_DECODER
) {
5811 enc_ctx
->time_base
= dec_ctx
->time_base
;
5812 enc_ctx
->time_base
.num
*= dec_ctx
->ticks_per_frame
;
5813 enc_ctx
->time_base
.den
*= 2;
5814 enc_ctx
->ticks_per_frame
= 2;
5816 } else if (!(ofmt
->flags
& AVFMT_VARIABLE_FPS
)
5817 && !av_match_name(ofmt
->name
, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
5818 if (copy_tb
== AVFMT_TBCF_AUTO
&& dec_ctx
->time_base
.den
5819 && av_q2d(dec_ctx
->time_base
)*dec_ctx
->ticks_per_frame
> av_q2d(ist
->time_base
)
5820 && av_q2d(ist
->time_base
) < 1.0/500
5821 || copy_tb
== AVFMT_TBCF_DECODER
) {
5822 enc_ctx
->time_base
= dec_ctx
->time_base
;
5823 enc_ctx
->time_base
.num
*= dec_ctx
->ticks_per_frame
;
5827 if ((enc_ctx
->codec_tag
== AV_RL32("tmcd") || ost
->codecpar
->codec_tag
== AV_RL32("tmcd"))
5828 && dec_ctx
->time_base
.num
< dec_ctx
->time_base
.den
5829 && dec_ctx
->time_base
.num
> 0
5830 && 121LL*dec_ctx
->time_base
.num
> dec_ctx
->time_base
.den
) {
5831 enc_ctx
->time_base
= dec_ctx
->time_base
;
5834 if (ost
->avg_frame_rate
.num
)
5835 enc_ctx
->time_base
= av_inv_q(ost
->avg_frame_rate
);
5837 av_reduce(&enc_ctx
->time_base
.num
, &enc_ctx
->time_base
.den
,
5838 enc_ctx
->time_base
.num
, enc_ctx
->time_base
.den
, INT_MAX
);
5843 AVRational
av_stream_get_codec_timebase(const AVStream
*st
)
5845 // See avformat_transfer_internal_stream_timing_info() TODO.
5846 #if FF_API_LAVF_AVCTX
5847 FF_DISABLE_DEPRECATION_WARNINGS
5848 return st
->codec
->time_base
;
5849 FF_ENABLE_DEPRECATION_WARNINGS
5851 return st
->internal
->avctx
->time_base
;
5855 void ff_format_set_url(AVFormatContext
*s
, char *url
)
5860 #if FF_API_FORMAT_FILENAME
5861 FF_DISABLE_DEPRECATION_WARNINGS
5862 av_strlcpy(s
->filename
, url
, sizeof(s
->filename
));
5863 FF_ENABLE_DEPRECATION_WARNINGS