Merge "Handle the case when there is no timed text track" into jb-dev
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index b15cb67..1387e74 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -1345,7 +1345,7 @@
}
void AwesomePlayer::addTextSource(size_t trackIndex, const sp<MediaSource>& source) {
- Mutex::Autolock autoLock(mTimedTextLock);
+ Mutex::Autolock autoLock(mLock);
CHECK(source != NULL);
if (mTextDriver == NULL) {
@@ -1395,7 +1395,6 @@
if (mAudioSource != NULL) {
Mutex::Autolock autoLock(mStatsLock);
TrackStat *stat = &mStats.mTracks.editItemAt(mStats.mAudioTrackIndex);
-
const char *component;
if (!mAudioSource->getFormat()
->findCString(kKeyDecoderComponent, &component)) {
@@ -2268,13 +2267,13 @@
}
status_t AwesomePlayer::getTrackInfo(Parcel *reply) const {
- Mutex::Autolock autoLock(mTimedTextLock);
- if (mTextDriver == NULL) {
- return INVALID_OPERATION;
+ Mutex::Autolock autoLock(mLock);
+ size_t trackCount = mExtractor->countTracks();
+ if (mTextDriver != NULL) {
+ trackCount += mTextDriver->countExternalTracks();
}
- reply->writeInt32(mTextDriver->countExternalTracks() +
- mExtractor->countTracks());
+ reply->writeInt32(trackCount);
for (size_t i = 0; i < mExtractor->countTracks(); ++i) {
sp<MetaData> meta = mExtractor->getTrackMetaData(i);
@@ -2296,28 +2295,31 @@
}
const char *lang;
- if (meta->findCString(kKeyMediaLanguage, &lang)) {
- reply->writeString16(String16(lang));
- } else {
- reply->writeString16(String16(""));
+ if (!meta->findCString(kKeyMediaLanguage, &lang)) {
+ lang = "und";
}
+ reply->writeString16(String16(lang));
}
- mTextDriver->getExternalTrackInfo(reply);
+ if (mTextDriver != NULL) {
+ mTextDriver->getExternalTrackInfo(reply);
+ }
return OK;
}
// FIXME:
// At present, only timed text track is able to be selected or unselected.
status_t AwesomePlayer::selectTrack(size_t trackIndex, bool select) {
- Mutex::Autolock autoLock(mTimedTextLock);
- if (mTextDriver == NULL) {
- return INVALID_OPERATION;
+ ALOGV("selectTrack: trackIndex = %d and select=%d", trackIndex, select);
+ Mutex::Autolock autoLock(mLock);
+ size_t trackCount = mExtractor->countTracks();
+ if (mTextDriver != NULL) {
+ trackCount += mTextDriver->countExternalTracks();
}
- if (trackIndex >= mExtractor->countTracks()
- + mTextDriver->countExternalTracks()) {
- return BAD_VALUE;
+ if (trackIndex >= trackCount) {
+ ALOGE("Track index (%d) is out of range [0, %d)", trackIndex, trackCount);
+ return ERROR_OUT_OF_RANGE;
}
if (trackIndex < mExtractor->countTracks()) {
@@ -2331,6 +2333,11 @@
}
}
+ // Timed text track handling
+ if (mTextDriver == NULL) {
+ return INVALID_OPERATION;
+ }
+
status_t err = OK;
if (select) {
err = mTextDriver->selectTrack(trackIndex);
@@ -2371,7 +2378,7 @@
}
case INVOKE_ID_ADD_EXTERNAL_SOURCE:
{
- Mutex::Autolock autoLock(mTimedTextLock);
+ Mutex::Autolock autoLock(mLock);
if (mTextDriver == NULL) {
mTextDriver = new TimedTextDriver(mListener);
}
@@ -2383,7 +2390,7 @@
}
case INVOKE_ID_ADD_EXTERNAL_SOURCE_FD:
{
- Mutex::Autolock autoLock(mTimedTextLock);
+ Mutex::Autolock autoLock(mLock);
if (mTextDriver == NULL) {
mTextDriver = new TimedTextDriver(mListener);
}
@@ -2398,12 +2405,12 @@
case INVOKE_ID_SELECT_TRACK:
{
int trackIndex = request.readInt32();
- return selectTrack(trackIndex, true);
+ return selectTrack(trackIndex, true /* select */);
}
case INVOKE_ID_UNSELECT_TRACK:
{
int trackIndex = request.readInt32();
- return selectTrack(trackIndex, false);
+ return selectTrack(trackIndex, false /* select */);
}
default:
{
diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h
index 9115f91..a2e2e85 100644
--- a/media/libstagefright/include/AwesomePlayer.h
+++ b/media/libstagefright/include/AwesomePlayer.h
@@ -232,7 +232,6 @@
int64_t mLastVideoTimeUs;
TimedTextDriver *mTextDriver;
- mutable Mutex mTimedTextLock;
sp<WVMExtractor> mWVMExtractor;
sp<MediaExtractor> mExtractor;