NuPlayer: add missing getSelectedTrack in CCDecoder
Test: cts
Bug: 119938763
Change-Id: I0dcc35ec65f0912d43aa5b0e3a797334d2581a78
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
index 5ea600f..b487c01 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
@@ -825,20 +825,31 @@
case kWhatGetSelectedTrack:
{
+ int32_t type32;
+ CHECK(msg->findInt32("type", (int32_t*)&type32));
+ media_track_type type = (media_track_type)type32;
+
+ size_t inbandTracks = 0;
status_t err = INVALID_OPERATION;
+ ssize_t selectedTrack = -1;
if (mCurrentSourceInfo.mSource != NULL) {
err = OK;
-
- int32_t type32;
- CHECK(msg->findInt32("type", (int32_t*)&type32));
- media_track_type type = (media_track_type)type32;
- ssize_t selectedTrack = mCurrentSourceInfo.mSource->getSelectedTrack(type);
-
- PlayerMessage* reply;
- CHECK(msg->findPointer("reply", (void**)&reply));
- reply->add_values()->set_int32_value(selectedTrack);
+ inbandTracks = mCurrentSourceInfo.mSource->getTrackCount();
+ selectedTrack = mCurrentSourceInfo.mSource->getSelectedTrack(type);
}
+ if (selectedTrack == -1 && mCCDecoder != NULL) {
+ err = OK;
+ selectedTrack = mCCDecoder->getSelectedTrack(type);
+ if (selectedTrack != -1) {
+ selectedTrack += inbandTracks;
+ }
+ }
+
+ PlayerMessage* reply;
+ CHECK(msg->findPointer("reply", (void**)&reply));
+ reply->add_values()->set_int32_value(selectedTrack);
+
sp<AMessage> response = new AMessage;
response->setInt32("err", err);
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.cpp
index e215965..a9f2104 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.cpp
@@ -199,6 +199,18 @@
return OK;
}
+ssize_t NuPlayer2::CCDecoder::getSelectedTrack(media_track_type type) const {
+ if (mSelectedTrack != -1) {
+ CCTrack track = mTracks[mSelectedTrack];
+ if (track.mTrackType == kTrackTypeCEA608 || track.mTrackType == kTrackTypeCEA708) {
+ return (type == MEDIA_TRACK_TYPE_SUBTITLE ? mSelectedTrack : -1);
+ }
+ return (type == MEDIA_TRACK_TYPE_UNKNOWN ? mSelectedTrack : -1);
+ }
+
+ return -1;
+}
+
bool NuPlayer2::CCDecoder::isSelected() const {
return mSelectedTrack >= 0 && mSelectedTrack < (int32_t)getTrackCount();
}
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.h b/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.h
index 57d5ea2..97834d1 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.h
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.h
@@ -38,6 +38,7 @@
size_t getTrackCount() const;
sp<AMessage> getTrackInfo(size_t index) const;
status_t selectTrack(size_t index, bool select);
+ ssize_t getSelectedTrack(media_track_type type) const;
bool isSelected() const;
void decode(const sp<ABuffer> &accessUnit);
void display(int64_t timeUs);