├── README.md ├── Examples ├── NDIlib_Find │ ├── Project1.res │ ├── Project1.dpr │ ├── Win64 │ │ └── Debug │ │ │ └── Processing.NDI.Lib.Licenses.txt │ └── Project1.dproj ├── NDIlib_Recv │ ├── Project1.res │ └── Project1.dpr └── NDIlib_Send_Video │ ├── Project1.res │ └── Project1.dpr ├── Documentation ├── Introduction to NDI.pdf ├── NDI Problem Solving.pdf ├── NDI SDK Documentation.pdf └── Introduction to the NDI SDK.pdf ├── Bin └── windows │ ├── x64 │ ├── Processing.NDI.Lib.x64.dll │ └── Processing.NDI.Lib.Licenses.txt │ └── x86 │ ├── Processing.NDI.Lib.x86.dll │ └── Processing.NDI.Lib.Licenses.txt ├── .gitignore └── Include ├── Processing.NDI.compat.pas ├── Processing.NDI.Routing.pas ├── Processing.NDI.Find.pas ├── Processing.NDI.Lib.pas ├── Processing.NDI.Send.pas ├── Processing.NDI.utilities.pas ├── Processing.NDI.deprecated.pas ├── Processing.NDI.Recv.ex.pas ├── Processing.NDI.FrameSync.pas ├── Processing.NDI.structs.pas └── Processing.NDI.Recv.pas /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelphiForBroadcasting/ndi-sdk-delphi/HEAD/README.md -------------------------------------------------------------------------------- /Examples/NDIlib_Find/Project1.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelphiForBroadcasting/ndi-sdk-delphi/HEAD/Examples/NDIlib_Find/Project1.res -------------------------------------------------------------------------------- /Examples/NDIlib_Recv/Project1.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelphiForBroadcasting/ndi-sdk-delphi/HEAD/Examples/NDIlib_Recv/Project1.res -------------------------------------------------------------------------------- /Documentation/Introduction to NDI.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelphiForBroadcasting/ndi-sdk-delphi/HEAD/Documentation/Introduction to NDI.pdf -------------------------------------------------------------------------------- /Documentation/NDI Problem Solving.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelphiForBroadcasting/ndi-sdk-delphi/HEAD/Documentation/NDI Problem Solving.pdf -------------------------------------------------------------------------------- /Documentation/NDI SDK Documentation.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelphiForBroadcasting/ndi-sdk-delphi/HEAD/Documentation/NDI SDK Documentation.pdf -------------------------------------------------------------------------------- /Examples/NDIlib_Send_Video/Project1.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelphiForBroadcasting/ndi-sdk-delphi/HEAD/Examples/NDIlib_Send_Video/Project1.res -------------------------------------------------------------------------------- /Bin/windows/x64/Processing.NDI.Lib.x64.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelphiForBroadcasting/ndi-sdk-delphi/HEAD/Bin/windows/x64/Processing.NDI.Lib.x64.dll -------------------------------------------------------------------------------- /Bin/windows/x86/Processing.NDI.Lib.x86.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelphiForBroadcasting/ndi-sdk-delphi/HEAD/Bin/windows/x86/Processing.NDI.Lib.x86.dll -------------------------------------------------------------------------------- /Documentation/Introduction to the NDI SDK.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DelphiForBroadcasting/ndi-sdk-delphi/HEAD/Documentation/Introduction to the NDI SDK.pdf -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Uncomment these types if you want even more clean repository. But be careful. 2 | # It can make harm to an existing project source. Read explanations below. 3 | # 4 | # Resource files are binaries containing manifest, project icon and version info. 5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. 6 | #*.res 7 | # 8 | # Type library file (binary). In old Delphi versions it should be stored. 9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. 10 | #*.tlb 11 | # 12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. 13 | # Uncomment this if you are not using diagrams or use newer Delphi version. 14 | #*.ddp 15 | # 16 | # Visual LiveBindings file. Added in Delphi XE2. 17 | # Uncomment this if you are not using LiveBindings Designer. 18 | #*.vlb 19 | # 20 | # Deployment Manager configuration file for your project. Added in Delphi XE2. 21 | # Uncomment this if it is not mobile development and you do not use remote debug feature. 22 | #*.deployproj 23 | # 24 | # C++ object files produced when C/C++ Output file generation is configured. 25 | # Uncomment this if you are not using external objects (zlib library for example). 26 | #*.obj 27 | # 28 | 29 | # Delphi compiler-generated binaries (safe to delete) 30 | *.exe 31 | *.dll 32 | *.bpl 33 | *.bpi 34 | *.dcp 35 | *.so 36 | *.apk 37 | *.drc 38 | *.map 39 | *.dres 40 | *.rsm 41 | *.tds 42 | *.dcu 43 | *.lib 44 | *.a 45 | *.o 46 | *.ocx 47 | 48 | # Delphi autogenerated files (duplicated info) 49 | *.cfg 50 | *.hpp 51 | *Resource.rc 52 | 53 | # Delphi local files (user-specific info) 54 | *.local 55 | *.identcache 56 | *.projdata 57 | *.tvsconfig 58 | *.dsk 59 | 60 | # Delphi history and backups 61 | __history/ 62 | *.~* 63 | 64 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi) 65 | *.stat 66 | 67 | 68 | !/Lib/**/*.lib 69 | !/Bin/**/*.dll 70 | -------------------------------------------------------------------------------- /Include/Processing.NDI.compat.pas: -------------------------------------------------------------------------------- 1 | {$ifndef PROCESSING_NDI_COMPAT_H} 2 | {$define PROCESSING_NDI_COMPAT_H} 3 | // NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation 4 | // for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or 5 | // online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license 6 | // terms. The full NDI SDK may be downloaded at http://ndi.tv/ 7 | // 8 | //************************************************************************************************************************************* 9 | // 10 | // Copyright(c) 2014-2020, NewTek, inc. 11 | // 12 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 13 | // files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, 14 | // merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is 15 | // furnished to do so, subject to the following conditions : 16 | // 17 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 21 | // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | // 24 | //************************************************************************************************************************************* 25 | const 26 | INFINITE = $FFFFFFFF; 27 | 28 | {$endif} (* PROCESSING_NDI_COMPAT_H *) 29 | -------------------------------------------------------------------------------- /Examples/NDIlib_Find/Project1.dpr: -------------------------------------------------------------------------------- 1 | program Project1; 2 | 3 | {$APPTYPE CONSOLE} 4 | 5 | {$R *.res} 6 | 7 | uses 8 | WinApi.Windows, 9 | System.SysUtils, 10 | System.Types, 11 | Processing.NDI.Lib in '..\..\include\Processing.NDI.Lib.pas'; 12 | 13 | 14 | // We are going to create an NDI finder that locates sources on the network. 15 | // including ones that are available on this machine itself. It will use the default 16 | // groups assigned for the current machine. 17 | //const 18 | 19 | var 20 | pNDI_find : pNDIlib_find_instance; 21 | p_sources : pNDIlib_source; 22 | no_sources : Cardinal; 23 | i : Integer; 24 | start : Cardinal; 25 | begin 26 | try 27 | // Not required, but "correct" (see the SDK documentation. 28 | if (not NDIlib_initialize()) then 29 | begin 30 | // Cannot run NDI. Most likely because the CPU is not sufficient (see SDK documentation). 31 | // you can check this directly with a call to NDIlib_is_supported_CPU() 32 | writeln('Cannot run NDI.'); 33 | exit; 34 | end; 35 | 36 | writeln(format('NDI Lib Version is %s', [NDIlib_version])); 37 | 38 | // We are going to create an NDI finder that locates sources on the network. 39 | pNDI_find := NDIlib_find_create_v2(); 40 | if not assigned(pNDI_find) then 41 | exit; 42 | 43 | // Run for one minute 44 | start := GetTickCount(); 45 | while (GetTickCount() - start) < 10000 do 46 | begin 47 | // Wait up till 5 seconds to check for new sources to be added or removed 48 | if (not NDIlib_find_wait_for_sources(pNDI_find, 5000)) then 49 | begin 50 | writeln('No change to the sources found.'); 51 | continue; 52 | end; 53 | 54 | // Get the updated list of sources 55 | no_sources := 0; 56 | p_sources := NDIlib_find_get_current_sources(pNDI_find, no_sources); 57 | 58 | // Display all the sources. 59 | writeln(Format('Network sources (%u found).', [no_sources])); 60 | for i := 0 to no_sources - 1 do 61 | begin 62 | writeln(Format('%d. %s', [i + 1, p_sources^.p_ndi_name])); 63 | inc(p_sources, 1) 64 | end; 65 | end; 66 | 67 | // Destroy the NDI finder 68 | NDIlib_find_destroy(pNDI_find); 69 | 70 | except 71 | on E: Exception do 72 | Writeln(E.ClassName, ': ', E.Message); 73 | end; 74 | end. 75 | -------------------------------------------------------------------------------- /Include/Processing.NDI.Routing.pas: -------------------------------------------------------------------------------- 1 | {$ifndef PROCESSING_NDI_ROUTING_H} 2 | {$define PROCESSING_NDI_ROUTING_H} 3 | 4 | // NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation 5 | // for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or 6 | // online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license 7 | // terms. The full NDI SDK may be downloaded at http://ndi.tv/ 8 | // 9 | //************************************************************************************************************************************* 10 | // 11 | // Copyright(c) 2014-2020, NewTek, inc. 12 | // 13 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 14 | // files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, 15 | // merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is 16 | // furnished to do so, subject to the following conditions : 17 | // 18 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 19 | // 20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 22 | // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 | // 25 | //************************************************************************************************************************************* 26 | 27 | // Structures and type definitions required by NDI sending 28 | // The reference to an instance of the sender 29 | type 30 | pNDIlib_routing_instance = Pointer; 31 | 32 | // The creation structure that is used when you are creating a sender 33 | type 34 | pNDIlib_routing_create = ^TNDIlib_routing_create; 35 | TNDIlib_routing_create = record 36 | // The name of the NDI source to create. This is a NULL terminated UTF8 string. 37 | p_ndi_name: PAnsiChar; 38 | 39 | // What groups should this source be part of 40 | p_groups: PAnsiChar; 41 | end; 42 | 43 | // Create an NDI routing source 44 | function NDIlib_routing_create(p_create_settings: pNDIlib_routing_create): pNDIlib_routing_instance; 45 | cdecl; external PROCESSINGNDILIB_API; 46 | 47 | // Destroy and NDI routing source 48 | procedure NDIlib_routing_destroy(p_instance: pNDIlib_routing_instance); 49 | cdecl; external PROCESSINGNDILIB_API; 50 | 51 | // Change the routing of this source to another destination 52 | function NDIlib_routing_change(p_instance: pNDIlib_routing_instance; p_source: pNDIlib_source): LongBool; 53 | cdecl; external PROCESSINGNDILIB_API; 54 | 55 | // Change the routing of this source to another destination 56 | function NDIlib_routing_clear(p_instance: pNDIlib_routing_instance): LongBool; 57 | cdecl; external PROCESSINGNDILIB_API; 58 | 59 | // 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. 60 | // 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 61 | // 0 then it will wait until there are connections for this amount of time. 62 | function NDIlib_routing_get_no_connections(p_instance: pNDIlib_routing_instance; timeout_in_ms: Cardinal): Integer; 63 | cdecl; external PROCESSINGNDILIB_API; 64 | 65 | // Retrieve the source information for the given router instance. This pointer is valid until NDIlib_routing_destroy is called. 66 | function NDIlib_routing_get_source_name(p_instance: pNDIlib_routing_instance): pNDIlib_source; 67 | cdecl; external PROCESSINGNDILIB_API; 68 | 69 | {$endif} (* PROCESSING_NDI_ROUTING_H *) 70 | -------------------------------------------------------------------------------- /Include/Processing.NDI.Find.pas: -------------------------------------------------------------------------------- 1 | {$ifndef PROCESSING_NDI_FIND_H} 2 | {$define PROCESSING_NDI_FIND_H} 3 | 4 | // NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation 5 | // for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or 6 | // online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license 7 | // terms. The full NDI SDK may be downloaded at http://ndi.tv/ 8 | // 9 | //************************************************************************************************************************************* 10 | // 11 | // Copyright(c) 2014-2020, NewTek, inc. 12 | // 13 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 14 | // files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, 15 | // merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is 16 | // furnished to do so, subject to the following conditions : 17 | // 18 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 19 | // 20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 22 | // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 | // 25 | //************************************************************************************************************************************* 26 | 27 | // Structures and type definitions required by NDI finding 28 | // The reference to an instance of the finder 29 | type 30 | pNDIlib_find_instance = Pointer; 31 | 32 | 33 | // The creation structure that is used when you are creating a finder 34 | type 35 | pNDIlib_find_create = ^TNDIlib_find_create; 36 | TNDIlib_find_create = packed record 37 | // Do we want to incluide the list of NDI sources that are running 38 | // on the local machine ? 39 | // If TRUE then local sources will be visible, if FALSE then they 40 | // will not. 41 | show_local_sources: integer; 42 | 43 | // Which groups do you want to search in for sources 44 | p_groups: PAnsiChar; 45 | // The list of additional IP addresses that exist that we should query for 46 | // sources on. For instance, if you want to find the sources on a remote machine 47 | // that is not on your local sub-net then you can put a comma separated list of 48 | // those IP addresses here and those sources will be available locally even though 49 | // they are not mDNS discoverable. An example might be "12.0.0.8,13.0.12.8". 50 | // When none is specified the registry is used. 51 | // Default = NULL; 52 | p_extra_ips: PAnsiChar; 53 | end; 54 | 55 | 56 | //************************************************************************************************************************** 57 | // Create a new finder instance. This will return NULL if it fails. 58 | 59 | function NDIlib_find_create_v2(p_create_settings: pNDIlib_find_create = nil): pNDIlib_find_instance; 60 | cdecl; external PROCESSINGNDILIB_API; 61 | 62 | // This will destroy an existing finder instance. 63 | procedure NDIlib_find_destroy(p_instance: pNDIlib_find_instance); 64 | cdecl; external PROCESSINGNDILIB_API; 65 | 66 | // This function will recover the current set of sources (i.e. the ones that exist right this second). 67 | // The char* memory buffers returned in NDIlib_source_t are valid until the next call to NDIlib_find_get_current_sources or a call to NDIlib_find_destroy. 68 | // For a given NDIlib_find_instance_t, do not call NDIlib_find_get_current_sources asynchronously. 69 | 70 | function NDIlib_find_get_current_sources(p_instance: pNDIlib_find_instance; var p_no_sources: Cardinal): pNDIlib_source; 71 | cdecl; external PROCESSINGNDILIB_API; 72 | 73 | // This will allow you to wait until the number of online sources have changed. 74 | function NDIlib_find_wait_for_sources(p_instance: pNDIlib_find_instance; timeout_in_ms: Cardinal): LongBool 75 | cdecl; external PROCESSINGNDILIB_API; 76 | 77 | {$endif} (* PROCESSING_NDI_FIND_H *) 78 | -------------------------------------------------------------------------------- /Examples/NDIlib_Recv/Project1.dpr: -------------------------------------------------------------------------------- 1 | program Project1; 2 | 3 | {$APPTYPE CONSOLE} 4 | 5 | {$R *.res} 6 | 7 | uses 8 | WinApi.Windows, 9 | System.Diagnostics, 10 | System.TimeSpan, 11 | System.SysUtils, 12 | System.Types, 13 | Processing.NDI.Lib in '..\..\include\Processing.NDI.Lib.pas'; 14 | 15 | 16 | var 17 | pNDI_find : pNDIlib_find_instance; 18 | no_sources : cardinal; 19 | p_sources : pNDIlib_source = nil; 20 | p_sources_d : pNDIlib_source = nil; 21 | pNDI_recv : pNDIlib_recv_instance; 22 | video_frame : TNDIlib_video_frame_v2; 23 | audio_frame : TNDIlib_audio_frame_v2; 24 | i : integer; 25 | selected_source_str : string; 26 | selected_source : cardinal; 27 | sw : TStopwatch; 28 | begin 29 | try 30 | // Not required, but "correct" (see the SDK documentation. 31 | if (not NDIlib_initialize()) then 32 | begin 33 | // Cannot run NDI. Most likely because the CPU is not sufficient (see SDK documentation). 34 | // you can check this directly with a call to NDIlib_is_supported_CPU() 35 | writeln('Cannot run NDI.'); 36 | exit; 37 | end; 38 | 39 | writeln(format('NDI Lib Version is %s', [NDIlib_version])); 40 | 41 | // Create a finder 42 | pNDI_find := NDIlib_find_create_v2(); 43 | if not assigned(pNDI_find) then 44 | exit; 45 | 46 | // Wait until there is one source 47 | no_sources := 0; 48 | 49 | while (no_sources <= 0) do 50 | begin 51 | // Wait until the sources on the nwtork have changed 52 | System.Writeln('Looking for sources ...'); 53 | NDIlib_find_wait_for_sources(pNDI_find, 1000); 54 | p_sources := NDIlib_find_get_current_sources(pNDI_find, no_sources); 55 | 56 | if no_sources >= 1 then 57 | begin 58 | p_sources_d := p_sources; 59 | writeln(Format('Network sources (%u found).', [no_sources])); 60 | for i := 0 to no_sources - 1 do 61 | begin 62 | writeln(Format('%d. %s', [i + 1, p_sources_d^.p_ndi_name])); 63 | inc(p_sources_d, 1) 64 | end; 65 | end; 66 | end; 67 | 68 | while True do 69 | begin 70 | System.Writeln(''); 71 | System.Write('Select Source: '); 72 | System.ReadLn(selected_source_str); 73 | try 74 | selected_source:= StrToInt(selected_source_str); 75 | if ((selected_source >= 1) and (selected_source <= no_sources)) then 76 | begin 77 | inc(p_sources, selected_source - 1); 78 | break; 79 | end; 80 | except end; 81 | 82 | 83 | System.Writeln('Enter incorect source noumber.'); 84 | end; 85 | 86 | 87 | // We now have at least one source, so we create a receiver to look at it. 88 | pNDI_recv := NDIlib_recv_create_v3(); 89 | if not assigned(pNDI_recv) then 90 | exit; 91 | 92 | // Connect to our sources 93 | NDIlib_recv_connect(pNDI_recv, p_sources); 94 | 95 | // Destroy the NDI finder. We needed to have access to the pointers to p_sources[0] 96 | NDIlib_find_destroy(pNDI_find); 97 | 98 | // Run for one minute 99 | sw := TStopwatch.StartNew; 100 | while (sw.Elapsed.TotalMilliseconds <= TTimeSpan.FromMinutes(1).TotalMilliseconds) do 101 | begin 102 | 103 | case (NDIlib_recv_capture_v2(pNDI_recv, @video_frame, @audio_frame, nil, 5000)) of 104 | // No data 105 | TNDIlib_frame_type.NDIlib_frame_type_none: 106 | begin 107 | System.Writeln('No data received.'); 108 | end; 109 | 110 | // Video data 111 | TNDIlib_frame_type.NDIlib_frame_type_video: 112 | begin 113 | System.Writeln(Format('Video data received (%dx%d).', [video_frame.xres, video_frame.yres])); 114 | NDIlib_recv_free_video_v2(pNDI_recv, @video_frame); 115 | end; 116 | 117 | // Audio data 118 | TNDIlib_frame_type.NDIlib_frame_type_audio: 119 | begin 120 | System.Writeln(Format('Audio data received (%d samples).', [audio_frame.no_samples])); 121 | NDIlib_recv_free_audio_v2(pNDI_recv, @audio_frame); 122 | end; 123 | end; 124 | end; 125 | 126 | // Destroy the receiver 127 | NDIlib_recv_destroy(pNDI_recv); 128 | 129 | // Not required, but nice 130 | NDIlib_destroy(); 131 | 132 | except 133 | on E: Exception do 134 | Writeln(E.ClassName, ': ', E.Message); 135 | end; 136 | end. 137 | -------------------------------------------------------------------------------- /Include/Processing.NDI.Lib.pas: -------------------------------------------------------------------------------- 1 | // NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation 2 | // for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or 3 | // online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license 4 | // terms. The full NDI SDK may be downloaded at http://ndi.tv/ 5 | // 6 | //************************************************************************************************************************************* 7 | // 8 | // Copyright(c) 2014-2020, NewTek, inc. 9 | // 10 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 11 | // files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, 12 | // merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is 13 | // furnished to do so, subject to the following conditions : 14 | // 15 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 19 | // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | // 22 | //************************************************************************************************************************************* 23 | 24 | unit Processing.NDI.Lib; 25 | 26 | {$MINENUMSIZE 4} 27 | 28 | interface 29 | 30 | 31 | uses 32 | System.SysUtils, 33 | System.Types; 34 | 35 | const 36 | {$IFDEF WIN32} 37 | PROCESSINGNDILIB_API = 'Processing.NDI.Lib.x86.dll'; 38 | {$ENDIF} 39 | {$IFDEF WIN64} 40 | PROCESSINGNDILIB_API = 'Processing.NDI.Lib.x64.dll'; 41 | {$ENDIF} 42 | 43 | {$IFDEF WINDOWS} 44 | 45 | {$ENDIF} 46 | 47 | {$IFDEF UNIX} 48 | {$IFDEF DARWIN} 49 | PROCESSINGNDILIB_API = 'libndi.dylib'; 50 | {$ELSE} 51 | {$IFDEF FPC} 52 | PROCESSINGNDILIB_API = 'libndi.so'; 53 | {$ELSE} 54 | PROCESSINGNDILIB_API = 'libndi.so.0'; 55 | {$ENDIF} 56 | {$ENDIF} 57 | {$ENDIF} 58 | 59 | {$IFDEF MACOS} 60 | PROCESSINGNDILIB_API = 'libndi.dylib'; 61 | {$ENDIF} 62 | 63 | 64 | // Data structures shared by multiple SDKs 65 | {$I Processing.NDI.compat.pas} 66 | {$I Processing.NDI.structs.pas} 67 | 68 | // This is not actually required, but will start and end the libraries which might get 69 | // you slightly better performance in some cases. In general it is more "correct" to 70 | // call these although it is not required. There is no way to call these that would have 71 | // an adverse impact on anything (even calling destroy before you've deleted all your 72 | // objects). This will return false if the CPU is not sufficiently capable to run NDILib 73 | // currently NDILib requires SSE4.2 instructions (see documentation). You can verify 74 | // a specific CPU against the library with a call to NDIlib_is_supported_CPU() 75 | function NDIlib_initialize(): LongBool; 76 | cdecl; external PROCESSINGNDILIB_API; 77 | 78 | procedure NDIlib_destroy(); 79 | cdecl; external PROCESSINGNDILIB_API; 80 | 81 | function NDIlib_version(): PAnsiChar; 82 | cdecl; external PROCESSINGNDILIB_API; 83 | 84 | // Recover whether the current CPU in the system is capable of running NDILib. 85 | function NDIlib_is_supported_CPU(): LongBool; 86 | cdecl; external PROCESSINGNDILIB_API; 87 | 88 | // The finding (discovery API) 89 | {$I Processing.NDI.Find.pas} 90 | 91 | // The receiving video and audio API 92 | {$I Processing.NDI.Recv.pas} 93 | 94 | // Extensions to support PTZ control, etc... 95 | {$I Processing.NDI.Recv.ex.pas} 96 | 97 | // The sending video API 98 | {$I Processing.NDI.Send.pas} 99 | 100 | // The routing of inputs API 101 | {$I Processing.NDI.Routing.pas} 102 | 103 | // Utility functions 104 | {$I Processing.NDI.utilities.pas} 105 | 106 | // Deprecated structures and functions 107 | {$I Processing.NDI.deprecated.pas} 108 | 109 | // The frame synchronizer 110 | {$I Processing.NDI.FrameSync.pas} 111 | 112 | implementation 113 | 114 | end. 115 | 116 | -------------------------------------------------------------------------------- /Examples/NDIlib_Send_Video/Project1.dpr: -------------------------------------------------------------------------------- 1 | program Project1; 2 | 3 | {$APPTYPE CONSOLE} 4 | 5 | {$R *.res} 6 | 7 | uses 8 | WinApi.Windows, 9 | System.SysUtils, 10 | System.Types, 11 | Processing.NDI.Lib in '..\..\include\Processing.NDI.Lib.pas'; 12 | 13 | 14 | // We are going to create an NDI finder that locates sources on the network. 15 | // including ones that are available on this machine itself. It will use the default 16 | // groups assigned for the current machine. 17 | //const 18 | 19 | procedure FillColourBars(Buffer : PByte; Width: integer; Height: integer); 20 | const 21 | gColourBars : array[0..7] of cardinal = ($ffffffff, $ffffff00, $ff00ffff, $ff00ff00, $ffff00ff, $ffff0000, $ff0000ff, $ff000000); 22 | var 23 | x, y : integer; 24 | nextword : PByte; 25 | begin 26 | nextword := Buffer; 27 | // Fill in the buffer. It is likely that you would do something much smarter than this. 28 | for y := 0 to Height - 1 do 29 | for x := 0 to Width - 1 do 30 | begin 31 | pCardinal(nextword)^ := gColourBars[(x*8) div Width]; 32 | inc(pCardinal(nextword),1); 33 | end; 34 | end; 35 | 36 | var 37 | pNDI_send : pNDIlib_send_instance; 38 | NDI_send_create_desc : TNDIlib_send_create; 39 | NDI_connection_type : TNDIlib_metadata_frame; 40 | metadata_desc : TNDIlib_metadata_frame; 41 | NDI_tally : TNDIlib_tally; 42 | NDI_video_frame : TNDIlib_video_frame_v2; 43 | idx : integer; 44 | exit_loop : boolean; 45 | 46 | y,x : integer; 47 | p_image : pByte; 48 | line_idx : Integer; 49 | begin 50 | try 51 | // Not required, but "correct" (see the SDK documentation. 52 | if (not NDIlib_initialize()) then 53 | begin 54 | // Cannot run NDI. Most likely because the CPU is not sufficient (see SDK documentation). 55 | // you can check this directly with a call to NDIlib_is_supported_CPU() 56 | writeln('Cannot run NDI.'); 57 | exit; 58 | end; 59 | 60 | writeln(format('NDI Lib Version is %s', [NDIlib_version])); 61 | 62 | // Create an NDI source that is called "My Video" and is clocked to the video. 63 | FillChar(NDI_send_create_desc, sizeof(TNDIlib_send_create), $0); 64 | NDI_send_create_desc.p_groups := string.Empty; 65 | NDI_send_create_desc.p_ndi_name := PAnsiChar('FreeHand NDI Demo'); 66 | NDI_send_create_desc.clock_video := True; 67 | 68 | // We create the NDI sender 69 | pNDI_send := NDIlib_send_create(@NDI_send_create_desc); 70 | if not assigned(pNDI_send) then 71 | exit; 72 | 73 | // Provide a meta-data registration that allows people to know what we are. Note that this is optional. 74 | // Note that it is possible for senders to also register their preferred video formats. 75 | FillChar(NDI_connection_type, sizeof(TNDIlib_metadata_frame), $0); 76 | NDI_connection_type.p_data := ''; 83 | 84 | NDIlib_send_add_connection_metadata(pNDI_send, @NDI_connection_type); 85 | 86 | // We are going to create a 1920x1080 interlaced frame at 59.94Hz. 87 | FillChar(NDI_video_frame, SizeOf(TNDIlib_video_frame_v2), $0); 88 | NDI_video_frame.xres := 1920; 89 | NDI_video_frame.yres := 1080; 90 | NDI_video_frame.FourCC := NDIlib_FourCC_type_BGRA; 91 | NDI_video_frame.p_data := AllocMem(NDI_video_frame.xres * NDI_video_frame.yres * 4); 92 | NDI_video_frame.line_stride_in_bytes := 1920 * 4; 93 | 94 | 95 | 96 | // We will send 1000 frames of video. 97 | exit_loop := false; 98 | idx := 0; 99 | while not exit_loop do 100 | begin 101 | 102 | if (NDIlib_send_get_no_connections(pNDI_send, 10000) <= 0) then 103 | begin // Display status 104 | writeln(Format('No current connections, so no rendering needed (%d).', [idx])); 105 | end else 106 | begin 107 | FillChar(metadata_desc, sizeof(TNDIlib_metadata_frame), $0); 108 | if (NDIlib_send_capture(pNDI_send, @metadata_desc, 0) <> TNDIlib_frame_type.NDIlib_frame_type_none) then 109 | begin 110 | // For example, this might be a connection meta-data string that might include information 111 | // about preferred video formats. A full XML parser should be used here, this code is for 112 | // illustration purposes only 113 | 114 | //if (strncasecmp(metadata_desc.p_data, " 0 then 145 | p_image[3] := 255 else p_image[3]:= 128; 146 | 147 | inc(line_idx); 148 | inc(pCardinal(p_image),1); 149 | end; 150 | end; 151 | 152 | 153 | // We now submit the frame. Note that this call will be clocked so that we end up submitting at exactly 59.94fps 154 | NDIlib_send_send_video_v2(pNDI_send, @NDI_video_frame); 155 | 156 | // Just display something helpful 157 | if ((idx mod 100) = 0) then 158 | begin 159 | WriteLn(Format('Frame number %d sent. PGM:%s / PVW:%s', [1+idx, BoolTostr(NDI_tally.on_program, true), BoolToStr(NDI_tally.on_preview, true)])); 160 | end; 161 | 162 | inc(idx, 1); 163 | end; 164 | end; 165 | 166 | // Free the video frame 167 | FreeMem(NDI_video_frame.p_data); 168 | 169 | // Destroy the NDI sender 170 | NDIlib_send_destroy(pNDI_send); 171 | 172 | // Not required, but nice 173 | NDIlib_destroy(); 174 | 175 | except 176 | on E: Exception do 177 | Writeln(E.ClassName, ': ', E.Message); 178 | end; 179 | end. 180 | -------------------------------------------------------------------------------- /Bin/windows/x64/Processing.NDI.Lib.Licenses.txt: -------------------------------------------------------------------------------- 1 | ******************************************************************************************************** 2 | NewTek NDI 3 | Copyright(c) 2014-2020, NewTek, inc. 4 | ******************************************************************************************************** 5 | 6 | The NDI SDK license available at: 7 | http://new.tk/ndisdk_license/ 8 | 9 | The NDI Embedded SDK license is available at 10 | http://new.tk/ndisdk_embedded_license/ 11 | 12 | For more information about NDI please visit: 13 | http://ndi.tv/ 14 | 15 | This file should be included with all distribution of the binary files included with the NDI SDK. 16 | 17 | We are truly thankful for the NDI community and the amazing support that it has shown us over the years. 18 | 19 | ******************************************************************************************************** 20 | NDI gratefully uses the following third party libraries. 21 | 22 | ******************************************************************************************************** 23 | RAPIDJSON (https://rapidjson.org/) 24 | 25 | Tencent is pleased to support the open source community by making RapidJSON available. 26 | 27 | Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. 28 | 29 | Licensed under the MIT License (the "License"); you may not use this file except 30 | in compliance with the License. You may obtain a copy of the License at 31 | 32 | http://opensource.org/licenses/MIT 33 | 34 | Unless required by applicable law or agreed to in writing, software distributed 35 | under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 36 | CONDITIONS OF ANY KIND, either express or implied. See the License for the 37 | specific language governing permissions and limitations under the License. 38 | 39 | **************************************************** 40 | SPEEX (https://www.speex.org/), resampling code only. 41 | 42 | © 2002-2003, Jean-Marc Valin/Xiph.Org Foundation 43 | 44 | Redistribution and use in source and binary forms, with or without modification, are permitted provided 45 | that the following conditions are met: 46 | 47 | Redistributions of source code must retain the above copyright notice, this list of conditions and the 48 | following disclaimer. 49 | 50 | Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the 51 | following disclaimer in the documentation and/or other materials provided with the distribution. 52 | Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or 53 | promote products derived from this software without specific prior written permission. 54 | 55 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, 56 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 57 | ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 58 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 59 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 60 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 61 | USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 62 | 63 | ******************************************************************************************************** 64 | RapidXML (http://rapidxml.sourceforge.net/) 65 | 66 | Copyright (c) 2006, 2007 Marcin Kalicinski 67 | 68 | Permission is hereby granted, free of charge, to any person or organization 69 | obtaining a copy of the software and accompanying documentation covered by 70 | this license (the "Software") to use, reproduce, display, distribute, 71 | execute, and transmit the Software, and to prepare derivative works of the 72 | Software, and to permit third-parties to whom the Software is furnished to 73 | do so, all subject to the following: 74 | 75 | The copyright notices in the Software and this entire statement, including 76 | the above license grant, this restriction and the following disclaimer, 77 | must be included in all copies of the Software, in whole or in part, and 78 | all derivative works of the Software, unless such copies or derivative 79 | works are solely in the form of machine-executable object code generated by 80 | a source language processor. 81 | 82 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 83 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 84 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 85 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 86 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 87 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 88 | DEALINGS IN THE SOFTWARE. 89 | 90 | ******************************************************************************************************** 91 | CxxUrl (https://github.com/chmike/CxxUrl) 92 | 93 | The MIT License (MIT) 94 | 95 | Copyright (c) 2015 Christophe Meessen 96 | 97 | Permission is hereby granted, free of charge, to any person obtaining a copy 98 | of this software and associated documentation files (the "Software"), to deal 99 | in the Software without restriction, including without limitation the rights 100 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 101 | copies of the Software, and to permit persons to whom the Software is 102 | furnished to do so, subject to the following conditions: 103 | 104 | The above copyright notice and this permission notice shall be included in all 105 | copies or substantial portions of the Software. 106 | 107 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 108 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 109 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 110 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 111 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 112 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 113 | SOFTWARE. 114 | 115 | ******************************************************************************************************** 116 | ASIO (non Boost version) https://think-async.com/Asio/ 117 | 118 | Boost Software License - Version 1.0 - August 17th, 2003 119 | 120 | Permission is hereby granted, free of charge, to any person or organization 121 | obtaining a copy of the software and accompanying documentation covered by 122 | this license (the "Software") to use, reproduce, display, distribute, 123 | execute, and transmit the Software, and to prepare derivative works of the 124 | Software, and to permit third-parties to whom the Software is furnished to 125 | do so, all subject to the following: 126 | 127 | The copyright notices in the Software and this entire statement, including 128 | the above license grant, this restriction and the following disclaimer, 129 | must be included in all copies of the Software, in whole or in part, and 130 | all derivative works of the Software, unless such copies or derivative 131 | works are solely in the form of machine-executable object code generated by 132 | a source language processor. 133 | 134 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 135 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 136 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 137 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 138 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 139 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 140 | DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Bin/windows/x86/Processing.NDI.Lib.Licenses.txt: -------------------------------------------------------------------------------- 1 | ******************************************************************************************************** 2 | NewTek NDI 3 | Copyright(c) 2014-2020, NewTek, inc. 4 | ******************************************************************************************************** 5 | 6 | The NDI SDK license available at: 7 | http://new.tk/ndisdk_license/ 8 | 9 | The NDI Embedded SDK license is available at 10 | http://new.tk/ndisdk_embedded_license/ 11 | 12 | For more information about NDI please visit: 13 | http://ndi.tv/ 14 | 15 | This file should be included with all distribution of the binary files included with the NDI SDK. 16 | 17 | We are truly thankful for the NDI community and the amazing support that it has shown us over the years. 18 | 19 | ******************************************************************************************************** 20 | NDI gratefully uses the following third party libraries. 21 | 22 | ******************************************************************************************************** 23 | RAPIDJSON (https://rapidjson.org/) 24 | 25 | Tencent is pleased to support the open source community by making RapidJSON available. 26 | 27 | Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. 28 | 29 | Licensed under the MIT License (the "License"); you may not use this file except 30 | in compliance with the License. You may obtain a copy of the License at 31 | 32 | http://opensource.org/licenses/MIT 33 | 34 | Unless required by applicable law or agreed to in writing, software distributed 35 | under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 36 | CONDITIONS OF ANY KIND, either express or implied. See the License for the 37 | specific language governing permissions and limitations under the License. 38 | 39 | **************************************************** 40 | SPEEX (https://www.speex.org/), resampling code only. 41 | 42 | © 2002-2003, Jean-Marc Valin/Xiph.Org Foundation 43 | 44 | Redistribution and use in source and binary forms, with or without modification, are permitted provided 45 | that the following conditions are met: 46 | 47 | Redistributions of source code must retain the above copyright notice, this list of conditions and the 48 | following disclaimer. 49 | 50 | Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the 51 | following disclaimer in the documentation and/or other materials provided with the distribution. 52 | Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or 53 | promote products derived from this software without specific prior written permission. 54 | 55 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, 56 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 57 | ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 58 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 59 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 60 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 61 | USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 62 | 63 | ******************************************************************************************************** 64 | RapidXML (http://rapidxml.sourceforge.net/) 65 | 66 | Copyright (c) 2006, 2007 Marcin Kalicinski 67 | 68 | Permission is hereby granted, free of charge, to any person or organization 69 | obtaining a copy of the software and accompanying documentation covered by 70 | this license (the "Software") to use, reproduce, display, distribute, 71 | execute, and transmit the Software, and to prepare derivative works of the 72 | Software, and to permit third-parties to whom the Software is furnished to 73 | do so, all subject to the following: 74 | 75 | The copyright notices in the Software and this entire statement, including 76 | the above license grant, this restriction and the following disclaimer, 77 | must be included in all copies of the Software, in whole or in part, and 78 | all derivative works of the Software, unless such copies or derivative 79 | works are solely in the form of machine-executable object code generated by 80 | a source language processor. 81 | 82 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 83 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 84 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 85 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 86 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 87 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 88 | DEALINGS IN THE SOFTWARE. 89 | 90 | ******************************************************************************************************** 91 | CxxUrl (https://github.com/chmike/CxxUrl) 92 | 93 | The MIT License (MIT) 94 | 95 | Copyright (c) 2015 Christophe Meessen 96 | 97 | Permission is hereby granted, free of charge, to any person obtaining a copy 98 | of this software and associated documentation files (the "Software"), to deal 99 | in the Software without restriction, including without limitation the rights 100 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 101 | copies of the Software, and to permit persons to whom the Software is 102 | furnished to do so, subject to the following conditions: 103 | 104 | The above copyright notice and this permission notice shall be included in all 105 | copies or substantial portions of the Software. 106 | 107 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 108 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 109 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 110 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 111 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 112 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 113 | SOFTWARE. 114 | 115 | ******************************************************************************************************** 116 | ASIO (non Boost version) https://think-async.com/Asio/ 117 | 118 | Boost Software License - Version 1.0 - August 17th, 2003 119 | 120 | Permission is hereby granted, free of charge, to any person or organization 121 | obtaining a copy of the software and accompanying documentation covered by 122 | this license (the "Software") to use, reproduce, display, distribute, 123 | execute, and transmit the Software, and to prepare derivative works of the 124 | Software, and to permit third-parties to whom the Software is furnished to 125 | do so, all subject to the following: 126 | 127 | The copyright notices in the Software and this entire statement, including 128 | the above license grant, this restriction and the following disclaimer, 129 | must be included in all copies of the Software, in whole or in part, and 130 | all derivative works of the Software, unless such copies or derivative 131 | works are solely in the form of machine-executable object code generated by 132 | a source language processor. 133 | 134 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 135 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 136 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 137 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 138 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 139 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 140 | DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Examples/NDIlib_Find/Win64/Debug/Processing.NDI.Lib.Licenses.txt: -------------------------------------------------------------------------------- 1 | ******************************************************************************************************** 2 | NewTek NDI 3 | Copyright(c) 2014-2020, NewTek, inc. 4 | ******************************************************************************************************** 5 | 6 | The NDI SDK license available at: 7 | http://new.tk/ndisdk_license/ 8 | 9 | The NDI Embedded SDK license is available at 10 | http://new.tk/ndisdk_embedded_license/ 11 | 12 | For more information about NDI please visit: 13 | http://ndi.tv/ 14 | 15 | This file should be included with all distribution of the binary files included with the NDI SDK. 16 | 17 | We are truly thankful for the NDI community and the amazing support that it has shown us over the years. 18 | 19 | ******************************************************************************************************** 20 | NDI gratefully uses the following third party libraries. 21 | 22 | ******************************************************************************************************** 23 | RAPIDJSON (https://rapidjson.org/) 24 | 25 | Tencent is pleased to support the open source community by making RapidJSON available. 26 | 27 | Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. 28 | 29 | Licensed under the MIT License (the "License"); you may not use this file except 30 | in compliance with the License. You may obtain a copy of the License at 31 | 32 | http://opensource.org/licenses/MIT 33 | 34 | Unless required by applicable law or agreed to in writing, software distributed 35 | under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 36 | CONDITIONS OF ANY KIND, either express or implied. See the License for the 37 | specific language governing permissions and limitations under the License. 38 | 39 | **************************************************** 40 | SPEEX (https://www.speex.org/), resampling code only. 41 | 42 | © 2002-2003, Jean-Marc Valin/Xiph.Org Foundation 43 | 44 | Redistribution and use in source and binary forms, with or without modification, are permitted provided 45 | that the following conditions are met: 46 | 47 | Redistributions of source code must retain the above copyright notice, this list of conditions and the 48 | following disclaimer. 49 | 50 | Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the 51 | following disclaimer in the documentation and/or other materials provided with the distribution. 52 | Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or 53 | promote products derived from this software without specific prior written permission. 54 | 55 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, 56 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 57 | ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 58 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 59 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 60 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 61 | USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 62 | 63 | ******************************************************************************************************** 64 | RapidXML (http://rapidxml.sourceforge.net/) 65 | 66 | Copyright (c) 2006, 2007 Marcin Kalicinski 67 | 68 | Permission is hereby granted, free of charge, to any person or organization 69 | obtaining a copy of the software and accompanying documentation covered by 70 | this license (the "Software") to use, reproduce, display, distribute, 71 | execute, and transmit the Software, and to prepare derivative works of the 72 | Software, and to permit third-parties to whom the Software is furnished to 73 | do so, all subject to the following: 74 | 75 | The copyright notices in the Software and this entire statement, including 76 | the above license grant, this restriction and the following disclaimer, 77 | must be included in all copies of the Software, in whole or in part, and 78 | all derivative works of the Software, unless such copies or derivative 79 | works are solely in the form of machine-executable object code generated by 80 | a source language processor. 81 | 82 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 83 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 84 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 85 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 86 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 87 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 88 | DEALINGS IN THE SOFTWARE. 89 | 90 | ******************************************************************************************************** 91 | CxxUrl (https://github.com/chmike/CxxUrl) 92 | 93 | The MIT License (MIT) 94 | 95 | Copyright (c) 2015 Christophe Meessen 96 | 97 | Permission is hereby granted, free of charge, to any person obtaining a copy 98 | of this software and associated documentation files (the "Software"), to deal 99 | in the Software without restriction, including without limitation the rights 100 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 101 | copies of the Software, and to permit persons to whom the Software is 102 | furnished to do so, subject to the following conditions: 103 | 104 | The above copyright notice and this permission notice shall be included in all 105 | copies or substantial portions of the Software. 106 | 107 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 108 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 109 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 110 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 111 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 112 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 113 | SOFTWARE. 114 | 115 | ******************************************************************************************************** 116 | ASIO (non Boost version) https://think-async.com/Asio/ 117 | 118 | Boost Software License - Version 1.0 - August 17th, 2003 119 | 120 | Permission is hereby granted, free of charge, to any person or organization 121 | obtaining a copy of the software and accompanying documentation covered by 122 | this license (the "Software") to use, reproduce, display, distribute, 123 | execute, and transmit the Software, and to prepare derivative works of the 124 | Software, and to permit third-parties to whom the Software is furnished to 125 | do so, all subject to the following: 126 | 127 | The copyright notices in the Software and this entire statement, including 128 | the above license grant, this restriction and the following disclaimer, 129 | must be included in all copies of the Software, in whole or in part, and 130 | all derivative works of the Software, unless such copies or derivative 131 | works are solely in the form of machine-executable object code generated by 132 | a source language processor. 133 | 134 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 135 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 136 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 137 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 138 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 139 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 140 | DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Include/Processing.NDI.Send.pas: -------------------------------------------------------------------------------- 1 | {$ifndef PROCESSING_NDI_SEND_H} 2 | {$define PROCESSING_NDI_SEND_H} 3 | 4 | // NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation 5 | // for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or 6 | // online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license 7 | // terms. The full NDI SDK may be downloaded at http://ndi.tv/ 8 | // 9 | //************************************************************************************************************************************* 10 | // 11 | // Copyright(c) 2014-2020, NewTek, inc. 12 | // 13 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 14 | // files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, 15 | // merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is 16 | // furnished to do so, subject to the following conditions : 17 | // 18 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 19 | // 20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 22 | // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 | // 25 | //************************************************************************************************************************************* 26 | 27 | // Structures and type definitions required by NDI sending 28 | // The reference to an instance of the sender 29 | type 30 | pNDIlib_send_instance = Pointer; 31 | 32 | // The creation structure that is used when you are creating a sender 33 | type 34 | pNDIlib_send_create = ^TNDIlib_send_create; 35 | TNDIlib_send_create = record 36 | // The name of the NDI source to create. This is a NULL terminated UTF8 string. 37 | p_ndi_name: PAnsiChar; 38 | 39 | // What groups should this source be part of. NULL means default. 40 | p_groups: PAnsiChar; 41 | 42 | // Do you want audio and video to "clock" themselves. When they are clocked then 43 | // by adding video frames, they will be rate limited to match the current frame-rate 44 | // that you are submitting at. The same is true for audio. In general if you are submitting 45 | // video and audio off a single thread then you should only clock one of them (video is 46 | // probably the better of the two to clock off). If you are submitting audio and video 47 | // of separate threads then having both clocked can be useful. 48 | clock_video, clock_audio: LongBool 49 | end; 50 | 51 | // Create a new sender instance. This will return NULL if it fails. If you specify leave p_create_settings null then 52 | // the sender will be created with default settings. 53 | function NDIlib_send_create(p_create_settings: pNDIlib_send_create = nil): pNDIlib_send_instance; 54 | cdecl; external PROCESSINGNDILIB_API; 55 | 56 | // This will destroy an existing finder instance. 57 | procedure NDIlib_send_destroy(p_instance: pNDIlib_send_instance); 58 | cdecl; external PROCESSINGNDILIB_API; 59 | 60 | // This will add a video frame 61 | procedure NDIlib_send_send_video_v2(p_instance: pNDIlib_send_instance; p_video_data: pNDIlib_video_frame_v2); 62 | cdecl; external PROCESSINGNDILIB_API; 63 | 64 | // This will add a video frame and will return immediately, having scheduled the frame to be displayed. 65 | // All processing and sending of the video will occur asynchronously. The memory accessed by NDIlib_video_frame_t 66 | // cannot be freed or re-used by the caller until a synchronizing event has occurred. In general the API is better 67 | // able to take advantage of asynchronous processing than you might be able to by simple having a separate thread 68 | // to submit frames. 69 | // 70 | // This call is particularly beneficial when processing BGRA video since it allows any color conversion, compression 71 | // and network sending to all be done on separate threads from your main rendering thread. 72 | // 73 | // Synchronizing events are : 74 | // - a call to NDIlib_send_send_video 75 | // - a call to NDIlib_send_send_video_async with another frame to be sent 76 | // - a call to NDIlib_send_send_video with p_video_data=NULL 77 | // - a call to NDIlib_send_destroy 78 | procedure NDIlib_send_send_video_async_v2(p_instance: pNDIlib_send_instance; p_video_data: pNDIlib_video_frame_v2); 79 | cdecl; external PROCESSINGNDILIB_API; 80 | 81 | // This will add an audio frame 82 | procedure NDIlib_send_send_audio_v2(p_instance: pNDIlib_send_instance; p_audio_data: pNDIlib_audio_frame_v2); 83 | cdecl; external PROCESSINGNDILIB_API; 84 | 85 | // This will add an audio frame 86 | procedure NDIlib_send_send_audio_v3(p_instance: pNDIlib_send_instance; p_audio_data: pNDIlib_audio_frame_v3); 87 | cdecl; external PROCESSINGNDILIB_API; 88 | 89 | // This will add a metadata frame 90 | procedure NDIlib_send_send_metadata(p_instance: pNDIlib_send_instance; p_metadata: pNDIlib_metadata_frame); 91 | cdecl; external PROCESSINGNDILIB_API; 92 | 93 | // This allows you to receive metadata from the other end of the connection 94 | function NDIlib_send_capture( 95 | p_instance: pNDIlib_send_instance; // The instance data 96 | p_metadata: pNDIlib_metadata_frame; // The metadata received (can be NULL) 97 | timeout_in_ms: Cardinal): TNDIlib_frame_type; // The amount of time in milliseconds to wait for data. 98 | cdecl; external PROCESSINGNDILIB_API; 99 | 100 | // Free the buffers returned by capture for metadata 101 | procedure NDIlib_send_free_metadata(p_instance: pNDIlib_send_instance; p_metadata: pNDIlib_metadata_frame); 102 | cdecl; external PROCESSINGNDILIB_API; 103 | 104 | // Determine the current tally sate. If you specify a timeout then it will wait until it has changed, otherwise it will simply poll it 105 | // and return the current tally immediately. The return value is whether anything has actually change (true) or whether it timed out (false) 106 | function NDIlib_send_get_tally(p_instance: pNDIlib_send_instance; p_tally: pNDIlib_tally; timeout_in_ms: Cardinal): LongBool; 107 | cdecl; external PROCESSINGNDILIB_API; 108 | 109 | // 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. 110 | // 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 111 | // 0 then it will wait until there are connections for this amount of time. 112 | function NDIlib_send_get_no_connections(p_instance: pNDIlib_send_instance; timeout_in_ms: Cardinal): Integer; 113 | cdecl; external PROCESSINGNDILIB_API; 114 | 115 | // Connection based metadata is data that is sent automatically each time a new connection is received. You queue all of these 116 | // up and they are sent on each connection. To reset them you need to clear them all and set them up again. 117 | procedure NDIlib_send_clear_connection_metadata(p_instance: pNDIlib_send_instance); 118 | cdecl; external PROCESSINGNDILIB_API; 119 | 120 | // Add a connection metadata string to the list of what is sent on each new connection. If someone is already connected then 121 | // this string will be sent to them immediately. 122 | procedure NDIlib_send_add_connection_metadata(p_instance: pNDIlib_send_instance; p_metadata: pNDIlib_metadata_frame); 123 | cdecl; external PROCESSINGNDILIB_API; 124 | 125 | // This will assign a new fail-over source for this video source. What this means is that if this video source was to fail 126 | // any receivers would automatically switch over to use this source, unless this source then came back online. You can specify 127 | // NULL to clear the source. 128 | procedure NDIlib_send_set_failover(p_instance: pNDIlib_send_instance; p_failover_source: pNDIlib_source); 129 | cdecl; external PROCESSINGNDILIB_API; 130 | 131 | // Retrieve the source information for the given sender instance. This pointer is valid until NDIlib_send_destroy is called. 132 | function NDIlib_send_get_source_name(p_instance: pNDIlib_send_instance): pNDIlib_source; 133 | cdecl; external PROCESSINGNDILIB_API; 134 | 135 | {$endif} (* PROCESSING_NDI_SEND_H *) 136 | -------------------------------------------------------------------------------- /Include/Processing.NDI.utilities.pas: -------------------------------------------------------------------------------- 1 | {$ifndef PROCESSING_NDI_UTILITIES_H} 2 | {$define PROCESSING_NDI_UTILITIES_H} 3 | 4 | // NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation 5 | // for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or 6 | // online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license 7 | // terms. The full NDI SDK may be downloaded at http://ndi.tv/ 8 | // 9 | //************************************************************************************************************************************* 10 | // 11 | // Copyright(c) 2014-2020, NewTek, inc. 12 | // 13 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 14 | // files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, 15 | // merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is 16 | // furnished to do so, subject to the following conditions : 17 | // 18 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 19 | // 20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 22 | // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 | // 25 | //************************************************************************************************************************************* 26 | 27 | // Because many applications like submitting 16bit interleaved audio, these functions will convert in 28 | // and out of that format. It is important to note that the NDI SDK does define fully audio levels, something 29 | // that most applications that you use do not. Specifically, the floating point -1.0 to +1.0 range is defined 30 | // as a professional audio reference level of +4dBU. If we take 16bit audio and scale it into this range 31 | // it is almost always correct for sending and will cause no problems. For receiving however it is not at 32 | // all uncommon that the user has audio that exceeds reference level and in this case it is likely that audio 33 | // exceeds the reference level and so if you are not careful you will end up having audio clipping when 34 | // you use the 16 bit range. 35 | 36 | // This describes an audio frame 37 | type 38 | pNDIlib_audio_frame_interleaved_16s = ^TNDIlib_audio_frame_interleaved_16s; 39 | TNDIlib_audio_frame_interleaved_16s = record 40 | // The sample-rate of this buffer 41 | sample_rate : Integer; 42 | 43 | // The number of audio channels 44 | no_channels : Integer; 45 | 46 | // The number of audio samples per channel 47 | no_samples : Integer; 48 | 49 | // The timecode of this frame in 100ns intervals 50 | timecode: Int64; 51 | 52 | // The audio reference level in dB. This specifies how many dB above the reference level (+4dBU) is the full range of 16 bit audio. 53 | // If you do not understand this and want to just use numbers : 54 | // - If you are sending audio, specify +0dB. Most common applications produce audio at reference level. 55 | // - If receiving audio, specify +20dB. This means that the full 16 bit range corresponds to professional level audio with 20dB of headroom. Note that 56 | // if you are writing it into a file it might sound soft because you have 20dB of headroom before clipping. 57 | reference_level: Integer; 58 | 59 | // The audio data, interleaved 16bpp 60 | p_data : PShortInt; 61 | end; 62 | 63 | // This describes an audio frame 64 | type 65 | pNDIlib_audio_frame_interleaved_32s = ^TNDIlib_audio_frame_interleaved_32s; 66 | TNDIlib_audio_frame_interleaved_32s = record 67 | // The sample-rate of this buffer 68 | sample_rate: Integer; 69 | 70 | // The number of audio channels 71 | no_channels: Integer; 72 | 73 | // The number of audio samples per channel 74 | no_samples: Integer; 75 | 76 | // The timecode of this frame in 100ns intervals 77 | timecode: Int64; 78 | 79 | // The audio reference level in dB. This specifies how many dB above the reference level (+4dBU) is the full range of 16 bit audio. 80 | // If you do not understand this and want to just use numbers : 81 | // - If you are sending audio, specify +0dB. Most common applications produce audio at reference level. 82 | // - If receiving audio, specify +20dB. This means that the full 16 bit range corresponds to professional level audio with 20dB of headroom. Note that 83 | // if you are writing it into a file it might sound soft because you have 20dB of headroom before clipping. 84 | reference_level: Integer; 85 | 86 | // The audio data, interleaved 32bpp 87 | p_data: PInteger; 88 | end; 89 | 90 | // This describes an audio frame 91 | type 92 | pNDIlib_audio_frame_interleaved_32f = ^TNDIlib_audio_frame_interleaved_32f; 93 | TNDIlib_audio_frame_interleaved_32f = record 94 | // The sample-rate of this buffer 95 | sample_rate: Integer; 96 | 97 | // The number of audio channels 98 | no_channels: Integer; 99 | 100 | // The number of audio samples per channel 101 | no_samples: Integer; 102 | 103 | // The timecode of this frame in 100ns intervals 104 | timecode: Int64; 105 | 106 | // The audio data, interleaved 32bpp 107 | p_data: PSingle; 108 | end; 109 | 110 | 111 | // This will add an audio frame in interleaved 16bpp 112 | // This will add an audio frame 113 | procedure NDIlib_util_send_send_audio_interleaved_16s(p_instance: pNDIlib_send_instance; p_audio_data: pNDIlib_audio_frame_interleaved_16s); 114 | cdecl; external PROCESSINGNDILIB_API; 115 | 116 | // This will add an audio frame in interleaved 32bpp 117 | procedure NDIlib_util_send_send_audio_interleaved_32s(p_instance: pNDIlib_send_instance; p_audio_data: pNDIlib_audio_frame_interleaved_32s); 118 | cdecl; external PROCESSINGNDILIB_API; 119 | 120 | // This will add an audio frame in interleaved floating point 121 | procedure NDIlib_util_send_send_audio_interleaved_32f(p_instance: pNDIlib_send_instance; p_audio_data: pNDIlib_audio_frame_interleaved_32f); 122 | cdecl; external PROCESSINGNDILIB_API; 123 | 124 | // Convert to interleaved 16bpp 125 | procedure NDIlib_util_audio_to_interleaved_16s_v2(p_src: pNDIlib_audio_frame_v2; p_dst: pNDIlib_audio_frame_interleaved_16s); 126 | cdecl; external PROCESSINGNDILIB_API; 127 | 128 | // Convert from interleaved 16bpp 129 | procedure NDIlib_util_audio_from_interleaved_16s_v2(p_src: pNDIlib_audio_frame_interleaved_16s; p_dst: pNDIlib_audio_frame_v2); 130 | cdecl; external PROCESSINGNDILIB_API; 131 | 132 | // Convert to interleaved 32bpp 133 | procedure NDIlib_util_audio_to_interleaved_32s_v2(p_src: pNDIlib_audio_frame_v2; p_dst: pNDIlib_audio_frame_interleaved_32s); 134 | cdecl; external PROCESSINGNDILIB_API; 135 | 136 | // Convert from interleaved 32bpp 137 | procedure NDIlib_util_audio_from_interleaved_32s_v2(p_src: pNDIlib_audio_frame_interleaved_32s; p_dst: pNDIlib_audio_frame_v2); 138 | cdecl; external PROCESSINGNDILIB_API; 139 | 140 | // Convert to interleaved floating point 141 | procedure NDIlib_util_audio_to_interleaved_32f_v2(p_src: pNDIlib_audio_frame_v2; p_dst: pNDIlib_audio_frame_interleaved_32f); 142 | cdecl; external PROCESSINGNDILIB_API; 143 | 144 | // Convert from interleaved floating point 145 | procedure NDIlib_util_audio_from_interleaved_32f_v2(p_src: pNDIlib_audio_frame_interleaved_32f; p_dst: pNDIlib_audio_frame_v2); 146 | cdecl; external PROCESSINGNDILIB_API; 147 | 148 | // This is a helper function that you may use to convert from 10bit packed UYVY into 16bit semi-planar. The FourCC on the source 149 | // is ignored in this function since we do not define a V210 format in NDI. You must make sure that there is memory and a stride 150 | // allocated in p_dst. 151 | procedure NDIlib_util_V210_to_P216(p_src_v210: pNDIlib_video_frame_v2; p_dst_p216: pNDIlib_video_frame_v2); 152 | cdecl; external PROCESSINGNDILIB_API; 153 | 154 | // This converts from 16bit semi-planar to 10bit. You must make sure that there is memory and a stride allocated in p_dst. 155 | procedure NDIlib_util_P216_to_V210(p_src_p216: pNDIlib_video_frame_v2; p_dst_v210: pNDIlib_video_frame_v2); 156 | cdecl; external PROCESSINGNDILIB_API; 157 | 158 | {$endif} (* PROCESSING_NDI_UTILITIES_H *) 159 | -------------------------------------------------------------------------------- /Include/Processing.NDI.deprecated.pas: -------------------------------------------------------------------------------- 1 | {$ifndef PROCESSING_NDI_DEPRECATED_H} 2 | {$define PROCESSING_NDI_DEPRECATED_H} 3 | // NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation 4 | // for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or 5 | // online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license 6 | // terms. The full NDI SDK may be downloaded at http://ndi.tv/ 7 | // 8 | //************************************************************************************************************************************* 9 | // 10 | // Copyright(c) 2014-2020, NewTek, inc. 11 | // 12 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 13 | // files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, 14 | // merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is 15 | // furnished to do so, subject to the following conditions : 16 | // 17 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 21 | // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | // 24 | //************************************************************************************************************************************* 25 | 26 | // This describes a video frame 27 | type 28 | pNDIlib_video_frame = ^TNDIlib_video_frame; 29 | TNDIlib_video_frame = record 30 | // The resolution of this frame 31 | xres, yres : Cardinal; 32 | 33 | // What FourCC this is with. This can be two values 34 | FourCC : TNDIlib_FourCC_type; 35 | 36 | // What is the frame-rate of this frame. 37 | // For instance NTSC is 30000,1001 = 30000/1001 = 29.97fps 38 | frame_rate_N, frame_rate_D : Integer; 39 | 40 | // What is the picture aspect ratio of this frame. 41 | // For instance 16.0/9.0 = 1.778 is 16:9 video 42 | picture_aspect_ratio : Single; 43 | 44 | // Is this a fielded frame, or is it progressive 45 | is_progressive : integer; 46 | 47 | // The timecode of this frame in 100ns intervals 48 | timecode : Int64; 49 | 50 | // The video data itself 51 | p_data : PByte; 52 | 53 | // The inter line stride of the video data, in bytes. 54 | line_stride_in_bytes: Integer; 55 | end; 56 | 57 | // This describes an audio frame 58 | type 59 | pNDIlib_audio_frame = ^TNDIlib_audio_frame; 60 | TNDIlib_audio_frame = record 61 | // The sample-rate of this buffer 62 | sample_rate: Integer; 63 | 64 | // The number of audio channels 65 | no_channels: Integer; 66 | 67 | // The number of audio samples per channel 68 | no_samples: Integer; 69 | 70 | // The timecode of this frame in 100ns intervals 71 | timecode: int64; 72 | 73 | // The audio data 74 | p_data: PSingle; 75 | 76 | // The inter channel stride of the audio channels, in bytes 77 | channel_stride_in_bytes: Integer; 78 | end; 79 | 80 | // For legacy reasons I called this the wrong thing. For backwards compatibility. 81 | function NDIlib_find_create2(p_create_settings: pNDIlib_find_create = nil): pNDIlib_find_instance; 82 | cdecl; external PROCESSINGNDILIB_API; deprecated; 83 | 84 | function NDIlib_find_create(p_create_settings: pNDIlib_find_create = nil): pNDIlib_find_instance; 85 | cdecl; external PROCESSINGNDILIB_API; deprecated; 86 | 87 | 88 | // DEPRECATED. This function is basically exactly the following and was confusing to use. 89 | // if ((!timeout_in_ms) || (NDIlib_find_wait_for_sources(timeout_in_ms))) 90 | // return NDIlib_find_get_current_sources(p_instance, p_no_sources); 91 | // return NULL; 92 | function NDIlib_find_get_sources(p_instance: pNDIlib_find_instance; var p_no_sources: Cardinal; const timeout_in_ms: Cardinal): pNDIlib_source; 93 | cdecl; external PROCESSINGNDILIB_API; deprecated; 94 | 95 | // The creation structure that is used when you are creating a receiver 96 | type 97 | pNDIlib_recv_create = ^TNDIlib_recv_create; 98 | TNDIlib_recv_create = record 99 | // The source that you wish to connect to. 100 | source_to_connect_to : TNDIlib_source; 101 | 102 | // Your preference of color space. See above. 103 | color_format : TNDIlib_recv_color_format; 104 | 105 | // The bandwidth setting that you wish to use for this video source. Bandwidth 106 | // controlled by changing both the compression level and the resolution of the source. 107 | // A good use for low bandwidth is working on WIFI connections. 108 | bandwidth : TNDIlib_recv_bandwidth; 109 | 110 | // When this flag is FALSE, all video that you receive will be progressive. For sources 111 | // that provide fields, this is de-interlaced on the receiving side (because we cannot change 112 | // what the up-stream source was actually rendering. This is provided as a convenience to 113 | // down-stream sources that do not wish to understand fielded video. There is almost no 114 | // performance impact of using this function. 115 | allow_video_fields : LongBool; 116 | end; 117 | 118 | // This function is deprecated, please use NDIlib_recv_create_v3 if you can. Using this function will continue to work, and be 119 | // supported for backwards compatibility. If the input parameter is NULL it will be created with default settings and an automatically 120 | // determined receiver name, 121 | function NDIlib_recv_create_v2(p_create_settings: pNDIlib_recv_create): pNDIlib_recv_instance; 122 | cdecl; external PROCESSINGNDILIB_API; deprecated; 123 | 124 | // For legacy reasons I called this the wrong thing. For backwards compatibility. If the input parameter is NULL it will be created with 125 | // default settings and an automatically determined receiver name. 126 | function NDIlib_recv_create2(p_create_settings: pNDIlib_recv_create): pNDIlib_recv_instance; 127 | cdecl; external PROCESSINGNDILIB_API; deprecated; 128 | 129 | // This function is deprecated, please use NDIlib_recv_create_v3 if you can. Using this function will continue to work, and be 130 | // supported for backwards compatibility. This version sets bandwidth to highest and allow fields to true. If the input parameter is NULL it 131 | // will be created with default settings and an automatically determined receiver name. 132 | function NDIlib_recv_create(p_create_settings: pNDIlib_recv_create): pNDIlib_recv_instance; 133 | cdecl; external PROCESSINGNDILIB_API; deprecated; 134 | 135 | // This will allow you to receive video, audio and metadata frames. 136 | // Any of the buffers can be NULL, in which case data of that type 137 | // will not be captured in this call. This call can be called simultaneously 138 | // on separate threads, so it is entirely possible to receive audio, video, metadata 139 | // all on separate threads. This function will return NDIlib_frame_type_none if no 140 | // data is received within the specified timeout and NDIlib_frame_type_error if the connection is lost. 141 | // Buffers captured with this must be freed with the appropriate free function below. 142 | function NDIlib_recv_capture( 143 | p_instance: pNDIlib_recv_instance; // The library instance 144 | p_video_data: pNDIlib_video_frame; // The video data received (can be NULL) 145 | p_audio_data: pNDIlib_audio_frame; // The audio data received (can be NULL) 146 | p_metadata: pNDIlib_metadata_frame; // The metadata received (can be NULL) 147 | const timeout_in_ms: cardinal): TNDIlib_frame_type; // The amount of time in milliseconds to wait for data. 148 | cdecl; external PROCESSINGNDILIB_API; deprecated; 149 | 150 | // Free the buffers returned by capture for video 151 | procedure NDIlib_recv_free_video(p_instance: pNDIlib_recv_instance; p_video_data: pNDIlib_video_frame); 152 | cdecl; external PROCESSINGNDILIB_API; deprecated; 153 | 154 | // Free the buffers returned by capture for audio 155 | procedure NDIlib_recv_free_audio(p_instance: pNDIlib_recv_instance; p_audio_data: pNDIlib_audio_frame); 156 | cdecl; external PROCESSINGNDILIB_API; deprecated; 157 | 158 | // This will add a video frame 159 | procedure NDIlib_send_send_video(p_instance: pNDIlib_recv_instance; p_video_data : pNDIlib_video_frame); 160 | cdecl; external PROCESSINGNDILIB_API; deprecated; 161 | 162 | // This will add a video frame and will return immediately, having scheduled the frame to be displayed. 163 | // All processing and sending of the video will occur asynchronously. The memory accessed by NDIlib_video_frame_t 164 | // cannot be freed or re-used by the caller until a synchronizing event has occurred. In general the API is better 165 | // able to take advantage of asynchronous processing than you might be able to by simple having a separate thread 166 | // to submit frames. 167 | // 168 | // This call is particularly beneficial when processing BGRA video since it allows any color conversion, compression 169 | // and network sending to all be done on separate threads from your main rendering thread. 170 | // 171 | // Synchronizing events are : 172 | // - a call to NDIlib_send_send_video 173 | // - a call to NDIlib_send_send_video_async with another frame to be sent 174 | // - a call to NDIlib_send_send_video with p_video_data=NULL 175 | // - a call to NDIlib_send_destroy 176 | procedure NDIlib_send_send_video_async(p_instance: pNDIlib_send_instance; p_video_data: pNDIlib_video_frame); 177 | cdecl; external PROCESSINGNDILIB_API; deprecated; 178 | 179 | // This will add an audio frame 180 | procedure NDIlib_send_send_audio(p_instance: pNDIlib_send_instance; p_audio_data: pNDIlib_audio_frame); 181 | cdecl; external PROCESSINGNDILIB_API; deprecated; 182 | 183 | // Convert an planar floating point audio buffer into a interleaved short audio buffer. 184 | // IMPORTANT : You must allocate the space for the samples in the destination to allow for your own memory management. 185 | procedure NDIlib_util_audio_to_interleaved_16s(p_src: pNDIlib_audio_frame; p_dst: pNDIlib_audio_frame_interleaved_16s); 186 | cdecl; external PROCESSINGNDILIB_API; deprecated; 187 | 188 | // Convert an interleaved short audio buffer audio buffer into a planar floating point one. 189 | // IMPORTANT : You must allocate the space for the samples in the destination to allow for your own memory management. 190 | procedure NDIlib_util_audio_from_interleaved_16s(p_src: pNDIlib_audio_frame_interleaved_16s; p_dst: pNDIlib_audio_frame); 191 | cdecl; external PROCESSINGNDILIB_API; deprecated; 192 | 193 | // Convert an planar floating point audio buffer into a interleaved floating point audio buffer. 194 | // IMPORTANT : You must allocate the space for the samples in the destination to allow for your own memory management. 195 | 196 | procedure NDIlib_util_audio_to_interleaved_32f(p_src: pNDIlib_audio_frame; p_dst: pNDIlib_audio_frame_interleaved_32f); 197 | cdecl; external PROCESSINGNDILIB_API; deprecated; 198 | 199 | // Convert an interleaved floating point audio buffer into a planar floating point one. 200 | // IMPORTANT : You must allocate the space for the samples in the destination to allow for your own memory management. 201 | procedure NDIlib_util_audio_from_interleaved_32f(p_src: pNDIlib_audio_frame_interleaved_32f; p_dst: pNDIlib_audio_frame); 202 | cdecl; external PROCESSINGNDILIB_API; deprecated; 203 | 204 | {$endif} (* PROCESSING_NDI_DEPRECATED_H *) 205 | -------------------------------------------------------------------------------- /Include/Processing.NDI.Recv.ex.pas: -------------------------------------------------------------------------------- 1 | {$ifndef PROCESSING_NDI_RECV_EX_H} 2 | {$define PROCESSING_NDI_RECV_EX_H} 3 | 4 | 5 | // NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation 6 | // for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or 7 | // online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license 8 | // terms. The full NDI SDK may be downloaded at http://ndi.tv/ 9 | // 10 | //************************************************************************************************************************************* 11 | // 12 | // Copyright(c) 2014-2020, NewTek, inc. 13 | // 14 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 15 | // files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, 16 | // merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is 17 | // furnished to do so, subject to the following conditions : 18 | // 19 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 20 | // 21 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 23 | // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 | // 26 | //************************************************************************************************************************************* 27 | 28 | // Has this receiver got PTZ control. Note that it might take a second or two after the connection for this value to be set. 29 | // To avoid the need to poll this function, you can know when the value of this function might have changed when the 30 | // NDILib_recv_capture* call would return NDIlib_frame_type_status_change 31 | function NDIlib_recv_ptz_is_supported(p_instance: pNDIlib_recv_instance): LongBool; 32 | cdecl; external PROCESSINGNDILIB_API; 33 | 34 | // Has this receiver got recording control. Note that it might take a second or two after the connection for this value to be set. 35 | // To avoid the need to poll this function, you can know when the value of this function might have changed when the 36 | // NDILib_recv_capture* call would return NDIlib_frame_type_status_change 37 | // 38 | // Note on deprecation of this function : 39 | // NDI version 4 includes the native ability to record all NDI streams using an external application that is provided with the 40 | // SDK. This is better in many ways than the internal recording support which only ever supported remotely recording systems 41 | // and NDI|HX. This functionality will be supported in the SDK for some time although we are recommending that you use the 42 | // newer support which is more feature rich and supports the recording of all stream types, does not take CPU time to record 43 | // NDI sources (it does not require any type of re-compression since it can just store the data in the file), it will synchronize 44 | // all recorders on a system (and cross systems if NTP clock locking is used). 45 | function NDIlib_recv_recording_is_supported(p_instance: pNDIlib_recv_instance): LongBool; 46 | cdecl; external PROCESSINGNDILIB_API; 47 | 48 | // PTZ Controls 49 | // Zoom to an absolute value. 50 | // zoom_value = 0.0 (zoomed in) ... 1.0 (zoomed out) 51 | function NDIlib_recv_ptz_zoom(p_instance: pNDIlib_recv_instance; const zoom_value: Single): LongBool; 52 | cdecl; external PROCESSINGNDILIB_API; 53 | 54 | // Zoom at a particular speed 55 | // zoom_speed = -1.0 (zoom outwards) ... +1.0 (zoom inwards) 56 | function NDIlib_recv_ptz_zoom_speed(p_instance: pNDIlib_recv_instance; const zoom_speed: Single): LongBool; 57 | cdecl; external PROCESSINGNDILIB_API; 58 | 59 | // Set the pan and tilt to an absolute value 60 | // pan_value = -1.0 (left) ... 0.0 (centered) ... +1.0 (right) 61 | // tilt_value = -1.0 (bottom) ... 0.0 (centered) ... +1.0 (top) 62 | function NDIlib_recv_ptz_pan_tilt(p_instance: pNDIlib_recv_instance; const pan_value: Single; const tilt_value: Single): LongBool; 63 | cdecl; external PROCESSINGNDILIB_API; 64 | 65 | // Set the pan and tilt direction and speed 66 | // pan_speed = -1.0 (moving right) ... 0.0 (stopped) ... +1.0 (moving left) 67 | // tilt_speed = -1.0 (down) ... 0.0 (stopped) ... +1.0 (moving up) 68 | function NDIlib_recv_ptz_pan_tilt_speed(p_instance: pNDIlib_recv_instance; const pan_speed: Single; const tilt_speed: Single): LongBool; 69 | cdecl; external PROCESSINGNDILIB_API; 70 | 71 | // Store the current position, focus, etc... as a preset. 72 | // preset_no = 0 ... 99 73 | function NDIlib_recv_ptz_store_preset(p_instance: pNDIlib_recv_instance; const preset_no: Integer): LongBool; 74 | cdecl; external PROCESSINGNDILIB_API; 75 | 76 | // Recall a preset, including position, focus, etc... 77 | // preset_no = 0 ... 99 78 | // speed = 0.0(as slow as possible) ... 1.0(as fast as possible) The speed at which to move to the new preset 79 | function NDIlib_recv_ptz_recall_preset(p_instance: pNDIlib_recv_instance; const preset_no: Integer; const speed: Single): LongBool; 80 | cdecl; external PROCESSINGNDILIB_API; 81 | 82 | // Put the camera in auto-focus 83 | function NDIlib_recv_ptz_auto_focus(p_instance: pNDIlib_recv_instance): LongBool; 84 | cdecl; external PROCESSINGNDILIB_API; 85 | 86 | // Focus to an absolute value. 87 | // focus_value = 0.0 (focused to infinity) ... 1.0 (focused as close as possible) 88 | function NDIlib_recv_ptz_focus(p_instance: pNDIlib_recv_instance; const focus_value: Single): LongBool; 89 | cdecl; external PROCESSINGNDILIB_API; 90 | 91 | // Focus at a particular speed 92 | // focus_speed = -1.0 (focus outwards) ... +1.0 (focus inwards) 93 | function NDIlib_recv_ptz_focus_speed(p_instance: pNDIlib_recv_instance; const focus_speed: Single): LongBool; 94 | cdecl; external PROCESSINGNDILIB_API; 95 | 96 | // Put the camera in auto white balance mode 97 | function NDIlib_recv_ptz_white_balance_auto(p_instance: pNDIlib_recv_instance): LongBool; 98 | cdecl; external PROCESSINGNDILIB_API; 99 | 100 | // Put the camera in indoor white balance 101 | function NDIlib_recv_ptz_white_balance_indoor(p_instance: pNDIlib_recv_instance): LongBool; 102 | cdecl; external PROCESSINGNDILIB_API; 103 | 104 | // Put the camera in indoor white balance 105 | function NDIlib_recv_ptz_white_balance_outdoor(p_instance: pNDIlib_recv_instance): LongBool; 106 | cdecl; external PROCESSINGNDILIB_API; 107 | 108 | // Use the current brightness to automatically set the current white balance 109 | function NDIlib_recv_ptz_white_balance_oneshot(p_instance: pNDIlib_recv_instance): LongBool; 110 | cdecl; external PROCESSINGNDILIB_API; 111 | 112 | // Set the manual camera white balance using the R, B values 113 | // red = 0.0(not red) ... 1.0(very red) 114 | // blue = 0.0(not blue) ... 1.0(very blue) 115 | function NDIlib_recv_ptz_white_balance_manual(p_instance: pNDIlib_recv_instance; const red: Single; const blue: Single): LongBool; 116 | cdecl; external PROCESSINGNDILIB_API; 117 | 118 | // Put the camera in auto-exposure mode 119 | function NDIlib_recv_ptz_exposure_auto(p_instance: pNDIlib_recv_instance): LongBool; 120 | cdecl; external PROCESSINGNDILIB_API; 121 | 122 | // Manually set the camera exposure 123 | // exposure_level = 0.0(dark) ... 1.0(light) 124 | function NDIlib_recv_ptz_exposure_manual(p_instance: pNDIlib_recv_instance; exposure_level: Single): LongBool; 125 | cdecl; external PROCESSINGNDILIB_API; 126 | 127 | // Recording control 128 | // 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 129 | // 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 130 | // not present, a name will be chosen automatically. If you do not with to provide a filename hint you can simply pass NULL. 131 | // 132 | // See note above on depreciation and why this is, and how to replace this functionality. 133 | function NDIlib_recv_recording_start(p_instance: pNDIlib_recv_instance; p_filename_hint: PAnsiChar): LongBool; 134 | cdecl; external PROCESSINGNDILIB_API; deprecated; 135 | 136 | // Stop recording. 137 | // 138 | // See note above on depreciation and why this is, and how to replace this functionality. 139 | function NDIlib_recv_recording_stop(p_instance: pNDIlib_recv_instance): LongBool; 140 | cdecl; external PROCESSINGNDILIB_API; deprecated; 141 | 142 | // 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 143 | // controlling audio levels.For instance, a digital audio device would not be able to avoid clipping on sources already at the wrong level, thus 144 | // might not support this message. 145 | // 146 | // See note above on depreciation and why this is, and how to replace this functionality. 147 | function NDIlib_recv_recording_set_audio_level(p_instance: pNDIlib_recv_instance; level_dB: Single): LongBool; 148 | cdecl; external PROCESSINGNDILIB_API; deprecated; 149 | 150 | // 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 151 | // one recorded and multiple people might be connected to it, there is a chance that it is recording which was initiated by someone else. 152 | // 153 | // See note above on depreciation and why this is, and how to replace this functionality. 154 | function NDIlib_recv_recording_is_recording(p_instance: pNDIlib_recv_instance): LongBool; 155 | cdecl; external PROCESSINGNDILIB_API; deprecated; 156 | 157 | // 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. 158 | // 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) 159 | // 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 160 | // filename. This will remain valid even after the file has stopped being recorded until the next file is started. 161 | function NDIlib_recv_recording_get_filename(p_instance: pNDIlib_recv_instance): PAnsiChar; 162 | cdecl; external PROCESSINGNDILIB_API; deprecated; 163 | 164 | // 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 165 | // freed using NDIlib_recv_free_string. When there is no error it will return NULL. 166 | // 167 | // See note above on depreciation and why this is, and how to replace this functionality. 168 | function NDIlib_recv_recording_get_error(p_instance: pNDIlib_recv_instance): PAnsiChar; 169 | cdecl; external PROCESSINGNDILIB_API; deprecated; 170 | 171 | // In order to get the duration 172 | type 173 | pNDIlib_recv_recording_time = ^TNDIlib_recv_recording_time; 174 | TNDIlib_recv_recording_time = record 175 | // The number of actual video frames recorded. 176 | no_frames: Int64; 177 | 178 | // The starting time and current largest time of the record, in UTC time, at 100ns unit intervals. This allows you to know the record 179 | // time irrespective of frame-rate. For instance, last_time - start_time would give you the recording length in 100ns intervals. 180 | start_time, last_time: Int64; 181 | end; 182 | 183 | // Get the current recording times. 184 | // 185 | // See note above on depreciation and why this is, and how to replace this functionality. 186 | function NDIlib_recv_recording_get_times(p_instance: pNDIlib_recv_instance; p_times: pNDIlib_recv_recording_time): LongBool; 187 | cdecl; external PROCESSINGNDILIB_API; deprecated; 188 | 189 | {$endif} (* PROCESSING_NDI_RECV_EX_H *) 190 | -------------------------------------------------------------------------------- /Include/Processing.NDI.FrameSync.pas: -------------------------------------------------------------------------------- 1 | {$ifndef PROCESSING_NDI_FRAMESYNC_H} 2 | {$define PROCESSING_NDI_FRAMESYNC_H} 3 | 4 | 5 | // NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation 6 | // for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or 7 | // online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license 8 | // terms. The full NDI SDK may be downloaded at http://ndi.tv/ 9 | // 10 | //************************************************************************************************************************************* 11 | // 12 | // Copyright(c) 2014-2020, NewTek, inc. 13 | // 14 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 15 | // files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, 16 | // merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is 17 | // furnished to do so, subject to the following conditions : 18 | // 19 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 20 | // 21 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 23 | // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 | // 26 | //************************************************************************************************************************************* 27 | 28 | // It is important when using video to realize that often you are using difference clocks 29 | // for different parts of the signal chain. Within NDI, the sender can send at the clock rate 30 | // that it wants and the receiver will receive it at that rate. The receiver however is very 31 | // unlikely to share the exact same clock rate in many cases. For instance, bear in mind that 32 | // computer clocks rely on crystals which while all rated for the same frequency are still not 33 | // exact. If you sending computer has an audio clock that it "thinks" is 48000Hz, to the receiver 34 | // computer that has a different audio clock this might be 48001Hz or 47998Hz. While these 35 | // differences might appear small they accumulate over time and can cause audio to either 36 | // slightly drift out of sync (it is receiving more audio sample than it needs to play back) 37 | // or might cause audio glitches because it is not receiving enough audio samples. While we 38 | // have described the situation for audio, the same exact problem occurs for video sources; 39 | // it is commonly thought that this can be solved by simply having a "frame buffer" and that 40 | // displaying the "most recently received video frame" will solve these timing discrepancies. 41 | // Unfortunately this is not the case and when it is done because of the variance in clock 42 | // timings, it is very common the video will appear the "jitter" when the sending and 43 | // receiving clocks are almost in alignment. The solution to these problems is to implement 44 | // a "time base corrector" for the video clock which is a device that uses hysteresis to know 45 | // when the best time is to either drop or insert a video frame such that the video is most 46 | // likely to play back smoothly, and audio should be dynamically audio sampled (with a high 47 | // order resampling filter) to adaptively track any clocking differences. Implementing these 48 | // components is very difficult to get entirely correct under all scenarios and this 49 | // implementation is provided to facilitate this and help people who are building real time 50 | // video applications to receive audio and video without needing to undertake the full 51 | // complexity of implementing such clock devices. 52 | // 53 | // Another way to look at what this class does is that it transforms "push" sources (i.e. 54 | // NDI sources in which the data is pushed from the sender to the receiver) into "pull" 55 | // sources in which a host application is pulling the data down-stream. The frame-sync 56 | // automatically tracks all clocks to achieve the best video performance doing this 57 | // operation. 58 | // 59 | // In addition to time-base correction operations, these implementations also will automatically 60 | // detect and correct timing jitter that might occur. This will internally correct for timing 61 | // anomalies that might be caused by network, sender or receiver side timing errors caused 62 | // by CPU limitations, network bandwidth fluctuations, etc... 63 | // 64 | // A very common use of a frame-synchronizer might be if you are displaying video on screen 65 | // timed to the GPU v-sync, you should use such a device to convert from the incoming time-base 66 | // into the time-base of the GPU. 67 | // 68 | // The following are common times that you want to use a frame-synchronizer 69 | // Video playback on screen : Yes, you want the clock to be synced with vertical refresh. 70 | // Audio playback through sound card : Yes you want the clock to be synced with your sound card clock. 71 | // Video mixing : Yes you want the input video clocks to all be synced to your output video clock. 72 | // Audio mixing : Yes, you want all input audio clocks to be brought into sync with your output audio clock. 73 | // Recording a single channel : No, you want to record the signal in it's raw form without any re-clocking. 74 | // Recording multiple channels : Maybe. If you want to sync some input channels to match a master clock so that 75 | // they can be ISO edited, then you might want a frame-sync. 76 | 77 | // The type instance for a frame-synchronizer 78 | type 79 | pNDIlib_framesync_instance = Pointer; 80 | 81 | // Create a frame synchronizer instance that can be used to get frames 82 | // from a receiver. Once this receiver has been bound to a frame-sync 83 | // then you should use it in order to receive video frames. You can 84 | // continue to use the underlying receiver for other operations (tally, 85 | // PTZ, etc...). Note that it remains your responsibility to destroy the 86 | // receiver even when a frame-sync is using it. You should always destroy 87 | // the receiver after the frame-sync has been destroyed. 88 | function NDIlib_framesync_create(p_receiver: pNDIlib_recv_instance): pNDIlib_framesync_instance; 89 | cdecl; external PROCESSINGNDILIB_API; 90 | 91 | // Destroy a frame-sync implementation 92 | procedure NDIlib_framesync_destroy(p_instance: pNDIlib_framesync_instance); 93 | cdecl; external PROCESSINGNDILIB_API; 94 | 95 | // This function will pull audio samples from the frame-sync queue. This function 96 | // will always return data immediately, inserting silence if no current audio 97 | // data is present. You should call this at the rate that you want audio and it 98 | // will automatically adapt the incoming audio signal to match the rate at which 99 | // you are calling by using dynamic audio sampling. Note that you have no obligation 100 | // that your requested sample rate, no channels and no samples match the incoming signal 101 | // and all combinations of conversions are supported. 102 | // 103 | // If you wish to know what the current incoming audio format is, then you can make a call 104 | // with the parameters set to zero and it will then return the associated settings. For instance 105 | // a call as follows : 106 | // NDIlib_framesync_capture_audio(p_instance, p_audio_data, 0, 0, 0); 107 | // 108 | // will return in p_audio_data the current received audio format if there is one or sample-rate 109 | // and no_channels equal to zero if there is not one. At any time you can specify sample_rate and 110 | // no_channels as zero and it will return the current received audio format. 111 | procedure NDIlib_framesync_capture_audio(// The frame sync instance data 112 | p_instance: pNDIlib_framesync_instance; 113 | // The destination audio buffer that you wish to have filled in. 114 | p_audio_data: pNDIlib_audio_frame_v2; 115 | // Your desired sample rate, number of channels and the number of desired samples. 116 | sample_rate: Integer; no_channels: Integer; no_samples: Integer); 117 | cdecl; external PROCESSINGNDILIB_API; 118 | 119 | procedure NDIlib_framesync_capture_audio_v2(// The frame sync instance data 120 | p_instance: pNDIlib_framesync_instance; 121 | // The destination audio buffer that you wish to have filled in. 122 | p_audio_data: pNDIlib_audio_frame_v3; 123 | // Your desired sample rate, number of channels and the number of desired samples. 124 | sample_rate: Integer; no_channels: Integer; no_samples: Integer); 125 | cdecl; external PROCESSINGNDILIB_API; 126 | 127 | // Free audio returned by NDIlib_framesync_capture_audio 128 | procedure NDIlib_framesync_free_audio(// The frame sync instance data 129 | p_instance: pNDIlib_framesync_instance; 130 | // The destination audio buffer that you wish to have filled in. 131 | p_audio_data: pNDIlib_audio_frame_v2); 132 | cdecl; external PROCESSINGNDILIB_API; 133 | 134 | procedure NDIlib_framesync_free_audio_v2(// The frame sync instance data 135 | p_instance: pNDIlib_framesync_instance; 136 | // The destination audio buffer that you wish to have filled in. 137 | p_audio_data: pNDIlib_audio_frame_v3); 138 | cdecl; external PROCESSINGNDILIB_API; 139 | 140 | // This function will tell you the approximate current depth of the audio queue to give you an indication 141 | // of the number of audio samples you can request. Note that if you should treat the results of this function 142 | // with some care because in reality the frame-sync API is meant to dynamically resample audio to match the 143 | // rate that you are calling it. If you have an innacurate clock then this functon can be useful. 144 | // for instance : 145 | // 146 | // while(true) 147 | // { int no_samples = NDIlib_framesync_audio_queue_depth(p_instance); 148 | // NDIlib_framesync_capture_audio( ... ); 149 | // play_audio( ... ) 150 | // NDIlib_framesync_free_audio( ... ) 151 | // inaccurate_sleep( 33ms ); 152 | // } 153 | // 154 | // Obviously because audio is being received in real-time there is no guarantee after the call that the 155 | // number is correct since new samples might have been captured in that time. On syncronous use of this 156 | // function however this will be the minimum number of samples in the queue at any later time until 157 | // NDIlib_framesync_capture_audio is called. 158 | function NDIlib_framesync_audio_queue_depth(p_instance: pNDIlib_framesync_instance): Integer; 159 | cdecl; external PROCESSINGNDILIB_API; 160 | 161 | // This function will pull video samples from the frame-sync queue. This function 162 | // will always immediately return a video sample by using time-base correction. You can 163 | // specify the desired field type which is then used to return the best possible frame. 164 | // Note that field based frame-synchronization means that the frame-synchronizer attempts 165 | // to match the fielded input phase with the frame requests so that you have the most 166 | // correct possible field ordering on output. Note that the same frame can be returned 167 | // multiple times. 168 | // 169 | // If no video frame has ever been received, this will return NDIlib_video_frame_v2_t as 170 | // an empty (all zero) structure. The reason for this is that it allows you to determine 171 | // that there has not yet been any video and act accordingly. For instance you might want 172 | // to display a constant frame output at a particular video format, or black. 173 | Procedure NDIlib_framesync_capture_video( // The frame sync instance data 174 | p_instance: pNDIlib_framesync_instance; 175 | // The destination audio buffer that you wish to have filled in. 176 | p_video_data: pNDIlib_video_frame_v2; 177 | // The frame type that you would prefer, all effort is made to match these. 178 | field_type: TNDIlib_frame_format_type = NDIlib_frame_format_type_progressive); 179 | cdecl; external PROCESSINGNDILIB_API; 180 | 181 | // Free audio returned by NDIlib_framesync_capture_video 182 | Procedure NDIlib_framesync_free_video( // The frame sync instance data 183 | p_instance: pNDIlib_framesync_instance; 184 | // The destination audio buffer that you wish to have filled in. 185 | p_video_data: pNDIlib_video_frame_v2); 186 | cdecl; external PROCESSINGNDILIB_API; 187 | 188 | {$endif} (* PROCESSING_NDI_FRAMESYNC_H *) 189 | -------------------------------------------------------------------------------- /Include/Processing.NDI.structs.pas: -------------------------------------------------------------------------------- 1 | {$ifndef PROCESSING_NDI_STRUCTS_H} 2 | {$define PROCESSING_NDI_STRUCTS_H} 3 | 4 | type 5 | // An enumeration to specify the type of a packet returned by the functions 6 | TNDIlib_frame_type = ( 7 | NDIlib_frame_type_none = $00000000, 8 | NDIlib_frame_type_video = $00000001, 9 | NDIlib_frame_type_audio = $00000002, 10 | NDIlib_frame_type_metadata = $00000003, 11 | NDIlib_frame_type_error = $00000004, 12 | 13 | // This indicates that the settings on this input have changed. 14 | // For instance, this value will be returned from NDIlib_recv_capture_v2 and NDIlib_recv_capture 15 | // when the device is known to have new settings, for instance the web URL has changed or the device 16 | // is now known to be a PTZ camera. 17 | NDIlib_frame_type_status_change = 100, 18 | 19 | // Ensure that the size is 32bits 20 | NDIlib_frame_type_max = $7fffffff 21 | ); 22 | 23 | // FourCC values for video frames 24 | TNDIlib_FourCC_video_type = ( 25 | NDIlib_FourCC_video_type_UYVY = (ord('Y') or (ord('V') shl 8) or (ord('Y') shl 16) or (ord('U') shl 24)), //YVYU 26 | NDIlib_FourCC_type_UYVY = NDIlib_FourCC_video_type_UYVY, 27 | 28 | // YCbCr + Alpha color space, using 4:2:2:4. 29 | // In memory there are two separate planes. The first is a regular 30 | // UYVY 4:2:2 buffer. Immediately following this in memory is a 31 | // alpha channel buffer. 32 | NDIlib_FourCC_video_type_UYVA = (ord('U') or (ord('Y') shl 8) or (ord('V') shl 16) or (ord('A') shl 24)), //NDI_LIB_FOURCC('U', 'Y', 'V', 'A'), 33 | NDIlib_FourCC_type_UYVA = NDIlib_FourCC_video_type_UYVA, 34 | 35 | // YCbCr color space using 4:2:2 in 16bpp 36 | // In memory this is a semi-planar format. This is identical to a 16bpp 37 | // version of the NV16 format. 38 | // The first buffer is a 16bpp luminance buffer. 39 | // Immediately after this is an interleaved buffer of 16bpp Cb, Cr pairs. 40 | NDIlib_FourCC_video_type_P216 = (ord('P') or (ord('2') shl 8) or (ord('1') shl 16) or (ord('6') shl 24)), //NDI_LIB_FOURCC('P', '2', '1', '6'), 41 | NDIlib_FourCC_type_P216 = NDIlib_FourCC_video_type_P216, 42 | 43 | // YCbCr color space with an alpha channel, using 4:2:2:4 44 | // In memory this is a semi-planar format. 45 | // The first buffer is a 16bpp luminance buffer. 46 | // Immediately after this is an interleaved buffer of 16bpp Cb, Cr pairs. 47 | // Immediately after is a single buffer of 16bpp alpha channel. 48 | NDIlib_FourCC_video_type_PA16 = (ord('P') or (ord('A') shl 8) or (ord('1') shl 16) or (ord('6') shl 24)), //NDI_LIB_FOURCC('P', 'A', '1', '6'), 49 | NDIlib_FourCC_type_PA16 = NDIlib_FourCC_video_type_PA16, 50 | 51 | // Planar 8bit 4:2:0 video format. 52 | // The first buffer is an 8bpp luminance buffer. 53 | // Immediately following this is a 8bpp Cr buffer. 54 | // Immediately following this is a 8bpp Cb buffer. 55 | NDIlib_FourCC_video_type_YV12 = (ord('Y') or (ord('V') shl 8) or (ord('1') shl 16) or (ord('2') shl 24)), //NDI_LIB_FOURCC('Y', 'V', '1', '2'), 56 | NDIlib_FourCC_type_YV12 = NDIlib_FourCC_video_type_YV12, 57 | 58 | // The first buffer is an 8bpp luminance buffer. 59 | // Immediately following this is a 8bpp Cb buffer. 60 | // Immediately following this is a 8bpp Cr buffer. 61 | NDIlib_FourCC_video_type_I420 = (ord('I') or (ord('4') shl 8) or (ord('2') shl 16) or (ord('0') shl 24)), //NDI_LIB_FOURCC('I', '4', '2', '0'), 62 | NDIlib_FourCC_type_I420 = NDIlib_FourCC_video_type_I420, 63 | 64 | // Planar 8bit 4:2:0 video format. 65 | // The first buffer is an 8bpp luminance buffer. 66 | // Immediately following this is in interleaved buffer of 8bpp Cb, Cr pairs 67 | NDIlib_FourCC_video_type_NV12 = (ord('N') or (ord('V') shl 8) or (ord('1') shl 16) or (ord('2') shl 24)), //NDI_LIB_FOURCC('N', 'V', '1', '2'), 68 | NDIlib_FourCC_type_NV12 = NDIlib_FourCC_video_type_NV12, 69 | 70 | // Planar 8bit, 4:4:4:4 video format. 71 | // Color ordering in memory is blue, green, red, alpha 72 | NDIlib_FourCC_video_type_BGRA = (ord('B') or (ord('G') shl 8) or (ord('R') shl 16) or (ord('A') shl 24)), //NDI_LIB_FOURCC('B', 'G', 'R', 'A'), 73 | NDIlib_FourCC_type_BGRA = NDIlib_FourCC_video_type_BGRA, 74 | 75 | // Planar 8bit, 4:4:4 video format, packed into 32bit pixels. 76 | // Color ordering in memory is blue, green, red, 255 77 | NDIlib_FourCC_video_type_BGRX = (ord('B') or (ord('G') shl 8) or (ord('R') shl 16) or (ord('X') shl 24)), //NDI_LIB_FOURCC('B', 'G', 'R', 'X'), 78 | NDIlib_FourCC_type_BGRX = NDIlib_FourCC_video_type_BGRX, 79 | 80 | // Planar 8bit, 4:4:4:4 video format. 81 | // Color ordering in memory is red, green, blue, alpha 82 | NDIlib_FourCC_video_type_RGBA = (ord('R') or (ord('G') shl 8) or (ord('B') shl 16) or (ord('A') shl 24)), //NDI_LIB_FOURCC('R', 'G', 'B', 'A'), 83 | NDIlib_FourCC_type_RGBA = NDIlib_FourCC_video_type_RGBA, 84 | 85 | // Planar 8bit, 4:4:4 video format, packed into 32bit pixels. 86 | // Color ordering in memory is red, green, blue, 255 87 | NDIlib_FourCC_video_type_RGBX = (ord('R') or (ord('G') shl 8) or (ord('B') shl 16) or (ord('X') shl 24)), //NDI_LIB_FOURCC('R', 'G', 'B', 'X'), 88 | NDIlib_FourCC_type_RGBX = NDIlib_FourCC_video_type_RGBX, 89 | 90 | // Ensure that the size is 32bits 91 | NDIlib_FourCC_video_type_max = $7fffffff 92 | ); 93 | 94 | // Really for backwards compatibility 95 | type 96 | TNDIlib_FourCC_type = TNDIlib_FourCC_video_type; 97 | 98 | // FourCC values for audio frames 99 | TNDIlib_FourCC_audio_type = 100 | ( 101 | // Planar 32-bit floating point. Be sure to specify the channel stride. 102 | NDIlib_FourCC_audio_type_FLTP = (ord('F') or (ord('L') shl 8) or (ord('T') shl 16) or (ord('P') shl 24)), //NDI_LIB_FOURCC('F', 'L', 'T', 'p'), 103 | NDIlib_FourCC_type_FLTP = NDIlib_FourCC_audio_type_FLTP, 104 | 105 | // Ensure that the size is 32bits 106 | NDIlib_FourCC_audio_type_max = $7fffffff 107 | ); 108 | 109 | TNDIlib_frame_format_type = 110 | ( 111 | // A progressive frame 112 | NDIlib_frame_format_type_progressive = 1, 113 | 114 | // A fielded frame with the field 0 being on the even lines and field 1 being 115 | // on the odd lines/ 116 | NDIlib_frame_format_type_interleaved = 0, 117 | 118 | // Individual fields 119 | NDIlib_frame_format_type_field_0 = 2, 120 | NDIlib_frame_format_type_field_1 = 3, 121 | 122 | // Ensure that the size is 32bits 123 | NDIlib_frame_format_type_max = $7fffffff 124 | ); 125 | 126 | 127 | // When you specify this as a timecode, the timecode will be synthesized for you. This may 128 | // be used when sending video, audio or metadata. If you never specify a timecode at all, 129 | // asking for each to be synthesized, then this will use the current system time as the 130 | // starting timecode and then generate synthetic ones, keeping your streams exactly in 131 | // sync as long as the frames you are sending do not deviate from the system time in any 132 | // meaningful way. In practice this means that if you never specify timecodes that they 133 | // will always be generated for you correctly. Timecodes coming from different senders on 134 | // the same machine will always be in sync with each other when working in this way. If you 135 | // have NTP installed on your local network, then streams can be synchronized between 136 | // multiple machines with very high precision. 137 | // 138 | // If you specify a timecode at a particular frame (audio or video), then ask for all subsequent 139 | // ones to be synthesized. The subsequent ones will be generated to continue this sequence 140 | // maintaining the correct relationship both the between streams and samples generated, avoiding 141 | // them deviating in time from the timecode that you specified in any meaningful way. 142 | // 143 | // If you specify timecodes on one stream (e.g. video) and ask for the other stream (audio) to 144 | // be synthesized, the correct timecodes will be generated for the other stream and will be synthesize 145 | // exactly to match (they are not quantized inter-streams) the correct sample positions. 146 | // 147 | // When you send metadata messages and ask for the timecode to be synthesized, then it is chosen 148 | // to match the closest audio or video frame timecode so that it looks close to something you might 149 | // want ... unless there is no sample that looks close in which a timecode is synthesized from the 150 | // last ones known and the time since it was sent. 151 | // 152 | const 153 | NDIlib_send_timecode_synthesize : int64 = 9223372036854775807; 154 | 155 | // If the time-stamp is not available (i.e. a version of a sender before v2.5) 156 | NDIlib_recv_timestamp_undefined :int64 = 9223372036854775807; 157 | 158 | 159 | // This is a descriptor of a NDI source available on the network. 160 | type 161 | pNDIlib_source = ^TNDIlib_source; 162 | TNDIlib_source = record 163 | // A UTF8 string that provides a user readable name for this source. 164 | // This can be used for serialization, etc... and comprises the machine 165 | // name and the source name on that machine. In the form 166 | // MACHINE_NAME (NDI_SOURCE_NAME) 167 | // If you specify this parameter either as NULL, or an EMPTY string then the 168 | // specific IP address and port number from below is used. 169 | p_ndi_name : PAnsiChar; 170 | 171 | // A UTF8 string that provides the actual network address and any parameters. 172 | // This is not meant to be application readable and might well change in the future. 173 | // This can be NULL if you do not know it and the API internally will instantiate 174 | // a finder that is used to discover it even if it is not yet available on the network. 175 | 176 | // The current way of addressing the value 177 | p_url_address : PAnsiChar; 178 | 179 | end; 180 | 181 | // This describes a video frame 182 | type 183 | pNDIlib_video_frame_v2 = ^TNDIlib_video_frame_v2; 184 | TNDIlib_video_frame_v2 = record 185 | // The resolution of this frame 186 | xres, yres : Integer; 187 | 188 | // What FourCC this is with. This can be two values 189 | FourCC : TNDIlib_FourCC_video_type; 190 | 191 | // What is the frame-rate of this frame. 192 | // For instance NTSC is 30000,1001 = 30000/1001 = 29.97fps 193 | frame_rate_N, frame_rate_D : Integer; 194 | 195 | // What is the picture aspect ratio of this frame. 196 | // For instance 16.0/9.0 = 1.778 is 16:9 video 197 | picture_aspect_ratio : Single; 198 | 199 | // Is this a fielded frame, or is it progressive 200 | frame_format_type: TNDIlib_frame_format_type; 201 | 202 | // The timecode of this frame in 100ns intervals 203 | timecode: Int64; 204 | 205 | // The video data itself 206 | p_data: PByte; 207 | 208 | // If the FourCC is not a compressed type, then this will be the 209 | // inter-line stride of the video data in bytes. If the stride is 0, 210 | // then it will default to sizeof(one pixel)*xres. 211 | line_stride_in_bytes: Integer; 212 | 213 | // Per frame metadata for this frame. This is a NULL terminated UTF8 string 214 | // that should be in XML format. If you do not want any metadata then you 215 | // may specify NULL here. 216 | p_metadata: PAnsiChar; // Present in >= v2.5 217 | 218 | // This is only valid when receiving a frame and is specified as a 100ns 219 | // time that was the exact moment that the frame was submitted by the 220 | // sending side and is generated by the SDK. If this value is 221 | // NDIlib_recv_timestamp_undefined then this value is not available and 222 | // is NDIlib_recv_timestamp_undefined. 223 | timestamp: Int64; // Present in >= v2.5 224 | end; 225 | 226 | // This describes an audio frame 227 | type 228 | pNDIlib_audio_frame_v2 = ^TNDIlib_audio_frame_v2; 229 | TNDIlib_audio_frame_v2 = record 230 | // The sample-rate of this buffer 231 | sample_rate: Integer; 232 | 233 | // The number of audio channels 234 | no_channels: Integer; 235 | 236 | // The number of audio samples per channel 237 | no_samples: Integer; 238 | 239 | // The timecode of this frame in 100ns intervals 240 | timecode: int64; 241 | 242 | // The audio data 243 | p_data: PSingle; 244 | 245 | // The inter channel stride of the audio channels, in bytes 246 | channel_stride_in_bytes: Integer; 247 | 248 | // Per frame metadata for this frame. This is a NULL terminated UTF8 string 249 | // that should be in XML format. If you do not want any metadata then you 250 | // may specify NULL here. 251 | p_metadata: PAnsiChar; // Present in >= v2.5 252 | 253 | // This is only valid when receiving a frame and is specified as a 100ns 254 | // time that was the exact moment that the frame was submitted by the 255 | // sending side and is generated by the SDK. If this value is 256 | // NDIlib_recv_timestamp_undefined then this value is not available and 257 | // is NDIlib_recv_timestamp_undefined. 258 | timestamp: Int64; // Present in >= v2.5 259 | end; 260 | 261 | // This describes an audio frame 262 | type 263 | pNDIlib_audio_frame_v3 = ^TNDIlib_audio_frame_v3; 264 | TNDIlib_audio_frame_v3 = record 265 | // The sample-rate of this buffer 266 | sample_rate: Integer; 267 | 268 | // The number of audio channels 269 | no_channels: Integer; 270 | 271 | // The number of audio samples per channel 272 | no_samples: Integer; 273 | 274 | // The timecode of this frame in 100ns intervals 275 | timecode: Int64; 276 | 277 | // What FourCC describing the type of data for this frame 278 | FourCC: TNDIlib_FourCC_audio_type; 279 | 280 | // The audio data 281 | p_data: PByte; 282 | 283 | // If the FourCC is not a compressed type and the audio format is planar, 284 | // then this will be the stride in bytes for a single channel. 285 | channel_stride_in_bytes: Integer; 286 | 287 | // Per frame metadata for this frame. This is a NULL terminated UTF8 string 288 | // that should be in XML format. If you do not want any metadata then you 289 | // may specify NULL here. 290 | p_metadata: PAnsiChar; 291 | 292 | // This is only valid when receiving a frame and is specified as a 100ns 293 | // time that was the exact moment that the frame was submitted by the 294 | // sending side and is generated by the SDK. If this value is 295 | // NDIlib_recv_timestamp_undefined then this value is not available and 296 | // is NDIlib_recv_timestamp_undefined. 297 | timestamp: Int64; 298 | end; 299 | 300 | // The data description for metadata 301 | type 302 | pNDIlib_metadata_frame = ^TNDIlib_metadata_frame; 303 | TNDIlib_metadata_frame = record 304 | // The length of the string in UTF8 characters. This includes the NULL terminating character. 305 | // If this is 0, then the length is assume to be the length of a NULL terminated string. 306 | length: Integer; 307 | 308 | // The timecode of this frame in 100ns intervals 309 | timecode: int64; 310 | 311 | // The metadata as a UTF8 XML string. This is a NULL terminated string. 312 | p_data: PAnsiChar; 313 | end; 314 | 315 | // Tally structures 316 | type 317 | pNDIlib_tally = ^TNDIlib_tally; 318 | TNDIlib_tally = record 319 | // Is this currently on program output 320 | on_program: LongBool; 321 | 322 | // Is this currently on preview output 323 | on_preview: LongBool; 324 | end; 325 | 326 | 327 | {$endif} (* PROCESSING_NDI_STRUCTS_H *) 328 | -------------------------------------------------------------------------------- /Include/Processing.NDI.Recv.pas: -------------------------------------------------------------------------------- 1 | {$ifndef PROCESSING_NDI_RECV_H} 2 | {$define PROCESSING_NDI_RECV_H} 3 | 4 | // NOTE : The following MIT license applies to this file ONLY and not to the SDK as a whole. Please review the SDK documentation 5 | // for the description of the full license terms, which are also provided in the file "NDI License Agreement.pdf" within the SDK or 6 | // online at http://new.tk/ndisdk_license/. Your use of any part of this SDK is acknowledgment that you agree to the SDK license 7 | // terms. The full NDI SDK may be downloaded at http://ndi.tv/ 8 | // 9 | //************************************************************************************************************************************* 10 | // 11 | // Copyright(c) 2014-2020, NewTek, inc. 12 | // 13 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 14 | // files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, 15 | // merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is 16 | // furnished to do so, subject to the following conditions : 17 | // 18 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 19 | // 20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 22 | // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 | // 25 | //************************************************************************************************************************************* 26 | 27 | // Structures and type definitions required by NDI finding 28 | // The reference to an instance of the receiver 29 | type 30 | pNDIlib_recv_instance = Pointer; 31 | 32 | TNDIlib_recv_bandwidth = ( 33 | NDIlib_recv_bandwidth_metadata_only = -10, // Receive metadata. 34 | NDIlib_recv_bandwidth_audio_only = 10, // Receive metadata, audio. 35 | NDIlib_recv_bandwidth_lowest = 0, // Receive metadata, audio, video at a lower bandwidth and resolution. 36 | NDIlib_recv_bandwidth_highest = 100, // Receive metadata, audio, video at full resolution. 37 | 38 | // Ensure this is 32bits in size 39 | NDIlib_recv_bandwidth_max = $7fffffff 40 | ); 41 | 42 | TNDIlib_recv_color_format = ( 43 | // When there is no alpha channel, this mode delivers BGRX 44 | // When there is an alpha channel, this mode delivers BGRA 45 | NDIlib_recv_color_format_BGRX_BGRA = 0, 46 | 47 | // When there is no alpha channel, this mode delivers UYVY 48 | // When there is an alpha channel, this mode delivers BGRA 49 | NDIlib_recv_color_format_UYVY_BGRA = 1, 50 | 51 | // When there is no alpha channel, this mode delivers BGRX 52 | // When there is an alpha channel, this mode delivers RGBA 53 | NDIlib_recv_color_format_RGBX_RGBA = 2, 54 | 55 | // When there is no alpha channel, this mode delivers UYVY 56 | // When there is an alpha channel, this mode delivers RGBA 57 | NDIlib_recv_color_format_UYVY_RGBA = 3, 58 | 59 | // This format will try to decode the video using the fastest available color format for the incoming 60 | // video signal. This format follows the following guidelines, although different platforms might 61 | // vary slightly based on their capabilities and specific performance profiles. In general if you want 62 | // the best performance this mode should be used. 63 | // 64 | // When using this format, you should consider than allow_video_fields is true, and individual fields 65 | // will always be delivered. 66 | // 67 | // For most video sources on most platforms, this will follow the following conventions 68 | // No alpha channel : UYVY 69 | // Alpha channel : UYVA 70 | NDIlib_recv_color_format_fastest = 100, 71 | 72 | // This format will try to provide the video in the format that is the closest to native for the incoming 73 | // codec yielding the highest quality. Specifically, this allows for receiving on 16bpp color from many 74 | // sources. 75 | // 76 | // When using this format, you should consider than allow_video_fields is true, and individual fields 77 | // will always be delivered. 78 | // 79 | // For most video sources on most platforms, this will follow the following conventions 80 | // No alpha channel : P216, or UYVY 81 | // Alpha channel : PA16 or UYVA 82 | NDIlib_recv_color_format_best = 101, 83 | 84 | // Legacy definitions for backwards compatibility 85 | NDIlib_recv_color_format_e_BGRX_BGRA = NDIlib_recv_color_format_BGRX_BGRA, 86 | NDIlib_recv_color_format_e_UYVY_BGRA = NDIlib_recv_color_format_UYVY_BGRA, 87 | NDIlib_recv_color_format_e_RGBX_RGBA = NDIlib_recv_color_format_RGBX_RGBA, 88 | NDIlib_recv_color_format_e_UYVY_RGBA = NDIlib_recv_color_format_UYVY_RGBA, 89 | 90 | {$IFDEF WIN32} 91 | // For Windows we can support flipped images which is unfortunately something that Microsoft decided to do 92 | // back in the old days. 93 | NDIlib_recv_color_format_BGRX_BGRA_flipped = 1000 + NDIlib_recv_color_format_BGRX_BGRA, 94 | {$ENDIF} 95 | 96 | // Force the size to be 32bits 97 | NDIlib_recv_color_format_max = $7fffffff 98 | ); 99 | 100 | // The creation structure that is used when you are creating a receiver 101 | type 102 | pNDIlib_recv_create_v3 = ^TNDIlib_recv_create_v3; 103 | TNDIlib_recv_create_v3 = record 104 | // The source that you wish to connect to. 105 | source_to_connect_to: TNDIlib_source; 106 | 107 | // Your preference of color space. See above. 108 | color_format: TNDIlib_recv_color_format; 109 | 110 | // The bandwidth setting that you wish to use for this video source. Bandwidth 111 | // controlled by changing both the compression level and the resolution of the source. 112 | // A good use for low bandwidth is working on WIFI connections. 113 | bandwidth: TNDIlib_recv_bandwidth; 114 | 115 | // When this flag is FALSE, all video that you receive will be progressive. For sources 116 | // that provide fields, this is de-interlaced on the receiving side (because we cannot change 117 | // what the up-stream source was actually rendering. This is provided as a convenience to 118 | // down-stream sources that do not wish to understand fielded video. There is almost no 119 | // performance impact of using this function. 120 | allow_video_fields: LongBool; 121 | 122 | // The name of the NDI receiver to create. This is a NULL terminated UTF8 string and should be 123 | // the name of receive channel that you have. This is in many ways symmetric with the name of 124 | // senders, so this might be "Channel 1" on your system. If this is NULL then it will use the 125 | // filename of your application indexed with the number of the instance number of this receiver. 126 | p_ndi_recv_name: PAnsiChar; 127 | 128 | 129 | end; 130 | 131 | // This allows you determine the current performance levels of the receiving to be able to detect whether frames have been dropped 132 | type 133 | pNDIlib_recv_performance = ^TNDIlib_recv_performance; 134 | TNDIlib_recv_performance = record 135 | // The number of video frames 136 | video_frames: Int64; 137 | 138 | // The number of audio frames 139 | audio_frames: Int64; 140 | 141 | // The number of metadata frames 142 | metadata_frames: Int64; 143 | end; 144 | 145 | // Get the current queue depths 146 | type 147 | pNDIlib_recv_queue = ^TNDIlib_recv_queue; 148 | TNDIlib_recv_queue = record 149 | video_frames: Integer; 150 | 151 | // The number of audio frames 152 | audio_frames: Integer; 153 | 154 | // The number of metadata frames 155 | metadata_frames: Integer; 156 | end; 157 | 158 | //************************************************************************************************************************** 159 | // Create a new receiver instance. This will return NULL if it fails. If you create this with the default settings (NULL) 160 | // then it will automatically determine a receiver name. 161 | function NDIlib_recv_create_v3(p_create_settings: pNDIlib_recv_create_v3 = nil): pNDIlib_recv_instance; 162 | cdecl; external PROCESSINGNDILIB_API; 163 | 164 | // This will destroy an existing receiver instance. 165 | procedure NDIlib_recv_destroy(p_instance: pNDIlib_recv_instance); 166 | cdecl; external PROCESSINGNDILIB_API; 167 | 168 | // This function allows you to change the connection to another video source, you can also disconnect it by specifying a NULL here. 169 | // This allows you to preserve a receiver without needing to 170 | procedure NDIlib_recv_connect(p_instance: pNDIlib_recv_instance; p_src: pNDIlib_source = nil); 171 | cdecl; external PROCESSINGNDILIB_API; 172 | 173 | // This will allow you to receive video, audio and metadata frames. 174 | // Any of the buffers can be NULL, in which case data of that type 175 | // will not be captured in this call. This call can be called simultaneously 176 | // on separate threads, so it is entirely possible to receive audio, video, metadata 177 | // all on separate threads. This function will return NDIlib_frame_type_none if no 178 | // data is received within the specified timeout and NDIlib_frame_type_error if the connection is lost. 179 | // Buffers captured with this must be freed with the appropriate free function below. 180 | function NDIlib_recv_capture_v2( 181 | p_instance: pNDIlib_recv_instance; // The library instance 182 | p_video_data: pNDIlib_video_frame_v2; // The video data received (can be NULL) 183 | p_audio_data: pNDIlib_audio_frame_v2; // The audio data received (can be NULL) 184 | p_metadata: pNDIlib_metadata_frame; // The metadata received (can be NULL) 185 | timeout_in_ms: Cardinal): TNDIlib_frame_type; // The amount of time in milliseconds to wait for data. 186 | cdecl; external PROCESSINGNDILIB_API; 187 | 188 | // This will allow you to receive video, audio and metadata frames. 189 | // Any of the buffers can be NULL, in which case data of that type 190 | // will not be captured in this call. This call can be called simultaneously 191 | // on separate threads, so it is entirely possible to receive audio, video, metadata 192 | // all on separate threads. This function will return NDIlib_frame_type_none if no 193 | // data is received within the specified timeout and NDIlib_frame_type_error if the connection is lost. 194 | // Buffers captured with this must be freed with the appropriate free function below. 195 | function NDIlib_recv_capture_v3( 196 | p_instance: pNDIlib_recv_instance; // The library instance 197 | p_video_data: pNDIlib_video_frame_v2; // The video data received (can be NULL) 198 | p_audio_data: pNDIlib_audio_frame_v3; // The audio data received (can be NULL) 199 | p_metadata: pNDIlib_metadata_frame; // The metadata received (can be NULL) 200 | timeout_in_ms: Cardinal): TNDIlib_frame_type; // The amount of time in milliseconds to wait for data. 201 | cdecl; external PROCESSINGNDILIB_API; 202 | 203 | // Free the buffers returned by capture for video 204 | procedure NDIlib_recv_free_video_v2(p_instance: pNDIlib_recv_instance; p_video_data: pNDIlib_video_frame_v2); 205 | cdecl; external PROCESSINGNDILIB_API; 206 | 207 | // Free the buffers returned by capture for audio 208 | procedure NDIlib_recv_free_audio_v2(p_instance: pNDIlib_recv_instance; p_audio_data: pNDIlib_audio_frame_v2); 209 | cdecl; external PROCESSINGNDILIB_API; 210 | 211 | // Free the buffers returned by capture for audio 212 | procedure NDIlib_recv_free_audio_v3(p_instance: pNDIlib_recv_instance; p_audio_data: pNDIlib_audio_frame_v3); 213 | cdecl; external PROCESSINGNDILIB_API; 214 | 215 | // Free the buffers returned by capture for metadata 216 | procedure NDIlib_recv_free_metadata(p_instance: pNDIlib_recv_instance; p_metadata: pNDIlib_metadata_frame); 217 | cdecl; external PROCESSINGNDILIB_API; 218 | 219 | // This will free a string that was allocated and returned by NDIlib_recv (for instance the NDIlib_recv_get_web_control) function. 220 | procedure NDIlib_recv_free_string(p_instance: pNDIlib_recv_instance; p_string: PAnsiChar); 221 | cdecl; external PROCESSINGNDILIB_API; 222 | 223 | // This function will send a meta message to the source that we are connected too. This returns FALSE if we are 224 | // not currently connected to anything. 225 | function NDIlib_recv_send_metadata(p_instance: pNDIlib_recv_instance; p_metadata: pNDIlib_metadata_frame): LongBool; 226 | cdecl; external PROCESSINGNDILIB_API; 227 | 228 | // Set the up-stream tally notifications. This returns FALSE if we are not currently connected to anything. That 229 | // said, the moment that we do connect to something it will automatically be sent the tally state. 230 | function NDIlib_recv_set_tally(p_instance: pNDIlib_recv_instance; p_tally: pNDIlib_tally): LongBool; 231 | cdecl; external PROCESSINGNDILIB_API; 232 | 233 | // Get the current performance structures. This can be used to determine if you have been calling NDIlib_recv_capture fast 234 | // enough, or if your processing of data is not keeping up with real-time. The total structure will give you the total frame 235 | // counts received, the dropped structure will tell you how many frames have been dropped. Either of these could be NULL. 236 | procedure NDIlib_recv_get_performance(p_instance: pNDIlib_recv_instance; p_total: pNDIlib_recv_performance; p_dropped: pNDIlib_recv_performance); 237 | cdecl; external PROCESSINGNDILIB_API; 238 | 239 | // This will allow you to determine the current queue depth for all of the frame sources at any time. 240 | procedure NDIlib_recv_get_queue(p_instance: pNDIlib_recv_instance; p_total: pNDIlib_recv_queue); 241 | cdecl; external PROCESSINGNDILIB_API; 242 | 243 | // Connection based metadata is data that is sent automatically each time a new connection is received. You queue all of these 244 | // up and they are sent on each connection. To reset them you need to clear them all and set them up again. 245 | procedure NDIlib_recv_clear_connection_metadata(p_instance: pNDIlib_recv_instance); 246 | cdecl; external PROCESSINGNDILIB_API; 247 | 248 | // Add a connection metadata string to the list of what is sent on each new connection. If someone is already connected then 249 | // this string will be sent to them immediately. 250 | procedure NDIlib_recv_add_connection_metadata(p_instance: pNDIlib_recv_instance; p_metadata: pNDIlib_metadata_frame); 251 | cdecl; external PROCESSINGNDILIB_API; 252 | 253 | // Is this receiver currently connected to a source on the other end, or has the source not yet been found or is no longer online. 254 | // This will normally return 0 or 1 255 | function NDIlib_recv_get_no_connections(p_instance: pNDIlib_recv_instance): Integer; 256 | cdecl; external PROCESSINGNDILIB_API; 257 | 258 | // 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 259 | // 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 260 | // to free the string that is returned by this function. The returned value will be a fully formed URL, for instance "http://10.28.1.192/configuration/" 261 | // To avoid the need to poll this function, you can know when the value of this function might have changed when the 262 | // NDILib_recv_capture* call would return NDIlib_frame_type_status_change 263 | function NDIlib_recv_get_web_control(p_instance: pNDIlib_recv_instance): PAnsiChar; 264 | cdecl; external PROCESSINGNDILIB_API; 265 | 266 | {$endif} (* PROCESSING_NDI_RECV_H *) 267 | -------------------------------------------------------------------------------- /Examples/NDIlib_Find/Project1.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {54F732CD-FB43-425C-9E0C-02F2CC829F60} 4 | 18.8 5 | None 6 | Project1.dpr 7 | True 8 | Debug 9 | Win64 10 | 3 11 | Console 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Base 34 | true 35 | 36 | 37 | true 38 | Base 39 | true 40 | 41 | 42 | true 43 | Base 44 | true 45 | 46 | 47 | true 48 | Base 49 | true 50 | 51 | 52 | true 53 | Base 54 | true 55 | 56 | 57 | true 58 | Base 59 | true 60 | 61 | 62 | true 63 | Base 64 | true 65 | 66 | 67 | true 68 | Cfg_1 69 | true 70 | true 71 | 72 | 73 | true 74 | Base 75 | true 76 | 77 | 78 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 79 | Project1 80 | .\$(Platform)\$(Config) 81 | .\$(Platform)\$(Config) 82 | false 83 | false 84 | false 85 | false 86 | false 87 | 88 | 89 | android-support-v4.dex.jar;apk-expansion.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar 90 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 91 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 92 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 93 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 94 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 95 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 96 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 97 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 98 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) 99 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 100 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 101 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 102 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 103 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 104 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 105 | 106 | 107 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 108 | Debug 109 | true 110 | Base 111 | true 112 | android-support-v4.dex.jar;apk-expansion.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar 113 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 114 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 115 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 116 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 117 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 118 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 119 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 120 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 121 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage);$(DCC_UsePackage) 122 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 123 | 124 | 125 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;fmxase;$(DCC_UsePackage) 126 | 127 | 128 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;fmxase;$(DCC_UsePackage) 129 | 130 | 131 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;fmxase;$(DCC_UsePackage) 132 | 133 | 134 | true 135 | DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;FireDACIBDriver;fmx;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;ibxpress;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;fmxase;$(DCC_UsePackage) 136 | 137 | 138 | CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts 139 | Debug 140 | true 141 | Base 142 | true 143 | true 144 | DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;FireDACIBDriver;fmx;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;ibxpress;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;fmxase;$(DCC_UsePackage);$(DCC_UsePackage) 145 | 146 | 147 | 1033 148 | true 149 | CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) 150 | DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;frxe23;vclFireDAC;emsclientfiredac;DataSnapFireDAC;svnui;tethering;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;Intraweb;DBXOracleDriver;inetdb;FmxTeeUI;FireDACIBDriver;fmx;fmxdae;vclib;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;frxTee23;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;vcl;DBXSybaseASEDriver;IndyIPServer;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;ibxpress;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;frxDB23;TeeUI;vclribbon;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;frx23;fmxase;$(DCC_UsePackage) 151 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 152 | 153 | 154 | 1033 155 | true 156 | CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) 157 | DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;emsclientfiredac;DataSnapFireDAC;tethering;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;Intraweb;DBXOracleDriver;inetdb;FmxTeeUI;FireDACIBDriver;fmx;fmxdae;vclib;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;vcl;DBXSybaseASEDriver;IndyIPServer;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;ibxpress;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;vclribbon;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;fmxase;$(DCC_UsePackage) 158 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 159 | 160 | 161 | DEBUG;$(DCC_Define) 162 | true 163 | false 164 | true 165 | true 166 | true 167 | 168 | 169 | false 170 | 171 | 172 | false 173 | RELEASE;$(DCC_Define) 174 | 0 175 | 0 176 | 177 | 178 | 179 | MainSource 180 | 181 | 182 | 183 | Cfg_2 184 | Base 185 | 186 | 187 | Base 188 | 189 | 190 | Cfg_1 191 | Base 192 | 193 | 194 | 195 | Delphi.Personality.12 196 | Application 197 | 198 | 199 | 200 | Project1.dpr 201 | 202 | 203 | 204 | 205 | 206 | true 207 | 208 | 209 | 210 | 211 | true 212 | 213 | 214 | 215 | 216 | 217 | true 218 | 219 | 220 | 221 | 222 | 223 | 1 224 | 225 | 226 | Contents\MacOS 227 | 1 228 | 229 | 230 | 0 231 | 232 | 233 | 234 | 235 | classes 236 | 1 237 | 238 | 239 | classes 240 | 1 241 | 242 | 243 | 244 | 245 | res\xml 246 | 1 247 | 248 | 249 | res\xml 250 | 1 251 | 252 | 253 | 254 | 255 | library\lib\armeabi-v7a 256 | 1 257 | 258 | 259 | 260 | 261 | library\lib\armeabi 262 | 1 263 | 264 | 265 | library\lib\armeabi 266 | 1 267 | 268 | 269 | 270 | 271 | library\lib\armeabi-v7a 272 | 1 273 | 274 | 275 | 276 | 277 | library\lib\mips 278 | 1 279 | 280 | 281 | library\lib\mips 282 | 1 283 | 284 | 285 | 286 | 287 | library\lib\armeabi-v7a 288 | 1 289 | 290 | 291 | library\lib\arm64-v8a 292 | 1 293 | 294 | 295 | 296 | 297 | library\lib\armeabi-v7a 298 | 1 299 | 300 | 301 | 302 | 303 | res\drawable 304 | 1 305 | 306 | 307 | res\drawable 308 | 1 309 | 310 | 311 | 312 | 313 | res\values 314 | 1 315 | 316 | 317 | res\values 318 | 1 319 | 320 | 321 | 322 | 323 | res\values-v21 324 | 1 325 | 326 | 327 | res\values-v21 328 | 1 329 | 330 | 331 | 332 | 333 | res\values 334 | 1 335 | 336 | 337 | res\values 338 | 1 339 | 340 | 341 | 342 | 343 | res\drawable 344 | 1 345 | 346 | 347 | res\drawable 348 | 1 349 | 350 | 351 | 352 | 353 | res\drawable-xxhdpi 354 | 1 355 | 356 | 357 | res\drawable-xxhdpi 358 | 1 359 | 360 | 361 | 362 | 363 | res\drawable-ldpi 364 | 1 365 | 366 | 367 | res\drawable-ldpi 368 | 1 369 | 370 | 371 | 372 | 373 | res\drawable-mdpi 374 | 1 375 | 376 | 377 | res\drawable-mdpi 378 | 1 379 | 380 | 381 | 382 | 383 | res\drawable-hdpi 384 | 1 385 | 386 | 387 | res\drawable-hdpi 388 | 1 389 | 390 | 391 | 392 | 393 | res\drawable-xhdpi 394 | 1 395 | 396 | 397 | res\drawable-xhdpi 398 | 1 399 | 400 | 401 | 402 | 403 | res\drawable-mdpi 404 | 1 405 | 406 | 407 | res\drawable-mdpi 408 | 1 409 | 410 | 411 | 412 | 413 | res\drawable-hdpi 414 | 1 415 | 416 | 417 | res\drawable-hdpi 418 | 1 419 | 420 | 421 | 422 | 423 | res\drawable-xhdpi 424 | 1 425 | 426 | 427 | res\drawable-xhdpi 428 | 1 429 | 430 | 431 | 432 | 433 | res\drawable-xxhdpi 434 | 1 435 | 436 | 437 | res\drawable-xxhdpi 438 | 1 439 | 440 | 441 | 442 | 443 | res\drawable-xxxhdpi 444 | 1 445 | 446 | 447 | res\drawable-xxxhdpi 448 | 1 449 | 450 | 451 | 452 | 453 | res\drawable-small 454 | 1 455 | 456 | 457 | res\drawable-small 458 | 1 459 | 460 | 461 | 462 | 463 | res\drawable-normal 464 | 1 465 | 466 | 467 | res\drawable-normal 468 | 1 469 | 470 | 471 | 472 | 473 | res\drawable-large 474 | 1 475 | 476 | 477 | res\drawable-large 478 | 1 479 | 480 | 481 | 482 | 483 | res\drawable-xlarge 484 | 1 485 | 486 | 487 | res\drawable-xlarge 488 | 1 489 | 490 | 491 | 492 | 493 | res\values 494 | 1 495 | 496 | 497 | res\values 498 | 1 499 | 500 | 501 | 502 | 503 | 1 504 | 505 | 506 | Contents\MacOS 507 | 1 508 | 509 | 510 | 0 511 | 512 | 513 | 514 | 515 | Contents\MacOS 516 | 1 517 | .framework 518 | 519 | 520 | Contents\MacOS 521 | 1 522 | .framework 523 | 524 | 525 | 0 526 | 527 | 528 | 529 | 530 | 1 531 | .dylib 532 | 533 | 534 | 1 535 | .dylib 536 | 537 | 538 | 1 539 | .dylib 540 | 541 | 542 | Contents\MacOS 543 | 1 544 | .dylib 545 | 546 | 547 | Contents\MacOS 548 | 1 549 | .dylib 550 | 551 | 552 | 0 553 | .dll;.bpl 554 | 555 | 556 | 557 | 558 | 1 559 | .dylib 560 | 561 | 562 | 1 563 | .dylib 564 | 565 | 566 | 1 567 | .dylib 568 | 569 | 570 | Contents\MacOS 571 | 1 572 | .dylib 573 | 574 | 575 | Contents\MacOS 576 | 1 577 | .dylib 578 | 579 | 580 | 0 581 | .bpl 582 | 583 | 584 | 585 | 586 | 0 587 | 588 | 589 | 0 590 | 591 | 592 | 0 593 | 594 | 595 | 0 596 | 597 | 598 | 0 599 | 600 | 601 | Contents\Resources\StartUp\ 602 | 0 603 | 604 | 605 | Contents\Resources\StartUp\ 606 | 0 607 | 608 | 609 | 0 610 | 611 | 612 | 613 | 614 | 1 615 | 616 | 617 | 1 618 | 619 | 620 | 1 621 | 622 | 623 | 624 | 625 | 1 626 | 627 | 628 | 1 629 | 630 | 631 | 1 632 | 633 | 634 | 635 | 636 | 1 637 | 638 | 639 | 1 640 | 641 | 642 | 1 643 | 644 | 645 | 646 | 647 | 1 648 | 649 | 650 | 1 651 | 652 | 653 | 1 654 | 655 | 656 | 657 | 658 | 1 659 | 660 | 661 | 1 662 | 663 | 664 | 1 665 | 666 | 667 | 668 | 669 | 1 670 | 671 | 672 | 1 673 | 674 | 675 | 1 676 | 677 | 678 | 679 | 680 | 1 681 | 682 | 683 | 1 684 | 685 | 686 | 1 687 | 688 | 689 | 690 | 691 | 1 692 | 693 | 694 | 1 695 | 696 | 697 | 1 698 | 699 | 700 | 701 | 702 | 1 703 | 704 | 705 | 1 706 | 707 | 708 | 1 709 | 710 | 711 | 712 | 713 | 1 714 | 715 | 716 | 1 717 | 718 | 719 | 1 720 | 721 | 722 | 723 | 724 | 1 725 | 726 | 727 | 1 728 | 729 | 730 | 1 731 | 732 | 733 | 734 | 735 | 1 736 | 737 | 738 | 1 739 | 740 | 741 | 1 742 | 743 | 744 | 745 | 746 | 1 747 | 748 | 749 | 1 750 | 751 | 752 | 1 753 | 754 | 755 | 756 | 757 | 1 758 | 759 | 760 | 1 761 | 762 | 763 | 1 764 | 765 | 766 | 767 | 768 | 1 769 | 770 | 771 | 1 772 | 773 | 774 | 1 775 | 776 | 777 | 778 | 779 | 1 780 | 781 | 782 | 1 783 | 784 | 785 | 1 786 | 787 | 788 | 789 | 790 | 1 791 | 792 | 793 | 1 794 | 795 | 796 | 1 797 | 798 | 799 | 800 | 801 | 1 802 | 803 | 804 | 1 805 | 806 | 807 | 1 808 | 809 | 810 | 811 | 812 | 1 813 | 814 | 815 | 1 816 | 817 | 818 | 1 819 | 820 | 821 | 822 | 823 | 1 824 | 825 | 826 | 1 827 | 828 | 829 | 1 830 | 831 | 832 | 833 | 834 | 1 835 | 836 | 837 | 1 838 | 839 | 840 | 1 841 | 842 | 843 | 844 | 845 | 1 846 | 847 | 848 | 1 849 | 850 | 851 | 1 852 | 853 | 854 | 855 | 856 | 1 857 | 858 | 859 | 1 860 | 861 | 862 | 1 863 | 864 | 865 | 866 | 867 | 1 868 | 869 | 870 | 1 871 | 872 | 873 | 1 874 | 875 | 876 | 877 | 878 | 1 879 | 880 | 881 | 1 882 | 883 | 884 | 885 | 886 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 887 | 1 888 | 889 | 890 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 891 | 1 892 | 893 | 894 | 895 | 896 | 1 897 | 898 | 899 | 1 900 | 901 | 902 | 903 | 904 | ..\ 905 | 1 906 | 907 | 908 | ..\ 909 | 1 910 | 911 | 912 | 913 | 914 | 1 915 | 916 | 917 | 1 918 | 919 | 920 | 1 921 | 922 | 923 | 924 | 925 | 1 926 | 927 | 928 | 1 929 | 930 | 931 | 1 932 | 933 | 934 | 935 | 936 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 937 | 1 938 | 939 | 940 | 941 | 942 | ..\ 943 | 1 944 | 945 | 946 | ..\ 947 | 1 948 | 949 | 950 | 951 | 952 | Contents 953 | 1 954 | 955 | 956 | Contents 957 | 1 958 | 959 | 960 | 961 | 962 | Contents\Resources 963 | 1 964 | 965 | 966 | Contents\Resources 967 | 1 968 | 969 | 970 | 971 | 972 | library\lib\armeabi-v7a 973 | 1 974 | 975 | 976 | library\lib\arm64-v8a 977 | 1 978 | 979 | 980 | 1 981 | 982 | 983 | 1 984 | 985 | 986 | 1 987 | 988 | 989 | 1 990 | 991 | 992 | Contents\MacOS 993 | 1 994 | 995 | 996 | Contents\MacOS 997 | 1 998 | 999 | 1000 | 0 1001 | 1002 | 1003 | 1004 | 1005 | library\lib\armeabi-v7a 1006 | 1 1007 | 1008 | 1009 | 1010 | 1011 | 1 1012 | 1013 | 1014 | 1 1015 | 1016 | 1017 | 1018 | 1019 | Assets 1020 | 1 1021 | 1022 | 1023 | Assets 1024 | 1 1025 | 1026 | 1027 | 1028 | 1029 | Assets 1030 | 1 1031 | 1032 | 1033 | Assets 1034 | 1 1035 | 1036 | 1037 | 1038 | 1039 | 1040 | 1041 | 1042 | 1043 | 1044 | 1045 | 1046 | 1047 | 1048 | 1049 | False 1050 | False 1051 | False 1052 | False 1053 | False 1054 | False 1055 | False 1056 | True 1057 | True 1058 | 1059 | 1060 | 12 1061 | 1062 | 1063 | 1064 | 1065 | 1066 | --------------------------------------------------------------------------------