WPILibC++ 2027.0.0-alpha-4
Loading...
Searching...
No Matches
RawFrame.hpp
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#pragma once
6
8#include "wpi/util/RawFrame.h"
9
10#ifdef WPI_RAWFRAME_JNI
11#include <concepts>
12#endif
13#include <cstddef>
14
15#ifdef WPI_RAWFRAME_JNI
16#include "wpi/util/jni_util.hpp"
17#endif
18
19namespace wpi::util {
20struct RawFrame : public WPI_RawFrame {
22 data = nullptr;
23 freeFunc = nullptr;
24 freeCbData = nullptr;
25 capacity = 0;
26 size = 0;
28 width = 0;
29 height = 0;
30 timestamp = 0;
32 }
33 RawFrame(const RawFrame&) = delete;
34 RawFrame& operator=(const RawFrame&) = delete;
35 RawFrame(RawFrame&& rhs) noexcept : WPI_RawFrame{rhs} {
36 rhs.data = nullptr;
37 rhs.freeFunc = nullptr;
38 rhs.freeCbData = nullptr;
39 rhs.capacity = 0;
40 rhs.size = 0;
41 }
42 RawFrame& operator=(RawFrame&& rhs) noexcept {
43 *static_cast<WPI_RawFrame*>(this) = rhs;
44 rhs.data = nullptr;
45 rhs.freeFunc = nullptr;
46 rhs.freeCbData = nullptr;
47 rhs.capacity = 0;
48 rhs.size = 0;
49 return *this;
50 }
51
52 void SetData(void* data, size_t size, size_t capacity, void* cbdata,
53 void (*freeFunc)(void* cbdata, void* data, size_t capacity)) {
55 }
56
57 // returns true if the frame data was allocated/reallocated
58 bool Reserve(size_t size) {
59 return WPI_AllocateRawFrameData(this, size) != 0;
60 }
61
63};
64
65#ifdef WPI_RAWFRAME_JNI
66template <std::same_as<wpi::util::RawFrame> T>
67void SetFrameData(JNIEnv* env, jclass rawFrameCls, jobject jframe,
68 const T& frame, bool newData) {
69 if (newData) {
70 static jmethodID setData = env->GetMethodID(
71 rawFrameCls, "setDataJNI", "(Ljava/nio/ByteBuffer;IIIIJI)V");
72 env->CallVoidMethod(
73 jframe, setData, env->NewDirectByteBuffer(frame.data, frame.size),
74 static_cast<jint>(frame.width), static_cast<jint>(frame.height),
75 static_cast<jint>(frame.stride), static_cast<jint>(frame.pixelFormat),
76 static_cast<jlong>(frame.timestamp),
77 static_cast<jint>(frame.timestampSrc));
78 } else {
79 static jmethodID setInfo =
80 env->GetMethodID(rawFrameCls, "setInfoJNI", "(IIIIJI)V");
81 env->CallVoidMethod(jframe, setInfo, static_cast<jint>(frame.width),
82 static_cast<jint>(frame.height),
83 static_cast<jint>(frame.stride),
84 static_cast<jint>(frame.pixelFormat),
85 static_cast<jlong>(frame.timestamp),
86 static_cast<jint>(frame.timestampSrc));
87 }
88}
89#endif
90
91} // namespace wpi::util
@ WPI_PIXFMT_UNKNOWN
Definition PixelFormat.h:11
int WPI_AllocateRawFrameData(WPI_RawFrame *frame, size_t requestedSize)
@ WPI_TIMESRC_UNKNOWN
Definition RawFrame.h:37
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)
Definition raw_os_ostream.hpp:19
Raw Frame.
Definition RawFrame.h:17
int pixelFormat
Definition RawFrame.h:25
uint64_t timestamp
Definition RawFrame.h:29
void * freeCbData
Definition RawFrame.h:22
void(* freeFunc)(void *cbdata, void *data, size_t capacity)
Definition RawFrame.h:21
size_t capacity
Definition RawFrame.h:23
uint8_t * data
Definition RawFrame.h:19
size_t size
Definition RawFrame.h:24
int height
Definition RawFrame.h:27
int width
Definition RawFrame.h:26
int timestampSrc
Definition RawFrame.h:30
bool Reserve(size_t size)
Definition RawFrame.hpp:58
RawFrame(const RawFrame &)=delete
RawFrame(RawFrame &&rhs) noexcept
Definition RawFrame.hpp:35
RawFrame & operator=(RawFrame &&rhs) noexcept
Definition RawFrame.hpp:42
~RawFrame()
Definition RawFrame.hpp:62
RawFrame & operator=(const RawFrame &)=delete
RawFrame()
Definition RawFrame.hpp:21
void SetData(void *data, size_t size, size_t capacity, void *cbdata, void(*freeFunc)(void *cbdata, void *data, size_t capacity))
Definition RawFrame.hpp:52