diff mbox series

[FFmpeg-devel,v4,9/9] avformat: Add probe_stream option

Message ID 20201002222346.1196-10-nicolas.gaullier@cji.paris
State Superseded
Headers show
Series avformat: wav-s337m support + new probe_stream option | expand

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate fail Make fate failed

Commit Message

Nicolas Gaullier Oct. 2, 2020, 10:23 p.m. UTC
Allows user to disable codec auto-detection.
Probe requests are ignored, including spdif/s337m submux detection in wavdec.

Note: this option is required to pass-through dolby_e data from a wav file.
---
 doc/formats.texi            | 3 +++
 libavformat/avformat.h      | 9 ++++++++-
 libavformat/options_table.h | 1 +
 libavformat/utils.c         | 2 ++
 libavformat/version.h       | 2 +-
 libavformat/wavdec.c        | 2 +-
 6 files changed, 16 insertions(+), 3 deletions(-)

Comments

Carl Eugen Hoyos Oct. 3, 2020, 6:31 p.m. UTC | #1
Am Sa., 3. Okt. 2020 um 00:25 Uhr schrieb Nicolas Gaullier
<nicolas.gaullier@cji.paris>:

> Allows user to disable codec auto-detection.
> Probe requests are ignored, including spdif/s337m submux detection in wavdec.

> Note: this option is required to pass-through dolby_e data from a wav file.

I don't think this is correct, could you explain what you tested with the rest
of your patch set applied?

Maybe this patch is a good idea (I am not convinced) but imo it should not
claim that it is needed for pass-through of spdif or dolby_e or similar.

Carl Eugen
diff mbox series

Patch

diff --git a/doc/formats.texi b/doc/formats.texi
index fc80ce1d2b..7de49503e8 100644
--- a/doc/formats.texi
+++ b/doc/formats.texi
@@ -31,6 +31,9 @@  latency. Must be an integer not lesser than 32. It is 5000000 by default.
 Set the maximum number of buffered packets when probing a codec.
 Default is 2500 packets.
 
+@item probe_streams @var{bool} (@emph{input})
+Enable codec auto-detection if set to 1. Default is 1.
+
 @item packetsize @var{integer} (@emph{output})
 Set packet size.
 
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index c8c0b6c08d..a146daa21c 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -1118,7 +1118,7 @@  typedef struct AVStream {
     /**
      * stream probing state
      * -1   -> probing finished
-     *  0   -> no probing requested
+     *  0   -> no probing requested or request cancelled by probe_streams being set to 0
      * rest -> perform probing with request_probe being the minimum score to accept.
      */
     int request_probe;
@@ -1951,6 +1951,13 @@  typedef struct AVFormatContext {
      * - decoding: set by user
      */
     int max_probe_packets;
+
+    /**
+     * Enable codec auto-detect.
+     * - encoding: unused
+     * - decoding: set by user
+     */
+    int probe_streams;
 } AVFormatContext;
 
 #if FF_API_FORMAT_GET_SET
diff --git a/libavformat/options_table.h b/libavformat/options_table.h
index b4141564c8..1a75ad7f93 100644
--- a/libavformat/options_table.h
+++ b/libavformat/options_table.h
@@ -112,6 +112,7 @@  static const AVOption avformat_options[] = {
 {"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 },
+{"probe_streams", "codec auto-detection", OFFSET(probe_streams), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, D},
 {NULL},
 };
 
diff --git a/libavformat/utils.c b/libavformat/utils.c
index a2e701ea1a..1c08081e21 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -675,6 +675,8 @@  static void force_codec_ids(AVFormatContext *s, AVStream *st)
 
 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
 {
+    if (!s->probe_streams)
+        st->request_probe = 0;
     if (st->request_probe>0) {
         AVProbeData *pd = &st->probe_data;
         int end;
diff --git a/libavformat/version.h b/libavformat/version.h
index 40f84a220d..9bde0c37f9 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  59
+#define LIBAVFORMAT_VERSION_MINOR  60
 #define LIBAVFORMAT_VERSION_MICRO 100
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
diff --git a/libavformat/wavdec.c b/libavformat/wavdec.c
index 9f48ff067b..00cf8c9ab2 100644
--- a/libavformat/wavdec.c
+++ b/libavformat/wavdec.c
@@ -69,7 +69,7 @@  typedef struct WAVDemuxContext {
 static void set_spdif_s337m(AVFormatContext *s, WAVDemuxContext *wav)
 {
     AVCodecParameters *par = s->streams[0]->codecpar;
-    if ((CONFIG_SPDIF_DEMUXER || CONFIG_S337M_DEMUXER) && par->codec_tag == 1) {
+    if ((CONFIG_SPDIF_DEMUXER || CONFIG_S337M_DEMUXER) && par->codec_tag == 1 && s->probe_streams) {
         enum AVCodecID codec;
         int len = 1<<16;
         int ret = ffio_ensure_seekback(s->pb, len);