@@ -38,7 +38,8 @@ NuPlayer::RTSPSource::RTSPSource(
3838 mFlags(0 ),
3939 mState(DISCONNECTED ),
4040 mFinalResult(OK ),
41- mDisconnectReplyID(0 ) {
41+ mDisconnectReplyID(0 ),
42+ mSeekGeneration(0 ) {
4243 if (headers) {
4344 mExtraHeaders = *headers;
4445
@@ -146,14 +147,21 @@ status_t NuPlayer::RTSPSource::getDuration(int64_t *durationUs) {
146147}
147148
148149status_t NuPlayer::RTSPSource::seekTo (int64_t seekTimeUs) {
150+ sp<AMessage> msg = new AMessage (kWhatPerformSeek , mReflector ->id ());
151+ msg->setInt32 (" generation" , ++mSeekGeneration );
152+ msg->setInt64 (" timeUs" , seekTimeUs);
153+ msg->post (200000ll );
154+
155+ return OK ;
156+ }
157+
158+ void NuPlayer::RTSPSource::performSeek (int64_t seekTimeUs) {
149159 if (mState != CONNECTED ) {
150- return UNKNOWN_ERROR ;
160+ return ;
151161 }
152162
153163 mState = SEEKING ;
154164 mHandler ->seek (seekTimeUs);
155-
156- return OK ;
157165}
158166
159167bool NuPlayer::RTSPSource::isSeekable () {
@@ -168,6 +176,20 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) {
168176 mDisconnectReplyID = replyID;
169177 finishDisconnectIfPossible ();
170178 return ;
179+ } else if (msg->what () == kWhatPerformSeek ) {
180+ int32_t generation;
181+ CHECK (msg->findInt32 (" generation" , &generation));
182+
183+ if (generation != mSeekGeneration ) {
184+ // obsolete.
185+ return ;
186+ }
187+
188+ int64_t seekTimeUs;
189+ CHECK (msg->findInt64 (" timeUs" , &seekTimeUs));
190+
191+ performSeek (seekTimeUs);
192+ return ;
171193 }
172194
173195 CHECK_EQ (msg->what (), (int )kWhatNotify );
0 commit comments