[FFmpeg-devel] [PATCH] avformat: Add max_probe_packets option
Andriy Gelman
andriy.gelman at gmail.com
Wed Oct 2 15:03:42 EEST 2019
On Fri, 27. Sep 16:26, Andriy Gelman wrote:
> From: Andriy Gelman <andriy.gelman at gmail.com>
>
> This allows the user to set a maximum number of buffered packets when
> probing a codec. It was a hard-coded parameter before this commit.
> ---
> doc/formats.texi | 4 ++++
> libavformat/avformat.h | 7 +++++++
> libavformat/internal.h | 2 --
> libavformat/options_table.h | 1 +
> libavformat/utils.c | 7 ++++---
> libavformat/version.h | 2 +-
> 6 files changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/doc/formats.texi b/doc/formats.texi
> index d689fbadfa..fc80ce1d2b 100644
> --- a/doc/formats.texi
> +++ b/doc/formats.texi
> @@ -27,6 +27,10 @@ stream information. A higher value will enable detecting more
> information in case it is dispersed into the stream, but will increase
> latency. Must be an integer not lesser than 32. It is 5000000 by default.
>
> + at item max_probe_packets @var{integer} (@emph{input})
> +Set the maximum number of buffered packets when probing a codec.
> +Default is 2500 packets.
> +
> @item packetsize @var{integer} (@emph{output})
> Set packet size.
>
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index 6eb329f13f..d4d9a3b06e 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -1951,6 +1951,13 @@ typedef struct AVFormatContext {
> * - decoding: set by user
> */
> int skip_estimate_duration_from_pts;
> +
> + /**
> + * Maximum number of packets that can be probed
> + * - encoding: unused
> + * - decoding: set by user
> + */
> + int max_probe_packets;
> } AVFormatContext;
>
> #if FF_API_FORMAT_GET_SET
> diff --git a/libavformat/internal.h b/libavformat/internal.h
> index 67c35cc3e1..ec9a29907a 100644
> --- a/libavformat/internal.h
> +++ b/libavformat/internal.h
> @@ -33,8 +33,6 @@
> #define PROBE_BUF_MIN 2048
> #define PROBE_BUF_MAX (1 << 20)
>
> -#define MAX_PROBE_PACKETS 2500
> -
> #ifdef DEBUG
> # define hex_dump_debug(class, buf, size) av_hex_dump_log(class, AV_LOG_DEBUG, buf, size)
> #else
> diff --git a/libavformat/options_table.h b/libavformat/options_table.h
> index f2f077b34f..618726512b 100644
> --- a/libavformat/options_table.h
> +++ b/libavformat/options_table.h
> @@ -111,6 +111,7 @@ static const AVOption avformat_options[] = {
> {"protocol_blacklist", "List of protocols that are not allowed to be used", OFFSET(protocol_blacklist), AV_OPT_TYPE_STRING, { .str = NULL }, CHAR_MIN, CHAR_MAX, D },
> {"max_streams", "maximum number of streams", OFFSET(max_streams), AV_OPT_TYPE_INT, { .i64 = 1000 }, 0, INT_MAX, D },
> {"skip_estimate_duration_from_pts", "skip duration calculation in estimate_timings_from_pts", OFFSET(skip_estimate_duration_from_pts), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, D},
> +{"max_probe_packets", "Maximum number of packets to probe a codec", OFFSET(max_probe_packets), AV_OPT_TYPE_INT, {.i64 = 2500 }, 0, INT_MAX, D },
> {NULL},
> };
>
> diff --git a/libavformat/utils.c b/libavformat/utils.c
> index 9f8a5bfb63..23b5379030 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -363,7 +363,7 @@ static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
> int i;
> av_log(s, AV_LOG_DEBUG,
> "Probe with size=%d, packets=%d detected %s with score=%d\n",
> - pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets,
> + pd->buf_size, s->max_probe_packets - st->probe_packets,
> fmt->name, score);
> for (i = 0; fmt_id_type[i].name; i++) {
> if (!strcmp(fmt->name, fmt_id_type[i].name)) {
> @@ -835,6 +835,7 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
> int ret, i, err;
> AVStream *st;
>
> +
> for (;;) {
> AVPacketList *pktl = s->internal->raw_packet_buffer;
> const AVPacket *pkt1;
> @@ -1954,7 +1955,7 @@ void ff_read_frame_flush(AVFormatContext *s)
> /* We set the current DTS to an unspecified origin. */
> st->cur_dts = AV_NOPTS_VALUE;
>
> - st->probe_packets = MAX_PROBE_PACKETS;
> + st->probe_packets = s->max_probe_packets;
>
> for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
> st->pts_buffer[j] = AV_NOPTS_VALUE;
> @@ -4552,7 +4553,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
> st->start_time = AV_NOPTS_VALUE;
> st->duration = AV_NOPTS_VALUE;
> st->first_dts = AV_NOPTS_VALUE;
> - st->probe_packets = MAX_PROBE_PACKETS;
> + st->probe_packets = s->max_probe_packets;
> st->pts_wrap_reference = AV_NOPTS_VALUE;
> st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
>
> diff --git a/libavformat/version.h b/libavformat/version.h
> index bcd0408d28..dce5a124c7 100644
> --- a/libavformat/version.h
> +++ b/libavformat/version.h
> @@ -32,7 +32,7 @@
> // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium)
> // Also please add any ticket numbers that you believe might be affected here
> #define LIBAVFORMAT_VERSION_MAJOR 58
> -#define LIBAVFORMAT_VERSION_MINOR 33
> +#define LIBAVFORMAT_VERSION_MINOR 34
> #define LIBAVFORMAT_VERSION_MICRO 100
>
> #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
> --
> 2.23.0
>
ping
--
Andriy
More information about the ffmpeg-devel
mailing list