|
@@ -155,7 +155,8 @@ static int vaapi_frames_get_constraints(AVHWDeviceContext *hwdev, |
|
|
unsigned int fourcc; |
|
|
unsigned int fourcc; |
|
|
int err, i, j, attr_count, pix_fmt_count; |
|
|
int err, i, j, attr_count, pix_fmt_count; |
|
|
|
|
|
|
|
|
if (config) { |
|
|
|
|
|
|
|
|
if (config && |
|
|
|
|
|
!(hwctx->driver_quirks & AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES)) { |
|
|
attr_count = 0; |
|
|
attr_count = 0; |
|
|
vas = vaQuerySurfaceAttributes(hwctx->display, config->config_id, |
|
|
vas = vaQuerySurfaceAttributes(hwctx->display, config->config_id, |
|
|
0, &attr_count); |
|
|
0, &attr_count); |
|
@@ -273,6 +274,11 @@ static const struct { |
|
|
"ubit", |
|
|
"ubit", |
|
|
AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE, |
|
|
AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE, |
|
|
}, |
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"VDPAU wrapper", |
|
|
|
|
|
"Splitted-Desktop Systems VDPAU backend for VA-API", |
|
|
|
|
|
AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES, |
|
|
|
|
|
}, |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
static int vaapi_device_init(AVHWDeviceContext *hwdev) |
|
|
static int vaapi_device_init(AVHWDeviceContext *hwdev) |
|
@@ -451,43 +457,48 @@ static int vaapi_frames_init(AVHWFramesContext *hwfc) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (!hwfc->pool) { |
|
|
if (!hwfc->pool) { |
|
|
int need_memory_type = !(hwctx->driver_quirks & AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE); |
|
|
|
|
|
int need_pixel_format = 1; |
|
|
|
|
|
for (i = 0; i < avfc->nb_attributes; i++) { |
|
|
|
|
|
if (ctx->attributes[i].type == VASurfaceAttribMemoryType) |
|
|
|
|
|
need_memory_type = 0; |
|
|
|
|
|
if (ctx->attributes[i].type == VASurfaceAttribPixelFormat) |
|
|
|
|
|
need_pixel_format = 0; |
|
|
|
|
|
} |
|
|
|
|
|
ctx->nb_attributes = |
|
|
|
|
|
avfc->nb_attributes + need_memory_type + need_pixel_format; |
|
|
|
|
|
|
|
|
if (!(hwctx->driver_quirks & AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES)) { |
|
|
|
|
|
int need_memory_type = !(hwctx->driver_quirks & AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE); |
|
|
|
|
|
int need_pixel_format = 1; |
|
|
|
|
|
for (i = 0; i < avfc->nb_attributes; i++) { |
|
|
|
|
|
if (ctx->attributes[i].type == VASurfaceAttribMemoryType) |
|
|
|
|
|
need_memory_type = 0; |
|
|
|
|
|
if (ctx->attributes[i].type == VASurfaceAttribPixelFormat) |
|
|
|
|
|
need_pixel_format = 0; |
|
|
|
|
|
} |
|
|
|
|
|
ctx->nb_attributes = |
|
|
|
|
|
avfc->nb_attributes + need_memory_type + need_pixel_format; |
|
|
|
|
|
|
|
|
ctx->attributes = av_malloc(ctx->nb_attributes * |
|
|
|
|
|
|
|
|
ctx->attributes = av_malloc(ctx->nb_attributes * |
|
|
sizeof(*ctx->attributes)); |
|
|
sizeof(*ctx->attributes)); |
|
|
if (!ctx->attributes) { |
|
|
|
|
|
err = AVERROR(ENOMEM); |
|
|
|
|
|
goto fail; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (!ctx->attributes) { |
|
|
|
|
|
err = AVERROR(ENOMEM); |
|
|
|
|
|
goto fail; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
for (i = 0; i < avfc->nb_attributes; i++) |
|
|
|
|
|
ctx->attributes[i] = avfc->attributes[i]; |
|
|
|
|
|
if (need_memory_type) { |
|
|
|
|
|
ctx->attributes[i++] = (VASurfaceAttrib) { |
|
|
|
|
|
.type = VASurfaceAttribMemoryType, |
|
|
|
|
|
.flags = VA_SURFACE_ATTRIB_SETTABLE, |
|
|
|
|
|
.value.type = VAGenericValueTypeInteger, |
|
|
|
|
|
.value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_VA, |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
if (need_pixel_format) { |
|
|
|
|
|
ctx->attributes[i++] = (VASurfaceAttrib) { |
|
|
|
|
|
.type = VASurfaceAttribPixelFormat, |
|
|
|
|
|
.flags = VA_SURFACE_ATTRIB_SETTABLE, |
|
|
|
|
|
.value.type = VAGenericValueTypeInteger, |
|
|
|
|
|
.value.value.i = fourcc, |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
for (i = 0; i < avfc->nb_attributes; i++) |
|
|
|
|
|
ctx->attributes[i] = avfc->attributes[i]; |
|
|
|
|
|
if (need_memory_type) { |
|
|
|
|
|
ctx->attributes[i++] = (VASurfaceAttrib) { |
|
|
|
|
|
.type = VASurfaceAttribMemoryType, |
|
|
|
|
|
.flags = VA_SURFACE_ATTRIB_SETTABLE, |
|
|
|
|
|
.value.type = VAGenericValueTypeInteger, |
|
|
|
|
|
.value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_VA, |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
if (need_pixel_format) { |
|
|
|
|
|
ctx->attributes[i++] = (VASurfaceAttrib) { |
|
|
|
|
|
.type = VASurfaceAttribPixelFormat, |
|
|
|
|
|
.flags = VA_SURFACE_ATTRIB_SETTABLE, |
|
|
|
|
|
.value.type = VAGenericValueTypeInteger, |
|
|
|
|
|
.value.value.i = fourcc, |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
av_assert0(i == ctx->nb_attributes); |
|
|
|
|
|
} else { |
|
|
|
|
|
ctx->attributes = NULL; |
|
|
|
|
|
ctx->nb_attributes = 0; |
|
|
} |
|
|
} |
|
|
av_assert0(i == ctx->nb_attributes); |
|
|
|
|
|
|
|
|
|
|
|
ctx->rt_format = rt_format; |
|
|
ctx->rt_format = rt_format; |
|
|
|
|
|
|
|
|