├── 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 |
--------------------------------------------------------------------------------