RTSP连接服务器是否成功,以及是否从服务器接收到实际播放的数据,主要是判断两个linux select函数的执行结果。
1.连接服务器的处理过程
调用---------->
调用---------->
2.是否接收到服务器发送的播放数据的处理
2.1 在ARTSPConnection::onCompleteConnection成功连接后,发送检查接收数据的event
调用---------->
2.2 void ARTSPConnection::onMessageReceived(const sp<AMessage> &msg) {
case kWhatReceiveResponse:
onReceiveResponse();
break;
继续调用---------->
2.3
继续调用……
2.3.1 bool ARTSPConnection::receiveRTSPReponse() {
--->
2.3.1.1 bool ARTSPConnection::receiveLine(AString *line) {
--->
2.3.1.1.1 status_t ARTSPConnection::receive(void *data, size_t size) { // 每次读一个字符
--->
2.3.1.1.1.1 ssize_t n = recv(mSocket, (uint8_t *)data + offset, size - offset, 0); // 从TCP连接的另一端接收数据
--->
2.3.1.2 sp<ABuffer> ARTSPConnection::receiveBinaryData()
--->
2.3.1.2.1 status_t ARTSPConnection::receive(void *data, size_t size) { // 每次读3个字符
--->
recv()
2.3.1.2.2 status_t ARTSPConnection::receive(void *data, size_t size) { // 每次读buffer->size()个字符
--->
recv()
--->
2.3.1.3 new ARTSPResponse
--->
2.3.1.4 receiveLine()
--->
2.3.1.5 recv() // while (numBytesRead < contentLength)
--->
2.3.1.6 函数返回
return isRequest
? handleServerRequest(response)
: notifyResponseListener(response);
附:
SDP: Session Description Protocol
[RFC4566]
http://www.ietf.org/rfc/rfc4566.txt