mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-21 01:01:43 +00:00
[wpiutil,cscore,apriltag] Fix RawFrame (#6098)
This commit is contained in:
@@ -6,25 +6,44 @@
|
||||
|
||||
#include <wpi/MemAlloc.h>
|
||||
|
||||
#include <cstring>
|
||||
|
||||
extern "C" {
|
||||
void WPI_AllocateRawFrameData(WPI_RawFrame* frame, int requestedSize) {
|
||||
if (frame->dataLength >= requestedSize) {
|
||||
return;
|
||||
int WPI_AllocateRawFrameData(WPI_RawFrame* frame, size_t requestedSize) {
|
||||
if (frame->capacity >= requestedSize) {
|
||||
return 0;
|
||||
}
|
||||
if (frame->data) {
|
||||
frame->data =
|
||||
static_cast<char*>(wpi::safe_realloc(frame->data, requestedSize));
|
||||
} else {
|
||||
frame->data = static_cast<char*>(wpi::safe_malloc(requestedSize));
|
||||
}
|
||||
frame->dataLength = requestedSize;
|
||||
WPI_FreeRawFrameData(frame);
|
||||
frame->data = static_cast<uint8_t*>(wpi::safe_malloc(requestedSize));
|
||||
frame->capacity = requestedSize;
|
||||
frame->size = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void WPI_FreeRawFrameData(WPI_RawFrame* frame) {
|
||||
if (frame->data) {
|
||||
std::free(frame->data);
|
||||
if (frame->freeFunc) {
|
||||
frame->freeFunc(frame->freeCbData, frame->data, frame->capacity);
|
||||
} else {
|
||||
std::free(frame->data);
|
||||
}
|
||||
frame->data = nullptr;
|
||||
frame->dataLength = 0;
|
||||
frame->freeFunc = nullptr;
|
||||
frame->freeCbData = nullptr;
|
||||
frame->capacity = 0;
|
||||
}
|
||||
}
|
||||
|
||||
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)) {
|
||||
WPI_FreeRawFrameData(frame);
|
||||
frame->data = static_cast<uint8_t*>(data);
|
||||
frame->freeFunc = freeFunc;
|
||||
frame->freeCbData = cbdata;
|
||||
frame->capacity = capacity;
|
||||
frame->size = size;
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
|
||||
@@ -327,9 +327,7 @@ JNIEXPORT jlong JNICALL
|
||||
Java_edu_wpi_first_util_WPIUtilJNI_allocateRawFrame
|
||||
(JNIEnv*, jclass)
|
||||
{
|
||||
wpi::RawFrame* rawFrame = new wpi::RawFrame{};
|
||||
intptr_t rawFrameIntPtr = reinterpret_cast<intptr_t>(rawFrame);
|
||||
return static_cast<jlong>(rawFrameIntPtr);
|
||||
return reinterpret_cast<jlong>(new wpi::RawFrame);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -339,11 +337,76 @@ Java_edu_wpi_first_util_WPIUtilJNI_allocateRawFrame
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_util_WPIUtilJNI_freeRawFrame
|
||||
(JNIEnv*, jclass, jlong rawFrame)
|
||||
(JNIEnv*, jclass, jlong frame)
|
||||
{
|
||||
wpi::RawFrame* ptr =
|
||||
reinterpret_cast<wpi::RawFrame*>(static_cast<intptr_t>(rawFrame));
|
||||
delete ptr;
|
||||
delete reinterpret_cast<wpi::RawFrame*>(frame);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: edu_wpi_first_util_WPIUtilJNI
|
||||
* Method: getRawFrameDataPtr
|
||||
* Signature: (J)J
|
||||
*/
|
||||
JNIEXPORT jlong JNICALL
|
||||
Java_edu_wpi_first_util_WPIUtilJNI_getRawFrameDataPtr
|
||||
(JNIEnv* env, jclass, jlong frame)
|
||||
{
|
||||
auto* f = reinterpret_cast<wpi::RawFrame*>(frame);
|
||||
if (!f) {
|
||||
wpi::ThrowNullPointerException(env, "frame is null");
|
||||
return 0;
|
||||
}
|
||||
return reinterpret_cast<jlong>(f->data);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: edu_wpi_first_util_WPIUtilJNI
|
||||
* Method: setRawFrameData
|
||||
* Signature: (JLjava/lang/Object;IIIII)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_util_WPIUtilJNI_setRawFrameData
|
||||
(JNIEnv* env, jclass, jlong frame, jobject data, jint size, jint width,
|
||||
jint height, jint stride, jint pixelFormat)
|
||||
{
|
||||
auto* f = reinterpret_cast<wpi::RawFrame*>(frame);
|
||||
if (!f) {
|
||||
wpi::ThrowNullPointerException(env, "frame is null");
|
||||
return;
|
||||
}
|
||||
auto buf = env->GetDirectBufferAddress(data);
|
||||
if (!buf) {
|
||||
wpi::ThrowNullPointerException(env, "data is null");
|
||||
return;
|
||||
}
|
||||
// there's no way to free a passed-in direct byte buffer
|
||||
f->SetData(buf, size, env->GetDirectBufferCapacity(data), nullptr,
|
||||
[](void*, void*, size_t) {});
|
||||
f->width = width;
|
||||
f->height = height;
|
||||
f->stride = stride;
|
||||
f->pixelFormat = pixelFormat;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: edu_wpi_first_util_WPIUtilJNI
|
||||
* Method: setRawFrameInfo
|
||||
* Signature: (JIIIII)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_util_WPIUtilJNI_setRawFrameInfo
|
||||
(JNIEnv* env, jclass, jlong frame, jint size, jint width, jint height,
|
||||
jint stride, jint pixelFormat)
|
||||
{
|
||||
auto* f = reinterpret_cast<wpi::RawFrame*>(frame);
|
||||
if (!f) {
|
||||
wpi::ThrowNullPointerException(env, "frame is null");
|
||||
return;
|
||||
}
|
||||
f->width = width;
|
||||
f->height = height;
|
||||
f->stride = stride;
|
||||
f->pixelFormat = pixelFormat;
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
|
||||
Reference in New Issue
Block a user