diff mbox series

[FFmpeg-devel,03/47] fftools/ffmpeg_mux_init: deprecate "smart" pixel format selection

Message ID 20230715104611.17902-3-anton@khirnov.net
State New
Headers show
Series [FFmpeg-devel,01/47] fftools/ffmpeg_mux_init: handle pixel format endianness | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Anton Khirnov July 15, 2023, 10:45 a.m. UTC
It may override a format explicitly requested with -pix_fmt and instead
select something completely unrelated, which is a user-hostile behaviour
and is inconsistent with how other options generally work.

Print a warning and delay for a second to make the users aware of the
deprecation.
---
 doc/ffmpeg.texi           |  3 +--
 fftools/ffmpeg.h          |  1 +
 fftools/ffmpeg_mux_init.c | 15 +++++++++++++--
 3 files changed, 15 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
index 2273c39214..a6ef5590c7 100644
--- a/doc/ffmpeg.texi
+++ b/doc/ffmpeg.texi
@@ -1014,8 +1014,7 @@  Disable autoscale at your own risk.
 @item -pix_fmt[:@var{stream_specifier}] @var{format} (@emph{input/output,per-stream})
 Set pixel format. Use @code{-pix_fmts} to show all the supported
 pixel formats.
-If the selected pixel format can not be selected, ffmpeg will print a
-warning and select the best pixel format supported by the encoder.
+
 If @var{pix_fmt} is prefixed by a @code{+}, ffmpeg will exit with an error
 if the requested pixel format can not be selected, and automatic conversions
 inside filtergraphs are disabled.
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index f45ddf33b2..7c4f4365c6 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -57,6 +57,7 @@ 
 #define FFMPEG_OPT_QPHIST 1
 #define FFMPEG_OPT_ADRIFT_THRESHOLD 1
 #define FFMPEG_OPT_ENC_TIME_BASE_NUM 1
+#define FFMPEG_OPT_SMART_PIXFMT 1
 
 enum VideoSyncMethod {
     VSYNC_AUTO = -1,
diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c
index 3fe157c2e4..03d60f2a19 100644
--- a/fftools/ffmpeg_mux_init.c
+++ b/fftools/ffmpeg_mux_init.c
@@ -45,6 +45,7 @@ 
 #include "libavutil/opt.h"
 #include "libavutil/parseutils.h"
 #include "libavutil/pixdesc.h"
+#include "libavutil/time.h"
 
 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
 
@@ -503,6 +504,7 @@  static int fmt_in_list(const int *formats, int format)
     return 0;
 }
 
+#if FFMPEG_OPT_SMART_PIXFMT
 static enum AVPixelFormat
 choose_pixel_fmt(const AVCodec *codec, enum AVPixelFormat target)
 {
@@ -518,16 +520,23 @@  choose_pixel_fmt(const AVCodec *codec, enum AVPixelFormat target)
             break;
     }
     if (*p == AV_PIX_FMT_NONE) {
-        if (target != AV_PIX_FMT_NONE)
+        if (target != AV_PIX_FMT_NONE) {
             av_log(NULL, AV_LOG_WARNING,
-                   "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
+                   "Requested pixel format '%s' is nut supported by encoder '%s', "
+                   "auto-selecting format '%s'\n",
                    av_get_pix_fmt_name(target),
                    codec->name,
                    av_get_pix_fmt_name(best));
+            av_log(NULL, AV_LOG_WARNING, "This behaviour is deprecated and will "
+                   "be removed. Use -h encoder=%s to check supported pixel "
+                   "formats and select one of them.\n", codec->name);
+            av_usleep(1000000);
+        }
         return best;
     }
     return target;
 }
+#endif
 
 static enum AVPixelFormat pix_fmt_parse(OutputStream *ost, const char *name)
 {
@@ -566,8 +575,10 @@  static enum AVPixelFormat pix_fmt_parse(OutputStream *ost, const char *name)
         }
     }
 
+#if FFMPEG_OPT_SMART_PIXFMT
     if (fmts && !fmt_in_list(fmts, fmt))
         fmt = choose_pixel_fmt(ost->enc_ctx->codec, fmt);
+#endif
 
     return fmt;
 }