Android WifiDisplay分析三:RTSP交互以及数据传输

本文深入探讨了Android系统中WifiDisplay的RTSP交互过程,从ANetworkSession的threadLoop方法开始,分析了客户端连接请求的处理,包括accept和新建Session的过程。接着,文章详细讲解了WifiDisplaySource如何处理接收到的ClientConnected消息,以及后续的M1到M7消息的发送,特别是M6(SetUp)和M7(Play)消息在建立无线显示连接中的关键作用。同时,提到了PlaybackSession和Track类在数据传输中的角色,强调了SurfaceMediaSource作为数据源,如何从SurfaceFlinger获取并处理混屏后的数据进行编码和传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/innost/article/details/8474683

http://blog.youkuaiyun.com/lilian0118/article/details/22849249

http://blog.youkuaiyun.com/lilian0118/article/details/22732747

http://blog.youkuaiyun.com/lilian0118/article/details/22408287

http://blog.youkuaiyun.com/lilian0118/article/details/22376059

前面我们分析到WifiDisplaySource会调用ANetworkSession的接口去创建一个socket,并在这个socket上监听是否有客户端的连接请求。先来看看Wifi Display规范的一些流程图:

 

从之前的一篇文章中,当ANetworkSession创建好RTSP的listen socket后,就会把它加入到selelct中等待对方的连接,那我们首先来看ANetworkSession的threadLoop方法:

 

[java] view plain copy  在CODE上查看代码片派生到我的代码片

  1. void ANetworkSession::threadLoop() {  
  2.   
  3.     int res = select(maxFd + 1, &rs, &ws, NULL, NULL /* tv */);  
  4.   
  5.     {  
  6.         Mutex::Autolock autoLock(mLock);  
  7.   
  8.         List<sp<Session> > sessionsToAdd;  
  9.   
  10.         for (size_t i = mSessions.size(); res > 0 && i-- > 0;) {  
  11.             const sp<Session> &session = mSessions.valueAt(i);  
  12.   
  13.             int s = session->socket();  
  14.   
  15.             if (s < 0) {  
  16.                 continue;  
  17.             }  
  18.   
  19.             if (FD_ISSET(s, &rs) || FD_ISSET(s, &ws)) {  
  20.                 --res;  
  21.             }  
  22.   
  23.             if (FD_ISSET(s, &rs)) {  
  24.                 if (session->isRTSPServer() || session->isTCPDatagramServer()) {  
  25.                     struct sockaddr_in remoteAddr;  
  26.                     socklen_t remoteAddrLen = sizeof(remoteAddr);  
  27.   
  28.                     int clientSocket = accept(  
  29.                             s, (struct sockaddr *)&remoteAddr, &remoteAddrLen);  
  30.   
  31.                     if (clientSocket >= 0) {  
  32.                         status_t err = MakeSocketNonBlocking(clientSocket);  
  33.   
  34.                         if (err != OK) {  
  35.   
  36.                         } else {  
  37.                             in_addr_t addr = ntohl(remoteAddr.sin_addr.s_addr);  
  38.   
  39.                             ALOGI("incoming connection from %d.%d.%d.%d:%d "  
  40.                                   "(socket %d)",  
  41.                                   (addr >> 24),  
  42.                                   (addr >> 16) & 0xff,  
  43.                                   (addr >> 8) & 0xff,  
  44.                                   addr &a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值