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_);
189 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
190 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
198 std::cerr <<
"Invalid camera context in callback" << std::endl;
213 void CameraBase::camera_device_buffer_callback(
int ch, mpa_ion_buf_t *data,
void *context)
216 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
217 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
225 std::cerr <<
"Invalid camera context in callback" << std::endl;
237 auto meta = data->img_meta;
239 cl_int err = CL_SUCCESS;
241 camera->
ctx_ = modal_flow::ocl::OclDevice::Instance().context();
243 camera->
q_ = clCreateCommandQueue(camera->
ctx_, modal_flow::ocl::OclDevice::Instance().device(), 0, &err);
244 if (err != CL_SUCCESS)
246 fprintf(stderr,
"clCreateCommandQueue err=%d\n", err);
250 void *frame = mmap(NULL, data->size, PROT_READ | PROT_WRITE, MAP_SHARED, data->fd, 0);
251 if (frame == MAP_FAILED)
256 cl_mem_ion_host_ptr cl_mem_ptr;
257 memset(&cl_mem_ptr, 0,
sizeof(cl_mem_ion_host_ptr));
258 cl_mem_ptr.ext_host_ptr.allocation_type = CL_MEM_ION_HOST_PTR_QCOM;
259 cl_mem_ptr.ext_host_ptr.host_cache_policy = CL_MEM_HOST_UNCACHED_QCOM;
260 cl_mem_ptr.ion_filedesc = data->fd;
261 cl_mem_ptr.ion_hostptr = frame;
264 cl_mem cl_mem_out = clCreateBuffer(camera->
ctx_,
265 CL_MEM_HOST_NO_ACCESS | CL_MEM_USE_HOST_PTR | CL_MEM_EXT_HOST_PTR_QCOM,
270 if (err_code != CL_SUCCESS)
272 fprintf(stderr,
"Error: clCreateBuffer failed with code %d\n", err_code);
275 cl_mem cl_mem_dest = clCreateBuffer(camera->
ctx_,
276 CL_MEM_HOST_NO_ACCESS | CL_MEM_READ_ONLY,
280 if (err_code != CL_SUCCESS)
282 fprintf(stderr,
"Error: clCreateBuffer failed for destination buffer with code %d\n", err_code);
285 err_code = clEnqueueCopyBuffer(camera->
q_,
289 meta.height * meta.width *
sizeof(uint8_t),
290 0,
nullptr,
nullptr);
291 if (err_code != CL_SUCCESS)
293 fprintf(stderr,
"Error: clEnqueueCopyBuffer failed with code %d\n", err_code);
295 clFinish(camera->
q_);
296 clReleaseMemObject(cl_mem_out);
299 camera->
process_image(data->img_meta, voxl::ImageType::CL_MEM, cl_mem_dest);
300 munmap(frame, data->size);