As the first step towards handling scenarios where the are multiple hwdecs for a given image format but backed by different AVHWDeviceTypes, let us annotate the hwdecs with their corresponding device types. From this, we can also see how all the existing hwdecs which match the same image format also match the same device type.
Unified · Split
| @@ -51,7 +51,8 @@ swift_compile = [swift_prog, swift_flags, '-module-name', 'swift', · 50 unmodified lines | ||
| 51 | 51 | '-emit-objc-header-path', '@OUTPUT1@', '-o', '@OUTPUT2@', |
| 52 | 52 | '@INPUT@', '-I.', '-I' + source_root, |
| 53 | 53 | '-I' + libplacebo.get_variable('includedir', |
| 54 | − default_value: source_root / 'subprojects' / 'libplacebo' / 'src' / 'include')] | |
| 54 | + default_value: source_root / 'subprojects' / 'libplacebo' / 'src' / 'include'), | |
| 55 | + '-I' + libavutil.get_variable('includedir')] | |
| 55 | 56 | |
| 56 | 57 | swift_targets = custom_target('swift_targets', |
| 57 | 58 | input: swift_sources, |
| @@ -246,6 +246,7 @@ const struct ra_hwdec_driver ra_hwdec_d3d11va = { · 245 unmodified lines | ||
| 246 | 246 | .name = "d3d11va", |
| 247 | 247 | .priv_size = sizeof(struct priv_owner), |
| 248 | 248 | .imgfmts = {IMGFMT_D3D11, 0}, |
| 249 | + .device_type = AV_HWDEVICE_TYPE_D3D11VA, | |
| 249 | 250 | .init = init, |
| 250 | 251 | .uninit = uninit, |
| 251 | 252 | .mapper = &(const struct ra_hwdec_mapper_driver){ |
| @@ -466,6 +466,7 @@ const struct ra_hwdec_driver ra_hwdec_dxva2dxgi = { · 465 unmodified lines | ||
| 466 | 466 | .name = "dxva2-dxgi", |
| 467 | 467 | .priv_size = sizeof(struct priv_owner), |
| 468 | 468 | .imgfmts = {IMGFMT_DXVA2, 0}, |
| 469 | + .device_type = AV_HWDEVICE_TYPE_DXVA2, | |
| 469 | 470 | .init = init, |
| 470 | 471 | .uninit = uninit, |
| 471 | 472 | .mapper = &(const struct ra_hwdec_mapper_driver){ |
| @@ -352,3 +352,13 @@ int ra_hwdec_driver_get_imgfmt_for_name(const char *name) · 351 unmodified lines | ||
| 352 | 352 | } |
| 353 | 353 | return IMGFMT_NONE; |
| 354 | 354 | } |
| 355 | + | |
| 356 | +enum AVHWDeviceType ra_hwdec_driver_get_device_type_for_name(const char *name) | |
| 357 | +{ | |
| 358 | + for (int i = 0; ra_hwdec_drivers[i]; i++) { | |
| 359 | + if (!strcmp(ra_hwdec_drivers[i]->name, name)) { | |
| 360 | + return ra_hwdec_drivers[i]->device_type; | |
| 361 | + } | |
| 362 | + } | |
| 363 | + return AV_HWDEVICE_TYPE_NONE; | |
| 364 | +} | |
| @@ -1,6 +1,8 @@ | ||
| 1 | 1 | #ifndef MPGL_HWDEC_H_ |
| 2 | 2 | #define MPGL_HWDEC_H_ |
| 3 | 3 | |
| 4 | +#include <libavutil/hwcontext.h> | |
| 5 | + | |
| 4 | 6 | #include "video/mp_image.h" |
| 5 | 7 | #include "context.h" |
| 6 | 8 | #include "ra.h" |
| @@ -106,6 +108,9 @@ struct ra_hwdec_driver { · 99 unmodified lines | ||
| 106 | 108 | // Terminated with a 0 entry. (Extend the array size as needed.) |
| 107 | 109 | const int imgfmts[3]; |
| 108 | 110 | |
| 111 | + // The underlying ffmpeg hw device type this hwdec corresponds to. | |
| 112 | + enum AVHWDeviceType device_type; | |
| 113 | + | |
| 109 | 114 | // Create the hwdec device. It must add it to hw->devs, if applicable. |
| 110 | 115 | int (*init)(struct ra_hwdec *hw); |
| 111 | 116 | void (*uninit)(struct ra_hwdec *hw); |
| @@ -149,4 +154,8 @@ int ra_hwdec_mapper_map(struct ra_hwdec_mapper *mapper, struct mp_image *img); · 37 unmodified lines | ||
| 149 | 154 | // Returns IMGFMT_NONE if the name doesn't get matched. |
| 150 | 155 | int ra_hwdec_driver_get_imgfmt_for_name(const char *name); |
| 151 | 156 | |
| 157 | +// Get the primary hw device type for the given driver name. | |
| 158 | +// Returns AV_HWDEVICE_TYPE_NONE if the name doesn't get matched. | |
| 159 | +enum AVHWDeviceType ra_hwdec_driver_get_device_type_for_name(const char *name); | |
| 160 | + | |
| 152 | 161 | #endif |
| @@ -392,6 +392,7 @@ const struct ra_hwdec_driver ra_hwdec_aimagereader = { · 391 unmodified lines | ||
| 392 | 392 | .name = "aimagereader", |
| 393 | 393 | .priv_size = sizeof(struct priv_owner), |
| 394 | 394 | .imgfmts = {IMGFMT_MEDIACODEC, 0}, |
| 395 | + .device_type = AV_HWDEVICE_TYPE_MEDIACODEC, | |
| 395 | 396 | .init = init, |
| 396 | 397 | .uninit = uninit, |
| 397 | 398 | .mapper = &(const struct ra_hwdec_mapper_driver){ |
| @@ -284,6 +284,7 @@ static int mapper_map(struct ra_hwdec_mapper *mapper) · 283 unmodified lines | ||
| 284 | 284 | const struct ra_hwdec_driver ra_hwdec_cuda = { |
| 285 | 285 | .name = "cuda", |
| 286 | 286 | .imgfmts = {IMGFMT_CUDA, 0}, |
| 287 | + .device_type = AV_HWDEVICE_TYPE_CUDA, | |
| 287 | 288 | .priv_size = sizeof(struct cuda_hw_priv), |
| 288 | 289 | .init = cuda_init, |
| 289 | 290 | .uninit = cuda_uninit, |
| @@ -307,6 +307,7 @@ const struct ra_hwdec_driver ra_hwdec_drmprime = { · 306 unmodified lines | ||
| 307 | 307 | .name = "drmprime", |
| 308 | 308 | .priv_size = sizeof(struct priv_owner), |
| 309 | 309 | .imgfmts = {IMGFMT_DRMPRIME, 0}, |
| 310 | + .device_type = AV_HWDEVICE_TYPE_DRM, | |
| 310 | 311 | .init = init, |
| 311 | 312 | .uninit = uninit, |
| 312 | 313 | .mapper = &(const struct ra_hwdec_mapper_driver){ |
| @@ -328,6 +328,7 @@ const struct ra_hwdec_driver ra_hwdec_drmprime_overlay = { · 327 unmodified lines | ||
| 328 | 328 | .name = "drmprime-overlay", |
| 329 | 329 | .priv_size = sizeof(struct priv), |
| 330 | 330 | .imgfmts = {IMGFMT_DRMPRIME, 0}, |
| 331 | + .device_type = AV_HWDEVICE_TYPE_DRM, | |
| 331 | 332 | .init = init, |
| 332 | 333 | .overlay_frame = overlay_frame, |
| 333 | 334 | .uninit = uninit, |
| @@ -546,6 +546,7 @@ const struct ra_hwdec_driver ra_hwdec_vaapi = { · 545 unmodified lines | ||
| 546 | 546 | .name = "vaapi", |
| 547 | 547 | .priv_size = sizeof(struct priv_owner), |
| 548 | 548 | .imgfmts = {IMGFMT_VAAPI, 0}, |
| 549 | + .device_type = AV_HWDEVICE_TYPE_VAAPI, | |
| 549 | 550 | .init = init, |
| 550 | 551 | .uninit = uninit, |
| 551 | 552 | .mapper = &(const struct ra_hwdec_mapper_driver){ |
| @@ -129,6 +129,7 @@ const struct ra_hwdec_driver ra_hwdec_videotoolbox = { · 128 unmodified lines | ||
| 129 | 129 | .name = "videotoolbox", |
| 130 | 130 | .priv_size = sizeof(struct priv_owner), |
| 131 | 131 | .imgfmts = {IMGFMT_VIDEOTOOLBOX, 0}, |
| 132 | + .device_type = AV_HWDEVICE_TYPE_VIDEOTOOLBOX, | |
| 132 | 133 | .init = init, |
| 133 | 134 | .uninit = uninit, |
| 134 | 135 | .mapper = &(const struct ra_hwdec_mapper_driver){ |
| @@ -320,6 +320,7 @@ static int mapper_map(struct ra_hwdec_mapper *mapper) · 319 unmodified lines | ||
| 320 | 320 | const struct ra_hwdec_driver ra_hwdec_vulkan = { |
| 321 | 321 | .name = "vulkan", |
| 322 | 322 | .imgfmts = {IMGFMT_VULKAN, 0}, |
| 323 | + .device_type = AV_HWDEVICE_TYPE_VULKAN, | |
| 323 | 324 | .priv_size = sizeof(struct vulkan_hw_priv), |
| 324 | 325 | .init = vulkan_init, |
| 325 | 326 | .uninit = vulkan_uninit, |
| @@ -351,6 +351,7 @@ const struct ra_hwdec_driver ra_hwdec_d3d11egl = { · 350 unmodified lines | ||
| 351 | 351 | .name = "d3d11-egl", |
| 352 | 352 | .priv_size = sizeof(struct priv_owner), |
| 353 | 353 | .imgfmts = {IMGFMT_D3D11, 0}, |
| 354 | + .device_type = AV_HWDEVICE_TYPE_D3D11VA, | |
| 354 | 355 | .init = init, |
| 355 | 356 | .uninit = uninit, |
| 356 | 357 | .mapper = &(const struct ra_hwdec_mapper_driver){ |
| @@ -373,6 +373,7 @@ const struct ra_hwdec_driver ra_hwdec_dxva2egl = { · 372 unmodified lines | ||
| 373 | 373 | .name = "dxva2-egl", |
| 374 | 374 | .priv_size = sizeof(struct priv_owner), |
| 375 | 375 | .imgfmts = {IMGFMT_DXVA2, 0}, |
| 376 | + .device_type = AV_HWDEVICE_TYPE_DXVA2, | |
| 376 | 377 | .init = init, |
| 377 | 378 | .uninit = uninit, |
| 378 | 379 | .mapper = &(const struct ra_hwdec_mapper_driver){ |
| @@ -236,6 +236,7 @@ const struct ra_hwdec_driver ra_hwdec_dxva2gldx = { · 235 unmodified lines | ||
| 236 | 236 | .name = "dxva2-dxinterop", |
| 237 | 237 | .priv_size = sizeof(struct priv_owner), |
| 238 | 238 | .imgfmts = {IMGFMT_DXVA2, 0}, |
| 239 | + .device_type = AV_HWDEVICE_TYPE_DXVA2, | |
| 239 | 240 | .init = init, |
| 240 | 241 | .uninit = uninit, |
| 241 | 242 | .mapper = &(const struct ra_hwdec_mapper_driver){ |
| @@ -239,6 +239,7 @@ const struct ra_hwdec_driver ra_hwdec_vdpau = { · 238 unmodified lines | ||
| 239 | 239 | .name = "vdpau-gl", |
| 240 | 240 | .priv_size = sizeof(struct priv_owner), |
| 241 | 241 | .imgfmts = {IMGFMT_VDPAU, 0}, |
| 242 | + .device_type = AV_HWDEVICE_TYPE_VDPAU, | |
| 242 | 243 | .init = init, |
| 243 | 244 | .uninit = uninit, |
| 244 | 245 | .mapper = &(const struct ra_hwdec_mapper_driver){ |