1 #ifndef REPEATER_SOURCE_H_ 2 3 #define REPEATER_SOURCE_H_ 4 5 #include <media/stagefright/foundation/ABase.h> 6 #include <media/stagefright/foundation/AHandlerReflector.h> 7 #include <media/stagefright/MediaSource.h> 8 9 #define SUSPEND_VIDEO_IF_IDLE 0 10 11 namespace android { 12 13 // This MediaSource delivers frames at a constant rate by repeating buffers 14 // if necessary. 15 struct RepeaterSource : public MediaSource { 16 RepeaterSource(const sp<MediaSource> &source, double rateHz); 17 18 virtual status_t start(MetaData *params); 19 virtual status_t stop(); 20 virtual sp<MetaData> getFormat(); 21 22 virtual status_t read( 23 MediaBuffer **buffer, const ReadOptions *options); 24 25 void onMessageReceived(const sp<AMessage> &msg); 26 27 // If RepeaterSource is currently dormant, because SurfaceFlinger didn't 28 // send updates in a while, this is its wakeup call. 29 void wakeUp(); 30 31 double getFrameRate() const; 32 void setFrameRate(double rateHz); 33 34 protected: 35 virtual ~RepeaterSource(); 36 37 private: 38 enum { 39 kWhatRead, 40 }; 41 42 Mutex mLock; 43 Condition mCondition; 44 45 bool mStarted; 46 47 sp<MediaSource> mSource; 48 double mRateHz; 49 50 sp<ALooper> mLooper; 51 sp<AHandlerReflector<RepeaterSource> > mReflector; 52 53 MediaBuffer *mBuffer; 54 status_t mResult; 55 int64_t mLastBufferUpdateUs; 56 57 int64_t mStartTimeUs; 58 int32_t mFrameCount; 59 60 void postRead(); 61 62 DISALLOW_EVIL_CONSTRUCTORS(RepeaterSource); 63 }; 64 65 } // namespace android 66 67 #endif // REPEATER_SOURCE_H_ 68