ESPHome 2026.3.2
Loading...
Searching...
No Matches
esp32_camera.cpp
Go to the documentation of this file.
1#ifdef USE_ESP32
2
3#include "esp32_camera.h"
5#include "esphome/core/hal.h"
6#include "esphome/core/log.h"
7
8#include <freertos/task.h>
9
10namespace esphome {
11namespace esp32_camera {
12
13static const char *const TAG = "esp32_camera";
14static constexpr size_t FRAMEBUFFER_TASK_STACK_SIZE = 1792;
15#if ESPHOME_LOG_LEVEL < ESPHOME_LOG_LEVEL_VERBOSE
16static constexpr uint32_t FRAME_LOG_INTERVAL_MS = 60000;
17#endif
18
19static const char *frame_size_to_str(framesize_t size) {
20 switch (size) {
21 case FRAMESIZE_QQVGA:
22 return "160x120 (QQVGA)";
23 case FRAMESIZE_QCIF:
24 return "176x155 (QCIF)";
25 case FRAMESIZE_HQVGA:
26 return "240x176 (HQVGA)";
27 case FRAMESIZE_QVGA:
28 return "320x240 (QVGA)";
29 case FRAMESIZE_CIF:
30 return "400x296 (CIF)";
31 case FRAMESIZE_VGA:
32 return "640x480 (VGA)";
33 case FRAMESIZE_SVGA:
34 return "800x600 (SVGA)";
35 case FRAMESIZE_XGA:
36 return "1024x768 (XGA)";
37 case FRAMESIZE_SXGA:
38 return "1280x1024 (SXGA)";
39 case FRAMESIZE_UXGA:
40 return "1600x1200 (UXGA)";
41 case FRAMESIZE_FHD:
42 return "1920x1080 (FHD)";
43 case FRAMESIZE_P_HD:
44 return "720x1280 (P_HD)";
45 case FRAMESIZE_P_3MP:
46 return "864x1536 (P_3MP)";
47 case FRAMESIZE_QXGA:
48 return "2048x1536 (QXGA)";
49 case FRAMESIZE_QHD:
50 return "2560x1440 (QHD)";
51 case FRAMESIZE_WQXGA:
52 return "2560x1600 (WQXGA)";
53 case FRAMESIZE_P_FHD:
54 return "1080x1920 (P_FHD)";
55 case FRAMESIZE_QSXGA:
56 return "2560x1920 (QSXGA)";
57 default:
58 return "UNKNOWN";
59 }
60}
61
62static const char *pixel_format_to_str(pixformat_t format) {
63 switch (format) {
64 case PIXFORMAT_RGB565:
65 return "RGB565";
66 case PIXFORMAT_YUV422:
67 return "YUV422";
68 case PIXFORMAT_YUV420:
69 return "YUV420";
70 case PIXFORMAT_GRAYSCALE:
71 return "GRAYSCALE";
72 case PIXFORMAT_JPEG:
73 return "JPEG";
74 case PIXFORMAT_RGB888:
75 return "RGB888";
76 case PIXFORMAT_RAW:
77 return "RAW";
78 case PIXFORMAT_RGB444:
79 return "RGB444";
80 case PIXFORMAT_RGB555:
81 return "RGB555";
82 default:
83 return "UNKNOWN";
84 }
85}
86
87/* ---------------- public API (derivated) ---------------- */
89#ifdef USE_I2C
90 if (this->i2c_bus_ != nullptr) {
91 this->config_.sccb_i2c_port = this->i2c_bus_->get_port();
92 }
93#endif
94
95 /* initialize time to now */
96 this->last_update_ = millis();
97
98 /* initialize camera */
99 esp_err_t err = esp_camera_init(&this->config_);
100 if (err != ESP_OK) {
101 ESP_LOGE(TAG, "esp_camera_init failed: %s", esp_err_to_name(err));
102 this->init_error_ = err;
103 this->mark_failed();
104 return;
105 }
106
107 /* initialize camera parameters */
109
110 /* initialize RTOS */
111 this->framebuffer_get_queue_ = xQueueCreate(1, sizeof(camera_fb_t *));
112 this->framebuffer_return_queue_ = xQueueCreate(1, sizeof(camera_fb_t *));
113 xTaskCreatePinnedToCore(&ESP32Camera::framebuffer_task,
114 "framebuffer_task", // name
115 FRAMEBUFFER_TASK_STACK_SIZE, // stack size
116 this, // task pv params
117 1, // priority
118 nullptr, // handle
119 1 // core
120 );
121}
122
124 auto conf = this->config_;
125 ESP_LOGCONFIG(TAG,
126 "ESP32 Camera:\n"
127 " Name: %s\n"
128 " Internal: %s\n"
129 " Data Pins: D0:%d D1:%d D2:%d D3:%d D4:%d D5:%d D6:%d D7:%d\n"
130 " VSYNC Pin: %d\n"
131 " HREF Pin: %d\n"
132 " Pixel Clock Pin: %d\n"
133 " External Clock: Pin:%d Frequency:%u\n"
134 " I2C Pins: SDA:%d SCL:%d\n"
135 " Reset Pin: %d",
136 this->name_.c_str(), YESNO(this->is_internal()), conf.pin_d0, conf.pin_d1, conf.pin_d2, conf.pin_d3,
137 conf.pin_d4, conf.pin_d5, conf.pin_d6, conf.pin_d7, conf.pin_vsync, conf.pin_href, conf.pin_pclk,
138 conf.pin_xclk, conf.xclk_freq_hz, conf.pin_sccb_sda, conf.pin_sccb_scl, conf.pin_reset);
139
140 ESP_LOGCONFIG(TAG, " Resolution: %s", frame_size_to_str(this->config_.frame_size));
141 ESP_LOGCONFIG(TAG, " Pixel Format: %s", pixel_format_to_str(this->config_.pixel_format));
142
143 if (this->is_failed()) {
144 ESP_LOGE(TAG, " Setup Failed: %s", esp_err_to_name(this->init_error_));
145 return;
146 }
147
148 sensor_t *s = esp_camera_sensor_get();
149 if (s == nullptr) {
150 ESP_LOGE(TAG, " Camera sensor not available");
151 return;
152 }
153 auto st = s->status;
154 ESP_LOGCONFIG(TAG,
155 " JPEG Quality: %u\n"
156 " Framebuffer Count: %u\n"
157 " Framebuffer Location: %s\n"
158 " Contrast: %d\n"
159 " Brightness: %d\n"
160 " Saturation: %d\n"
161 " Vertical Flip: %s\n"
162 " Horizontal Mirror: %s\n"
163 " Special Effect: %u\n"
164 " White Balance Mode: %u",
165 st.quality, conf.fb_count, this->config_.fb_location == CAMERA_FB_IN_PSRAM ? "PSRAM" : "DRAM",
166 st.contrast, st.brightness, st.saturation, ONOFF(st.vflip), ONOFF(st.hmirror), st.special_effect,
167 st.wb_mode);
168 // ESP_LOGCONFIG(TAG, " Auto White Balance: %u", st.awb);
169 // ESP_LOGCONFIG(TAG, " Auto White Balance Gain: %u", st.awb_gain);
170 ESP_LOGCONFIG(TAG,
171 " Auto Exposure Control: %u\n"
172 " Auto Exposure Control 2: %u\n"
173 " Auto Exposure Level: %d\n"
174 " Auto Exposure Value: %u\n"
175 " AGC: %u\n"
176 " AGC Gain: %u\n"
177 " Gain Ceiling: %u",
178 st.aec, st.aec2, st.ae_level, st.aec_value, st.agc, st.agc_gain, st.gainceiling);
179 // ESP_LOGCONFIG(TAG, " BPC: %u", st.bpc);
180 // ESP_LOGCONFIG(TAG, " WPC: %u", st.wpc);
181 // ESP_LOGCONFIG(TAG, " RAW_GMA: %u", st.raw_gma);
182 // ESP_LOGCONFIG(TAG, " Lens Correction: %u", st.lenc);
183 // ESP_LOGCONFIG(TAG, " DCW: %u", st.dcw);
184 ESP_LOGCONFIG(TAG, " Test Pattern: %s", YESNO(st.colorbar));
185}
186
188 // Fast path: skip all work when truly idle
189 // (no current image, no pending requests, and not time for idle request yet)
191 if (!this->current_image_ && !this->has_requested_image_()) {
192 // Only check idle interval when we're otherwise idle
193 if (this->idle_update_interval_ != 0 && now - this->last_idle_request_ > this->idle_update_interval_) {
194 this->last_idle_request_ = now;
196 } else {
197 return;
198 }
199 }
200
201 // check if we can return the image
202 if (this->can_return_image_()) {
203 // return image
204#ifdef USE_ESP32_CAMERA_JPEG_CONVERSION
205 if (this->config_.pixel_format != PIXFORMAT_JPEG && this->config_.jpeg_quality > 0) {
206 // for non-JPEG format, we need to free the data and raw buffer
207 auto *jpg_buf = this->current_image_->get_data_buffer();
208 free(jpg_buf); // NOLINT(cppcoreguidelines-no-malloc)
209 auto *fb = this->current_image_->get_raw_buffer();
210 this->fb_allocator_.deallocate(fb, 1);
211 } else
212#endif
213 {
214 auto *fb = this->current_image_->get_raw_buffer();
215 xQueueSend(this->framebuffer_return_queue_, &fb, portMAX_DELAY);
216 }
217 this->current_image_.reset();
218 }
219
220 // Check if we should fetch a new image
221 if (!this->has_requested_image_())
222 return;
223 if (this->current_image_.use_count() > 1) {
224 // image is still in use
225 return;
226 }
228 return;
229
230 // request new image
231 camera_fb_t *fb;
232 if (xQueueReceive(this->framebuffer_get_queue_, &fb, 0L) != pdTRUE) {
233 // no frame ready
234 ESP_LOGVV(TAG, "No frame ready");
235 return;
236 }
237
238 if (fb == nullptr) {
239 ESP_LOGW(TAG, "Got invalid frame from camera!");
240 xQueueSend(this->framebuffer_return_queue_, &fb, portMAX_DELAY);
241 return;
242 }
243
244#ifdef USE_ESP32_CAMERA_JPEG_CONVERSION
245 if (this->config_.pixel_format != PIXFORMAT_JPEG && this->config_.jpeg_quality > 0) {
246 // for non-JPEG format, we need to convert the frame to JPEG
247 uint8_t *jpg_buf;
248 size_t jpg_buf_len;
249 size_t width = fb->width;
250 size_t height = fb->height;
251 struct timeval timestamp = fb->timestamp;
252 bool ok = frame2jpg(fb, 100 - this->config_.jpeg_quality, &jpg_buf, &jpg_buf_len);
253 // return the original frame buffer to the queue
254 xQueueSend(this->framebuffer_return_queue_, &fb, portMAX_DELAY);
255 if (!ok) {
256 ESP_LOGE(TAG, "Failed to convert frame to JPEG!");
257 return;
258 }
259 // create a new camera_fb_t for the JPEG data
260 fb = this->fb_allocator_.allocate(1);
261 if (fb == nullptr) {
262 ESP_LOGE(TAG, "Failed to allocate memory for camera frame buffer!");
263 free(jpg_buf); // NOLINT(cppcoreguidelines-no-malloc)
264 return;
265 }
266 memset(fb, 0, sizeof(camera_fb_t));
267 fb->buf = jpg_buf;
268 fb->len = jpg_buf_len;
269 fb->width = width;
270 fb->height = height;
271 fb->format = PIXFORMAT_JPEG;
272 fb->timestamp = timestamp;
273 }
274#endif
275 this->current_image_ = std::make_shared<ESP32CameraImage>(fb, this->single_requesters_ | this->stream_requesters_);
276
277#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
278 ESP_LOGV(TAG, "Got Image: len=%u", fb->len);
279#else
280 // Initialize log time on first frame to ensure accurate interval measurement
281 if (this->frame_count_ == 0) {
282 this->last_log_time_ = now;
283 }
284 this->frame_count_++;
285 if (now - this->last_log_time_ >= FRAME_LOG_INTERVAL_MS) {
286 ESP_LOGD(TAG, "Received %u images in last %us", this->frame_count_, FRAME_LOG_INTERVAL_MS / 1000);
287 this->last_log_time_ = now;
288 this->frame_count_ = 0;
289 }
290#endif
291 for (auto *listener : this->listeners_) {
292 listener->on_camera_image(this->current_image_);
293 }
294 this->last_update_ = now;
295 this->single_requesters_ = 0;
296}
297
298/* ---------------- constructors ---------------- */
300 this->config_.pin_pwdn = -1;
301 this->config_.pin_reset = -1;
302 this->config_.pin_xclk = -1;
303 this->config_.ledc_timer = LEDC_TIMER_0;
304 this->config_.ledc_channel = LEDC_CHANNEL_0;
305 this->config_.pixel_format = PIXFORMAT_JPEG;
306 this->config_.frame_size = FRAMESIZE_VGA; // 640x480
307 this->config_.jpeg_quality = 10;
308 this->config_.fb_count = 1;
309 this->config_.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
310 this->config_.fb_location = CAMERA_FB_IN_PSRAM;
311}
312
313/* ---------------- setters ---------------- */
314/* set pin assignment */
315void ESP32Camera::set_data_pins(std::array<uint8_t, 8> pins) {
316 this->config_.pin_d0 = pins[0];
317 this->config_.pin_d1 = pins[1];
318 this->config_.pin_d2 = pins[2];
319 this->config_.pin_d3 = pins[3];
320 this->config_.pin_d4 = pins[4];
321 this->config_.pin_d5 = pins[5];
322 this->config_.pin_d6 = pins[6];
323 this->config_.pin_d7 = pins[7];
324}
325void ESP32Camera::set_vsync_pin(uint8_t pin) { this->config_.pin_vsync = pin; }
326void ESP32Camera::set_href_pin(uint8_t pin) { this->config_.pin_href = pin; }
327void ESP32Camera::set_pixel_clock_pin(uint8_t pin) { this->config_.pin_pclk = pin; }
329 this->config_.pin_xclk = pin;
330 this->config_.xclk_freq_hz = frequency;
331}
332void ESP32Camera::set_i2c_pins(uint8_t sda, uint8_t scl) {
333 this->config_.pin_sccb_sda = sda;
334 this->config_.pin_sccb_scl = scl;
335}
336#ifdef USE_I2C
338 this->i2c_bus_ = i2c_bus;
339 this->config_.pin_sccb_sda = -1;
340 this->config_.pin_sccb_scl = -1;
341}
342#endif // USE_I2C
343void ESP32Camera::set_reset_pin(uint8_t pin) { this->config_.pin_reset = pin; }
344void ESP32Camera::set_power_down_pin(uint8_t pin) { this->config_.pin_pwdn = pin; }
345
346/* set image parameters */
348 switch (size) {
350 this->config_.frame_size = FRAMESIZE_QQVGA;
351 break;
353 this->config_.frame_size = FRAMESIZE_QCIF;
354 break;
356 this->config_.frame_size = FRAMESIZE_HQVGA;
357 break;
359 this->config_.frame_size = FRAMESIZE_QVGA;
360 break;
362 this->config_.frame_size = FRAMESIZE_CIF;
363 break;
365 this->config_.frame_size = FRAMESIZE_VGA;
366 break;
368 this->config_.frame_size = FRAMESIZE_SVGA;
369 break;
371 this->config_.frame_size = FRAMESIZE_XGA;
372 break;
374 this->config_.frame_size = FRAMESIZE_SXGA;
375 break;
377 this->config_.frame_size = FRAMESIZE_UXGA;
378 break;
380 this->config_.frame_size = FRAMESIZE_FHD;
381 break;
383 this->config_.frame_size = FRAMESIZE_P_HD;
384 break;
386 this->config_.frame_size = FRAMESIZE_P_3MP;
387 break;
389 this->config_.frame_size = FRAMESIZE_QXGA;
390 break;
392 this->config_.frame_size = FRAMESIZE_QHD;
393 break;
395 this->config_.frame_size = FRAMESIZE_WQXGA;
396 break;
398 this->config_.frame_size = FRAMESIZE_P_FHD;
399 break;
401 this->config_.frame_size = FRAMESIZE_QSXGA;
402 break;
403 }
404}
406 switch (format) {
408 this->config_.pixel_format = PIXFORMAT_RGB565;
409 break;
411 this->config_.pixel_format = PIXFORMAT_YUV422;
412 break;
414 this->config_.pixel_format = PIXFORMAT_YUV420;
415 break;
417 this->config_.pixel_format = PIXFORMAT_GRAYSCALE;
418 break;
420 this->config_.pixel_format = PIXFORMAT_JPEG;
421 break;
423 this->config_.pixel_format = PIXFORMAT_RGB888;
424 break;
426 this->config_.pixel_format = PIXFORMAT_RAW;
427 break;
429 this->config_.pixel_format = PIXFORMAT_RGB444;
430 break;
432 this->config_.pixel_format = PIXFORMAT_RGB555;
433 break;
434 }
435}
436void ESP32Camera::set_jpeg_quality(uint8_t quality) { this->config_.jpeg_quality = quality; }
437void ESP32Camera::set_vertical_flip(bool vertical_flip) { this->vertical_flip_ = vertical_flip; }
438void ESP32Camera::set_horizontal_mirror(bool horizontal_mirror) { this->horizontal_mirror_ = horizontal_mirror; }
439void ESP32Camera::set_contrast(int contrast) { this->contrast_ = contrast; }
440void ESP32Camera::set_brightness(int brightness) { this->brightness_ = brightness; }
441void ESP32Camera::set_saturation(int saturation) { this->saturation_ = saturation; }
443/* set exposure parameters */
445void ESP32Camera::set_aec2(bool aec2) { this->aec2_ = aec2; }
446void ESP32Camera::set_ae_level(int ae_level) { this->ae_level_ = ae_level; }
447void ESP32Camera::set_aec_value(uint32_t aec_value) { this->aec_value_ = aec_value; }
448/* set gains parameters */
450void ESP32Camera::set_agc_value(uint8_t agc_value) { this->agc_value_ = agc_value; }
452/* set white balance */
454/* set test mode */
455void ESP32Camera::set_test_pattern(bool test_pattern) { this->test_pattern_ = test_pattern; }
456/* set fps */
458 this->max_update_interval_ = max_update_interval;
459}
461 this->idle_update_interval_ = idle_update_interval;
462}
463/* set frame buffer parameters */
464void ESP32Camera::set_frame_buffer_mode(camera_grab_mode_t mode) { this->config_.grab_mode = mode; }
466 this->config_.fb_count = fb_count;
467 this->set_frame_buffer_mode(fb_count > 1 ? CAMERA_GRAB_LATEST : CAMERA_GRAB_WHEN_EMPTY);
468}
469void ESP32Camera::set_frame_buffer_location(camera_fb_location_t fb_location) {
470 this->config_.fb_location = fb_location;
471}
472
473/* ---------------- public API (specific) ---------------- */
475 for (auto *listener : this->listeners_) {
476 listener->on_stream_start();
477 }
478 this->stream_requesters_ |= (1U << requester);
479}
481 for (auto *listener : this->listeners_) {
482 listener->on_stream_stop();
483 }
484 this->stream_requesters_ &= ~(1U << requester);
485}
486void ESP32Camera::request_image(camera::CameraRequester requester) { this->single_requesters_ |= (1U << requester); }
489 sensor_t *s = esp_camera_sensor_get();
490 if (s == nullptr) {
491 return;
492 }
493 /* update image */
494 s->set_vflip(s, this->vertical_flip_);
495 s->set_hmirror(s, this->horizontal_mirror_);
496 s->set_contrast(s, this->contrast_);
497 s->set_brightness(s, this->brightness_);
498 s->set_saturation(s, this->saturation_);
499 s->set_special_effect(s, (int) this->special_effect_); // 0 to 6
500 /* update exposure */
501 s->set_exposure_ctrl(s, (bool) this->aec_mode_);
502 s->set_aec2(s, this->aec2_); // 0 = disable , 1 = enable
503 s->set_ae_level(s, this->ae_level_); // -2 to 2
504 s->set_aec_value(s, this->aec_value_); // 0 to 1200
505 /* update gains */
506 s->set_gain_ctrl(s, (bool) this->agc_mode_);
507 s->set_agc_gain(s, (int) this->agc_value_); // 0 to 30
508 s->set_gainceiling(s, (gainceiling_t) this->agc_gain_ceiling_);
509 /* update white balance mode */
510 s->set_wb_mode(s, (int) this->wb_mode_); // 0 to 4
511 /* update test pattern */
512 s->set_colorbar(s, this->test_pattern_);
513}
514
515/* ---------------- Internal methods ---------------- */
517bool ESP32Camera::can_return_image_() const { return this->current_image_.use_count() == 1; }
519 ESP32Camera *that = (ESP32Camera *) pv;
520 while (true) {
521 camera_fb_t *framebuffer = esp_camera_fb_get();
522 xQueueSend(that->framebuffer_get_queue_, &framebuffer, portMAX_DELAY);
523 // Only wake the main loop if there's a pending request to consume the frame
524#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE)
525 if (that->has_requested_image_()) {
527 }
528#endif
529 // return is no-op for config with 1 fb
530 xQueueReceive(that->framebuffer_return_queue_, &framebuffer, portMAX_DELAY);
531 esp_camera_fb_return(framebuffer);
532 }
533}
534
535/* ---------------- ESP32CameraImageReader class ----------- */
536void ESP32CameraImageReader::set_image(std::shared_ptr<camera::CameraImage> image) {
537 this->image_ = std::static_pointer_cast<ESP32CameraImage>(image);
538 this->offset_ = 0;
539}
541 if (!this->image_)
542 return 0;
543
544 return this->image_->get_data_length() - this->offset_;
545}
547void ESP32CameraImageReader::consume_data(size_t consumed) { this->offset_ += consumed; }
548uint8_t *ESP32CameraImageReader::peek_data_buffer() { return this->image_->get_data_buffer() + this->offset_; }
549
550/* ---------------- ESP32CameraImage class ----------- */
551ESP32CameraImage::ESP32CameraImage(camera_fb_t *buffer, uint8_t requesters)
552 : buffer_(buffer), requesters_(requesters) {}
553
554camera_fb_t *ESP32CameraImage::get_raw_buffer() { return this->buffer_; }
555uint8_t *ESP32CameraImage::get_data_buffer() { return this->buffer_->buf; }
556size_t ESP32CameraImage::get_data_length() { return this->buffer_->len; }
558 return (this->requesters_ & (1 << requester)) != 0;
559}
560
561} // namespace esp32_camera
562} // namespace esphome
563
564#endif
BedjetMode mode
BedJet operating mode.
uint16_le_t frequency
Definition bl0942.h:6
void wake_loop_threadsafe()
Wake the main event loop from another FreeRTOS task.
uint32_t IRAM_ATTR HOT get_loop_component_start_time() const
Get the cached time in milliseconds from when the current component started its loop execution.
void mark_failed()
Mark this component as failed.
bool is_failed() const
Definition component.h:233
bool is_internal() const
void deallocate(T *p, size_t n)
Definition helpers.h:1954
T * allocate(size_t n)
Definition helpers.h:1916
constexpr const char * c_str() const
Definition string_ref.h:73
Abstract image reader base class.
Definition camera.h:71
void set_i2c_pins(uint8_t sda, uint8_t scl)
void set_agc_value(uint8_t agc_value)
void set_test_pattern(bool test_pattern)
void set_jpeg_quality(uint8_t quality)
void set_wb_mode(ESP32WhiteBalanceMode mode)
ESP32AgcGainCeiling agc_gain_ceiling_
void set_vertical_flip(bool vertical_flip)
void set_aec_value(uint32_t aec_value)
void set_special_effect(ESP32SpecialEffect effect)
void set_aec_mode(ESP32GainControlMode mode)
void set_data_pins(std::array< uint8_t, 8 > pins)
void stop_stream(camera::CameraRequester requester) override
std::vector< camera::CameraListener * > listeners_
void set_i2c_id(i2c::InternalI2CBus *i2c_bus)
void set_pixel_format(ESP32CameraPixelFormat format)
void set_frame_size(ESP32CameraFrameSize size)
void set_external_clock(uint8_t pin, uint32_t frequency)
void set_max_update_interval(uint32_t max_update_interval)
std::shared_ptr< ESP32CameraImage > current_image_
std::atomic< uint8_t > single_requesters_
void set_horizontal_mirror(bool horizontal_mirror)
camera::CameraImageReader * create_image_reader() override
void set_frame_buffer_count(uint8_t fb_count)
void set_agc_gain_ceiling(ESP32AgcGainCeiling gain_ceiling)
void set_agc_mode(ESP32GainControlMode mode)
void set_frame_buffer_location(camera_fb_location_t fb_location)
void set_frame_buffer_mode(camera_grab_mode_t mode)
void set_idle_update_interval(uint32_t idle_update_interval)
void start_stream(camera::CameraRequester requester) override
void request_image(camera::CameraRequester requester) override
std::atomic< uint8_t > stream_requesters_
static void framebuffer_task(void *pv)
RAMAllocator< camera_fb_t > fb_allocator_
bool was_requested_by(camera::CameraRequester requester) const override
ESP32CameraImage(camera_fb_t *buffer, uint8_t requester)
void set_image(std::shared_ptr< camera::CameraImage > image) override
std::shared_ptr< ESP32CameraImage > image_
void consume_data(size_t consumed) override
virtual int get_port() const =0
Returns the I2C port number.
CameraRequester
Different sources for filtering.
Definition camera.h:16
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
const char int const __FlashStringHelper * format
Definition log.h:74
size_t size
Definition helpers.h:929
uint32_t IRAM_ATTR HOT millis()
Definition core.cpp:26
Application App
Global storage of Application pointer - only one Application can exist.
static void uint32_t
uint16_t timestamp
Definition tt21100.cpp:2