void start_streaming(device & device, int num_transfer_bufs) { for(auto & sub : device.subdevices) { if(sub.callback) { #if defined (ENABLE_DEBUG_SPAM) uvc_print_stream_ctrl(&sub.ctrl, stdout); #endif check("uvc_start_streaming", uvc_start_streaming(sub.handle, &sub.ctrl, [](uvc_frame * frame, void * user) { reinterpret_cast<subdevice *>(user)->callback(frame->data); }, &sub, 0, num_transfer_bufs)); } } }
int UVCPreview::prepare_preview(uvc_stream_ctrl_t *ctrl) { uvc_error_t result; ENTER(); result = uvc_get_stream_ctrl_format_size_fps(mDeviceHandle, ctrl, !requestMode ? UVC_FRAME_FORMAT_YUYV : UVC_FRAME_FORMAT_MJPEG, requestWidth, requestHeight, 1, 30 ); LOGE("[EYEDEA] result_1:[%d]", result); if (LIKELY(!result)) { #if LOCAL_DEBUG uvc_print_stream_ctrl(ctrl, stderr); #endif uvc_frame_desc_t *frame_desc; result = uvc_get_frame_desc(mDeviceHandle, ctrl, &frame_desc); LOGE("[EYEDEA] result_2:[%d]", result); if (LIKELY(!result)) { frameWidth = frame_desc->wWidth; frameHeight = frame_desc->wHeight; LOGI("frameSize=(%d,%d)@%s", frameWidth, frameHeight, (!requestMode ? "YUYV" : "MJPEG")); pthread_mutex_lock(&preview_mutex); if (LIKELY(mPreviewWindow)) { ANativeWindow_setBuffersGeometry(mPreviewWindow, frameWidth, frameHeight, previewFormat); } pthread_mutex_unlock(&preview_mutex); } else { frameWidth = requestWidth; frameHeight = requestHeight; } frameMode = requestMode; frameBytes = frameWidth * frameHeight * (!requestMode ? 2 : 4); previewBytes = frameWidth * frameHeight * PREVIEW_PIXEL_BYTES; } else { LOGE("could not negotiate with camera:err=%d", result); } RETURN(result, int); }
int UVCPreview::prepare_preview(uvc_stream_ctrl_t *ctrl) { uvc_error_t result; ENTER(); result = uvc_get_stream_ctrl_format_size(mDeviceHandle, ctrl, UVC_FRAME_FORMAT_YUYV, requestWidth, requestHeight, requestFps ); if (LIKELY(!result)) { #if LOCAL_DEBUG uvc_print_stream_ctrl(ctrl, stderr); #endif uvc_frame_desc_t *frame_desc; result = uvc_get_frame_desc(mDeviceHandle, ctrl, &frame_desc); if (LIKELY(!result)) { frameWidth = frame_desc->wWidth; frameHeight = frame_desc->wHeight; #if LOCAL_DEBUG LOGI("frameSize=(%d,%d)", frameWidth, frameHeight); #endif pthread_mutex_lock(&preview_mutex); if (LIKELY(mPreviewWindow)) { ANativeWindow_setBuffersGeometry(mPreviewWindow, frameWidth, frameHeight, previewFormat); } pthread_mutex_unlock(&preview_mutex); } else { frameWidth = requestWidth; frameHeight = requestHeight; } frameBytes = frameWidth * frameHeight * 2; // YUYV previewBytes = frameWidth * frameHeight * PREVIEW_PIXEL_BYTES; } else { LOGE("could not negotiate with camera:err=%d", result); } RETURN(result, int); }
int main(int argc, char **argv) { uvc_context_t *ctx; uvc_device_t *dev; uvc_device_handle_t *devh; uvc_stream_ctrl_t ctrl; uvc_error_t res; uvc_device_t **list; /* Initialize a UVC service context. Libuvc will set up its own libusb * context. Replace NULL with a libusb_context pointer to run libuvc * from an existing libusb context. */ res = uvc_init(&ctx, NULL); if (res < 0) { uvc_perror(res, "uvc_init"); return res; } puts("UVC initialized"); res = uvc_get_device_list(ctx, &list); if (res < 0) { uvc_perror(res, "uvc_get_device_list"); return res; } /* for(int i = 0; i < 1; i++) { res = uvc_open(list[i], &devh); uvc_print_diag(devh, stderr); uvc_close(devh); } uchar x; uvc_free_device_list(list, x); */ /* Locates the first attached UVC device, stores in dev */ res = uvc_find_device( ctx, &dev, 0, 0, NULL); /* filter devices: vendor_id, product_id, "serial_num" */ if (res < 0) { uvc_perror(res, "uvc_find_device"); /* no devices found */ } else { puts("Device found"); /* Try to open the device: requires exclusive access */ res = uvc_open(dev, &devh); if (res < 0) { uvc_perror(res, "uvc_open"); /* unable to open device */ printf("Unable to open device"); } else { puts("Device opened"); /* Print out a message containing all the information that libuvc * knows about the device */ uvc_print_diag(devh, stderr); /* Try to negotiate a 640x480 30 fps YUYV stream profile */ res = uvc_get_stream_ctrl_format_size( devh, &ctrl, /* result stored in ctrl */ UVC_FRAME_FORMAT_YUYV, /* YUV 422, aka YUV 4:2:2. try _COMPRESSED */ 640, 480, 30 /* width, height, fps */ ); /* Print out the result */ uvc_print_stream_ctrl(&ctrl, stderr); if (res < 0) { uvc_perror(res, "get_mode"); /* device doesn't provide a matching stream */ } else { /* Start the video stream. The library will call user function cb: * cb(frame, (void*) 12345) */ res = uvc_start_streaming(devh, &ctrl, cb, (void*)12345, 0); if (res < 0) { uvc_perror(res, "start_streaming"); /* unable to start stream */ } else { puts("Streaming..."); uvc_set_ae_mode(devh, 0); /* e.g., turn on auto exposure */ sleep(10); /* stream for 10 seconds */ /* End the stream. Blocks until last callback is serviced */ uvc_stop_streaming(devh); puts("Done streaming."); } } /* Release our handle on the device */ uvc_close(devh); puts("Device closed"); } /* Release the device descriptor */ uvc_unref_device(dev); } /* Close the UVC context. This closes and cleans up any existing device handles, * and it closes the libusb context if one was not provided. */ uvc_exit(ctx); puts("UVC exited"); return 0; }