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
11namespace android {
12
13// This MediaSource delivers frames at a constant rate by repeating buffers
14// if necessary.
15struct 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
34protected:
35    virtual ~RepeaterSource();
36
37private:
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