From 7d9a3d51091eff4c2c32653ad011ecae99dad4fe Mon Sep 17 00:00:00 2001 From: Austin Yuan Date: Sat, 8 Jun 2013 10:22:36 +0800 Subject: Sync with new fdo staging branch BZ: 119038 Change-Id: I4bf6b90e3bf0bee8f09a919d0a5fd548a1be5238 Signed-off-by: Austin Yuan Signed-off-by: pingshix Reviewed-on: http://android.intel.com:8080/115742 Reviewed-by: Sun, Jing A Reviewed-by: Guo, Nana N Reviewed-by: Wang, Kun K Reviewed-by: buildbot Tested-by: buildbot --- va/va.c | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 160 insertions(+), 15 deletions(-) (limited to 'va/va.c') diff --git a/va/va.c b/va/va.c index 0644ba6..6cb17ef 100755 --- a/va/va.c +++ b/va/va.c @@ -675,12 +675,148 @@ VAStatus vaQueryConfigAttributes ( return ctx->vtable->vaQueryConfigAttributes( ctx, config_id, profile, entrypoint, attrib_list, num_attribs); } +/* XXX: this is a slow implementation that will be removed */ +static VAStatus +va_impl_query_surface_attributes( + VADriverContextP ctx, + VAConfigID config, + VASurfaceAttrib *out_attribs, + unsigned int *out_num_attribs_ptr +) +{ + VASurfaceAttrib *attribs = NULL; + unsigned int num_attribs, n; + VASurfaceAttrib *out_attrib; + unsigned int out_num_attribs; + VAImageFormat *image_formats = NULL; + int num_image_formats, i; + VAStatus va_status; + + /* List of surface attributes to query */ + struct va_surface_attrib_map { + VASurfaceAttribType type; + VAGenericValueType value_type; + }; + static const struct va_surface_attrib_map attribs_map[] = { + { VASurfaceAttribMinWidth, VAGenericValueTypeInteger }, + { VASurfaceAttribMaxWidth, VAGenericValueTypeInteger }, + { VASurfaceAttribMinHeight, VAGenericValueTypeInteger }, + { VASurfaceAttribMaxHeight, VAGenericValueTypeInteger }, + { VASurfaceAttribMemoryType, VAGenericValueTypeInteger }, + { VASurfaceAttribNone, } + }; + + if (!out_attribs || !out_num_attribs_ptr) + return VA_STATUS_ERROR_INVALID_PARAMETER; + if (!ctx->vtable->vaGetSurfaceAttributes) + return VA_STATUS_ERROR_UNIMPLEMENTED; + + num_image_formats = ctx->max_image_formats; + image_formats = malloc(num_image_formats * sizeof(*image_formats)); + if (!image_formats) { + va_status = VA_STATUS_ERROR_ALLOCATION_FAILED; + goto end; + } + + va_status = ctx->vtable->vaQueryImageFormats( + ctx, image_formats, &num_image_formats); + if (va_status != VA_STATUS_SUCCESS) + goto end; + + num_attribs = VASurfaceAttribCount + num_image_formats; + attribs = malloc(num_attribs * sizeof(*attribs)); + if (!attribs) { + va_status = VA_STATUS_ERROR_ALLOCATION_FAILED; + goto end; + } + + /* Initialize with base surface attributes, except pixel-formats */ + for (n = 0; attribs_map[n].type != VASurfaceAttribNone; n++) { + VASurfaceAttrib * const attrib = &attribs[n]; + attrib->type = attribs_map[n].type; + attrib->flags = VA_SURFACE_ATTRIB_GETTABLE; + attrib->value.type = attribs_map[n].value_type; + } + + /* Append image formats */ + for (i = 0; i < num_image_formats; i++) { + VASurfaceAttrib * const attrib = &attribs[n]; + attrib->type = VASurfaceAttribPixelFormat; + attrib->flags = VA_SURFACE_ATTRIB_GETTABLE|VA_SURFACE_ATTRIB_SETTABLE; + attrib->value.type = VAGenericValueTypeInteger; + attrib->value.value.i = image_formats[i].fourcc; + if (++n == num_attribs) { + va_status = VA_STATUS_ERROR_ALLOCATION_FAILED; + goto end; + } + } + num_attribs = n; + + va_status = ctx->vtable->vaGetSurfaceAttributes( + ctx, config, attribs, num_attribs); + if (va_status != VA_STATUS_SUCCESS) + goto end; + + /* Remove invalid entries */ + out_num_attribs = 0; + for (n = 0; n < num_attribs; n++) { + VASurfaceAttrib * const attrib = &attribs[n]; + + if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED) + continue; + + // Accept all surface attributes that are not pixel-formats + if (attrib->type != VASurfaceAttribPixelFormat) { + out_num_attribs++; + continue; + } + + // Drop invalid pixel-format attribute + if (!attrib->value.value.i) { + attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED; + continue; + } + + // Check for duplicates + int is_duplicate = 0; + for (i = n - 1; i >= 0 && !is_duplicate; i--) { + const VASurfaceAttrib * const prev_attrib = &attribs[i]; + if (prev_attrib->type != VASurfaceAttribPixelFormat) + break; + is_duplicate = prev_attrib->value.value.i == attrib->value.value.i; + } + if (is_duplicate) + attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED; + else + out_num_attribs++; + } + + if (*out_num_attribs_ptr < out_num_attribs) { + *out_num_attribs_ptr = out_num_attribs; + va_status = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; + goto end; + } + + out_attrib = out_attribs; + for (n = 0; n < num_attribs; n++) { + const VASurfaceAttrib * const attrib = &attribs[n]; + if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED) + continue; + *out_attrib++ = *attrib; + } + +end: + free(attribs); + free(image_formats); + return va_status; +} + VAStatus -vaGetSurfaceAttributes( +vaQuerySurfaceAttributes( VADisplay dpy, VAConfigID config, VASurfaceAttrib *attrib_list, - unsigned int num_attribs + unsigned int *num_attribs ) { VADriverContextP ctx; @@ -691,11 +827,15 @@ vaGetSurfaceAttributes( if (!ctx) return VA_STATUS_ERROR_INVALID_DISPLAY; - if (!ctx->vtable->vaGetSurfaceAttributes) - return VA_STATUS_ERROR_UNIMPLEMENTED; + if (!ctx->vtable->vaQuerySurfaceAttributes) + vaStatus = va_impl_query_surface_attributes(ctx, config, + attrib_list, num_attribs); + else + vaStatus = ctx->vtable->vaQuerySurfaceAttributes(ctx, config, + attrib_list, num_attribs); + + VA_TRACE_LOG(va_TraceQuerySurfaceAttributes, dpy, config, attrib_list, num_attribs); - vaStatus = ctx->vtable->vaGetSurfaceAttributes(ctx, config, - attrib_list, num_attribs); return vaStatus; } @@ -720,16 +860,14 @@ vaCreateSurfaces( return VA_STATUS_ERROR_INVALID_DISPLAY; if (ctx->vtable->vaCreateSurfaces2) - return ctx->vtable->vaCreateSurfaces2(ctx, format, width, height, + vaStatus = ctx->vtable->vaCreateSurfaces2(ctx, format, width, height, surfaces, num_surfaces, attrib_list, num_attribs); - - if (attrib_list && num_attribs > 0) - return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED; - - vaStatus = ctx->vtable->vaCreateSurfaces(ctx, width, height, format, - num_surfaces, surfaces); - + else if (attrib_list && num_attribs > 0) + vaStatus = VA_STATUS_ERROR_ATTR_NOT_SUPPORTED; + else + vaStatus = ctx->vtable->vaCreateSurfaces(ctx, width, height, format, + num_surfaces, surfaces); VA_TRACE_LOG(va_TraceCreateSurfaces, dpy, width, height, format, num_surfaces, surfaces, attrib_list, num_attribs); @@ -745,10 +883,17 @@ VAStatus vaDestroySurfaces ( ) { VADriverContextP ctx; + VAStatus vaStatus; + CHECK_DISPLAY(dpy); ctx = CTX(dpy); - return ctx->vtable->vaDestroySurfaces( ctx, surface_list, num_surfaces ); + VA_TRACE_LOG(va_TraceDestroySurfaces, + dpy, surface_list, num_surfaces); + + vaStatus = ctx->vtable->vaDestroySurfaces( ctx, surface_list, num_surfaces ); + + return vaStatus; } VAStatus vaCreateContext ( -- cgit v1.2.3