/* * Copyright (C) 2011 Google, Inc. All Rights Reserved */ #ifndef WVMMEDIA_SOURCE_H_ #define WVMMEDIA_SOURCE_H_ #include "AndroidConfig.h" #include "WVStreamControlAPI.h" #include #include #include #include #include #ifdef REQUIRE_SECURE_BUFFERS #include "OEMCrypto_L1.h" #endif namespace android { class WVMFileSource; class WVMMediaSource : public MediaSource { public: WVMMediaSource(WVSession *session, WVEsSelector esSelector, const sp &metaData, bool isLive, bool cryptoPluginMode); void delegateFileSource(sp fileSource); void delegateDataSource(sp dataSource); virtual status_t start(MetaData *params = NULL); virtual status_t stop(); virtual sp getFormat(); virtual status_t setBuffers(const Vector &buffers); virtual status_t read(MediaBuffer **buffer, const ReadOptions *options = NULL); void addEncryptedSize(size_t size) { mEncryptedSizes.push_back(size); } static int sLastError; #ifdef REQUIRE_SECURE_BUFFERS class DecryptContext { public: void Initialize(MediaBuffer *mediaBuf) { mMediaBuf = mediaBuf; mOffset = 0; memset(mIV, 0, sizeof(mIV)); } MediaBuffer *mMediaBuf; size_t mOffset; static const int kCryptoBlockSize = 16; unsigned char mIV[kCryptoBlockSize]; }; static WVStatus DecryptCallback(WVEsSelector esType, void* input, void* output, size_t length, int key, unsigned long long dts, unsigned long long pts, bool au_end, void *context); DecryptContext& getDecryptContext() { return mDecryptContext; } private: DecryptContext mDecryptContext; #endif protected: virtual ~WVMMediaSource(); private: Mutex mLock; WVSession *mSession; WVEsSelector mESSelector; // indicates audio vs. video sp mTrackMetaData; bool mStarted; bool mLogOnce; bool mIsLiveStream; bool mNewSegment; bool mCryptoInitialized; MediaBufferGroup *mGroup; unsigned long long mDts; unsigned long long mPts; sp mFileSource; sp mDataSource; Vector mEncryptedSizes; void allocBufferGroup(); WVMMediaSource(const WVMMediaSource &); WVMMediaSource &operator=(const WVMMediaSource &); }; } // namespace android #endif // WVMMEDIA_SOURCE_H_