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