live555从RTSP服务器读取数据到使用接收到的数据流程分析

本文在linux环境下编译live555工程,并用cgdb调试工具对live555工程中的testProgs目录下的openRTSP的执行过程进行了跟踪分析,直到将从socket端读取视频数据并保存为对应的视频和音频数据为止。

进入testProgs目录,执行./openRTSP rtsp://xxxx/test.mp4

对于RTSP协议的处理部分,可设置断点在setupStreams函数中,并跟踪即可进行分析。

这里主要分析进入如下的while(1)循环中的代码

  1. void BasicTaskScheduler0::doEventLoop(char* watchVariable)   
  2. {  
  3.   // Repeatedly loop, handling readble sockets and timed events:  
  4.   while (1)   
  5.   {  
  6.     if (watchVariable != NULL && *watchVariable != 0) break;  
  7.     SingleStep();  
  8.   }  
  9. }  

从这里可知,live555在客户端处理数据实际上是单线程的程序,不断执行SingleStep()函数中的代码。通过查看该函数代码里,下面一句代码为重点

  1. (*handler->handlerProc)(handler->clientData, resultConditionSet);  


 

其中该条代码出现了两次,通过调试跟踪它的执行轨迹,第一次出现调用的函数是为了处理和RTSP服务器的通信协议的商定,而第二次出现调用的函数才是处理真正的视频和音频数据。对于RTSP通信协议的分析我们暂且不讨论,而直接进入第二次调用该函数的部分。

在我们的调试过程中在执行到上面的函数时就直接调用到livemedia目录下的如下函数

  1. void MultiFramedRTPSource::networkReadHandler(MultiFramedRTPSource* source, int /*mask*/)   
  2. {  
  3.   source->networkReadHandler1();  
  4. }  



//下面这个函数实现的主要功能就是从socket端读取数据并存储数据

  1. void MultiFramedRTPSource::networkReadHandler1()   
  2. {  
  3.   BufferedPacket* bPacket = fPacketReadInProgress;  
  4.   if (bPacket == NULL)  
  5.   {  
  6.     // Normal case: Get a free BufferedPacket descriptor to hold the new network packet:  
  7.     //分配一块新的存储空间来存储从socket端读取的数据  
  8.     bPacket = fReorderingBuffer->getFreePacket(this);  
  9.   }  
  10.   
  11.   // Read the network packet, and perform sanity checks on the RTP header:  
  12.   Boolean readSuccess = False;  
  13.   do   
  14.   {  
  15.     Boolean packetReadWasIncomplete = fPacketReadInProgress != NULL;  
  16.     //fillInData()函数封装了从socket端获取数据的过程,到此函数执行完已经将数据保存到了bPacket对象中  
  17.     if (!bPacket->fillInData(fRTPInterface, packetReadWasIncomplete))   
  18.    {  
  19.       if (bPacket->bytesAvailable() == 0)   
  20.       {  
  21.       envir() << "MultiFramedRTPSource error: Hit limit when reading incoming packet over TCP. Increase \"MAX_PACKET_SIZE\"\n";  
  22.       }  
  23.       break;  
  24.    }  
  25.     if (packetReadWasIncomplete)  
  26.     {  
  27.       // We need additional read(s) before we can process the incoming packet:  
  28.       fPacketReadInProgress = bPacket;  
  29.       return;  
  30.     } else   
  31.     {  
  32.       fPacketReadInProgress = NULL;  
  33.     }  
  34.       
  35.     //省略关于RTP包的处理  
  36.     ...  
  37.     ...  
  38.     ...  
  39.     //fReorderingBuffer为MultiFramedRTPSource类中的对象,该对象建立了一个存储Packet数据包对象的链表  
  40.     //下面的storePacket()函数即将上面获取的数据包存储在链表中  
  41.     if (!fReorderingBuffer->storePacket(bPacket)) break;   
  42.   
  43.     readSuccess = True;  
  44.   } while (0);  
  45.   if (!readSuccess) fReorderingBuffer->freePacket(bPacket);  
  46.   
  47.   doGetNex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值