[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