[FFmpeg-devel] [PATCH 03/47] fftools/ffmpeg_mux_init: deprecate "smart" pixel format selection
Anton Khirnov
anton at khirnov.net
Sat Jul 15 13:45:27 EEST 2023
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 --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;
}
--
2.40.1
More information about the ffmpeg-devel
mailing list