ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_camera.c
Go to the documentation of this file.
1
17
18#include "ra8_camera.h"
19
20#include <stddef.h>
21#include <stdint.h>
22
23#include "ra8_attributes.h"
24#include "ra8_camera_internal.h"
25#include "ra8_err.h"
26
45 uint32_t* out_row)
46{
47 if (frame->format == k_ra8_camera_format_rgb888) {
48 *out_row = (uint32_t)frame->width * 3U;
49 return k_ra8_ok;
50 }
51 if (frame->format == k_ra8_camera_format_uyvy422) {
52 if ((frame->width & 1U) != 0U) {
54 }
55 *out_row = (uint32_t)frame->width * 2U;
56 return k_ra8_ok;
57 }
59}
60
62{
63 if (frame == nullptr) {
64 return k_ra8_err_null_ptr;
65 }
66 if (frame->data == nullptr) {
67 return k_ra8_err_null_ptr;
68 }
69 if (frame->width == 0U) {
71 }
72 if (frame->height == 0U) {
74 }
75 if (frame->format == k_ra8_camera_format_jpeg) {
76 if (frame->bytes == 0U) {
78 }
79 if (frame->stride_bytes != 0U) {
81 }
82 return k_ra8_ok;
83 }
84 uint32_t row_bytes = 0U;
85 const ra8_err_t row = internal_frame_row_bytes(frame, &row_bytes);
86 if (row != k_ra8_ok) {
87 return row;
88 }
89 if (frame->stride_bytes < row_bytes) {
91 }
92 if ((uint32_t)frame->height > (UINT32_MAX / frame->stride_bytes)) {
94 }
95 return (frame->bytes >= (frame->stride_bytes * (uint32_t)frame->height)) ? k_ra8_ok
97}
98
116{
117 if (source == nullptr) {
118 return k_ra8_err_null_ptr;
119 }
120 if (source->iface == nullptr) {
122 }
123 if (source->iface->get_info == nullptr) {
125 }
126 if (source->iface->capture == nullptr) {
128 }
129 return k_ra8_ok;
130}
131
133 ra8_camera_source_info_t* out_info)
134{
135 if (out_info == nullptr) {
136 return k_ra8_err_null_ptr;
137 }
138 *out_info = (ra8_camera_source_info_t){};
139 const ra8_err_t handle = internal_source_validate(source);
140 if (handle != k_ra8_ok) {
141 return handle;
142 }
143 return source->iface->get_info(source->ctx, out_info);
144}
145
147 const ra8_camera_buffer_t* buffer,
148 ra8_camera_frame_t* out_frame)
149{
150 if (buffer == nullptr) {
151 return k_ra8_err_null_ptr;
152 }
153 if (out_frame == nullptr) {
154 return k_ra8_err_null_ptr;
155 }
156 *out_frame = (ra8_camera_frame_t){};
157 const ra8_err_t handle = internal_source_validate(source);
158 if (handle != k_ra8_ok) {
159 return handle;
160 }
161 if (buffer->data == nullptr) {
162 return k_ra8_err_null_ptr;
163 }
164 if (buffer->capacity == 0U) {
166 }
167 const ra8_err_t captured = source->iface->capture(source->ctx, buffer, out_frame);
168 if (captured != k_ra8_ok) {
169 *out_frame = (ra8_camera_frame_t){};
170 return captured;
171 }
172 if (out_frame->data != buffer->data) {
173 *out_frame = (ra8_camera_frame_t){};
175 }
176 if (out_frame->bytes > buffer->capacity) {
177 *out_frame = (ra8_camera_frame_t){};
179 }
180 const ra8_err_t valid = ra8_camera_frame_validate(out_frame);
181 if (valid != k_ra8_ok) {
182 *out_frame = (ra8_camera_frame_t){};
183 }
184 return valid;
185}
186
188 const ra8_camera_frame_t* input,
189 const ra8_camera_buffer_t* output_buffer,
190 ra8_camera_frame_t* out_frame)
191{
192 if (codec == nullptr) {
193 return k_ra8_err_null_ptr;
194 }
195 if (input == nullptr) {
196 return k_ra8_err_null_ptr;
197 }
198 if (output_buffer == nullptr) {
199 return k_ra8_err_null_ptr;
200 }
201 if (out_frame == nullptr) {
202 return k_ra8_err_null_ptr;
203 }
204 *out_frame = (ra8_camera_frame_t){};
205 if (codec->iface == nullptr) {
207 }
208 if (codec->iface->encode == nullptr) {
210 }
211 const ra8_err_t valid = ra8_camera_frame_validate(input);
212 if (valid != k_ra8_ok) {
213 return valid;
214 }
215 const ra8_err_t encoded = codec->iface->encode(codec->ctx, input, output_buffer, out_frame);
216 if (encoded != k_ra8_ok) {
217 *out_frame = (ra8_camera_frame_t){};
218 return encoded;
219 }
220 const ra8_err_t output_valid = ra8_camera_frame_validate(out_frame);
221 if (output_valid != k_ra8_ok) {
222 *out_frame = (ra8_camera_frame_t){};
223 }
224 return output_valid;
225}
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
static ra8_err_t internal_source_validate(const ra8_camera_source_t *source)
Validate a source handle and its mandatory vtable rows.
Definition ra8_camera.c:115
ra8_err_t ra8_camera_frame_validate(const ra8_camera_frame_t *frame)
Validate the geometry and storage coverage of a frame view.
Definition ra8_camera.c:61
static ra8_err_t internal_frame_row_bytes(const ra8_camera_frame_t *frame, uint32_t *out_row)
Return the minimum bytes in one uncompressed row.
Definition ra8_camera.c:44
ra8_err_t ra8_camera_source_get_info(ra8_camera_source_t *source, ra8_camera_source_info_t *out_info)
Query a bound source's native output and capture-buffer bound.
Definition ra8_camera.c:132
ra8_err_t ra8_camera_source_capture(ra8_camera_source_t *source, const ra8_camera_buffer_t *buffer, ra8_camera_frame_t *out_frame)
Capture one frame into a caller-owned buffer.
Definition ra8_camera.c:146
ra8_err_t ra8_camera_codec_encode(ra8_camera_codec_t *codec, const ra8_camera_frame_t *input, const ra8_camera_buffer_t *output_buffer, ra8_camera_frame_t *out_frame)
Encode or transform one frame through a bound codec.
Definition ra8_camera.c:187
Transport-neutral camera source and image-codec facade.
@ k_ra8_camera_format_rgb888
Packed R, G, B bytes per pixel.
Definition ra8_camera.h:64
@ k_ra8_camera_format_uyvy422
Packed Cb, Y0, Cr, Y1 pixel pairs.
Definition ra8_camera.h:65
@ k_ra8_camera_format_jpeg
Complete encoded JPEG byte stream.
Definition ra8_camera.h:66
Private source and codec vtables for ra8_camera backends.
Error Code Definitions for ra8-firmware.
@ k_ra8_err_invalid_arg
Invalid function argument.
Definition ra8_err.h:152
@ k_ra8_err_not_initialized
Module not initialized – _init() not yet called successfully.
Definition ra8_err.h:235
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
@ k_ra8_err_null_ptr
Pointer was NULL where a valid pointer was required.
Definition ra8_err.h:478
@ k_ra8_err_invalid_size
Invalid size parameter (too large, too small, or misaligned).
Definition ra8_err.h:167
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
Caller-owned writable byte-buffer description.
Definition ra8_camera.h:80
uint32_t capacity
Writable byte capacity.
Definition ra8_camera.h:82
uint8_t * data
First writable byte, or NULL when capacity is zero.
Definition ra8_camera.h:81
ra8_err_t(* encode)(void *ctx, const ra8_camera_frame_t *input, const ra8_camera_buffer_t *output_buffer, ra8_camera_frame_t *out_frame)
Produce one encoded frame.
Caller-owned handle binding one image codec and its context.
Definition ra8_camera.h:145
void * ctx
Caller-owned backend context.
Definition ra8_camera.h:147
const ra8_camera_codec_iface_t * iface
Bound codec vtable (private).
Definition ra8_camera.h:146
Immutable view of one captured or encoded image.
Definition ra8_camera.h:96
ra8_camera_format_t format
Pixel or compressed-image layout.
Definition ra8_camera.h:102
const uint8_t * data
Borrowed immutable image bytes.
Definition ra8_camera.h:97
uint32_t bytes
Valid bytes beginning at data.
Definition ra8_camera.h:98
uint16_t height
Image height in pixels.
Definition ra8_camera.h:101
uint16_t width
Image width in pixels.
Definition ra8_camera.h:100
uint32_t stride_bytes
Bytes between uncompressed rows.
Definition ra8_camera.h:99
ra8_err_t(* capture)(void *ctx, const ra8_camera_buffer_t *buffer, ra8_camera_frame_t *out_frame)
Capture one frame.
ra8_err_t(* get_info)(void *ctx, ra8_camera_source_info_t *out_info)
Query geometry.
Native geometry and worst-case storage required by a source.
Definition ra8_camera.h:114
Caller-owned handle binding one source backend and its context.
Definition ra8_camera.h:131
void * ctx
Caller-owned backend context.
Definition ra8_camera.h:133
const ra8_camera_source_iface_t * iface
Bound source vtable (private).
Definition ra8_camera.h:132