Bug fix: MediaPlayer's deselectTrack() for subtitle.

o Previously, deselectTrack() actually doesn't work properly in
TimedTextDriver / TimedTextPlayer.
o Ignores select track operation when the same track is selected in a
row.

Bug: 7200096
TESTED=runtest -d cts-media -c android.media.cts.MediaPlayerTest

Change-Id: If7feac294cf9b358f616be45574bc2e26001c887
diff --git a/media/libstagefright/timedtext/TimedTextDriver.cpp b/media/libstagefright/timedtext/TimedTextDriver.cpp
index 54ce7ac..12fd7f4 100644
--- a/media/libstagefright/timedtext/TimedTextDriver.cpp
+++ b/media/libstagefright/timedtext/TimedTextDriver.cpp
@@ -43,7 +43,8 @@
         const wp<MediaPlayerBase> &listener)
     : mLooper(new ALooper),
       mListener(listener),
-      mState(UNINITIALIZED) {
+      mState(UNINITIALIZED),
+      mCurrentTrackIndex(UINT_MAX) {
     mLooper->setName("TimedTextDriver");
     mLooper->start();
     mPlayer = new TimedTextPlayer(listener);
@@ -57,6 +58,9 @@
 }
 
 status_t TimedTextDriver::selectTrack_l(size_t index) {
+    if (mCurrentTrackIndex == index) {
+        return OK;
+    }
     sp<TimedTextSource> source;
     source = mTextSourceVector.valueFor(index);
     mPlayer->setDataSource(source);
@@ -138,11 +142,12 @@
     if (mCurrentTrackIndex != index) {
         return INVALID_OPERATION;
     }
+    mCurrentTrackIndex = UINT_MAX;
     switch (mState) {
         case UNINITIALIZED:
             return INVALID_OPERATION;
         case PLAYING:
-            mPlayer->pause();
+            mPlayer->setDataSource(NULL);
             mState = UNINITIALIZED;
             return OK;
         case PREPARED:
diff --git a/media/libstagefright/timedtext/TimedTextPlayer.cpp b/media/libstagefright/timedtext/TimedTextPlayer.cpp
index e3bdd8a..9fb0afe 100644
--- a/media/libstagefright/timedtext/TimedTextPlayer.cpp
+++ b/media/libstagefright/timedtext/TimedTextPlayer.cpp
@@ -183,11 +183,20 @@
             break;
         }
         case kWhatSetSource: {
+            mSendSubtitleGeneration++;
             sp<RefBase> obj;
             msg->findObject("source", &obj);
-            if (obj == NULL) break;
             if (mSource != NULL) {
                 mSource->stop();
+                mSource.clear();
+                mSource = NULL;
+            }
+            // null source means deselect track.
+            if (obj == NULL) {
+                mPendingSeekTimeUs = kInvalidTimeUs;
+                mPaused = false;
+                notifyListener();
+                break;
             }
             mSource = static_cast<TimedTextSource*>(obj.get());
             status_t err = mSource->start();
@@ -217,6 +226,7 @@
     int64_t startTimeUs = 0;
     int64_t endTimeUs = 0;
     sp<ParcelEvent> parcelEvent = new ParcelEvent();
+    CHECK(mSource != NULL);
     status_t err = mSource->read(&startTimeUs, &endTimeUs,
                                  &(parcelEvent->parcel), options);
     if (err == WOULD_BLOCK) {