Loading media/libmediaextractor/include/media/DataSource.h +6 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <sys/types.h> #include <media/stagefright/MediaErrors.h> #include <media/DataSourceBase.h> #include <media/IDataSource.h> #include <utils/Errors.h> #include <utils/RefBase.h> #include <utils/threads.h> Loading @@ -35,6 +36,11 @@ class DataSource : public DataSourceBase, public virtual RefBase { public: DataSource() {} // returns a pointer to IDataSource if it is wrapped. virtual sp<IDataSource> getIDataSource() const { return nullptr; } protected: virtual ~DataSource() {} Loading media/libmediaplayer2/nuplayer2/GenericSource2.cpp +40 −22 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/AMessage.h> #include <media/stagefright/DataSourceFactory.h> #include <media/stagefright/FileSource.h> #include <media/stagefright/InterfaceUtils.h> #include <media/stagefright/MediaBuffer.h> #include <media/stagefright/MediaClock.h> Loading Loading @@ -161,30 +162,15 @@ sp<MetaData> NuPlayer2::GenericSource2::getFileFormatMeta() const { status_t NuPlayer2::GenericSource2::initFromDataSource() { sp<IMediaExtractor> extractor; CHECK(mDataSource != NULL || mFd != -1); CHECK(mDataSource != NULL); sp<DataSource> dataSource = mDataSource; const int fd = mFd; const int64_t offset = mOffset; const int64_t length = mLength; mLock.unlock(); // This might take long time if data source is not reliable. if (dataSource != nullptr) { extractor = MediaExtractorFactory::Create(dataSource, NULL /* mime */); } else { extractor = MediaExtractorFactory::CreateFromFd( fd, offset, length, NULL /* mime */, &dataSource); } if (dataSource == nullptr) { ALOGE("initFromDataSource, failed to create data source!"); mLock.lock(); return UNKNOWN_ERROR; } extractor = MediaExtractorFactory::Create(dataSource, NULL); if (extractor == NULL) { ALOGE("initFromDataSource, cannot create extractor!"); mLock.lock(); return UNKNOWN_ERROR; } Loading @@ -193,13 +179,10 @@ status_t NuPlayer2::GenericSource2::initFromDataSource() { size_t numtracks = extractor->countTracks(); if (numtracks == 0) { ALOGE("initFromDataSource, source has no track!"); mLock.lock(); return UNKNOWN_ERROR; } mLock.lock(); mFd = -1; mDataSource = dataSource; mFileMeta = fileMeta; if (mFileMeta != NULL) { int64_t duration; Loading Loading @@ -408,16 +391,51 @@ void NuPlayer2::GenericSource2::onPrepareAsync() { if (!mDisconnected) { mDataSource = dataSource; } } else { if (property_get_bool("media.stagefright.extractremote", true) && !FileSource::requiresDrm(mFd, mOffset, mLength, nullptr /* mime */)) { sp<IBinder> binder = defaultServiceManager()->getService(String16("media.extractor")); if (binder != nullptr) { ALOGD("FileSource remote"); sp<IMediaExtractorService> mediaExService( interface_cast<IMediaExtractorService>(binder)); sp<IDataSource> source = mediaExService->makeIDataSource(mFd, mOffset, mLength); ALOGV("IDataSource(FileSource): %p %d %lld %lld", source.get(), mFd, (long long)mOffset, (long long)mLength); if (source.get() != nullptr) { mDataSource = CreateDataSourceFromIDataSource(source); if (mDataSource != nullptr) { // Close the local file descriptor as it is not needed anymore. close(mFd); mFd = -1; } } else { ALOGW("extractor service cannot make data source"); } } else { ALOGW("extractor service not running"); } } if (mDataSource == nullptr) { ALOGD("FileSource local"); mDataSource = new FileSource(mFd, mOffset, mLength); } // TODO: close should always be done on mFd, see the lines following // CreateDataSourceFromIDataSource above, // and the FileSource constructor should dup the mFd argument as needed. mFd = -1; } if (mFd == -1 && mDataSource == NULL) { if (mDataSource == NULL) { ALOGE("Failed to create data source!"); notifyPreparedAndCleanup(UNKNOWN_ERROR); return; } } if (mDataSource != nullptr && mDataSource->flags() & DataSource::kIsCachingDataSource) { if (mDataSource->flags() & DataSource::kIsCachingDataSource) { mCachedSource = static_cast<NuCachedSource2 *>(mDataSource.get()); } Loading media/libmediaplayerservice/nuplayer/GenericSource.cpp +41 −22 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include <media/MediaBufferHolder.h> #include <media/MediaExtractor.h> #include <media/MediaSource.h> #include <media/IMediaExtractorService.h> #include <media/IMediaHTTPService.h> #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ADebug.h> Loading Loading @@ -161,30 +162,15 @@ sp<MetaData> NuPlayer::GenericSource::getFileFormatMeta() const { status_t NuPlayer::GenericSource::initFromDataSource() { sp<IMediaExtractor> extractor; CHECK(mDataSource != NULL || mFd != -1); CHECK(mDataSource != NULL); sp<DataSource> dataSource = mDataSource; const int fd = mFd; const int64_t offset = mOffset; const int64_t length = mLength; mLock.unlock(); // This might take long time if data source is not reliable. if (dataSource != nullptr) { extractor = MediaExtractorFactory::Create(dataSource, NULL /* mime */); } else { extractor = MediaExtractorFactory::CreateFromFd( fd, offset, length, NULL /* mime */, &dataSource); } if (dataSource == nullptr) { ALOGE("initFromDataSource, failed to create data source!"); mLock.lock(); return UNKNOWN_ERROR; } extractor = MediaExtractorFactory::Create(dataSource, NULL); if (extractor == NULL) { ALOGE("initFromDataSource, cannot create extractor!"); mLock.lock(); return UNKNOWN_ERROR; } Loading @@ -193,13 +179,10 @@ status_t NuPlayer::GenericSource::initFromDataSource() { size_t numtracks = extractor->countTracks(); if (numtracks == 0) { ALOGE("initFromDataSource, source has no track!"); mLock.lock(); return UNKNOWN_ERROR; } mLock.lock(); mFd = -1; mDataSource = dataSource; mFileMeta = fileMeta; if (mFileMeta != NULL) { int64_t duration; Loading Loading @@ -403,15 +386,51 @@ void NuPlayer::GenericSource::onPrepareAsync() { if (!mDisconnected) { mDataSource = dataSource; } } else { if (property_get_bool("media.stagefright.extractremote", true) && !FileSource::requiresDrm(mFd, mOffset, mLength, nullptr /* mime */)) { sp<IBinder> binder = defaultServiceManager()->getService(String16("media.extractor")); if (binder != nullptr) { ALOGD("FileSource remote"); sp<IMediaExtractorService> mediaExService( interface_cast<IMediaExtractorService>(binder)); sp<IDataSource> source = mediaExService->makeIDataSource(mFd, mOffset, mLength); ALOGV("IDataSource(FileSource): %p %d %lld %lld", source.get(), mFd, (long long)mOffset, (long long)mLength); if (source.get() != nullptr) { mDataSource = CreateDataSourceFromIDataSource(source); if (mDataSource != nullptr) { // Close the local file descriptor as it is not needed anymore. close(mFd); mFd = -1; } } else { ALOGW("extractor service cannot make data source"); } } else { ALOGW("extractor service not running"); } } if (mFd == -1 && mDataSource == NULL) { if (mDataSource == nullptr) { ALOGD("FileSource local"); mDataSource = new FileSource(mFd, mOffset, mLength); } // TODO: close should always be done on mFd, see the lines following // CreateDataSourceFromIDataSource above, // and the FileSource constructor should dup the mFd argument as needed. mFd = -1; } if (mDataSource == NULL) { ALOGE("Failed to create data source!"); notifyPreparedAndCleanup(UNKNOWN_ERROR); return; } } if (mDataSource != nullptr && mDataSource->flags() & DataSource::kIsCachingDataSource) { if (mDataSource->flags() & DataSource::kIsCachingDataSource) { mCachedSource = static_cast<NuCachedSource2 *>(mDataSource.get()); } Loading media/libstagefright/CallbackDataSource.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,10 @@ sp<DecryptHandle> CallbackDataSource::DrmInitialization(const char *mime) { return mIDataSource->DrmInitialization(mime); } sp<IDataSource> CallbackDataSource::getIDataSource() const { return mIDataSource; } TinyCacheSource::TinyCacheSource(const sp<DataSource>& source) : mSource(source), mCachedOffset(0), mCachedSize(0) { mName = String8::format("TinyCacheSource(%s)", mSource->toString().string()); Loading Loading @@ -194,4 +198,8 @@ sp<DecryptHandle> TinyCacheSource::DrmInitialization(const char *mime) { return mSource->DrmInitialization(mime); } sp<IDataSource> TinyCacheSource::getIDataSource() const { return mSource->getIDataSource(); } } // namespace android media/libstagefright/MediaExtractorFactory.cpp +1 −40 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ #include <media/MediaAnalyticsItem.h> #include <media/MediaExtractor.h> #include <media/stagefright/foundation/AMessage.h> #include <media/stagefright/FileSource.h> #include <media/stagefright/InterfaceUtils.h> #include <media/stagefright/MediaExtractorFactory.h> #include <media/IMediaExtractor.h> Loading @@ -40,7 +39,7 @@ namespace android { // static sp<IMediaExtractor> MediaExtractorFactory::Create( const sp<DataSource> &source, const char *mime) { ALOGV("MediaExtractorFactory::%s %s", __func__, mime); ALOGV("MediaExtractorFactory::Create %s", mime); if (!property_get_bool("media.stagefright.extractremote", true)) { // local extractor Loading @@ -64,44 +63,6 @@ sp<IMediaExtractor> MediaExtractorFactory::Create( return NULL; } // static sp<IMediaExtractor> MediaExtractorFactory::CreateFromFd( int fd, int64_t offset, int64_t length, const char *mime, sp<DataSource> *out) { ALOGV("MediaExtractorFactory::%s %s", __func__, mime); if (property_get_bool("media.stagefright.extractremote", true)) { // remote extractor ALOGV("get service manager"); sp<IBinder> binder = defaultServiceManager()->getService(String16("media.extractor")); if (binder != 0) { sp<IMediaExtractorService> mediaExService( interface_cast<IMediaExtractorService>(binder)); if (!FileSource::requiresDrm(fd, offset, length, nullptr /* mime */)) { ALOGD("FileSource remote"); sp<IDataSource> remoteSource = mediaExService->makeIDataSource(fd, offset, length); ALOGV("IDataSource(FileSource): %p %d %lld %lld", remoteSource.get(), fd, (long long)offset, (long long)length); if (remoteSource.get() != nullptr) { // replace the caller's local source with remote source. *out = CreateDataSourceFromIDataSource(remoteSource); return mediaExService->makeExtractor(remoteSource, mime); } else { ALOGW("extractor service cannot make file source." " falling back to local file source."); } } // Falls back. } else { ALOGE("extractor service not running"); return nullptr; } } *out = new FileSource(fd, offset, length); return Create(*out, mime); } sp<IMediaExtractor> MediaExtractorFactory::CreateFromService( const sp<DataSource> &source, const char *mime) { Loading Loading
media/libmediaextractor/include/media/DataSource.h +6 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <sys/types.h> #include <media/stagefright/MediaErrors.h> #include <media/DataSourceBase.h> #include <media/IDataSource.h> #include <utils/Errors.h> #include <utils/RefBase.h> #include <utils/threads.h> Loading @@ -35,6 +36,11 @@ class DataSource : public DataSourceBase, public virtual RefBase { public: DataSource() {} // returns a pointer to IDataSource if it is wrapped. virtual sp<IDataSource> getIDataSource() const { return nullptr; } protected: virtual ~DataSource() {} Loading
media/libmediaplayer2/nuplayer2/GenericSource2.cpp +40 −22 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/AMessage.h> #include <media/stagefright/DataSourceFactory.h> #include <media/stagefright/FileSource.h> #include <media/stagefright/InterfaceUtils.h> #include <media/stagefright/MediaBuffer.h> #include <media/stagefright/MediaClock.h> Loading Loading @@ -161,30 +162,15 @@ sp<MetaData> NuPlayer2::GenericSource2::getFileFormatMeta() const { status_t NuPlayer2::GenericSource2::initFromDataSource() { sp<IMediaExtractor> extractor; CHECK(mDataSource != NULL || mFd != -1); CHECK(mDataSource != NULL); sp<DataSource> dataSource = mDataSource; const int fd = mFd; const int64_t offset = mOffset; const int64_t length = mLength; mLock.unlock(); // This might take long time if data source is not reliable. if (dataSource != nullptr) { extractor = MediaExtractorFactory::Create(dataSource, NULL /* mime */); } else { extractor = MediaExtractorFactory::CreateFromFd( fd, offset, length, NULL /* mime */, &dataSource); } if (dataSource == nullptr) { ALOGE("initFromDataSource, failed to create data source!"); mLock.lock(); return UNKNOWN_ERROR; } extractor = MediaExtractorFactory::Create(dataSource, NULL); if (extractor == NULL) { ALOGE("initFromDataSource, cannot create extractor!"); mLock.lock(); return UNKNOWN_ERROR; } Loading @@ -193,13 +179,10 @@ status_t NuPlayer2::GenericSource2::initFromDataSource() { size_t numtracks = extractor->countTracks(); if (numtracks == 0) { ALOGE("initFromDataSource, source has no track!"); mLock.lock(); return UNKNOWN_ERROR; } mLock.lock(); mFd = -1; mDataSource = dataSource; mFileMeta = fileMeta; if (mFileMeta != NULL) { int64_t duration; Loading Loading @@ -408,16 +391,51 @@ void NuPlayer2::GenericSource2::onPrepareAsync() { if (!mDisconnected) { mDataSource = dataSource; } } else { if (property_get_bool("media.stagefright.extractremote", true) && !FileSource::requiresDrm(mFd, mOffset, mLength, nullptr /* mime */)) { sp<IBinder> binder = defaultServiceManager()->getService(String16("media.extractor")); if (binder != nullptr) { ALOGD("FileSource remote"); sp<IMediaExtractorService> mediaExService( interface_cast<IMediaExtractorService>(binder)); sp<IDataSource> source = mediaExService->makeIDataSource(mFd, mOffset, mLength); ALOGV("IDataSource(FileSource): %p %d %lld %lld", source.get(), mFd, (long long)mOffset, (long long)mLength); if (source.get() != nullptr) { mDataSource = CreateDataSourceFromIDataSource(source); if (mDataSource != nullptr) { // Close the local file descriptor as it is not needed anymore. close(mFd); mFd = -1; } } else { ALOGW("extractor service cannot make data source"); } } else { ALOGW("extractor service not running"); } } if (mDataSource == nullptr) { ALOGD("FileSource local"); mDataSource = new FileSource(mFd, mOffset, mLength); } // TODO: close should always be done on mFd, see the lines following // CreateDataSourceFromIDataSource above, // and the FileSource constructor should dup the mFd argument as needed. mFd = -1; } if (mFd == -1 && mDataSource == NULL) { if (mDataSource == NULL) { ALOGE("Failed to create data source!"); notifyPreparedAndCleanup(UNKNOWN_ERROR); return; } } if (mDataSource != nullptr && mDataSource->flags() & DataSource::kIsCachingDataSource) { if (mDataSource->flags() & DataSource::kIsCachingDataSource) { mCachedSource = static_cast<NuCachedSource2 *>(mDataSource.get()); } Loading
media/libmediaplayerservice/nuplayer/GenericSource.cpp +41 −22 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include <media/MediaBufferHolder.h> #include <media/MediaExtractor.h> #include <media/MediaSource.h> #include <media/IMediaExtractorService.h> #include <media/IMediaHTTPService.h> #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ADebug.h> Loading Loading @@ -161,30 +162,15 @@ sp<MetaData> NuPlayer::GenericSource::getFileFormatMeta() const { status_t NuPlayer::GenericSource::initFromDataSource() { sp<IMediaExtractor> extractor; CHECK(mDataSource != NULL || mFd != -1); CHECK(mDataSource != NULL); sp<DataSource> dataSource = mDataSource; const int fd = mFd; const int64_t offset = mOffset; const int64_t length = mLength; mLock.unlock(); // This might take long time if data source is not reliable. if (dataSource != nullptr) { extractor = MediaExtractorFactory::Create(dataSource, NULL /* mime */); } else { extractor = MediaExtractorFactory::CreateFromFd( fd, offset, length, NULL /* mime */, &dataSource); } if (dataSource == nullptr) { ALOGE("initFromDataSource, failed to create data source!"); mLock.lock(); return UNKNOWN_ERROR; } extractor = MediaExtractorFactory::Create(dataSource, NULL); if (extractor == NULL) { ALOGE("initFromDataSource, cannot create extractor!"); mLock.lock(); return UNKNOWN_ERROR; } Loading @@ -193,13 +179,10 @@ status_t NuPlayer::GenericSource::initFromDataSource() { size_t numtracks = extractor->countTracks(); if (numtracks == 0) { ALOGE("initFromDataSource, source has no track!"); mLock.lock(); return UNKNOWN_ERROR; } mLock.lock(); mFd = -1; mDataSource = dataSource; mFileMeta = fileMeta; if (mFileMeta != NULL) { int64_t duration; Loading Loading @@ -403,15 +386,51 @@ void NuPlayer::GenericSource::onPrepareAsync() { if (!mDisconnected) { mDataSource = dataSource; } } else { if (property_get_bool("media.stagefright.extractremote", true) && !FileSource::requiresDrm(mFd, mOffset, mLength, nullptr /* mime */)) { sp<IBinder> binder = defaultServiceManager()->getService(String16("media.extractor")); if (binder != nullptr) { ALOGD("FileSource remote"); sp<IMediaExtractorService> mediaExService( interface_cast<IMediaExtractorService>(binder)); sp<IDataSource> source = mediaExService->makeIDataSource(mFd, mOffset, mLength); ALOGV("IDataSource(FileSource): %p %d %lld %lld", source.get(), mFd, (long long)mOffset, (long long)mLength); if (source.get() != nullptr) { mDataSource = CreateDataSourceFromIDataSource(source); if (mDataSource != nullptr) { // Close the local file descriptor as it is not needed anymore. close(mFd); mFd = -1; } } else { ALOGW("extractor service cannot make data source"); } } else { ALOGW("extractor service not running"); } } if (mFd == -1 && mDataSource == NULL) { if (mDataSource == nullptr) { ALOGD("FileSource local"); mDataSource = new FileSource(mFd, mOffset, mLength); } // TODO: close should always be done on mFd, see the lines following // CreateDataSourceFromIDataSource above, // and the FileSource constructor should dup the mFd argument as needed. mFd = -1; } if (mDataSource == NULL) { ALOGE("Failed to create data source!"); notifyPreparedAndCleanup(UNKNOWN_ERROR); return; } } if (mDataSource != nullptr && mDataSource->flags() & DataSource::kIsCachingDataSource) { if (mDataSource->flags() & DataSource::kIsCachingDataSource) { mCachedSource = static_cast<NuCachedSource2 *>(mDataSource.get()); } Loading
media/libstagefright/CallbackDataSource.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,10 @@ sp<DecryptHandle> CallbackDataSource::DrmInitialization(const char *mime) { return mIDataSource->DrmInitialization(mime); } sp<IDataSource> CallbackDataSource::getIDataSource() const { return mIDataSource; } TinyCacheSource::TinyCacheSource(const sp<DataSource>& source) : mSource(source), mCachedOffset(0), mCachedSize(0) { mName = String8::format("TinyCacheSource(%s)", mSource->toString().string()); Loading Loading @@ -194,4 +198,8 @@ sp<DecryptHandle> TinyCacheSource::DrmInitialization(const char *mime) { return mSource->DrmInitialization(mime); } sp<IDataSource> TinyCacheSource::getIDataSource() const { return mSource->getIDataSource(); } } // namespace android
media/libstagefright/MediaExtractorFactory.cpp +1 −40 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ #include <media/MediaAnalyticsItem.h> #include <media/MediaExtractor.h> #include <media/stagefright/foundation/AMessage.h> #include <media/stagefright/FileSource.h> #include <media/stagefright/InterfaceUtils.h> #include <media/stagefright/MediaExtractorFactory.h> #include <media/IMediaExtractor.h> Loading @@ -40,7 +39,7 @@ namespace android { // static sp<IMediaExtractor> MediaExtractorFactory::Create( const sp<DataSource> &source, const char *mime) { ALOGV("MediaExtractorFactory::%s %s", __func__, mime); ALOGV("MediaExtractorFactory::Create %s", mime); if (!property_get_bool("media.stagefright.extractremote", true)) { // local extractor Loading @@ -64,44 +63,6 @@ sp<IMediaExtractor> MediaExtractorFactory::Create( return NULL; } // static sp<IMediaExtractor> MediaExtractorFactory::CreateFromFd( int fd, int64_t offset, int64_t length, const char *mime, sp<DataSource> *out) { ALOGV("MediaExtractorFactory::%s %s", __func__, mime); if (property_get_bool("media.stagefright.extractremote", true)) { // remote extractor ALOGV("get service manager"); sp<IBinder> binder = defaultServiceManager()->getService(String16("media.extractor")); if (binder != 0) { sp<IMediaExtractorService> mediaExService( interface_cast<IMediaExtractorService>(binder)); if (!FileSource::requiresDrm(fd, offset, length, nullptr /* mime */)) { ALOGD("FileSource remote"); sp<IDataSource> remoteSource = mediaExService->makeIDataSource(fd, offset, length); ALOGV("IDataSource(FileSource): %p %d %lld %lld", remoteSource.get(), fd, (long long)offset, (long long)length); if (remoteSource.get() != nullptr) { // replace the caller's local source with remote source. *out = CreateDataSourceFromIDataSource(remoteSource); return mediaExService->makeExtractor(remoteSource, mime); } else { ALOGW("extractor service cannot make file source." " falling back to local file source."); } } // Falls back. } else { ALOGE("extractor service not running"); return nullptr; } } *out = new FileSource(fd, offset, length); return Create(*out, mime); } sp<IMediaExtractor> MediaExtractorFactory::CreateFromService( const sp<DataSource> &source, const char *mime) { Loading