You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							140 lines
						
					
					
						
							4.0 KiB
						
					
					
				
			
		
		
	
	
							140 lines
						
					
					
						
							4.0 KiB
						
					
					
				| #include <assert.h>
 | |
| #include <stdio.h>
 | |
| #include <string.h>
 | |
| 
 | |
| #define CL_USE_DEPRECATED_OPENCL_1_2_APIS
 | |
| #ifdef __APPLE__
 | |
| #include <OpenCL/cl.h>
 | |
| #else
 | |
| #include <CL/cl.h>
 | |
| #endif
 | |
| 
 | |
| #include "clutil.h"
 | |
| #include "transforms/transform.h"
 | |
| 
 | |
| typedef struct {
 | |
|   int disable_model;
 | |
|   Transform transform;
 | |
| 
 | |
|   int in_width;
 | |
|   int in_height;
 | |
|   int out_width;
 | |
|   int out_height;
 | |
| 
 | |
|   cl_context context;
 | |
|   cl_command_queue command_queue;
 | |
|   cl_device_id device_id;
 | |
| 
 | |
|   size_t in_yuv_size;
 | |
|   cl_mem in_yuv_cl;
 | |
| 
 | |
|   cl_mem out_y_cl, out_u_cl, out_v_cl;
 | |
| } VisionTest;
 | |
| 
 | |
| void initialize_opencl(VisionTest* visiontest) {
 | |
|   // init cl
 | |
|   int err;
 | |
|   cl_device_id device_id = cl_get_device_id(CL_DEVICE_TYPE_CPU);
 | |
|   visiontest->context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &err);
 | |
|   assert(err == 0);
 | |
| 
 | |
|   visiontest->device_id = device_id;
 | |
| }
 | |
| 
 | |
| VisionTest* visiontest_create(int temporal_model, int disable_model,
 | |
|                               int input_width, int input_height,
 | |
|                               int model_input_width, int model_input_height) {
 | |
|   int err = 0;
 | |
| 
 | |
|   VisionTest* const vt = calloc(1, sizeof(*vt));
 | |
|   assert(vt);
 | |
| 
 | |
|   vt->disable_model = disable_model;
 | |
|   vt->in_width = input_width;
 | |
|   vt->in_height = input_height;
 | |
|   vt->out_width = model_input_width;
 | |
|   vt->out_height = model_input_height;
 | |
| 
 | |
|   initialize_opencl(vt);
 | |
| 
 | |
|   transform_init(&vt->transform, vt->context, vt->device_id);
 | |
| 
 | |
| 
 | |
|   assert((vt->in_width%2) == 0 && (vt->in_height%2) == 0);
 | |
|   vt->in_yuv_size = vt->in_width*vt->in_height*3/2;
 | |
|   vt->in_yuv_cl = clCreateBuffer(vt->context, CL_MEM_READ_WRITE,
 | |
|                                  vt->in_yuv_size, NULL, &err);
 | |
|   assert(err == 0);
 | |
| 
 | |
|   vt->out_y_cl = clCreateBuffer(vt->context, CL_MEM_READ_WRITE,
 | |
|                                 vt->out_width*vt->out_width, NULL, &err);
 | |
|   assert(err == 0);
 | |
|   vt->out_u_cl = clCreateBuffer(vt->context, CL_MEM_READ_WRITE,
 | |
|                                  vt->out_width*vt->out_width/4, NULL, &err);
 | |
|   assert(err == 0);
 | |
|   vt->out_v_cl = clCreateBuffer(vt->context, CL_MEM_READ_WRITE,
 | |
|                                  vt->out_width*vt->out_width/4, NULL, &err);
 | |
|   assert(err == 0);
 | |
| 
 | |
|   vt->command_queue = clCreateCommandQueue(vt->context, vt->device_id, 0, &err);
 | |
|   assert(err == 0);
 | |
| 
 | |
|   return vt;
 | |
| }
 | |
| 
 | |
| void visiontest_destroy(VisionTest* vt) {
 | |
|   transform_destroy(&vt->transform);
 | |
| 
 | |
|   int err = 0;
 | |
| 
 | |
|   err = clReleaseMemObject(vt->in_yuv_cl);
 | |
|   assert(err == 0);
 | |
|   err = clReleaseMemObject(vt->out_y_cl);
 | |
|   assert(err == 0);
 | |
|   err = clReleaseMemObject(vt->out_u_cl);
 | |
|   assert(err == 0);
 | |
|   err = clReleaseMemObject(vt->out_v_cl);
 | |
|   assert(err == 0);
 | |
| 
 | |
|   err = clReleaseCommandQueue(vt->command_queue);
 | |
|   assert(err == 0);
 | |
| 
 | |
|   err = clReleaseContext(vt->context);
 | |
|   assert(err == 0);
 | |
| 
 | |
|   free(vt);
 | |
| }
 | |
| 
 | |
| void visiontest_transform(VisionTest* vt, const uint8_t* yuv_data,
 | |
|                           uint8_t* out_y, uint8_t* out_u, uint8_t* out_v,
 | |
|                           const float* transform) {
 | |
|   int err = 0;
 | |
| 
 | |
|   err = clEnqueueWriteBuffer(vt->command_queue, vt->in_yuv_cl, CL_FALSE,
 | |
|                              0, vt->in_yuv_size, yuv_data, 0, NULL, NULL);
 | |
|   assert(err == 0);
 | |
| 
 | |
|   mat3 transform_m = *(const mat3*)transform;
 | |
| 
 | |
|   transform_queue(&vt->transform, vt->command_queue,
 | |
|                   vt->in_yuv_cl, vt->in_width, vt->in_height,
 | |
|                   vt->out_y_cl, vt->out_u_cl, vt->out_v_cl,
 | |
|                   vt->out_width, vt->out_height,
 | |
|                   transform_m);
 | |
| 
 | |
|   err = clEnqueueReadBuffer(vt->command_queue, vt->out_y_cl, CL_FALSE,
 | |
|                             0, vt->out_width*vt->out_height, out_y,
 | |
|                             0, NULL, NULL);
 | |
|   assert(err == 0);
 | |
|   err = clEnqueueReadBuffer(vt->command_queue, vt->out_u_cl, CL_FALSE,
 | |
|                             0, vt->out_width*vt->out_height/4, out_u,
 | |
|                             0, NULL, NULL);
 | |
|   assert(err == 0);
 | |
|   err = clEnqueueReadBuffer(vt->command_queue, vt->out_v_cl, CL_FALSE,
 | |
|                             0, vt->out_width*vt->out_height/4, out_v,
 | |
|                             0, NULL, NULL);
 | |
|   assert(err == 0);
 | |
| 
 | |
|   clFinish(vt->command_queue);
 | |
| }
 | |
| 
 | |
| 
 |