42 : camera_info_(camera_info)
62 std::lock_guard<std::mutex> lock(
mutex_);
66 std::cerr <<
"Camera " <<
camera_info_.
name <<
" is already connected" << std::endl;
71 channel_ = pipe_client_get_next_available_channel();
74 std::cerr <<
"Failed to get available channel for camera " <<
camera_info_.
name << std::endl;
79 static const char suffix[] =
"_ion";
81 size_t sfx =
sizeof(suffix) - 1;
87 pipe_client_set_ion_buf_helper_cb(
channel_, CameraBase::camera_device_buffer_callback,
this);
89 flags = CLIENT_FLAG_EN_ION_BUF_HELPER;
97 flags = CLIENT_FLAG_EN_CAMERA_HELPER;
98 pipe_size = 1280 * 800 * 15;
113 <<
" (channel: " <<
channel_ <<
")" << std::endl;
141 std::lock_guard<std::mutex> lock(
mutex_);
151 printf(
"Flushing pipe for primary channel: %d\n",
channel_);
187 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
188 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
196 std::cerr <<
"Invalid camera context in callback" << std::endl;
211 void CameraBase::camera_device_buffer_callback(
int ch, mpa_ion_buf_t *data,
void *context)
214 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
215 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
223 std::cerr <<
"Invalid camera context in callback" << std::endl;
235 auto meta = data->img_meta;
237 cl_int err = CL_SUCCESS;
239 camera->
ctx_ = modal_flow::ocl::OclDevice::Instance().context();
241 camera->
q_ = clCreateCommandQueue(camera->
ctx_, modal_flow::ocl::OclDevice::Instance().device(), 0, &err);
242 if (err != CL_SUCCESS)
244 fprintf(stderr,
"clCreateCommandQueue err=%d\n", err);
248 void *frame = mmap(NULL, data->size, PROT_READ | PROT_WRITE, MAP_SHARED, data->fd, 0);
249 if (frame == MAP_FAILED)
254 cl_mem_ion_host_ptr cl_mem_ptr;
255 memset(&cl_mem_ptr, 0,
sizeof(cl_mem_ion_host_ptr));
256 cl_mem_ptr.ext_host_ptr.allocation_type = CL_MEM_ION_HOST_PTR_QCOM;
257 cl_mem_ptr.ext_host_ptr.host_cache_policy = CL_MEM_HOST_UNCACHED_QCOM;
258 cl_mem_ptr.ion_filedesc = data->fd;
259 cl_mem_ptr.ion_hostptr = frame;
262 cl_mem cl_mem_out = clCreateBuffer(camera->
ctx_,
263 CL_MEM_HOST_NO_ACCESS | CL_MEM_USE_HOST_PTR | CL_MEM_EXT_HOST_PTR_QCOM,
268 if (err_code != CL_SUCCESS)
270 fprintf(stderr,
"Error: clCreateBuffer failed with code %d\n", err_code);
273 cl_mem cl_mem_dest = clCreateBuffer(camera->
ctx_,
274 CL_MEM_HOST_NO_ACCESS | CL_MEM_READ_ONLY,
278 if (err_code != CL_SUCCESS)
280 fprintf(stderr,
"Error: clCreateBuffer failed for destination buffer with code %d\n", err_code);
283 err_code = clEnqueueCopyBuffer(camera->
q_,
287 meta.height * meta.width *
sizeof(uint8_t),
288 0,
nullptr,
nullptr);
289 if (err_code != CL_SUCCESS)
291 fprintf(stderr,
"Error: clEnqueueCopyBuffer failed with code %d\n", err_code);
293 clFinish(camera->
q_);
294 clReleaseMemObject(cl_mem_out);
297 camera->
process_image(data->img_meta, voxl::ImageType::CL_MEM, cl_mem_dest);
298 munmap(frame, data->size);