Loading media/libstagefright/AwesomePlayer.cpp +11 −4 Original line number Diff line number Diff line Loading @@ -876,12 +876,19 @@ status_t AwesomePlayer::seekTo(int64_t timeUs) { return OK; } status_t AwesomePlayer::seekTo_l(int64_t timeUs) { if (mRTSPController != NULL) { mRTSPController->seek(timeUs); // static void AwesomePlayer::OnRTSPSeekDoneWrapper(void *cookie) { static_cast<AwesomePlayer *>(cookie)->onRTSPSeekDone(); } void AwesomePlayer::onRTSPSeekDone() { notifyListener_l(MEDIA_SEEK_COMPLETE); mSeekNotificationSent = true; } status_t AwesomePlayer::seekTo_l(int64_t timeUs) { if (mRTSPController != NULL) { mRTSPController->seekAsync(timeUs, OnRTSPSeekDoneWrapper, this); return OK; } Loading media/libstagefright/include/ARTSPController.h +6 −1 Original line number Diff line number Diff line Loading @@ -33,7 +33,7 @@ struct ARTSPController : public MediaExtractor { status_t connect(const char *url); void disconnect(); void seek(int64_t timeUs); void seekAsync(int64_t timeUs, void (*seekDoneCb)(void *), void *cookie); virtual size_t countTracks(); virtual sp<MediaSource> getTrack(size_t index); Loading Loading @@ -61,6 +61,7 @@ private: enum { kWhatConnectDone = 'cdon', kWhatDisconnectDone = 'ddon', kWhatSeekDone = 'sdon', }; enum State { Loading @@ -79,6 +80,10 @@ private: sp<MyHandler> mHandler; sp<AHandlerReflector<ARTSPController> > mReflector; void (*mSeekDoneCb)(void *); void *mSeekDoneCookie; int64_t mLastSeekCompletedTimeUs; DISALLOW_EVIL_CONSTRUCTORS(ARTSPController); }; Loading media/libstagefright/include/AwesomePlayer.h +3 −0 Original line number Diff line number Diff line Loading @@ -251,6 +251,9 @@ private: static bool ContinuePreparation(void *cookie); static void OnRTSPSeekDoneWrapper(void *cookie); void onRTSPSeekDone(); AwesomePlayer(const AwesomePlayer &); AwesomePlayer &operator=(const AwesomePlayer &); }; Loading media/libstagefright/rtsp/ARTSPController.cpp +37 −4 Original line number Diff line number Diff line Loading @@ -27,7 +27,10 @@ namespace android { ARTSPController::ARTSPController(const sp<ALooper> &looper) : mState(DISCONNECTED), mLooper(looper) { mLooper(looper), mSeekDoneCb(NULL), mSeekDoneCookie(NULL), mLastSeekCompletedTimeUs(-1) { mReflector = new AHandlerReflector<ARTSPController>(this); looper->registerHandler(mReflector); } Loading Loading @@ -80,14 +83,31 @@ void ARTSPController::disconnect() { mHandler.clear(); } void ARTSPController::seek(int64_t timeUs) { void ARTSPController::seekAsync( int64_t timeUs, void (*seekDoneCb)(void *), void *cookie) { Mutex::Autolock autoLock(mLock); if (mState != CONNECTED) { CHECK(seekDoneCb != NULL); CHECK(mSeekDoneCb == NULL); // Ignore seek requests that are too soon after the previous one has // completed, we don't want to swamp the server. bool tooEarly = mLastSeekCompletedTimeUs >= 0 && ALooper::GetNowUs() < mLastSeekCompletedTimeUs + 500000ll; if (mState != CONNECTED || tooEarly) { (*seekDoneCb)(cookie); return; } mHandler->seek(timeUs); mSeekDoneCb = seekDoneCb; mSeekDoneCookie = cookie; sp<AMessage> msg = new AMessage(kWhatSeekDone, mReflector->id()); mHandler->seek(timeUs, msg); } size_t ARTSPController::countTracks() { Loading Loading @@ -132,6 +152,19 @@ void ARTSPController::onMessageReceived(const sp<AMessage> &msg) { break; } case kWhatSeekDone: { LOGI("seek done"); mLastSeekCompletedTimeUs = ALooper::GetNowUs(); void (*seekDoneCb)(void *) = mSeekDoneCb; mSeekDoneCb = NULL; (*seekDoneCb)(mSeekDoneCookie); break; } default: TRESPASS(); break; Loading media/libstagefright/rtsp/MyHandler.h +30 −2 Original line number Diff line number Diff line Loading @@ -88,7 +88,8 @@ struct MyHandler : public AHandler { mCheckPending(false), mCheckGeneration(0), mTryTCPInterleaving(false), mReceivedFirstRTCPPacket(false) { mReceivedFirstRTCPPacket(false), mSeekable(false) { mNetLooper->setName("rtsp net"); mNetLooper->start(false /* runOnCallingThread */, false /* canCallJava */, Loading @@ -115,9 +116,10 @@ struct MyHandler : public AHandler { (new AMessage('abor', id()))->post(); } void seek(int64_t timeUs) { void seek(int64_t timeUs, const sp<AMessage> &doneMsg) { sp<AMessage> msg = new AMessage('seek', id()); msg->setInt64("time", timeUs); msg->setMessage("doneMsg", doneMsg); msg->post(); } Loading Loading @@ -379,6 +381,7 @@ struct MyHandler : public AHandler { mFirstAccessUnitNTP = 0; mNumAccessUnitsReceived = 0; mReceivedFirstRTCPPacket = false; mSeekable = false; sp<AMessage> reply = new AMessage('tear', id()); Loading Loading @@ -551,7 +554,17 @@ struct MyHandler : public AHandler { case 'seek': { sp<AMessage> doneMsg; CHECK(msg->findMessage("doneMsg", &doneMsg)); if (mSeekPending) { doneMsg->post(); break; } if (!mSeekable) { LOGW("This is a live stream, ignoring seek request."); doneMsg->post(); break; } Loading @@ -577,6 +590,7 @@ struct MyHandler : public AHandler { sp<AMessage> reply = new AMessage('see1', id()); reply->setInt64("time", timeUs); reply->setMessage("doneMsg", doneMsg); mConn->sendRequest(request.c_str(), reply); break; } Loading Loading @@ -605,7 +619,11 @@ struct MyHandler : public AHandler { request.append("\r\n"); sp<AMessage> doneMsg; CHECK(msg->findMessage("doneMsg", &doneMsg)); sp<AMessage> reply = new AMessage('see2', id()); reply->setMessage("doneMsg", doneMsg); mConn->sendRequest(request.c_str(), reply); break; } Loading Loading @@ -644,6 +662,11 @@ struct MyHandler : public AHandler { } mSeekPending = false; sp<AMessage> doneMsg; CHECK(msg->findMessage("doneMsg", &doneMsg)); doneMsg->post(); break; } Loading Loading @@ -714,6 +737,8 @@ struct MyHandler : public AHandler { } void parsePlayResponse(const sp<ARTSPResponse> &response) { mSeekable = false; ssize_t i = response->mHeaders.indexOfKey("range"); if (i < 0) { // Server doesn't even tell use what range it is going to Loading Loading @@ -777,6 +802,8 @@ struct MyHandler : public AHandler { ++n; } mSeekable = true; } sp<APacketSource> getPacketSource(size_t index) { Loading Loading @@ -808,6 +835,7 @@ private: int32_t mCheckGeneration; bool mTryTCPInterleaving; bool mReceivedFirstRTCPPacket; bool mSeekable; struct TrackInfo { AString mURL; Loading Loading
media/libstagefright/AwesomePlayer.cpp +11 −4 Original line number Diff line number Diff line Loading @@ -876,12 +876,19 @@ status_t AwesomePlayer::seekTo(int64_t timeUs) { return OK; } status_t AwesomePlayer::seekTo_l(int64_t timeUs) { if (mRTSPController != NULL) { mRTSPController->seek(timeUs); // static void AwesomePlayer::OnRTSPSeekDoneWrapper(void *cookie) { static_cast<AwesomePlayer *>(cookie)->onRTSPSeekDone(); } void AwesomePlayer::onRTSPSeekDone() { notifyListener_l(MEDIA_SEEK_COMPLETE); mSeekNotificationSent = true; } status_t AwesomePlayer::seekTo_l(int64_t timeUs) { if (mRTSPController != NULL) { mRTSPController->seekAsync(timeUs, OnRTSPSeekDoneWrapper, this); return OK; } Loading
media/libstagefright/include/ARTSPController.h +6 −1 Original line number Diff line number Diff line Loading @@ -33,7 +33,7 @@ struct ARTSPController : public MediaExtractor { status_t connect(const char *url); void disconnect(); void seek(int64_t timeUs); void seekAsync(int64_t timeUs, void (*seekDoneCb)(void *), void *cookie); virtual size_t countTracks(); virtual sp<MediaSource> getTrack(size_t index); Loading Loading @@ -61,6 +61,7 @@ private: enum { kWhatConnectDone = 'cdon', kWhatDisconnectDone = 'ddon', kWhatSeekDone = 'sdon', }; enum State { Loading @@ -79,6 +80,10 @@ private: sp<MyHandler> mHandler; sp<AHandlerReflector<ARTSPController> > mReflector; void (*mSeekDoneCb)(void *); void *mSeekDoneCookie; int64_t mLastSeekCompletedTimeUs; DISALLOW_EVIL_CONSTRUCTORS(ARTSPController); }; Loading
media/libstagefright/include/AwesomePlayer.h +3 −0 Original line number Diff line number Diff line Loading @@ -251,6 +251,9 @@ private: static bool ContinuePreparation(void *cookie); static void OnRTSPSeekDoneWrapper(void *cookie); void onRTSPSeekDone(); AwesomePlayer(const AwesomePlayer &); AwesomePlayer &operator=(const AwesomePlayer &); }; Loading
media/libstagefright/rtsp/ARTSPController.cpp +37 −4 Original line number Diff line number Diff line Loading @@ -27,7 +27,10 @@ namespace android { ARTSPController::ARTSPController(const sp<ALooper> &looper) : mState(DISCONNECTED), mLooper(looper) { mLooper(looper), mSeekDoneCb(NULL), mSeekDoneCookie(NULL), mLastSeekCompletedTimeUs(-1) { mReflector = new AHandlerReflector<ARTSPController>(this); looper->registerHandler(mReflector); } Loading Loading @@ -80,14 +83,31 @@ void ARTSPController::disconnect() { mHandler.clear(); } void ARTSPController::seek(int64_t timeUs) { void ARTSPController::seekAsync( int64_t timeUs, void (*seekDoneCb)(void *), void *cookie) { Mutex::Autolock autoLock(mLock); if (mState != CONNECTED) { CHECK(seekDoneCb != NULL); CHECK(mSeekDoneCb == NULL); // Ignore seek requests that are too soon after the previous one has // completed, we don't want to swamp the server. bool tooEarly = mLastSeekCompletedTimeUs >= 0 && ALooper::GetNowUs() < mLastSeekCompletedTimeUs + 500000ll; if (mState != CONNECTED || tooEarly) { (*seekDoneCb)(cookie); return; } mHandler->seek(timeUs); mSeekDoneCb = seekDoneCb; mSeekDoneCookie = cookie; sp<AMessage> msg = new AMessage(kWhatSeekDone, mReflector->id()); mHandler->seek(timeUs, msg); } size_t ARTSPController::countTracks() { Loading Loading @@ -132,6 +152,19 @@ void ARTSPController::onMessageReceived(const sp<AMessage> &msg) { break; } case kWhatSeekDone: { LOGI("seek done"); mLastSeekCompletedTimeUs = ALooper::GetNowUs(); void (*seekDoneCb)(void *) = mSeekDoneCb; mSeekDoneCb = NULL; (*seekDoneCb)(mSeekDoneCookie); break; } default: TRESPASS(); break; Loading
media/libstagefright/rtsp/MyHandler.h +30 −2 Original line number Diff line number Diff line Loading @@ -88,7 +88,8 @@ struct MyHandler : public AHandler { mCheckPending(false), mCheckGeneration(0), mTryTCPInterleaving(false), mReceivedFirstRTCPPacket(false) { mReceivedFirstRTCPPacket(false), mSeekable(false) { mNetLooper->setName("rtsp net"); mNetLooper->start(false /* runOnCallingThread */, false /* canCallJava */, Loading @@ -115,9 +116,10 @@ struct MyHandler : public AHandler { (new AMessage('abor', id()))->post(); } void seek(int64_t timeUs) { void seek(int64_t timeUs, const sp<AMessage> &doneMsg) { sp<AMessage> msg = new AMessage('seek', id()); msg->setInt64("time", timeUs); msg->setMessage("doneMsg", doneMsg); msg->post(); } Loading Loading @@ -379,6 +381,7 @@ struct MyHandler : public AHandler { mFirstAccessUnitNTP = 0; mNumAccessUnitsReceived = 0; mReceivedFirstRTCPPacket = false; mSeekable = false; sp<AMessage> reply = new AMessage('tear', id()); Loading Loading @@ -551,7 +554,17 @@ struct MyHandler : public AHandler { case 'seek': { sp<AMessage> doneMsg; CHECK(msg->findMessage("doneMsg", &doneMsg)); if (mSeekPending) { doneMsg->post(); break; } if (!mSeekable) { LOGW("This is a live stream, ignoring seek request."); doneMsg->post(); break; } Loading @@ -577,6 +590,7 @@ struct MyHandler : public AHandler { sp<AMessage> reply = new AMessage('see1', id()); reply->setInt64("time", timeUs); reply->setMessage("doneMsg", doneMsg); mConn->sendRequest(request.c_str(), reply); break; } Loading Loading @@ -605,7 +619,11 @@ struct MyHandler : public AHandler { request.append("\r\n"); sp<AMessage> doneMsg; CHECK(msg->findMessage("doneMsg", &doneMsg)); sp<AMessage> reply = new AMessage('see2', id()); reply->setMessage("doneMsg", doneMsg); mConn->sendRequest(request.c_str(), reply); break; } Loading Loading @@ -644,6 +662,11 @@ struct MyHandler : public AHandler { } mSeekPending = false; sp<AMessage> doneMsg; CHECK(msg->findMessage("doneMsg", &doneMsg)); doneMsg->post(); break; } Loading Loading @@ -714,6 +737,8 @@ struct MyHandler : public AHandler { } void parsePlayResponse(const sp<ARTSPResponse> &response) { mSeekable = false; ssize_t i = response->mHeaders.indexOfKey("range"); if (i < 0) { // Server doesn't even tell use what range it is going to Loading Loading @@ -777,6 +802,8 @@ struct MyHandler : public AHandler { ++n; } mSeekable = true; } sp<APacketSource> getPacketSource(size_t index) { Loading Loading @@ -808,6 +835,7 @@ private: int32_t mCheckGeneration; bool mTryTCPInterleaving; bool mReceivedFirstRTCPPacket; bool mSeekable; struct TrackInfo { AString mURL; Loading