case 'desc':
{
int32_t result;
CHECK(msg
->findInt32(
"result",
&result));
ALOGI(
"DESCRIBE completed with result %d (%s)",
result, strerror(
-result));
if (result
== OK) {
sp
<RefBase
> obj;
CHECK(msg
->findObject(
"response",
&obj));
sp
<ARTSPResponse
> response
=
static_cast
<ARTSPResponse
*>(obj
.get());
if (response
->mStatusCode
== 301 || response
->mStatusCode
== 302) {
ssize_t i
= response
->mHeaders
.indexOfKey(
"location");
CHECK_GE(i,
0);
mOriginalSessionURL
= response
->mHeaders
.valueAt(i);
mSessionURL
= mOriginalSessionURL;
AString host, path, user, pass;
unsigned port;
if (ARTSPConnection
::ParseURL(
mSessionURL
.c_str(),
&host,
&port,
&path,
&user,
&pass)
&& user
.size()
> 0) {
mSessionURL
.clear();
mSessionURL
.append(
"rtsp://");
mSessionURL
.append(host);
mSessionURL
.append(
":");
mSessionURL
.append(AStringPrintf(
"%u", port));
mSessionURL
.append(path);
ALOGI(
"rewritten session url: '%s'", mSessionURL
.c_str());
}
sp
<AMessage
> reply
= new AMessage(
'conn', this);
mConn
->connect(mOriginalSessionURL
.c_str(), reply);
break;
}
if (response
->mStatusCode
!= 200) {
result
= UNKNOWN_ERROR;
}
else if (response
->mContent
== NULL) {
result
= ERROR_MALFORMED;
ALOGE(
"The response has no content.");
}
else {
mSessionDesc
= new ASessionDescription;
mSessionDesc
->setTo(
response
->mContent
->data(),
response
->mContent
->size());
if (
!mSessionDesc
->isValid()) {
ALOGE(
"Failed to parse session description.");
result
= ERROR_MALFORMED;
}
else {
ssize_t i
= response
->mHeaders
.indexOfKey(
"content-base");
if (i
>= 0) {
mBaseURL
= response
->mHeaders
.valueAt(i);
}
else {
i
= response
->mHeaders
.indexOfKey(
"content-location");
if (i
>= 0) {
mBaseURL
= response
->mHeaders
.valueAt(i);
}
else {
mBaseURL
= mSessionURL;
}
}
mSeekable
= !isLiveStream(mSessionDesc);
if (
!mBaseURL
.startsWith(
"rtsp://")) {
ALOGW(
"Server specified a non-absolute base URL"
", combining it with the session URL to "
"get something usable...");
AString tmp;
CHECK(MakeURL(
mSessionURL
.c_str(),
mBaseURL
.c_str(),
&tmp));
mBaseURL
= tmp;
}
mControlURL
= getControlURL();
if (mSessionDesc
->countTracks()
< 2) {
ALOGW(
"Session doesn't contain any playable "
"tracks. Aborting.");
result
= ERROR_UNSUPPORTED;
}
else {
setupTrack(
1);
}
}
}
}
if (result
!= OK) {
sp
<AMessage
> reply
= new AMessage(
'disc', this);
mConn
->disconnect(reply);
}
break;
}
小结:MyHandler对’desc’消息的处理的主要工作就是创建一个会话对象。
转载请注明原文地址: https://ju.6miu.com/read-22231.html