Index: third_party/libva/dummy_drv_video/dummy_drv_video.c |
diff --git a/third_party/libva/dummy_drv_video/dummy_drv_video.c b/third_party/libva/dummy_drv_video/dummy_drv_video.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a6e76b9ffd200170b4909d8e212b26b6ffb569b3 |
--- /dev/null |
+++ b/third_party/libva/dummy_drv_video/dummy_drv_video.c |
@@ -0,0 +1,1277 @@ |
+/* |
+ * Copyright (c) 2007 Intel Corporation. All Rights Reserved. |
+ * |
+ * Permission is hereby granted, free of charge, to any person obtaining a |
+ * copy of this software and associated documentation files (the |
+ * "Software"), to deal in the Software without restriction, including |
+ * without limitation the rights to use, copy, modify, merge, publish, |
+ * distribute, sub license, and/or sell copies of the Software, and to |
+ * permit persons to whom the Software is furnished to do so, subject to |
+ * the following conditions: |
+ * |
+ * The above copyright notice and this permission notice (including the |
+ * next paragraph) shall be included in all copies or substantial portions |
+ * of the Software. |
+ * |
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR |
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
+ */ |
+ |
+#include "config.h" |
+#include <va/va_backend.h> |
+ |
+#include "dummy_drv_video.h" |
+ |
+#include "assert.h" |
+#include <stdio.h> |
+#include <stdlib.h> |
+#include <string.h> |
+#include <stdarg.h> |
+ |
+#define ASSERT assert |
+ |
+#define INIT_DRIVER_DATA struct dummy_driver_data *driver_data = (struct dummy_driver_data *) ctx->pDriverData; |
+ |
+#define CONFIG(id) ((object_config_p) object_heap_lookup( &driver_data->config_heap, id )) |
+#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id )) |
+#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id )) |
+#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id )) |
+ |
+#define CONFIG_ID_OFFSET 0x01000000 |
+#define CONTEXT_ID_OFFSET 0x02000000 |
+#define SURFACE_ID_OFFSET 0x04000000 |
+#define BUFFER_ID_OFFSET 0x08000000 |
+ |
+static void dummy__error_message(const char *msg, ...) |
+{ |
+ va_list args; |
+ |
+ fprintf(stderr, "dummy_drv_video error: "); |
+ va_start(args, msg); |
+ vfprintf(stderr, msg, args); |
+ va_end(args); |
+} |
+ |
+static void dummy__information_message(const char *msg, ...) |
+{ |
+ va_list args; |
+ |
+ fprintf(stderr, "dummy_drv_video: "); |
+ va_start(args, msg); |
+ vfprintf(stderr, msg, args); |
+ va_end(args); |
+} |
+ |
+VAStatus dummy_QueryConfigProfiles( |
+ VADriverContextP ctx, |
+ VAProfile *profile_list, /* out */ |
+ int *num_profiles /* out */ |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ int i = 0; |
+ |
+ profile_list[i++] = VAProfileMPEG2Simple; |
+ profile_list[i++] = VAProfileMPEG2Main; |
+ profile_list[i++] = VAProfileMPEG4Simple; |
+ profile_list[i++] = VAProfileMPEG4AdvancedSimple; |
+ profile_list[i++] = VAProfileMPEG4Main; |
+ profile_list[i++] = VAProfileH264Baseline; |
+ profile_list[i++] = VAProfileH264Main; |
+ profile_list[i++] = VAProfileH264High; |
+ profile_list[i++] = VAProfileVC1Simple; |
+ profile_list[i++] = VAProfileVC1Main; |
+ profile_list[i++] = VAProfileVC1Advanced; |
+ |
+ /* If the assert fails then DUMMY_MAX_PROFILES needs to be bigger */ |
+ ASSERT(i <= DUMMY_MAX_PROFILES); |
+ *num_profiles = i; |
+ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_QueryConfigEntrypoints( |
+ VADriverContextP ctx, |
+ VAProfile profile, |
+ VAEntrypoint *entrypoint_list, /* out */ |
+ int *num_entrypoints /* out */ |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ switch (profile) { |
+ case VAProfileMPEG2Simple: |
+ case VAProfileMPEG2Main: |
+ *num_entrypoints = 2; |
+ entrypoint_list[0] = VAEntrypointVLD; |
+ entrypoint_list[1] = VAEntrypointMoComp; |
+ break; |
+ |
+ case VAProfileMPEG4Simple: |
+ case VAProfileMPEG4AdvancedSimple: |
+ case VAProfileMPEG4Main: |
+ *num_entrypoints = 1; |
+ entrypoint_list[0] = VAEntrypointVLD; |
+ break; |
+ |
+ case VAProfileH264Baseline: |
+ case VAProfileH264Main: |
+ case VAProfileH264High: |
+ *num_entrypoints = 1; |
+ entrypoint_list[0] = VAEntrypointVLD; |
+ break; |
+ |
+ case VAProfileVC1Simple: |
+ case VAProfileVC1Main: |
+ case VAProfileVC1Advanced: |
+ *num_entrypoints = 1; |
+ entrypoint_list[0] = VAEntrypointVLD; |
+ break; |
+ |
+ default: |
+ *num_entrypoints = 0; |
+ break; |
+ } |
+ |
+ /* If the assert fails then DUMMY_MAX_ENTRYPOINTS needs to be bigger */ |
+ ASSERT(*num_entrypoints <= DUMMY_MAX_ENTRYPOINTS); |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_GetConfigAttributes( |
+ VADriverContextP ctx, |
+ VAProfile profile, |
+ VAEntrypoint entrypoint, |
+ VAConfigAttrib *attrib_list, /* in/out */ |
+ int num_attribs |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ int i; |
+ |
+ /* Other attributes don't seem to be defined */ |
+ /* What to do if we don't know the attribute? */ |
+ for (i = 0; i < num_attribs; i++) |
+ { |
+ switch (attrib_list[i].type) |
+ { |
+ case VAConfigAttribRTFormat: |
+ attrib_list[i].value = VA_RT_FORMAT_YUV420; |
+ break; |
+ |
+ default: |
+ /* Do nothing */ |
+ attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED; |
+ break; |
+ } |
+ } |
+ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+static VAStatus dummy__update_attribute(object_config_p obj_config, VAConfigAttrib *attrib) |
+{ |
+ int i; |
+ /* Check existing attrbiutes */ |
+ for(i = 0; obj_config->attrib_count < i; i++) |
+ { |
+ if (obj_config->attrib_list[i].type == attrib->type) |
+ { |
+ /* Update existing attribute */ |
+ obj_config->attrib_list[i].value = attrib->value; |
+ return VA_STATUS_SUCCESS; |
+ } |
+ } |
+ if (obj_config->attrib_count < DUMMY_MAX_CONFIG_ATTRIBUTES) |
+ { |
+ i = obj_config->attrib_count; |
+ obj_config->attrib_list[i].type = attrib->type; |
+ obj_config->attrib_list[i].value = attrib->value; |
+ obj_config->attrib_count++; |
+ return VA_STATUS_SUCCESS; |
+ } |
+ return VA_STATUS_ERROR_MAX_NUM_EXCEEDED; |
+} |
+ |
+VAStatus dummy_CreateConfig( |
+ VADriverContextP ctx, |
+ VAProfile profile, |
+ VAEntrypoint entrypoint, |
+ VAConfigAttrib *attrib_list, |
+ int num_attribs, |
+ VAConfigID *config_id /* out */ |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ VAStatus vaStatus; |
+ int configID; |
+ object_config_p obj_config; |
+ int i; |
+ |
+ /* Validate profile & entrypoint */ |
+ switch (profile) { |
+ case VAProfileMPEG2Simple: |
+ case VAProfileMPEG2Main: |
+ if ((VAEntrypointVLD == entrypoint) || |
+ (VAEntrypointMoComp == entrypoint)) |
+ { |
+ vaStatus = VA_STATUS_SUCCESS; |
+ } |
+ else |
+ { |
+ vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT; |
+ } |
+ break; |
+ |
+ case VAProfileMPEG4Simple: |
+ case VAProfileMPEG4AdvancedSimple: |
+ case VAProfileMPEG4Main: |
+ if (VAEntrypointVLD == entrypoint) |
+ { |
+ vaStatus = VA_STATUS_SUCCESS; |
+ } |
+ else |
+ { |
+ vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT; |
+ } |
+ break; |
+ |
+ case VAProfileH264Baseline: |
+ case VAProfileH264Main: |
+ case VAProfileH264High: |
+ if (VAEntrypointVLD == entrypoint) |
+ { |
+ vaStatus = VA_STATUS_SUCCESS; |
+ } |
+ else |
+ { |
+ vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT; |
+ } |
+ break; |
+ |
+ case VAProfileVC1Simple: |
+ case VAProfileVC1Main: |
+ case VAProfileVC1Advanced: |
+ if (VAEntrypointVLD == entrypoint) |
+ { |
+ vaStatus = VA_STATUS_SUCCESS; |
+ } |
+ else |
+ { |
+ vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT; |
+ } |
+ break; |
+ |
+ default: |
+ vaStatus = VA_STATUS_ERROR_UNSUPPORTED_PROFILE; |
+ break; |
+ } |
+ |
+ if (VA_STATUS_SUCCESS != vaStatus) |
+ { |
+ return vaStatus; |
+ } |
+ |
+ configID = object_heap_allocate( &driver_data->config_heap ); |
+ obj_config = CONFIG(configID); |
+ if (NULL == obj_config) |
+ { |
+ vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; |
+ return vaStatus; |
+ } |
+ |
+ obj_config->profile = profile; |
+ obj_config->entrypoint = entrypoint; |
+ obj_config->attrib_list[0].type = VAConfigAttribRTFormat; |
+ obj_config->attrib_list[0].value = VA_RT_FORMAT_YUV420; |
+ obj_config->attrib_count = 1; |
+ |
+ for(i = 0; i < num_attribs; i++) |
+ { |
+ vaStatus = dummy__update_attribute(obj_config, &(attrib_list[i])); |
+ if (VA_STATUS_SUCCESS != vaStatus) |
+ { |
+ break; |
+ } |
+ } |
+ |
+ /* Error recovery */ |
+ if (VA_STATUS_SUCCESS != vaStatus) |
+ { |
+ object_heap_free( &driver_data->config_heap, (object_base_p) obj_config); |
+ } |
+ else |
+ { |
+ *config_id = configID; |
+ } |
+ |
+ return vaStatus; |
+} |
+ |
+VAStatus dummy_DestroyConfig( |
+ VADriverContextP ctx, |
+ VAConfigID config_id |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ VAStatus vaStatus; |
+ object_config_p obj_config; |
+ |
+ obj_config = CONFIG(config_id); |
+ if (NULL == obj_config) |
+ { |
+ vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; |
+ return vaStatus; |
+ } |
+ |
+ object_heap_free( &driver_data->config_heap, (object_base_p) obj_config); |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_QueryConfigAttributes( |
+ VADriverContextP ctx, |
+ VAConfigID config_id, |
+ VAProfile *profile, /* out */ |
+ VAEntrypoint *entrypoint, /* out */ |
+ VAConfigAttrib *attrib_list, /* out */ |
+ int *num_attribs /* out */ |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ VAStatus vaStatus = VA_STATUS_SUCCESS; |
+ object_config_p obj_config; |
+ int i; |
+ |
+ obj_config = CONFIG(config_id); |
+ ASSERT(obj_config); |
+ |
+ *profile = obj_config->profile; |
+ *entrypoint = obj_config->entrypoint; |
+ *num_attribs = obj_config->attrib_count; |
+ for(i = 0; i < obj_config->attrib_count; i++) |
+ { |
+ attrib_list[i] = obj_config->attrib_list[i]; |
+ } |
+ |
+ return vaStatus; |
+} |
+ |
+VAStatus dummy_CreateSurfaces( |
+ VADriverContextP ctx, |
+ int width, |
+ int height, |
+ int format, |
+ int num_surfaces, |
+ VASurfaceID *surfaces /* out */ |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ VAStatus vaStatus = VA_STATUS_SUCCESS; |
+ int i; |
+ |
+ /* We only support one format */ |
+ if (VA_RT_FORMAT_YUV420 != format) |
+ { |
+ return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT; |
+ } |
+ |
+ for (i = 0; i < num_surfaces; i++) |
+ { |
+ int surfaceID = object_heap_allocate( &driver_data->surface_heap ); |
+ object_surface_p obj_surface = SURFACE(surfaceID); |
+ if (NULL == obj_surface) |
+ { |
+ vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; |
+ break; |
+ } |
+ obj_surface->surface_id = surfaceID; |
+ surfaces[i] = surfaceID; |
+ } |
+ |
+ /* Error recovery */ |
+ if (VA_STATUS_SUCCESS != vaStatus) |
+ { |
+ /* surfaces[i-1] was the last successful allocation */ |
+ for(; i--; ) |
+ { |
+ object_surface_p obj_surface = SURFACE(surfaces[i]); |
+ surfaces[i] = VA_INVALID_SURFACE; |
+ ASSERT(obj_surface); |
+ object_heap_free( &driver_data->surface_heap, (object_base_p) obj_surface); |
+ } |
+ } |
+ |
+ return vaStatus; |
+} |
+ |
+VAStatus dummy_DestroySurfaces( |
+ VADriverContextP ctx, |
+ VASurfaceID *surface_list, |
+ int num_surfaces |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ int i; |
+ for(i = num_surfaces; i--; ) |
+ { |
+ object_surface_p obj_surface = SURFACE(surface_list[i]); |
+ ASSERT(obj_surface); |
+ object_heap_free( &driver_data->surface_heap, (object_base_p) obj_surface); |
+ } |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_QueryImageFormats( |
+ VADriverContextP ctx, |
+ VAImageFormat *format_list, /* out */ |
+ int *num_formats /* out */ |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_CreateImage( |
+ VADriverContextP ctx, |
+ VAImageFormat *format, |
+ int width, |
+ int height, |
+ VAImage *image /* out */ |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_DeriveImage( |
+ VADriverContextP ctx, |
+ VASurfaceID surface, |
+ VAImage *image /* out */ |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_DestroyImage( |
+ VADriverContextP ctx, |
+ VAImageID image |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_SetImagePalette( |
+ VADriverContextP ctx, |
+ VAImageID image, |
+ unsigned char *palette |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_GetImage( |
+ VADriverContextP ctx, |
+ VASurfaceID surface, |
+ int x, /* coordinates of the upper left source pixel */ |
+ int y, |
+ unsigned int width, /* width and height of the region */ |
+ unsigned int height, |
+ VAImageID image |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+ |
+VAStatus dummy_PutImage( |
+ VADriverContextP ctx, |
+ VASurfaceID surface, |
+ VAImageID image, |
+ int src_x, |
+ int src_y, |
+ unsigned int src_width, |
+ unsigned int src_height, |
+ int dest_x, |
+ int dest_y, |
+ unsigned int dest_width, |
+ unsigned int dest_height |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_QuerySubpictureFormats( |
+ VADriverContextP ctx, |
+ VAImageFormat *format_list, /* out */ |
+ unsigned int *flags, /* out */ |
+ unsigned int *num_formats /* out */ |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_CreateSubpicture( |
+ VADriverContextP ctx, |
+ VAImageID image, |
+ VASubpictureID *subpicture /* out */ |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_DestroySubpicture( |
+ VADriverContextP ctx, |
+ VASubpictureID subpicture |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_SetSubpictureImage( |
+ VADriverContextP ctx, |
+ VASubpictureID subpicture, |
+ VAImageID image |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_SetSubpicturePalette( |
+ VADriverContextP ctx, |
+ VASubpictureID subpicture, |
+ /* |
+ * pointer to an array holding the palette data. The size of the array is |
+ * num_palette_entries * entry_bytes in size. The order of the components |
+ * in the palette is described by the component_order in VASubpicture struct |
+ */ |
+ unsigned char *palette |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_SetSubpictureChromakey( |
+ VADriverContextP ctx, |
+ VASubpictureID subpicture, |
+ unsigned int chromakey_min, |
+ unsigned int chromakey_max, |
+ unsigned int chromakey_mask |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_SetSubpictureGlobalAlpha( |
+ VADriverContextP ctx, |
+ VASubpictureID subpicture, |
+ float global_alpha |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+ |
+VAStatus dummy_AssociateSubpicture( |
+ VADriverContextP ctx, |
+ VASubpictureID subpicture, |
+ VASurfaceID *target_surfaces, |
+ int num_surfaces, |
+ short src_x, /* upper left offset in subpicture */ |
+ short src_y, |
+ unsigned short src_width, |
+ unsigned short src_height, |
+ short dest_x, /* upper left offset in surface */ |
+ short dest_y, |
+ unsigned short dest_width, |
+ unsigned short dest_height, |
+ /* |
+ * whether to enable chroma-keying or global-alpha |
+ * see VA_SUBPICTURE_XXX values |
+ */ |
+ unsigned int flags |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_DeassociateSubpicture( |
+ VADriverContextP ctx, |
+ VASubpictureID subpicture, |
+ VASurfaceID *target_surfaces, |
+ int num_surfaces |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ |
+ /* TODO */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_CreateContext( |
+ VADriverContextP ctx, |
+ VAConfigID config_id, |
+ int picture_width, |
+ int picture_height, |
+ int flag, |
+ VASurfaceID *render_targets, |
+ int num_render_targets, |
+ VAContextID *context /* out */ |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ VAStatus vaStatus = VA_STATUS_SUCCESS; |
+ object_config_p obj_config; |
+ int i; |
+ |
+ obj_config = CONFIG(config_id); |
+ if (NULL == obj_config) |
+ { |
+ vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; |
+ return vaStatus; |
+ } |
+ |
+ /* Validate flag */ |
+ /* Validate picture dimensions */ |
+ |
+ int contextID = object_heap_allocate( &driver_data->context_heap ); |
+ object_context_p obj_context = CONTEXT(contextID); |
+ if (NULL == obj_context) |
+ { |
+ vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; |
+ return vaStatus; |
+ } |
+ |
+ obj_context->context_id = contextID; |
+ *context = contextID; |
+ obj_context->current_render_target = -1; |
+ obj_context->config_id = config_id; |
+ obj_context->picture_width = picture_width; |
+ obj_context->picture_height = picture_height; |
+ obj_context->num_render_targets = num_render_targets; |
+ obj_context->render_targets = (VASurfaceID *) malloc(num_render_targets * sizeof(VASurfaceID)); |
+ if (obj_context->render_targets == NULL) |
+ { |
+ vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; |
+ return vaStatus; |
+ } |
+ |
+ for(i = 0; i < num_render_targets; i++) |
+ { |
+ if (NULL == SURFACE(render_targets[i])) |
+ { |
+ vaStatus = VA_STATUS_ERROR_INVALID_SURFACE; |
+ break; |
+ } |
+ obj_context->render_targets[i] = render_targets[i]; |
+ } |
+ obj_context->flags = flag; |
+ |
+ /* Error recovery */ |
+ if (VA_STATUS_SUCCESS != vaStatus) |
+ { |
+ obj_context->context_id = -1; |
+ obj_context->config_id = -1; |
+ free(obj_context->render_targets); |
+ obj_context->render_targets = NULL; |
+ obj_context->num_render_targets = 0; |
+ obj_context->flags = 0; |
+ object_heap_free( &driver_data->context_heap, (object_base_p) obj_context); |
+ } |
+ |
+ return vaStatus; |
+} |
+ |
+ |
+VAStatus dummy_DestroyContext( |
+ VADriverContextP ctx, |
+ VAContextID context |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ object_context_p obj_context = CONTEXT(context); |
+ ASSERT(obj_context); |
+ |
+ obj_context->context_id = -1; |
+ obj_context->config_id = -1; |
+ obj_context->picture_width = 0; |
+ obj_context->picture_height = 0; |
+ if (obj_context->render_targets) |
+ { |
+ free(obj_context->render_targets); |
+ } |
+ obj_context->render_targets = NULL; |
+ obj_context->num_render_targets = 0; |
+ obj_context->flags = 0; |
+ |
+ obj_context->current_render_target = -1; |
+ |
+ object_heap_free( &driver_data->context_heap, (object_base_p) obj_context); |
+ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+ |
+ |
+static VAStatus dummy__allocate_buffer(object_buffer_p obj_buffer, int size) |
+{ |
+ VAStatus vaStatus = VA_STATUS_SUCCESS; |
+ |
+ obj_buffer->buffer_data = realloc(obj_buffer->buffer_data, size); |
+ if (NULL == obj_buffer->buffer_data) |
+ { |
+ vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; |
+ } |
+ return vaStatus; |
+} |
+ |
+VAStatus dummy_CreateBuffer( |
+ VADriverContextP ctx, |
+ VAContextID context, /* in */ |
+ VABufferType type, /* in */ |
+ unsigned int size, /* in */ |
+ unsigned int num_elements, /* in */ |
+ void *data, /* in */ |
+ VABufferID *buf_id /* out */ |
+) |
+{ |
+ INIT_DRIVER_DATA |
+ VAStatus vaStatus = VA_STATUS_SUCCESS; |
+ int bufferID; |
+ object_buffer_p obj_buffer; |
+ |
+ /* Validate type */ |
+ switch (type) |
+ { |
+ case VAPictureParameterBufferType: |
+ case VAIQMatrixBufferType: |
+ case VABitPlaneBufferType: |
+ case VASliceGroupMapBufferType: |
+ case VASliceParameterBufferType: |
+ case VASliceDataBufferType: |
+ case VAMacroblockParameterBufferType: |
+ case VAResidualDataBufferType: |
+ case VADeblockingParameterBufferType: |
+ case VAImageBufferType: |
+ /* Ok */ |
+ break; |
+ default: |
+ vaStatus = VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE; |
+ return vaStatus; |
+ } |
+ |
+ bufferID = object_heap_allocate( &driver_data->buffer_heap ); |
+ obj_buffer = BUFFER(bufferID); |
+ if (NULL == obj_buffer) |
+ { |
+ vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; |
+ return vaStatus; |
+ } |
+ |
+ obj_buffer->buffer_data = NULL; |
+ |
+ vaStatus = dummy__allocate_buffer(obj_buffer, size * num_elements); |
+ if (VA_STATUS_SUCCESS == vaStatus) |
+ { |
+ obj_buffer->max_num_elements = num_elements; |
+ obj_buffer->num_elements = num_elements; |
+ if (data) |
+ { |
+ memcpy(obj_buffer->buffer_data, data, size * num_elements); |
+ } |
+ } |
+ |
+ if (VA_STATUS_SUCCESS == vaStatus) |
+ { |
+ *buf_id = bufferID; |
+ } |
+ |
+ return vaStatus; |
+} |
+ |
+ |
+VAStatus dummy_BufferSetNumElements( |
+ VADriverContextP ctx, |
+ VABufferID buf_id, /* in */ |
+ unsigned int num_elements /* in */ |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ VAStatus vaStatus = VA_STATUS_SUCCESS; |
+ object_buffer_p obj_buffer = BUFFER(buf_id); |
+ ASSERT(obj_buffer); |
+ |
+ if ((num_elements < 0) || (num_elements > obj_buffer->max_num_elements)) |
+ { |
+ vaStatus = VA_STATUS_ERROR_UNKNOWN; |
+ } |
+ if (VA_STATUS_SUCCESS == vaStatus) |
+ { |
+ obj_buffer->num_elements = num_elements; |
+ } |
+ |
+ return vaStatus; |
+} |
+ |
+VAStatus dummy_MapBuffer( |
+ VADriverContextP ctx, |
+ VABufferID buf_id, /* in */ |
+ void **pbuf /* out */ |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN; |
+ object_buffer_p obj_buffer = BUFFER(buf_id); |
+ ASSERT(obj_buffer); |
+ if (NULL == obj_buffer) |
+ { |
+ vaStatus = VA_STATUS_ERROR_INVALID_BUFFER; |
+ return vaStatus; |
+ } |
+ |
+ if (NULL != obj_buffer->buffer_data) |
+ { |
+ *pbuf = obj_buffer->buffer_data; |
+ vaStatus = VA_STATUS_SUCCESS; |
+ } |
+ return vaStatus; |
+} |
+ |
+VAStatus dummy_UnmapBuffer( |
+ VADriverContextP ctx, |
+ VABufferID buf_id /* in */ |
+ ) |
+{ |
+ /* Do nothing */ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+static void dummy__destroy_buffer(struct dummy_driver_data *driver_data, object_buffer_p obj_buffer) |
+{ |
+ if (NULL != obj_buffer->buffer_data) |
+ { |
+ free(obj_buffer->buffer_data); |
+ obj_buffer->buffer_data = NULL; |
+ } |
+ |
+ object_heap_free( &driver_data->buffer_heap, (object_base_p) obj_buffer); |
+} |
+ |
+VAStatus dummy_DestroyBuffer( |
+ VADriverContextP ctx, |
+ VABufferID buffer_id |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ object_buffer_p obj_buffer = BUFFER(buffer_id); |
+ ASSERT(obj_buffer); |
+ |
+ dummy__destroy_buffer(driver_data, obj_buffer); |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus dummy_BeginPicture( |
+ VADriverContextP ctx, |
+ VAContextID context, |
+ VASurfaceID render_target |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ VAStatus vaStatus = VA_STATUS_SUCCESS; |
+ object_context_p obj_context; |
+ object_surface_p obj_surface; |
+ |
+ obj_context = CONTEXT(context); |
+ ASSERT(obj_context); |
+ |
+ obj_surface = SURFACE(render_target); |
+ ASSERT(obj_surface); |
+ |
+ obj_context->current_render_target = obj_surface->base.id; |
+ |
+ return vaStatus; |
+} |
+ |
+VAStatus dummy_RenderPicture( |
+ VADriverContextP ctx, |
+ VAContextID context, |
+ VABufferID *buffers, |
+ int num_buffers |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ VAStatus vaStatus = VA_STATUS_SUCCESS; |
+ object_context_p obj_context; |
+ object_surface_p obj_surface; |
+ int i; |
+ |
+ obj_context = CONTEXT(context); |
+ ASSERT(obj_context); |
+ |
+ obj_surface = SURFACE(obj_context->current_render_target); |
+ ASSERT(obj_surface); |
+ |
+ /* verify that we got valid buffer references */ |
+ for(i = 0; i < num_buffers; i++) |
+ { |
+ object_buffer_p obj_buffer = BUFFER(buffers[i]); |
+ ASSERT(obj_buffer); |
+ if (NULL == obj_buffer) |
+ { |
+ vaStatus = VA_STATUS_ERROR_INVALID_BUFFER; |
+ break; |
+ } |
+ } |
+ |
+ /* Release buffers */ |
+ for(i = 0; i < num_buffers; i++) |
+ { |
+ object_buffer_p obj_buffer = BUFFER(buffers[i]); |
+ ASSERT(obj_buffer); |
+ dummy__destroy_buffer(driver_data, obj_buffer); |
+ } |
+ |
+ return vaStatus; |
+} |
+ |
+VAStatus dummy_EndPicture( |
+ VADriverContextP ctx, |
+ VAContextID context |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ VAStatus vaStatus = VA_STATUS_SUCCESS; |
+ object_context_p obj_context; |
+ object_surface_p obj_surface; |
+ |
+ obj_context = CONTEXT(context); |
+ ASSERT(obj_context); |
+ |
+ obj_surface = SURFACE(obj_context->current_render_target); |
+ ASSERT(obj_surface); |
+ |
+ // For now, assume that we are done with rendering right away |
+ obj_context->current_render_target = -1; |
+ |
+ return vaStatus; |
+} |
+ |
+ |
+VAStatus dummy_SyncSurface( |
+ VADriverContextP ctx, |
+ VASurfaceID render_target |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ VAStatus vaStatus = VA_STATUS_SUCCESS; |
+ object_surface_p obj_surface; |
+ |
+ obj_surface = SURFACE(render_target); |
+ ASSERT(obj_surface); |
+ |
+ return vaStatus; |
+} |
+ |
+VAStatus dummy_QuerySurfaceStatus( |
+ VADriverContextP ctx, |
+ VASurfaceID render_target, |
+ VASurfaceStatus *status /* out */ |
+ ) |
+{ |
+ INIT_DRIVER_DATA |
+ VAStatus vaStatus = VA_STATUS_SUCCESS; |
+ object_surface_p obj_surface; |
+ |
+ obj_surface = SURFACE(render_target); |
+ ASSERT(obj_surface); |
+ |
+ *status = VASurfaceReady; |
+ |
+ return vaStatus; |
+} |
+ |
+VAStatus dummy_PutSurface( |
+ VADriverContextP ctx, |
+ VASurfaceID surface, |
+ void *draw, /* X Drawable */ |
+ short srcx, |
+ short srcy, |
+ unsigned short srcw, |
+ unsigned short srch, |
+ short destx, |
+ short desty, |
+ unsigned short destw, |
+ unsigned short desth, |
+ VARectangle *cliprects, /* client supplied clip list */ |
+ unsigned int number_cliprects, /* number of clip rects in the clip list */ |
+ unsigned int flags /* de-interlacing flags */ |
+ ) |
+{ |
+ /* TODO */ |
+ void *drawable = (void *)draw; |
+ |
+ (void)drawable; |
+ |
+ return VA_STATUS_ERROR_UNKNOWN; |
+} |
+ |
+/* |
+ * Query display attributes |
+ * The caller must provide a "attr_list" array that can hold at |
+ * least vaMaxNumDisplayAttributes() entries. The actual number of attributes |
+ * returned in "attr_list" is returned in "num_attributes". |
+ */ |
+VAStatus dummy_QueryDisplayAttributes ( |
+ VADriverContextP ctx, |
+ VADisplayAttribute *attr_list, /* out */ |
+ int *num_attributes /* out */ |
+ ) |
+{ |
+ /* TODO */ |
+ return VA_STATUS_ERROR_UNKNOWN; |
+} |
+ |
+/* |
+ * Get display attributes |
+ * This function returns the current attribute values in "attr_list". |
+ * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field |
+ * from vaQueryDisplayAttributes() can have their values retrieved. |
+ */ |
+VAStatus dummy_GetDisplayAttributes ( |
+ VADriverContextP ctx, |
+ VADisplayAttribute *attr_list, /* in/out */ |
+ int num_attributes |
+ ) |
+{ |
+ /* TODO */ |
+ return VA_STATUS_ERROR_UNKNOWN; |
+} |
+ |
+/* |
+ * Set display attributes |
+ * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field |
+ * from vaQueryDisplayAttributes() can be set. If the attribute is not settable or |
+ * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED |
+ */ |
+VAStatus dummy_SetDisplayAttributes ( |
+ VADriverContextP ctx, |
+ VADisplayAttribute *attr_list, |
+ int num_attributes |
+ ) |
+{ |
+ /* TODO */ |
+ return VA_STATUS_ERROR_UNKNOWN; |
+} |
+ |
+ |
+VAStatus dummy_BufferInfo( |
+ VADriverContextP ctx, |
+ VABufferID buf_id, /* in */ |
+ VABufferType *type, /* out */ |
+ unsigned int *size, /* out */ |
+ unsigned int *num_elements /* out */ |
+ ) |
+{ |
+ /* TODO */ |
+ return VA_STATUS_ERROR_UNIMPLEMENTED; |
+} |
+ |
+ |
+ |
+VAStatus dummy_LockSurface( |
+ VADriverContextP ctx, |
+ VASurfaceID surface, |
+ unsigned int *fourcc, /* following are output argument */ |
+ unsigned int *luma_stride, |
+ unsigned int *chroma_u_stride, |
+ unsigned int *chroma_v_stride, |
+ unsigned int *luma_offset, |
+ unsigned int *chroma_u_offset, |
+ unsigned int *chroma_v_offset, |
+ unsigned int *buffer_name, |
+ void **buffer |
+ ) |
+{ |
+ /* TODO */ |
+ return VA_STATUS_ERROR_UNIMPLEMENTED; |
+} |
+ |
+VAStatus dummy_UnlockSurface( |
+ VADriverContextP ctx, |
+ VASurfaceID surface |
+ ) |
+{ |
+ /* TODO */ |
+ return VA_STATUS_ERROR_UNIMPLEMENTED; |
+} |
+ |
+VAStatus dummy_Terminate( VADriverContextP ctx ) |
+{ |
+ INIT_DRIVER_DATA |
+ object_buffer_p obj_buffer; |
+ object_surface_p obj_surface; |
+ object_context_p obj_context; |
+ object_config_p obj_config; |
+ object_heap_iterator iter; |
+ |
+ /* Clean up left over buffers */ |
+ obj_buffer = (object_buffer_p) object_heap_first( &driver_data->buffer_heap, &iter); |
+ while (obj_buffer) |
+ { |
+ dummy__information_message("vaTerminate: bufferID %08x still allocated, destroying\n", obj_buffer->base.id); |
+ dummy__destroy_buffer(driver_data, obj_buffer); |
+ obj_buffer = (object_buffer_p) object_heap_next( &driver_data->buffer_heap, &iter); |
+ } |
+ object_heap_destroy( &driver_data->buffer_heap ); |
+ |
+ /* TODO cleanup */ |
+ object_heap_destroy( &driver_data->surface_heap ); |
+ |
+ /* TODO cleanup */ |
+ object_heap_destroy( &driver_data->context_heap ); |
+ |
+ /* Clean up configIDs */ |
+ obj_config = (object_config_p) object_heap_first( &driver_data->config_heap, &iter); |
+ while (obj_config) |
+ { |
+ object_heap_free( &driver_data->config_heap, (object_base_p) obj_config); |
+ obj_config = (object_config_p) object_heap_next( &driver_data->config_heap, &iter); |
+ } |
+ object_heap_destroy( &driver_data->config_heap ); |
+ |
+ free(ctx->pDriverData); |
+ ctx->pDriverData = NULL; |
+ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |
+VAStatus VA_DRIVER_INIT_FUNC( VADriverContextP ctx ) |
+{ |
+ struct VADriverVTable * const vtable = ctx->vtable; |
+ object_base_p obj; |
+ int result; |
+ struct dummy_driver_data *driver_data; |
+ int i; |
+ |
+ ctx->version_major = VA_MAJOR_VERSION; |
+ ctx->version_minor = VA_MINOR_VERSION; |
+ ctx->max_profiles = DUMMY_MAX_PROFILES; |
+ ctx->max_entrypoints = DUMMY_MAX_ENTRYPOINTS; |
+ ctx->max_attributes = DUMMY_MAX_CONFIG_ATTRIBUTES; |
+ ctx->max_image_formats = DUMMY_MAX_IMAGE_FORMATS; |
+ ctx->max_subpic_formats = DUMMY_MAX_SUBPIC_FORMATS; |
+ ctx->max_display_attributes = DUMMY_MAX_DISPLAY_ATTRIBUTES; |
+ ctx->str_vendor = DUMMY_STR_VENDOR; |
+ |
+ vtable->vaTerminate = dummy_Terminate; |
+ vtable->vaQueryConfigEntrypoints = dummy_QueryConfigEntrypoints; |
+ vtable->vaQueryConfigProfiles = dummy_QueryConfigProfiles; |
+ vtable->vaQueryConfigEntrypoints = dummy_QueryConfigEntrypoints; |
+ vtable->vaQueryConfigAttributes = dummy_QueryConfigAttributes; |
+ vtable->vaCreateConfig = dummy_CreateConfig; |
+ vtable->vaDestroyConfig = dummy_DestroyConfig; |
+ vtable->vaGetConfigAttributes = dummy_GetConfigAttributes; |
+ vtable->vaCreateSurfaces = dummy_CreateSurfaces; |
+ vtable->vaDestroySurfaces = dummy_DestroySurfaces; |
+ vtable->vaCreateContext = dummy_CreateContext; |
+ vtable->vaDestroyContext = dummy_DestroyContext; |
+ vtable->vaCreateBuffer = dummy_CreateBuffer; |
+ vtable->vaBufferSetNumElements = dummy_BufferSetNumElements; |
+ vtable->vaMapBuffer = dummy_MapBuffer; |
+ vtable->vaUnmapBuffer = dummy_UnmapBuffer; |
+ vtable->vaDestroyBuffer = dummy_DestroyBuffer; |
+ vtable->vaBeginPicture = dummy_BeginPicture; |
+ vtable->vaRenderPicture = dummy_RenderPicture; |
+ vtable->vaEndPicture = dummy_EndPicture; |
+ vtable->vaSyncSurface = dummy_SyncSurface; |
+ vtable->vaQuerySurfaceStatus = dummy_QuerySurfaceStatus; |
+ vtable->vaPutSurface = dummy_PutSurface; |
+ vtable->vaQueryImageFormats = dummy_QueryImageFormats; |
+ vtable->vaCreateImage = dummy_CreateImage; |
+ vtable->vaDeriveImage = dummy_DeriveImage; |
+ vtable->vaDestroyImage = dummy_DestroyImage; |
+ vtable->vaSetImagePalette = dummy_SetImagePalette; |
+ vtable->vaGetImage = dummy_GetImage; |
+ vtable->vaPutImage = dummy_PutImage; |
+ vtable->vaQuerySubpictureFormats = dummy_QuerySubpictureFormats; |
+ vtable->vaCreateSubpicture = dummy_CreateSubpicture; |
+ vtable->vaDestroySubpicture = dummy_DestroySubpicture; |
+ vtable->vaSetSubpictureImage = dummy_SetSubpictureImage; |
+ vtable->vaSetSubpictureChromakey = dummy_SetSubpictureChromakey; |
+ vtable->vaSetSubpictureGlobalAlpha = dummy_SetSubpictureGlobalAlpha; |
+ vtable->vaAssociateSubpicture = dummy_AssociateSubpicture; |
+ vtable->vaDeassociateSubpicture = dummy_DeassociateSubpicture; |
+ vtable->vaQueryDisplayAttributes = dummy_QueryDisplayAttributes; |
+ vtable->vaGetDisplayAttributes = dummy_GetDisplayAttributes; |
+ vtable->vaSetDisplayAttributes = dummy_SetDisplayAttributes; |
+ vtable->vaLockSurface = dummy_LockSurface; |
+ vtable->vaUnlockSurface = dummy_UnlockSurface; |
+ vtable->vaBufferInfo = dummy_BufferInfo; |
+ |
+ driver_data = (struct dummy_driver_data *) malloc( sizeof(*driver_data) ); |
+ ctx->pDriverData = (void *) driver_data; |
+ |
+ result = object_heap_init( &driver_data->config_heap, sizeof(struct object_config), CONFIG_ID_OFFSET ); |
+ ASSERT( result == 0 ); |
+ |
+ result = object_heap_init( &driver_data->context_heap, sizeof(struct object_context), CONTEXT_ID_OFFSET ); |
+ ASSERT( result == 0 ); |
+ |
+ result = object_heap_init( &driver_data->surface_heap, sizeof(struct object_surface), SURFACE_ID_OFFSET ); |
+ ASSERT( result == 0 ); |
+ |
+ result = object_heap_init( &driver_data->buffer_heap, sizeof(struct object_buffer), BUFFER_ID_OFFSET ); |
+ ASSERT( result == 0 ); |
+ |
+ |
+ return VA_STATUS_SUCCESS; |
+} |
+ |