From eec46abb88dcc50621fd2d3f17a6b8d24fd07a19 Mon Sep 17 00:00:00 2001 From: James Dong Date: Wed, 11 Apr 2012 17:56:22 -0700 Subject: 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 --- media/libstagefright/timedtext/TimedTextDriver.cpp | 59 +++++++++++++--------- 1 file changed, 36 insertions(+), 23 deletions(-) (limited to 'media/libstagefright/timedtext/TimedTextDriver.cpp') 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 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) { + size_t trackIndex, const sp& mediaSource) { sp 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::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 = 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) { + size_t trackIndex, + const char *mimeType, + const sp& 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 >::const_iterator iter; - parcel->writeInt32(mTextSourceVector.size()); - for (iter = mTextSourceVector.begin(); - iter != mTextSourceVector.end(); ++iter) { - sp meta = (*iter)->getFormat(); + for (size_t i = 0, n = mTextSourceTypeVector.size(); i < n; ++i) { + if (mTextSourceTypeVector[i]) { + continue; + } + + sp 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); -- cgit v1.1