Files
allwpilib/java/lib/CameraServerJNI.cpp

1004 lines
28 KiB
C++
Raw Normal View History

2016-08-26 09:31:42 -07:00
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2016. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "edu_wpi_cscore_CameraServerJNI.h"
2016-08-26 09:31:42 -07:00
#include "llvm/SmallString.h"
2016-08-28 21:20:40 -07:00
#include "support/jni_util.h"
2016-08-26 09:31:42 -07:00
#include "cscore_cpp.h"
2016-08-26 09:31:42 -07:00
2016-08-28 21:20:40 -07:00
using namespace wpi::java;
2016-08-26 09:31:42 -07:00
//
// Globals and load/unload
//
// Used for callback.
static JavaVM *jvm = nullptr;
static jclass usbCameraInfoCls = nullptr;
static jclass videoModeCls = nullptr;
2016-11-05 13:13:09 -07:00
static jclass videoEventCls = nullptr;
// Thread-attached environment for listener callbacks.
static JNIEnv *listenerEnv = nullptr;
static void ListenerOnStart() {
if (!jvm) return;
JNIEnv *env;
JavaVMAttachArgs args;
args.version = JNI_VERSION_1_2;
args.name = const_cast<char*>("CSListener");
args.group = nullptr;
if (jvm->AttachCurrentThreadAsDaemon(reinterpret_cast<void **>(&env),
&args) != JNI_OK)
return;
if (!env || !env->functions) return;
listenerEnv = env;
}
static void ListenerOnExit() {
listenerEnv = nullptr;
if (!jvm) return;
jvm->DetachCurrentThread();
}
2016-08-26 09:31:42 -07:00
extern "C" {
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
jvm = vm;
JNIEnv *env;
if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK)
return JNI_ERR;
// Cache references to classes
jclass local;
2016-11-06 19:28:14 -08:00
local = env->FindClass("edu/wpi/cscore/USBCameraInfo");
if (!local) return JNI_ERR;
usbCameraInfoCls = static_cast<jclass>(env->NewGlobalRef(local));
if (!usbCameraInfoCls) return JNI_ERR;
env->DeleteLocalRef(local);
2016-11-06 19:28:14 -08:00
local = env->FindClass("edu/wpi/cscore/VideoMode");
if (!local) return JNI_ERR;
videoModeCls = static_cast<jclass>(env->NewGlobalRef(local));
if (!videoModeCls) return JNI_ERR;
env->DeleteLocalRef(local);
2016-11-06 19:28:14 -08:00
local = env->FindClass("edu/wpi/cscore/VideoEvent");
2016-11-05 13:13:09 -07:00
if (!local) return JNI_ERR;
videoEventCls = static_cast<jclass>(env->NewGlobalRef(local));
if (!videoEventCls) return JNI_ERR;
env->DeleteLocalRef(local);
// Initial configuration of listener start/exit
cs::SetListenerOnStart(ListenerOnStart);
cs::SetListenerOnExit(ListenerOnExit);
2016-08-26 09:31:42 -07:00
return JNI_VERSION_1_6;
}
JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) {
JNIEnv *env;
if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK)
return;
// Delete global references
if (usbCameraInfoCls) env->DeleteGlobalRef(usbCameraInfoCls);
if (videoModeCls) env->DeleteGlobalRef(videoModeCls);
2016-11-05 13:13:09 -07:00
if (videoEventCls) env->DeleteGlobalRef(videoEventCls);
2016-08-26 09:31:42 -07:00
jvm = nullptr;
}
} // extern "C"
2016-11-05 13:13:09 -07:00
//
// Helper class to create and clean up a global reference
//
template <typename T>
class JGlobal {
public:
JGlobal(JNIEnv *env, T obj)
: m_obj(static_cast<T>(env->NewGlobalRef(obj))) {}
~JGlobal() {
if (!jvm || cs::NotifierDestroyed()) return;
JNIEnv *env;
bool attached = false;
// don't attach and de-attach if already attached to a thread.
if (jvm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) ==
JNI_EDETACHED) {
if (jvm->AttachCurrentThread(reinterpret_cast<void **>(&env), nullptr) !=
JNI_OK)
return;
attached = true;
}
if (!env || !env->functions) return;
env->DeleteGlobalRef(m_obj);
if (attached) jvm->DetachCurrentThread();
}
operator T() { return m_obj; }
T obj() { return m_obj; }
private:
T m_obj;
};
static void ReportError(JNIEnv *env, CS_Status status, bool do_throw = true) {
// TODO
}
static inline bool CheckStatus(JNIEnv *env, CS_Status status,
bool do_throw = true) {
if (status != 0) ReportError(env, status, do_throw);
return status == 0;
}
2016-08-28 21:20:40 -07:00
static jobject MakeJObject(JNIEnv *env, const cs::USBCameraInfo &info) {
static jmethodID constructor = env->GetMethodID(
2016-09-18 14:14:35 -07:00
usbCameraInfoCls, "<init>", "(ILjava/lang/String;Ljava/lang/String;)V");
2016-08-28 21:20:40 -07:00
JLocal<jstring> path(env, MakeJString(env, info.path));
JLocal<jstring> name(env, MakeJString(env, info.name));
return env->NewObject(usbCameraInfoCls, constructor,
2016-09-18 14:14:35 -07:00
static_cast<jint>(info.dev), path.obj(), name.obj());
}
static jobject MakeJObject(JNIEnv *env, const cs::VideoMode &videoMode) {
static jmethodID constructor =
env->GetMethodID(videoModeCls, "<init>", "(IIII)V");
return env->NewObject(
videoModeCls, constructor, static_cast<jint>(videoMode.pixelFormat),
static_cast<jint>(videoMode.width), static_cast<jint>(videoMode.height),
static_cast<jint>(videoMode.fps));
}
2016-11-05 13:13:09 -07:00
static jobject MakeJObject(JNIEnv *env, const cs::RawEvent &event) {
static jmethodID constructor =
env->GetMethodID(videoEventCls, "<init>",
"(IIILjava/lang/String;IIIIIIILjava/lang/String;)V");
JLocal<jstring> name(env, MakeJString(env, event.name));
JLocal<jstring> valueStr(env, MakeJString(env, event.valueStr));
return env->NewObject(
videoEventCls,
constructor,
static_cast<jint>(event.type),
static_cast<jint>(event.sourceHandle),
static_cast<jint>(event.sinkHandle),
name.obj(),
static_cast<jint>(event.mode.pixelFormat),
static_cast<jint>(event.mode.width),
static_cast<jint>(event.mode.height),
static_cast<jint>(event.mode.fps),
static_cast<jint>(event.propertyHandle),
static_cast<jint>(event.propertyType),
static_cast<jint>(event.value),
valueStr.obj());
}
2016-08-26 09:31:42 -07:00
extern "C" {
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: getPropertyType
* Signature: (I)I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_getPropertyType
(JNIEnv *env, jclass, jint property)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::GetPropertyType(property, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: getPropertyName
* Signature: (I)Ljava/lang/String;
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jstring JNICALL Java_edu_wpi_cscore_CameraServerJNI_getPropertyName
(JNIEnv *env, jclass, jint property)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
llvm::SmallString<128> buf;
auto str = cs::GetPropertyName(property, buf, &status);
if (!CheckStatus(env, status)) return nullptr;
2016-08-28 21:20:40 -07:00
return MakeJString(env, str);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: getProperty
* Signature: (I)I
2016-08-26 09:31:42 -07:00
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_getProperty
(JNIEnv *env, jclass, jint property)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::GetProperty(property, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: setProperty
* Signature: (II)V
2016-08-26 09:31:42 -07:00
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT void JNICALL Java_edu_wpi_cscore_CameraServerJNI_setProperty
(JNIEnv *env, jclass, jint property, jint value)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
cs::SetProperty(property, value, &status);
CheckStatus(env, status);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: getPropertyMin
* Signature: (I)I
2016-08-26 09:31:42 -07:00
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_getPropertyMin
(JNIEnv *env, jclass, jint property)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::GetPropertyMin(property, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: getPropertyMax
* Signature: (I)I
2016-08-26 09:31:42 -07:00
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_getPropertyMax
(JNIEnv *env, jclass, jint property)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::GetPropertyMax(property, &status);
CheckStatus(env, status);
return val;
}
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: getPropertyStep
* Signature: (I)I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_getPropertyStep
(JNIEnv *env, jclass, jint property)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::GetPropertyStep(property, &status);
CheckStatus(env, status);
return val;
}
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: getPropertyDefault
* Signature: (I)I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_getPropertyDefault
(JNIEnv *env, jclass, jint property)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::GetPropertyDefault(property, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: getStringProperty
* Signature: (I)Ljava/lang/String;
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jstring JNICALL Java_edu_wpi_cscore_CameraServerJNI_getStringProperty
(JNIEnv *env, jclass, jint property)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
llvm::SmallString<128> buf;
auto str = cs::GetStringProperty(property, buf, &status);
if (!CheckStatus(env, status)) return nullptr;
2016-08-28 21:20:40 -07:00
return MakeJString(env, str);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: setStringProperty
* Signature: (ILjava/lang/String;)V
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT void JNICALL Java_edu_wpi_cscore_CameraServerJNI_setStringProperty
(JNIEnv *env, jclass, jint property, jstring value)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
2016-08-28 21:20:40 -07:00
cs::SetStringProperty(property, JStringRef{env, value}, &status);
CheckStatus(env, status);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: getEnumPropertyChoices
* Signature: (I)[Ljava/lang/String;
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jobjectArray JNICALL Java_edu_wpi_cscore_CameraServerJNI_getEnumPropertyChoices
(JNIEnv *env, jclass, jint property)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto arr = cs::GetEnumPropertyChoices(property, &status);
if (!CheckStatus(env, status)) return nullptr;
2016-08-28 21:20:40 -07:00
return MakeJStringArray(env, arr);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: createUSBCameraDev
2016-08-26 09:31:42 -07:00
* Signature: (Ljava/lang/String;I)I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_createUSBCameraDev
(JNIEnv *env, jclass, jstring name, jint dev)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::CreateUSBCameraDev(JStringRef{env, name}, dev, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: createUSBCameraPath
2016-08-26 09:31:42 -07:00
* Signature: (Ljava/lang/String;Ljava/lang/String;)I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_createUSBCameraPath
(JNIEnv *env, jclass, jstring name, jstring path)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::CreateUSBCameraPath(JStringRef{env, name},
2016-08-28 21:20:40 -07:00
JStringRef{env, path}, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: createHTTPCamera
2016-08-26 09:31:42 -07:00
* Signature: (Ljava/lang/String;Ljava/lang/String;)I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_createHTTPCamera
(JNIEnv *env, jclass, jstring name, jstring url)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::CreateHTTPCamera(JStringRef{env, name},
2016-08-28 21:20:40 -07:00
JStringRef{env, url}, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: createCvSource
* Signature: (Ljava/lang/String;IIII)I
2016-08-26 09:31:42 -07:00
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_createCvSource
(JNIEnv *env, jclass, jstring name, jint pixelFormat, jint width, jint height,
jint fps)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::CreateCvSource(
JStringRef{env, name},
cs::VideoMode{static_cast<cs::VideoMode::PixelFormat>(pixelFormat),
static_cast<int>(width), static_cast<int>(height),
static_cast<int>(fps)},
&status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: getSourceName
* Signature: (I)Ljava/lang/String;
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jstring JNICALL Java_edu_wpi_cscore_CameraServerJNI_getSourceName
(JNIEnv *env, jclass, jint source)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
llvm::SmallString<128> buf;
auto str = cs::GetSourceName(source, buf, &status);
if (!CheckStatus(env, status)) return nullptr;
2016-08-28 21:20:40 -07:00
return MakeJString(env, str);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: getSourceDescription
* Signature: (I)Ljava/lang/String;
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jstring JNICALL Java_edu_wpi_cscore_CameraServerJNI_getSourceDescription
(JNIEnv *env, jclass, jint source)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
llvm::SmallString<128> buf;
auto str = cs::GetSourceDescription(source, buf, &status);
if (!CheckStatus(env, status)) return nullptr;
2016-08-28 21:20:40 -07:00
return MakeJString(env, str);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: getSourceLastFrameTime
* Signature: (I)J
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jlong JNICALL Java_edu_wpi_cscore_CameraServerJNI_getSourceLastFrameTime
(JNIEnv *env, jclass, jint source)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::GetSourceLastFrameTime(source, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: isSourceConnected
* Signature: (I)Z
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jboolean JNICALL Java_edu_wpi_cscore_CameraServerJNI_isSourceConnected
(JNIEnv *env, jclass, jint source)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::IsSourceConnected(source, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: getSourceProperty
* Signature: (ILjava/lang/String;)I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_getSourceProperty
(JNIEnv *env, jclass, jint source, jstring name)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
2016-08-28 21:20:40 -07:00
auto val = cs::GetSourceProperty(source, JStringRef{env, name}, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: enumerateSourceProperties
* Signature: (I)[I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jintArray JNICALL Java_edu_wpi_cscore_CameraServerJNI_enumerateSourceProperties
(JNIEnv *env, jclass, jint source)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
llvm::SmallVector<CS_Property, 32> buf;
auto arr = cs::EnumerateSourceProperties(source, buf, &status);
if (!CheckStatus(env, status)) return nullptr;
2016-08-28 21:20:40 -07:00
return MakeJIntArray(env, arr);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: getSourceVideoMode
* Signature: (I)Ledu/wpi/cameraserver/VideoMode;
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jobject JNICALL Java_edu_wpi_cscore_CameraServerJNI_getSourceVideoMode
(JNIEnv *env, jclass, jint source)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::GetSourceVideoMode(source, &status);
if (!CheckStatus(env, status)) return nullptr;
return MakeJObject(env, val);
}
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: setSourceVideoMode
* Signature: (IIIII)Z
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jboolean JNICALL Java_edu_wpi_cscore_CameraServerJNI_setSourceVideoMode
(JNIEnv *env, jclass, jint source, jint pixelFormat, jint width, jint height,
jint fps)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::SetSourceVideoMode(
source,
cs::VideoMode(static_cast<cs::VideoMode::PixelFormat>(pixelFormat), width,
height, fps),
&status);
CheckStatus(env, status);
return val;
}
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: setSourcePixelFormat
* Signature: (II)Z
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jboolean JNICALL Java_edu_wpi_cscore_CameraServerJNI_setSourcePixelFormat
(JNIEnv *env, jclass, jint source, jint pixelFormat)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::SetSourcePixelFormat(
source, static_cast<cs::VideoMode::PixelFormat>(pixelFormat), &status);
CheckStatus(env, status);
return val;
}
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: setSourceResolution
* Signature: (III)Z
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jboolean JNICALL Java_edu_wpi_cscore_CameraServerJNI_setSourceResolution
(JNIEnv *env, jclass, jint source, jint width, jint height)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::SetSourceResolution(source, width, height, &status);
CheckStatus(env, status);
return val;
}
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: setSourceFPS
* Signature: (II)Z
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jboolean JNICALL Java_edu_wpi_cscore_CameraServerJNI_setSourceFPS
(JNIEnv *env, jclass, jint source, jint fps)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::SetSourceFPS(source, fps, &status);
CheckStatus(env, status);
return val;
}
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: enumerateSourceVideoModes
* Signature: (I)[Ledu/wpi/cameraserver/VideoMode;
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jobjectArray JNICALL Java_edu_wpi_cscore_CameraServerJNI_enumerateSourceVideoModes
(JNIEnv *env, jclass, jint source)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto arr = cs::EnumerateSourceVideoModes(source, &status);
if (!CheckStatus(env, status)) return nullptr;
jobjectArray jarr =
env->NewObjectArray(arr.size(), videoModeCls, nullptr);
if (!jarr) return nullptr;
for (size_t i = 0; i < arr.size(); ++i) {
JLocal<jobject> jelem{env, MakeJObject(env, arr[i])};
env->SetObjectArrayElement(jarr, i, jelem);
}
return jarr;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: copySource
* Signature: (I)I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_copySource
(JNIEnv *env, jclass, jint source)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::CopySource(source, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: releaseSource
* Signature: (I)V
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT void JNICALL Java_edu_wpi_cscore_CameraServerJNI_releaseSource
(JNIEnv *env, jclass, jint source)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
cs::ReleaseSource(source, &status);
CheckStatus(env, status);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: putSourceFrame
* Signature: (IJ)V
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT void JNICALL Java_edu_wpi_cscore_CameraServerJNI_putSourceFrame
(JNIEnv *env, jclass, jint source, jlong imageNativeObj)
{
cv::Mat& image = *((cv::Mat*)imageNativeObj);
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
cs::PutSourceFrame(source, image, &status);
CheckStatus(env, status);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: notifySourceError
* Signature: (ILjava/lang/String;)V
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT void JNICALL Java_edu_wpi_cscore_CameraServerJNI_notifySourceError
(JNIEnv *env, jclass, jint source, jstring msg)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
2016-08-28 21:20:40 -07:00
cs::NotifySourceError(source, JStringRef{env, msg}, &status);
CheckStatus(env, status);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: setSourceConnected
* Signature: (IZ)V
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT void JNICALL Java_edu_wpi_cscore_CameraServerJNI_setSourceConnected
(JNIEnv *env, jclass, jint source, jboolean connected)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
cs::SetSourceConnected(source, connected, &status);
CheckStatus(env, status);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: setSourceDescription
* Signature: (ILjava/lang/String;)V
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT void JNICALL Java_edu_wpi_cscore_CameraServerJNI_setSourceDescription
(JNIEnv *env, jclass, jint source, jstring description)
{
CS_Status status = 0;
cs::SetSourceDescription(source, JStringRef{env, description}, &status);
CheckStatus(env, status);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: createSourceProperty
* Signature: (ILjava/lang/String;IIIIII)I
2016-08-26 09:31:42 -07:00
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_createSourceProperty
(JNIEnv *env, jclass, jint source, jstring name, jint type, jint minimum, jint maximum, jint step, jint defaultValue, jint value)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::CreateSourceProperty(
source, JStringRef{env, name}, static_cast<CS_PropertyType>(type),
minimum, maximum, step, defaultValue, value, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: setSourceEnumPropertyChoices
* Signature: (II[Ljava/lang/String;)V
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT void JNICALL Java_edu_wpi_cscore_CameraServerJNI_setSourceEnumPropertyChoices
(JNIEnv *env, jclass, jint source, jint property, jobjectArray choices)
{
size_t len = env->GetArrayLength(choices);
llvm::SmallVector<std::string, 8> vec;
vec.reserve(len);
for (size_t i = 0; i < len; ++i) {
JLocal<jstring> elem{
env, static_cast<jstring>(env->GetObjectArrayElement(choices, i))};
if (!elem) {
// TODO
return;
}
vec.push_back(JStringRef{env, elem}.str());
}
CS_Status status = 0;
cs::SetSourceEnumPropertyChoices(source, property, vec, &status);
CheckStatus(env, status);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-10-15 22:44:26 -07:00
* Method: createMJPEGServer
2016-08-26 09:31:42 -07:00
* Signature: (Ljava/lang/String;Ljava/lang/String;I)I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_createMJPEGServer
(JNIEnv *env, jclass, jstring name, jstring listenAddress, jint port)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
2016-10-15 22:44:26 -07:00
auto val = cs::CreateMJPEGServer(
JStringRef{env, name}, JStringRef{env, listenAddress}, port, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: createCvSink
* Signature: (Ljava/lang/String;)I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_createCvSink
(JNIEnv *env, jclass, jstring name)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
2016-08-28 21:20:40 -07:00
auto val = cs::CreateCvSink(JStringRef{env, name}, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: getSinkName
* Signature: (I)Ljava/lang/String;
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jstring JNICALL Java_edu_wpi_cscore_CameraServerJNI_getSinkName
(JNIEnv *env, jclass, jint sink)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
llvm::SmallString<128> buf;
auto str = cs::GetSinkName(sink, buf, &status);
if (!CheckStatus(env, status)) return nullptr;
2016-08-28 21:20:40 -07:00
return MakeJString(env, str);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: getSinkDescription
* Signature: (I)Ljava/lang/String;
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jstring JNICALL Java_edu_wpi_cscore_CameraServerJNI_getSinkDescription
(JNIEnv *env, jclass, jint sink)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
llvm::SmallString<128> buf;
auto str = cs::GetSinkDescription(sink, buf, &status);
if (!CheckStatus(env, status)) return nullptr;
2016-08-28 21:20:40 -07:00
return MakeJString(env, str);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: setSinkSource
* Signature: (II)V
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT void JNICALL Java_edu_wpi_cscore_CameraServerJNI_setSinkSource
(JNIEnv *env, jclass, jint sink, jint source)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
cs::SetSinkSource(sink, source, &status);
CheckStatus(env, status);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: getSinkSourceProperty
* Signature: (ILjava/lang/String;)I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_getSinkSourceProperty
(JNIEnv *env, jclass, jint sink, jstring name)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
2016-08-28 21:20:40 -07:00
auto val = cs::GetSinkSourceProperty(sink, JStringRef{env, name}, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: getSinkSource
* Signature: (I)I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_getSinkSource
(JNIEnv *env, jclass, jint sink)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::GetSinkSource(sink, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: copySink
* Signature: (I)I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_copySink
(JNIEnv *env, jclass, jint sink)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto val = cs::CopySink(sink, &status);
CheckStatus(env, status);
return val;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: releaseSink
* Signature: (I)V
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT void JNICALL Java_edu_wpi_cscore_CameraServerJNI_releaseSink
(JNIEnv *env, jclass, jint sink)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
cs::ReleaseSink(sink, &status);
CheckStatus(env, status);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: setSinkDescription
* Signature: (ILjava/lang/String;)V
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT void JNICALL Java_edu_wpi_cscore_CameraServerJNI_setSinkDescription
(JNIEnv *env, jclass, jint sink, jstring description)
{
CS_Status status = 0;
cs::SetSinkDescription(sink, JStringRef{env, description}, &status);
CheckStatus(env, status);
}
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: grabSinkFrame
* Signature: (IJ)J
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jlong JNICALL Java_edu_wpi_cscore_CameraServerJNI_grabSinkFrame
(JNIEnv *env, jclass, jint sink, jlong imageNativeObj)
{
cv::Mat& image = *((cv::Mat*)imageNativeObj);
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto rv = cs::GrabSinkFrame(sink, image, &status);
CheckStatus(env, status);
return rv;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: getSinkError
* Signature: (I)Ljava/lang/String;
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jstring JNICALL Java_edu_wpi_cscore_CameraServerJNI_getSinkError
(JNIEnv *env, jclass, jint sink)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
llvm::SmallString<128> buf;
auto str = cs::GetSinkError(sink, buf, &status);
if (!CheckStatus(env, status)) return nullptr;
2016-08-28 21:20:40 -07:00
return MakeJString(env, str);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: setSinkEnabled
* Signature: (IZ)V
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT void JNICALL Java_edu_wpi_cscore_CameraServerJNI_setSinkEnabled
(JNIEnv *env, jclass, jint sink, jboolean enabled)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
cs::SetSinkEnabled(sink, enabled, &status);
CheckStatus(env, status);
}
2016-08-26 09:31:42 -07:00
2016-11-05 13:13:09 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-11-05 13:13:09 -07:00
* Method: addListener
* Signature: (Ljava/util/function/Consumer;IZ)I
2016-11-05 13:13:09 -07:00
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jint JNICALL Java_edu_wpi_cscore_CameraServerJNI_addListener
2016-11-05 13:13:09 -07:00
(JNIEnv *envouter, jclass, jobject listener, jint eventMask, jboolean immediateNotify)
{
// the shared pointer to the weak global will keep it around until the
// entry listener is destroyed
auto listener_global =
std::make_shared<JGlobal<jobject>>(envouter, listener);
// cls is a temporary here; cannot be used within callback functor
jclass cls = envouter->GetObjectClass(listener);
if (!cls) return 0;
// method ids, on the other hand, are safe to retain
jmethodID mid = envouter->GetMethodID(cls, "accept", "(Ljava/lang/Object;)V");
2016-11-05 13:13:09 -07:00
if (!mid) return 0;
CS_Status status = 0;
CS_Listener handle = cs::AddListener(
[=](const cs::RawEvent &event) {
JNIEnv *env = listenerEnv;
if (!env || !env->functions) return;
// get the handler
auto handler = listener_global->obj();
// convert into the appropriate Java type
JLocal<jobject> jobj{env, MakeJObject(env, event)};
if (env->ExceptionCheck()) {
env->ExceptionDescribe();
env->ExceptionClear();
return;
}
if (!jobj) return;
env->CallVoidMethod(handler, mid, jobj.obj());
if (env->ExceptionCheck()) {
env->ExceptionDescribe();
env->ExceptionClear();
}
},
eventMask, immediateNotify != JNI_FALSE, &status);
CheckStatus(envouter, status);
return handle;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
* Method: removeListener
2016-08-26 09:31:42 -07:00
* Signature: (I)V
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT void JNICALL Java_edu_wpi_cscore_CameraServerJNI_removeListener
(JNIEnv *env, jclass, jint handle)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
cs::RemoveListener(handle, &status);
CheckStatus(env, status);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: enumerateUSBCameras
* Signature: ()[Ledu/wpi/cameraserver/USBCameraInfo;
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jobjectArray JNICALL Java_edu_wpi_cscore_CameraServerJNI_enumerateUSBCameras
(JNIEnv *env, jclass)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
auto arr = cs::EnumerateUSBCameras(&status);
if (!CheckStatus(env, status)) return nullptr;
jobjectArray jarr =
env->NewObjectArray(arr.size(), usbCameraInfoCls, nullptr);
if (!jarr) return nullptr;
for (size_t i = 0; i < arr.size(); ++i) {
2016-08-28 21:20:40 -07:00
JLocal<jobject> jelem{env, MakeJObject(env, arr[i])};
env->SetObjectArrayElement(jarr, i, jelem);
}
return jarr;
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: enumerateSources
* Signature: ()[I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jintArray JNICALL Java_edu_wpi_cscore_CameraServerJNI_enumerateSources
(JNIEnv *env, jclass)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
llvm::SmallVector<CS_Source, 16> buf;
auto arr = cs::EnumerateSourceHandles(buf, &status);
if (!CheckStatus(env, status)) return nullptr;
2016-08-28 21:20:40 -07:00
return MakeJIntArray(env, arr);
}
2016-08-26 09:31:42 -07:00
/*
2016-11-06 19:28:14 -08:00
* Class: edu_wpi_cscore_CameraServerJNI
2016-08-26 09:31:42 -07:00
* Method: enumerateSinks
* Signature: ()[I
*/
2016-11-06 19:28:14 -08:00
JNIEXPORT jintArray JNICALL Java_edu_wpi_cscore_CameraServerJNI_enumerateSinks
(JNIEnv *env, jclass)
{
2016-10-21 14:52:21 -07:00
CS_Status status = 0;
llvm::SmallVector<CS_Sink, 16> buf;
auto arr = cs::EnumerateSinkHandles(buf, &status);
if (!CheckStatus(env, status)) return nullptr;
2016-08-28 21:20:40 -07:00
return MakeJIntArray(env, arr);
}
2016-08-26 09:31:42 -07:00
} // extern "C"