Loading include/media/stagefright/NuMediaExtractor.h +11 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #define NU_MEDIA_EXTRACTOR_H_ #include <media/stagefright/foundation/ABase.h> #include <media/stagefright/MediaSource.h> #include <utils/Errors.h> #include <utils/KeyedVector.h> #include <utils/RefBase.h> Loading Loading @@ -53,8 +54,12 @@ struct NuMediaExtractor : public RefBase { status_t getTrackFormat(size_t index, sp<AMessage> *format) const; status_t selectTrack(size_t index); status_t unselectTrack(size_t index); status_t seekTo(int64_t timeUs); status_t seekTo( int64_t timeUs, MediaSource::ReadOptions::SeekMode mode = MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); status_t advance(); status_t readSampleData(const sp<ABuffer> &buffer); Loading Loading @@ -93,7 +98,11 @@ private: int64_t mTotalBitrate; // in bits/sec int64_t mDurationUs; ssize_t fetchTrackSamples(int64_t seekTimeUs = -1ll); ssize_t fetchTrackSamples( int64_t seekTimeUs = -1ll, MediaSource::ReadOptions::SeekMode mode = MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); void releaseTrackSamples(); bool getTotalBitrate(int64_t *bitRate) const; Loading media/libstagefright/NuMediaExtractor.cpp +47 −4 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; Loading @@ -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); Loading @@ -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; Loading Loading
include/media/stagefright/NuMediaExtractor.h +11 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #define NU_MEDIA_EXTRACTOR_H_ #include <media/stagefright/foundation/ABase.h> #include <media/stagefright/MediaSource.h> #include <utils/Errors.h> #include <utils/KeyedVector.h> #include <utils/RefBase.h> Loading Loading @@ -53,8 +54,12 @@ struct NuMediaExtractor : public RefBase { status_t getTrackFormat(size_t index, sp<AMessage> *format) const; status_t selectTrack(size_t index); status_t unselectTrack(size_t index); status_t seekTo(int64_t timeUs); status_t seekTo( int64_t timeUs, MediaSource::ReadOptions::SeekMode mode = MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); status_t advance(); status_t readSampleData(const sp<ABuffer> &buffer); Loading Loading @@ -93,7 +98,11 @@ private: int64_t mTotalBitrate; // in bits/sec int64_t mDurationUs; ssize_t fetchTrackSamples(int64_t seekTimeUs = -1ll); ssize_t fetchTrackSamples( int64_t seekTimeUs = -1ll, MediaSource::ReadOptions::SeekMode mode = MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); void releaseTrackSamples(); bool getTotalBitrate(int64_t *bitRate) const; Loading
media/libstagefright/NuMediaExtractor.cpp +47 −4 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; Loading @@ -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); Loading @@ -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; Loading