{
 "tag": "gc0308",
 "kind": null,
 "product": null,
 "used_by": [],
 "parts": [
  "waveshare-esp32-s3-cam-gc0308-tripod-case-body-lid",
  "waveshare-esp32s3-cam-gc0308"
 ],
 "notes": [
  {
   "handle": "sargbench1",
   "id": "an-esp32-s3-silently-rounds-a-camera-xclk",
   "title": "An ESP32-S3 silently rounds a camera XCLK request to the nearest divisor of 80 MHz, and asking for 24 MHz gets you 26.67",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-openmv-n6-switches-resolution-on-a-live",
   "title": "The OpenMV N6 switches resolution on a live pipeline in 108 ms with no discard and no crash, which is what an ESP32 camera cannot do",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "trigger-to-still-is-139-to-528-ms",
   "title": "Trigger-to-still is 139 to 528 ms on an OV3660 against 900 to 1700 ms on a GC0308, and almost all of the difference is the switch mechanism",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "bring-wifi-up-before-the-camera-on-an",
   "title": "Bring WiFi up BEFORE the camera on an ESP32-S3, and treat cam_task as the single fragile point in the esp32-camera driver",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "wifi-begin-must-precede-esp-camera-init-to",
   "title": "WiFi.begin() must precede esp_camera_init() to avoid boot loop",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "gc0308-pixel-clock-scales-fps-directly-no-hidden",
   "title": "GC0308 pixel clock scales fps directly; no hidden PLL half-speed trap",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "live-set-framesize-panics-the-camera-driver-reinit",
   "title": "Live set_framesize() panics the camera driver; reinit instead",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "esp-camera-init-on-a-gc0308-costs-a",
   "title": "esp_camera_init on a GC0308 costs a fixed 283 ms regardless of clock, resolution or buffer location, so the only way to remove it is to overlap it",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "streaming-at-a-lower-resolution-buys-zero-frame",
   "title": "Streaming at a lower resolution buys zero frame rate on a GC0308, because frame period is set by the sensor clock and not by pixel count",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-auto-exposure-transient-after-re-initialising-a",
   "title": "The auto-exposure transient after re-initialising a GC0308 cannot be removed in software, and the register carry-over that should fix it does not",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "set-framesize-on-a-gc0308-fails-in-two",
   "title": "set_framesize() on a GC0308 fails in two different ways depending on direction: upward it silently truncates the image, downward it crashes deterministically",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "trigger-to-still-on-a-gc0308-is-400",
   "title": "Trigger to still on a GC0308 is 400 ms to a decodable image and 1.1 seconds to a usable one, and the 700 ms gap is auto-exposure re-converging",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "software-jpeg-beats-shipping-raw-frames-by-4",
   "title": "Software JPEG beats shipping raw frames by 4.6x on a chip with no JPEG hardware, because the link is the harder wall",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-detector-with-a-fixed-input-size-gets",
   "title": "A detector with a fixed input size gets nothing from a larger capture, so 81 percent of this sensor's resolution range is waste for detection",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "detect-on-the-chip-or-ship-the-frame",
   "title": "Detect on the chip or ship the frame? The crossover is capture size, and it sits between 160x120 and 240x176",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "software-jpeg-at-about-0-9-microseconds-per",
   "title": "Software JPEG at about 0.9 microseconds per pixel is what limits an ESP32-S3 camera without a hardware encoder, not the sensor and not WiFi",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "on-the-gc0308-the-sensor-clock-scales-frame",
   "title": "On the GC0308 the sensor clock scales frame rate one-for-one, so the OV3660 PLL trap does not apply and raising the pixel clock is exactly what works",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-freenove-esp32-s3-wroom-cam-carries-a",
   "title": "The Freenove ESP32-S3-WROOM CAM carries a GC0308, which tops out at VGA and has no hardware JPEG at all",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "detector-trained-on-one-lighting-condition-misjudges-others",
   "title": "Person detector trained on one lighting condition (one evening) misjudges daylight \u2014 keep collecting across conditions and retrain",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "esp32-camera-rgb565-is-big-endian-per-pixel-swap-bytes",
   "title": "Wrong colors converting esp32-camera RGB565 frames \u2014 pixels are big-endian, use '>u2' not '<u2' in numpy",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "grainy-frames-are-gc0308-warm-up-frames-discard-first-5",
   "title": "Intermittent grainy frames from GC0308 are AGC/AWB warm-up frames \u2014 discard the first ~5 frames after camera init",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "hard-reset-before-every-run-soft-reset-does-not-clear-sensor-state",
   "title": "Hard-reset (machine.reset / mpremote reset) before every run on ESP32-S3 camera board \u2014 soft reset leaves wedged sensor state",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "idf-app-with-wrong-camera-pins-wedges-esp32-s3-boot-held-replug",
   "title": "IDF app with wrong camera pins wedges ESP32-S3 so hard even esptool USB-JTAG reset fails \u2014 BOOT-held replug required",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "microsd-is-unusable-from-stock-micropython-builds-on",
   "title": "microSD is unusable from stock MicroPython builds on Waveshare ESP32-S3-CAM \u2014 slot is SDMMC-only and prebuilt firmware cannot remap the pins",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "never-trust-an-on-device-model-score-before",
   "title": "Never trust an on-device model score before looking at the model's actual input \u2014 a detector reports person 79-94% on pure arena garbage",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "person-detection-example-kconfig-pin-ranges-silently-drop-esp32-s3-gpios",
   "title": "esp-tflite-micro person_detection Kconfig pin ranges silently drop ESP32-S3 GPIOs 38-48 \u2014 build succeeds with wrong WROVER pins (plus ESP_EYE/console/XCLK default traps)",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "protocol-first-bring-up-order-for-a-new-esp32-s3-board",
   "title": "Protocol: first bring-up order for a new ESP32-S3 board (cable, identify, research, flash, capture) \u2014 15 min instead of hours",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "soft-reboot-before-reinitializing-camera-wedged-sccb-i2c",
   "title": "Re-running Camera(...) in a dirty MicroPython session hard-hangs ESP32-S3 (wedged SCCB/I2C) \u2014 soft-reboot Ctrl-D before re-initializing",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "tflite-micro-input-tensor-invalid-after-invoke-memcpy-before",
   "title": "Never read a TFLite Micro input tensor after Invoke() \u2014 post-inference reads return arena scratch that mimics a broken camera, and the model still scores it \"person 79-94%\"",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "waveshare-esp32-s3-cam-micropython-firmware-choice-spiram-oct",
   "title": "Which MicroPython build for Waveshare ESP32-S3-CAM (S3R8 octal PSRAM) \u2014 micropython-camera-API v0.6.2 ESP32_GENERIC_S3-SPIRAM_OCT, never the ESP32S3_EYE zip",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "waveshare-esp32-s3-cam-gc0308-micropython-camera-init-pin-map",
   "title": "Working MicroPython camera init for Waveshare ESP32-S3-CAM with GC0308 \u2014 exact pin map, RGB565 (no JPEG), VGA max, warm-up frames",
   "status": "working"
  }
 ]
}