vlc/vlc-3.0 | branch: master | Marvin Scholz <epira...@gmail.com> | Fri Feb 23 
12:59:16 2018 +0100| [7c68891a83efd567e78234b07e24146643bee867] | committer: 
Thomas Guillem

service_discovery/bonjour: Parse Chromecast capabilities

Add support for correctly parsing the Chromecast capability flags and
correctly set VLC_RENDERER_CAN_VIDEO/AUDIO based on those.

(cherry picked from commit ad7569610cd47253fc7216f5f8282734cf7f86f9)
Signed-off-by: Thomas Guillem <tho...@gllm.fr>

> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=7c68891a83efd567e78234b07e24146643bee867
---

 modules/services_discovery/bonjour.m | 36 ++++++++++++++++++++++++++++++++----
 1 file changed, 32 insertions(+), 4 deletions(-)

diff --git a/modules/services_discovery/bonjour.m 
b/modules/services_discovery/bonjour.m
index f8f4388689..71bf7d96c9 100644
--- a/modules/services_discovery/bonjour.m
+++ b/modules/services_discovery/bonjour.m
@@ -82,6 +82,14 @@ NSString *const VLCBonjourIsRenderer            = 
@"VLCBonjourIsRenderer";
 NSString *const VLCBonjourRendererFlags         = @"VLCBonjourRendererFlags";
 NSString *const VLCBonjourRendererDemux         = @"VLCBonjourRendererDemux";
 
+/*
+ * For chromecast, the `ca=` is composed from (at least)
+ * 0x01 to indicate video support
+ * 0x04 to indivate audio support
+ */
+#define CHROMECAST_FLAG_VIDEO 0x01
+#define CHROMECAST_FLAG_AUDIO 0x04
+
 #pragma mark -
 #pragma mark Interface definition
 @interface VLCNetServiceDiscoveryController : NSObject 
<NSNetServiceBrowserDelegate, NSNetServiceDelegate>
@@ -299,20 +307,40 @@ NSString *const VLCBonjourRendererDemux         = 
@"VLCBonjourRendererDemux";
     NSString *uri = [NSString stringWithFormat:@"%@://%@:%ld", protocol, 
netService.hostName, netService.port];
     NSDictionary *txtDict = [NSNetService 
dictionaryFromTXTRecordData:[netService TXTRecordData]];
     NSString *displayName = netService.name;
+    int rendererFlags = 0;
 
     if ([netService.type isEqualToString:@"_googlecast._tcp."]) {
         NSData *modelData = [txtDict objectForKey:@"md"];
         NSData *nameData = [txtDict objectForKey:@"fn"];
+        NSData *flagsData = [txtDict objectForKey:@"ca"];
+
+        // Get CC capability flags from TXT data
+        if (flagsData) {
+            NSString *flagsString = [[NSString alloc] initWithData:flagsData 
encoding:NSUTF8StringEncoding];
+            NSInteger flags = [flagsString intValue];
+
+            if ((flags & CHROMECAST_FLAG_VIDEO) != 0) {
+                rendererFlags |= VLC_RENDERER_CAN_VIDEO;
+            }
+            if ((flags & CHROMECAST_FLAG_AUDIO) != 0) {
+                rendererFlags |= VLC_RENDERER_CAN_AUDIO;
+            }
+        }
+
+        // Get CC model and name from TXT data
         if (modelData && nameData) {
             NSString *model = [[NSString alloc] initWithData:modelData 
encoding:NSUTF8StringEncoding];
             NSString *name = [[NSString alloc] initWithData:nameData 
encoding:NSUTF8StringEncoding];
             displayName = [NSString stringWithFormat:@"%@ (%@)", name, model];
         }
     }
-    // TODO: Detect rendered capabilities and adapt to work with not just 
chromecast
-    vlc_renderer_item_t *p_renderer_item = vlc_renderer_item_new( 
"chromecast", [displayName UTF8String],
-                                                                 [uri 
UTF8String], NULL, "cc_demux",
-                                                                 "", 
VLC_RENDERER_CAN_VIDEO );
+
+    const char *extra_uri = rendererFlags & VLC_RENDERER_CAN_VIDEO ? NULL : 
"no-video";
+
+    // TODO: Adapt to work with not just chromecast!
+    vlc_renderer_item_t *p_renderer_item = vlc_renderer_item_new("chromecast", 
[displayName UTF8String],
+                                                                 [uri 
UTF8String], extra_uri, "cc_demux",
+                                                                 "", 
rendererFlags );
     if (p_renderer_item != NULL) {
         vlc_rd_add_item( p_rd, p_renderer_item );
         [_inputItemsForNetServices addObject:[NSValue 
valueWithPointer:p_renderer_item]];

_______________________________________________
vlc-commits mailing list
vlc-commits@videolan.org
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to