summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Rothenpieler <timo@rothenpieler.org>2022-08-07 23:14:09 +0200
committerTimo Rothenpieler <timo@rothenpieler.org>2022-08-13 15:22:14 +0200
commitc469c3c3b18fbacd6ee0165573034d2a0408b83f (patch)
tree2b12b07a6588d53408eed7f5e90deb66de298b9e
parent6a574e39016325ec601da49d3f51c14135874da6 (diff)
avfilter/vsrc_ddagrab: add options for more control over output format fallback
-rw-r--r--libavfilter/version.h2
-rw-r--r--libavfilter/vsrc_ddagrab.c12
2 files changed, 10 insertions, 4 deletions
diff --git a/libavfilter/version.h b/libavfilter/version.h
index fa67606495..f3c1964cac 100644
--- a/libavfilter/version.h
+++ b/libavfilter/version.h
@@ -32,7 +32,7 @@
#include "version_major.h"
#define LIBAVFILTER_VERSION_MINOR 46
-#define LIBAVFILTER_VERSION_MICRO 102
+#define LIBAVFILTER_VERSION_MICRO 103
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
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);
}