From 4b7e71668e273239f484d3149492981e04d1ddab Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski Date: Mon, 23 Apr 2018 16:51:11 +0200 Subject: [PATCH] Reorder functions, with a straightforward logic Signed-off-by: Paul Kocialkowski --- src/buffer.c | 56 ++++++++++++++-------------- src/buffer.h | 10 ++--- src/context.c | 1 - src/image.c | 38 +++++++++---------- src/image.h | 6 +-- src/picture.c | 2 - src/subpicture.c | 10 ++--- src/subpicture.h | 6 +-- src/sunxi_cedrus.c | 93 ++++++++++++++++++++++++---------------------- src/sunxi_cedrus.h | 7 +++- src/surface.c | 1 - 11 files changed, 116 insertions(+), 114 deletions(-) diff --git a/src/buffer.c b/src/buffer.c index ae8cf9c..9031907 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -120,21 +120,33 @@ VAStatus SunxiCedrusCreateBuffer(VADriverContextP context, return VA_STATUS_SUCCESS; } -VAStatus SunxiCedrusBufferSetNumElements(VADriverContextP context, - VABufferID buffer_id, unsigned int count) +void sunxi_cedrus_destroy_buffer(struct sunxi_cedrus_driver_data *driver_data, + struct object_buffer *obj_buffer) +{ + if (obj_buffer->data != NULL) { + if (obj_buffer->type != VASliceDataBufferType) + free(obj_buffer->data); + else if (obj_buffer->map != NULL && obj_buffer->map_size > 0) + munmap(obj_buffer->map, obj_buffer->map_size); + + obj_buffer->map = NULL; + obj_buffer->data = NULL; + } + + object_heap_free(&driver_data->buffer_heap, obj_buffer); +} + +VAStatus SunxiCedrusDestroyBuffer(VADriverContextP context, + VABufferID buffer_id) { struct sunxi_cedrus_driver_data *driver_data = (struct sunxi_cedrus_driver_data *) context->pDriverData; - VAStatus vaStatus = VA_STATUS_SUCCESS; struct object_buffer *obj_buffer = BUFFER(buffer_id); assert(obj_buffer); - if ((count < 0) || (count > obj_buffer->initial_count)) - vaStatus = VA_STATUS_ERROR_UNKNOWN; - if (VA_STATUS_SUCCESS == vaStatus) - obj_buffer->count = count; + sunxi_cedrus_destroy_buffer(driver_data, obj_buffer); - return vaStatus; + return VA_STATUS_SUCCESS; } VAStatus SunxiCedrusMapBuffer(VADriverContextP context, VABufferID buffer_id, @@ -173,33 +185,21 @@ VAStatus SunxiCedrusUnmapBuffer(VADriverContextP context, VABufferID buffer_id) return VA_STATUS_SUCCESS; } -void sunxi_cedrus_destroy_buffer(struct sunxi_cedrus_driver_data *driver_data, - struct object_buffer *obj_buffer) -{ - if (obj_buffer->data != NULL) { - if (obj_buffer->type != VASliceDataBufferType) - free(obj_buffer->data); - else if (obj_buffer->map != NULL && obj_buffer->map_size > 0) - munmap(obj_buffer->map, obj_buffer->map_size); - - obj_buffer->map = NULL; - obj_buffer->data = NULL; - } - - object_heap_free(&driver_data->buffer_heap, obj_buffer); -} - -VAStatus SunxiCedrusDestroyBuffer(VADriverContextP context, - VABufferID buffer_id) +VAStatus SunxiCedrusBufferSetNumElements(VADriverContextP context, + VABufferID buffer_id, unsigned int count) { struct sunxi_cedrus_driver_data *driver_data = (struct sunxi_cedrus_driver_data *) context->pDriverData; + VAStatus vaStatus = VA_STATUS_SUCCESS; struct object_buffer *obj_buffer = BUFFER(buffer_id); assert(obj_buffer); - sunxi_cedrus_destroy_buffer(driver_data, obj_buffer); + if ((count < 0) || (count > obj_buffer->initial_count)) + vaStatus = VA_STATUS_ERROR_UNKNOWN; + if (VA_STATUS_SUCCESS == vaStatus) + obj_buffer->count = count; - return VA_STATUS_SUCCESS; + return vaStatus; } VAStatus SunxiCedrusBufferInfo(VADriverContextP context, VABufferID buffer_id, diff --git a/src/buffer.h b/src/buffer.h index e8077bd..32b4b6e 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -51,15 +51,15 @@ struct object_buffer { VAStatus SunxiCedrusCreateBuffer(VADriverContextP context, VAContextID context_id, VABufferType type, unsigned int size, unsigned int count, void *data, VABufferID *buffer_id); -VAStatus SunxiCedrusBufferSetNumElements(VADriverContextP context, - VABufferID buffer_id, unsigned int count); -VAStatus SunxiCedrusMapBuffer(VADriverContextP context, VABufferID buffer_id, - void **data_map); -VAStatus SunxiCedrusUnmapBuffer(VADriverContextP context, VABufferID buffer_id); void sunxi_cedrus_destroy_buffer(struct sunxi_cedrus_driver_data *driver_data, struct object_buffer *obj_buffer); VAStatus SunxiCedrusDestroyBuffer(VADriverContextP context, VABufferID buffer_id); +VAStatus SunxiCedrusMapBuffer(VADriverContextP context, VABufferID buffer_id, + void **data_map); +VAStatus SunxiCedrusUnmapBuffer(VADriverContextP context, VABufferID buffer_id); +VAStatus SunxiCedrusBufferSetNumElements(VADriverContextP context, + VABufferID buffer_id, unsigned int count); VAStatus SunxiCedrusBufferInfo(VADriverContextP context, VABufferID buffer_id, VABufferType *type, unsigned int *size, unsigned int *count); diff --git a/src/context.c b/src/context.c index 59045cc..04b3dd1 100644 --- a/src/context.c +++ b/src/context.c @@ -171,4 +171,3 @@ VAStatus SunxiCedrusDestroyContext(VADriverContextP context, return VA_STATUS_SUCCESS; } - diff --git a/src/image.c b/src/image.c index 6337275..0466b32 100644 --- a/src/image.c +++ b/src/image.c @@ -32,14 +32,6 @@ #include "tiled_yuv.h" -VAStatus SunxiCedrusQueryImageFormats(VADriverContextP context, - VAImageFormat *formats, int *formats_count) -{ - formats[0].fourcc = VA_FOURCC_NV12; - *formats_count = 1; - return VA_STATUS_SUCCESS; -} - VAStatus SunxiCedrusCreateImage(VADriverContextP context, VAImageFormat *format, int width, int height, VAImage *image) { @@ -81,6 +73,21 @@ VAStatus SunxiCedrusCreateImage(VADriverContextP context, VAImageFormat *format, return VA_STATUS_SUCCESS; } +VAStatus SunxiCedrusDestroyImage(VADriverContextP context, VAImageID image_id) +{ + struct sunxi_cedrus_driver_data *driver_data = + (struct sunxi_cedrus_driver_data *) context->pDriverData; + struct object_image *obj_img; + + obj_img = IMAGE(image); + assert(obj_img); + + SunxiCedrusDestroyBuffer(context, obj_img->buf); + object_heap_free(&driver_data->image_heap, &obj_img->base); + + return VA_STATUS_SUCCESS; +} + VAStatus SunxiCedrusDeriveImage(VADriverContextP context, VASurfaceID surface_id, VAImage *image) { @@ -112,18 +119,11 @@ VAStatus SunxiCedrusDeriveImage(VADriverContextP context, return VA_STATUS_SUCCESS; } -VAStatus SunxiCedrusDestroyImage(VADriverContextP context, VAImageID image_id) +VAStatus SunxiCedrusQueryImageFormats(VADriverContextP context, + VAImageFormat *formats, int *formats_count) { - struct sunxi_cedrus_driver_data *driver_data = - (struct sunxi_cedrus_driver_data *) context->pDriverData; - struct object_image *obj_img; - - obj_img = IMAGE(image); - assert(obj_img); - - SunxiCedrusDestroyBuffer(context, obj_img->buf); - object_heap_free(&driver_data->image_heap, &obj_img->base); - + formats[0].fourcc = VA_FOURCC_NV12; + *formats_count = 1; return VA_STATUS_SUCCESS; } diff --git a/src/image.h b/src/image.h index 80a457b..252e6f9 100644 --- a/src/image.h +++ b/src/image.h @@ -38,13 +38,13 @@ struct object_image { VABufferID buffer_id; }; -VAStatus SunxiCedrusQueryImageFormats(VADriverContextP context, - VAImageFormat *formats, int *formats_count); VAStatus SunxiCedrusCreateImage(VADriverContextP context, VAImageFormat *format, int width, int height, VAImage *image); +VAStatus SunxiCedrusDestroyImage(VADriverContextP context, VAImageID image_id); VAStatus SunxiCedrusDeriveImage(VADriverContextP context, VASurfaceID surface_id, VAImage *image); -VAStatus SunxiCedrusDestroyImage(VADriverContextP context, VAImageID image_id); +VAStatus SunxiCedrusQueryImageFormats(VADriverContextP context, + VAImageFormat *formats, int *formats_count); VAStatus SunxiCedrusSetImagePalette(VADriverContextP context, VAImageID image_id, unsigned char *palette); VAStatus SunxiCedrusGetImage(VADriverContextP context, VASurfaceID surface_id, diff --git a/src/picture.c b/src/picture.c index 91da88d..25da3fd 100644 --- a/src/picture.c +++ b/src/picture.c @@ -233,5 +233,3 @@ VAStatus SunxiCedrusEndPicture(VADriverContextP context, return vaStatus; } - - diff --git a/src/subpicture.c b/src/subpicture.c index 316ea9f..044daec 100644 --- a/src/subpicture.c +++ b/src/subpicture.c @@ -26,11 +26,6 @@ #include "sunxi_cedrus.h" #include "subpicture.h" -VAStatus SunxiCedrusQuerySubpictureFormats(VADriverContextP context, - VAImageFormat *formats, unsigned int *flags, - unsigned int *formats_count) -{ return VA_STATUS_SUCCESS; } - VAStatus SunxiCedrusCreateSubpicture(VADriverContextP context, VAImageID image_id, VASubpictureID *subpicture_id) { return VA_STATUS_SUCCESS; } @@ -39,6 +34,11 @@ VAStatus SunxiCedrusDestroySubpicture(VADriverContextP context, VASubpictureID subpicture_id) { return VA_STATUS_SUCCESS; } +VAStatus SunxiCedrusQuerySubpictureFormats(VADriverContextP context, + VAImageFormat *formats, unsigned int *flags, + unsigned int *formats_count) +{ return VA_STATUS_SUCCESS; } + VAStatus SunxiCedrusSetSubpictureImage(VADriverContextP context, VASubpictureID subpicture_id, VAImageID image_id) { return VA_STATUS_SUCCESS; } diff --git a/src/subpicture.h b/src/subpicture.h index a871335..cd1376a 100644 --- a/src/subpicture.h +++ b/src/subpicture.h @@ -28,13 +28,13 @@ #include -VAStatus SunxiCedrusQuerySubpictureFormats(VADriverContextP context, - VAImageFormat *formats, unsigned int *flags, - unsigned int *formats_count); VAStatus SunxiCedrusCreateSubpicture(VADriverContextP context, VAImageID image_id, VASubpictureID *subpicture_id); VAStatus SunxiCedrusDestroySubpicture(VADriverContextP context, VASubpictureID subpicture_id); +VAStatus SunxiCedrusQuerySubpictureFormats(VADriverContextP context, + VAImageFormat *formats, unsigned int *flags, + unsigned int *formats_count); VAStatus SunxiCedrusSetSubpictureImage(VADriverContextP context, VASubpictureID subpicture_id, VAImageID image_id); VAStatus SunxiCedrusSetSubpicturePalette(VADriverContextP context, diff --git a/src/sunxi_cedrus.c b/src/sunxi_cedrus.c index 68d5b81..977db56 100644 --- a/src/sunxi_cedrus.c +++ b/src/sunxi_cedrus.c @@ -60,52 +60,11 @@ void sunxi_cedrus_msg(const char *msg, ...) va_end(args); } -VAStatus SunxiCedrusTerminate(VADriverContextP context) -{ - struct sunxi_cedrus_driver_data *driver_data = - (struct sunxi_cedrus_driver_data *) context->pDriverData; - struct object_buffer *obj_buffer; - struct object_config *obj_config; - object_heap_iterator iter; +/* Set default visibility for the init function only. */ +VAStatus __attribute__((visibility("default"))) + VA_DRIVER_INIT_FUNC(VADriverContextP context); - /* Free memory and close v4l device */ - - for (int i = 0; i < INPUT_BUFFERS_NB; i++) - if (driver_data->request_fds[i] >= 0) - close(driver_data->request_fds[i]); - - close(driver_data->mem2mem_fd); - - /* Clean up left over buffers */ - obj_buffer = (struct object_buffer *) object_heap_first(&driver_data->buffer_heap, &iter); - while (obj_buffer) - { - sunxi_cedrus_msg("vaTerminate: bufferID %08x still allocated, destroying\n", obj_buffer->base.id); - sunxi_cedrus_destroy_buffer(driver_data, obj_buffer); - obj_buffer = (struct object_buffer *) object_heap_next(&driver_data->buffer_heap, &iter); - } - - object_heap_destroy(&driver_data->buffer_heap); - object_heap_destroy(&driver_data->surface_heap); - object_heap_destroy(&driver_data->context_heap); - - /* Clean up configIDs */ - obj_config = (struct object_config *) 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 = (struct object_config *) object_heap_next(&driver_data->config_heap, &iter); - } - object_heap_destroy(&driver_data->config_heap); - - free(context->pDriverData); - context->pDriverData = NULL; - - return VA_STATUS_SUCCESS; -} - -/* Only expose the init function. */ -VAStatus __attribute__((visibility("default"))) VA_DRIVER_INIT_FUNC(VADriverContextP context) +VAStatus VA_DRIVER_INIT_FUNC(VADriverContextP context) { struct VADriverVTable * const vtable = context->vtable; struct sunxi_cedrus_driver_data *driver_data; @@ -203,3 +162,47 @@ VAStatus __attribute__((visibility("default"))) VA_DRIVER_INIT_FUNC(VADriverCont return VA_STATUS_SUCCESS; } + +VAStatus SunxiCedrusTerminate(VADriverContextP context) +{ + struct sunxi_cedrus_driver_data *driver_data = + (struct sunxi_cedrus_driver_data *) context->pDriverData; + struct object_buffer *obj_buffer; + struct object_config *obj_config; + object_heap_iterator iter; + + /* Free memory and close v4l device */ + + for (int i = 0; i < INPUT_BUFFERS_NB; i++) + if (driver_data->request_fds[i] >= 0) + close(driver_data->request_fds[i]); + + close(driver_data->mem2mem_fd); + + /* Clean up left over buffers */ + obj_buffer = (struct object_buffer *) object_heap_first(&driver_data->buffer_heap, &iter); + while (obj_buffer) + { + sunxi_cedrus_msg("vaTerminate: bufferID %08x still allocated, destroying\n", obj_buffer->base.id); + sunxi_cedrus_destroy_buffer(driver_data, obj_buffer); + obj_buffer = (struct object_buffer *) object_heap_next(&driver_data->buffer_heap, &iter); + } + + object_heap_destroy(&driver_data->buffer_heap); + object_heap_destroy(&driver_data->surface_heap); + object_heap_destroy(&driver_data->context_heap); + + /* Clean up configIDs */ + obj_config = (struct object_config *) 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 = (struct object_config *) object_heap_next(&driver_data->config_heap, &iter); + } + object_heap_destroy(&driver_data->config_heap); + + free(context->pDriverData); + context->pDriverData = NULL; + + return VA_STATUS_SUCCESS; +} diff --git a/src/sunxi_cedrus.h b/src/sunxi_cedrus.h index c10c554..5e7e560 100644 --- a/src/sunxi_cedrus.h +++ b/src/sunxi_cedrus.h @@ -41,8 +41,6 @@ #define SUNXI_CEDRUS_MAX_SUBPIC_FORMATS 4 #define SUNXI_CEDRUS_MAX_DISPLAY_ATTRIBUTES 4 -void sunxi_cedrus_msg(const char *msg, ...); - struct sunxi_cedrus_driver_data { struct object_heap config_heap; struct object_heap context_heap; @@ -57,4 +55,9 @@ struct sunxi_cedrus_driver_data { int slice_offset[INPUT_BUFFERS_NB]; }; +void sunxi_cedrus_msg(const char *msg, ...); + +VAStatus VA_DRIVER_INIT_FUNC(VADriverContextP context); +VAStatus SunxiCedrusTerminate(VADriverContextP context); + #endif diff --git a/src/surface.c b/src/surface.c index 4a39da2..f3e4eef 100644 --- a/src/surface.c +++ b/src/surface.c @@ -227,7 +227,6 @@ VAStatus SunxiCedrusQuerySurfaceStatus(VADriverContextP context, return vaStatus; } - VAStatus SunxiCedrusPutSurface(VADriverContextP context, VASurfaceID surface_id, void *draw, short src_x, short src_y, unsigned short src_width, unsigned short src_height, short dst_x, short dst_y,