WPILibC++ 2025.0.0-alpha-1-14-g3b6f38d
RawFrame.h
Go to the documentation of this file.
1// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5#ifndef WPIUTIL_WPI_RAWFRAME_H_
6#define WPIUTIL_WPI_RAWFRAME_H_
7
8#include <stdint.h>
9
10#ifdef __cplusplus
11#include <concepts>
12#include <cstddef>
13#else
14
15#include <stddef.h> // NOLINT
16
17#endif
18
19#ifdef WPI_RAWFRAME_JNI
20#include "jni_util.h"
21#endif
22
23// NOLINT
24
25#ifdef __cplusplus
26extern "C" {
27#endif
28
29/**
30 * Raw Frame
31 */
32typedef struct WPI_RawFrame { // NOLINT
33 // image data
34 uint8_t* data;
35 // function to free image data (may be NULL)
36 void (*freeFunc)(void* cbdata, void* data, size_t capacity);
37 void* freeCbData; // data passed to freeFunc
38 size_t capacity; // data buffer capacity, in bytes
39 size_t size; // actual size of data, in bytes
40 int pixelFormat; // WPI_PixelFormat
41 int width; // width of image, in pixels
42 int height; // height of image, in pixels
43 int stride; // size of each row of data, in bytes (may be 0)
45
46/**
47 * Pixel formats
48 */
50 WPI_PIXFMT_UNKNOWN = 0, // unknown
51 WPI_PIXFMT_MJPEG, // Motion-JPEG (compressed image data)
52 WPI_PIXFMT_YUYV, // YUV 4:2:2, 16 bpp
53 WPI_PIXFMT_RGB565, // RGB 5-6-5, 16 bpp
54 WPI_PIXFMT_BGR, // BGR 8-8-8, 24 bpp
55 WPI_PIXFMT_GRAY, // Grayscale, 8 bpp
56 WPI_PIXFMT_Y16, // Grayscale, 16 bpp
57 WPI_PIXFMT_UYVY, // YUV 4:2:2, 16 bpp
58 WPI_PIXFMT_BGRA, // BGRA 8-8-8-8-, 32 bpp
59};
60
61// Returns nonzero if the frame data was allocated/reallocated
62int WPI_AllocateRawFrameData(WPI_RawFrame* frame, size_t requestedSize);
64void WPI_SetRawFrameData(WPI_RawFrame* frame, void* data, size_t size,
65 size_t capacity, void* cbdata,
66 void (*freeFunc)(void* cbdata, void* data,
67 size_t capacity));
68
69#ifdef __cplusplus
70} // extern "C"
71#endif
72
73#ifdef __cplusplus
74namespace wpi {
75struct RawFrame : public WPI_RawFrame {
77 data = nullptr;
78 freeFunc = nullptr;
79 freeCbData = nullptr;
80 capacity = 0;
81 size = 0;
83 width = 0;
84 height = 0;
85 }
86 RawFrame(const RawFrame&) = delete;
87 RawFrame& operator=(const RawFrame&) = delete;
88 RawFrame(RawFrame&& rhs) noexcept : WPI_RawFrame{rhs} {
89 rhs.data = nullptr;
90 rhs.freeFunc = nullptr;
91 rhs.freeCbData = nullptr;
92 rhs.capacity = 0;
93 rhs.size = 0;
94 }
95 RawFrame& operator=(RawFrame&& rhs) noexcept {
96 *static_cast<WPI_RawFrame*>(this) = rhs;
97 rhs.data = nullptr;
98 rhs.freeFunc = nullptr;
99 rhs.freeCbData = nullptr;
100 rhs.capacity = 0;
101 rhs.size = 0;
102 return *this;
103 }
104
105 void SetData(void* data, size_t size, size_t capacity, void* cbdata,
106 void (*freeFunc)(void* cbdata, void* data, size_t capacity)) {
108 }
109
110 // returns true if the frame data was allocated/reallocated
111 bool Reserve(size_t size) {
112 return WPI_AllocateRawFrameData(this, size) != 0;
113 }
114
116};
117
118#ifdef WPI_RAWFRAME_JNI
119template <std::same_as<wpi::RawFrame> T>
120void SetFrameData(JNIEnv* env, jclass rawFrameCls, jobject jframe,
121 const T& frame, bool newData) {
122 if (newData) {
123 static jmethodID setData = env->GetMethodID(rawFrameCls, "setDataJNI",
124 "(Ljava/nio/ByteBuffer;IIII)V");
125 env->CallVoidMethod(
126 jframe, setData, env->NewDirectByteBuffer(frame.data, frame.size),
127 static_cast<jint>(frame.width), static_cast<jint>(frame.height),
128 static_cast<jint>(frame.stride), static_cast<jint>(frame.pixelFormat));
129 } else {
130 static jmethodID setInfo =
131 env->GetMethodID(rawFrameCls, "setInfoJNI", "(IIII)V");
132 env->CallVoidMethod(jframe, setInfo, static_cast<jint>(frame.width),
133 static_cast<jint>(frame.height),
134 static_cast<jint>(frame.stride),
135 static_cast<jint>(frame.pixelFormat));
136 }
137}
138#endif
139
140} // namespace wpi
141#endif
142
143#endif // WPIUTIL_WPI_RAWFRAME_H_
int WPI_AllocateRawFrameData(WPI_RawFrame *frame, size_t requestedSize)
WPI_PixelFormat
Pixel formats.
Definition: RawFrame.h:49
@ WPI_PIXFMT_YUYV
Definition: RawFrame.h:52
@ WPI_PIXFMT_Y16
Definition: RawFrame.h:56
@ WPI_PIXFMT_UYVY
Definition: RawFrame.h:57
@ WPI_PIXFMT_BGRA
Definition: RawFrame.h:58
@ WPI_PIXFMT_MJPEG
Definition: RawFrame.h:51
@ WPI_PIXFMT_GRAY
Definition: RawFrame.h:55
@ WPI_PIXFMT_RGB565
Definition: RawFrame.h:53
@ WPI_PIXFMT_BGR
Definition: RawFrame.h:54
@ WPI_PIXFMT_UNKNOWN
Definition: RawFrame.h:50
void WPI_SetRawFrameData(WPI_RawFrame *frame, void *data, size_t size, size_t capacity, void *cbdata, void(*freeFunc)(void *cbdata, void *data, size_t capacity))
void WPI_FreeRawFrameData(WPI_RawFrame *frame)
struct WPI_RawFrame WPI_RawFrame
Raw Frame.
Definition: ntcore_cpp.h:26
Raw Frame.
Definition: RawFrame.h:32
int pixelFormat
Definition: RawFrame.h:40
void * freeCbData
Definition: RawFrame.h:37
void(* freeFunc)(void *cbdata, void *data, size_t capacity)
Definition: RawFrame.h:36
size_t capacity
Definition: RawFrame.h:38
uint8_t * data
Definition: RawFrame.h:34
size_t size
Definition: RawFrame.h:39
int height
Definition: RawFrame.h:42
int stride
Definition: RawFrame.h:43
int width
Definition: RawFrame.h:41
Definition: RawFrame.h:75
RawFrame(RawFrame &&rhs) noexcept
Definition: RawFrame.h:88
RawFrame & operator=(const RawFrame &)=delete
void SetData(void *data, size_t size, size_t capacity, void *cbdata, void(*freeFunc)(void *cbdata, void *data, size_t capacity))
Definition: RawFrame.h:105
RawFrame & operator=(RawFrame &&rhs) noexcept
Definition: RawFrame.h:95
bool Reserve(size_t size)
Definition: RawFrame.h:111
RawFrame(const RawFrame &)=delete
RawFrame()
Definition: RawFrame.h:76
~RawFrame()
Definition: RawFrame.h:115