mirror of
https://github.com/esphome/esphome.git
synced 2025-10-08 12:53:45 +01:00
Co-authored-by: J. Nick Koston <nick@koston.org> Co-authored-by: J. Nick Koston <nick@home-assistant.io> Co-authored-by: J. Nick Koston <nick+github@koston.org>
70 lines
2.3 KiB
C++
70 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#include "buffer.h"
|
|
#include "camera.h"
|
|
|
|
namespace esphome::camera {
|
|
|
|
/// Result codes from the encoder used to control camera pipeline flow.
|
|
enum EncoderError : uint8_t {
|
|
ENCODER_ERROR_SUCCESS = 0, ///< Encoding succeeded, continue pipeline normally.
|
|
ENCODER_ERROR_SKIP_FRAME, ///< Skip current frame, try again on next frame.
|
|
ENCODER_ERROR_RETRY_FRAME, ///< Retry current frame, after buffer growth or for incremental encoding.
|
|
ENCODER_ERROR_CONFIGURATION ///< Fatal config error, shut down pipeline.
|
|
};
|
|
|
|
/// Converts EncoderError to string.
|
|
inline const char *to_string(EncoderError error) {
|
|
switch (error) {
|
|
case ENCODER_ERROR_SUCCESS:
|
|
return "ENCODER_ERROR_SUCCESS";
|
|
case ENCODER_ERROR_SKIP_FRAME:
|
|
return "ENCODER_ERROR_SKIP_FRAME";
|
|
case ENCODER_ERROR_RETRY_FRAME:
|
|
return "ENCODER_ERROR_RETRY_FRAME";
|
|
case ENCODER_ERROR_CONFIGURATION:
|
|
return "ENCODER_ERROR_CONFIGURATION";
|
|
}
|
|
return "ENCODER_ERROR_INVALID";
|
|
}
|
|
|
|
/// Interface for an encoder buffer supporting resizing and variable-length data.
|
|
class EncoderBuffer {
|
|
public:
|
|
/// Sets logical buffer size, reallocates if needed.
|
|
/// @param size Required size in bytes.
|
|
/// @return true on success, false on allocation failure.
|
|
virtual bool set_buffer_size(size_t size) = 0;
|
|
|
|
/// Returns a pointer to the buffer data.
|
|
virtual uint8_t *get_data() const = 0;
|
|
|
|
/// Returns number of bytes currently used.
|
|
virtual size_t get_size() const = 0;
|
|
|
|
/// Returns total allocated buffer size.
|
|
virtual size_t get_max_size() const = 0;
|
|
|
|
virtual ~EncoderBuffer() = default;
|
|
};
|
|
|
|
/// Interface for image encoders used in a camera pipeline.
|
|
class Encoder {
|
|
public:
|
|
/// Encodes pixel data from a previous camera pipeline stage.
|
|
/// @param spec Specification of the input pixel data.
|
|
/// @param pixels Image pixels in RGB or grayscale format, as specified in @p spec.
|
|
/// @return EncoderError Indicating the result of the encoding operation.
|
|
virtual EncoderError encode_pixels(CameraImageSpec *spec, Buffer *pixels) = 0;
|
|
|
|
/// Returns the encoder's output buffer.
|
|
/// @return Pointer to an EncoderBuffer containing encoded data.
|
|
virtual EncoderBuffer *get_output_buffer() = 0;
|
|
|
|
/// Prints the encoder's configuration to the log.
|
|
virtual void dump_config() = 0;
|
|
virtual ~Encoder() = default;
|
|
};
|
|
|
|
} // namespace esphome::camera
|