Loading media/libmediaplayerservice/nuplayer/RTSPSource.cpp +51 −3 Original line number Original line Diff line number Diff line Loading @@ -138,8 +138,10 @@ void NuPlayer::RTSPSource::pause() { } } void NuPlayer::RTSPSource::resume() { void NuPlayer::RTSPSource::resume() { if (mHandler != NULL) { mHandler->resume(); mHandler->resume(); } } } status_t NuPlayer::RTSPSource::feedMoreTSData() { status_t NuPlayer::RTSPSource::feedMoreTSData() { Mutex::Autolock _l(mBufferingLock); Mutex::Autolock _l(mBufferingLock); Loading Loading @@ -295,13 +297,19 @@ status_t NuPlayer::RTSPSource::seekTo(int64_t seekTimeUs) { sp<AMessage> msg = new AMessage(kWhatPerformSeek, this); sp<AMessage> msg = new AMessage(kWhatPerformSeek, this); msg->setInt32("generation", ++mSeekGeneration); msg->setInt32("generation", ++mSeekGeneration); msg->setInt64("timeUs", seekTimeUs); msg->setInt64("timeUs", seekTimeUs); msg->post(200000ll); return OK; sp<AMessage> response; status_t err = msg->postAndAwaitResponse(&response); if (err == OK && response != NULL) { CHECK(response->findInt32("err", &err)); } return err; } } void NuPlayer::RTSPSource::performSeek(int64_t seekTimeUs) { void NuPlayer::RTSPSource::performSeek(int64_t seekTimeUs) { if (mState != CONNECTED) { if (mState != CONNECTED) { finishSeek(INVALID_OPERATION); return; return; } } Loading @@ -320,9 +328,11 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) { } else if (msg->what() == kWhatPerformSeek) { } else if (msg->what() == kWhatPerformSeek) { int32_t generation; int32_t generation; CHECK(msg->findInt32("generation", &generation)); CHECK(msg->findInt32("generation", &generation)); CHECK(msg->senderAwaitsResponse(&mSeekReplyID)); if (generation != mSeekGeneration) { if (generation != mSeekGeneration) { // obsolete. // obsolete. finishSeek(OK); return; return; } } Loading Loading @@ -368,6 +378,37 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) { case MyHandler::kWhatSeekDone: case MyHandler::kWhatSeekDone: { { mState = CONNECTED; mState = CONNECTED; if (mSeekReplyID != NULL) { // Unblock seekTo here in case we attempted to seek in a live stream finishSeek(OK); } break; } case MyHandler::kWhatSeekPaused: { sp<AnotherPacketSource> source = getSource(true /* audio */); if (source != NULL) { source->queueDiscontinuity(ATSParser::DISCONTINUITY_NONE, /* extra */ NULL, /* discard */ true); } source = getSource(false /* video */); if (source != NULL) { source->queueDiscontinuity(ATSParser::DISCONTINUITY_NONE, /* extra */ NULL, /* discard */ true); }; status_t err = OK; msg->findInt32("err", &err); finishSeek(err); if (err == OK) { int64_t timeUs; CHECK(msg->findInt64("time", &timeUs)); mHandler->continueSeekAfterPause(timeUs); } break; break; } } Loading Loading @@ -700,5 +741,12 @@ bool NuPlayer::RTSPSource::stopBufferingIfNecessary() { return true; return true; } } void NuPlayer::RTSPSource::finishSeek(status_t err) { CHECK(mSeekReplyID != NULL); sp<AMessage> seekReply = new AMessage; seekReply->setInt32("err", err); seekReply->postReply(mSeekReplyID); mSeekReplyID = NULL; } } // namespace android } // namespace android media/libmediaplayerservice/nuplayer/RTSPSource.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -116,6 +116,8 @@ private: int64_t mEOSTimeoutAudio; int64_t mEOSTimeoutAudio; int64_t mEOSTimeoutVideo; int64_t mEOSTimeoutVideo; sp<AReplyToken> mSeekReplyID; sp<AnotherPacketSource> getSource(bool audio); sp<AnotherPacketSource> getSource(bool audio); void onConnected(); void onConnected(); Loading @@ -131,6 +133,7 @@ private: void setError(status_t err); void setError(status_t err); void startBufferingIfNecessary(); void startBufferingIfNecessary(); bool stopBufferingIfNecessary(); bool stopBufferingIfNecessary(); void finishSeek(status_t err); DISALLOW_EVIL_CONSTRUCTORS(RTSPSource); DISALLOW_EVIL_CONSTRUCTORS(RTSPSource); }; }; Loading media/libstagefright/rtsp/MyHandler.h +26 −2 Original line number Original line Diff line number Diff line Loading @@ -98,6 +98,7 @@ struct MyHandler : public AHandler { enum { enum { kWhatConnected = 'conn', kWhatConnected = 'conn', kWhatDisconnected = 'disc', kWhatDisconnected = 'disc', kWhatSeekPaused = 'spau', kWhatSeekDone = 'sdon', kWhatSeekDone = 'sdon', kWhatAccessUnit = 'accU', kWhatAccessUnit = 'accU', Loading Loading @@ -220,6 +221,12 @@ struct MyHandler : public AHandler { msg->post(); msg->post(); } } void continueSeekAfterPause(int64_t timeUs) { sp<AMessage> msg = new AMessage('see1', this); msg->setInt64("time", timeUs); msg->post(); } bool isSeekable() const { bool isSeekable() const { return mSeekable; return mSeekable; } } Loading Loading @@ -1180,7 +1187,7 @@ struct MyHandler : public AHandler { mCheckPending = true; mCheckPending = true; ++mCheckGeneration; ++mCheckGeneration; sp<AMessage> reply = new AMessage('see1', this); sp<AMessage> reply = new AMessage('see0', this); reply->setInt64("time", timeUs); reply->setInt64("time", timeUs); if (mPausing) { if (mPausing) { Loading @@ -1203,9 +1210,26 @@ struct MyHandler : public AHandler { break; break; } } case 'see1': case 'see0': { { // Session is paused now. // Session is paused now. status_t err = OK; msg->findInt32("result", &err); int64_t timeUs; CHECK(msg->findInt64("time", &timeUs)); sp<AMessage> notify = mNotify->dup(); notify->setInt32("what", kWhatSeekPaused); notify->setInt32("err", err); notify->setInt64("time", timeUs); notify->post(); break; } case 'see1': { for (size_t i = 0; i < mTracks.size(); ++i) { for (size_t i = 0; i < mTracks.size(); ++i) { TrackInfo *info = &mTracks.editItemAt(i); TrackInfo *info = &mTracks.editItemAt(i); Loading Loading
media/libmediaplayerservice/nuplayer/RTSPSource.cpp +51 −3 Original line number Original line Diff line number Diff line Loading @@ -138,8 +138,10 @@ void NuPlayer::RTSPSource::pause() { } } void NuPlayer::RTSPSource::resume() { void NuPlayer::RTSPSource::resume() { if (mHandler != NULL) { mHandler->resume(); mHandler->resume(); } } } status_t NuPlayer::RTSPSource::feedMoreTSData() { status_t NuPlayer::RTSPSource::feedMoreTSData() { Mutex::Autolock _l(mBufferingLock); Mutex::Autolock _l(mBufferingLock); Loading Loading @@ -295,13 +297,19 @@ status_t NuPlayer::RTSPSource::seekTo(int64_t seekTimeUs) { sp<AMessage> msg = new AMessage(kWhatPerformSeek, this); sp<AMessage> msg = new AMessage(kWhatPerformSeek, this); msg->setInt32("generation", ++mSeekGeneration); msg->setInt32("generation", ++mSeekGeneration); msg->setInt64("timeUs", seekTimeUs); msg->setInt64("timeUs", seekTimeUs); msg->post(200000ll); return OK; sp<AMessage> response; status_t err = msg->postAndAwaitResponse(&response); if (err == OK && response != NULL) { CHECK(response->findInt32("err", &err)); } return err; } } void NuPlayer::RTSPSource::performSeek(int64_t seekTimeUs) { void NuPlayer::RTSPSource::performSeek(int64_t seekTimeUs) { if (mState != CONNECTED) { if (mState != CONNECTED) { finishSeek(INVALID_OPERATION); return; return; } } Loading @@ -320,9 +328,11 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) { } else if (msg->what() == kWhatPerformSeek) { } else if (msg->what() == kWhatPerformSeek) { int32_t generation; int32_t generation; CHECK(msg->findInt32("generation", &generation)); CHECK(msg->findInt32("generation", &generation)); CHECK(msg->senderAwaitsResponse(&mSeekReplyID)); if (generation != mSeekGeneration) { if (generation != mSeekGeneration) { // obsolete. // obsolete. finishSeek(OK); return; return; } } Loading Loading @@ -368,6 +378,37 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) { case MyHandler::kWhatSeekDone: case MyHandler::kWhatSeekDone: { { mState = CONNECTED; mState = CONNECTED; if (mSeekReplyID != NULL) { // Unblock seekTo here in case we attempted to seek in a live stream finishSeek(OK); } break; } case MyHandler::kWhatSeekPaused: { sp<AnotherPacketSource> source = getSource(true /* audio */); if (source != NULL) { source->queueDiscontinuity(ATSParser::DISCONTINUITY_NONE, /* extra */ NULL, /* discard */ true); } source = getSource(false /* video */); if (source != NULL) { source->queueDiscontinuity(ATSParser::DISCONTINUITY_NONE, /* extra */ NULL, /* discard */ true); }; status_t err = OK; msg->findInt32("err", &err); finishSeek(err); if (err == OK) { int64_t timeUs; CHECK(msg->findInt64("time", &timeUs)); mHandler->continueSeekAfterPause(timeUs); } break; break; } } Loading Loading @@ -700,5 +741,12 @@ bool NuPlayer::RTSPSource::stopBufferingIfNecessary() { return true; return true; } } void NuPlayer::RTSPSource::finishSeek(status_t err) { CHECK(mSeekReplyID != NULL); sp<AMessage> seekReply = new AMessage; seekReply->setInt32("err", err); seekReply->postReply(mSeekReplyID); mSeekReplyID = NULL; } } // namespace android } // namespace android
media/libmediaplayerservice/nuplayer/RTSPSource.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -116,6 +116,8 @@ private: int64_t mEOSTimeoutAudio; int64_t mEOSTimeoutAudio; int64_t mEOSTimeoutVideo; int64_t mEOSTimeoutVideo; sp<AReplyToken> mSeekReplyID; sp<AnotherPacketSource> getSource(bool audio); sp<AnotherPacketSource> getSource(bool audio); void onConnected(); void onConnected(); Loading @@ -131,6 +133,7 @@ private: void setError(status_t err); void setError(status_t err); void startBufferingIfNecessary(); void startBufferingIfNecessary(); bool stopBufferingIfNecessary(); bool stopBufferingIfNecessary(); void finishSeek(status_t err); DISALLOW_EVIL_CONSTRUCTORS(RTSPSource); DISALLOW_EVIL_CONSTRUCTORS(RTSPSource); }; }; Loading
media/libstagefright/rtsp/MyHandler.h +26 −2 Original line number Original line Diff line number Diff line Loading @@ -98,6 +98,7 @@ struct MyHandler : public AHandler { enum { enum { kWhatConnected = 'conn', kWhatConnected = 'conn', kWhatDisconnected = 'disc', kWhatDisconnected = 'disc', kWhatSeekPaused = 'spau', kWhatSeekDone = 'sdon', kWhatSeekDone = 'sdon', kWhatAccessUnit = 'accU', kWhatAccessUnit = 'accU', Loading Loading @@ -220,6 +221,12 @@ struct MyHandler : public AHandler { msg->post(); msg->post(); } } void continueSeekAfterPause(int64_t timeUs) { sp<AMessage> msg = new AMessage('see1', this); msg->setInt64("time", timeUs); msg->post(); } bool isSeekable() const { bool isSeekable() const { return mSeekable; return mSeekable; } } Loading Loading @@ -1180,7 +1187,7 @@ struct MyHandler : public AHandler { mCheckPending = true; mCheckPending = true; ++mCheckGeneration; ++mCheckGeneration; sp<AMessage> reply = new AMessage('see1', this); sp<AMessage> reply = new AMessage('see0', this); reply->setInt64("time", timeUs); reply->setInt64("time", timeUs); if (mPausing) { if (mPausing) { Loading @@ -1203,9 +1210,26 @@ struct MyHandler : public AHandler { break; break; } } case 'see1': case 'see0': { { // Session is paused now. // Session is paused now. status_t err = OK; msg->findInt32("result", &err); int64_t timeUs; CHECK(msg->findInt64("time", &timeUs)); sp<AMessage> notify = mNotify->dup(); notify->setInt32("what", kWhatSeekPaused); notify->setInt32("err", err); notify->setInt64("time", timeUs); notify->post(); break; } case 'see1': { for (size_t i = 0; i < mTracks.size(); ++i) { for (size_t i = 0; i < mTracks.size(); ++i) { TrackInfo *info = &mTracks.editItemAt(i); TrackInfo *info = &mTracks.editItemAt(i); Loading