## USB WebCam Example
This example demonstrates how to use ESP32-Sx USB function as the USB Web Camera (UVC device).
* Support both UVC Isochronous and Bulk transfer mode
* Support MJPEG format only
* Support LCD animation in `esp32-s3-eye` board (**IDF v5.0 or later**)

### Try the example through the esp-launchpad
<a href="https://espressif.github.io/esp-launchpad/?flashConfigURL=https://raw.githubusercontent.com/espressif/esp-dev-kits/master/launch.toml">
<img alt="Try it with ESP Launchpad" src="https://espressif.github.io/esp-launchpad/assets/try_with_launchpad.png" width="200" height="56">
</a>
This example has been built for `ESP32-S3-EYE`, you can use `esp-launchpad` to flash the binary to your board directly.
Please choose `ESP32-S3-EYE-USB_WebCam_v1_0`, then click flash to quickly start
## How to build the example
### Hardware Required
- Any ESP32-S2 or ESP32-S3 development board with both camera and USB interface, you can also use `idf.py menuconfig`, select board through `USB WebCam config → Camera Pin Configuration → Select Camera Pinout`, this example use `ESP32-S3-EYE` by default
- USB Connection:
- GPIO19 to D
- GPIO20 to D+
- Camera Connection:
- For boards not in the list, please choose `Custom Camera Pinout` to configure each Pin
### Camera Configuration
1. Please check [esp32-camera](https://github.com/espressif/esp32-camera) to find the supported cameras, for this example camera JPEG compression should be supported.
2. Using `idf.py menuconfig`, through `USB WebCam config` users can configure the frame resolution, frame rate and image quality.
3. Through ` USB WebCam config → UVC transfer mode`, users can change to `Bulk` mode to get twice the throughput than `Isochronous`.
|Transfer Mode|Max Throughput|Compatibility|
|--|--|--|
|Isochronous|~512KB/s|Windows/Linux/MacOS|
|Bulk|~1216KB/s|Windows/MacOS|
* `Bulk` mode may encounter compatibility issues on some Linux platform
### Build and Flash
1. Make sure `ESP-IDF` is setup successfully
2. Set up the `ESP-IDF` environment variables, please refer [Set up the environment variables](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html#step-4-set-up-the-environment-variables), Linux can use:
```bash
. $HOME/esp/esp-idf/export.sh
```
3. Set ESP-IDF build target to `esp32s2` or `esp32s3`
```bash
idf.py set-target esp32s3
```
4. Build, Flash, output log
```bash
idf.py build flash monitor
```
## Example Output
```
I (0) cpu_start: Starting scheduler on APP CPU.
I (533) spiram: Reserving pool of 32K of internal memory for DMA/internal allocations
I (534) usb_webcam: Selected Camera Board ESP-S3-EYE
I (534) usb_webcam: Format List
I (534) usb_webcam: Format(1) = MJPEG
I (534) usb_webcam: Frame List
I (535) usb_webcam: Frame(1) = 1280 * 720 @15fps, Quality = 14
I (535) usb_webcam: Frame(2) = 640 * 480 @15fps, Quality = 14
I (535) usb_webcam: Frame(3) = 480 * 320 @30fps, Quality = 10
I (869) usb_webcam: Mount
I (2099) usb_webcam: Suspend
I (9343) usb_webcam: bFrameIndex: 1
I (9343) usb_webcam: dwFrameInterval: 666666
I (9343) s3 ll_cam: DMA Channel=4
I (9344) cam_hal: cam init ok
I (9344) sccb: pin_sda 4 pin_scl 5
I (9344) sccb: sccb_i2c_port=1
I (9354) camera: Detected camera at address=0x30
I (9357) camera: Detected OV2640 camera
I (9357) camera: Camera PID=0x26 VER=0x42 MIDL=0x7f MIDH=0xa2
I (9434) cam_hal: buffer_size: 16384, half_buffer_size: 1024, node_buffer_size: 1024, node_cnt: 16, total_cnt: 180
I (9435) cam_hal: Allocating 184320 Byte frame buffer in PSRAM
I (9435) cam_hal: Allocating 184320 Byte frame buffer in PSRAM
I (9436) cam_hal: cam config ok
I (9436) ov2640: Set PLL: clk_2x: 0, clk_div: 0, pclk_auto: 0, pclk_div: 12
```
To create a project from this example, run:
idf.py create-project-from-example "espressif/usb_device_uvc=1.1.0:usb_webcam"