diff --git a/include/cameraserver_c.h b/include/cameraserver_c.h index 1bc9921761..4e994192d4 100644 --- a/include/cameraserver_c.h +++ b/include/cameraserver_c.h @@ -52,6 +52,7 @@ enum CS_PropertyType { enum CS_PropertyType CS_GetPropertyType(CS_Property property, CS_Status* status); +char* CS_GetPropertyName(CS_Property property, CS_Status* status); CS_Bool CS_GetBooleanProperty(CS_Property property, CS_Status* status); void CS_SetBooleanProperty(CS_Property property, CS_Bool value, CS_Status* status); @@ -93,6 +94,8 @@ char* CS_GetSourceDescription(CS_Source source, CS_Status* status); uint64_t CS_GetSourceLastFrameTime(CS_Source source, CS_Status* status); int CS_GetSourceNumChannels(CS_Source source, CS_Status* status); CS_Bool CS_IsSourceConnected(CS_Source source, CS_Status* status); +CS_Property* EnumerateSourceProperties(CS_Source source, int* count, + CS_Status* status); CS_Source CS_CopySource(CS_Source source, CS_Status* status); void CS_ReleaseSource(CS_Source source, CS_Status* status); @@ -112,10 +115,11 @@ CS_Property CS_CreateSourceProperty(CS_Source source, const char* name, CS_Status* status); CS_Property CS_CreateSourcePropertyCallback( CS_Source source, const char* name, enum CS_PropertyType type, void* data, - void (*onChange)(void* data, const char* name, CS_Property property), - CS_Status* status); -void CS_RemoveSourceProperty(CS_Source source, const char* name, + void (*onChange)(void* data, CS_Property property), CS_Status* status); +void CS_RemoveSourceProperty(CS_Source source, CS_Property property, CS_Status* status); +void CS_RemoveSourcePropertyByName(CS_Source source, const char* name, + CS_Status* status); // // Sink Creation Functions @@ -205,6 +209,8 @@ void CS_ReleaseEnumeratedSinks(CS_Sink* sinks, int count); void CS_FreeString(char* str); void CS_FreeEnumPropertyChoices(char** choices, int count); +void CS_FreeEnumeratedProperties(CS_Property* properties, int count); + #ifdef __cplusplus } #endif diff --git a/include/cameraserver_cpp.h b/include/cameraserver_cpp.h index 4d48cdf02f..0a20eff418 100644 --- a/include/cameraserver_cpp.h +++ b/include/cameraserver_cpp.h @@ -49,6 +49,9 @@ struct USBCameraInfo { // CS_PropertyType GetPropertyType(CS_Property property, CS_Status* status); +std::string GetPropertyName(CS_Property property, CS_Status* status); +void GetPropertyName(CS_Property property, llvm::SmallVectorImpl& name, + CS_Status* status); bool GetBooleanProperty(CS_Property property, CS_Status* status); void SetBooleanProperty(CS_Property property, bool value, CS_Status* status); double GetDoubleProperty(CS_Property property, CS_Status* status); @@ -94,6 +97,9 @@ void GetSourceDescription(CS_Source source, llvm::SmallVectorImpl& desc, uint64_t GetSourceLastFrameTime(CS_Source source, CS_Status* status); int GetSourceNumChannels(CS_Source source, CS_Status* status); bool IsSourceConnected(CS_Source source, CS_Status* status); +void EnumerateSourceProperties(CS_Source source, + llvm::SmallVectorImpl& properties, + CS_Status* status); CS_Source CopySource(CS_Source source, CS_Status* status); void ReleaseSource(CS_Source source, CS_Status* status); @@ -111,8 +117,9 @@ CS_Property CreateSourceProperty(CS_Source source, llvm::StringRef name, CS_PropertyType type, CS_Status* status); CS_Property CreateSourcePropertyCallback( CS_Source source, llvm::StringRef name, CS_PropertyType type, - std::function onChange, - CS_Status* status); + std::function onChange, CS_Status* status); +void RemoveSourceProperty(CS_Source source, CS_Property property, + CS_Status* status); void RemoveSourceProperty(CS_Source source, llvm::StringRef name, CS_Status* status); diff --git a/include/cameraserver_oo.h b/include/cameraserver_oo.h index b820292257..dcd8e1dd60 100644 --- a/include/cameraserver_oo.h +++ b/include/cameraserver_oo.h @@ -39,6 +39,8 @@ class VideoProperty { VideoProperty() : m_handle(0), m_type(kNone) {} + std::string GetName() const; + Type type() const { return m_type; } explicit operator bool() const { return m_type != kNone; } @@ -117,6 +119,9 @@ class VideoSource { /// the given name exists) VideoProperty GetProperty(llvm::StringRef name); + /// Enumerate all properties of this source. + std::vector EnumerateProperties() const; + CS_Status GetLastStatus() const { return m_status; } /// Enumerate all existing sources. @@ -200,8 +205,11 @@ class CvSource : public VideoSource { /// @return Property VideoProperty CreateProperty( llvm::StringRef name, VideoProperty::Type type, - std::function - onChange); + std::function onChange); + + /// Remove a property. + /// @param property Property + void RemoveProperty(VideoProperty property); /// Remove a property. /// @param name Property name diff --git a/include/cameraserver_oo.inl b/include/cameraserver_oo.inl index 7f421dd075..6cba9feec0 100644 --- a/include/cameraserver_oo.inl +++ b/include/cameraserver_oo.inl @@ -10,6 +10,11 @@ namespace cs { +inline std::string VideoProperty::GetName() const { + m_status = 0; + return GetPropertyName(m_handle, &m_status); +} + inline bool VideoProperty::GetBoolean() const { m_status = 0; return GetBooleanProperty(m_handle, &m_status); @@ -187,17 +192,19 @@ inline VideoProperty CvSource::CreateProperty(llvm::StringRef name, inline VideoProperty CvSource::CreateProperty( llvm::StringRef name, VideoProperty::Type type, - std::function - onChange) { + std::function onChange) { m_status = 0; return VideoProperty{CreateSourcePropertyCallback( m_handle, name, static_cast(static_cast(type)), - [=](llvm::StringRef name, CS_Property property) { - onChange(name, VideoProperty{property}); - }, + [=](CS_Property property) { onChange(VideoProperty{property}); }, &m_status)}; } +inline void CvSource::RemoveProperty(VideoProperty property) { + m_status = 0; + RemoveSourceProperty(m_handle, property.m_handle, &m_status); +} + inline void CvSource::RemoveProperty(llvm::StringRef name) { m_status = 0; RemoveSourceProperty(m_handle, name, &m_status); diff --git a/java/src/edu/wpi/cameraserver/CameraServerJNI.java b/java/src/edu/wpi/cameraserver/CameraServerJNI.java index b5845e5cb3..766d45f140 100644 --- a/java/src/edu/wpi/cameraserver/CameraServerJNI.java +++ b/java/src/edu/wpi/cameraserver/CameraServerJNI.java @@ -69,6 +69,7 @@ public class CameraServerJNI { // Property Functions // public static native int getPropertyType(int property); + public static native String getPropertyName(int property); public static native boolean getBooleanProperty(int property); public static native void setBooleanProperty(int property, boolean value); public static native double getDoubleProperty(int property); @@ -102,6 +103,7 @@ public class CameraServerJNI { public static native long getSourceLastFrameTime(int source); public static native int getSourceNumChannels(int source); public static native boolean isSourceConnected(int source); + public static native int[] enumerateSourceProperties(int source); public static native int copySource(int source); public static native void releaseSource(int source); @@ -118,7 +120,8 @@ public class CameraServerJNI { // int type, // void (*onChange)(String name, // int property)); - public static native void removeSourceProperty(int source, String name); + public static native void removeSourceProperty(int source, int property); + public static native void removeSourcePropertyByName(int source, String name); // // Sink Creation Functions diff --git a/java/src/edu/wpi/cameraserver/CvSource.java b/java/src/edu/wpi/cameraserver/CvSource.java index ae73c68ac0..e64840399a 100644 --- a/java/src/edu/wpi/cameraserver/CvSource.java +++ b/java/src/edu/wpi/cameraserver/CvSource.java @@ -60,9 +60,15 @@ public class CvSource extends VideoSource { // std::function // onChange); + /// Remove a property. + /// @param name Property name + //public void removeProperty(VdeoProperty property) { + // CameraServerJNI.removeSourceProperty(m_handle, property.m_handle); + //} + /// Remove a property. /// @param name Property name public void removeProperty(String name) { - CameraServerJNI.removeSourceProperty(m_handle, name); + CameraServerJNI.removeSourcePropertyByName(m_handle, name); } } diff --git a/java/src/edu/wpi/cameraserver/VideoSource.java b/java/src/edu/wpi/cameraserver/VideoSource.java index 62875ea695..6403e5a7a4 100644 --- a/java/src/edu/wpi/cameraserver/VideoSource.java +++ b/java/src/edu/wpi/cameraserver/VideoSource.java @@ -51,6 +51,9 @@ public class VideoSource { /// the given name exists) //public VideoProperty getProperty(String name); + /// Enumerate all properties of this source. + //public VideoProperty[] enumerateProperties(); + /// Enumerate all existing sources. /// @return Vector of sources. public static VideoSource[] enumerateSources() { diff --git a/src/cameraserver_c.cpp b/src/cameraserver_c.cpp index 890ae07b62..e18a6fa79d 100644 --- a/src/cameraserver_c.cpp +++ b/src/cameraserver_c.cpp @@ -31,6 +31,13 @@ CS_PropertyType CS_GetPropertyType(CS_Property property, CS_Status* status) { return cs::GetPropertyType(property, status); } +char* CS_GetPropertyName(CS_Property property, CS_Status* status) { + llvm::SmallString<128> str; + cs::GetPropertyName(property, str, status); + if (*status != 0) return nullptr; + return ConvertToC(str); +} + CS_Bool CS_GetBooleanProperty(CS_Property property, CS_Status* status) { return cs::GetBooleanProperty(property, status); } @@ -137,6 +144,17 @@ CS_Bool CS_IsSourceConnected(CS_Source source, CS_Status* status) { return cs::IsSourceConnected(source, status); } +CS_Property* EnumerateSourceProperties(CS_Source source, int* count, + CS_Status* status) { + llvm::SmallVector vec; + cs::EnumerateSourceProperties(source, vec, status); + CS_Property* out = + static_cast(std::malloc(vec.size() * sizeof(CS_Property))); + *count = vec.size(); + std::copy(vec.begin(), vec.end(), out); + return out; +} + CS_Source CS_CopySource(CS_Source source, CS_Status* status) { return cs::CopySource(source, status); } @@ -177,24 +195,20 @@ CS_Property CS_CreateSourceProperty(CS_Source source, const char* name, CS_Property CS_CreateSourcePropertyCallback( CS_Source source, const char* name, enum CS_PropertyType type, void* data, - void (*onChange)(void* data, const char* name, CS_Property property), + void (*onChange)(void* data, CS_Property property), CS_Status* status) { return cs::CreateSourcePropertyCallback( source, name, type, - [=](llvm::StringRef name, CS_Property property) { - // avoid the copy if possible - if (name[name.size()] == '\0') { - onChange(data, name.data(), property); - } else { - llvm::SmallString<128> copy{name}; - onChange(data, copy.c_str(), property); - } - }, - status); + [=](CS_Property property) { onChange(data, property); }, status); } -void CS_RemoveSourceProperty(CS_Source source, const char* name, +void CS_RemoveSourceProperty(CS_Source source, CS_Property property, CS_Status* status) { + return cs::RemoveSourceProperty(source, property, status); +} + +void CS_RemoveSourcePropertyByName(CS_Source source, const char* name, + CS_Status* status) { return cs::RemoveSourceProperty(source, name, status); } @@ -386,4 +400,8 @@ void CS_FreeEnumPropertyChoices(char** choices, int count) { std::free(choices); } +void CS_FreeEnumeratedProperties(CS_Property* properties, int count) { + std::free(properties); +} + } // extern "C" diff --git a/src/cameraserver_cpp.cpp b/src/cameraserver_cpp.cpp index e65bd11c52..6caf272c70 100644 --- a/src/cameraserver_cpp.cpp +++ b/src/cameraserver_cpp.cpp @@ -21,6 +21,15 @@ CS_PropertyType GetPropertyType(CS_Property property, CS_Status* status) { return CS_PROP_NONE; // TODO } +std::string GetPropertyName(CS_Property property, CS_Status* status) { + return ""; // TODO +} + +void GetPropertyName(CS_Property property, llvm::SmallVectorImpl& name, + CS_Status* status) { + // TODO +} + bool GetBooleanProperty(CS_Property property, CS_Status* status) { return false; // TODO } @@ -138,6 +147,12 @@ bool IsSourceConnected(CS_Source source, CS_Status* status) { return false; // TODO } +void EnumerateSourceProperties(CS_Source source, + llvm::SmallVectorImpl& properties, + CS_Status* status) { + // TODO +} + CS_Source CopySource(CS_Source source, CS_Status* status) { return source; // TODO } @@ -179,11 +194,15 @@ CS_Property CreateSourceProperty(CS_Source source, llvm::StringRef name, CS_Property CreateSourcePropertyCallback( CS_Source source, llvm::StringRef name, CS_PropertyType type, - std::function onChange, - CS_Status* status) { + std::function onChange, CS_Status* status) { return 0; // TODO } +void RemoveSourceProperty(CS_Source source, CS_Property property, + CS_Status* status) { + // TODO +} + void RemoveSourceProperty(CS_Source source, llvm::StringRef name, CS_Status* status) { // TODO diff --git a/src/cameraserver_oo.cpp b/src/cameraserver_oo.cpp index 13ade5c525..89a5997183 100644 --- a/src/cameraserver_oo.cpp +++ b/src/cameraserver_oo.cpp @@ -9,9 +9,20 @@ using namespace cs; +std::vector VideoSource::EnumerateProperties() const { + std::vector properties; + llvm::SmallVector handles; + CS_Status status = 0; + EnumerateSourceProperties(m_handle, handles, &status); + properties.reserve(handles.size()); + for (int handle : handles) + properties.emplace_back(VideoProperty{handle}); + return properties; +} + std::vector VideoSource::EnumerateSources() { std::vector sources; - llvm::SmallVector handles; + llvm::SmallVector handles; CS_Status status = 0; ::cs::EnumerateSources(handles, &status); sources.reserve(handles.size()); @@ -22,7 +33,7 @@ std::vector VideoSource::EnumerateSources() { std::vector VideoSink::EnumerateSinks() { std::vector sinks; - llvm::SmallVector handles; + llvm::SmallVector handles; CS_Status status = 0; ::cs::EnumerateSinks(handles, &status); sinks.reserve(handles.size());