Mulitimedia-pause(RTSP)
来源:互联网 发布:java高性能并发框架 编辑:程序博客网 时间:2024/06/09 18:33
>>MediaPlayerService.cpp
status_t MediaPlayerService::Client::pause()
{ALOGV("[%d] pause", mConnId);
sp<MediaPlayerBase> p = getPlayer();
if (p == 0) return UNKNOWN_ERROR;
MM_LOGI("[%d] pause", mConnId);
return p->pause();
}
>>NuPlayer.cpp
void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
......
case kWhatPause:
{
if (mSource != NULL) {
mSource->pause();
} else {
ALOGW("pause called when source is gone or not set");
}
if (mRenderer != NULL) {
mRenderer->pause();
} else {
ALOGW("pause called when renderer is gone or not set");
}
break;
}
......
}
>>NuPlayer.cpp
void NuPlayer::pause() {
(new AMessage(kWhatPause, id()))->post();
}
>>RTSPSource.cpp
void NuPlayer::RTSPSource::pause() {
int64_t mediaDurationUs = 0;
getDuration(&mediaDurationUs);
for (size_t index = 0; index < mTracks.size(); index++) {
TrackInfo *info = &mTracks.editItemAt(index);
sp<AnotherPacketSource> source = info->mSource;
// Check if EOS or ERROR is received
if (source != NULL && source->isFinished(mediaDurationUs)) {
return;
}
}
mHandler->pause();
}
>>MyHandler.h
void pause() {
sp<AMessage> msg = new AMessage('paus', id());
mPauseGeneration++;
msg->setInt32("pausecheck", mPauseGeneration);
msg->post(kPauseDelayUs);
}
>>MyHandler.h
virtual void onMessageReceived(const sp<AMessage> &msg) {
......
case 'paus':
{
int32_t generation;
CHECK(msg->findInt32("pausecheck", &generation));
if (generation != mPauseGeneration) {
ALOGV("Ignoring outdated pause message.");
break;
}
if (!mSeekable) {
ALOGW("This is a live stream, ignoring pause request.");
break;
}
mCheckPending = true;
++mCheckGeneration;
mPausing = true;
AString request = "PAUSE ";
request.append(mControlURL);
request.append(" RTSP/1.0\r\n");
request.append("Session: ");
request.append(mSessionID);
request.append("\r\n");
request.append("\r\n");
sp<AMessage> reply = new AMessage('pau2', id());
mConn->sendRequest(request.c_str(), reply);
break;
}
......
}
>>ARTSPConnection.cpp
void ARTSPConnection::sendRequest(
const char *request, const sp<AMessage> &reply) {
sp<AMessage> msg = new AMessage(kWhatSendRequest, id());
msg->setString("request", request);
msg->setMessage("reply", reply);
msg->post();
}
>>ARTSPConnection.cpp
void ARTSPConnection::onMessageReceived(const sp<AMessage> &msg) {
case kWhatSendRequest:
onSendRequest(msg);
break;
......
}
void ARTSPConnection::onSendRequest(const sp<AMessage> &msg) {
sp<AMessage> reply;
CHECK(msg->findMessage("reply", &reply));
if (mState != CONNECTED) {
reply->setInt32("result", -ENOTCONN);
reply->post();
return;
}
AString request;
CHECK(msg->findString("request", &request));
// Just in case we need to re-issue the request with proper authentication
// later, stash it away.
reply->setString("original-request", request.c_str(), request.size());
addAuthentication(&request);
addUserAgent(&request);
// Find the boundary between headers and the body.
ssize_t i = request.find("\r\n\r\n");
CHECK_GE(i, 0);
int32_t cseq = mNextCSeq++;
AString cseqHeader = "CSeq: ";
cseqHeader.append(cseq);
cseqHeader.append("\r\n");
request.insert(cseqHeader, i + 2);
ALOGV("request: '%s'", request.c_str());
size_t numBytesSent = 0;
while (numBytesSent < request.size()) {
ssize_t n =
send(mSocket, request.c_str() + numBytesSent,
request.size() - numBytesSent, 0);
if (n < 0 && errno == EINTR) {
continue;
}
if (n <= 0) {
performDisconnect();
if (n == 0) {
// Server closed the connection.
ALOGE("Server unexpectedly closed the connection.");
reply->setInt32("result", ERROR_IO);
reply->post();
} else {
ALOGE("Error sending rtsp request. (%s)", strerror(errno));
reply->setInt32("result", -errno);
reply->post();
}
return;
}
numBytesSent += (size_t)n;
}
mPendingRequests.add(cseq, reply);
}
- Mulitimedia-pause(RTSP)
- RTSP 协议——PAUSE
- [RTSP][2012-06-16] RTSP PAUSE
- FFmpeg之Rtsp分析(一):Pause和seek
- pause
- pause
- rtsp
- RTSP
- RTSP
- RTSP
- rtsp
- rtsp
- RTSP
- RTSP
- rtsp
- RTSP
- rtsp
- RTSP
- ActionBar -- 添加Action按钮
- [leetcode] Remove Element
- 解决com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax;错误
- linq to sql 查询后排序(字符串类型的数字进行排序)
- 图片缓存(源于SDK文档)
- Mulitimedia-pause(RTSP)
- 变阻式恒流源
- 【Coder Force】264C - Choosing Balls (DP高难度思维转换)
- Android中的WebView使用(一)
- Oracle Coherence中文教程四:构建一个Coherence 应用
- 矩阵二分幂模板HDU5171GTY's birthday gift
- 使用eclipse遇到的unable to install breakpoint的问题
- 安卓开发之通过keytool工具获取证书指纹MD5和SHA1
- vs 2010下使用水晶报表Crystal Reports