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 9d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubernamespace android { 10d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 11d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// This MediaSource delivers frames at a constant rate by repeating buffers 12d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// if necessary. 13d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstruct RepeaterSource : public MediaSource { 14d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber RepeaterSource(const sp<MediaSource> &source, double rateHz); 15d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 16d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber virtual status_t start(MetaData *params); 17d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber virtual status_t stop(); 18d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber virtual sp<MetaData> getFormat(); 19d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 20d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber virtual status_t read( 21d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber MediaBuffer **buffer, const ReadOptions *options); 22d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 23d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void onMessageReceived(const sp<AMessage> &msg); 24d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 254a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber // If RepeaterSource is currently dormant, because SurfaceFlinger didn't 264a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber // send updates in a while, this is its wakeup call. 274a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber void wakeUp(); 284a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber 29d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprotected: 30d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber virtual ~RepeaterSource(); 31d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 32d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprivate: 33d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber enum { 34d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber kWhatRead, 35d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber }; 36d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 37d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber Mutex mLock; 38d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber Condition mCondition; 39d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4077245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber bool mStarted; 4177245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber 42d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber sp<MediaSource> mSource; 43d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber double mRateHz; 44d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 45d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber sp<ALooper> mLooper; 46d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber sp<AHandlerReflector<RepeaterSource> > mReflector; 47d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 48d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber MediaBuffer *mBuffer; 49d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t mResult; 504a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber int64_t mLastBufferUpdateUs; 51d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 52d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int64_t mStartTimeUs; 53d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t mFrameCount; 54d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 55d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void postRead(); 56d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 57d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(RepeaterSource); 58d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}; 59d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 60d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} // namespace android 61d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 62d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif // REPEATER_SOURCE_H_ 63