@@ -108,8 +108,31 @@ class NdiReader : public VideoReader
108108
109109 for (uint32_t src = 0 ; src < no_sources; src++)
110110 {
111+ std::string address_port = std::string (p_sources[src].p_url_address );
112+ std::string ip_address;
113+ uint16_t port = 0 ;
114+ size_t colon_pos = address_port.find (' :' );
115+ if (colon_pos != std::string::npos)
116+ {
117+ ip_address = address_port.substr (0 , colon_pos);
118+ std::string port_str = address_port.substr (colon_pos + 1 );
119+ try
120+ {
121+ port = static_cast <uint16_t >(std::stoi (port_str));
122+ }
123+ catch (const std::exception &)
124+ {
125+ port = 0 ; // fallback if conversion fails
126+ }
127+ }
128+ else
129+ {
130+ ip_address = address_port;
131+ port = 0 ;
132+ }
133+
111134 list.push_back (
112- CameraInfo (p_sources[src].p_ndi_name , p_sources[src]. p_url_address ));
135+ CameraInfo (p_sources[src].p_ndi_name , ip_address, port ));
113136 // SystemEventQueue::push("NDI", std::string("Source Found: ") +
114137 // p_sources[src].p_ndi_name + " at " + p_sources[src].p_ip_address);
115138 }
@@ -154,7 +177,7 @@ class NdiReader : public VideoReader
154177 if (!s.ipv4 .empty ())
155178 {
156179 list.push_back (
157- CameraInfo (s.instance_label , s.ipv4 [0 ]));
180+ CameraInfo (s.instance_label , s.ipv4 [0 ], s. port ));
158181 }
159182 // std::cout << s.instance << " -> " << s.host << ":" << s.port << "\n";
160183 // std::cout << "NDI Source: " << s.instance_label << " [" << s.service << "." << s.domain << "] -> "
@@ -184,13 +207,9 @@ class NdiReader : public VideoReader
184207 NDIlib_source_t p_source;
185208 CameraInfo foundCamera;
186209 std::vector<CameraInfo> cameras;
187- while (foundCamera.name == " " && keepRunning)
188210 {
189- {
190- std::unique_lock<std::mutex> lock (scanMutex);
191- cameras = camList;
192- }
193- for (auto camera : cameras)
211+ std::unique_lock<std::mutex> lock (scanMutex);
212+ for (auto camera : camList)
194213 {
195214 std::cout << " Found camera: " << camera.name << " looking for " << srcName << std::endl;
196215 if (camera.name .find (srcName) == 0 )
@@ -203,7 +222,8 @@ class NdiReader : public VideoReader
203222
204223 if (foundCamera.name == " " )
205224 {
206- return " " ; // stop received before ndi source found
225+ SystemEventQueue::push (" Debug" , " Error: Camera not found " + srcName);
226+ return " " ;
207227 }
208228
209229 std::cout << " Camera found" << std::endl;
@@ -223,10 +243,11 @@ class NdiReader : public VideoReader
223243 // Connect to the source
224244 SystemEventQueue::push (" Debug" , std::string (" Connecting to " ) +
225245 foundCamera.name + " at " +
226- foundCamera.address );
246+ foundCamera.url );
227247 // Connect to our sources
228248 p_source.p_ndi_name = foundCamera.name .c_str ();
229- p_source.p_url_address = foundCamera.address .c_str ();
249+ p_source.p_url_address = foundCamera.url .c_str ();
250+
230251 NDIlib_recv_connect (ndiRecv->pNDI_recv , &p_source);
231252
232253 foundCamera.name = " " ;
@@ -379,7 +400,7 @@ class NdiReader : public VideoReader
379400 opt.debug_level = 2 ;
380401 mdns = std::make_shared<ndi_mdns::NdiMdns>(opt);
381402 mdnsScanThread = std::thread (&NdiReader::mdnsScanLoop, this );
382- ndiScanThread = std::thread (&NdiReader::ndiScanLoop, this );
403+ // ndiScanThread = std::thread(&NdiReader::ndiScanLoop, this);
383404 auto *version = NDIlib_version ();
384405 std::cout << " NDI SDK Version: " << version << std::endl;
385406 }
0 commit comments