diff mbox series

[FFmpeg-devel,04/11] avfilter/vsrc_ddagrab: add options for more control over output format fallback

Message ID 20220810204712.3123-4-timo@rothenpieler.org
State New
Headers show
Series [FFmpeg-devel,01/11] lavu/pixfmt: add packed RGBA float16 format | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Timo Rothenpieler Aug. 10, 2022, 8:47 p.m. UTC
---
 libavfilter/vsrc_ddagrab.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/libavfilter/vsrc_ddagrab.c b/libavfilter/vsrc_ddagrab.c
index 252505b96d..00c72187ea 100644
--- a/libavfilter/vsrc_ddagrab.c
+++ b/libavfilter/vsrc_ddagrab.c
@@ -98,6 +98,8 @@  typedef struct DdagrabContext {
     int        offset_x;
     int        offset_y;
     int        out_fmt;
+    int        allow_fallback;
+    int        force_fmt;
 } DdagrabContext;
 
 #define OFFSET(x) offsetof(DdagrabContext, x)
@@ -117,6 +119,10 @@  static const AVOption ddagrab_options[] = {
     { "x2bgr10",    "only output 10 Bit X2BGR10",        0,            AV_OPT_TYPE_CONST,      { .i64 = DXGI_FORMAT_R10G10B10A2_UNORM }, 0, INT_MAX, FLAGS, "output_fmt" },
     { "16bit",      "only output default 16 Bit format", 0,            AV_OPT_TYPE_CONST,      { .i64 = DXGI_FORMAT_R16G16B16A16_FLOAT },0, INT_MAX, FLAGS, "output_fmt" },
     { "rgbaf16",    "only output 16 Bit RGBAF16",        0,            AV_OPT_TYPE_CONST,      { .i64 = DXGI_FORMAT_R16G16B16A16_FLOAT },0, INT_MAX, FLAGS, "output_fmt" },
+    { "allow_fallback", "don't error on fallback to default 8 Bit format",
+                                                   OFFSET(allow_fallback), AV_OPT_TYPE_BOOL,   { .i64 = 0    },       0,       1, FLAGS },
+    { "force_fmt",  "exclude BGRA from format list (experimental, discouraged by Microsoft)",
+                                                   OFFSET(force_fmt),  AV_OPT_TYPE_BOOL,       { .i64 = 0    },       0,       1, FLAGS },
     { NULL }
 };
 
@@ -226,7 +232,7 @@  static av_cold int init_dxgi_dda(AVFilterContext *avctx)
         } else if (dda->out_fmt) {
             formats[0] = dda->out_fmt;
             formats[1] = DXGI_FORMAT_B8G8R8A8_UNORM;
-            nb_formats = 2;
+            nb_formats = dda->force_fmt ? 1 : 2;
         }
 
         IDXGIOutput_Release(dxgi_output);
@@ -262,7 +268,7 @@  static av_cold int init_dxgi_dda(AVFilterContext *avctx)
 #else
     {
 #endif
-        if (dda->out_fmt && dda->out_fmt != DXGI_FORMAT_B8G8R8A8_UNORM) {
+        if (dda->out_fmt && dda->out_fmt != DXGI_FORMAT_B8G8R8A8_UNORM && (!dda->allow_fallback || dda->force_fmt)) {
             av_log(avctx, AV_LOG_ERROR, "Only 8 bit output supported with legacy API\n");
             return AVERROR(ENOTSUP);
         }
@@ -733,7 +739,7 @@  static int ddagrab_config_props(AVFilterLink *outlink)
     if (ret < 0)
         return ret;
 
-    if (dda->out_fmt && dda->raw_format != dda->out_fmt) {
+    if (dda->out_fmt && dda->raw_format != dda->out_fmt && (!dda->allow_fallback || dda->force_fmt)) {
         av_log(avctx, AV_LOG_ERROR, "Requested output format unavailable.\n");
         return AVERROR(ENOTSUP);
     }