summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/timedtext/TimedTextDriver.cpp
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2012-04-11 17:56:22 -0700
committerJames Dong <jdong@google.com>2012-04-16 12:08:10 -0700
commiteec46abb88dcc50621fd2d3f17a6b8d24fd07a19 (patch)
tree0b3e4cfec4f7f76a99bc82907c205253fb7c2ebe /media/libstagefright/timedtext/TimedTextDriver.cpp
parent25736fd247ba757feefe15d3071f7e747c64fea4 (diff)
downloadframeworks_av-eec46abb88dcc50621fd2d3f17a6b8d24fd07a19.zip
frameworks_av-eec46abb88dcc50621fd2d3f17a6b8d24fd07a19.tar.gz
frameworks_av-eec46abb88dcc50621fd2d3f17a6b8d24fd07a19.tar.bz2
Fix for multiple audio/timed track feature implementation - part one
o getTrackInfo now returns all tracks, rather than just the timed text tracks. o the index of the track info is kept to the same as the track index if the track is not from an external source o correctly maps the selectTrack() and unselectTrack() calls to the right track index o TODO: 1) note that the selectTrack() and unselectTrack() only works for timed text track at present; 2) the lock is timed text specific o related-to-bug: 6110705 Change-Id: Ib1feeef2184bc992930ace0d1197b6c00a2636d7
Diffstat (limited to 'media/libstagefright/timedtext/TimedTextDriver.cpp')
-rw-r--r--media/libstagefright/timedtext/TimedTextDriver.cpp59
1 files changed, 36 insertions, 23 deletions
diff --git a/media/libstagefright/timedtext/TimedTextDriver.cpp b/media/libstagefright/timedtext/TimedTextDriver.cpp
index a99d882..e26f517 100644
--- a/media/libstagefright/timedtext/TimedTextDriver.cpp
+++ b/media/libstagefright/timedtext/TimedTextDriver.cpp
@@ -52,16 +52,13 @@ TimedTextDriver::TimedTextDriver(
TimedTextDriver::~TimedTextDriver() {
mTextSourceVector.clear();
+ mTextSourceTypeVector.clear();
mLooper->stop();
}
-status_t TimedTextDriver::selectTrack_l(int32_t index) {
- if (index >= (int)(mTextSourceVector.size())) {
- return BAD_VALUE;
- }
-
+status_t TimedTextDriver::selectTrack_l(size_t index) {
sp<TimedTextSource> source;
- source = mTextSourceVector.itemAt(index);
+ source = mTextSourceVector.valueFor(index);
mPlayer->setDataSource(source);
if (mState == UNINITIALIZED) {
mState = PAUSED;
@@ -108,7 +105,7 @@ status_t TimedTextDriver::pause() {
return OK;
}
-status_t TimedTextDriver::selectTrack(int32_t index) {
+status_t TimedTextDriver::selectTrack(size_t index) {
status_t ret = OK;
Mutex::Autolock autoLock(mLock);
switch (mState) {
@@ -130,7 +127,7 @@ status_t TimedTextDriver::selectTrack(int32_t index) {
return ret;
}
-status_t TimedTextDriver::unselectTrack(int32_t index) {
+status_t TimedTextDriver::unselectTrack(size_t index) {
if (mCurrentTrackIndex != index) {
return INVALID_OPERATION;
}
@@ -149,19 +146,21 @@ status_t TimedTextDriver::seekToAsync(int64_t timeUs) {
}
status_t TimedTextDriver::addInBandTextSource(
- const sp<MediaSource>& mediaSource) {
+ size_t trackIndex, const sp<MediaSource>& mediaSource) {
sp<TimedTextSource> source =
TimedTextSource::CreateTimedTextSource(mediaSource);
if (source == NULL) {
return ERROR_UNSUPPORTED;
}
Mutex::Autolock autoLock(mLock);
- mTextSourceVector.add(source);
+ mTextSourceVector.add(trackIndex, source);
+ mTextSourceTypeVector.add(true);
return OK;
}
status_t TimedTextDriver::addOutOfBandTextSource(
- const char *uri, const char *mimeType) {
+ size_t trackIndex, const char *uri, const char *mimeType) {
+
// To support local subtitle file only for now
if (strncasecmp("file://", uri, 7)) {
ALOGE("uri('%s') is not a file", uri);
@@ -170,11 +169,11 @@ status_t TimedTextDriver::addOutOfBandTextSource(
sp<DataSource> dataSource =
DataSource::CreateFromURI(uri);
- return createOutOfBandTextSource(mimeType, dataSource);
+ return createOutOfBandTextSource(trackIndex, mimeType, dataSource);
}
status_t TimedTextDriver::addOutOfBandTextSource(
- int fd, off64_t offset, off64_t length, const char *mimeType) {
+ size_t trackIndex, int fd, off64_t offset, off64_t length, const char *mimeType) {
if (fd < 0) {
ALOGE("Invalid file descriptor: %d", fd);
@@ -182,11 +181,13 @@ status_t TimedTextDriver::addOutOfBandTextSource(
}
sp<DataSource> dataSource = new FileSource(dup(fd), offset, length);
- return createOutOfBandTextSource(mimeType, dataSource);
+ return createOutOfBandTextSource(trackIndex, mimeType, dataSource);
}
status_t TimedTextDriver::createOutOfBandTextSource(
- const char *mimeType, const sp<DataSource>& dataSource) {
+ size_t trackIndex,
+ const char *mimeType,
+ const sp<DataSource>& dataSource) {
if (dataSource == NULL) {
return ERROR_UNSUPPORTED;
@@ -199,28 +200,40 @@ status_t TimedTextDriver::createOutOfBandTextSource(
}
if (source == NULL) {
+ ALOGE("Failed to create timed text source");
return ERROR_UNSUPPORTED;
}
Mutex::Autolock autoLock(mLock);
- mTextSourceVector.add(source);
+ mTextSourceVector.add(trackIndex, source);
+ mTextSourceTypeVector.add(false);
return OK;
}
-void TimedTextDriver::getTrackInfo(Parcel *parcel) {
+size_t TimedTextDriver::countExternalTracks() const {
+ size_t nTracks = 0;
+ for (size_t i = 0, n = mTextSourceTypeVector.size(); i < n; ++i) {
+ if (!mTextSourceTypeVector[i]) {
+ ++nTracks;
+ }
+ }
+ return nTracks;
+}
+
+void TimedTextDriver::getExternalTrackInfo(Parcel *parcel) {
Mutex::Autolock autoLock(mLock);
- Vector<sp<TimedTextSource> >::const_iterator iter;
- parcel->writeInt32(mTextSourceVector.size());
- for (iter = mTextSourceVector.begin();
- iter != mTextSourceVector.end(); ++iter) {
- sp<MetaData> meta = (*iter)->getFormat();
+ for (size_t i = 0, n = mTextSourceTypeVector.size(); i < n; ++i) {
+ if (mTextSourceTypeVector[i]) {
+ continue;
+ }
+
+ sp<MetaData> meta = mTextSourceVector.valueAt(i)->getFormat();
// There are two fields.
parcel->writeInt32(2);
// track type.
parcel->writeInt32(MEDIA_TRACK_TYPE_TIMEDTEXT);
-
const char *lang = "und";
if (meta != NULL) {
meta->findCString(kKeyMediaLanguage, &lang);