/* * 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); 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); 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 void DecryptCallback(WVEsSelector esType, void* input, void* output, size_t length, int key); static DecryptContext sDecryptContext[2]; // audio vs. video #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; MediaBufferGroup *mGroup; unsigned long long mDts; unsigned long long mPts; sp mFileSource; sp mDataSource; void allocBufferGroup(); WVMMediaSource(const WVMMediaSource &); WVMMediaSource &operator=(const WVMMediaSource &); }; } // namespace android #endif // WVMMEDIA_SOURCE_H_