summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/NuMediaExtractor.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-04-25 16:00:45 -0700
committerAndreas Huber <andih@google.com>2012-04-26 10:44:39 -0700
commit9d07855aaff8a6b502a3ab058002cdd4a278b965 (patch)
tree4b9eebadf7b227b51814f02b6d38bc48e27a3da6 /media/libstagefright/NuMediaExtractor.cpp
parent940335776b6d4eb91b13c4e56bc20bed3ac0011b (diff)
downloadframeworks_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.cpp51
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;