diff options
author | Andreas Huber <andih@google.com> | 2012-04-25 16:00:45 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-04-26 10:44:39 -0700 |
commit | 9d07855aaff8a6b502a3ab058002cdd4a278b965 (patch) | |
tree | 4b9eebadf7b227b51814f02b6d38bc48e27a3da6 /media/libstagefright/NuMediaExtractor.cpp | |
parent | 940335776b6d4eb91b13c4e56bc20bed3ac0011b (diff) | |
download | frameworks_av-9d07855aaff8a6b502a3ab058002cdd4a278b965.zip frameworks_av-9d07855aaff8a6b502a3ab058002cdd4a278b965.tar.gz frameworks_av-9d07855aaff8a6b502a3ab058002cdd4a278b965.tar.bz2 |
NuMediaExtractor API to unselect tracks and finer control over seeking.
Change-Id: I44d5a2b01d34b771bb0ff48b12829e33314c2374
related-to-bug: 6276111
Diffstat (limited to 'media/libstagefright/NuMediaExtractor.cpp')
-rw-r--r-- | media/libstagefright/NuMediaExtractor.cpp | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/media/libstagefright/NuMediaExtractor.cpp b/media/libstagefright/NuMediaExtractor.cpp index 7cfb8ea..5f3f63f 100644 --- a/media/libstagefright/NuMediaExtractor.cpp +++ b/media/libstagefright/NuMediaExtractor.cpp @@ -384,6 +384,47 @@ status_t NuMediaExtractor::selectTrack(size_t index) { return OK; } +status_t NuMediaExtractor::unselectTrack(size_t index) { + Mutex::Autolock autoLock(mLock); + + if (mImpl == NULL) { + return -EINVAL; + } + + if (index >= mImpl->countTracks()) { + return -ERANGE; + } + + size_t i; + for (i = 0; i < mSelectedTracks.size(); ++i) { + TrackInfo *info = &mSelectedTracks.editItemAt(i); + + if (info->mTrackIndex == index) { + break; + } + } + + if (i == mSelectedTracks.size()) { + // Not selected. + return OK; + } + + TrackInfo *info = &mSelectedTracks.editItemAt(i); + + if (info->mSample != NULL) { + info->mSample->release(); + info->mSample = NULL; + + info->mSampleTimeUs = -1ll; + } + + CHECK_EQ((status_t)OK, info->mSource->stop()); + + mSelectedTracks.removeAt(i); + + return OK; +} + void NuMediaExtractor::releaseTrackSamples() { for (size_t i = 0; i < mSelectedTracks.size(); ++i) { TrackInfo *info = &mSelectedTracks.editItemAt(i); @@ -397,7 +438,8 @@ void NuMediaExtractor::releaseTrackSamples() { } } -ssize_t NuMediaExtractor::fetchTrackSamples(int64_t seekTimeUs) { +ssize_t NuMediaExtractor::fetchTrackSamples( + int64_t seekTimeUs, MediaSource::ReadOptions::SeekMode mode) { TrackInfo *minInfo = NULL; ssize_t minIndex = -1; @@ -419,7 +461,7 @@ ssize_t NuMediaExtractor::fetchTrackSamples(int64_t seekTimeUs) { if (info->mSample == NULL) { MediaSource::ReadOptions options; if (seekTimeUs >= 0ll) { - options.setSeekTo(seekTimeUs); + options.setSeekTo(seekTimeUs, mode); } status_t err = info->mSource->read(&info->mSample, &options); @@ -445,10 +487,11 @@ ssize_t NuMediaExtractor::fetchTrackSamples(int64_t seekTimeUs) { return minIndex; } -status_t NuMediaExtractor::seekTo(int64_t timeUs) { +status_t NuMediaExtractor::seekTo( + int64_t timeUs, MediaSource::ReadOptions::SeekMode mode) { Mutex::Autolock autoLock(mLock); - ssize_t minIndex = fetchTrackSamples(timeUs); + ssize_t minIndex = fetchTrackSamples(timeUs, mode); if (minIndex < 0) { return ERROR_END_OF_STREAM; |