Loading media/libmediaplayerservice/nuplayer/GenericSource.cpp +65 −15 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include "AnotherPacketSource.h" #include <media/IMediaHTTPService.h> #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/AMessage.h> Loading @@ -47,33 +48,48 @@ NuPlayer::GenericSource::GenericSource( mIsWidevine(false), mUIDValid(uidValid), mUID(uid) { resetDataSource(); DataSource::RegisterDefaultSniffers(); } status_t NuPlayer::GenericSource::init( void NuPlayer::GenericSource::resetDataSource() { mHTTPService.clear(); mUri.clear(); mUriHeaders.clear(); mFd = -1; mOffset = 0; mLength = 0; } status_t NuPlayer::GenericSource::setDataSource( const sp<IMediaHTTPService> &httpService, const char *url, const KeyedVector<String8, String8> *headers) { mIsWidevine = !strncasecmp(url, "widevine://", 11); AString sniffedMIME; resetDataSource(); sp<DataSource> dataSource = DataSource::CreateFromURI(httpService, url, headers, &sniffedMIME); mHTTPService = httpService; mUri = url; if (dataSource == NULL) { return UNKNOWN_ERROR; if (headers) { mUriHeaders = *headers; } return initFromDataSource( dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str()); // delay data source creation to prepareAsync() to avoid blocking // the calling thread in setDataSource for any significant time. return OK; } status_t NuPlayer::GenericSource::init( status_t NuPlayer::GenericSource::setDataSource( int fd, int64_t offset, int64_t length) { sp<DataSource> dataSource = new FileSource(dup(fd), offset, length); resetDataSource(); mFd = dup(fd); mOffset = offset; mLength = length; return initFromDataSource(dataSource, NULL); // delay data source creation to prepareAsync() to avoid blocking // the calling thread in setDataSource for any significant time. return OK; } status_t NuPlayer::GenericSource::initFromDataSource( Loading Loading @@ -143,7 +159,8 @@ status_t NuPlayer::GenericSource::initFromDataSource( // check if the source requires secure buffers int32_t secure; if (meta->findInt32(kKeyRequiresSecureBuffers, &secure) && secure) { if (meta->findInt32(kKeyRequiresSecureBuffers, &secure) && secure) { mIsWidevine = true; if (mUIDValid) { extractor->setUID(mUID); Loading @@ -166,7 +183,8 @@ status_t NuPlayer::GenericSource::initFromDataSource( return OK; } status_t NuPlayer::GenericSource::setBuffers(bool audio, Vector<MediaBuffer *> &buffers) { status_t NuPlayer::GenericSource::setBuffers( bool audio, Vector<MediaBuffer *> &buffers) { if (mIsWidevine && !audio) { return mVideoTrack.mSource->setBuffers(buffers); } Loading @@ -177,6 +195,38 @@ NuPlayer::GenericSource::~GenericSource() { } void NuPlayer::GenericSource::prepareAsync() { // delayed data source creation AString sniffedMIME; sp<DataSource> dataSource; if (!mUri.empty()) { mIsWidevine = !strncasecmp(mUri.c_str(), "widevine://", 11); dataSource = DataSource::CreateFromURI( mHTTPService, mUri.c_str(), &mUriHeaders, &sniffedMIME); } else { // set to false first, if the extractor // comes back as secure, set it to true then. mIsWidevine = false; dataSource = new FileSource(mFd, mOffset, mLength); } if (dataSource == NULL) { ALOGE("Failed to create data source!"); notifyPrepared(UNKNOWN_ERROR); return; } status_t err = initFromDataSource( dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str()); if (err != OK) { ALOGE("Failed to init from data source!"); notifyPrepared(err); return; } if (mVideoTrack.mSource != NULL) { sp<MetaData> meta = mVideoTrack.mSource->getFormat(); Loading media/libmediaplayerservice/nuplayer/GenericSource.h +11 −2 Original line number Diff line number Diff line Loading @@ -30,18 +30,19 @@ namespace android { struct AnotherPacketSource; struct ARTSPController; struct DataSource; struct IMediaHTTPService; struct MediaSource; class MediaBuffer; struct NuPlayer::GenericSource : public NuPlayer::Source { GenericSource(const sp<AMessage> ¬ify, bool uidValid, uid_t uid); status_t init( status_t setDataSource( const sp<IMediaHTTPService> &httpService, const char *url, const KeyedVector<String8, String8> *headers); status_t init(int fd, int64_t offset, int64_t length); status_t setDataSource(int fd, int64_t offset, int64_t length); virtual void prepareAsync(); Loading Loading @@ -96,6 +97,14 @@ private: bool mIsWidevine; bool mUIDValid; uid_t mUID; sp<IMediaHTTPService> mHTTPService; AString mUri; KeyedVector<String8, String8> mUriHeaders; int mFd; int64_t mOffset; int64_t mLength; void resetDataSource(); status_t initFromDataSource( const sp<DataSource> &dataSource, Loading media/libmediaplayerservice/nuplayer/NuPlayer.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -232,12 +232,12 @@ void NuPlayer::setDataSourceAsync( // The correct flags will be updated in Source::kWhatFlagsChanged // handler when GenericSource is prepared. status_t err = genericSource->init(httpService, url, headers); status_t err = genericSource->setDataSource(httpService, url, headers); if (err == OK) { source = genericSource; } else { ALOGE("Failed to initialize generic source!"); ALOGE("Failed to set data source!"); } } msg->setObject("source", source); Loading @@ -252,10 +252,10 @@ void NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_t length) { sp<GenericSource> source = new GenericSource(notify, mUIDValid, mUID); status_t err = source->init(fd, offset, length); status_t err = source->setDataSource(fd, offset, length); if (err != OK) { ALOGE("Failed to initialize generic source!"); ALOGE("Failed to set data source!"); source = NULL; } Loading Loading
media/libmediaplayerservice/nuplayer/GenericSource.cpp +65 −15 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include "AnotherPacketSource.h" #include <media/IMediaHTTPService.h> #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/AMessage.h> Loading @@ -47,33 +48,48 @@ NuPlayer::GenericSource::GenericSource( mIsWidevine(false), mUIDValid(uidValid), mUID(uid) { resetDataSource(); DataSource::RegisterDefaultSniffers(); } status_t NuPlayer::GenericSource::init( void NuPlayer::GenericSource::resetDataSource() { mHTTPService.clear(); mUri.clear(); mUriHeaders.clear(); mFd = -1; mOffset = 0; mLength = 0; } status_t NuPlayer::GenericSource::setDataSource( const sp<IMediaHTTPService> &httpService, const char *url, const KeyedVector<String8, String8> *headers) { mIsWidevine = !strncasecmp(url, "widevine://", 11); AString sniffedMIME; resetDataSource(); sp<DataSource> dataSource = DataSource::CreateFromURI(httpService, url, headers, &sniffedMIME); mHTTPService = httpService; mUri = url; if (dataSource == NULL) { return UNKNOWN_ERROR; if (headers) { mUriHeaders = *headers; } return initFromDataSource( dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str()); // delay data source creation to prepareAsync() to avoid blocking // the calling thread in setDataSource for any significant time. return OK; } status_t NuPlayer::GenericSource::init( status_t NuPlayer::GenericSource::setDataSource( int fd, int64_t offset, int64_t length) { sp<DataSource> dataSource = new FileSource(dup(fd), offset, length); resetDataSource(); mFd = dup(fd); mOffset = offset; mLength = length; return initFromDataSource(dataSource, NULL); // delay data source creation to prepareAsync() to avoid blocking // the calling thread in setDataSource for any significant time. return OK; } status_t NuPlayer::GenericSource::initFromDataSource( Loading Loading @@ -143,7 +159,8 @@ status_t NuPlayer::GenericSource::initFromDataSource( // check if the source requires secure buffers int32_t secure; if (meta->findInt32(kKeyRequiresSecureBuffers, &secure) && secure) { if (meta->findInt32(kKeyRequiresSecureBuffers, &secure) && secure) { mIsWidevine = true; if (mUIDValid) { extractor->setUID(mUID); Loading @@ -166,7 +183,8 @@ status_t NuPlayer::GenericSource::initFromDataSource( return OK; } status_t NuPlayer::GenericSource::setBuffers(bool audio, Vector<MediaBuffer *> &buffers) { status_t NuPlayer::GenericSource::setBuffers( bool audio, Vector<MediaBuffer *> &buffers) { if (mIsWidevine && !audio) { return mVideoTrack.mSource->setBuffers(buffers); } Loading @@ -177,6 +195,38 @@ NuPlayer::GenericSource::~GenericSource() { } void NuPlayer::GenericSource::prepareAsync() { // delayed data source creation AString sniffedMIME; sp<DataSource> dataSource; if (!mUri.empty()) { mIsWidevine = !strncasecmp(mUri.c_str(), "widevine://", 11); dataSource = DataSource::CreateFromURI( mHTTPService, mUri.c_str(), &mUriHeaders, &sniffedMIME); } else { // set to false first, if the extractor // comes back as secure, set it to true then. mIsWidevine = false; dataSource = new FileSource(mFd, mOffset, mLength); } if (dataSource == NULL) { ALOGE("Failed to create data source!"); notifyPrepared(UNKNOWN_ERROR); return; } status_t err = initFromDataSource( dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str()); if (err != OK) { ALOGE("Failed to init from data source!"); notifyPrepared(err); return; } if (mVideoTrack.mSource != NULL) { sp<MetaData> meta = mVideoTrack.mSource->getFormat(); Loading
media/libmediaplayerservice/nuplayer/GenericSource.h +11 −2 Original line number Diff line number Diff line Loading @@ -30,18 +30,19 @@ namespace android { struct AnotherPacketSource; struct ARTSPController; struct DataSource; struct IMediaHTTPService; struct MediaSource; class MediaBuffer; struct NuPlayer::GenericSource : public NuPlayer::Source { GenericSource(const sp<AMessage> ¬ify, bool uidValid, uid_t uid); status_t init( status_t setDataSource( const sp<IMediaHTTPService> &httpService, const char *url, const KeyedVector<String8, String8> *headers); status_t init(int fd, int64_t offset, int64_t length); status_t setDataSource(int fd, int64_t offset, int64_t length); virtual void prepareAsync(); Loading Loading @@ -96,6 +97,14 @@ private: bool mIsWidevine; bool mUIDValid; uid_t mUID; sp<IMediaHTTPService> mHTTPService; AString mUri; KeyedVector<String8, String8> mUriHeaders; int mFd; int64_t mOffset; int64_t mLength; void resetDataSource(); status_t initFromDataSource( const sp<DataSource> &dataSource, Loading
media/libmediaplayerservice/nuplayer/NuPlayer.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -232,12 +232,12 @@ void NuPlayer::setDataSourceAsync( // The correct flags will be updated in Source::kWhatFlagsChanged // handler when GenericSource is prepared. status_t err = genericSource->init(httpService, url, headers); status_t err = genericSource->setDataSource(httpService, url, headers); if (err == OK) { source = genericSource; } else { ALOGE("Failed to initialize generic source!"); ALOGE("Failed to set data source!"); } } msg->setObject("source", source); Loading @@ -252,10 +252,10 @@ void NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_t length) { sp<GenericSource> source = new GenericSource(notify, mUIDValid, mUID); status_t err = source->init(fd, offset, length); status_t err = source->setDataSource(fd, offset, length); if (err != OK) { ALOGE("Failed to initialize generic source!"); ALOGE("Failed to set data source!"); source = NULL; } Loading