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