new file mode 100644
@@ -0,0 +1,128 @@
+#pragma once
+
+// NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation
+// for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or
+// online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license
+// terms. THe full NDI SDK may be downloaded at https://www.newtek.com/ndi/sdk/
+//
+//***********************************************************************************************************************************************
+//
+// Copyright(c) 2014-2017 NewTek, inc
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions :
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//***********************************************************************************************************************************************
+
+//****************************************************************************************************************
+typedef struct NDIlib_v3
+{ // V1.5
+ bool(*NDIlib_initialize)(void);
+ void(*NDIlib_destroy)(void);
+ const char* (*NDIlib_version)(void);
+ bool(*NDIlib_is_supported_CPU)(void);
+ PROCESSINGNDILIB_DEPRECATED NDIlib_find_instance_t(*NDIlib_find_create)(const NDIlib_find_create_t* p_create_settings);
+ NDIlib_find_instance_t(*NDIlib_find_create_v2)(const NDIlib_find_create_t* p_create_settings);
+ void(*NDIlib_find_destroy)(NDIlib_find_instance_t p_instance);
+ const NDIlib_source_t* (*NDIlib_find_get_sources)(NDIlib_find_instance_t p_instance, uint32_t* p_no_sources, uint32_t timeout_in_ms);
+ NDIlib_send_instance_t(*NDIlib_send_create)(const NDIlib_send_create_t* p_create_settings);
+ void(*NDIlib_send_destroy)(NDIlib_send_instance_t p_instance);
+ PROCESSINGNDILIB_DEPRECATED void(*NDIlib_send_send_video)(NDIlib_send_instance_t p_instance, const NDIlib_video_frame_t* p_video_data);
+ PROCESSINGNDILIB_DEPRECATED void(*NDIlib_send_send_video_async)(NDIlib_send_instance_t p_instance, const NDIlib_video_frame_t* p_video_data);
+ PROCESSINGNDILIB_DEPRECATED void(*NDIlib_send_send_audio)(NDIlib_send_instance_t p_instance, const NDIlib_audio_frame_t* p_audio_data);
+ void(*NDIlib_send_send_metadata)(NDIlib_send_instance_t p_instance, const NDIlib_metadata_frame_t* p_metadata);
+ NDIlib_frame_type_e(*NDIlib_send_capture)(NDIlib_send_instance_t p_instance, NDIlib_metadata_frame_t* p_metadata, uint32_t timeout_in_ms);
+ void(*NDIlib_send_free_metadata)(NDIlib_send_instance_t p_instance, const NDIlib_metadata_frame_t* p_metadata);
+ bool(*NDIlib_send_get_tally)(NDIlib_send_instance_t p_instance, NDIlib_tally_t* p_tally, uint32_t timeout_in_ms);
+ int(*NDIlib_send_get_no_connections)(NDIlib_send_instance_t p_instance, uint32_t timeout_in_ms);
+ void(*NDIlib_send_clear_connection_metadata)(NDIlib_send_instance_t p_instance);
+ void(*NDIlib_send_add_connection_metadata)(NDIlib_send_instance_t p_instance, const NDIlib_metadata_frame_t* p_metadata);
+ void(*NDIlib_send_set_failover)(NDIlib_send_instance_t p_instance, const NDIlib_source_t* p_failover_source);
+ PROCESSINGNDILIB_DEPRECATED NDIlib_recv_instance_t(*NDIlib_recv_create_v2)(const NDIlib_recv_create_t* p_create_settings);
+ PROCESSINGNDILIB_DEPRECATED NDIlib_recv_instance_t(*NDIlib_recv_create)(const NDIlib_recv_create_t* p_create_settings);
+ void(*NDIlib_recv_destroy)(NDIlib_recv_instance_t p_instance);
+ PROCESSINGNDILIB_DEPRECATED NDIlib_frame_type_e(*NDIlib_recv_capture)(NDIlib_recv_instance_t p_instance, NDIlib_video_frame_t* p_video_data, NDIlib_audio_frame_t* p_audio_data, NDIlib_metadata_frame_t* p_metadata, uint32_t timeout_in_ms);
+ PROCESSINGNDILIB_DEPRECATED void(*NDIlib_recv_free_video)(NDIlib_recv_instance_t p_instance, const NDIlib_video_frame_t* p_video_data);
+ PROCESSINGNDILIB_DEPRECATED void(*NDIlib_recv_free_audio)(NDIlib_recv_instance_t p_instance, const NDIlib_audio_frame_t* p_audio_data);
+ void(*NDIlib_recv_free_metadata)(NDIlib_recv_instance_t p_instance, const NDIlib_metadata_frame_t* p_metadata);
+ bool(*NDIlib_recv_send_metadata)(NDIlib_recv_instance_t p_instance, const NDIlib_metadata_frame_t* p_metadata);
+ bool(*NDIlib_recv_set_tally)(NDIlib_recv_instance_t p_instance, const NDIlib_tally_t* p_tally);
+ void(*NDIlib_recv_get_performance)(NDIlib_recv_instance_t p_instance, NDIlib_recv_performance_t* p_total, NDIlib_recv_performance_t* p_dropped);
+ void(*NDIlib_recv_get_queue)(NDIlib_recv_instance_t p_instance, NDIlib_recv_queue_t* p_total);
+ void(*NDIlib_recv_clear_connection_metadata)(NDIlib_recv_instance_t p_instance);
+ void(*NDIlib_recv_add_connection_metadata)(NDIlib_recv_instance_t p_instance, const NDIlib_metadata_frame_t* p_metadata);
+ int(*NDIlib_recv_get_no_connections)(NDIlib_recv_instance_t p_instance);
+ NDIlib_routing_instance_t(*NDIlib_routing_create)(const NDIlib_routing_create_t* p_create_settings);
+ void(*NDIlib_routing_destroy)(NDIlib_routing_instance_t p_instance);
+ bool(*NDIlib_routing_change)(NDIlib_routing_instance_t p_instance, const NDIlib_source_t* p_source);
+ bool(*NDIlib_routing_clear)(NDIlib_routing_instance_t p_instance);
+ void(*NDIlib_util_send_send_audio_interleaved_16s)(NDIlib_send_instance_t p_instance, const NDIlib_audio_frame_interleaved_16s_t* p_audio_data);
+ PROCESSINGNDILIB_DEPRECATED void(*NDIlib_util_audio_to_interleaved_16s)(const NDIlib_audio_frame_t* p_src, NDIlib_audio_frame_interleaved_16s_t* p_dst);
+ PROCESSINGNDILIB_DEPRECATED void(*NDIlib_util_audio_from_interleaved_16s)(const NDIlib_audio_frame_interleaved_16s_t* p_src, NDIlib_audio_frame_t* p_dst);
+ // V2
+ bool(*NDIlib_find_wait_for_sources)(NDIlib_find_instance_t p_instance, uint32_t timeout_in_ms);
+ const NDIlib_source_t* (*NDIlib_find_get_current_sources)(NDIlib_find_instance_t p_instance, uint32_t* p_no_sources);
+ PROCESSINGNDILIB_DEPRECATED void(*NDIlib_util_audio_to_interleaved_32f)(const NDIlib_audio_frame_t* p_src, NDIlib_audio_frame_interleaved_32f_t* p_dst);
+ PROCESSINGNDILIB_DEPRECATED void(*NDIlib_util_audio_from_interleaved_32f)(const NDIlib_audio_frame_interleaved_32f_t* p_src, NDIlib_audio_frame_t* p_dst);
+ void(*NDIlib_util_send_send_audio_interleaved_32f)(NDIlib_send_instance_t p_instance, const NDIlib_audio_frame_interleaved_32f_t* p_audio_data);
+ // V3
+ void(*NDIlib_recv_free_video_v2)(NDIlib_recv_instance_t p_instance, const NDIlib_video_frame_v2_t* p_video_data);
+ void(*NDIlib_recv_free_audio_v2)(NDIlib_recv_instance_t p_instance, const NDIlib_audio_frame_v2_t* p_audio_data);
+ NDIlib_frame_type_e(*NDIlib_recv_capture_v2)(NDIlib_recv_instance_t p_instance, NDIlib_video_frame_v2_t* p_video_data, NDIlib_audio_frame_v2_t* p_audio_data, NDIlib_metadata_frame_t* p_metadata, uint32_t timeout_in_ms); // The amount of time in milliseconds to wait for data.
+ void(*NDIlib_send_send_video_v2)(NDIlib_send_instance_t p_instance, const NDIlib_video_frame_v2_t* p_video_data);
+ void(*NDIlib_send_send_video_async_v2)(NDIlib_send_instance_t p_instance, const NDIlib_video_frame_v2_t* p_video_data);
+ void(*NDIlib_send_send_audio_v2)(NDIlib_send_instance_t p_instance, const NDIlib_audio_frame_v2_t* p_audio_data);
+ void(*NDIlib_util_audio_to_interleaved_16s_v2)(const NDIlib_audio_frame_v2_t* p_src, NDIlib_audio_frame_interleaved_16s_t* p_dst);
+ void(*NDIlib_util_audio_from_interleaved_16s_v2)(const NDIlib_audio_frame_interleaved_16s_t* p_src, NDIlib_audio_frame_v2_t* p_dst);
+ void(*NDIlib_util_audio_to_interleaved_32f_v2)(const NDIlib_audio_frame_v2_t* p_src, NDIlib_audio_frame_interleaved_32f_t* p_dst);
+ void(*NDIlib_util_audio_from_interleaved_32f_v2)(const NDIlib_audio_frame_interleaved_32f_t* p_src, NDIlib_audio_frame_v2_t* p_dst);
+ // V3.01
+ void(*NDIlib_recv_free_string)(NDIlib_recv_instance_t p_instance, const char* p_string);
+ bool(*NDIlib_recv_ptz_is_supported)(NDIlib_recv_instance_t p_instance);
+ bool(*NDIlib_recv_recording_is_supported)(NDIlib_recv_instance_t p_instance);
+ const char*(*NDIlib_recv_get_web_control)(NDIlib_recv_instance_t p_instance);
+ bool(*NDIlib_recv_ptz_zoom)(NDIlib_recv_instance_t p_instance, const float zoom_value);
+ bool(*NDIlib_recv_ptz_zoom_speed)(NDIlib_recv_instance_t p_instance, const float zoom_speed);
+ bool(*NDIlib_recv_ptz_pan_tilt)(NDIlib_recv_instance_t p_instance, const float pan_value, const float tilt_value);
+ bool(*NDIlib_recv_ptz_pan_tilt_speed)(NDIlib_recv_instance_t p_instance, const float pan_speed, const float tilt_speed);
+ bool(*NDIlib_recv_ptz_store_preset)(NDIlib_recv_instance_t p_instance, const int preset_no);
+ bool(*NDIlib_recv_ptz_recall_preset)(NDIlib_recv_instance_t p_instance, const int preset_no, const float speed);
+ bool(*NDIlib_recv_ptz_auto_focus)(NDIlib_recv_instance_t p_instance);
+ bool(*NDIlib_recv_ptz_focus)(NDIlib_recv_instance_t p_instance, const float focus_value);
+ bool(*NDIlib_recv_ptz_focus_speed)(NDIlib_recv_instance_t p_instance, const float focus_speed);
+ bool(*NDIlib_recv_ptz_white_balance_auto)(NDIlib_recv_instance_t p_instance);
+ bool(*NDIlib_recv_ptz_white_balance_indoor)(NDIlib_recv_instance_t p_instance);
+ bool(*NDIlib_recv_ptz_white_balance_outdoor)(NDIlib_recv_instance_t p_instance);
+ bool(*NDIlib_recv_ptz_white_balance_oneshot)(NDIlib_recv_instance_t p_instance);
+ bool(*NDIlib_recv_ptz_white_balance_manual)(NDIlib_recv_instance_t p_instance, const float red, const float blue);
+ bool(*NDIlib_recv_ptz_exposure_auto)(NDIlib_recv_instance_t p_instance);
+ bool(*NDIlib_recv_ptz_exposure_manual)(NDIlib_recv_instance_t p_instance, const float exposure_level);
+ bool(*NDIlib_recv_recording_start)(NDIlib_recv_instance_t p_instance, const char* p_filename_hint);
+ bool(*NDIlib_recv_recording_stop)(NDIlib_recv_instance_t p_instance);
+ bool(*NDIlib_recv_recording_set_audio_level)(NDIlib_recv_instance_t p_instance, const float level_dB);
+ bool(*NDIlib_recv_recording_is_recording)(NDIlib_recv_instance_t p_instance);
+ const char*(*NDIlib_recv_recording_get_filename)(NDIlib_recv_instance_t p_instance);
+ const char*(*NDIlib_recv_recording_get_error)(NDIlib_recv_instance_t p_instance);
+ bool(*NDIlib_recv_recording_get_times)(NDIlib_recv_instance_t p_instance, NDIlib_recv_recording_time_t* p_times);
+ // V3.10
+ NDIlib_recv_instance_t(*NDIlib_recv_create_v3)(const NDIlib_recv_create_v3_t* p_create_settings);
+
+} NDIlib_v3;
+
+typedef struct NDIlib_v3 NDIlib_v2;
+
+// Load the library
+PROCESSINGNDILIB_API
+const NDIlib_v3* NDIlib_v3_load(void);
+
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+const NDIlib_v2* NDIlib_v2_load(void);
\ No newline at end of file
new file mode 100644
@@ -0,0 +1,74 @@
+#pragma once
+
+// NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation
+// for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or
+// online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license
+// terms. THe full NDI SDK may be downloaded at https://www.newtek.com/ndi/sdk/
+//
+//***********************************************************************************************************************************************
+//
+// Copyright(c) 2014-2017 NewTek, inc
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions :
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//***********************************************************************************************************************************************
+
+//**************************************************************************************************************************
+// Structures and type definitions required by NDI finding
+// The reference to an instance of the finder
+typedef void* NDIlib_find_instance_t;
+
+// The creation structure that is used when you are creating a finder
+typedef struct NDIlib_find_create_t
+{ // Do we want to incluide the list of NDI sources that are running
+ // on the local machine ?
+ // If TRUE then local sources will be visible, if FALSE then they
+ // will not.
+ bool show_local_sources;
+
+ // Which groups do you want to search in for sources
+ const char* p_groups;
+
+ // The list of additional IP addresses that exist that we should query for
+ // sources on. For instance, if you want to find the sources on a remote machine
+ // that is not on your local sub-net then you can put a comma seperated list of
+ // those IP addresses here and those sources will be available locally even though
+ // they are not mDNS discoverable. An example might be "12.0.0.8,13.0.12.8".
+ // When none is specified the registry is used.
+ // Default = NULL;
+ const char* p_extra_ips;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_find_create_t(bool show_local_sources_ = true, const char* p_groups_ = NULL, const char* p_extra_ips_ = NULL);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_find_create_t;
+
+//**************************************************************************************************************************
+// Create a new finder instance. This will return NULL if it fails.
+// This function is deprecated, please use NDIlib_find_create_v2 if you can. This function
+// ignores the p_extra_ips member and sets it to the default.
+PROCESSINGNDILIB_API
+NDIlib_find_instance_t NDIlib_find_create_v2(const NDIlib_find_create_t* p_create_settings);
+
+// This will destroy an existing finder instance.
+PROCESSINGNDILIB_API
+void NDIlib_find_destroy(NDIlib_find_instance_t p_instance);
+
+// This function will recover the current set of sources (i.e. the ones that exist right this second).
+PROCESSINGNDILIB_API
+const NDIlib_source_t* NDIlib_find_get_current_sources(NDIlib_find_instance_t p_instance, uint32_t* p_no_sources);
+
+// This will allow you to wait until the number of online sources have changed.
+PROCESSINGNDILIB_API
+bool NDIlib_find_wait_for_sources(NDIlib_find_instance_t p_instance, uint32_t timeout_in_ms);
new file mode 100644
@@ -0,0 +1,94 @@
+#pragma once
+
+// NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation
+// for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or
+// online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license
+// terms. THe full NDI SDK may be downloaded at https://www.newtek.com/ndi/sdk/
+//
+//***********************************************************************************************************************************************
+//
+// Copyright(c) 2014-2017 NewTek, inc
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions :
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//***********************************************************************************************************************************************
+
+
+// C++ implemenrations of default constructors are here to avoid them needing to be inline with
+// all of the rest of the code.
+
+// All the structs used and reasonable defaults are here
+inline NDIlib_source_t::NDIlib_source_t(const char* p_ndi_name_, const char* p_ip_address_)
+ : p_ndi_name(p_ndi_name_), p_ip_address(p_ip_address_) {}
+
+inline NDIlib_video_frame_v2_t::NDIlib_video_frame_v2_t(int xres_, int yres_, NDIlib_FourCC_type_e FourCC_, int frame_rate_N_, int frame_rate_D_,
+ float picture_aspect_ratio_, NDIlib_frame_format_type_e frame_format_type_,
+ int64_t timecode_, uint8_t* p_data_, int line_stride_in_bytes_, const char* p_metadata_, int64_t timestamp_)
+ : xres(xres_), yres(yres_), FourCC(FourCC_), frame_rate_N(frame_rate_N_), frame_rate_D(frame_rate_D_),
+ picture_aspect_ratio(picture_aspect_ratio_), frame_format_type(frame_format_type_),
+ timecode(timecode_), p_data(p_data_), line_stride_in_bytes(line_stride_in_bytes_), p_metadata(p_metadata_), timestamp(timestamp_) {}
+
+inline NDIlib_audio_frame_v2_t::NDIlib_audio_frame_v2_t(int sample_rate_, int no_channels_, int no_samples_, int64_t timecode_, float* p_data_,
+ int channel_stride_in_bytes_, const char* p_metadata_, int64_t timestamp_)
+ : sample_rate(sample_rate_), no_channels(no_channels_), no_samples(no_samples_), timecode(timecode_),
+ p_data(p_data_), channel_stride_in_bytes(channel_stride_in_bytes_), p_metadata(p_metadata_), timestamp(timestamp_) {}
+
+inline NDIlib_video_frame_t::NDIlib_video_frame_t(int xres_, int yres_, NDIlib_FourCC_type_e FourCC_, int frame_rate_N_, int frame_rate_D_,
+ float picture_aspect_ratio_, NDIlib_frame_format_type_e frame_format_type_,
+ int64_t timecode_, uint8_t* p_data_, int line_stride_in_bytes_)
+ : xres(xres_), yres(yres_), FourCC(FourCC_), frame_rate_N(frame_rate_N_), frame_rate_D(frame_rate_D_),
+ picture_aspect_ratio(picture_aspect_ratio_), frame_format_type(frame_format_type_),
+ timecode(timecode_), p_data(p_data_), line_stride_in_bytes(line_stride_in_bytes_) {}
+
+inline NDIlib_audio_frame_t::NDIlib_audio_frame_t(int sample_rate_, int no_channels_, int no_samples_, int64_t timecode_, float* p_data_,
+ int channel_stride_in_bytes_)
+ : sample_rate(sample_rate_), no_channels(no_channels_), no_samples(no_samples_), timecode(timecode_),
+ p_data(p_data_), channel_stride_in_bytes(channel_stride_in_bytes_) {}
+
+inline NDIlib_metadata_frame_t::NDIlib_metadata_frame_t(int length_, int64_t timecode_, char* p_data_)
+ : length(length_), timecode(timecode_), p_data(p_data_) {}
+
+inline NDIlib_tally_t::NDIlib_tally_t(bool on_program_, bool on_preview_)
+ : on_program(on_program_), on_preview(on_preview_) {}
+
+inline NDIlib_routing_create_t::NDIlib_routing_create_t(const char* p_ndi_name_, const char* p_groups_)
+ : p_ndi_name(p_ndi_name_), p_groups(p_groups_) {}
+
+inline NDIlib_recv_create_v3_t::NDIlib_recv_create_v3_t(const NDIlib_source_t source_to_connect_to_, NDIlib_recv_color_format_e color_format_,
+ NDIlib_recv_bandwidth_e bandwidth_, bool allow_video_fields_, const char* p_ndi_name_)
+ : source_to_connect_to(source_to_connect_to_), color_format(color_format_), bandwidth(bandwidth_), allow_video_fields(allow_video_fields_), p_ndi_name(p_ndi_name_) {}
+inline NDIlib_recv_create_t::NDIlib_recv_create_t(const NDIlib_source_t source_to_connect_to_, NDIlib_recv_color_format_e color_format_,
+ NDIlib_recv_bandwidth_e bandwidth_, bool allow_video_fields_)
+ : source_to_connect_to(source_to_connect_to_), color_format(color_format_), bandwidth(bandwidth_), allow_video_fields(allow_video_fields_) {}
+
+inline NDIlib_recv_performance_t::NDIlib_recv_performance_t(void)
+ : video_frames(0), audio_frames(0), metadata_frames(0) {}
+
+inline NDIlib_recv_queue_t::NDIlib_recv_queue_t(void)
+ : video_frames(0), audio_frames(0), metadata_frames(0) {}
+
+inline NDIlib_recv_recording_time_t::NDIlib_recv_recording_time_t(void)
+ : no_frames(0), start_time(0), last_time(0) {}
+
+inline NDIlib_send_create_t::NDIlib_send_create_t(const char* p_ndi_name_, const char* p_groups_, bool clock_video_, bool clock_audio_)
+ : p_ndi_name(p_ndi_name_), p_groups(p_groups_), clock_video(clock_video_), clock_audio(clock_audio_) {}
+
+inline NDIlib_find_create_t::NDIlib_find_create_t(bool show_local_sources_, const char* p_groups_, const char* p_extra_ips_)
+ : show_local_sources(show_local_sources_), p_groups(p_groups_), p_extra_ips(p_extra_ips_) {}
+
+inline NDIlib_audio_frame_interleaved_16s_t::NDIlib_audio_frame_interleaved_16s_t(int sample_rate_, int no_channels_, int no_samples_, int64_t timecode_, int reference_level_, short* p_data_)
+ : sample_rate(sample_rate_), no_channels(no_channels_), no_samples(no_samples_), timecode(timecode_),
+ reference_level(reference_level_), p_data(p_data_) {}
+
+inline NDIlib_audio_frame_interleaved_32f_t::NDIlib_audio_frame_interleaved_32f_t(int sample_rate_, int no_channels_, int no_samples_, int64_t timecode_, float* p_data_)
+ : sample_rate(sample_rate_), no_channels(no_channels_), no_samples(no_samples_), timecode(timecode_), p_data(p_data_) {}
\ No newline at end of file
new file mode 100644
@@ -0,0 +1,129 @@
+#pragma once
+
+// NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation
+// for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or
+// online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license
+// terms. THe full NDI SDK may be downloaded at https://www.newtek.com/ndi/sdk/
+//
+//***********************************************************************************************************************************************
+//
+// Copyright(c) 2014-2017 NewTek, inc
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions :
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//***********************************************************************************************************************************************
+
+// Is this library being compiled, or imported by another application.
+#ifdef _WIN32
+#define PROCESSINGNDILIB_DEPRECATED __declspec(deprecated)
+#ifdef PROCESSINGNDILIB_EXPORTS
+#ifdef __cplusplus
+#define PROCESSINGNDILIB_API extern "C" __declspec(dllexport)
+#else
+#define PROCESSINGNDILIB_API __declspec(dllexport)
+#endif
+#else
+#ifdef __cplusplus
+#define PROCESSINGNDILIB_API extern "C" __declspec(dllimport)
+#else
+#define PROCESSINGNDILIB_API __declspec(dllimport)
+#endif
+#ifdef _MSC_VER
+#ifdef _WIN64
+#define NDILIB_LIBRARY_NAME "Processing.NDI.Lib.x64.dll"
+#define NDILIB_REDIST_FOLDER "NDI_RUNTIME_DIR_V3"
+#define NDILIB_REDIST_URL "http://new.tk/NDIRedistV3"
+#else
+#define NDILIB_LIBRARY_NAME "Processing.NDI.Lib.x86.dll"
+#define NDILIB_REDIST_FOLDER "NDI_RUNTIME_DIR_V3"
+#define NDILIB_REDIST_URL "http://new.tk/NDIRedistV3"
+#endif
+#endif
+#endif
+#else
+#ifdef __APPLE__
+#define NDILIB_LIBRARY_NAME "libndi.3.dylib"
+#define NDILIB_REDIST_FOLDER "NDI_RUNTIME_DIR_V3"
+#define NDILIB_REDIST_URL "http://new.tk/NDIRedistV3Apple"
+#else // __APPLE__
+#define NDILIB_LIBRARY_NAME "libndi.so.3"
+#define NDILIB_REDIST_FOLDER "NDI_RUNTIME_DIR_V3"
+#define NDILIB_REDIST_URL ""
+#endif // __APPLE__
+#define PROCESSINGNDILIB_DEPRECATED
+#ifdef __cplusplus
+#define PROCESSINGNDILIB_API extern "C" __attribute((visibility("default")))
+#else
+#define PROCESSINGNDILIB_API __attribute((visibility("default")))
+#endif
+#endif
+
+#ifndef NDILIB_CPP_DEFAULT_CONSTRUCTORS
+#ifdef __cplusplus
+#define NDILIB_CPP_DEFAULT_CONSTRUCTORS 1
+#else // __cplusplus
+#define NDILIB_CPP_DEFAULT_CONSTRUCTORS 0
+#endif // __cplusplus
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+// Data structures shared by multiple SDKs
+#include "Processing.NDI.compat.h"
+#include "Processing.NDI.structs.h"
+
+// This is not actually required, but will start and end the libraries which might get
+// you slightly better performance in some cases. In general it is more "correct" to
+// call these although it is not required. There is no way to call these that would have
+// an adverse impact on anything (even calling destroy before you've deleted all your
+// objects). This will return false if the CPU is not sufficiently capable to run NDILib
+// currently NDILib requires SSE4.2 instructions (see documentation). You can verify
+// a specific CPU against the library with a call to NDIlib_is_supported_CPU()
+PROCESSINGNDILIB_API
+bool NDIlib_initialize(void);
+
+PROCESSINGNDILIB_API
+void NDIlib_destroy(void);
+
+PROCESSINGNDILIB_API
+const char* NDIlib_version(void);
+
+// Recover whether the current CPU in the system is capable of running NDILib.
+PROCESSINGNDILIB_API
+bool NDIlib_is_supported_CPU(void);
+
+// The finding (discovery API)
+#include "Processing.NDI.Find.h"
+
+// The receiveing video and audio API
+#include "Processing.NDI.Recv.h"
+// Extensions to support PTZ control, etc...
+#include "Processing.NDI.Recv.ex.h"
+
+// The sending video API
+#include "Processing.NDI.Send.h"
+
+// The routing of inputs API
+#include "Processing.NDI.Routing.h"
+
+// Utility functions
+#include "Processing.NDI.utilities.h"
+
+// Deprecated structures and functions
+#include "Processing.NDI.deprecated.h"
+
+// Dynamic loading used for OSS libraries
+#include "Processing.NDI.DynamicLoad.h"
+
+// The C++ implemenrations
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+#include "Processing.NDI.Lib.cplusplus.h"
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
\ No newline at end of file
new file mode 100644
@@ -0,0 +1,148 @@
+#pragma once
+
+//**************************************************************************************************************************************************************
+// Has this receiver got PTZ control. Note that it might take a second or two after the connection for this value to be set.
+// To avoid the need to poll this function, you can know when the value of this function might have changed when the
+// NDILib_recv_capture* call would return NDIlib_frame_type_status_change
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_is_supported(NDIlib_recv_instance_t p_instance);
+
+// Has this receiver got recording control. Note that it might take a second or two after the connection for this value to be set.
+// To avoid the need to poll this function, you can know when the value of this function might have changed when the
+// NDILib_recv_capture* call would return NDIlib_frame_type_status_change
+PROCESSINGNDILIB_API
+bool NDIlib_recv_recording_is_supported(NDIlib_recv_instance_t p_instance);
+
+//**************************************************************************************************************************************************************
+// PTZ Controls
+// Zoom to an absolute value.
+// zoom_value = 0.0 (zoomed in) ... 1.0 (zoomed out)
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_zoom(NDIlib_recv_instance_t p_instance, const float zoom_value);
+
+// Zoom at a particular speed
+// zoom_speed = -1.0 (zoom outwards) ... +1.0 (zoom inwards)
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_zoom_speed(NDIlib_recv_instance_t p_instance, const float zoom_speed);
+
+// Set the pan and tilt to an absolute value
+// pan_value = -1.0 (left) ... 0.0 (centred) ... +1.0 (right)
+// tilt_value = -1.0 (bottom) ... 0.0 (centred) ... +1.0 (top)
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_pan_tilt(NDIlib_recv_instance_t p_instance, const float pan_value, const float tilt_value);
+
+// Set the pan and tilt direction and speed
+// pan_speed = -1.0 (moving left) ... 0.0 (stopped) ... +1.0 (moving right)
+// tilt_speed = -1.0 (down) ... 0.0 (stopped) ... +1.0 (moving up)
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_pan_tilt_speed(NDIlib_recv_instance_t p_instance, const float pan_speed, const float tilt_speed);
+
+// Store the current position, focus, etc... as a preset.
+// preset_no = 0 ... 99
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_store_preset(NDIlib_recv_instance_t p_instance, const int preset_no);
+
+// Recall a preset, including position, focus, etc...
+// preset_no = 0 ... 99
+// speed = 0.0(as slow as possible) ... 1.0(as fast as possible) The speed at which to move to the new preset
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_recall_preset(NDIlib_recv_instance_t p_instance, const int preset_no, const float speed);
+
+// Put the camera in auto-focus
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_auto_focus(NDIlib_recv_instance_t p_instance);
+
+// Focus to an absolute value.
+// focus_value = 0.0 (focussed to infinity) ... 1.0 (focussed as close as possible)
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_focus(NDIlib_recv_instance_t p_instance, const float focus_value);
+
+// Focus at a particular speed
+// focus_speed = -1.0 (focus outwards) ... +1.0 (focus inwards)
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_focus_speed(NDIlib_recv_instance_t p_instance, const float focus_speed);
+
+// Put the camera in auto white balance moce
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_white_balance_auto(NDIlib_recv_instance_t p_instance);
+
+// Put the camera in indoor white balance
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_white_balance_indoor(NDIlib_recv_instance_t p_instance);
+
+// Put the camera in indoor white balance
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_white_balance_outdoor(NDIlib_recv_instance_t p_instance);
+
+// Use the current brightness to automatically set the current white balance
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_white_balance_oneshot(NDIlib_recv_instance_t p_instance);
+
+// Set the manual camera white balance using the R, B values
+// red = 0.0(not red) ... 1.0(very red)
+// blue = 0.0(not blue) ... 1.0(very blue)
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_white_balance_manual(NDIlib_recv_instance_t p_instance, const float red, const float blue);
+
+// Put the camera in auto-exposure mode
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_exposure_auto(NDIlib_recv_instance_t p_instance);
+
+// Manually set the camera exposure
+// exposure_level = 0.0(dark) ... 1.0(light)
+PROCESSINGNDILIB_API
+bool NDIlib_recv_ptz_exposure_manual(NDIlib_recv_instance_t p_instance, const float exposure_level);
+
+//**************************************************************************************************************************************************************
+// Recording control
+// This will start recording.If the recorder was already recording then the message is ignored.A filename is passed in as a ‘hint’.Since the recorder might
+// already be recording(or might not allow complete flexibility over its filename), the filename might or might not be used.If the filename is empty, or
+// not present, a name will be chosen automatically. If you do not with to provide a filename hint you can simply pass NULL.
+PROCESSINGNDILIB_API
+bool NDIlib_recv_recording_start(NDIlib_recv_instance_t p_instance, const char* p_filename_hint);
+
+// Stop recording.
+PROCESSINGNDILIB_API
+bool NDIlib_recv_recording_stop(NDIlib_recv_instance_t p_instance);
+
+// This will control the audio level for the recording.dB is specified in decibels relative to the reference level of the source. Not all recording sources support
+// controlling audio levels.For instance, a digital audio device would not be able to avoid clipping on sources already at the wrong level, thus
+// might not support this message.
+PROCESSINGNDILIB_API
+bool NDIlib_recv_recording_set_audio_level(NDIlib_recv_instance_t p_instance, const float level_dB);
+
+// This will determine if the source is currently recording. It will return true while recording is in progress and false when it is not. Because there is
+// one recorded and multiple people might be connected to it, there is a chance that it is recording which was initiated by someone else.
+PROCESSINGNDILIB_API
+bool NDIlib_recv_recording_is_recording(NDIlib_recv_instance_t p_instance);
+
+// Get the current filename for recording. When this is set it will return a non-NULL value which is owned by you and freed using NDIlib_recv_free_string.
+// If a file was already being recorded by another client, the massage will contain the name of that file. The filename contains a UNC path (when one is available)
+// to the recorded file, and can be used to access the file on your local machine for playback. If a UNC path is not available, then this will represent the local
+// filename. This will remain valid even after the file has stopped being recorded until the next file is started.
+PROCESSINGNDILIB_API
+const char* NDIlib_recv_recording_get_filename(NDIlib_recv_instance_t p_instance);
+
+// This will tell you whether there was a recording error and what that string is. When this is set it will return a non-NULL value which is owned by you and
+// freed using NDIlib_recv_free_string. When there is no error it will return NULL.
+PROCESSINGNDILIB_API
+const char* NDIlib_recv_recording_get_error(NDIlib_recv_instance_t p_instance);
+
+// In order to get the duration
+typedef struct NDIlib_recv_recording_time_t
+{ // The number of actual video frames recorded.
+ int64_t no_frames;
+
+ // The starting time and current largest time of the record, in UTC time, at 100ns unit intervals. This allows you to know the record
+ // time irrespective of frame-rate. For instance, last_time - start_time woudl give you the recording length in 100ns intervals.
+ int64_t start_time, last_time;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_recv_recording_time_t(void);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_recv_recording_time_t;
+
+// Get the current recording times. These remain
+PROCESSINGNDILIB_API
+bool NDIlib_recv_recording_get_times(NDIlib_recv_instance_t p_instance, NDIlib_recv_recording_time_t* p_times);
\ No newline at end of file
new file mode 100644
@@ -0,0 +1,214 @@
+#pragma once
+
+// NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation
+// for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or
+// online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license
+// terms. THe full NDI SDK may be downloaded at https://www.newtek.com/ndi/sdk/
+//
+//***********************************************************************************************************************************************
+//
+// Copyright(c) 2014-2017 NewTek, inc
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions :
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//***********************************************************************************************************************************************
+
+//**************************************************************************************************************************
+// Structures and type definitions required by NDI finding
+// The reference to an instance of the receiver
+typedef void* NDIlib_recv_instance_t;
+
+typedef enum NDIlib_recv_bandwidth_e
+{
+ NDIlib_recv_bandwidth_metadata_only = -10, // Receive metadata.
+ NDIlib_recv_bandwidth_audio_only = 10, // Receive metadata, audio.
+ NDIlib_recv_bandwidth_lowest = 0, // Receive metadata, audio, video at a lower bandwidth and resolution.
+ NDIlib_recv_bandwidth_highest = 100 // Receive metadata, audio, video at full resolution.
+
+} NDIlib_recv_bandwidth_e;
+
+typedef enum NDIlib_recv_color_format_e
+{
+ NDIlib_recv_color_format_BGRX_BGRA = 0, // No alpha channel: BGRX, Alpha channel: BGRA
+ NDIlib_recv_color_format_UYVY_BGRA = 1, // No alpha channel: UYVY, Alpha channel: BGRA
+ NDIlib_recv_color_format_RGBX_RGBA = 2, // No alpha channel: RGBX, Alpha channel: RGBA
+ NDIlib_recv_color_format_UYVY_RGBA = 3, // No alpha channel: UYVY, Alpha channel: RGBA
+
+#ifdef _WIN32
+ // On Windows there are some APIs that require bottom to top images in RGBA format. Specifying
+ // this format will return images in this format. The image data pointer will still point to the
+ // "top" of the image, althought he stride will be negative. You can get the "bottom" line of the image
+ // using : video_data.p_data + (video_data.yres - 1)*video_data.line_stride_in_bytes
+ NDIlib_recv_color_format_BGRX_BGRA_flipped = 200,
+#endif
+
+ // Read the SDK documentation to understand the pros and cons of this format.
+ NDIlib_recv_color_format_fastest = 100,
+
+ // Legacy definitions for backwards compatability
+ NDIlib_recv_color_format_e_BGRX_BGRA = NDIlib_recv_color_format_BGRX_BGRA,
+ NDIlib_recv_color_format_e_UYVY_BGRA = NDIlib_recv_color_format_UYVY_BGRA,
+ NDIlib_recv_color_format_e_RGBX_RGBA = NDIlib_recv_color_format_RGBX_RGBA,
+ NDIlib_recv_color_format_e_UYVY_RGBA = NDIlib_recv_color_format_UYVY_RGBA
+
+} NDIlib_recv_color_format_e;
+
+// The creation structure that is used when you are creating a receiver
+typedef struct NDIlib_recv_create_v3_t
+{ // The source that you wish to connect to.
+ NDIlib_source_t source_to_connect_to;
+
+ // Your preference of color space. See above.
+ NDIlib_recv_color_format_e color_format;
+
+ // The bandwidth setting that you wish to use for this video source. Bandwidth
+ // controlled by changing both the compression level and the resolution of the source.
+ // A good use for low bandwidth is working on WIFI connections.
+ NDIlib_recv_bandwidth_e bandwidth;
+
+ // When this flag is FALSE, all video that you receive will be progressive. For sources
+ // that provide fields, this is de-interlaced on the receiving side (because we cannot change
+ // what the up-stream source was actually rendering. This is provided as a convenience to
+ // down-stream sources that do not wish to understand fielded video. There is almost no
+ // performance impact of using this function.
+ bool allow_video_fields;
+
+ // The name of the NDI receiver to create. This is a NULL terminated UTF8 string and should be
+ // the name of receive channel that you have. This is in many ways symettric with the name of
+ // senders, so this might be "Channel 1" on your system.
+ const char* p_ndi_name;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_recv_create_v3_t(const NDIlib_source_t source_to_connect_to_ = NDIlib_source_t(), NDIlib_recv_color_format_e color_format_ = NDIlib_recv_color_format_UYVY_BGRA,
+ NDIlib_recv_bandwidth_e bandwidth_ = NDIlib_recv_bandwidth_highest, bool allow_video_fields_ = true, const char* p_ndi_name_ = NULL);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_recv_create_v3_t;
+
+
+// This allows you determine the current performance levels of the receiving to be able to detect whether frames have been dropped
+typedef struct NDIlib_recv_performance_t
+{ // The number of video frames
+ int64_t video_frames;
+
+ // The number of audio frames
+ int64_t audio_frames;
+
+ // The number of metadata frames
+ int64_t metadata_frames;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_recv_performance_t(void);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_recv_performance_t;
+
+// Get the current queue depths
+typedef struct NDIlib_recv_queue_t
+{ // The number of video frames
+ int video_frames;
+
+ // The number of audio frames
+ int audio_frames;
+
+ // The number of metadata frames
+ int metadata_frames;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_recv_queue_t(void);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_recv_queue_t;
+
+//**************************************************************************************************************************
+// Create a new receiver instance. This will return NULL if it fails.
+PROCESSINGNDILIB_API
+NDIlib_recv_instance_t NDIlib_recv_create_v3(const NDIlib_recv_create_v3_t* p_create_settings);
+
+// This will destroy an existing receiver instance.
+PROCESSINGNDILIB_API
+void NDIlib_recv_destroy(NDIlib_recv_instance_t p_instance);
+
+// This will allow you to receive video, audio and metadata frames.
+// Any of the buffers can be NULL, in which case data of that type
+// will not be captured in this call. This call can be called simultaneously
+// on separate threads, so it is entirely possible to receive audio, video, metadata
+// all on separate threads. This function will return NDIlib_frame_type_none if no
+// data is received within the specified timeout and NDIlib_frame_type_error if the connection is lost.
+// Buffers captured with this must be freed with the appropriate free function below.
+PROCESSINGNDILIB_API
+NDIlib_frame_type_e NDIlib_recv_capture_v2(
+ NDIlib_recv_instance_t p_instance, // The library instance
+ NDIlib_video_frame_v2_t* p_video_data, // The video data received (can be NULL)
+ NDIlib_audio_frame_v2_t* p_audio_data, // The audio data received (can be NULL)
+ NDIlib_metadata_frame_t* p_metadata, // The metadata received (can be NULL)
+ uint32_t timeout_in_ms); // The amount of time in milliseconds to wait for data.
+
+// Free the buffers returned by capture for video
+PROCESSINGNDILIB_API
+void NDIlib_recv_free_video_v2(NDIlib_recv_instance_t p_instance, const NDIlib_video_frame_v2_t* p_video_data);
+
+// Free the buffers returned by capture for audio
+PROCESSINGNDILIB_API
+void NDIlib_recv_free_audio_v2(NDIlib_recv_instance_t p_instance, const NDIlib_audio_frame_v2_t* p_audio_data);
+
+// Free the buffers returned by capture for metadata
+PROCESSINGNDILIB_API
+void NDIlib_recv_free_metadata(NDIlib_recv_instance_t p_instance, const NDIlib_metadata_frame_t* p_metadata);
+
+// This will free a string that was allocated and returned by NDIlib_recv (for instance the NDIlib_recv_get_web_control) function.
+PROCESSINGNDILIB_API
+void NDIlib_recv_free_string(NDIlib_recv_instance_t p_instance, const char* p_string);
+
+// This function will send a meta message to the source that we are connected too. This returns FALSE if we are
+// not currently connected to anything.
+PROCESSINGNDILIB_API
+bool NDIlib_recv_send_metadata(NDIlib_recv_instance_t p_instance, const NDIlib_metadata_frame_t* p_metadata);
+
+// Set the up-stream tally notifications. This returns FALSE if we are not currently connected to anything. That
+// said, the moment that we do connect to something it will automatically be sent the tally state.
+PROCESSINGNDILIB_API
+bool NDIlib_recv_set_tally(NDIlib_recv_instance_t p_instance, const NDIlib_tally_t* p_tally);
+
+// Get the current performance structures. This can be used to determine if you have been calling NDIlib_recv_capture fast
+// enough, or if your processing of data is not keeping up with real-time. The total structure will give you the total frame
+// counts received, the dropped structure will tell you how many frames have been dropped. Either of these could be NULL.
+PROCESSINGNDILIB_API
+void NDIlib_recv_get_performance(NDIlib_recv_instance_t p_instance, NDIlib_recv_performance_t* p_total, NDIlib_recv_performance_t* p_dropped);
+
+// This will allow you to determine the current queue depth for all of the frame sources at any time.
+PROCESSINGNDILIB_API
+void NDIlib_recv_get_queue(NDIlib_recv_instance_t p_instance, NDIlib_recv_queue_t* p_total);
+
+// Connection based metadata is data that is sent automatically each time a new connection is received. You queue all of these
+// up and they are sent on each connection. To reset them you need to clear them all and set them up again.
+PROCESSINGNDILIB_API
+void NDIlib_recv_clear_connection_metadata(NDIlib_recv_instance_t p_instance);
+
+// Add a connection metadata string to the list of what is sent on each new connection. If someone is already connected then
+// this string will be sent to them immediately.
+PROCESSINGNDILIB_API
+void NDIlib_recv_add_connection_metadata(NDIlib_recv_instance_t p_instance, const NDIlib_metadata_frame_t* p_metadata);
+
+// Is this receiver currently connected to a source on the other end, or has the source not yet been found or is no longe ronline.
+// This will normally return 0 or 1
+PROCESSINGNDILIB_API
+int NDIlib_recv_get_no_connections(NDIlib_recv_instance_t p_instance);
+
+// Get the URL that might be used for configuration of this input. Note that it might take a second or two after the connection for
+// this value to be set. This function will return NULL if there is no web control user interface. You should call NDIlib_recv_free_string
+// to free the string that is returned by this function. The returned value will be a fully formed URL, for instamce "http://10.28.1.192/configuration/"
+// To avoid the need to poll this function, you can know when the value of this function might have changed when the
+// NDILib_recv_capture* call would return NDIlib_frame_type_status_change
+PROCESSINGNDILIB_API
+const char* NDIlib_recv_get_web_control(NDIlib_recv_instance_t p_instance);
\ No newline at end of file
new file mode 100644
@@ -0,0 +1,59 @@
+#pragma once
+
+// NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation
+// for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or
+// online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license
+// terms. THe full NDI SDK may be downloaded at https://www.newtek.com/ndi/sdk/
+//
+//***********************************************************************************************************************************************
+//
+// Copyright(c) 2014-2017 NewTek, inc
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions :
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//***********************************************************************************************************************************************
+
+//**************************************************************************************************************************
+// Structures and type definitions required by NDI sending
+// The reference to an instance of the sender
+typedef void* NDIlib_routing_instance_t;
+
+// The creation structure that is used when you are creating a sender
+typedef struct NDIlib_routing_create_t
+{ // The name of the NDI source to create. This is a NULL terminated UTF8 string.
+ const char* p_ndi_name;
+
+ // What groups should this source be part of
+ const char* p_groups;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_routing_create_t(const char* p_ndi_name_ = NULL, const char* p_groups_ = NULL);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_routing_create_t;
+
+// Create an NDI routing source
+PROCESSINGNDILIB_API
+NDIlib_routing_instance_t NDIlib_routing_create(const NDIlib_routing_create_t* p_create_settings);
+
+// Destroy and NDI routing source
+PROCESSINGNDILIB_API
+void NDIlib_routing_destroy(NDIlib_routing_instance_t p_instance);
+
+// Change the routing of this source to another destination
+PROCESSINGNDILIB_API
+bool NDIlib_routing_change(NDIlib_routing_instance_t p_instance, const NDIlib_source_t* p_source);
+
+// Change the routing of this source to another destination
+PROCESSINGNDILIB_API
+bool NDIlib_routing_clear(NDIlib_routing_instance_t p_instance);
\ No newline at end of file
new file mode 100644
@@ -0,0 +1,126 @@
+#pragma once
+
+// NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation
+// for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or
+// online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license
+// terms. THe full NDI SDK may be downloaded at https://www.newtek.com/ndi/sdk/
+//
+//***********************************************************************************************************************************************
+//
+// Copyright(c) 2014-2017 NewTek, inc
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions :
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//***********************************************************************************************************************************************
+
+//**************************************************************************************************************************
+// Structures and type definitions required by NDI sending
+// The reference to an instance of the sender
+typedef void* NDIlib_send_instance_t;
+
+// The creation structure that is used when you are creating a sender
+typedef struct NDIlib_send_create_t
+{ // The name of the NDI source to create. This is a NULL terminated UTF8 string.
+ const char* p_ndi_name;
+
+ // What groups should this source be part of. NULL means default.
+ const char* p_groups;
+
+ // Do you want audio and video to "clock" themselves. When they are clocked then
+ // by adding video frames, they will be rate limited to match the current frame-rate
+ // that you are submitting at. The same is true for audio. In general if you are submitting
+ // video and audio off a single thread then you should only clock one of them (video is
+ // probably the better of the two to clock off). If you are submtiting audio and video
+ // of separate threads then having both clocked can be useful.
+ bool clock_video, clock_audio;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_send_create_t(const char* p_ndi_name_ = NULL, const char* p_groups_ = NULL, bool clock_video_ = true, bool clock_audio_ = false);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_send_create_t;
+
+// Create a new sender instance. This will return NULL if it fails.
+PROCESSINGNDILIB_API
+NDIlib_send_instance_t NDIlib_send_create(const NDIlib_send_create_t* p_create_settings);
+
+// This will destroy an existing finder instance.
+PROCESSINGNDILIB_API
+void NDIlib_send_destroy(NDIlib_send_instance_t p_instance);
+
+// This will add a video frame
+PROCESSINGNDILIB_API
+void NDIlib_send_send_video_v2(NDIlib_send_instance_t p_instance, const NDIlib_video_frame_v2_t* p_video_data);
+
+// This will add a video frame and will return immediately, having scheduled the frame to be displayed.
+// All processing and sending of the video will occur asynchronously. The memory accessed by NDIlib_video_frame_t
+// cannot be freed or re-used by the caller until a synchronizing event has occured. In general the API is better
+// able to take advantage of asynchronous processing than you might be able to by simple having a separate thread
+// to submit frames.
+//
+// This call is particularly beneficial when processing BGRA video since it allows any color conversion, compression
+// and network sending to all be done on separate threads from your main rendering thread.
+//
+// Synchronozing events are :
+// - a call to NDIlib_send_send_video
+// - a call to NDIlib_send_send_video_async with another frame to be sent
+// - a call to NDIlib_send_send_video with p_video_data=NULL
+// - a call to NDIlib_send_destroy
+PROCESSINGNDILIB_API
+void NDIlib_send_send_video_async_v2(NDIlib_send_instance_t p_instance, const NDIlib_video_frame_v2_t* p_video_data);
+
+// This will add an audio frame
+PROCESSINGNDILIB_API
+void NDIlib_send_send_audio_v2(NDIlib_send_instance_t p_instance, const NDIlib_audio_frame_v2_t* p_audio_data);
+
+// This will add a metadata frame
+PROCESSINGNDILIB_API
+void NDIlib_send_send_metadata(NDIlib_send_instance_t p_instance, const NDIlib_metadata_frame_t* p_metadata);
+
+// This allows you to receive metadata from the other end of the connection
+PROCESSINGNDILIB_API
+NDIlib_frame_type_e NDIlib_send_capture(
+ NDIlib_send_instance_t p_instance, // The instance data
+ NDIlib_metadata_frame_t* p_metadata, // The metadata received (can be NULL)
+ uint32_t timeout_in_ms); // The amount of time in milliseconds to wait for data.
+
+// Free the buffers returned by capture for metadata
+PROCESSINGNDILIB_API
+void NDIlib_send_free_metadata(NDIlib_send_instance_t p_instance, const NDIlib_metadata_frame_t* p_metadata);
+
+// Determine the current tally sate. If you specify a timeout then it will wait until it has changed, otherwise it will simply poll it
+// and return the current tally immediately. The return value is whether anything has actually change (true) or whether it timed out (false)
+PROCESSINGNDILIB_API
+bool NDIlib_send_get_tally(NDIlib_send_instance_t p_instance, NDIlib_tally_t* p_tally, uint32_t timeout_in_ms);
+
+// Get the current number of receivers connected to this source. This can be used to avoid even rendering when nothing is connected to the video source.
+// which can significantly improve the efficiency if you want to make a lot of sources available on the network. If you specify a timeout that is not
+// 0 then it will wait until there are connections for this amount of time.
+PROCESSINGNDILIB_API
+int NDIlib_send_get_no_connections(NDIlib_send_instance_t p_instance, uint32_t timeout_in_ms);
+
+// Connection based metadata is data that is sent automatically each time a new connection is received. You queue all of these
+// up and they are sent on each connection. To reset them you need to clear them all and set them up again.
+PROCESSINGNDILIB_API
+void NDIlib_send_clear_connection_metadata(NDIlib_send_instance_t p_instance);
+
+// Add a connection metadata string to the list of what is sent on each new connection. If someone is already connected then
+// this string will be sent to them immediately.
+PROCESSINGNDILIB_API
+void NDIlib_send_add_connection_metadata(NDIlib_send_instance_t p_instance, const NDIlib_metadata_frame_t* p_metadata);
+
+// This will assign a new fail-over source for this video source. What this means is that if this video source was to fail
+// any receivers would automatically switch over to use this source, unless this source then came back online. You can specify
+// NULL to clear the source.
+PROCESSINGNDILIB_API
+void NDIlib_send_set_failover(NDIlib_send_instance_t p_instance, const NDIlib_source_t* p_failover_source);
\ No newline at end of file
new file mode 100644
@@ -0,0 +1,39 @@
+#pragma once
+
+// NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation
+// for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or
+// online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license
+// terms. THe full NDI SDK may be downloaded at https://www.newtek.com/ndi/sdk/
+//
+//***********************************************************************************************************************************************
+//
+// Copyright(c) 2014-2017 NewTek, inc
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions :
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//***********************************************************************************************************************************************
+
+#ifdef __cplusplus
+
+#include <cstdint>
+
+#else
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#endif
+
+#ifndef INFINITE
+#define INFINITE 0xFFFFFFFF
+#endif
new file mode 100644
@@ -0,0 +1,213 @@
+#pragma once
+
+// NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation
+// for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or
+// online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license
+// terms. THe full NDI SDK may be downloaded at https://www.newtek.com/ndi/sdk/
+//
+//***********************************************************************************************************************************************
+//
+// Copyright(c) 2014-2017 NewTek, inc
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions :
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//***********************************************************************************************************************************************
+
+// This describes a video frame
+PROCESSINGNDILIB_DEPRECATED
+typedef struct NDIlib_video_frame_t
+{ // The resolution of this frame
+ int xres, yres;
+
+ // What FourCC this is with. This can be two values
+ NDIlib_FourCC_type_e FourCC;
+
+ // What is the frame-rate of this frame.
+ // For instance NTSC is 30000,1001 = 30000/1001 = 29.97fps
+ int frame_rate_N, frame_rate_D;
+
+ // What is the picture aspect ratio of this frame.
+ // For instance 16.0/9.0 = 1.778 is 16:9 video
+ float picture_aspect_ratio;
+
+ // Is this a fielded frame, or is it progressive
+ NDIlib_frame_format_type_e frame_format_type;
+
+ // The timecode of this frame in 100ns intervals
+ int64_t timecode;
+
+ // The video data itself
+ uint8_t* p_data;
+
+ // The inter line stride of the video data, in bytes.
+ int line_stride_in_bytes;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_video_frame_t(int xres_ = 0, int yres_ = 0, NDIlib_FourCC_type_e FourCC_ = NDIlib_FourCC_type_UYVY, int frame_rate_N_ = 30000, int frame_rate_D_ = 1001,
+ float picture_aspect_ratio_ = 0.0f, NDIlib_frame_format_type_e frame_format_type_ = NDIlib_frame_format_type_progressive,
+ int64_t timecode_ = NDIlib_send_timecode_synthesize, uint8_t* p_data_ = NULL, int line_stride_in_bytes_ = 0);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_video_frame_t;
+
+// This describes an audio frame
+PROCESSINGNDILIB_DEPRECATED
+typedef struct NDIlib_audio_frame_t
+{ // The sample-rate of this buffer
+ int sample_rate;
+
+ // The number of audio channels
+ int no_channels;
+
+ // The number of audio samples per channel
+ int no_samples;
+
+ // The timecode of this frame in 100ns intervals
+ int64_t timecode;
+
+ // The audio data
+ float* p_data;
+
+ // The inter channel stride of the audio channels, in bytes
+ int channel_stride_in_bytes;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_audio_frame_t(int sample_rate_ = 48000, int no_channels_ = 2, int no_samples_ = 0, int64_t timecode_ = NDIlib_send_timecode_synthesize,
+ float* p_data_ = NULL, int channel_stride_in_bytes_ = 0);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_audio_frame_t;
+
+// For legacy reasons I called this the wrong thing. For backwards compatability.
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+NDIlib_find_instance_t NDIlib_find_create2(const NDIlib_find_create_t* p_create_settings);
+
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+NDIlib_find_instance_t NDIlib_find_create(const NDIlib_find_create_t* p_create_settings);
+
+// DEPRECATED. This function is basically exactly the following and was confusing to use.
+// if ((!timeout_in_ms) || (NDIlib_find_wait_for_sources(timeout_in_ms)))
+// return NDIlib_find_get_current_sources(p_instance, p_no_sources);
+// return NULL;
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+const NDIlib_source_t* NDIlib_find_get_sources(NDIlib_find_instance_t p_instance, uint32_t* p_no_sources, uint32_t timeout_in_ms);
+
+// The creation structure that is used when you are creating a receiver
+PROCESSINGNDILIB_DEPRECATED
+typedef struct NDIlib_recv_create_t
+{ // The source that you wish to connect to.
+ NDIlib_source_t source_to_connect_to;
+
+ // Your preference of color space. See above.
+ NDIlib_recv_color_format_e color_format;
+
+ // The bandwidth setting that you wish to use for this video source. Bandwidth
+ // controlled by changing both the compression level and the resolution of the source.
+ // A good use for low bandwidth is working on WIFI connections.
+ NDIlib_recv_bandwidth_e bandwidth;
+
+ // When this flag is FALSE, all video that you receive will be progressive. For sources
+ // that provide fields, this is de-interlaced on the receiving side (because we cannot change
+ // what the up-stream source was actually rendering. This is provided as a convenience to
+ // down-stream sources that do not wish to understand fielded video. There is almost no
+ // performance impact of using this function.
+ bool allow_video_fields;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_recv_create_t(const NDIlib_source_t source_to_connect_to_ = NDIlib_source_t(), NDIlib_recv_color_format_e color_format_ = NDIlib_recv_color_format_UYVY_BGRA,
+ NDIlib_recv_bandwidth_e bandwidth_ = NDIlib_recv_bandwidth_highest, bool allow_video_fields_ = true);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_recv_create_t;
+
+// This function is deprecated, please use NDIlib_recv_create_v3 if you can. Using this function will continue to work, and be
+// supported for backwards compatibility. This version sets the receiver name to NULL.
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+NDIlib_recv_instance_t NDIlib_recv_create_v2(const NDIlib_recv_create_t* p_create_settings);
+
+// For legacy reasons I called this the wrong thing. For backwards compatability.
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+NDIlib_recv_instance_t NDIlib_recv_create2(const NDIlib_recv_create_t* p_create_settings);
+
+// This function is deprecated, please use NDIlib_recv_create_v3 if you can. Using this function will continue to work, and be
+// supported for backwards compatibility. This version sets bandwidth to highest and allow fields to true.
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+NDIlib_recv_instance_t NDIlib_recv_create(const NDIlib_recv_create_t* p_create_settings);
+
+// This will allow you to receive video, audio and metadata frames.
+// Any of the buffers can be NULL, in which case data of that type
+// will not be captured in this call. This call can be called simultaneously
+// on separate threads, so it is entirely possible to receive audio, video, metadata
+// all on separate threads. This function will return NDIlib_frame_type_none if no
+// data is received within the specified timeout and NDIlib_frame_type_error if the connection is lost.
+// Buffers captured with this must be freed with the appropriate free function below.
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+NDIlib_frame_type_e NDIlib_recv_capture(
+NDIlib_recv_instance_t p_instance, // The library instance
+NDIlib_video_frame_t* p_video_data, // The video data received (can be NULL)
+NDIlib_audio_frame_t* p_audio_data, // The audio data received (can be NULL)
+NDIlib_metadata_frame_t* p_metadata, // The metadata received (can be NULL)
+uint32_t timeout_in_ms); // The amount of time in milliseconds to wait for data.
+
+// Free the buffers returned by capture for video
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+void NDIlib_recv_free_video(NDIlib_recv_instance_t p_instance, const NDIlib_video_frame_t* p_video_data);
+
+// Free the buffers returned by capture for audio
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+void NDIlib_recv_free_audio(NDIlib_recv_instance_t p_instance, const NDIlib_audio_frame_t* p_audio_data);
+
+// This will add a video frame
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+void NDIlib_send_send_video(NDIlib_send_instance_t p_instance, const NDIlib_video_frame_t* p_video_data);
+
+// This will add a video frame and will return immediately, having scheduled the frame to be displayed.
+// All processing and sending of the video will occur asynchronously. The memory accessed by NDIlib_video_frame_t
+// cannot be freed or re-used by the caller until a synchronizing event has occured. In general the API is better
+// able to take advantage of asynchronous processing than you might be able to by simple having a separate thread
+// to submit frames.
+//
+// This call is particularly beneficial when processing BGRA video since it allows any color conversion, compression
+// and network sending to all be done on separate threads from your main rendering thread.
+//
+// Synchronozing events are :
+// - a call to NDIlib_send_send_video
+// - a call to NDIlib_send_send_video_async with another frame to be sent
+// - a call to NDIlib_send_send_video with p_video_data=NULL
+// - a call to NDIlib_send_destroy
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+void NDIlib_send_send_video_async(NDIlib_send_instance_t p_instance, const NDIlib_video_frame_t* p_video_data);
+
+// This will add an audio frame
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+void NDIlib_send_send_audio(NDIlib_send_instance_t p_instance, const NDIlib_audio_frame_t* p_audio_data);
+
+// Convert an planar floating point audio buffer into a interleaved short audio buffer.
+// IMPORTANT : You must allocate the space for the samples in the destination to allow for your own memory management.
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+void NDIlib_util_audio_to_interleaved_16s(const NDIlib_audio_frame_t* p_src, NDIlib_audio_frame_interleaved_16s_t* p_dst);
+
+// Convert an interleaved short audio buffer audio buffer into a planar floating point one.
+// IMPORTANT : You must allocate the space for the samples in the destination to allow for your own memory management.
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+void NDIlib_util_audio_from_interleaved_16s(const NDIlib_audio_frame_interleaved_16s_t* p_src, NDIlib_audio_frame_t* p_dst);
+
+// Convert an planar floating point audio buffer into a interleaved floating point audio buffer.
+// IMPORTANT : You must allocate the space for the samples in the destination to allow for your own memory management.
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+void NDIlib_util_audio_to_interleaved_32f(const NDIlib_audio_frame_t* p_src, NDIlib_audio_frame_interleaved_32f_t* p_dst);
+
+// Convert an interleaved floating point audio buffer into a planar floating point one.
+// IMPORTANT : You must allocate the space for the samples in the destination to allow for your own memory management.
+PROCESSINGNDILIB_API PROCESSINGNDILIB_DEPRECATED
+void NDIlib_util_audio_from_interleaved_32f(const NDIlib_audio_frame_interleaved_32f_t* p_src, NDIlib_audio_frame_t* p_dst);
\ No newline at end of file
new file mode 100644
@@ -0,0 +1,247 @@
+#pragma once
+
+// NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation
+// for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or
+// online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license
+// terms. THe full NDI SDK may be downloaded at https://www.newtek.com/ndi/sdk/
+//
+//***********************************************************************************************************************************************
+//
+// Copyright(c) 2014-2017 NewTek, inc
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions :
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//***********************************************************************************************************************************************
+
+#ifndef NDI_LIB_FOURCC
+#define NDI_LIB_FOURCC(ch0, ch1, ch2, ch3) \
+ ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24))
+#endif
+
+// An enumeration to specify the type of a packet returned by the functions
+typedef enum NDIlib_frame_type_e
+{ NDIlib_frame_type_none = 0,
+ NDIlib_frame_type_video = 1,
+ NDIlib_frame_type_audio = 2,
+ NDIlib_frame_type_metadata = 3,
+ NDIlib_frame_type_error = 4,
+
+ // This indicates that the settings on this input have changed.
+ // For instamce, this value will be returned from NDIlib_recv_capture_v2 and NDIlib_recv_capture
+ // when the device is known to have new settings, for instance the web-url has changed ot the device
+ // is now known to be a PTZ camera.
+ NDIlib_frame_type_status_change = 100
+
+} NDIlib_frame_type_e;
+
+typedef enum NDIlib_FourCC_type_e
+{ // YCbCr color space
+ NDIlib_FourCC_type_UYVY = NDI_LIB_FOURCC('U', 'Y', 'V', 'Y'),
+
+ // BGRA
+ NDIlib_FourCC_type_BGRA = NDI_LIB_FOURCC('B', 'G', 'R', 'A'),
+ NDIlib_FourCC_type_BGRX = NDI_LIB_FOURCC('B', 'G', 'R', 'X'),
+
+ // RGBA
+ NDIlib_FourCC_type_RGBA = NDI_LIB_FOURCC('R', 'G', 'B', 'A'),
+ NDIlib_FourCC_type_RGBX = NDI_LIB_FOURCC('R', 'G', 'B', 'X'),
+
+ // This is a UYVY buffer followed immediately by an alpha channel buffer.
+ // If the stride of the YCbCr component is "stride", then the alpha channel
+ // starts at image_ptr + yres*stride. The alpha channel stride is stride/2.
+ NDIlib_FourCC_type_UYVA = NDI_LIB_FOURCC('U', 'Y', 'V', 'A')
+
+} NDIlib_FourCC_type_e;
+
+typedef enum NDIlib_frame_format_type_e
+{ // A progressive frame
+ NDIlib_frame_format_type_progressive = 1,
+
+ // A fielded frame with the field 0 being on the even lines and field 1 being
+ // on the odd lines/
+ NDIlib_frame_format_type_interleaved = 0,
+
+ // Individual fields
+ NDIlib_frame_format_type_field_0 = 2,
+ NDIlib_frame_format_type_field_1 = 3
+
+} NDIlib_frame_format_type_e;
+
+// When you specify this as a timecode, the timecode will be synthesized for you. This may
+// be used when sending video, audio or metadata. If you never specify a timecode at all,
+// asking for each to be synthesized, then this will use the current system time as the
+// starting timecode and then generate synthetic ones, keeping your streams exactly in
+// sync as long as the frames you are sending do not deviate from the system time in any
+// meaningful way. In practice this means that if you never specify timecodes that they
+// will always be generated for you correctly. Timecodes coming from different senders on
+// the same machine will always be in sync with eachother when working in this way. If you
+// have NTP installed on your local network, then streams can be synchronized between
+// multiple machines with very high precision.
+//
+// If you specify a timecode at a particular frame (audio or video), then ask for all subsequent
+// ones to be synthesized. The subsequent ones will be generated to continue this sequency
+// maintining the correct relationship both the between streams and samples generated, avoiding
+// them deviating in time from teh timecode that you specified in any meanginfful way.
+//
+// If you specify timecodes on one stream (e.g. video) and ask for the other stream (audio) to
+// be sythesized, the correct timecodes will be generated for the other stream and will be synthesize
+// exactly to match (they are not quantized inter-streams) the correct sample positions.
+//
+// When you send metadata messagesa and ask for the timecode to be synthesized, then it is chosen
+// to match the closest audio or video frame timecode so that it looks close to something you might
+// want ... unless there is no sample that looks close in which a timecode is synthesized from the
+// last ones known and the time since it was sent.
+//
+static const int64_t NDIlib_send_timecode_synthesize = INT64_MAX;
+static const int64_t NDIlib_send_timecode_empty = 0;
+
+// If the time-stamp is not available (i.e. a version of a sender before v2.5)
+static const int64_t NDIlib_recv_timestamp_undefined = INT64_MAX;
+
+// This is a descriptor of a NDI source available on the network.
+typedef struct NDIlib_source_t
+{ // A UTF8 string that provides a user readable name for this source.
+ // This can be used for serialization, etc... and comprises the machine
+ // name and the source name on that machine. In the form
+ // MACHINE_NAME (NDI_SOURCE_NAME)
+ // If you specify this parameter either as NULL, or an EMPTY string then the
+ // specific ip addres adn port number from below is used.
+ const char* p_ndi_name;
+
+ // A UTF8 string that provides the actual IP address and port number.
+ // This is in the form : IP_ADDRESS:PORT_NO, for instance "127.0.0.1:10000"
+ // If you leave this parameter either as NULL, or an EMPTY string then the
+ // ndi name above is used to look up the mDNS name to determine the IP and
+ // port number. Connection is faster if the IP address is known.
+ const char* p_ip_address;
+
+ // Default constructor in C++
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_source_t(const char* p_ndi_name_ = NULL, const char* p_ip_address_ = NULL);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_source_t;
+
+// This describes a video frame
+typedef struct NDIlib_video_frame_v2_t
+{ // The resolution of this frame
+ int xres, yres;
+
+ // What FourCC this is with. This can be two values
+ NDIlib_FourCC_type_e FourCC;
+
+ // What is the frame-rate of this frame.
+ // For instance NTSC is 30000,1001 = 30000/1001 = 29.97fps
+ int frame_rate_N, frame_rate_D;
+
+ // What is the picture aspect ratio of this frame.
+ // For instance 16.0/9.0 = 1.778 is 16:9 video
+ // 0 means square pixels
+ float picture_aspect_ratio;
+
+ // Is this a fielded frame, or is it progressive
+ NDIlib_frame_format_type_e frame_format_type;
+
+ // The timecode of this frame in 100ns intervals
+ int64_t timecode;
+
+ // The video data itself
+ uint8_t* p_data;
+
+ // The inter line stride of the video data, in bytes.
+ int line_stride_in_bytes;
+
+ // Per frame metadata for this frame. This is a NULL terminated UTF8 string that should be
+ // in XML format. If you do not want any metadata then you may specify NULL here.
+ const char* p_metadata; // Present in >= v2.5
+
+ // This is only valid when receiving a frame and is specified as a 100ns time that was the exact
+ // moment that the frame was submitted by the sending side and is generated by the SDK. If this
+ // value is NDIlib_recv_timestamp_undefined then this value is not available and is NDIlib_recv_timestamp_undefined.
+ int64_t timestamp; // Present in >= v2.5
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_video_frame_v2_t(int xres_ = 0, int yres_ = 0, NDIlib_FourCC_type_e FourCC_ = NDIlib_FourCC_type_UYVY, int frame_rate_N_ = 30000, int frame_rate_D_ = 1001,
+ float picture_aspect_ratio_ = 0.0f, NDIlib_frame_format_type_e frame_format_type_ = NDIlib_frame_format_type_progressive,
+ int64_t timecode_ = NDIlib_send_timecode_synthesize, uint8_t* p_data_ = NULL, int line_stride_in_bytes_ = 0, const char* p_metadata_ = NULL, int64_t timestamp_ = NDIlib_send_timecode_empty);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_video_frame_v2_t;
+
+// This describes an audio frame
+typedef struct NDIlib_audio_frame_v2_t
+{ // The sample-rate of this buffer
+ int sample_rate;
+
+ // The number of audio channels
+ int no_channels;
+
+ // The number of audio samples per channel
+ int no_samples;
+
+ // The timecode of this frame in 100ns intervals
+ int64_t timecode;
+
+ // The audio data
+ float* p_data;
+
+ // The inter channel stride of the audio channels, in bytes
+ int channel_stride_in_bytes;
+
+ // Per frame metadata for this frame. This is a NULL terminated UTF8 string that should be
+ // in XML format. If you do not want any metadata then you may specify NULL here.
+ const char* p_metadata; // Present in >= v2.5
+
+ // This is only valid when receiving a frame and is specified as a 100ns time that was the exact
+ // moment that the frame was submitted by the sending side and is generated by the SDK. If this
+ // value is NDIlib_recv_timestamp_undefined then this value is not available and is NDIlib_recv_timestamp_undefined.
+ int64_t timestamp; // Present in >= v2.5
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_audio_frame_v2_t(int sample_rate_ = 48000, int no_channels_ = 2, int no_samples_ = 0, int64_t timecode_ = NDIlib_send_timecode_synthesize,
+ float* p_data_ = NULL, int channel_stride_in_bytes_ = 0, const char* p_metadata_ = NULL, int64_t timestamp_ = NDIlib_send_timecode_empty);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_audio_frame_v2_t;
+
+// The data description for metadata
+typedef struct NDIlib_metadata_frame_t
+{ // The length of the string in UTF8 characters. This includes the NULL terminating character.
+ // If this is 0, then the length is assume to be the length of a null terminated string.
+ int length;
+
+ // The timecode of this frame in 100ns intervals
+ int64_t timecode;
+
+ // The metadata as a UTF8 XML string. This is a NULL terminated string.
+ char* p_data;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_metadata_frame_t(int length_ = 0, int64_t timecode_ = NDIlib_send_timecode_synthesize, char* p_data_ = NULL);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_metadata_frame_t;
+
+// Tally structures
+typedef struct NDIlib_tally_t
+{ // Is this currently on program output
+ bool on_program;
+
+ // Is this currently on preview output
+ bool on_preview;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_tally_t(bool on_program_ = false, bool on_preview_ = false);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_tally_t;
new file mode 100644
@@ -0,0 +1,108 @@
+#pragma once
+
+// NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation
+// for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or
+// online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license
+// terms. THe full NDI SDK may be downloaded at https://www.newtek.com/ndi/sdk/
+//
+//***********************************************************************************************************************************************
+//
+// Copyright(c) 2014-2017 NewTek, inc
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions :
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//***********************************************************************************************************************************************
+
+// Because many applications like submitting 16bit interleaved audio, these functions will convert in
+// and out of that format. It is important to note that the NDI SDK does define fully audio levels, something
+// that most applications that you use do not. Specifically, the floating point -1.0 to +1.0 range is defined
+// as a professional audio reference level of +4dBU. If we take 16bit audio and scale it into this range
+// it is almost always correct for sending and will cause no problems. For receiving however it is not at
+// all uncommon that the user has audio that exceeds reference level and in this case it is likely that audio
+// exceeds the reference level and so if you are not careful you will end up having audio clipping when
+// you use the 16 bit range.
+
+// This describes an audio frame
+typedef struct NDIlib_audio_frame_interleaved_16s_t
+{ // The sample-rate of this buffer
+ int sample_rate;
+
+ // The number of audio channels
+ int no_channels;
+
+ // The number of audio samples per channel
+ int no_samples;
+
+ // The timecode of this frame in 100ns intervals
+ int64_t timecode;
+
+ // The audio reference level in dB. This specifies how many dB above the reference level (+4dBU) is the full range of 16 bit audio.
+ // If you do not understand this and want to just use numbers :
+ // - If you are sending audio, specify +0dB. Most common applications produce audio at reference level.
+ // - If receiving audio, specify +20dB. This means that the full 16 bit range corresponds to professional level audio with 20dB of headroom. Note that
+ // if you are writing it into a file it might sound soft because you have 20dB of headroom before clipping.
+ int reference_level;
+
+ // The audio data, interleaved 16bpp
+ short* p_data;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_audio_frame_interleaved_16s_t(int sample_rate_ = 48000, int no_channels_ = 2, int no_samples_ = 0, int64_t timecode_ = NDIlib_send_timecode_synthesize,
+ int reference_level_ = 0, short* p_data_ = NULL);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_audio_frame_interleaved_16s_t;
+
+// This describes an audio frame
+typedef struct NDIlib_audio_frame_interleaved_32f_t
+{ // The sample-rate of this buffer
+ int sample_rate;
+
+ // The number of audio channels
+ int no_channels;
+
+ // The number of audio samples per channel
+ int no_samples;
+
+ // The timecode of this frame in 100ns intervals
+ int64_t timecode;
+
+ // The audio data, interleaved 32bpp
+ float* p_data;
+
+#if NDILIB_CPP_DEFAULT_CONSTRUCTORS
+ NDIlib_audio_frame_interleaved_32f_t(int sample_rate_ = 48000, int no_channels_ = 2, int no_samples_ = 0, int64_t timecode_ = NDIlib_send_timecode_synthesize,
+ float* p_data_ = NULL);
+#endif // NDILIB_CPP_DEFAULT_CONSTRUCTORS
+
+} NDIlib_audio_frame_interleaved_32f_t;
+
+// This will add an audio frame in 16bpp
+PROCESSINGNDILIB_API
+void NDIlib_util_send_send_audio_interleaved_16s(NDIlib_send_instance_t p_instance, const NDIlib_audio_frame_interleaved_16s_t* p_audio_data);
+
+// This will add an audio frame interleaved floating point
+PROCESSINGNDILIB_API
+void NDIlib_util_send_send_audio_interleaved_32f(NDIlib_send_instance_t p_instance, const NDIlib_audio_frame_interleaved_32f_t* p_audio_data);
+
+PROCESSINGNDILIB_API
+void NDIlib_util_audio_to_interleaved_16s_v2(const NDIlib_audio_frame_v2_t* p_src, NDIlib_audio_frame_interleaved_16s_t* p_dst);
+
+PROCESSINGNDILIB_API
+void NDIlib_util_audio_from_interleaved_16s_v2(const NDIlib_audio_frame_interleaved_16s_t* p_src, NDIlib_audio_frame_v2_t* p_dst);
+
+PROCESSINGNDILIB_API
+void NDIlib_util_audio_to_interleaved_32f_v2(const NDIlib_audio_frame_v2_t* p_src, NDIlib_audio_frame_interleaved_32f_t* p_dst);
+
+PROCESSINGNDILIB_API
+void NDIlib_util_audio_from_interleaved_32f_v2(const NDIlib_audio_frame_interleaved_32f_t* p_src, NDIlib_audio_frame_v2_t* p_dst);
\ No newline at end of file