Showing the changes to libavfilter (1 of 2 files). Show all
Unified · Split
| @@ -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_UNORM | 216 | 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 | #else | 259 | #else |
| 243 | { | 260 | { |
| 244 | #endif | 261 | #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 | ||