Merge "Don't perform RTSP seeks right away but queue them for 200ms" into ics-mr1

This commit is contained in:
Andreas Huber
2011-12-08 13:33:16 -08:00
committed by Android (Google) Code Review
2 changed files with 31 additions and 4 deletions

View File

@@ -38,7 +38,8 @@ NuPlayer::RTSPSource::RTSPSource(
mFlags(0), mFlags(0),
mState(DISCONNECTED), mState(DISCONNECTED),
mFinalResult(OK), mFinalResult(OK),
mDisconnectReplyID(0) { mDisconnectReplyID(0),
mSeekGeneration(0) {
if (headers) { if (headers) {
mExtraHeaders = *headers; mExtraHeaders = *headers;
@@ -146,14 +147,21 @@ status_t NuPlayer::RTSPSource::getDuration(int64_t *durationUs) {
} }
status_t NuPlayer::RTSPSource::seekTo(int64_t seekTimeUs) { status_t NuPlayer::RTSPSource::seekTo(int64_t seekTimeUs) {
sp<AMessage> msg = new AMessage(kWhatPerformSeek, mReflector->id());
msg->setInt32("generation", ++mSeekGeneration);
msg->setInt64("timeUs", seekTimeUs);
msg->post(200000ll);
return OK;
}
void NuPlayer::RTSPSource::performSeek(int64_t seekTimeUs) {
if (mState != CONNECTED) { if (mState != CONNECTED) {
return UNKNOWN_ERROR; return;
} }
mState = SEEKING; mState = SEEKING;
mHandler->seek(seekTimeUs); mHandler->seek(seekTimeUs);
return OK;
} }
bool NuPlayer::RTSPSource::isSeekable() { bool NuPlayer::RTSPSource::isSeekable() {
@@ -168,6 +176,20 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) {
mDisconnectReplyID = replyID; mDisconnectReplyID = replyID;
finishDisconnectIfPossible(); finishDisconnectIfPossible();
return; return;
} else if (msg->what() == kWhatPerformSeek) {
int32_t generation;
CHECK(msg->findInt32("generation", &generation));
if (generation != mSeekGeneration) {
// obsolete.
return;
}
int64_t seekTimeUs;
CHECK(msg->findInt64("timeUs", &seekTimeUs));
performSeek(seekTimeUs);
return;
} }
CHECK_EQ(msg->what(), (int)kWhatNotify); CHECK_EQ(msg->what(), (int)kWhatNotify);

View File

@@ -56,6 +56,7 @@ private:
enum { enum {
kWhatNotify = 'noti', kWhatNotify = 'noti',
kWhatDisconnect = 'disc', kWhatDisconnect = 'disc',
kWhatPerformSeek = 'seek',
}; };
enum State { enum State {
@@ -96,12 +97,16 @@ private:
sp<AnotherPacketSource> mAudioTrack; sp<AnotherPacketSource> mAudioTrack;
sp<AnotherPacketSource> mVideoTrack; sp<AnotherPacketSource> mVideoTrack;
int32_t mSeekGeneration;
sp<AnotherPacketSource> getSource(bool audio); sp<AnotherPacketSource> getSource(bool audio);
void onConnected(); void onConnected();
void onDisconnected(const sp<AMessage> &msg); void onDisconnected(const sp<AMessage> &msg);
void finishDisconnectIfPossible(); void finishDisconnectIfPossible();
void performSeek(int64_t seekTimeUs);
DISALLOW_EVIL_CONSTRUCTORS(RTSPSource); DISALLOW_EVIL_CONSTRUCTORS(RTSPSource);
}; };