Reorder functions, with a straightforward logic
Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
This commit is contained in:
+28
-28
@@ -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,
|
||||
|
||||
+5
-5
@@ -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);
|
||||
|
||||
|
||||
@@ -171,4 +171,3 @@ VAStatus SunxiCedrusDestroyContext(VADriverContextP context,
|
||||
|
||||
return VA_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
+19
-19
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -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,
|
||||
|
||||
@@ -233,5 +233,3 @@ VAStatus SunxiCedrusEndPicture(VADriverContextP context,
|
||||
|
||||
return vaStatus;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+5
-5
@@ -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; }
|
||||
|
||||
+3
-3
@@ -28,13 +28,13 @@
|
||||
|
||||
#include <va/va_backend.h>
|
||||
|
||||
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,
|
||||
|
||||
+48
-45
@@ -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;
|
||||
}
|
||||
|
||||
+5
-2
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user