History

avfilter/vsrc_ddagrab: make output format user configurable

Timo Rothenpieler committed 4 years ago

Commit 38595eb1 parent f0abd072 files · +44 −1Browse files

Showing the changes to libavfilter (1 of 2 files). Show all

Unified · Split

libavfilter/vsrc_ddagrab.c+28−1
@@ -97,6 +97,7 @@ typedef struct DdagrabContext { · 96 unmodified lines
97 int height;97 int height;
98 int offset_x;98 int offset_x;
99 int offset_y;99 int offset_y;
100 int out_fmt;
100} DdagrabContext;101} DdagrabContext;
101 102
102#define OFFSET(x) offsetof(DdagrabContext, x)103#define OFFSET(x) offsetof(DdagrabContext, x)
@@ -108,6 +109,12 @@ static const AVOption ddagrab_options[] = { · 5 unmodified lines
108 { "video_size", "set video frame size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, { .str = NULL }, 0, 0, FLAGS },109 { "video_size", "set video frame size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, { .str = NULL }, 0, 0, FLAGS },
109 { "offset_x", "capture area x offset", OFFSET(offset_x), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FLAGS },110 { "offset_x", "capture area x offset", OFFSET(offset_x), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FLAGS },
110 { "offset_y", "capture area y offset", OFFSET(offset_y), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FLAGS },111 { "offset_y", "capture area y offset", OFFSET(offset_y), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FLAGS },
112 { "output_fmt", "desired output format", OFFSET(out_fmt), AV_OPT_TYPE_INT, { .i64 = DXGI_FORMAT_B8G8R8A8_UNORM }, 0, INT_MAX, FLAGS, "output_fmt" },
113 { "auto", "let dda pick its preferred format", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, INT_MAX, FLAGS, "output_fmt" },
114 { "8bit", "only output default 8 Bit format", 0, AV_OPT_TYPE_CONST, { .i64 = DXGI_FORMAT_B8G8R8A8_UNORM }, 0, INT_MAX, FLAGS, "output_fmt" },
115 { "bgra", "only output 8 Bit BGRA", 0, AV_OPT_TYPE_CONST, { .i64 = DXGI_FORMAT_B8G8R8A8_UNORM }, 0, INT_MAX, FLAGS, "output_fmt" },
116 { "10bit", "only output default 10 Bit format", 0, AV_OPT_TYPE_CONST, { .i64 = DXGI_FORMAT_R10G10B10A2_UNORM }, 0, INT_MAX, FLAGS, "output_fmt" },
117 { "x2bgr10", "only output 10 Bit X2BGR10", 0, AV_OPT_TYPE_CONST, { .i64 = DXGI_FORMAT_R10G10B10A2_UNORM }, 0, INT_MAX, FLAGS, "output_fmt" },
111 { NULL }118 { NULL }
112};119};
113 120
@@ -208,6 +215,16 @@ static av_cold int init_dxgi_dda(AVFilterContext *avctx) · 94 unmodified lines
208 DXGI_FORMAT_R10G10B10A2_UNORM,215 DXGI_FORMAT_R10G10B10A2_UNORM,
209 DXGI_FORMAT_B8G8R8A8_UNORM216 DXGI_FORMAT_B8G8R8A8_UNORM
210 };217 };
218 int nb_formats = FF_ARRAY_ELEMS(formats);
219
220 if(dda->out_fmt == DXGI_FORMAT_B8G8R8A8_UNORM) {
221 formats[0] = DXGI_FORMAT_B8G8R8A8_UNORM;
222 nb_formats = 1;
223 } else if (dda->out_fmt) {
224 formats[0] = dda->out_fmt;
225 formats[1] = DXGI_FORMAT_B8G8R8A8_UNORM;
226 nb_formats = 2;
227 }
211 228
212 IDXGIOutput_Release(dxgi_output);229 IDXGIOutput_Release(dxgi_output);
213 dxgi_output = NULL;230 dxgi_output = NULL;
@@ -219,7 +236,7 @@ static av_cold int init_dxgi_dda(AVFilterContext *avctx) · 5 unmodified lines
219 hr = IDXGIOutput5_DuplicateOutput1(dxgi_output5,236 hr = IDXGIOutput5_DuplicateOutput1(dxgi_output5,
220 (IUnknown*)dda->device_hwctx->device,237 (IUnknown*)dda->device_hwctx->device,
221 0,238 0,
222 FF_ARRAY_ELEMS(formats),239 nb_formats,
223 formats,240 formats,
224 &dda->dxgi_outdupl);241 &dda->dxgi_outdupl);
225 IDXGIOutput5_Release(dxgi_output5);242 IDXGIOutput5_Release(dxgi_output5);
@@ -242,6 +259,11 @@ static av_cold int init_dxgi_dda(AVFilterContext *avctx) · 16 unmodified lines
242#else259#else
243 {260 {
244#endif261#endif
262 if (dda->out_fmt && dda->out_fmt != DXGI_FORMAT_B8G8R8A8_UNORM) {
263 av_log(avctx, AV_LOG_ERROR, "Only 8 bit output supported with legacy API\n");
264 return AVERROR(ENOTSUP);
265 }
266
245 hr = IDXGIOutput_QueryInterface(dxgi_output, &IID_IDXGIOutput1, (void**)&dxgi_output1);267 hr = IDXGIOutput_QueryInterface(dxgi_output, &IID_IDXGIOutput1, (void**)&dxgi_output1);
246 IDXGIOutput_Release(dxgi_output);268 IDXGIOutput_Release(dxgi_output);
247 dxgi_output = NULL;269 dxgi_output = NULL;
@@ -704,6 +726,11 @@ static int ddagrab_config_props(AVFilterLink *outlink) · 456 unmodified lines
704 if (ret < 0)726 if (ret < 0)
705 return ret;727 return ret;
706 728
729 if (dda->out_fmt && dda->raw_format != dda->out_fmt) {
730 av_log(avctx, AV_LOG_ERROR, "Requested output format unavailable.\n");
731 return AVERROR(ENOTSUP);
732 }
733
707 dda->width -= FFMAX(dda->width - dda->raw_width + dda->offset_x, 0);734 dda->width -= FFMAX(dda->width - dda->raw_width + dda->offset_x, 0);
708 dda->height -= FFMAX(dda->height - dda->raw_height + dda->offset_y, 0);735 dda->height -= FFMAX(dda->height - dda->raw_height + dda->offset_y, 0);
709 736

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t